lambertw, all branches
|
04-08-2023, 03:21 PM
(This post was last modified: 04-15-2023 01:56 PM by Albert Chan.)
Post: #6
|
|||
|
|||
RE: lambertw, all branches
(04-07-2023 07:54 PM)Albert Chan Wrote: It is just here, "equivalent" may mean a difference of +0*I vs -0*I Just to show how sensitive this ±0*I business is ... lua> I.W(-1e-9,0,true) (-1.0000000005000001e-009+0*I) (-1.000000001e-009+0*I) (-1.0000000010000002e-009+0*I) lua> I.W(I.conj(-1e-9),0,true) (-1.0000000005000001e-009+0*I) (-1.000000001e-009+6.283185316604365e-009*I) (3.1450880362038825e-008-4.729032266472273e-010*I) (-7.848729544901978e-008-9.717506161329017e-008*I) ... 2nd should be complex conjugate of first. W(-1E-9 ± 0*I) ≈ -1.000000001E-9 ± 0*I Imaginary part sign of (a, W0(a)) should match. At first, I thought it is also a case of bad W guess. To keep x imag part intact, x+1 should be written as x-(-1) I added +0 to correction too, just to be sure. Technically, it is not needed. Signed zero: (±0) - 0 = (±0) , (±0) + 0 = 0 Code: < function complex.log1p(x) local y = x+1; return I.log(y) - (y-1-x)/y end This get W0 guess phase correct, however iterations still diverges. It is interesting Newton's 1st iteration essentially undo log1p patches. lua> I.W(I.conj(-1e-9),0,true) (-1.0000000005000001e-009-0*I) (-1.000000001e-009+0*I) (-1.0000000010000002e-009+6.283185319745956e-009*I) (3.145088037733907e-008-4.729032324603788e-010*I) ... The problem is Newton correction: 1/slope = x/(x+1). We fix it the same way: Code: < h = x/(x+1) * s(x) lua> I.W(I.conj(-1e-9),0,true) (-1.0000000005000001e-009-0*I) (-1.000000001e-009-0*I) (-1.0000000010000002e-009-0*I) I had applied above 2 patches to previous post. |
|||
« Next Oldest | Next Newest »
|
User(s) browsing this thread: 1 Guest(s)