/// <inheritdoc /> protected override void OnInverse(double[] xy, double[] lp, int startIndex, int numPoints) { for (int i = startIndex; i < startIndex + numPoints; i++) { int phi = i * 2 + PHI; int lam = i * 2 + LAMBDA; int x = i * 2 + X; int y = i * 2 + Y; int nn; double[] p = new double[2]; double[] dp = new double[2]; p[R] = xy[y]; p[I] = xy[x]; for (nn = 20; nn > 0; --nn) { double[] fp; double[] f = Proj.Zpolyd1(p, _bf, NBF, out fp); f[R] -= xy[y]; f[I] -= xy[x]; double den = fp[R] * fp[R] + fp[I] * fp[I]; p[R] += dp[R] = -(f[R] * fp[R] + f[I] * fp[I]) / den; p[I] += dp[I] = -(f[I] * fp[R] - f[R] * fp[I]) / den; if ((Math.Abs(dp[R]) + Math.Abs(dp[I])) <= EPS10) { break; } } if (nn > 0) { lp[lam] = p[I]; lp[phi] = _tphi[NTPHI]; for (int j = NTPHI - 1; j >= 0; j--) { lp[phi] = _tphi[j] + p[R] * lp[phi]; } lp[phi] = Phi0 + p[R] * lp[phi] * SEC5_TO_RAD; } else { lp[lam] = lp[phi] = double.MaxValue; } } }