MathGroup Archive 2006

[Date Index] [Thread Index] [Author Index]

Search the Archive

Getting the (correct) roots of a polynomial

Hi, I have what seems like a simple question, but I haven't been able
to find a satisfactory answer.  I wish to find the complex roots of the
quartic polynomial

(z - I u) z (z + I v) (z - I v) + (g^2) z (z + I v) + (g^2) z (z - I v)
+ (g^2)(z + I v)(z - I v)

where z is the variable of the polynomial, u, v, and g are parameters
whose values will be specified later, and I is the imaginary unit.  In
the end, I wish to be able to fix the values of u and g and be able to
examine (say, by plotting) how the values of the roots depend on v.
I've tried several (possibly equivalent) approaches, but I seem to keep
getting answers that are not actually roots.  I am using Mathematica
5.2 on SunOS.

I assigned the above expression to the name Poly.  I then tried
Solve[Poly==0,z].  If I then substitute in the particular values
TestVals = {u -> 1/10,  v -> 10^4, g -> 1, w -> 10^7}, I find that the
roots produced by Solve yield significantly non-zero values when
plugged back into poly, meaning that the following does not produce a
list of essentially zero values:

Soln = Solve[Poly==0,z];
Table[N[(Poly /. Soln[[j]]) /. TestVals],{j,1,4}]

The values returned were of order 10^9.  I also tried plugging in the
parameter values first (i.e. applying the rules in TestVals) before
using Solve, and this also produced bad solutions.

I also tried using the Root object, thinking that this might produce
different results.  In this case, I converted Poly to a function of a
single variable and applied the Root function to get each root.

Table[Root[Evaluate[Poly /. z->#], j],{j,1,4}]

Plugging these values back into Poly and plugging in the parameter
values (again, by applying the TestVals rules), I get two values that
are essentially zero (order 10^(-8) ) and two values that are
significantly non-zero (order 1).  Again, I tried pluggin in the
parameter values first and then using root, but this doesn't seem to
change the result (which is what I expected).  After looking at the
help for the Root function, I also tried setting the option
ExactRootIsolation->True inside the Root function, but this did not
seem to improve my results.

I'd appreciate any guidance on how to get the correct roots to this
polynomial.  I think I either simply don't understand enough about the
way in which these functions (particularly root) work to understand the
origin of the problem, or else it's some issue of numerics having to do
with rounding errors or the like.  Again, I'd like to be able to
produce the correct roots for any given values of the parameters, and
particularly for a large range of values of v.  It's probably also
worth noting that given the other parameter values used above, if v is
set to be a small value (say, v = 5), then the solutions given by any
of the methods above seem to be quite good.

Many thanks,


  • Prev by Date: Re: .NET/Link and two-dimensional strings
  • Next by Date: Re: Package writing
  • Previous by thread: Getting the (correct) roots of a polynomial
  • Next by thread: Re: Getting the (correct) roots of a polynomial