Solve a Polynomial in R

A polynomial p(x) is an expression of the form:

\(p(x) = a_0 + a_1x + a_2x^2 + a_3x^3 + … + a_nx^n\)

Where n is any non-negative integer.

Solve a polynomial p(x) in R

To solve the equation \(p(x) = 0\) in R, we can use the function: polyroot.

For example, let’s solve the equation:

\(p(x) = -\sqrt{2} – x + x^2 + 0.4x^3 = 0\)

# we use the coefficients of p(x) as inputs to polyroot
solutions = polyroot(c(-sqrt(2), -1, 1, 0.4))

print(solutions)
# outputs: 1.3390011-0i -0.8977101+0i -2.9412910-0i

Check if the solutions are real numbers

So, we can see that the solutions of p(x) are all real numbers (associated with 0i), but we can check for this in R:

# extracting the imaginary parts of the solutions
Im(solutions)

# outputs: -3.333339e-18  6.981698e-18 -3.648359e-18

# Which are numbers very close to 0,
# To get them to be exactly 0, we need to round our answer:
round(Im(solutions), 5)

# outputs: 0 0 0

# Finally, the following code outputs:
# TRUE if the solutions are real
# FALSE otherwise
all(round(Im(solutions), 5) == 0)

# outputs: TRUE

# With the help of this code,
# we can remove the imaginary parts of the solutions
# if they are real numbers
if(all(round(Im(solutions), 5) == 0)) {
  solutions = Re(solutions) # Re outputs the real part of a complex number
}

print(solutions)
# outputs: 1.3390011 -0.8977101 -2.9412910

Plot p(x) and its solutions

# Coding the polynomial p(x) in R
p = function(x) {
  -sqrt(2) -x + x^2 + 0.4*x^3
}

# choosing the domain of p(x)
x = seq(-5, 5, by = 0.1) # so x is: -5, -4.9, -4.8, ..., 4.8, 4.9, 5

# plotting p(x) and limiting its range to -5, 5
plot(x, p(x), type = 'l', col = 'red', ylim = c(-5, 5))

# adding the x-axis
abline(h = 0, col = 'blue')

# adding the solutions
points(x = solutions, y = rep(0, length(solutions)), # x and y coordinates of the solutions
       pch = 18, cex = 2, col = 'red') # pch controls the shape of the points

# annotations
solutions = sort(solutions) # to annotate them from small to large
text(x = solutions, y = rep(0, length(solutions)),
     labels = paste('Solution', seq(1, length(solutions))),
     pos = 3, col = 'red')

Output:

Plot of the polynomial p of x and its solutions.

Further reading