How should I restructure this code? I generate a high-order polynomial poly
with integer coefficients, then find roots and divide them out of poly one at a time. I want FindRoot[] to use a very high precision on the first pass but then just use the precision of the inputs afterward.
z[n_, c_] := If[n > 0, z[n - 1, c]^2 + c, c];
poly = PolynomialQuotient[z[10, c] - z[6, c], 1 + c^2, c];
rts = {};
Do[Print[Precision[poly]];
aa = FindRoot[poly, {c, I}, WorkingPrecision -> Min[500, Floor[Precision[poly]]]];
AppendTo[rts, c /. aa];
poly = PolynomialQuotient[poly, ((z - c)*(z - Conjugate[c]) /. aa) /. z -> c, c], {j, 1, 5}]
(* [Infinity] 319.649 135.906 0.00598703 *)
I'm losing so much precision on each pass that I can only get a few roots. I'm trying to get the roots closest to i without having to find all the roots. I encountered this precision problem while trying to fix this other problem. I'm also not clear on WHY the polynomial division loses precision so quickly.
Answer
Precision is preserved, and error messages are eliminated by replacing the second instance of PolynomialQuotient
by a simple divide.
poly = poly/ (((z - c)*(z - Conjugate[c]) /. aa) /. z -> c)
The only apparent difference is that PolynomialQuotient
discards any remainder, and there is a remainder unless c
is exact. In some way that I do not understand, discarding the remainder must reduce the precision of poly
. So, this may not be a particularly satisfying answer, but it does produce accurate roots for a WorkingPrecision
as low as Min[190, Floor[Precision[poly]]]
. Replace 190
by 187
, however, and the precision of poly
gradually decreases to 185
, whereupon the Jacobian becomes singular. For completeness, rts[[5]] for 190
is
(* -0.01660571703737496762392836921351877966202681662442570475568531876233767935059224313655985208958046768635767201058325661435694155300994327878649425388424142524075655339495830479365786600752927
+ 1.006001836522824948881217257805018657146542248017733702434346228688166066459126472333560301933200993465308529209500537579261396301606919993043401875320490162101139793328283528897296023734789 I *)
Comments
Post a Comment