на Pascal
мне уже помогли немного,но какието ошибки в обратной матрице,и q матрице в самом алгоритме,вот
Код:
type
TMatrix=array[1..4,1..4] of real;
var
i, j: integer;
a: TMatrix; {матрица коэффициентов}
n,d: integer; {размерность системы}
data_file: text; {файл данных}
b:TMatrix;
c:tMatrix;
k:real;
q,r:tmatrix;
function MultMatrix(var a,b:tmatrix):tmatrix;//функция умножения матриц
var c:tmatrix;i,j:integer;
begin
for i:=1 to 4 do
for j:=1 to 4 do
c[i,j]:=a[i,j]*b[i,j];
multmatrix:=c;
end;
procedure GetMatr(a:tmatrix; var b:tmatrix; n,i,j:integer);
{ Вычеркивание из матрицы строки и столбца }
var ki,kj,di,dj:integer;
begin
di:=0;
for ki:=1 to (n-1) do
begin
if (ki=i) then di:=1;
dj:=0;
for kj:=1 to (n-1) do
begin
if (kj=j) then dj:=1;
b[ki,kj]:=a[ki+di,kj+dj];
end;
end;
end;
Function Determinant(a:TMatrix;n:integer):real;
{ Вычисление определителя матрицы }
var i,j,k:longint;d:real;
b:TMatrix;
begin
d:=0; k:=1;
if (n<1) then
begin
writeln('Determinant: Cann''t run. N=',n); halt;
end;
if (n=1)
then d:=a[1,1]
else if (n=2)
then d:=a[1,1]*a[2,2]-a[2,1]*a[1,2]
else { n>2 }
for i:=1 to n do
begin
GetMatr(a,b,n,i,1);
d:=d+k*a[i,1]*Determinant(b,n-1);
k:=-k;
end;
Determinant:=d;
end;
function inverse(var a:tmatrix):tmatrix;//функция обратной матрицы
var c:tmatrix;i,j:integer;
begin
for i:=1 to 4 do
for j:=1 to 4 do //ищем матрицу алгебраических дополнений
begin
getmatr(a,b,n,i,j);
if ((i+j mod 2)<>0) then c[i,j]:=-1*(determinant(b,n-1))
else c[i,j]:=determinant(b,n-1);
end;
for i:=1 to 4 do
for j:=1 to 4 do //транспонируем матрицу алгебраичесских дополнений
begin
k:=c[i,j];
c[i,j]:=c[j,i];
c[j,i]:=k;
end;
k:=-1;
for i:=1 to 4 do
begin
for j:=1 to 4 do
begin
c[j,i]:=k*c[j,i]/d;
k:=k*-1;
end;
end;
inverse:=c;
end;
procedure QR(const A:TMatrix;var q,r:tmatrix); //функцию qr переделал в процедуру,на выход эти две q и r
var
i,j,k:integer;
E,T:TMatrix;
begin
for i:=1 to N do E[i,i]:=1;
R:=A;
for i:=1 to N do
begin
for j:=1 to N do Q[i,j]:=1;
end;
for k:=1 to N-1 do
begin
for i:=k+1 to N do
begin
T:=E;
if R[i,k]<>0 then
begin
T[k,k]:=R[k,k]/(sqr(R[k,k])+sqr(A[i,k]));
T[i,i]:=T[k,k];
T[k,i]:=R[i,k]/(sqr(R[k,k])+sqr(A[i,k]));
T[i,k]:=T[k,i];
end;
R:=MultMatrix(T,R);
Q:=MultMatrix(T,Q);
end;
end;
q:=Inverse(Q);
end;
begin
assign(data_file, 'a.txt');
reset(data_file);
read(data_file, n);
for i:=1 to n do begin
for j:=1 to n do begin
read(data_file, a[i,j]);
end;
end;
close(data_file);
writeln('matrica');
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j],' ');
writeln;
end;
qr(a,q,r);
writeln('matrica q');
for i:=1 to 4 do
begin
for j:=1 to 4 do
write(q[i,j]:5:3,' ');
writeln;
end;
writeln('matrica r');
for i:=1 to 4 do
begin
for j:=1 to 4 do
write(r[i,j]:5:3,' ');
writeln;
end;
end.