コード例 #1
0
        /// <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