Example #1
0
            public static void Verrier(double[][] A, double start, double end, double eps, out double[] self_values, out double[][] self_vectors)
            {
                self_values  = null;
                self_vectors = null;

                if (A == null || A.Count() == 0)
                {
                    return;
                }

                if (A.Count() != A[0].Count())
                {
                    return;
                }

                double[][][] A_pows = new double[A.Count()][][];
                A_pows[0] = A;
                for (int i = 1; i < A_pows.Count(); i++)
                {
                    A_pows[i] = Matrix_multiplication(A_pows[i - 1], A);
                }

                double[] S = new double[A_pows.Count()];
                for (int i = 0; i < S.Count(); i++)
                {
                    S[i] = 0;

                    for (int j = 0; j < A_pows[i].Count(); j++)
                    {
                        S[i] += A_pows[i][j][j];
                    }
                }

                double[] p = new double[A_pows.Count()];
                p[0] = S[0];
                for (int i = 1; i < p.Count(); i++)
                {
                    p[i] = 1.0 / (i + 1.0);

                    double pi = S[i];
                    for (int j = 0; j <= i - 1; j++)
                    {
                        pi -= (p[j] * S[i - 1 - j]);
                    }
                    p[i] *= pi;
                }

                Func <double, double> lambda_function = delegate(double lambda)
                {
                    double lambda_root = Math.Pow(lambda, p.Count());

                    for (int i = 0; i < p.Count() - 1; i++)
                    {
                        lambda_root -= p[i] * Math.Pow(lambda, p.Count() - 1 - i);
                    }

                    lambda_root -= p[p.Count() - 1];

                    return(lambda_root);
                };

                self_values = Lab2.Chords_multi(lambda_function, p.Count(), start, end, eps);
            }
Example #2
0
            public static void Krylov(double[][] A, double start, double end, double eps, out double[] self_values, out double[][] self_vectors)
            {
                self_values  = null;
                self_vectors = null;

                if (A == null || A.Count() == 0)
                {
                    return;
                }

                if (A.Count() != A[0].Count())
                {
                    return;
                }

                double[][] y = new double[A.Count() + 1][];
                for (int i = 0; i < y.Count(); i++)
                {
                    y[i] = new double[A.Count()];

                    for (int j = 0; j < y[i].Count(); j++)
                    {
                        if (i == 0)
                        {
                            if (j == 0)
                            {
                                y[i][j] = 1;
                            }
                            else
                            {
                                y[i][j] = 0;
                            }
                        }
                        else
                        {
                            y[i] = Matrix_multiplication(A, y[i - 1]);
                        }
                    }
                }

                double[][] p_matrix = new double[y.Count() - 1][];
                for (int i = 0; i < p_matrix.Count(); i++)
                {
                    p_matrix[i] = new double[p_matrix.Count() + 1];

                    for (int j = 0; j < p_matrix.Count(); j++)
                    {
                        p_matrix[i][j] = y[y.Count() - 2 - j][i];
                    }

                    p_matrix[i][p_matrix.Count()] = y[y.Count() - 1][i];
                }
                double[] p = Lab1.Gauss_main(p_matrix);

                Func <double, double> lambda_function = delegate(double lambda)
                {
                    double lambda_root = Math.Pow(lambda, p.Count());

                    for (int i = 0; i < p.Count() - 1; i++)
                    {
                        lambda_root -= p[i] * Math.Pow(lambda, p.Count() - 1 - i);
                    }

                    lambda_root -= p[p.Count() - 1];

                    return(lambda_root);
                };

                self_values = Lab2.Chords_multi(lambda_function, p.Count(), start, end, eps);

                double[][] q = new double[self_values.Count()][];
                for (int i = 0; i < q.Count(); i++)
                {
                    q[i] = new double[q.Count()];

                    for (int j = 0; j < q[i].Count(); j++)
                    {
                        if (j == 0)
                        {
                            q[i][j] = 1;
                        }
                        else
                        {
                            q[i][j] = self_values[i] * q[i][j - 1] - p[j - 1];
                        }
                    }
                }

                double[][] x = new double[self_values.Count()][];
                for (int i = 0; i < x.Count(); i++)
                {
                    x[i] = y[y.Count() - 2];

                    for (int j = 0; j < x[i].Count() - 1; j++)
                    {
                        x[i] = Matrix_addition(x[i], Matrix_multiplication(y[y.Count() - 3 - j], q[i][j + 1]));
                    }
                }

                self_vectors = x;
            }