lambertw, all branches
|
01-21-2024, 01:14 AM
(This post was last modified: 01-24-2024 07:27 PM by Albert Chan.)
Post: #20
|
|||
|
|||
RE: lambertw, all branches
(01-20-2024 10:52 PM)Gil Wrote: I looked your case k=-1 & k=1, x=-.1 + i ×1E-99. x = Wk(a) Newton's method required a good guess to start. (iterations cannot cross discontinuity!) lyuka's e^W formula is only used when a ≈ -1/e, and (k=0 or k=±1 and x with small imag part) Above example probably too far away from -1/e (my code use lyuka if |a+1/e| < 0.25) Also, your formula is only good for k=0. For k=-1, you need to flip sqrt sign. lua> a, e = I(-0.1, 1e-100), exp(1) lua> I.log((a+1/e)*(e-sqrt(2)-1) + I.sqrt((2/e)*(a+1/e)) + 1/e) -- x guess for k=0 (-0.1128478734106899+1.268028077236754e-99*I) lua> I.log((a+1/e)*(e-sqrt(2)-1) − I.sqrt((2/e)*(a+1/e)) + 1/e) -- x guess for k=-1 (-5.225138594746179-9.75118016335884e-98*I) If x imag part is big, it just use that. -- local A, T = I.abs(a), I.new(0,2*k*pi+I.arg(a)) -- local x = T -- W rough guess lua> I.W(a, 1, true) (0+9.42477796076938*I) (-4.330508133087424+7.394500450320804*I) (-4.448949088733658+7.307107936743056*I) (-4.449098178536345+7.307060789152774*I) (-4.44909817870089+7.3070607892176085*I) (-4.44909817870089+7.3070607892176085*I) If k=-1 and x imag part is small, we wanted real guess when a is negative real. Also, x→-∞ if a→0, log(-a) fit the bill. But if a is too negative (left of -1/e), code added some imaginery part. Imag part is needed because a=-1 --> log(-a) = log(1) = 0, very bad x guess! -- if small_imag then x = I.log(-a) + (A<.5 and 0 or T/2) end lua> I.W(a, -1, true) (-2.3025850929940455-1e-99*I) (-3.776907719462253-5.084465616380437e-100*I) (-3.5791241764023245-5.180347740277738e-100*I) (-3.577152274695805-5.181454351722727e-100*I) (-3.5771520639572993-5.18145447016809e-100*I) (-3.577152063957297-1.388025221322979e-99*I) |
|||
« Next Oldest | Next Newest »
|
User(s) browsing this thread: 1 Guest(s)