[R] How to get solution of following polynomial?

Erich Neuwirth erich.neuwirth at univie.ac.at
Sun Jan 11 15:12:27 CET 2009


In theory,
you could define the following 2 functions

powermat <- function(myvec) {
  powervec <- function(x,maxpower)
    sapply(0:maxpower,function(n)x^n)
  sapply(myvec,function(x)powervec(x,length(myvec)-1))
}

polycoeffs <- function(fn,order,support=0:order)
  solve(t(powermat(support)),sapply(support,Vectorize(fn)))

and then use polycoeffs(fn,4)
with your function fn to extract the coefficients of the polynomial.
polycoeffs takes a function and the order of a polynomial
as its input and computes the coefficients of the polynomial
or the given order with the same values as the function
at the points 0:order.
If the function is a polynomial of the given order, it gives you
exactly the coefficients you need.
You may use another set of support points (points where the function is
evaluated) as an optional argument.
Still, this method is not extremely reliable. If the support points are
not chosen well, you might get rather unreliable results.

A safer way would be to use a computer algebra system to extract the
coefficients of your polynomial. You could use Ryacas to do this from R.
But you still would have to grasp the syntax of yacas.







Paul Smith wrote:
> On Sun, Jan 11, 2009 at 6:03 AM, RON70 <ron_michael70 at yahoo.com> wrote:
>> 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
> 
> Use curve to plot the curve of your function. Then, see where the
> roots are, and use uniroot with a small interval around the roots to
> determine their exact value.
> 
> Example:
> 
> f <- function(x) x^2-1
> curve(f,-5,5)
> uniroot(f,c(-2,-0.2))
> uniroot(f,c(0.2,2))
> 
> Paul
> 
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
> 
> 
> ------------------------------------------------------------------------
> 
> 
> No virus found in this incoming message.
> Checked by AVG - http://www.avg.com 
> Version: 8.0.176 / Virus Database: 270.10.5/1886 - Release Date: 1/10/2009 6:01 PM
> 

-- 
Erich Neuwirth, University of Vienna
Faculty of Computer Science
Computer Supported Didactics Working Group
Visit our SunSITE at http://sunsite.univie.ac.at
Phone: +43-1-4277-39464 Fax: +43-1-4277-39459




More information about the R-help mailing list