кто может помочь с написанием онного алгоритма любым методом на делфи?
буду благодарен)
uses
crt;
const
n = 2;
type
vector = array [1..32] of real;
matrix = array [1..32] of vector;
var
a: matrix;
b, c: vector;
i, j: byte;
p: boolean;
res: real;
procedure Determinant (x: matrix; size: byte; var Result: real);
var
y: vector;
i, j, k: byte;
p: real;
begin
Result := 0;
for i := 1 to size do y[i] := 1;
for i := 1 to pred (n) do begin
if x[i, i] = 0 then begin
k := succ (i);
while (k <= size) and (x[k, i] = 0) do inc (k);
if x[k, i] = 0 then exit;
p := y[i]; y[i] := y[k]; y[k] := p; y[i] := -y[i];
for j := i to size do begin
p := x[i, j]; x[i, j] := x[k, j]; x[k, j] := p;
end;
end;
p := x[i, i]; y[i] := y[i] * p;
for j := i to size do x[i, j] := x[i, j] / p;
for k := succ (i) to size do begin
p := x[k, i];
for j := i to size do x[k, j] := x[k, j] - p * x[i, j];
end;
end;
Result := x[size, size];
for i := 1 to pred (size) do Result := Result * y[i];
end;
procedure Gauss (x: matrix; y: vector; size: byte; var Result: vector; var isResult: boolean);
var
i, j, k: byte;
p: real;
begin
isResult := False;
for i := 1 to size do Result[i] := 0;
for i := 1 to pred (n) do begin
if x[i, i] = 0 then begin
k := succ (i);
while (k <= size) and (x[k, i] = 0) do inc (k);
if x[k, i] <> 0 then begin
p := y[i]; y[i] := y[k]; y[k] := p;
for j := i to size do begin
p := x[i, j]; x[i, j] := x[k, j]; x[k, j] := p;
end;
end;
end;
if x[i, i] <> 0 then begin
p := x[i, i]; y[i] := y[i] / p;
for j := i to size do x[i, j] := x[i, j] / p;
for k := succ (i) to size do begin
p := x[k, i]; y[k] := y[k] - p * y[i];
for j := i to size do x[k, j] := x[k, j] - p * x[i, j];
end;
end;
end;
if (x[size, size] = 0) and (y[size] <> 0) then exit;
if x[size, size] = 0 then Result[size] := 0
else Result[size] := y[size] / x[size, size];
for i := pred (size) downto 1 do begin
Result[i] := y[i];
for j := succ (i) to size do
Result[i] := Result[i] - x[i, j] * Result[j];
end;
isResult := True;
end;
begin
clrscr;
randomize;
writeln ('start matrix:');
for i := 1 to n do begin
for j := 1 to n do begin
a[i, j] := random(10);
write (a[i, j]:8:2);
end;
b[i] := random(10);
writeln (' | ', b[i]:8:2);
end;
Determinant (a, n, res);
writeln ('determinant = ', res:8:2);
Gauss (a, b, n, c, p);
if not p then writeln ('net reshenija') else begin
for i := 1 to n do writeln ('x[', i:2, '] = ', c[i]:8:2);
end;
readkey;
end.
но тест проходит на матрице 2х2
и рекурсивно крутим (*только вначале крутим)
Гм...
const
n = 2;
{Вычисление детерминанта (определителя) матрицы
приведением к диагональному виду.
}
program denominator;
uses crt;
const
MaxN=3;
epsilon=1E-10;
type
matrix=array[1..maxN,1..maxN] of Real;
var
a: matrix;
i,j: integer;
determ:real;
function det(a:matrix;n:integer):real;
var i,j,k:integer; d:real;
begin
for i:=1 to pred(n) do begin
if abs(a[i,i])<epsilon then begin
det:=0.0; exit
end;
for j:=succ(i) to n do begin
d:=a[j,i]/a[i,i];
for k:=i to n do
a[j,k]:=a[j,k]-d*a[i,k];
end;
end;
d:=1.0;
for i:=1 to n do d:=d*a[i,i];
det:=d;
end;
begin
for i:=1 to MaxN do
for j:=1 to MaxN do read(a[i,j]);
determ:=det(a,3);
WriteLn(determ:0:0);
readkey
end.