1. Бахвалов Н.С. Численные методы. М.: Наука, 1987. 600 с.
2. Бусленко H. П., Голенко Д.И., Соболь И.М., Срагович В.Г., Шрейдер Ю.А.. Метод статистических испытаний (метод Монте-Карло). М.: Физматгиз, 1962. 332 с.
3. Бусленко Н.П., Шрейдер Ю.А. Метод статистических испытаний (Монте-Карло) и его реализация на цифровых вычислительных машинах. М.: Государственное издательство физико-математической литературы, 1961. 226 с.
4. Демидович Б.П., Марон И.А. Основы вычислительной математики. М.: Наука, 1966. 664 с.
5. Ермаков С.М. Метод Монте-Карло и смежные вопросы. М.: Наука, 1975. 294 с.
6. Калиткин Н.Н. Численные методы. М.: Наука, 1978. 512 с.
7. Копчёнова Н.В., Марон И.А. Вычислительная математика в примерах и задачах. М.: Наука, 1972. 368 с.
using System;System.Collections.Generic;System.Linq;System.Text;Числаки
{RotationMethod
{static double Max(double[,] matrix, out int index_i, out int index_j)
{_i = 0;_j = 1;max = Math.Abs(matrix[1,0]);(int i = 0; i < matrix.GetLength(0); i++)(int j = i + 1; j < matrix.GetLength(1); j++)(Math.Abs(matrix[i, j]) > max)
{= Math.Abs(matrix[i, j]);_i = i;_j = j;
}max;
}static double[,] CreateRotationMatrix(int rows, int columns, int i, int j, double cos_phi, double sin_phi)
{[,] matrix_h = new double[rows, columns];_h[i,i] = cos_phi;_h[j,j] = cos_phi;_h[i,j] = - sin_phi;_h[j,i] = sin_phi;(int k = 0; k < rows; k++)(int l = 0; l < columns; l++)
{(k == l && k != i && k != j)
{_h[k, l] = 1;
}
}matrix_h;
}static double[,] Transpose(double[,] matrix)
{[,] matrix_transpose = new double[matrix.GetLength(1), matrix.GetLength(0)];(int i = 0; i < matrix.GetLength(0); i++)(int j = 0; j < matrix.GetLength(1); j++)_transpose[j, i] = matrix[i, j];matrix_transpose;
}static double[,] Multiply(double[,] matrix_1, double[,] matrix_2)
{(matrix_1.GetLength(0) != matrix_2.GetLength(1)) throw new Exception("Некорректная размерность матриц");[,] matrix_multiply = new double[matrix_1.GetLength(0), matrix_2.GetLength(1)];(int i = 0; i < matrix_multiply.GetLength(0); i++)(int j = 0; j < matrix_multiply.GetLength(1); j++)(int k = 0; k < matrix_1.GetLength(0); k++)
{_multiply[i, j] += matrix_1[i, k] * matrix_2[k, j];
}matrix_multiply;
}static double[] Rotation(double[,] matrix, double eps, out double[,] matrix_vector)
{[] vector_eigenvals = new double[matrix.GetLength(0)];[,] matrix_a = matrix;i, j;count = 0;max = Max(matrix_a, out i, out j);.WriteLine("Max={0:0.###},\ti={1:0.###},\tj={2:0.###}", max, i, j);cos_phi = Math.Sqrt(0.5 * (1 + 1 / Math.Sqrt(1 + (2 * matrix_a[i, j] / (matrix[i, i] - matrix[j, j])) * (2 * matrix_a[i, j] / (matrix[i, i] - matrix[j, j])))));sin_phi = Math.Sqrt(0.5 * (1 - 1 / Math.Sqrt(1 + (2 * matrix_a[i, j] / (matrix[i, i] - matrix[j, j])) * (2 * matrix_a[i, j] / (matrix[i, i] - matrix[j, j])))));.WriteLine("Cos_phi={0}\tSin_phi={1}", cos_phi, sin_phi);title_h = "Матрица H_" + count + ":";[,] matrix_h = CreateRotationMatrix(matrix_a.GetLength(0), matrix_a.GetLength(1), i, j, cos_phi, sin_phi);(title_h, matrix_h);title_a = "Матрица A_" + count + ":";_a = Multiply(Multiply(Transpose(matrix_h), matrix_a), matrix_h);(title_a, matrix_a);_vector = matrix_h;(max > eps)
{++;= Max(matrix_a, out i, out j);.WriteLine("Max={0:0.###},\ti={1:0.###},\tj={2:0.###}", max, i, j);_phi = Math.Sqrt(0.5 * (1 + 1 / Math.Sqrt(1 + (2 * matrix_a[i, j] / (matrix_a[i, i] - matrix_a[j, j])) * (2 * matrix_a[i, j] / (matrix_a[i, i] - matrix_a[j, j])))));_phi = Math.Sqrt(0.5 * (1 - 1 / Math.Sqrt(1 + (2 * matrix_a[i, j] / (matrix_a[i, i] - matrix_a[j, j])) * (2 * matrix_a[i, j] / (matrix_a[i, i] - matrix_a[j, j])))));.WriteLine("Cos_phi={0}\tSin_phi={1}", cos_phi, sin_phi);_h = "Матрица H_" + count + ":";_h = CreateRotationMatrix(matrix_a.GetLength(0), matrix_a.GetLength(1), i, j, cos_phi, sin_phi);(title_h, matrix_h);_a = "Матрица A_" + count + ":";_a = Multiply(Multiply(Transpose(matrix_h), matrix_a), matrix_h);(title_a, matrix_a);_vector = Multiply(matrix_vector, matrix_h);
}(int l = 0; l < vector_eigenvals.GetLength(0); l++)_eigenvals[l] = matrix_a[l, l];vector_eigenvals;
}void PrintMatrix(string header, Array matrix)
{i = 0;.WriteLine();.WriteLine(header);(object x in matrix)
{(i == matrix.GetLength(1))
{.WriteLine();= 0;
}++;.Write("{0,11:0.#######}", x);
}.WriteLine();.WriteLine();
}void PrintVector(string header, string index, Array vector)
{i = 1;.WriteLine();.WriteLine(header);(object x in vector)
{.WriteLine("{0,6}[{1}]={2}", index, i, x);++;
}
}void Main()
{
{[,] matrix = { { 5, 1, 2 }, { 1, 4, 1 }, { 2, 1, 3 } };eps = 1e-3;[,] matrix_vector = new double[matrix.GetLength(0), matrix.GetLength(1)];[] vector_eigenvals = new double[matrix.GetLength(0)];("Исходная матрица:", matrix);_eigenvals = Rotation(matrix, eps, out matrix_vector);("Собственные значения", "lambda", vector_eigenvals);("Собственные вектора:", matrix_vector);
Console.ReadLine();
}(Exception e)
{.WriteLine(e.Message);.ReadLine();
}
}
}
}