Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаба №1Выч. мЕтоды.doc
Скачиваний:
1
Добавлен:
13.11.2019
Размер:
130.56 Кб
Скачать

4. Схема программы

Схема основной программы.

А b – матрица коэффициентов

и вектор правых частей размером n

Вычисление:

- определителя;

- матриц L и U.

Формирование:

- массива перестановок;

- ifsolve: true – если LU-разложение выполнено успешно,

false – в противном случае.

Ly=Prb

Ux=y

x= Pcz

Схема процедуры Decomp.

true


,

,





false


false



true


Схема процедуры Solve

Формирование вектора x=Pcz

Решение уравнения Uz=y

Решение уравнения L=yb'


Перестановка элементов вектора b (формирование Prb)

Y=b


5.Текст программы

program lab1;

type rmatr=array[1..4,1..4] of real;

vector=array[1..4] of integer;

vector1=array[1..4] of real;

var

F:text;

eps,det:real;

a:rmatr;

ip,jp:vector;

b,y:vector1;

i,k,n,j,p:integer;

ifsolve:boolean;

filename,s:string[20];

procedure DECOMP (n:integer; var a:rmatr; var ip,jp:vector;var eps,det:real; var ifsolve: boolean);

label 10;

var i,j,k,km,ipm,jpm:integer;

s,norm,am:real;

begin

ifsolve:=true;

det:=1.0;

for i:=1 to n do

begin

ip[i]:=i;

jp[i]:=i

end;

norm:=0.0;

for i:=1 to n do

begin

s:=0.0;

for j:=1 to n do

s:=s+abs(a[i,j]);

if norm<s then norm:=s

end;

eps:=eps*norm;

for k:=1 to n-1 do

begin

am:=abs(a[k,k]);

ipm:=k;

jpm:=k;

for i:=k to n do

for j:=k to n do

if abs(a[i,j]) > am then

begin

am:=abs(a[i,j]);

ipm:=i;

jpm:=j

end;

if ipm<>k then

begin

det:=-det;

for j:=1 to n do

begin

am:=a[k,j];

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

a[ipm,j]:=am

end;

km:=ip[k];

ip[k]:=ip[ipm];

ip[ipm]:=km

end;

if jpm<>k

then

begin

det:=-det;

for i:=1 to n do

begin

am:=a[i,k];

a[i,k]:=a[i,jpm];

a[i,jpm]:=am

end;

km:=jp[k];

jp[k]:=jp[jpm];

jp[jpm]:=km

end;

if abs(a[k,k]) >= eps then

for i:=k+1 to n do

begin

am:=a[i,k]/a[k,k];

a[i,k]:=am;

for j:=k+1 to n do

a[i,j]:=a[i,j]-am*a[k,j]

end

else

begin

ifsolve:=false;

goto 10

end;

end;

10: if (ifsolve and (abs(a[n,n]) >= eps)) then

begin

for k:=1 to n do

det:=det*a[k,k];

end

else

begin

det:=0.0;

ifsolve:=false

end

end;

Procedure SOLVE(n:integer;var a:rmatr;var ip,jp:vector;var b:vector1);

var

x,y:vector1;

i,j:integer;

s:real;

begin

for i:=1 to n do

y[i]:=b[ip[i]];

for i:=2 to n do

begin

s:=y[i];

for j:=1 to i-1 do

s:=s-a[i,j]*y[j];

y[i]:=s;

end;

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

for i:=n-1 downto 1 do

begin

s:=y[i];

for j:=i+1 to n do

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

x[i]:=s/a[i,i];

end;

for j:=1 to n do

b[jp[j]]:=x[j];

x:=b;

end;

begin

writeln('1 zadat matricu vruchnuyu');

readln(p);

if p=1 then

begin

write('Vvedite razmernoct matrici:');

readln(n);

writeln('Vvedite elementi matrici:');

for i:=1 to n do

for j:=1 to n do

begin

write('a[',i,j,']=');

read(a[i,j])

end;

writeln('Vvedite vektor b');

for i:=1 to n do

readln(b[i]);

end;

for i:=1 to n do

begin

for j:=1 to n do

write(' a[',i,j,']=',a[i,j]:7:4);

writeln;

end;

write('Vvedite eps: eps= ');readln(eps);

decomp(n,a,ip,jp,eps,det,ifsolve);

if ifsolve=true then

begin

solve(n,a,ip,jp,b);

for i:=1 to n do

begin

for j:=1 to n do

write(' d[',i,j,']=',a[i,j]:7:4);

writeln;

end;

writeln('Vector rewenii ');

for i:=1 to 4 do

writeln('x= ',b[i]);

writeln('det=',det);

writeln('eps=',eps);

end else

begin

writeln;

writeln(' Error: nedopystimoe yslovie (norm>eps) ');

end;

end.