- •Числові методи лінійної алгебри
- •1 Розв’язування слар методом Гауcса
- •2. Обчислення визначника квадратної матриці методом Гаусса за схемою з частковим вибором головного елемента
- •3. Розв’язування слар методом Гаусса– Жордано
- •4. Знаходження оберненої матриці методом Гаусса–Жордано
- •5. Порядок виконання лабораторної роботи
- •6. Варіанти завдань
2. Обчислення визначника квадратної матриці методом Гаусса за схемою з частковим вибором головного елемента
Перетворення
матриці
в методі Гаусса називаються перетвореннями
Гаусса, а перетворення вектора
–
перетвореннями узгоджених з перетвореннями
матриці. Перетворення матриці
можна
використати для обчислення визначника
матриці.
Нехай
.
Після першого кроку за схемою з частковим
вибором головного елемента задана
матриця перетвориться до матриці
з визначником
, (*)
,
якщо перестановки рядків в матриці не
було, та
якщо
перестановка була.
Після
другого кроку задана матриця перетвориться
до матриці
з визначником
, (**)
,
якщо перестановки рядків в матриці не
було, та
– якщо
перестановка була.
Після
останнього кроку задана матриця
перетвориться до матриці
з визначником
, (***)
l – сума перестановок рядків. Визначник трикутної матриці дорівнює добутку діагональних елементів, тобто одиниці. Тому
,
і в підсумку
,
тобто визначник з точністю до знаку дорівнює добутку головних елементів.
Алгоритм обчислення визначника матриці методом Гаусса за схемою з частковим вибором головного елемента реалізований в такій функції.
function detA_gauss(a:matrix;n:byte):real;
{Процедура обчислює визначник квадратної матрицi методом Гаусса за схемою з частковим вибором головного елемента.
Вхiднi данi:
a - масив з елементами матрицi;
n - кiлькiсть рiвнянь системи;
Вихiднi данi:
Значення визначника присвоюється iменi функцiї}
var
am,t:real;
i,j,k,l:size;
begin
{прямий хiд, k – номер кроку}
det:=1;
for k:=1 to n do
begin
{шукається головний елемент на k – кроцi, am, номер його l}
am:=a[k,k]; l:=k;
for i:=k to n do
if abs(a[i,k])>abs(am) then begin am:=a[i,k]; l:=i;end;
{якщо головний елемент за модулем менший за програмний нуль, то визначник дорівнює нулю}
if abs(am)<zero then begin det:=0; exit; end;
{перестановка k – рядка i l – рядка}
if l<>k then
begin
det:=-det; {при перестановці рядків визначник змінює знак на протилежний}
for j:=1 to n do
begin t:=a[l,j]; a[l,j]:=a[k,j]; a[k,j]:=t; end;
end;
{k – рядок ділиться на головний елемент}
for j:=k+1 to n do a[k,j]:=a[k,j]/am;
{обчислення елементів наступних рядків матриці}
for i:=k+1 to n do
begin
t:=a[i,k]; for j:=1 to n do a[i,j]:=a[i,j]-t*a[k,j];
end;
det:=det*am
end;
detA_gauss:=det;
end;
3. Розв’язування слар методом Гаусса– Жордано
Стратегія методу Гаусса-Жордано полягає в тому, що СЛАР (1.1) шляхом елементарних перетворень приводиться до рівносильної системи рівнянь
,
(3.1)
одинична
матриця. Добуток одиничної матриції та
вектора дорівнює вектору, тому з рівності
(3.1) випливає
.
Отже, розв’язок СЛАР методом Гаусса–Жордано знаходиться в результаті прямого ходу. Розрізняють різні обчислювальні схеми методу Гауса–Жордано. Однією з таких є схема з частковим вибором головного елемента з такими діями на k – кроці.
Спочатку
знаходять елемент
такий, що
,
(l – рівняння
міняється місцями з k – рівнянням),
,
,
. . .
,
,
. . .
.
В результаті після цього кроку СЛАР
перетвориться до такої
,
в якій
,
,
, (8.3.2)
, ,
. (8.3.3)
Алгоритм розв’язування СЛАР методом Гаусса за схемою з частковим вибором головного елемента реалізований в такій процедурі.
procedure SLAR_gauss_jordano(a:matrix;b:vector;n:size;
var x:vector;var error:byte);
{Процедура розв'язує систему лiнiйних алгебраїчних рiвнянь методом Гаусса за схемою з частковим вибором головного елемента.
Нестандартні типи даних визначені в модулі matr_alg.
Вхiднi данi
a - масив з коефiцiєнтами при невiдомих;
b - масив з вiльними членами системи;
n - кiлькiсть рiвнянь системи;
Вихiднi данi
x - масив з роз'язком системи;
error - код помилки;
0 – розв'язок системи знайдено,
1 – матриця з коефiцiєнтiв при невiдомих вироджена, система може мати безлiч розв'язкiв або жодного.}
var
i,j,k,l:size;
am,t:real;
begin
error:=0;
{прямий хiд, k-номер кроку}
for k:=1 to n do
begin
{шукається головний елемент на k – кроцi, am, номер його l}
am:=a[k,k]; l:=k;
for i:=k+1 to n do
if abs(a[i,k])>abs(am) then begin am:=a[i,k]; l:=i;end;
{якщо головний елемент за абсолютною величиною менший за програмний нуль zero, то вихід з процедури}
if abs(am)<zero then begin error:=1; exit end;
{перестановка мiсцями к – рiвняння i l – рівняння (якщо потрiбно)}
if l<>k then
begin
for j:=1 to n do
begin t:=a[k,j]; a[k,j]:=a[l,j]; a[l,j]:=t; end;
t:=b[k]; b[k]:=b[l]; b[l]:=t;
end;
{к – рiвняння ділиться на головний елемент am, формули (3.2)}
for j:=1 to n do a[k,j]:=a[k,j]/am;
b[k]:=b[k]/am;
{обчислення коефiцiєнтів при невідомих та вiльних членів решти рівнянь, формули (3.3)}
for i:=1 to n do if i<>k then
begin
t:=a[i,k];
b[i]:=b[i]-t*b[k];
for j:=1 to n do a[i,j]:=a[i,j]-t*a[k,j];
end;
end;
for i:=1 to n do x[i]:=b[i];
end;
