Практикум Павлодар (075. 8) Ббк-32. 98-02я73 с д 72. Т. Дүзелбаев, Т. С. Сабыров



бет119/145
Дата31.01.2018
өлшемі16,08 Mb.
#36526
түріПрактикум
1   ...   115   116   117   118   119   120   121   122   ...   145
1 ескерту. Есептеу алгоритмінде шартының орындалуын талап еттік. Егер ол шарт орындалмаса, онда теңдеулердің орындарын алмастыру арқылы диагоналдық элементтің нөлден ерекше болуын қадағалау қажет. Ондай жағдай алгоритмнің программалық орындалуында ескерілуі қажет.

Есепті шешу алгоритмінде сандарды бөлу амалы өте көп орындалады. Соның нәтижесінде машиналық қателіктер жинақтала бастайды. Ондай қателіктерді кеміту үшін Гаустың бас элементті таңдау әдісі қолданылады. Ол әдістің мағынасы төмендегіше:



- матрицаның орналасқан бірінші тік жолдағы элеметтерінің арасынан абсолют шамасы ең үлкенін анықтап, сол элемент жатқан жатық жолды бірінші жатық жолмен ауыстырамыз; сонан соң Гаусс процесінің бірінші кезеңін атқарамыз; нәтижеде А(1) матрицаны аламыз.

- А(1) матрицаның екінші тік жолын қарастырамыз; элементтен төмен жатқандарының арасынан абсолют шамасы ең үлкенін анықтап, сол жатқан жатық жолды екінші жатық жолмен ауыстырамыз; сонан соң Гаусс процесінің екінші кезеңін атқарамыз; нәтижеде А(2) матирцаны аламыз.

- А(2) матрица үшін жоғарыдағы процесті қайталаймыз.

Егер осы әдіс Гаусс алгоритмінің программалық орындалуында ескерілсе, онда жуық шешімнің дәлділігі арта түседі.



2 ескерту. Егер жүйенің реті , ал матрица элементтерінің арасында нөл саны сирек кездессе (ондай матрицаларды тығыз матрицалар деп атайды) онда СТЖ жуықтап шешуге Гаусс алгоритмі тиімді. Бұл жағдайда орындалатын арифметикалық опреациялардың саны (2/3)n3 шамадан аспайды.

3 ескерту. Егер жүйенің реті , немесе, жүйе матрицасында нөл саны көп болса (ондай матрицаларды жұпыны матрицалар деп атайды) онда СТЖ шешуге басқа әдісті, мәселен Зейдель-Гаусс әдісін қолданған жөн.
2 Гаустың бас элементті таңдау әдісінің

программалық листингі
program gauss;

uses crt;

var a:array [1..10,1..10] of real;

b:array [1..10] of real;

c:array [1..10,1..10] of real;

x:array [1..10] of real;

i1,j1,k,i,j,n:integer;

s,c1:real;

Label 1,2,3,4,5,6,7,8;

BEGIN


window(1,1,80,25);textbackground(0);clrscr;

writeln('*****************************************************');

writeln('* *');

writeln('* Данной программой решается *');

writeln('* система линейных алгебраических уравнений *');

writeln('* методом Гаусса с выбором главного элемент *');

writeln('* *');

writeln('****************************************************');

writeln;

writeln('Введите число уравнении n');

readln(n);

writeln('Введите по строчно коэффициентов при нейзвестных');

for i:=1 to n do

begin


for j:=1 to n do

begin


writeln('a[',i,j,']');

read(a[i,j]);

end;

end;


writeln('Введите по элементно свободные члены системы');

for i:=1 to n do

begin

writeln('b[',i,']’);



read(b[i]);

end;


{*********** Прямой ход решения задачи *******}

k:=1;


1: i:=k+1;

if a[k,k]<>0 then goto 3;

2: i1:=k+1;

if a[i1,k]=0 then goto 2; j1:=i1;

For j:=1 to n do

begin


c[k,j]:=a[k,j];

a[k,j]:=a[j1,j];

a[j1,j]:=c[k,j];

end;


3: c1:=a[i,k]/a[k,k];

a[i,k]:=0;

j:=k+1;

4: a[i,j]:=a[i,j]-c1*a[k,j];



if j

begin


j:=j+1; goto 4;

end;


b[i]:=b[i]-c1*b[k];

if i

begin

i:=i+1; goto 3;



end;

if k

begin

k:=k+1; goto 1;



end;

{*********** Обратный ход решения задачи ************}

x[n]:=b[n]/a[n,n];

i:=n-1;


5: j:=i+1; s:=0;

6: s:=s+a[i,j]*x[j];

if j

begin


j:=j+1; goto 6;

end;


x[i]:=(b[i]-s)/a[i,i];

if i>1 then

begin

i:=i-1; goto 5;



end;

writeln(' Решения системы ');

for i:=1 to n do

writeln('x[',i,']=',x[i]:7:4);



readln

end.




Достарыңызбен бөлісу:
1   ...   115   116   117   118   119   120   121   122   ...   145




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет