Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Обратная матрица помогите дописать


Рекомендуемые сообщения

Есть програма но не как не могу дописать чтобы работала повыбору пользователя:

1 спрашиваетразмерность будущей матрицы

потом спрашивает

ввод в матрицу чисел вручную или автозаполнением.

Пока что работаеттолько автозаполнение и со стандартной матрицей прописаной в const n=5

Помогите плиз.

const n=5;

eps=0.00001; { all numbers less than eps are equal 0 }

type matr=array[1..n,1..n] of real;

var a,b,a0:matr;

i,j,imx,np:integer;

s0,s1:real;

procedure PrintMatr(m,m1:matr;n,nz,nd:integer);

var i,j:integer;

begin

for i:=1 to n do

begin

if (i=1) then write(np:2,':')

else write(' ');

for j:=1 to n do

write(m[i,j]:nz:nd);

for j:=1 to n do

write(m1[i,j]:nz:nd);

writeln;

end;

inc(np);

end;

procedure MultString(var a,b:matr;i1:integer;r:real);

var j:integer;

begin

for j:=1 to n do

begin

a[i1,j]:=a[i1,j]*r;

b[i1,j]:=b[i1,j]*r;

end;

end;

procedure AddStrings(var a,b:matr;i1,i2:integer;r:real);

{ Процедура прибавляет к i1 строке матрицы a i2-ю умноженную на r}

var j:integer;

begin

for j:=1 to n do

begin

a[i1,j]:=a[i1,j]+r*a[i2,j];

b[i1,j]:=b[i1,j]+r*b[i2,j];

end;

end;

procedure MultMatr(a,b:matr;var c:matr);

var i,j,k:byte;

s:real;

begin

for i:=1 to n do

for j:=1 to n do

begin

s:=0;

for k:=1 to n do

s:=s+a[i,k]*b[k,j];

c[i,j]:=s;

end;

end;

function sign(r:real):shortint;

begin

if (r>=0) then sign:=1 else sign:=-1;

end;

begin { начало основной программы }

randomize; { используем автозаполнение матрицы случайными числами }

for i:=1 to n do

begin

for j:=1 to n do

begin

b[i,j]:=0;

a[i,j]:=1.0*random(8)-4;

end;

b[i,i]:=1;

end;

{ отладочные присвоения

a[1,1]:= 3; a[1,2]:=-1; a[1,3]:= 2; a[1,4]:= 0;

a[2,1]:=-2; a[2,2]:= 1; a[2,3]:= 0; a[2,4]:= 5;

a[3,1]:= 1; a[3,2]:= 4; a[3,3]:=-2; a[3,4]:= 2;

a[4,1]:= 0; a[4,2]:=-2; a[4,3]:= 3; a[4,4]:=-4;

a[1,1]:= 5; a[1,2]:= 7; a[1,3]:= 7; a[1,4]:= 1;

a[2,1]:= 6; a[2,2]:= 6; a[2,3]:= 3; a[2,4]:= 4;

a[3,1]:= 5; a[3,2]:= 1; a[3,3]:= 1; a[3,4]:= 1;

a[4,1]:= 3; a[4,2]:= 3; a[4,3]:= 3; a[4,4]:= 3;

}

for i:=1 to n do

for j:=1 to n do

a0[i,j]:=a[i,j];

writeln('Starting matrix:'); np:=0;

PrintMatr(a,b,n,6,1);

for i:=1 to n do

begin

{ К i-той строке прибавляем (или вычитаем) j-тую строку

взятую со знаком i-того элемента j-той строки. Таким образом,

на месте элемента a[i,i] возникает сумма модулей элементов i-того

столбца (ниже i-той строки) взятая со знаком бывшего элемента a[i,i],

равенство нулю которой говорит о несуществовании обратной матрицы }

for j:=i+1 to n do

AddStrings(a,b,i,j,sign(a[i,i])*sign(a[j,i]));

{ PrintMatr(a,b,n,6,1);}

{ Прямой ход }

if (abs(a[i,i])>eps) then

begin

MultString(a,b,i,1/a[i,i]);

for j:=i+1 to n do

AddStrings(a,b,j,i,-a[j,i]);

{ PrintMatr(a,b,n,6,1);}

end

else

begin

writeln('Обратной матрицы не существует.');

halt;

end

end;

{writeln('Обратный ход:');}

if (a[n,n]>eps) then

begin

for i:=n downto 1 do

for j:=1 to i-1 do

begin

AddStrings(a,b,j,i,-a[j,i]);

end;

{ PrintMatr(a,b,n,8,4);}

end

else writeln('Обратной матрицы не существует.');

MultMatr(a0,b,a);

writeln('Начальная матрица, обратная к ней матрица:');

PrintMatr(a0,b,n,7,3);

writeln('Проверка: должна быть единичная матрица.');

PrintMatr(a,a,n,7,3);

{ Выполним еще проверку насколько полученная проверочная матрица

близка к единичной. Сложим отдельно суммы модулей диагональных

и недиагональных элементов. По диагонали должно быть n, а не по

диагонали 0 }

s0:=0; s1:=0;

for i:=1 to n do

for j:=1 to n do

if (i=j) then s1:=s1+abs(a[i,j])

else s0:=s0+abs(a[i,j]);

writeln('Сумма модулей диагональных элементов: ',s1);

writeln('Сумма модулей недиагональных эл-тов : ',s0);

readln

end.

Ссылка на комментарий
Поделиться на другие сайты

Sprite:

спрашиваетразмерность будущей матрицы

потом спрашивает ввод в матрицу чисел вручную или автозаполнением.

type matr=array[1..40,1..40] of real;

var a,b:matr; i,j,m,n:integer;

begin

Write('dimension? '); ReadLn(n);

Write('auto(1/0)? '); ReadLn(m);

randomize;

if m=0 then for i:=1 to n do for j:=1 to n do begin Write(' a[',i:2,',',j:2,']=');ReadLn(a[i,j]) end

else for i:=1 to n do for j:=1 to n do a[i,j]:=random(8)-4;

for i:=1 to n do begin for j:=1 to n do b[i,j]:=0; b[i,i]:=1 end;

....

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Огромное спасибо!

Есть толькомаленький нюанс, автозаполнение работает не корректоно: первые двачисла постоянно 65 тис,

а ручной ввод вроде все отлично.

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...