3.1. Метод исключения гаусса для систем линейных уравнений

Из курса линейной алгебры [Крылов и др., 1972; Ку­рош, 1962; Фадеев, Фадеева, 1963 и др.] из­­вестно, что ре­ше­ние системы линейных урав­не­ний можно прос­то най­ти по правилу Крамера- че­­рез отношение оп­ре­де­ли­те­лей. Но этот способ не очень удобен для ре­шения сис­тем урав­не­ний с чис­­лом неизвестных > 5, т.е. когда най­ти опре­де­ли­тель сложно, а при чис­­ле не­известных > 10 на­­­хож­де­ние оп­ре­­де­ли­теля с до­ста­точ­но высокой сте­пенью точ­нос­ти ста­но­витсяса­мо­сто­ятельной вы­чис­­ли­тель­­­ной за­дачей. В этих слу­чаях применяют иные методы ре­­­шения, среди ко­то­рых самым рас­про­­стра­нен­нымяв­ля­ет­сяметод Га­ус­са.

Запишем систему линейных уравнений (1.22) в ви­де

(1.24)

Если матрица системы верхняя треугольная, т.е. ее эле­мен­ты ниже главной диагонали рав­ны ну­­лю, то все хjможно найти по­сле­до­ва­тель­но, на­­чиная с хn, по фор­му­ле

. (1.25)

При j > kи аjj 0 этот метод дает возможность най­­ти решение системы.

Метод Гаусса для произвольной системы (1.22) ос­­­но­ван на приведении матрицы А сис­те­мы к верх­­ней или ниж­ней треугольной. Для это­го выч­и­та­ют из второго уравнения системы первое, умно­­­­женное на такое число, при которома21 = 0, т.е. ко­­­эф­фи­ци­ент прих1во второй строке должен быть ра­вен ну­­лю. Затем та­ким же образом ис­­клю­чают по­­сле­до­­ва­­тельноа31 , а41 , ..., аm1 .После за­вер­ше­­ния вы­чис­­ле­ний все эле­мен­тыпервого столбца, кромеа11, бу­­дут равны ну­лю.

Продолжая этот процесс, исключают из мат­ри­­­цы А все коэффициентыаij, лежащие ниже главной ди­а­го­на­ли.

Построим общие формулы этого процесса. Пусть ис­клю­чены коэффициенты изk- 1 столб­ца. Тог­да ниже глав­ной диагонали долж­­­ны остаться урав­не­ния с нену­ле­выми эле­­­ментами:

Умножим k-ю строку на число

и вычтем ее из m-й строки. Первый не­ну­­­левой элемент этой строки обратится в нуль, а ос­­­таль­ные изменятся по формулам

(1.26)

Произведя вычисления по формулам (1.26) при всех ука­занных индексах, исключим эле­мен­ты k-го столб­ца. Та­кое исключение назовемцик­­лом, а вы­­полнение всех цик­лов назовем пря­мым ходомис­ключения.

После выполнения всех циклов получим верх­­нюю тре­угольную матрицу Асистемы (1.24), ко­то­рая легко ре­шается обратным ходом по фор­му­лам (1.25). Если при прямом ходе коэффициентаjjока­зал­ся ра­вен нулю, то пе­ре­ста­нов­кой строк пе­ремеща­ем на глав­ную ди­а­го­наль не­ну­ле­вой эле­мент и про­дол­жа­ем расчет.

Если предположить, что аjj №0, то тогда можно при­ме­­нить подпрограммуgaus,ре­ша­ю­щую сис­те­му изnли­ней­­ных уравнений. Это одна из под­про­грамм, тра­ди­ци­он­но ис­поль­зу­ю­ща­яся в биб­ли­о­теках стандартных про­грамм для ЕС-ЭВМ. Ее пе­ревод на языкPASCALвы­полнен ав­то­ра­ми.

Формальные параметры процедуры.Входные:n(типin­te­ger) - порядок системы;а (типreal) - мас­сив ко­эф­фи­ци­­ентов системы размеромn´n;b(типreal) - массив-стро­­ка свободных чле­нов.Выход­ные:х(типreal) - мас­сив-строка, в который по­ме­ща­ется ре­­шение системы.

procedure gaus (n:integer; a : mas; b : mas1;

var x : mas1);

type mst = array [1..n] of real;

mss = array [1..n] of mst;

var a1 : mss; b1 : mst;

i, j, m, k : integer; h : real;

begin

for i := 1 to n do

begin

b1[i] := b[i];

for j := 1 to n do

a1 [i,j] := a[i,j];

end;

for i := 1 to n-1 do

for j := i+1 to n do

begin

a1[j,i] :=- a1[j,i] / a1[i,i];

for k := i+1 to n do

a1[j,k] := a1 [j,k] + a1[j,i]*a1[i,k];

b1[j] := b1[j] + b1[i]*a1[j,i];

end;

x[n] := b1[n] / a1[n,n];

for i := n-1 downto 1 do

begin

h := b1[i];

for j := i+1 to n do

h := h - x[j]*a1[i,j];

x[i] := h / a1[i,i];

end;

end.

Если контроль за невырожденностью мат­ри­цы Ане­об­ходим, то можно предложить воспользоваться другой про­це­ду­ройgaus1.

В отличие от первой процедуры здесь в вы­ход­ных па­раметрах есть переменная tol, воз­вра­ща­ю­щая 0 при нор­­мальном завершении работы про­це­ду­ры, или 1, ес­ли на главной диагонали один из эле­ментов ра­вен 0, или 2, если матрицаА раз­мер­ностью боль­ше, чем 50´50.

procedure gaus1 (n:integer; a : mas; b : mas1;

var x : mas1; var tol : integer);

type mst = array [1..50] of real;

mss = array [1..50] of mst;

var a1 : mss; b1 : mst;

i, j, m, k : integer; h : real;

begin

for i := 1 to n do

begin

b1[i] := b[i];

for j := 1 to n do a1 [i,j] := a[i,j];

end;

tol := 0;

if n > 50 then

begin

tol := 2;

exit;

end;

for i := 1 to n-1 do

for j := i+1 to n do

begin

if abs(a1[i,i])< 1.0e-10 then

begin

tol := 1;

exit;

end;

a1[j,i] :=- a1[j,i] / a1[i,i];

for k := i+1 to n do

a1[j,k] := a1 [j,k] + a1[j,i]*a1[i,k];

b1[j] := b1[j] + b1[i]*a1[j,i]

end;

if abs(a1[n,n]) < 1.0e-10 then

begin

tol := 1;

exit;

end;

x[n] := b1[n] / a1[n,n];

for i := n-1 downto 1 do

begin

if abs(a1[i,i]) < 1.0e-10 then

begin

tol := 1;

exit;

end;

h := b1[i];

for j := i+1 to n do h := h - x[j]*a1[i,j];

x[i] := h / a1[i,i];

end;

end.

По поводу приведенных ал­го­рит­мов можноска­­зать, что они не самые эф­фек­тив­ные и при­год­ны для ре­ше­ния систем, имеющих невырожденные матрицыАиВс рангом не бо­лее 50, составленные из при­бли­зи­тельно оди­на­ко­вых ко­эф­фи­ци­ентов.Если меж­­ду на­и­большим и на­и­мень­шим из ко­эф­­фи­ци­ен­тов рас­стоя­ние более чем 104, то эти ал­­го­ритмы при­ме­нять не рекомендуется, так как по­греш­ность вы­чис­­ле­ний бу­дет та­­кова, что может ли­бо привести к вы­­рож­ден­ной мат­ри­цеА, ли­бо дать в ре­зультате век­­торХс боль­шой вы­чис­­ли­­тель­ной по­греш­нос­тью.

Для проверки работы процедур ре­шим сис­­тему ли­ней­ных уравнений методом Гаусса с точ­нос­тьюдо 0.0001:

Коэффициенты, промежуточные результаты и око­н­чательное решение приводятся в таб­л. 1.14. Подобные таб­лицы удобно ис­поль­зо­вать для руч­ного счета и про­вер­ки хода ре­ше­ни­я.

Таблица 1.14

Коэффициенты при неизвестных

Cвободные

Cтрочные

x1

x2

x3

x4

члены

суммы

0.68

0.21

0.11

-0.08

0.55

-0.13

0.84

0.15

-0.11

0.27

0.28

0.50

0.88

0.80

-0.06

0.12

2.15

0.44

0.83

1.16

2.85

-0.01

1.44

0.61

1

0.0735

-0.1618

0.1176

3.1618

4.1912

-0.1454

-0.18319

0.15590

0.30398

0.26220

-0.51290

-0.8247

0.0729

-0.1106

-0.22398

-0.48220

1.41290

-0.88015

-0.97847

0.94530

1

-2.09060

5.6719

1.54040

6.1217

-1.47643

-0.18697

4.79139

-0.99480

0.79920

1.17230

4.1136

-0.0095

1

-3.24410

-0.54110

-2.7851

-1.60130

1.07110

-0.5302

1

-0.66890

0.3311

2.8264

-0.3337

-2.7110

-0.6689

: РЕШЕНИЕ

Соседние файлы в папке glava1