Решение СЛУ методом Дулитла
Вот нашлась программа, подскажите пожалуйста для чего здесь используется массив int ?
Код:
Program laba4;
uses crt;
const N=3;
type typ_matr=array[1..N,1..N] of real;
type typ_mas=array[1..N] of real;
type typ_m=array[1..N] of integer;
var a: typ_matr;
b,a0,x: typ_mas;
int: typ_m;
i,j,p,k: integer;
macheps,s: real;
retcod: byte;
function machineeps: real;
var mach: real;
begin
mach:=1;
while 1+mach>1 do
mach:=mach/2;
machineeps:=mach*2;
end;
procedure vvod_matr(var Z:typ_matr);
begin
writeln;
for i:=1 to N do
for j:=1 to N do
begin
writeln('a[',i,',',j,']');
readln(Z[i][j]);
end;
end;
procedure vvod_mass(var Y:typ_mas);
begin
writeln;
for i:=1 to N do
begin
writeln('b[',i,']');
read(Y[i]);
end;
end;
procedure vivod_matr(var Z:typ_matr);
begin
writeln;
for i:=1 to N do
begin
for j:=1 to N do
begin
write(Z[i][j]);
write('');
end;
writeln;
end;
end;
procedure normmatr(var z0:typ_mas;var Z:typ_matr);
begin
for i:=1 to N do
begin
z0[i]:=Z[1,i];
for j:=2 to N do
if abs(Z[j,i])>z0[i] then z0[i]:=abs(Z[j,i]);
for j:=1 to N do
Z[j,i]:=Z[j,i]/z0[i];
end;
write('matr A!!!:');
vivod_matr(A);
end;
procedure dulitdecomp(var Z:typ_matr;
var z0:typ_mas;
var int:typ_m;
var mach:real;
var ret:byte);
var amax,dd:real;
var imax: integer;
begin
normmatr(z0,z);
for i:=1 to N do
int[i]:=i;
for k:=1 to N do
begin
amax:=abs(Z[int[k],k]);
for i:=k+1 to N do
if abs(Z[int[k],k])>amax then
begin
amax:=abs(Z[int[k],k]);
imax:=i;
end;
if imax<>k then
begin
j:=int[k];
int[k]:=int[imax];
int[imax]:=j;
end;
if abs(Z[int[k],k])<n*mach
then begin
ret:=1; break;
end;
for i:=1 to k do
begin
for j:=1 to k do
begin
A[int[k],i]:=A[int[k],i]-A[int[k],j]*A[int[j],i];
end;
end;
for i:=k+1 to n do
begin
for j:=1 to k-n do
begin
A[int[k],i]:=A[int[k],i]- A[int[k],j]*A[int[j],i];
end;
A[int[k],i]:=A[int[k],i]/A[int[k],k];
end;
end;
end;
procedure dulitslu(var A: typ_matr;
var b:typ_mas;
var int: typ_m;
var x: typ_mas);
begin
for i:=1 to N do
x[i]:=b[i];
for i:=1 to N do
begin
if int[i]<>i
then begin
s:=x[i];
x[i]:=x[int[i]];
x[int[i]]:=s;
end;
end;
for i:=1 to N do
begin
s:=0;
for j:=1 to i-1 do
s:=s+A[i,j]*x[j];
x[i]:=(x[i]-s)/A[i,i];
end;
for i:=N downto 1 do
begin
s:=0;
for j:=i+1 to N do
s:=s+A[i,j]*x[i];
x[i]:=x[i]-s;
end;
for i:=1 to N do
x[i]:=x[i]/a0[i];
end;
{Osnovnaya proga}
begin
clrscr;
retcod:=0;
macheps:=machineeps;
writeln('macheps=',macheps);
vvod_matr(A);
vvod_mass(b);
vivod_matr(A);
for i:=1 to N do
write(b[i],'');
dulitdecomp(A,a0,int,macheps,retcod);
if retcod=0 then
write('Razlozhenie uspechno');
dulitslu(A,b,int,x);
writeln;
writeln('matr A:');
vivod_matr(a);
writeln('MATS A0;');
for i:=1 to n do
begin
write(a0[i]);
write('');
end;
writeln('reshenie x:');
for i:=1 to n do
begin
write(x[i]);
write('');
end;
readkey;
end.
|