Re: Getting the (correct) roots of a polynomial
- To: mathgroup at smc.vnet.net
- Subject: [mg67279] Re: [mg67247] Getting the (correct) roots of a polynomial
- From: Bob Hanlon <hanlonr at cox.net>
- Date: Thu, 15 Jun 2006 03:26:22 -0400 (EDT)
- Reply-to: hanlonr at cox.net
- Sender: owner-wri-mathgroup at wolfram.com
Use greater precision than machine precision
poly = (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) // Simplify
(v^2 + 3*z^2)*g^2 + z*(z - I*u)*(v^2 + z^2)
testVals = {u -> 1/10, v -> 10^4, g -> 1, w -> 10^7};
Off[N::meprec];
soln=Solve[poly==0,z];
N[poly/.soln/.testVals,20]//Chop
{0,0,0,0}
soln2={Reduce[poly==0,z]//ToRules};
N[poly/.soln2/.testVals,20]//Rationalize
{0,0,0,0}
Bob Hanlon
---- nickc8514 at yahoo.com wrote:
> 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,
>
> Nick
>