I reinvented the Durand-Kerner method ( http://en.wikipedia.org/wiki/Durand-Kerner_method ) in 1992. I think it cool. I don't know if it is better or worse than p. . - Bo
>________________________________ > Fra: John Randall <rand...@andromeda.rutgers.edu> >Til: programm...@jsoftware.com >Sendt: 18:30 onsdag den 12. december 2012 >Emne: Re: [Jprogramming] Cool roots > >As Henry points out, the quadratic formula is not the best way to get >accurate numerical results in all cases. > >The two easiest ways of losing numerical precision are dividing by a small >quantity (which happens with the quadratic formula when a is small) and >subtracting nearly equal quantities (which happens if b^2 is large >compared to 4ac). Here are some examples of the latter. > >We define 3 verbs which estimate the solutions of the quadratic equation >with a=1, c=1, b=-y+%y, which has solutions y,%y. The verbs return the >relative error (|(actual-estimate)%actual) in the estimates. > >Warning: these verbs are not cool. > >pdot: uses p. >traditional: uses the quadratic formula as is >modified: uses the "rationalizing the numerator" technique described by Henry > >pdot=:3 : 0 >b=.-+/s=.y,%y >t=.1{:: p. 1,b,1 >|(s-t)%s >) > >traditional=:3 : 0 >b=.-+/s=.y,%y >d=.%: _4+*: b >t=.-:-b+(,~ -) d >|(s-t)%s >) > >modified=:3 : 0 >b=.-+/s=.y,%y >d=.%: _4+*: b >t=.(,%)-:d-b >|(s-t)%s >) > > pdot"0 ] 10^6+i.6 > 0 0 >1.00583e_14 1.00585e_14 >1.49012e_16 1.65436e_16 > 0 0 > 0 0 > 0 1.61559e_16 > traditional"0 ] 10^6+i.6 >0 7.61449e_6 >0 0.00348485 >0 0.490116 >0 1 >0 1 >0 1 > modified"0 ] 10^6+i.6 >0 0 >0 0 >0 0 >0 0 >0 0 >0 0 > >As we would expect, there is special magic in pdot. The traditional >formula goes wrong in expected ways, and the modified one stays good. > >Incidentally, the quadratic formula assumes a is nonzero. Describing >solutions of equations where a can be zero is more complicated. Even when >solving the linear equation ax=b you have the possibilities: > >a~:0 : x=b%a >a=0, b=0 : infinitely many >a=0, b~:0 : no solutions > >Best wishes, > >John > > >Henry Rich wrote: >> I have to disagree. That's way cool. >> >> I assumed you used Newton's method to shine up the final values of the >> roots, but I never knew you tried rational results too. >> >> It is possible to produce accurate results for quadratics without such >> heroic measures. You just can't use the quadratic formula like you >> learned it in highschool. >> >> There's the usual quadratic formula: >> >> (2*a) %~ (-b) (+,-) %: (b^2) - 4*a*c >> >> and there's a less-well-known alternative form: >> >> (2*c) % (-b) (-,+) %: (b^2) - 4*a*c >> >> Each version produces two roots. The roots created are more accurate >> when +-(-b) is positive, so you can get one accurate root from each >> formula. >> >> To calculate, use the combined form >> >> ((a %~ ]) , (c % ])) _0.5 * (%: (*:b) - 4*a*c) ((* *) + ]) b >> >> Accuracy has a coolness all its own. >> >> Henry Rich >> >> On 12/12/2012 3:13 AM, Roger Hui wrote: >>>> ... produce more accurate results in some difficult cases. >>> >>> c=: p. <20$1.5 >>> c >>> 3325.26 _44336.8 280799 _1.1232e6 3.18239e6 _6.78911e6 1.13152e7 >>> _1.50869e7 >>> 1.63441e7 _1.45281e7 1.0654e7 _6.45695e6 3.22847e6 _1.3245e6 441501 >>> _117734 >>> 24527.8 _3847.5 427.5 _30 1 >>> p. c >>> ┌─┬───────────────────────────────────────────────────────────────────────────────┐ >>> │1│3r2 3r2 3r2 3r2 3r2 3r2 3r2 3r2 3r2 3r2 3r2 3r2 3r2 3r2 3r2 3r2 >>> 3r2 3r2 >>> 3r2 3r2│ >>> └─┴───────────────────────────────────────────────────────────────────────────────┘ >>> >>> >>> >>> On Tue, Dec 11, 2012 at 11:29 PM, Roger Hui >>> <rogerhui.can...@gmail.com>wrote: >>> >>>> You may or may not know that p. employs some extraordinary measures >>>> which >>>> produce more accurate results in some difficult cases. But those >>>> extraordinary measures are not "cool". For example: >>>> >>>> w=: p. <1+i.20 NB. Wilkinson's >>>> polynomial<http://en.wikipedia.org/wiki/Wilkinson_polynomial> >>>> w >>>> 2432902008176640000 _8752948036761600000 13803759753640704000 >>>> _12870931245150988800 8037811822645051776 _3599979517947607200 >>>> 1206647803780373360 _311333643161390640 63030812099294896 >>>> _10142299865511450 1307535010540395 _135585182899530 11310276995381 >>>> _7561... >>>> >>>> p. w >>>> ┌─┬──────────────────────────────────────────────────┐ >>>> │1│20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1│ >>>> └─┴──────────────────────────────────────────────────┘ >>>> >>>> >>>> >>>> >>>> >>>> On Tue, Dec 11, 2012 at 3:40 PM, Henry Rich <henryhr...@nc.rr.com> >>>> wrote: >>>> >>>>> None of these cute ways is very accurate in tough cases: >>>>> >>>>> 0j15 ": (2*a) %~ (-b) (+,-) %: (b^2) - 4*a*c [ 'a b c' =. 1e_6 1e6 >>>>> 1e_6 >>>>> 0.000000000000000 _1000000000000.000000000000000 >>>>> >>>>> But p. does better: >>>>> >>>>> 0j15 ": 1 {:: p. c,b,a >>>>> _1000000000000.000000000000000 _0.000000000001000 >>>>> >>>>> Henry Rich >>>>> >>>>> >>>>> >>>>> On 12/11/2012 6:29 PM, Roger Hui wrote: >>>>> >>>>>> There are some cheeky (or is it cheesy?) versions: >>>>>> >>>>>> (2*a) %~ (-b) (+,-) %: (b^2) - 4*a*c NB. Kip Murray >>>>>> (2*a) %~ - b (+,-) %: (b^2) - 4*a*c >>>>>> (+:a) %~ - b (+,-) %: (*:b) - 4*a*c >>>>>> -: a %~ - b (+,-) %: (*:b) - 4*a*c >>>>>> >>>>>> >>>>>> >>>>>> On Tue, Dec 11, 2012 at 11:37 AM, km <k...@math.uh.edu> wrote: >>>>>> >>>>>> It appears this could be translated into J as the rather cool >>>>>>> >>>>>>> (2*a) %~ (-b) (+,-) %: (b^2) - 4*a*c >>>>>>> >>>>>>> Sent from my iPad >>>>>>> >>>>>>> >>>>>>> On Dec 11, 2012, at 12:59 PM, Roger Hui <rogerhui.can...@gmail.com> >>>>>>> wrote: >>>>>>> >>>>>>> Example from the Iverson and McDonnell *Phrasal >>>>>>>> Forms*<http://www.jsoftware.**com/papers/fork.htm<http://www.jsoftware.com/papers/fork.htm>>paper >>>>>>>> (which >>>>>>>> introduced fork): >>>>>>>> >>>>>>>> (-b)(+,-)√((b*2)-4×a×c)÷2×a >>>>>>>> >>>>>>>> √ is a postulated APL primitive, spelled %: in J. >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Tue, Dec 11, 2012 at 10:49 AM, km <k...@math.uh.edu> wrote: >>>>>>>> >>>>>>>> What is the coolest way of programming the quadratic formula in >>>>>>>> J? We >>>>>>>>> >>>>>>>> are >>>>>>> >>>>>>>> finding the roots of polynomial c + x*(b + x*a) without using p. . >>>>>>>> I >>>>>>>>> >>>>>>>> offer >>>>>>> >>>>>>>> >>>>>>>>> roots >>>>>>>>> 3 : 0 >>>>>>>>> 'a b c' =. y >>>>>>>>> q =. %: (b^2) - 4*a*c >>>>>>>>> (2*a) %~ (-b) + q,-q >>>>>>>>> ) >>>>>>>>> roots 1 3 2 >>>>>>>>> _1 _2 >>>>>>>>> roots 1 0 1 >>>>>>>>> 0j1 0j_1 >>>>>>>>> roots 1 _2 1 >>>>>>>>> 1 1 >>>>>>>>> >>>>>>>>> partly as problem definition. I am looking for cool roots verbs! >>>>>>>>> >>>>>>>>> Kip Murray >>>>>>>>> >>>>>>>>> Sent from my iPad >>>>>>>>> >>>>>>>>> ------------------------------**------------------------------** >>>>>>>>> ---------- >>>>>>>>> For information about J forums see http://www.jsoftware.com/** >>>>>>>>> forums.htm <http://www.jsoftware.com/forums.htm> >>>>>>>>> >>>>>>>> ------------------------------**------------------------------** >>>>>>>> ---------- >>>>>>>> For information about J forums see http://www.jsoftware.com/** >>>>>>>> forums.htm <http://www.jsoftware.com/forums.htm> >>>>>>>> >>>>>>> ------------------------------**------------------------------** >>>>>>> ---------- >>>>>>> For information about J forums see http://www.jsoftware.com/** >>>>>>> forums.htm <http://www.jsoftware.com/forums.htm> >>>>>>> >>>>>>> ------------------------------**------------------------------** >>>>>> ---------- >>>>>> For information about J forums see >>>>>> http://www.jsoftware.com/**forums.htm<http://www.jsoftware.com/forums.htm> >>>>>> >>>>>> ------------------------------**------------------------------** >>>>> ---------- >>>>> For information about J forums see >>>>> http://www.jsoftware.com/**forums.htm<http://www.jsoftware.com/forums.htm> >>>>> >>>> >>>> >>> ---------------------------------------------------------------------- >>> For information about J forums see http://www.jsoftware.com/forums.htm >>> >> ---------------------------------------------------------------------- >> For information about J forums see http://www.jsoftware.com/forums.htm > > >---------------------------------------------------------------------- >For information about J forums see http://www.jsoftware.com/forums.htm > > > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm