LR-Zerlegung nach Cholesky
Programm zur LR-Dekomposition einer symmetrischen positiv definiten (n x n) Matrix nach Cholesky.
program CholeskyLR(input, output);
{LR-Zerlegung einer symmetrischen positiv definiten Matrix
nach Cholesky}
uses
stdfile;
const
MaxArray = 32; {<= 32767}
var
i, j, k, n: integer;
sum: double;
a: array [0..MaxArray,0..MaxArray] of double;
procedure init;
var
fName: string;
f: text;
t: double;
begin {init}
writeln('Darstellung der LR-Zerlegung einer symmetrischen positiv');
writeln('definiten Matrix nach Cholesky.');
writeln;
writeln('In welcher Datei liegen die Matritzen? (In cholesky.dat liegt ein Beispiel.)');
readln(fName);
if StdOpen(f, fName) then begin
if not StdRead(f, t) then begin
writeln('Konnte die Dimension nicht lesen.');
halt
end; {if}
n := round(t);
if n > MaxArray then begin
writeln('Die Dimension ueberschreitet die vorgegebene Arraygroesse.');
halt
end; {if}
for i:=0 to n-1 do begin
if not StdReadn(f, n, @a[i, 0]) then begin
writeln('Konnte ', i+1, '-te Zeile nicht lesen.');
end; {if}
end; {for}
end else begin {if}
writeln('Die Datei "', fName, '" kann nicht geoeffnet werden.');
end; {if}
end; {init}
procedure result; begin
for i:=0 to n-1 do begin
for j:=0 to i do begin
write(a[i, j]:8:3, ' ')
end; {for}
for j:=i+1 to n-1 do begin
write(0.0:8:3, ' ')
end; {for}
writeln;
end; {for}
end; {result}
begin {Cholesky}
init;
for k:=0 to n-1 do begin
for i:=0 to k-1 do begin
sum := 0.0;
for j:=0 to i-1 do begin
sum := sum + a[i, j]*a[k, j];
end; {for}
a[k, i] := (a[k, i] - sum)/a[i, i];
end; {for}
sum := 0.0;
for j:=0 to k-1 do begin
sum := sum + a[k, j]*a[k, j];
end; {for}
a[k, k] := sqrt(a[k, k] - sum);
end; {for}
result
end. {Cholesky}