You are on page 1of 11

Звіт

Комп’ютерний практикум 3
З дисципліни “Чисельні методи”
Варіант 18

Підготували студентка групи ІК-23


Пастушок Тетяна
Код:
using System;

class Program
{
static void Main()
{

double[,] A = {
{ 1.00, 0.55, -0.13, -0.15 },
{ 0.13, -0.17, 0.33, 0.17 },
{ 0.11, 0.18, -0.22, -0.11 },
{ 0.13, -0.12, 0.21, 0.22 }
};

// Виведення матриці A в консоль


Console.WriteLine("Matrix A:");
for (int i = 0; i < A.GetLength(0); i++)
{
for (int j = 0; j < A.GetLength(1); j++)
{
Console.Write("{0,8:F2} ", A[i, j]);
}
Console.WriteLine();
}

int n = A.GetLength(0);
double[,] L = new double[n, n];
double[,] U = new double[n, n];

// LU-розклад матриці A
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (j < i)
{
double s = 0;
for (int k = 0; k < j; k++)
{
s += L[i, k] * U[k, j];
}
L[i, j] = (A[i, j] - s) / U[j, j];
}
else
{
double s = 0;
for (int k = 0; k < i; k++)
{
s += L[i, k] * U[k, j];
}
U[i, j] = A[i, j] - s;
if (i == j)
{
L[i, j] = 1;
}
}
}
}

// Виведення матриць L та U в консоль


Console.WriteLine("Matrix L:");
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
Console.Write("{0,8:F2} ", L[i, j]);
}
Console.WriteLine();
}

Console.WriteLine("Matrix U:");
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
Console.Write("{0,8:F2} ", U[i, j]);
}
Console.WriteLine();
}

// Обернена матриця A^-1


double[,] A_inv = new double[n, n];
for (int i = 0; i < n; i++)
{

double[] c = new double[n];


for (int j = 0; j < n; j++)
{
if (i == j)
{
c[j] = 1;
}
else
{
c[j] = 0;
}
}
double[] x = Solve(L, U, c);
for (int j = 0; j < n; j++)
{
A_inv[j, i] = x[j];
}

// Виведення оберненої матриці в консоль


Console.WriteLine("Обернена матриця:");
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
Console.Write("{0,10:F2}", A_inv[i, j]);
}
Console.WriteLine();
}

// Знаходження вільних членів


double[] free_values = new double[n];
for (int j = 0; j < n; j++)
{
for (int i = 0; i < n; i++)
{
free_values[i] += A[i, j] * A_inv[j, i];
}
}

// Виведення вільних членів в консоль


Console.WriteLine("Вільні члени:");
for (int i = 0; i < n; i++)
{
Console.WriteLine("{0:F20}", free_values[i]);
}

// Знаходження детермінанту
double det = 1.0;
for (int i = 0; i < n; i++)
{
det *= U[i, i];
}

// Виведення детермінанту в консоль


Console.WriteLine("Детермінант: {0:F6}", det);

// Знаходження результату
double[] result = new double[n];
for (int i = 0; i < n; i++)
{
double sum = 0.0;
for (int j = 0; j < n; j++)
{
sum += A_inv[i, j] * free_values[j];
}
result[i] = sum;
}

// Виведення результату в консоль


Console.WriteLine("Результат:");
for (int i = 0; i < n; i++)
{
Console.WriteLine("{0,10:F2}", result[i]);
}
Console.ReadLine();
}

static double[] Solve(double[,] L, double[,] U, double[] c)


{
int n = L.GetLength(0);
double[] y = new double[n];
double[] x = new double[n];
// Розв'язування системи Ly = c
for (int i = 0; i < n; i++)
{
double s = 0;
for (int j = 0; j < i; j++)
{
s += L[i, j] * y[j];
}
y[i] = c[i] - s;
}

// Розв'язування системи Ux = y
for (int i = n - 1; i >= 0; i--)
{
double s = 0;
for (int j = i + 1; j < n; j++)
{
s += U[i, j] * x[j];
}
x[i] = (y[i] - s) / U[i, i];
}

return x;

}
}
Результати коду :
Код :
using System;

class Program
{
static void Main(string[] args)
{
int N = 18;
for (int n = 3; n <= 8; n++)
{
double[,] a = new double[n, n];
double[] b = new double[n];
double[,] c = new double[n, n];
double norm, cond;

// Заповнення матриць і вектора за заданою формулою


for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
double c_ij = 0.1 * N * (i + 1) * (j + 1);
double a_ij = 123 / (2 * Math.Pow(c_ij, 3) + 5 * Math.Pow(c_ij, 2));
a[i, j] = a_ij;
c[i, j] = c_ij;
}
b[i] = N;
}

// Обчислення Евклідової норми та числа обумовленості матриці


norm = MatrixNorm(a);
cond = MatrixConditionNumber(a);

Console.WriteLine($"n={n}, norm={norm:F6}, cond={cond:F6}");


}
}

static double MatrixNorm(double[,] A)


{
int m = A.GetLength(0);
int n = A.GetLength(1);
double norm = 0;

for (int i = 0; i < m; i++)


{
double row_sum = 0;
for (int j = 0; j < n; j++)
{
row_sum += Math.Abs(A[i, j]);
}
norm = Math.Max(norm, row_sum);
}

return norm;
}

static double MatrixConditionNumber(double[,] A)


{
int n = A.GetLength(0);
double[,] invA = MatrixInverse(A);
double cond = MatrixNorm(A) * MatrixNorm(invA);

return cond;
}

static double[,] MatrixInverse(double[,] A)


{
int n = A.GetLength(0);
double[,] I = new double[n, n];
double[,] B = new double[n, n];

// Створення одиничної матриці


for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i == j)
{
I[i, j] = 1;
}
else
{
I[i, j] = 0;
}
}
}

// Знаходження оберненої матриці за допомогою методу Гаусса-Жордана


for (int k = 0; k < n; k++)
{
double div = A[k, k];
for (int j = 0; j < n; j++)
{
A[k, j] /= div;
I[k, j] /= div;
}
for (int i = 0; i < n; i++)
{
if (i != k)
{
double sub = A[i, k];
for (int j = 0; j < n; j++)
{
A[i, j] -= sub * A[k, j];
I[i, j] -= sub * I[k, j];
}
}
}
}

return I;
}
}
using System;

class Program
{
static void Main(string[] args)
{
double[] S = { 1.1, 1.4, 2.2 }; // значення для S_i
double[] f = { 30, 45, 60 }; // значення для f_i в градусах
double[] a = new double[3]; // масив для a_i

// Знайдемо К1, К2, К3


double K1 = 0, K2 = 0, K3 = 0;
for (int i = 0; i < 3; i++)
{
double Si = S[i];
double fi = f[i] * Math.PI / 180; // переведемо у радіани
double eq = K1 * Si * Math.Cos(fi) + K2 * Math.Sin(fi) - K3 - Math.Pow(Si, 2);
K1 += Si * Math.Cos(fi) * eq;
K2 += Si * Math.Sin(fi) * eq;
K3 += eq;
}

// Виведемо значення K1, K2, K3


Console.WriteLine("K1 = " + K1);
Console.WriteLine("K2 = " + K2);
Console.WriteLine("K3 = " + K3);
// Знайдемо a1, a2, a3
a[0] = K1 / 2;
a[2] = K2 / (2 * a[0]);
a[1] = Math.Sqrt(Math.Pow(a[0], 2) + Math.Pow(a[2], 2) - K3);

// Виведемо результати
Console.WriteLine("a1 = " + a[0]);
Console.WriteLine("a2 = " + a[1]);
Console.WriteLine("a3 = " + a[2]);
}
}

Контрольні запитання

1. Сформулюйте постановку задачі розв'язування систем лінійних


алгебраїчних рівнянь.
Задача розв'язування системи лінійних алгебраїчних рівнянь полягає у
знаходженні вектора невідомих змінних x, що задовольняє систему
лінійних рівнянь Ax = b, де A - матриця коефіцієнтів, x - вектор невідомих
змінних, b - вектор правих частин.
2. Назвіть типи методів розв'язування систем лінійних алгебраїчних
рівнянь. Вкажіть їх основні відмінності.
Типи методів розв'язування систем лінійних алгебраїчних рівнянь:
 прямі методи (метод Гауса, LU-розклад, метод Холецького, ітераційні
методи (метод Якобі, метод Гауса-Зейделя, метод релаксації).
Основна відмінність між прямими та ітераційними методами полягає в
тому, що прямі методи знаходять точний розв'язок за скінченну кількість
кроків, тоді як ітераційні методи наближаються до точного розв'язку
певною послідовністю оновлень.
3. В чому полягає основна ідея методу Гауса і як метод Гауса
пов'язаний з LU-розкладанням матриці?
Основна ідея методу Гауса полягає у зведенні матриці A до треугольної
форми шляхом елементарних перетворень рядків. Це дозволяє зручно
знайти розв'язок системи шляхом зворотнього ходу. Метод Гауса
пов'язаний з LU-розкладанням матриці тим, що матрицю A можна
розкласти на добуток двох матриць: A = LU, де L - нижньотрикутна матриця
з одиницями на діагоналі, а U - верхньотрикутна матриця.
4. Як застосовується LU-розклад матриці для розв'язування систем
лінійних алгебраїчних рівнянь?
Для розв'язування системи лінійних алгебраїчних рівнянь з використанням
LU-розкладу спочатку знаходять розклад матриці A = LU, а потім знаходять
розв'язок шляхом зведення системи до двох систем з треугольними
матрицями L та U, які можна розв'язати зворотнім ходом.
5. Як можна використати LU-розклад матриці для обчислення її
оберненої матриці?
Щоб знайти обернену матрицю за допомогою LU-розкладу матриці,
спочатку потрібно знайти LU-розклад вхідної матриці. Потім можна
обчислити обернену матрицю шляхом розв'язування двох систем лінійних
рівнянь, де вектор правої частини для першої системи буде одиничним
вектором, а для другої - вектором, що складається зі стовпців одиничної
матриці.
6. Який порядок складності (сигнальної функції) прямих методів
розв'язування системи лінійних алгебраїчних рівнянь з n
невідомими?
Порядок складності (сигнальної функції) прямих методів розв'язування
системи лінійних алгебраїчних рівнянь з n невідомими складає O(n^3),
оскільки зазвичай ці методи використовують LU-розклад матриці, що
вимагає O(n^3) операцій. Однак, існують більш швидкі методи
розв'язування систем лінійних алгебраїчних рівнянь, які можуть мати
меншу складність, такі як ітераційні методи.
7. Дайте визначення норм матриці і вектору та вкажіть їх основні
властивості.
Нормою матриці є величина, яка вимірює її "величину" відносно векторів,
на які вона діє. Норма вектора вимірює його "величину" відносно
нульового вектора. Основні властивості норм матриці та вектора включають
невід'ємність, однорідність та нерівність трикутника.
8. Дайте визначення числа обумовленості матриці.
Число обумовленості матриці є величиною, яка вказує, наскільки чутливо
розв'язок системи лінійних алгебраїчних рівнянь реагує на малий збій в
коефіцієнтах рівнянь або правій частині. Число обумовленості матриці є
показником її стійкості до похибок в даних вхідної задачі.
9. Яка матриця називається погано обумовленою і як число
обумовленості впливає на точність розв'язку системи лінійних
алгебраїчних рівнянь?
Матриця є погано обумовленою, якщо її число обумовленості дуже велике,
що вказує на те, що навіть невелика похибка в коефіцієнтах рівнянь або
правій частині може призвести до значної похибки в розв'язку системи
лінійних алгебраїчних рівнянь. Чим більше число обумовленості матриці,
тим менша точність може бути досягнута при розв'язуванні системи
лінійних алгебраїчних рівнянь.

You might also like