
- •Числові методи лінійної алгебри
- •1 Розв’язування слар методом Гауcса
- •2. Обчислення визначника квадратної матриці методом Гаусса за схемою з частковим вибором головного елемента
- •3. Розв’язування слар методом Гаусса– Жордано
- •4. Знаходження оберненої матриці методом Гаусса–Жордано
- •5. Порядок виконання лабораторної роботи
- •6. Варіанти завдань
4. Знаходження оберненої матриці методом Гаусса–Жордано
Оберненою
матрицею до матриці
називається матриця
,
яка в добутку з матрицею
дає одиничну матрицю:
Нехай
– вектор
з елементів другого стовпчика оберненої
матриці. Добуток матриці
та
вектора
є
першим стовпчиком одиничної матриці:
,
(*)
Нехай
– вектор
з елементів другого стовпчика оберненої
матриці. Добуток матриці
та
вектора
є
другим стовпчиком одиничної матриці:
,
(**)
і т. д:
. (**…*)
Отже,
задача знаходження оберненої матриці,
звелася до розвязування n
СЛАР (*), (**), (**…*). Ці системи мають
однакові матриці з коефіцієнтів при
невідомих і можуть розв’язуватися
одночасно. Вигідно розв’язувати їх
методом Гаусса -Жордано. Після перетворень
Гаусса-Жордано на місці вектора
будуть
елементи I – стовпчика
оберненої матриці. Тому схематично
знаходження оберненої матриці методом
Гаусса -Жордано можна зобразити так:
(перетворення
Гаусса–Жордано)
.
(4.1)
Саме це і реалізовано в такій процедурі:
procedure A_1_gaus_jordano(a:matrix;n:size;
var a_1:matrix;var error:byte);
{Процедура знаходить обернену матрицю до заданої матриці методом Гауса –Жордано за схемою з частковим вибором головного елемента.
Нестандартні типи даних визначені в модулі matr_alg.
Вхiднi данi
a - масив з коефiцiєнтами при невiдомих;
n – порядок матриці;
Вихiднi данi
a_1 - масив з елементами оберненої матриці;
error - код помилки;
0 – розв'язок системи знайдено,
1 – матриця з коефiцiєнтiв при невiдомих вироджена, оберненої матриці немає}
var
i,j,k,l:size;
am,t:real;
begin
error:=0;
{формування одиничної матриці}
for i:=1 to n do
for j:=1 to n do
if i=j then a_1[i,j]:=1 else a_1[i,j]:=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 l - рядків (якщо потрiбно)}
if l<>k then
for j:=1 to n do
begin
t:=a[k,j]; a[k,j]:=a[l,j]; a[l,j]:=t;
t:=a_1[k,j]; a_1[k,j]:=a_1[l,j]; a_1[l,j]:=t;
end;
{к – рядки діляться на головний елемент am}
for j:=1 to n do
begin
a[k,j]:=a[k,j]/am;a_1[k,j]:=a_1[k,j]/am;
end;
{обчислення елементів решти рядків}
for i:=1 to n do if i<>k then
begin
t:=a[i,k];
for j:=1 to n do begin a[i,j]:=a[i,j]-t*a[k,j];a_1[i,j]:=a_1[i,j]-p*a_1[k,j];end;
end;
end;
end;
5. Порядок виконання лабораторної роботи
Створити модуль lin_alg з процедурами та функціями попередніх параграфів.
Записати алгоритм розв’язування задачі мовою Turbo Pascal і створити файл з кодом програми.
Програма розв’язування СЛАР в цій лабораторній роботі методом Гаусса може бути такою:
program lab8;
uses matr_alg, lin_alg;
var
a,c,c_1:matrix;
b,x:vector;
n:size;
error:byte;
fin, fout:text;
begin
assign(fin,’ost_lab8.in);
reset(fin);
assign(fout,’ost_lab8.out);
rewrite(fout);
read(fin,n);
read_matrix(fin,a,n);
read_matrix(fin,c,n);
read_vector(fin,b,n);
A_1_gaus_jordano(c,n,c_1,error);
if error=1 then begin writeln(fout, ‘Матриця С вироджена’); halt(1);end;
add_matrix(a,c_1,n,c);
SLAR_gaus(c,b,n,x,error);
If error=0 then write_vector(fout,x,n,2)
else writeln(fout,’Матриця А+С_1 – вироджена’)
close(fout); close(fin);
end.
Програма розв’язування заданної СЛАР методо Гауса–Жордано така сама, лише замість процедури SLAR_gauss необхідно звернутися до процедури SLAR_gaus_jordano.
Програма розв’язування заданої СЛАР за правилом Крамера (лише з навчальною метою) могла б бути такою:
program lab8;
uses matr_alg, lin_alg;
var
a,c,c_1:matrix;
b,x:vector;
n,i,j,k:size;
error:byte;
det:real;
fin, fout:text;
begin
assign(fin,’ost_lab8.in);
reset(fin);
assign(fout,’ost_lab8.out);
rewrite(fout);
read(fin,n);
read_matrix(fin,a,n);
read_matrix(fin,c,n);
read_vector(fin,b,n);
A_1_gaus_jordano(c,n,c_1,error);
if error=1 then begin writeln(fout, ‘Матриця С вироджена’); halt(1);end;
add_matrix(a,c_1,n,c);
det:=detA_gaus(c,n);
if abs(det)<zero then begin writeln(fout,’Матриця А+С_1 – вироджена’); halt(1); end;
for k:=1 to n do
begin
for i:=1 to n do
for j:=1 to n do a[i,j]:=c[i,j];
for i:=1 to n do c[i,k]:=b[i];
x[k]:=detA_gaus(a,n)/det;
end;
write_vector(fout,x,n,2)
close(fout); close(fin);
end.
Програма розв’язування заданої СЛАР методом оберненої матриці (лише з навчальною метою) могла б бути такою:
program lab8;
uses matr_alg, lin_alg;
var
a,c,c_1:matrix;
b,x:vector;
n:size;
error:byte;
fin, fout:text;
begin
assign(fin,’ost_lab8.in);
reset(fin);
assign(fout,’ost_lab8.out);
rewrite(fout);
read(fin,n);
read_matrix(fin,a,n);
read_matrix(fin,c,n);
read_vector(fin,b,n);
A_1_gaus_jordano(c,n,c_1,error);
if error=1 then begin writeln(fout, ‘Матриця С вироджена’); halt(1);end;
add_matrix(a,c_1,n,c);
A_1_gaus_jordano(c,n,c_1,error);
If error=0 then write_vector(fout,x,n,2)
else writeln(fout,’Матриця А+С_1 – вироджена’)
close(fout); close(fin);
end.
Створити файл вхідних даних, наприклад такий
Файл lab8.in
3
2.3 3.5 4.7
4.4 2.4 3.7
5.6 7.4 4.5
5.6 6.4 2.3
4.5 4.8 3.4
3.7 2.3 3.5
4.5 1.3 2.8
Скласти звіт про лабораторну роботу.