Міністерство освіти і науки України
Національний університет „ Львівська політехніка “
Кафедра БІ
ЗВІТ
Про виконання лабораторної роботи №3
на тему: “Ітераційні методи розв’язування систем лінійних алгебраїчних рівнянь”
Мета роботи – ознайомлення з ітераційними методами розв’язування систем лінійних алгебраїчних рівнянь.
До ітераційних методів належать: метод простої ітерації, метод Зейделя, метод верхньої релаксації та інші.
Метод простої ітерації.
Нехай дано лінійну систему
(1)
Розглянемо матриці
Тоді систему (1) можна записати у вигляді матричного рівняння
(2)
Будемо вважати, що діагональні коефіцієнти (і = 1, 2,…, n).
Розв’яжемо перше рівняння системи (1) відносно , друге відносно і т.д. Тоді одержимо еквівалентну систему
(3)
де , при ; , при ;
; ;
Іноді кажуть, що система (3) зведена до нормального вигляду.
Введемо матриці ( та (
Систему (3) запишемо у вигляді
(4)
Систему (3) будемо розв’язувати методом послідовних наближень. За нульове наближення позначимо, наприклад, стовпчик вільних членів . Далі послідовно будуємо матриці-стовпці:
– перше наближення
– друге наближення і т.д.
Будь-яке (k + 1)-е наближення обчислюється за формулою:
, (k = 0, 1, 2, …) (5)
В розгорнутому вигляді .
Якщо послідовність наближень має границю
, (6)
то ця границя є розв’язком системи (3).
На практиці ітераційний процес припиняють, коли , де ( – гранична абсолютна похибка.
Завдання
Розв’язати систему лінійних алгебраїчних рівнянь методом Зейделя:
8.3*х1 + (2,62+s)*x2 + 4.1*x3 + 1.9*x4 = -10.55 + b
3.92*х1 + 8.45*x2 + (7.78-s)*x3 + 2.46*x4 = 12.21
3.77*х1 + (7.21+s)*x2 + 8.04*x3 + 2.28*x4 = 15.45 - b
2.21*х1 + (3.65-s)*x2 + 1.69*x3 + 6.99*x4 = -8.35
s=0.2*k, k=3;
b = 0.2*p, p=0
Список ідентифікаторів констант, змінних, процедур і функцій, використаних у програмі
j,i,k,m – змінні типу int, які використовуються для роботи циклів;
n, g – константи, якими вказую розміри масивів;
s,s1,f – змінні типу double які ми використовуємо при роботі програми;
a,b – змінні, за допомого яких виконуємо операції з масивами;
s – результат перевірки програми;
printf, scanf функції вводу і виводу;
Блок-схема алгоритму програми:
Текст програми:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace KMD_3
{
class Program
{
static void Main()
{
const int n=4;
const int g=1;
{
int j,i,k,m;
double s,s1,f;
Random r = new Random();
int S = r.Next(0, 5);
int q = r.Next(0, 5);
double [,] a = new double[n,n];
double [,] p = new double[n,n];
double [] b = new double[n];
double[] x = new double[n];
{
a[0, 0] = 3.3;
a[0, 1] = 12.62 + 0.2 * S;
a[0, 2] = 4.1;
a[0, 3] = 1.9;
a[1, 0] = 3.92;
a[1, 1] = 8.45;
a[1, 2] = 1.78 - 0.2 * S;
a[1, 3] = 1.4;
a[2, 0] = 3.77;
a[2, 1] = 1.21 + 0.2 * S;
a[2, 2] = 8.04;
a[2, 3] = 0.28;
a[3, 0] = 2.21;
a[3, 1] = 3.65 - 0.2 * S;
a[3, 2] = 1.69;
a[3, 3] = 9.99;
for (i=0;i<n;i++)
for (k=0;k<n;k++)
p[i,k]=a[i,k];
b[0] = -10.55 + 0.2 * q;
b[1] = 12.21;
b[2] = 15.45 - 0.2 * q;
b[3] = -8.35;
for (k = 0; k < n; k++)
{
for(i=0;i<n;i++)
{
Console.Write("{0} ", a[k, i]);
}
Console.WriteLine("{0}", b[k]);
}
for (j = 1; j < n; j++)
a[0, j] /= a[0, 0];
b[0]/=a[0,0];
for (k=1;k<n;k++)
{
for (i=k;i<n;i++)
for (m=0;m<=k-1;m++)
a[i,k]-=a[i,m]*a[m,k];
if (k==(n-1))
goto g;
for (j=k+1;j<n;j++)
{
s1=0;
for (m=0;m<=k-1;m++)
s1+=a[k,m]*a[m,j];
a[k,j]=(a[k,j]-s1)/a[k,k];
}
g:s=0;
for (m=0;m<=k-1;m++)
s+=a[k,m]*b[m];
b[k]=(b[k]-s)/a[k,k];
}
for (i=0;i<n;i++)
x[i]=0;
x[n-1]=b[n-1];
for (i=n-2;i>=0;i--)
{
s=0;
for (m=i+1;m<n;m++)
s+=a[i,m]*x[m];
x[i]=b[i]-s;
}
for (i=0;i<n;i++)
{
Console.WriteLine("x= {0}",x[i]);
}
}
for (i=0;i<n;i++)
{
s=0;
for (k = 0; k < n; k++)
{
s += p[i, k] * x[k];
}
Console.WriteLine("s= {0}", s);
}
Console.ReadLine();
}
}
}
}
Результати виконання програми:
Висновок: ознайомився з ітераційними методами розв’язування систем лінійних алгебраїчних рівнянь.