Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab8.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
496.64 Кб
Скачать

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. Порядок виконання лабораторної роботи

  1. Створити модуль lin_alg з процедурами та функціями попередніх параграфів.

  2. Записати алгоритм розв’язування задачі мовою 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.

  1. Створити файл вхідних даних, наприклад такий

Файл 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

  1. Скласти звіт про лабораторну роботу.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]