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 >