Nick Goh
Nick Goh

Reputation: 23

How to solve a cubic function in R

Good day to all!

I have a following cubic equation.

Left <- P^3+4*P^2+6*P
Right <- 2

How do I get R to solve for P to get Left = Right?

Thanks in advance.

Upvotes: 2

Views: 466

Answers (2)

ThomasIsCoding
ThomasIsCoding

Reputation: 101343

If you want symbolic solutions, I guess you can try Ryacas like below

> library(Ryacas)

> yac_str("Solve(P^3+4*P^2+6*P==2,P)")
[1] "{P==(71/27+Sqrt(187/27))^(1/3)-(Sqrt(187/27)-71/27)^(1/3)-4/3,P==Complex(-(4/3+((71/27+Sqrt(187/27))^(1/3)-(Sqrt(187/27)-71/27)^(1/3))/2),Sqrt(3/4)*((71/27+Sqrt(187/27))^(1/3)+(Sqrt(187/27)-71/27)^(1/3))),P==Complex(-(4/3+((71/27+Sqrt(187/27))^(1/3)-(Sqrt(187/27)-71/27)^(1/3))/2),-Sqrt(3/4)*((71/27+Sqrt(187/27))^(1/3)+(Sqrt(187/27)-71/27)^(1/3)))}"

Upvotes: 1

Darren Tsai
Darren Tsai

Reputation: 35554

1. uniroot()

You could use uniroot() to search for a root of a function with respect to its first argument.

uniroot(\(x, y) x^3 + 4*x^2 + 6*x - y, c(0, 1), y = 2, extendInt = "yes")

$root
[1] 0.278161

$f.root
[1] -1.779565e-05

$iter
[1] 6

$init.it
[1] NA

$estim.prec
[1] 6.103516e-05

2. polyroot()

If the function is a real or complex polynomial, you could specifically use polyroot(z), where z is the vector of polynomial coefficients in increasing order.

y <- 2
polyroot(c(-y, 6, 4, 1))

# [1]  0.2781631-0.000000i -2.1390815+1.616897i -2.1390815-1.616897i

Both approaches solve the equation with the root 0.278161. (Besides a real root, polyroot also gives two imaginary roots)

Upvotes: 3

Related Questions