[R] How to get solution of following polynomial?

Ravi Varadhan rvaradhan at jhmi.edu
Sun Jan 11 21:09:57 CET 2009


Hi,

You can use the "polynomial" package to solve your problem.

The key step is to find the exact polynomial representation of fn().  Noting that it is a 8-th degree polynomial, we can get its exact form using the poly.calc() function.  Once we have that, it is a simple matter of finding the roots using the solve() function.

require(polynomial)

a <- c(-0.07, 0.17)
b <- c(1, -4)
cc <- matrix(c(0.24, 0.00, -0.08, -0.31), 2)
d <- matrix(c(0, 0, -0.13, -0.37), 2)
e <- matrix(c(0.2, 0, -0.06, -0.34), 2)
A1 <- diag(2) + a %*% t(b) + cc
A2 <- -cc + d
A3 <- -d + e
A4 <- -e

# I am vectorizing your function
fn <- function(z)
   {
    sapply(z, function(z) {
	y <- diag(2) - A1*z - A2*z^2 - A3*z^3 - A4*z^4
    	det(y)
	})
   }


x <- seq(-5, 5, length=9) # note we need 9 points to exactly determine a 8-th degree polynomial
y <- fn(x)

p <- poly.calc(x, y)  # uses Lagrange interpolation to determine polynomial form
p
> 1 - 1.18*x + 0.2777*x^2 - 0.2941*x^3 - 0.1004*x^4 + 0.3664*x^5 - 0.0636*x^6 + 0.062*x^7 - 0.068*x^8 

# plot showing that p is the exact polynomial representation of fn(z)
pfunc <- as.function(p)
x1 <-seq(-5, 5, length=100)
plot(x1, fn(x1),type="l")
lines(x1, pfunc(x1), col=2, lty=2)   

solve(p)  # gives you the roots (some are, of course, complex)


Hope this helps,
Ravi.



____________________________________________________________________

Ravi Varadhan, Ph.D.
Assistant Professor,
Division of Geriatric Medicine and Gerontology
School of Medicine
Johns Hopkins University

Ph. (410) 502-2619
email: rvaradhan at jhmi.edu


----- Original Message -----
From: RON70 <ron_michael70 at yahoo.com>
Date: Sunday, January 11, 2009 1:05 am
Subject: [R]  How to get solution of following polynomial?
To: r-help at r-project.org


>  Hi, I want find all roots for the following polynomial :
>  
>  a <- c(-0.07, 0.17); b <- c(1, -4); cc <- matrix(c(0.24, 0.00, -0.08,
>  -0.31), 2); d <- matrix(c(0, 0, -0.13, -0.37), 2); e <- matrix(c(0.2, 
> 0,
>  -0.06, -0.34), 2)
>  A1 <- diag(2) + a %*% t(b) + cc; A2 <- -cc + d; A3 <- -d + e; A4 <- -e
>  fn <- function(z)
>     {
>      y <- diag(2) - A1*z - A2*z^2 - A3*z^3 - A4*z^4
>      return(det(y))
>     }; uniroot(fn, c(-10, 1))
>  
>  Using uniroot function, I got only one solution of that. Is there any
>  function to get all four solutions? I looked at polyroot() function, 
> but I
>  do not think it will work for my problem, because, my coef. are 
> matrix, nor
>  number
>  
>  Thanks
>     
>  
>  
>  -- 
>  View this message in context: 
>  Sent from the R help mailing list archive at Nabble.com.
>  
>  ______________________________________________
>  R-help at r-project.org mailing list
>  
>  PLEASE do read the posting guide 
>  and provide commented, minimal, self-contained, reproducible code.




More information about the R-help mailing list