МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІКТА
кафедра „КОМП’ЮТЕРИЗОВАНІ СИСТЕМИ, АВТОМАТИКА І УПРАВЛІННЯ”
ЗВІТ
до лабораторної роботи № 2
З КУРСУ “Комп’ютерні методи дослідження систем керування”
на тему: „ ПРЯМІ ТА ІТЕРАЦІЙНІ МЕТОДИ РОЗВ’ЯЗУВАННЯ СИСТЕМ ЛІНІЙНИХ АЛГЕБРИЧНИХ РІВНЯНЬ ”
Варіант № 3
Мета роботи: вивчити найпоширеніші прямі та ітераційні методи розв’язування систем лінійних алгебричних рівнянь та способи їх застосування для обчислення визначників і обертання матриць.
Вхідні дані:
Система №1
де ; ; порядковому № завдання; № групи
(наприклад, для КС-21 )
Метод Гауса з вибором головного елемента
У методі Гауса при обчисленні елементів матриці вимагається ділення на головні елементи , , … , . Якщо ж один з головних елементів рівний нулю, то схему єдиного ділення не можливо реалізувати. І навіть, коли усі головні елементи відмінні від нуля, але серед них є близькі до нуля, то тоді похибки суттєво зростають і не є контрольованими.
Метод Гауса з вибором головного елемента по рядку.
При пошуку головного елемента по рядку місцями міняються не рівняння системи (1.1), як при пошуку по стовпцю, а невідомі у всіх рівняннях. Наприклад, на першому кроці методу Гауса серед коефіцієнтів знайдемо максимальний по абсолютному значенню коефіцієнт. Нехай це буде коефіцієнт . Перепишемо систему, переставивши місцями та у всіх рівняннях:
. (3.3)
Від перестановки місцями доданків у рівняннях розв’язок системи не зміниться. На наступному кроці методу Гауса знаходимо максимальний коефіцієнт серед та знову здійснюємо заміну, і т.д. Після завершення зворотного ходу методу Гауса необхідно знову виконати перестановку , тобто впорядкувати елементи вектора у тому порядку, який був на самому початку.
Загальний алгоритм методу Гауса
з вибором головного елемента по рядку
для
для
для
рядкові сортування
для
для
;
Прямий хід:
рядкові сортування
,
для
якщо {; }
; ;
для
якщо {; ; }
інакше {; ; }
для
Оберне-ний хід:
для
якщо
Впорядку-вання
Опис алгоритму
Задаємо початкові значення вектора . Цей вектор містить інформацію про переміщення невідомих під час вибору головних елементів.
Прямий хід методу. Резервуємо (копіюємо) базові матриці та у відповідні матриці та . Вхідні матриці та нам необхідні для кінцевої перевірки результату. Протягом виконання алгоритму ми працюємо з копіями вхідних матриць.
Далі в трьох циклах виконується перетворення початкової матриці до трикутного вигляду матриці та відповідне перетворення правих частин системи . Зазначимо, що на кожному кроці першого циклу по змінній виконуємо процедуру рядкового сортування по головним елементам. Тобто, відшукуємо максимальне значення по модулю головного елемента, а потім міняємо місцями стовпці в матрицях та (копії матриць та ). Змінна визначає номер рядка головного елемента, змінна використовується як проміжна змінна при заміні значень у елементах матриць та , а як проміжна змінна при заміні значень елементів вектора .
Обернений хід. Спершу присвоюємо значення для останнього невідомого , а потім в циклі відшукуємо усі решта невідомі.
На останньому етапі впорядковуємо значення вектора у тому порядку, який був на самому початку.
Для перевірки вірності роботи алгоритму підставляємо наші знайдені в систему (1.1). Обчислені ліві частини рівнянь повинні відповідати правим значенням елементів вектора .
Список змінних, які використовуються в коді програми, та їх пояснення:
A[n][n] – матриця розмірністю 4*4;
P[n], inx[n], V[n][n], X[n], Y[n], C[n][n], max, value, z ,p, k, s, b – змінні типу double;
B[n] – стовпець вільних членів;
l, f, h, w, i, j – змінні типу int;
Блок-схема розробленої програми
Остаточна версія програми
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{}
void __fastcall TForm1::Button1Click(TObject *Sender)
{ int n=4;
double A[4][4]={{8.3,2.62+0.2*3,4.1,1.9},{3.92,8.45,7.78-0.2*3,2.46},
{3.77,7.21+0.2*3,8.04,2.28},{2.21,3.65-0.2*3,1.69,6.69}};
double B[4]={-10.65+0.02*21,12.21,15.45-0.02*21,-8.35};
double V[4][4],C[4][4],P[4],X[4],Y[4];
double max,value;
int w,z,d;
for (int i=0;i<n;i++)
{ P[i]=B[i];
for (int j=0;j<n;j++)
{ V[i][j]=A[i][j];
}
}
for (int k=0;k<n;k++)
{ max=abs(V[k][k]);
w=k;
for (int l=k+1;l<n;l++)
{ if (max<abs(V[k][l]))
{ max<abs(V[k][l]);
w=l; } }
z=X[k];
X[k]=X[w];
X[w]=z;
for (int d=1;d<n;d++);
{
if (d<k)
{
value=C[d][k];
C[d][k]=C[d][w];
C[d][w]=value;
}
}
Y[k]=P[k]/V[k][k];
for (int i=k+1;i<n;i++)
{P[i]+=-V[i][k]*Y[k];
for (int j=k+1;j<n;j++)
{ C[k][j]=V[k][j]/V[k][k];
V[i][j]+=-V[i][k]*C[k][j]; }}}
for (int i=0;i<n;i++)
X[i]=0;
X[n-1]=Y[n-1];
for(int i=n-2;i>=0;i--)
{for (int j=i+1;j<n;j++)
X[i]+=C[i][j]*X[j];
X[i]=Y[i]-X[i];}
Memo1->Lines->Clear();
Memo1->Lines->Add("Rozvyazok systemy X[]");
for (int i=0; i<n; i++)
Memo1->Lines->Add(X[i]);
Memo1->Lines->Add("");
Memo1->Lines->Add("Perevirka vuvid B[]");
for (int i=0; i<n; i++)
Memo1->Lines->Add(B[i]);
Memo1->Lines->Add("");
Memo1->Lines->Add("Perevirka vuvid symu A[i][j]*X[j]");
for (int i=0; i<n; i++)
Memo1->Lines->Add(A[i][0]*X[0]+A[i][1]*X[1]+A[i][2]*X[2]+A[i][3]*X[3]);}
Результати виконання програми
Висновок
На цій лабораторні роботі я написав програму для розв’язування систем лінійних алгебричних рівнянь Методом Гауса з вибором головного елемента по рядку.