[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