Задача 6. Решить СЛАУ:
методом обращения матриц.
Блок схема имеет следующий вид:
Рис. 61 Блок схема вычисления решения системы линейных уравнений методом обратных матриц.
Ниже приводится текст программы с результатами расчетов:
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[,] Multip = new double[n, n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 1; j++) // Умножение матриц A и B
{
for (int k = 0; k < 1; k++)
{
Multip[i, j] += a[i, k] * b[k, j];
}
}
}
Console.WriteLine("x = {0}, y = {1}, z = {2}", Multip[0,0], Multip[1, 0], Multip[2, 0]);
}
static void Main(string[] args)
{
int i, j, N = 3;
double[,] A = { { 1, -5, 7 }, { 2, -1, 2 }, { 3, 5, -1 } };
double[,] sv_ch = new double[3, 1] { { 3 }, { 2 }, { 1 } };
double[,] B = new double[N, N];
Console.WriteLine("Матрица коэффициентов:");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
Console.Write("{0} ", A[i, j]);
}
Console.WriteLine();
}
FindAlgDop(A, N, B); //Матрица алгебраических дополнений записывается в B
Console.WriteLine("Матрица алгебраических дополнений:");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
Console.Write("{0} ", B[i, j]);
}
Console.WriteLine();
}
Console.WriteLine();
Transpose_Matrix(3, B);
double[,] inv = new double[N, N];
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
inv[i, j] = B[i, j] / FindDeterminant(A, N);
}
Console.WriteLine();
}
Console.WriteLine("Обратная матрица коэффициентов: ");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
Console.Write("{0}\t ", inv[i, j]);
}
Console.WriteLine();
}
Console.WriteLine();
solution(N, inv, sv_ch);
Console.ReadKey();
}
Инструкция по работе с кодом программы была написана для запуска в Microsoft Visual Studio.
Для начала компиляции кода программы, необходимо нажать на кнопку Start на панели инструментов Microsoft Visual Studio или кнопку F5 на клавиатуре. В случае, если при компиляции не были обнаружены синтаксические или прочие ошибки, код успешно компилируется и выводится программа в окне консоли (черное окно вывода).
Далее, программа производит расчет и выводит сообщение с искомыми величинами в окно консоли.
Рис. 62 Результат работы программы по вычислению решения системы линейных уравнений методом обратных матриц.
Задача 7. Вычислить собственные числа матрицы помощью решением уравнения
,
при заданного значения и матрицы порядком
В качестве решения рассматривается случай, где n = 2. Так как в расматриваемом случае, задача сводится к решению квадратного уравнения, блок схема имеет вид:
Рис. 63 Блок схема вычисления корней квадратного уравнения в общем виде.
Ниже приводится текст программы с результатами расчетов:
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());
}
}
double D = Math.Pow(A[0, 0] + A[1, 1], 2) - 4 * (A[0, 0] * A[1, 1] - A[0, 1] * A[1, 0]);
double x;
double x2;
if (D<0)
{
Console.WriteLine("Решения нет");
}
else if (D==0)
{
x = -1 * (A[0, 0] + A[1, 1]) / 2;
Console.WriteLine("Собственное число имеют вид: x = {0}", x);
}
else
{
x = (-1 * (A[0, 0] + A[1, 1]) - Math.Sqrt(D))/2;
x2 = (-1 * (A[0, 0] + A[1, 1]) + Math.Sqrt(D)) / 2;
Console.WriteLine("Собственные числа имеют вид: x = {0}, x2 = {1}", x,x2);
}
Console.ReadKey();}
Инструкция по работе с кодом программы была написана для запуска в Microsoft Visual Studio.
Для начала компиляции кода программы, необходимо нажать на кнопку Start на панели инструментов Microsoft Visual Studio или кнопку F5 на клавиатуре. В случае, если при компиляции не были обнаружены синтаксические или прочие ошибки, код успешно компилируется и выводится программа в окне консоли (черное окно вывода).
Для определения искомой величины необходимо ввести элементы матрицы А:
"Введите элементы матрицы А: "
1 Enter;
2 Enter;
3 Enter;
4 Enter;
Далее, программа производит расчет и выводит сообщение с искомой величиной или увидомлением в окно консоли:
"Собственные числа имеют вид: x = -5,37228132326901, x2 = "0,372281323269014"
Рис. 64 Результат работы программы по вычислению собственных чисел.
Do'stlaringiz bilan baham: |