/// <summary> /// Wyznacza pierwiastek Z wielomianu stopnia N o współczynnikach /// zapisanych w wektorze FW[i] /// </summary> /// <param name="N">Stopień wielomianu </param> /// <param name="FW">Wektor współczynników wielomianu</param> /// <param name="Z">Pierwiastek wielomianu</param> /// <param name="eps"> dokładność bezwzględna iteracji np. eps=1E-16</param> /// <param name="maxit">ustalona maksymalna liczba iteracji kończąca obliczenia</param> /// <returns>return - nr błędu; 0 - brak błędu.</returns> private static int Laguerre(int N, double[] FW, ref Complex.Complex Z, double eps, int maxit) { Complex.Complex B, C, D, S, H, M1, M2; double MM1, MM2, Alfa, Nx, LL, MM; int N1, i, k, Blad; Blad = 0; if (FW[0] == 0) { Blad = 1; } else { if (FW[N] == 0) { Z = new Complex.Complex(0, 0); } else { N1 = N - 1; k = 0; do { //Wyznaczanie wartości wielomianu i ich pochodnych pierwszego // i drugiego rodzaju wg algorytmu Hornera (4.76) B = new Complex.Complex(FW[0], 0); C = B; D = B; for (i = 1; i <= N; i++) { if (i <= N - 2) { S = B * Z; S += FW[i]; B = S; C *= Z; C += B; D *= Z; D += C; } else { if (i <= N - 1) { S = B * Z; S += FW[i]; B = S; C *= Z; C += B; } else { S = B * Z; S += FW[i]; B = S; } } } D *= 2.0; //Konstukcja wzoru rekurencyjnego (4.74) Nx = N1; H = C * C; H *= Nx; Nx = N; S = B * D; S *= Nx; // H - wg wzoru (4.75) Nx = N1; H -= S; H *= Nx; H = ComplexMath.Sqrt(H); M1 = B / (C + H); M2 = B / (C - H); MM1 = ComplexMath.Abs(M1); MM2 = ComplexMath.Abs(M2); Nx = N; if (MM1 > MM2) { H = M2 * Nx; } else { H = M1 * Nx; } Z -= H; k++; LL = ComplexMath.Abs(H); MM = ComplexMath.Abs(Z); Alfa = LL / MM; }while (!(Alfa < eps || k > maxit)); if (k > maxit) { Blad = 3; } } } return(Blad); }//Laguerre