Задача 10. Вычислить определитель матрицы по формуле
где k, – скалярные величины; А – квадратная матрица, порядка которые задаются.
Блок схема имеет вид:
Рис. 69 Блок схема вычисления определителя матрицы D.
Ниже приводится текст программы с результатами расчетов:
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 Main(string[] args)
{
int i, j;
Console.Write("Введите k: ");
double k = double.Parse(Console.ReadLine());
Console.Write("Введите l: ");
double l = double.Parse(Console.ReadLine());
Console.Write("Введите размерность матриц: ");
int N = int.Parse(Console.ReadLine());
double[,] A = new double[N,N];
double[,] B = new double[N,N];
Console.WriteLine("Введите элементы матрицы A: ");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
A[i, j] = double.Parse(Console.ReadLine());
}
}
Console.WriteLine("Матрица A: ");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
Console.Write("{0}\t ", A[i, j]);
}
Console.WriteLine();
}
FindAlgDop(A, N, B); //Матрица алгебраических дополнений записывается в B
Transpose_Matrix(N, 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();
}
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
inv[i, j] = inv[i, j] * k;// Умножение на скаляр A^(-1)*k
}
}
Console.WriteLine("Обратная матрица A, умноженная на скаляр: ");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
Console.Write("{0}\t ", inv[i, j]);
}
Console.WriteLine();
}
double[,] E = new double[N,N];
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
if (i==j)
{
E[i, j] = 1;
}
else
{
E[i, j] = 0;
}
}
}
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
E[i, j] = l * E[i, j]; // Умножение на скаляр l*E
}
}
Console.WriteLine("Еденичная матрица, умноженная на скаляр: ");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
Console.Write("{0}\t ", E[i, j]);
}
Console.WriteLine();
}
double[,] D = new double[N, N];
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
D[i, j] = A[i, j] + inv[i, j] + E[i, j];
}
}
Console.WriteLine();
Console.WriteLine("Матрица D: ");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
Console.Write("{0}\t ", D[i, j]);
}
Console.WriteLine();
}
Console.WriteLine();
Console.Write("Определитель матрицы D: ");
double det = FindDeterminant(D, N);
Console.WriteLine(det);
Console.ReadKey();
}
Инструкция по работе с кодом программы была написана для запуска в Microsoft Visual Studio.
Для начала компиляции кода программы, необходимо нажать на кнопку Start на панели инструментов Microsoft Visual Studio или кнопку F5 на клавиатуре. В случае, если при компиляции не были обнаружены синтаксические или прочие ошибки, код успешно компилируется и выводится программа в окне консоли (черное окно вывода).
Для вычисления исходных величин, необходимо, ввести скаляры k и l размерность матрицы А, а также ее элементы:
"Введите k: "
2 Enter;
"Введите l: "
3 Enter;
"Введите размерность матриц: "
2 Enter;
"Введите элементы матрицы A: "
1 Enter;
2 Enter;
3 Enter;
4 Enter;
"Матрица A: "
1 2
3 4
"Обратная матрица A, умноженная на скаляр: "
4 -2
-3 1
"Еденичная матрица, умноженная на скаляр: "
3 0
0 3
"Матрица D: "
8 0
0 8
Далее, программа производит вычисления, переводя соответствующие значения в методы, и вывод искомый результат в окно консоли:
"Определитель матрицы D: 64"
Рис. 70 Результат работы программы по вычислению определителя матрицы D.
Do'stlaringiz bilan baham: |