Witam. Mam spory problem z pewną funkcją. Przyjmuje ona jako parametr macierz, którą następnie musi przekształcić do macierzy górnotrójkątnej U (z zerami na dolnym trójkącie). Przed każdym "zerowaniem" poszczególnych pól musi jednak w każdej iteracji (która de facto zmniejsza macierz do mniejszej: np. z 4x4 na 3x3, potem 2x2) szukać w tej macierzy maksymalnej wartości i ustawiać ją w lewym górnym rogu. Najgorsze jest to, że funkcja zdaje się działać, bo po wypisaniu daje zamierzony efekt. Jednak wyniki dla liczb rzeczywistych odbiegają od zakładanych. Proszę o pomoc.
function macierzU2(n : Integer; macierz : matrix; out zamiana : swaptable; out osobliwa : boolean) : matrix;
var
i, j, k, wiersz, kolumna : Integer;
temp, max : Extended;
a : matrix;
b : vector;
temp2 : Integer;
begin
a := wyciagnijA(n, macierz);
b := wyciagnijB(n, macierz);
setLength(zamiana, n+1);
osobliwa := false;
for i:= 1 to n do
zamiana[i] := i;
for i:=1 to n do
begin
max := a[i,i];
wiersz := i;
kolumna := i;
for j:=i to n do
begin
for k:=i to n do
begin
if abs(a[j,k]) > max then
begin
max := abs(a[j,k]);
wiersz := j;
kolumna := k;
end;
end;
end;
for j:=i+1 to n do
begin
temp := a[i,j];
a[i,j] := a[wiersz,j];
a[wiersz,j] := temp;
end;
for j:=i+1 to n do
begin
temp := a[j,i];
a[j,i] := a[j,kolumna];
a[j,kolumna] := temp;
end;
temp := b[i];
b[i] := b[wiersz];
b[wiersz] := temp;
temp2 := zamiana[i];
zamiana[i] := zamiana[kolumna];
zamiana[kolumna] := temp2;
if a[i,i] = 0 then
begin
osobliwa := true;
end;
if not osobliwa then
begin
for j:=i+1 to n do
begin
temp:=a[j,i]/a[i,i];
for k:=i to n do
begin
a[j,k]:=a[j,k]-temp*a[i,k];
end;
b[j]:=b[j]-temp*b[i];
end;
end;
end;
a := Scal(n,a,b);
Result := a;
end;