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); }
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; }