Задача 9. Вычислить собственные числа матрицы
,
где A, B – заданные квадратные матрицы порядка n x n.
В качестве решения рассматривается случай, где n = 2. Так как в расматриваемом случае, задача сводится к решению квадратного уравнения, блок схема имеет вид:
Рис. 67 Блок схема вычисления корней квадратного уравнения в общем виде.
Ниже приводится текст программы с результатами расчетов:
static void FindAlgDop(double[,] A, int size, double[,] B)
{
int i, j;
// нахожу определитель матрицы A
double det = FindDeterminant(A, size);
if (det > 0) // это для знака алгебраического дополнения
det = -1;
else
det = 1;
double[,] minor = new double[size - 1, size - 1];
for (j = 0; j < size; j++)
{
for (i = 0; i < size; i++)
{
// получаю алгебраическое дополнение
GetMinor(A, minor, j, i, size);
if ((i + j) % 2 == 0)
B[j, i] = -det * FindDeterminant(minor, size - 1);
else
B[j, i] = det * FindDeterminant(minor, size - 1);
}
}
}
static double GetMinor(double[,] A, double[,] B, int x, int y, int size)
{
int xCount = 0, yCount = 0;
int i, j;
for (i = 0; i < size; i++)
{
if (i != x)
{
yCount = 0;
for (j = 0; j < size; j++)
{
if (j != y)
{
B[xCount, yCount] = A[i, j];
yCount++;
}
}
xCount++;
}
}
return 0;
}
static double FindDeterminant(double[,] A, int size)
{
// останавливаю рекурсию, если матрица
// состоит из одного элемента
if (size == 1)
{
return A[0, 0];
}
else
{
double det = 0;
int i;
double[,] Minor = new double[size - 1, size - 1];
for (i = 0; i < size; i++)
{
GetMinor(A, Minor, 0, i, size);
// Рекурсия
det += (int)Math.Pow(-1, i) * A[0, i] * FindDeterminant(Minor, size - 1);
}
return det;
}
}
static void Transpose_Matrix(int n, double[,] a)// метод, который транспонирует матрицу.
{
double tmp;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < i; j++)
{
tmp = a[i, j];
a[i, j] = a[j, i];
a[j, i] = tmp;
}
}
}
static void solution(int n, double[,] a, double[,] b, double[,] inverse)
{
double[,] Multip_of_A_A = new double[n, n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++) // Умножение матриц A и B
{
for (int k = 0; k < n; k++)
{
Multip_of_A_A[i, j] += a[i, k] * a[k, j];
}
}
}
double[,] Multip_of_A_A_B = new double[n, n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++) // Умножение матриц A и B
{
for (int k = 0; k < n; k++)
{
Multip_of_A_A_B[i, j] += Multip_of_A_A[i, k] * b[k, j];
}
}
}
double[,] Multip_of_A_A_B_inverse = new double[n, n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++) // Умножение матриц A и B
{
for (int k = 0; k < n; k++)
{
Multip_of_A_A_B_inverse[i, j] += Multip_of_A_A_B[i, k] * inverse[k, j];
}
}
}
double D = Math.Pow(Multip_of_A_A_B_inverse[0, 0] + Multip_of_A_A_B_inverse[1, 1], 2) - 4 * (Multip_of_A_A_B_inverse[0, 0] * Multip_of_A_A_B_inverse[1, 1] - Multip_of_A_A_B_inverse[0, 1] * Multip_of_A_A_B_inverse[1, 0]);
double x;
double x_2;
if (D < 0)
{
Console.WriteLine("Решения нет");
}
else if (D == 0)
{
x = -1 * (Multip_of_A_A_B_inverse[0, 0] + Multip_of_A_A_B_inverse[1, 1]) / 2;
Console.WriteLine("Собственное число имеют вид: x = {0}", x);
}
else
{
x = (-1 * (Multip_of_A_A_B_inverse[0, 0] + Multip_of_A_A_B_inverse[1, 1]) - Math.Sqrt(D)) / 2;
x_2 = (-1 *(Multip_of_A_A_B_inverse[0, 0] + Multip_of_A_A_B_inverse[1, 1]) + Math.Sqrt(D)) / 2;
Console.WriteLine("Собственные числа имеют вид: x = {0}, x2 = {1}", x, x_2);
}
}
static void Main(string[] args)
{
int N = 2;
Console.WriteLine("Введите элементы матрицы А: ");
double[,] A = new double[N,N];
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
A[i, j] = double.Parse(Console.ReadLine());
}
}
Console.WriteLine("Введите элементы матрицы B: ");
double[,] B = new double[N, N];
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
B[i, j] = double.Parse(Console.ReadLine());
}
}
double[,] tmp_A = new double[N, N];
FindAlgDop(A, N, tmp_A);
Transpose_Matrix(N, tmp_A);
double[,] inv = new double[N, N];
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
inv[i, j] = tmp_A[i, j] / FindDeterminant(A, N);
}
}
solution(N,A,B,inv);
Console.ReadKey();
}
Инструкция по работе с кодом программы была написана для запуска в Microsoft Visual Studio.
Для начала компиляции кода программы, необходимо нажать на кнопку Start на панели инструментов Microsoft Visual Studio или кнопку F5 на клавиатуре. В случае, если при компиляции не были обнаружены синтаксические или прочие ошибки, код успешно компилируется и выводится программа в окне консоли (черное окно вывода).
Для определения искомой величины необходимо ввести элементы матриц А и B:
"Введите элементы матрицы А: "
1 Enter;
2 Enter;
3 Enter;
4 Enter;
"Введите элементы матрицы B: "
1 Enter;
2 Enter;
3 Enter;
4 Enter;
Далее, программа производит расчет и выводит сообщение с искомой величиной или уведомлением в окно консоли:
"Собственные числа имеют вид: x = 0,138593383654928, x2 = 28,8614066163451"
Рис. 68 Результат работы программы по вычислению собственных чисел.
Do'stlaringiz bilan baham: |