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

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;

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