МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
/
ЗВІТ
до лабораторної роботи № 5
з дисципліни
" AЛГОРИТМИ ТА МЕТОДИ ОБЧИСЛЕНЬ"
МЕТА РОБОТИ
Повторити метод матричного множення.
ЗАВДАННЯ НА ЛАБОРАТОРНУ РОБОТУ
Реалізувати стандартний алгоритм матричного множення і запрограмувати метод Гауса (розв'язок системи лінійних алгебраічних рівнянь).
Результат виконання програми.
/
Текст програми:
using System;
namespace Lab5
{
class Program
{
// Вивід системи рівняннь
static void sysout(double [,]a, double [] y, int n)
{
Console.WriteLine("Система рiвняння:");
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
Console.Write("{0}*x{1}", a[i,j],j);
if (j < n - 1)
{
Console.Write(" + ");
}
}
Console.WriteLine(" = {0}", y[i]);
}
return;
}
static void gauss(double [,] a, double [] y, int n)
{
double[] x = new double[n];
double max;
int k, index;
const double eps = 0.00001; // точність
k = 0;
while (k < n)
{
// Пошук рядка з максимальним a[i][k]
max = Math.Abs(a[k,k]);
index = k;
for (int i = k + 1; i < n; i++)
{
if (Math.Abs(a[i,k]) > max)
{
max = Math.Abs(a[i,k]);
index = i;
}
}
// Перестановка рядків
if (max < eps)
{
// немає ненульових діагональних елементів
Console.WriteLine("Рiшення отримати неможливо через нульового стовпчика ");
Console.WriteLine("{0} матриця A",index);
}
for (int j = 0; j < n; j++)
{
double temp1 = a[k,j];
a[k,j] = a[index,j];
a[index,j] = temp1;
}
double temp2 = y[k];
y[k] = y[index];
y[index] = temp2;
// Нормализация рівняннь
for (int i = k; i < n; i++)
{
double temp3 = a[i,k];
if (Math.Abs(temp3) < eps)
continue; // для нульового коефіцієнта пропустити
for (int j = 0; j < n; j++)
{
a[i,j] = a[i,j] / temp3;
}
y[i] = y[i] / temp3;
if (i == k)
continue;
for (int j = 0; j < n; j++)
{
a[i,j] = a[i,j] - a[k,j];
}
y[i] = y[i] - y[k];
}
k++;
}
Console.WriteLine("");
Console.WriteLine("Результат:");
//зворотня підстановка
for (k = n-1; k >= 0; k--)
{
//double[] res = new double[k];
x[k] = y[k];
for (int i = 0; i < k; i++)
{
y[i] = y[i] - a[i,k] * x[k];
}
}
for (int i = 0; i < n; i++)
{
Console.WriteLine("x[{0}]= {1}",i, y[i]);
}
}
static void Main(string[] args)
{
double[] x, y;
Console.Write("Введiть кiлькiсть рiвнянь: ");
int n = Convert.ToInt32(Console.ReadLine());
double[,] a = new double[n,n];
x = new double[n];
y = new double[n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
Console.Write("a[{0},{1}]=", i, j);
a[i,j]= Convert.ToDouble(Console.ReadLine());
}
}
Console.WriteLine("");
for (int i = 0; i < n; i++)
{
Console.Write("y[{0}]=", i);
y[i] = Convert.ToDouble(Console.ReadLine());
}
Console.WriteLine("");
sysout(a, y, n);
gauss(a, y, n);
Console.ReadKey();
}
}
}
Висновок: На даній лабораторній роботі я повторив метод матричного множення.