Yurij
Вот тебе исходник для вычисления определителя:
Код:
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.
Чуть попозжа напишу решение СЛУ методом Гаусса.
З.Ы. Добавил в код метод Гаусса. Кажись все работает...
|