program Slau;
uses crt;
const size=30; {максимально допустимая размерность}
type matrix=array [1..size,1..size+1]
of real;
type vector=array [1..size] of real;
function GetNumber (s:string;
a,b:real):real;
{Ввод числа из интервала a,b. Если a=b, то число любое}
var n:real;
begin
repeat
write (s);
{$I-}readln (n);{$I+}
if (IoResult<>0) then
writeln ('Введено не число!')
else if (ab)) then
writeln ('Число не в интервале от ', a,' до ',b)
else break;
until false;
GetNumber:=n;
end;
procedure GetMatrix (n,m:integer;
var a:matrix); {ввод матрицы}
var i,j:integer; si,sj: string [3];
begin
for i:=1 to n do begin
str (i,si);
for j:=1 to m do begin
str (j,sj);
a[i,j]:=GetNumber ('a['+ si+ ','+ sj+']=', 0,0);
end;
end;
end;
procedure GetVector (n:integer; var a:vector); {ввод вектора}
var i:integer; si:string [3];
begin
for i:=1 to n do begin
str (i,si);
a[i]:=GetNumber ('b['+si+']=',0,0);
end;
end;
procedure PutVector (n:integer; var a:vector); {вывод вектора}
var i:integer;
begin
writeln;
for i:=1 to n do writeln (a[i]:10:3);
end;
procedure MV_Mult (n,m:integer; var a:matrix;var x,b:vector);
{умножение матрицы на вектор}
var i,j:integer;
begin
for i:=1 to n do begin
b[i]:=0;
for j:=1 to m do b[i]:=b[i]+a[i,j]*x[j];
end;
end;
function Gauss (n:integer; var a:matrix; var x:vector):boolean;
{метод Гаусса решения СЛАУ}
{a - расширенная матрица системы}
const eps=1e-6; {точность расчетов}
var i,j,k:integer; r,s:real;
begin
for k:=1 to n do begin {перестановка для диагонального преобладания}
s:=a[k,k];
j:=k;
for i:=k+1 to n do begin
r:=a[i,k];
if abs(r)>abs(s) then begin
s:=r;
j:=i;
end;
end;
if abs(s)
Gauss:=false;
exit;
end;
if j<>k then
for i:=k to n+1 do begin
r:=a[k,i];
a[k,i]:=a[j,i];
a[j,i]:=r;
end; {прямой ход метода}
for j:=k+1 to n+1 do a[k,j]:=a[k,j]/s;
for i:=k+1 to n do begin
r:=a[i,k];
for j:=k+1 to n+1 do
a[i,j]:=a[i,j]-a[k,j]*r;
end;
end;
if abs(s)>eps then begin {обратный ход}
for i:=n downto 1 do begin
s:=a[i,n+1];
for j:=i+1 to n do s:=s-a[i,j]*x[j];
x[i]:=s;
end;
Gauss:=true;
end
else Gauss:=false;
end;
var a,a1:matrix;
x,b,b1:vector;
n,i,j:integer;
begin
n:=trunc(GetNumber
('Введите размерность матрицы: ',2,size));
GetMatrix (n,n,a);
writeln ('Ввод правой части:');
GetVector (n,b);
for i:=1 to n do begin
{делаем расширенную матрицу}
for j:=1 to n do a1[i,j]:=a[i,j];
a1[i,n+1]:=b[i];
end;
if Gauss (n,a1,x)=true then begin
write ('Решение:');
PutVector (n,x);
write ('Проверка:');
MV_Mult (n,n,a,x,b1);
PutVector (n,b1);
end
else write ('Решения нет');
reset (input); readln;
end.