МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
/
ЗВІТ
до лабораторної роботи № 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();
        }
    }
    
}
Висновок: На даній лабораторній роботі я повторив метод матричного множення.