МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА"
ІКТА
Кафедра ЗІ
ЗВІТ
до лабораторної роботи № 3
з курсу
"Комп’ютерні методи дослідження інформаційних процесів та систем"
на тему
Ітераційні методи розв’язування систем лінійних алгебраїчних рівнянь
Варіант 11
ЛЬВІВ 2016
Мета роботи – ознайомлення з ітераційними методами розв’язування систем лінійних алгебраїчних рівнянь.
1.Завдання
Розв’язати систему лінійних алгебраїчних рівнянь методами простої ітерації або Зейделя.
, k=1;
p=1.
2.Блок-схема алгоритму програми
3. Список ідентифікаторів констант, змінних, функцій, використаних у блок-схемі алгоритму і програмі, та їх пояснення
x, a, b, E – змінні дійсного типу, які є аргументами виразу;
y – змінна дійсного типу, якій надається значення результату обчислення виразу;
Main() – головний метод;
Vvid() – метод, в якому вводяться дані;
Obrah() – метод, в якому обчислюється вираз;
Convert.ToDouble() – метод перетворення типу змінної в тип double;
Math.Pow(x,y) – математичний метод обчислення xy;
Math.Abs(x) – математичний метод обчислення модуля;
4. Текст програми
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace kmd_lab_3
{
class Program
{
static void Main(string[] args)
{
Iterations xD = new Iterations();
xD.Initialization();
xD.PerevirkaZbizhnosti();
xD.SomeCalculations();
xD.Checking();
Console.ReadKey();
}
}
class Iterations
{
public int k, p, kil;
public double s, b, rez, E;
public double[] x0 = new double[4];
public double[] x1 = new double[4];
public double[] e = new double[4];
static public double[,] a;
public double[,] alpha;
public double[] beta;
public void Initialization()
{
Console.Write("\n write k = ");
k = int.Parse(Console.ReadLine());
Console.Write("\n write p = ");
p = int.Parse(Console.ReadLine());
s = 0.2 * k;
b = 0.2 * p;
E = 0.0001;
a = new double[,]{{ 30.3, 12.62+s, 4.1, 1.9, -10.55+b},
{3.92, 8.45, -(1.78-s), 1.4, 12.21},
{3.77, 1.21+s, 8.04, 0.28, 15.45-b},
{2.21, 3.65-s, 1.69, 9.99, -8.35}};
alpha = new double[a.GetLength(0), a.GetLength(0)];
beta = new double[a.GetLength(0)];
}
public void SomeCalculations()
{
for (int i = 0; i < a.GetLength(0); i++)
{
for (int j = 0; j < a.GetLength(0); j++)
{
if (i != j)
alpha[i, j] = -(a[i, j] / a[i, i]);
}
}
for (int i = 0, j = (a.GetLength(1) - 1); i < a.GetLength(0); i++)
beta[i] = (a[i, j] / a[i, i]);
for (int i = 0; i < beta.GetLength(0); i++)
x0[i] = beta[i];
do
{
for (int i = 0; i < alpha.GetLength(0); i++)
{
x1[i] = beta[i];
for (int j = 0; j < alpha.GetLength(0); j++)
x1[i] = x1[i] + x0[j] * alpha[i, j];
e[i] = Math.Abs(x1[i] - x0[i]);
x0[i] = x1[i];
}
kil++;
}
while (!(e[0] < E && e[1] < E && e[2] < E && e[3] < E));
}
public void PerevirkaZbizhnosti()
{
for (int i = 0; i < a.GetLength(0); i++)
{
rez = 0;
for (int j = 0; j < a.GetLength(0); j++)
if (i != j)
rez += Math.Abs(a[i, j]);
if (rez > Math.Abs(a[i, i]))
Console.WriteLine("False answer");
}
}
public void Checking()
{
Console.WriteLine("Koreni rivnyann'a:");
foreach (int x in x1)
Console.Write("\t" + x);
double z = x1[0] * a[0, 0] + x1[1] * a[0, 1] + x1[2] * a[0, 2] + x1[3] * a[0, 3];
double z1 = x1[0] * a[1, 0] + x1[1] * a[1, 1] + x1[2] * a[1, 2] + x1[3] * a[1, 3];
double z2 = x1[0] * a[2, 0] + x1[1] * a[2, 1] + x1[2] * a[2, 2] + x1[3] * a[2, 3];
double z3 = x1[0] * a[3, 0] + x1[1] * a[3, 1] + x1[2] * a[3, 2] + x1[3] * a[3, 3];
if (((int)z == (int)a[0, 4]) && ((int)z1 == (int)a[1, 4]) && ((int)z2 == (int)a[2, 4]) && ((int)z3) == ((int)a[3, 4]))
Console.WriteLine("\nTrue answer");
Console.WriteLine("Kilkist' iteraziy = " + kil);
}
}
}
5. Результати роботи програми
6. Висновки
На цій лабораторній роботі я ознайомився з методами розв’язування систем лінійних алгебраїчних рівнянь. Була складена та відлагоджена програма, яка дозволила реалізувати метод простої ітерації.