МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ „ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІКТА
Кафедра Захист інформації
З В І Т
До лабораторної роботи №3
з курсу:
„ Комп’ютерні методи дослідження
інформаційних процесів та систем ”
на тему:
„ ІТЕРАЦІЙНІ МЕТОДИ РОЗВ’ЯЗУВАННЯ СИСТЕМ
ЛІНІЙНИХ АЛГЕБРАЇЧНИХ РІВНЯНЬ ”
Варіант 18
Львів – 2010
Мета роботи - ознайомлення з ітераційними методами розв’язування систем лінійних алгебраїчних рівнянь.
Короткі теоретичні відомості
До ітераційних методів належать: метод простої ітерації, метод Зейделя, метод верхньої релаксації та інші.
Метод Зейделя
Є система лінійних алгебраїчних рівнянь, що зведена до нормального вигляду
.
Тоді за методом Зейделя, вибираючи вектор початкових наближень
(як правило, це стовпець вільних членів ), уточнення значень невідомих проводять наступним чином:
1) перше наближення:
2) k + 1 наближення
k = 0, 1, 2, … .
Таким чином ітераційний процес подібний до методу простих ітерацій, однак уточнені значення одразу ж підставляються в наступні рівняння:
– метод Зейделя.
Іншими словами, метод Зейделя відрізняється від методу простої ітерації тим, що при обчисленні на “k+1”-му кроці враховуються значення , , , обчислені на цьому самому кроці.
Слід сподіватись, що ітерації за методом Зейделя дадуть при тому ж числі кроків більш точні результати, ніж за методом простої ітерації. Або така ж точність буде досягнута за менше число кроків, оскільки чергові значення невідомих визначаються тут більш точно ітераційний процес припиняється.
Якщо візьмемо систему
для якої точний розв’язок
Обчислення проведемо згідно формул:
.
За початкове наближення вибираємо вектор
Достатні умови збіжності ітераційного методу Зейделя
для всіх
і якщо хоча б для одного і ця нерівність строга
.
Завдання
Розв’язати систему лінійних алгебраїчних рівнянь методом Зейделя.
, k = 3;
p = 1;
Список індентифікаторів, змінних, функцій, використаних у блок-схемі алгоритму і програмі, та їх пояснення
double – тип з плаваючою точкою подвійної точності;
if-else - умовний оператор;
while - оператор циклу з передумовою;
public – модифікатор доступу, члени якого доступні з будь-якого місця програми ;
Main() – головна функція;
Abs (x)- повертає абсолютне значення x;
int – тип з 32-бітовим цілим числом з знаком.
Текст програми
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Laboratorna_robota3
{
class Labwork
{
public int i;
public int j;
public int n = 4;
public double m;
public double k;
public double p;
public double f;
public double t;
public double S;
public double Sum1 = 0;
public double Sum2 = 0;
public double E = 0.0001;
public double[,] A;
public double[] x;
public double[,] a;
public double[] b;
public void koeficienty()
{
Console.Write("введiть k=");
k = Convert.ToInt32(Console.ReadLine());
Console.Write("введiть p=");
p = Convert.ToInt32(Console.ReadLine());
S = 0.2 * k;
t = 0.2 * p;
}
public void print() {
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
Console.Write(a[i, j] + "x" + (j + 1));
Console.Write("+");
}
Console.WriteLine("=" + b[i]);
}
Console.WriteLine();
}
public void Zejdell_metod()
{
a = new double[n, n];
b = new double[n];
A = new double[n, n];
x = new double[n];
a[0, 0] = 13.3;
a[0, 1] = (2.62 + 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 - S);
a[1, 3] = 1.4;
a[2, 0] = 3.77;
a[2, 1] = (1.21 + S);
a[2, 2] = 8.04;
a[2, 3] = 0.28;
a[3, 0] = 2.21;
a[3, 1] = (3.65 - S);
a[3, 2] = 1.69;
a[3, 3] = 9.99;
b[0] = (-10.55 + t);
b[1] = 12.21;
b[2] = (15.45 - t);
b[3] = -8.3;
vuvid();
Console.ReadLine();
Console.WriteLine("Розв’язок системи лiнiйних рiвнянь методом Зейделя:");
Console.WriteLine();
print();
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (i == j)
{
A[i, j] = 0;
}
else
{
A[i, j] = -a[i, j] / a[i, i]; //ділення елементів матриці на діагональний елемент
}
}
b[i] = b[i] / a[i, i]; //ділення матриці вільних членів на елементи гол.діагоналі початкової матриці
}
Console.WriteLine();
Console.WriteLine("Початкове наближення:");
for (i = 0; i < n; i++)
{
Console.WriteLine("x" + (i + 1) + "=" + x[i]);
}
int v = 0;
do
{
m = 0;
v = v + 1;
for (i = 0; i < n; i++)
{
Sum1 = 0;
Sum2 = 0;
for (j = 0; j < i; j++)
{
Sum1 += A[i, j] * x[j];
}
for (j = i; j < n; j++)
{
Sum2 += A[i, j] * x[j];
}
f = x[i];
x[i] = b[i] + Sum1 + Sum2;
if ((Math.Abs((x[i] - f)) > m))
m = (Math.Abs(x[i] - f));
}
}
while (m > E);
Console.WriteLine();
Console.WriteLine("Кiлькiсть iтерацiй:");
Console.WriteLine( + v);
Console.WriteLine();
Console.WriteLine("кiнцевий результат:");
for (i = 0; i < n; i++)
{
Console.WriteLine("x" + (i + 1) + "=" + x[i]);
}
Console.ReadLine();
}
public void vuvid()
{
Console.WriteLine("Вивід елементів матриці");
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
Console.Write(a[i, j] + "\t");
}
Console.WriteLine();
}
Console.WriteLine();
Console.WriteLine("Вивід вільних елементів");
for (i = 0; i < n; i++)
{
Console.WriteLine(b[i]);
}
}
}
class Program
{
static void Main(string[] args)
{
Labwork got = new Labwork();
got.koeficienty();
got.Zejdell_metod();
}
}
}
Виконання програми
/
Висновок
На цій лабораторній роботі я ознайомився з ітераційними методами роз’язування систем лінійних алгебраїчних рівнянь .
Я склав програму мовою C# для розв’язування систем лінійних алгебраїчних рівнянь методом Зейделя