Top-office11.ru

IT и мир ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Обратная матрица паскаль

Обратная матрица

Всем привет!
Помогите решить задачку в паскале, пожалуйста!

Дана матрица А, 4×4. Найти обратную матрицу.

26.10.2009, 14:10

Обратная матрица
Знайти обернену матрицю та зробити до неї перевірку(одиничну матрицю). Без процедур.

Обратная матрица
Ребята есть программа нахождения обратной матрицы, как сделать чтобы мы задавали 2 матрицы а не.

Написаь программу, чтобы в ней находилась обратная матрица, определитель и СЛАУ
Написаь программу, чтобы в ней находилась обратная матрица, определитель и СЛАУ (метод Гаусса).

Обратная польская запись
Требуется преобразовать выражение в обратную польскую запись и посчитать. Программа вроде как.

27.10.2009, 12:03227.10.2009, 14:27 [ТС]327.10.2009, 17:474
Pascal
28.10.2009, 11:48 [ТС]5
23.11.2009, 07:206
23.11.2009, 08:217
23.11.2009, 08:298
23.11.2009, 09:409
06.05.2010, 12:0510
06.05.2010, 12:1811

Добавлено через 2 минуты
либо на abc.net запустите либо изменить double на real

06.05.2010, 12:3512

убрал проверку вобще,ошивка типа неверная вещественная операция — получается исходные числа должны быть только вещественные,тоесть реал?

Добавлено через 1 минуту

Добавлено через 2 минуты
либо на abc.net запустите либо изменить double на real

да паскаль абц.
даа,вот это я намудрил мне аж самому смешно

Добавлено через 13 минут
1.74 -0.11 2.85 1.07
1.46 0.19 -2.51 -0.89
-2.93 -0.14 3.81 2.44
2.91 0.06 -3.55 -2.18
0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00..вот получилось что ребят помогите разобраться,я подозреваю это потому что я проверку убрал.

06.05.2010, 12:4813
06.05.2010, 13:0314
06.05.2010, 13:1515
01.06.2010, 20:3316

Всем привет. Нашёл эту тему в поисках кода для матрицы 3х3. Как можно «преобразовать» данный код для общего вида, чтобы получить вычисление обратной матрицы для матрицы размерности 3 на 3?

Или, если не трудно, мог бы кто-нибудь написать код? Для Паскаля.

01.06.2010, 20:4517
Pascal
01.06.2010, 20:5718
01.06.2010, 21:0819

Ну тогда просто делайте все по порядку, но «вручную»,
-находите определитель матрицы
— вспомогательные определители
— алгебраические дополнения
— вычисляйте обратную матрицу

01.06.2010, 21:5620
01.06.2010, 21:56
01.06.2010, 21:56

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

обратная матрица
подскажите пожалуйста алгоритм определения обратной матрицы

Цифры, обратная матрица.
1)Дано число. Опеределить сколько в нем цифр. Исключить из него 0 и 5. 2)Дана матрица А(n n).

Обратная матрица 3-ого порядка
Дана матрица 3-ого порядка, если для этой матрицы существует обратная, то найти её, если не.

Обратная матрица методом Гаусса
Добрый день! Требуется реализовать поиск обратной матрицы путем элементарных преобразований в.

Найти обратную матрицу (Pascal)

Вообщем задача состоит в том, что надо найти обратную матрицу, по следующему алгоритму:
1. Разбиваем матрицу на 2 треугольные
2. Находим обратные матрицы к треугольным и перемножаем их (должны получить обратную матрицу к той что нам дана)
3. Проверка.

Вообщем загвоздка сейчас у меня в следующем: для того чтобы разбить матрицу на треугольные, нада чтобы определитель матрицы не был равен нулю. Так вот, подскажите по какому алгоритму можно найти определитель матрицы (я хотел с алгебраическими дополнениями, но там пальцы сломать можно, и мне сказали что есть другой способ).

13 ответов

Не помню что такое «с алгебраическими дополнениями», но припоминается что можно привести ее к треугольному виду (ето не то что разбить на 2 треугольние, а так чтоб все что под диагоналю было равно 0), а потом перемножыть елементы диагонали.

ЗЫ. ИМХО. А прежний аватар красивее был.

когда я тестирую, вроде все нормально, но когда матрица 2х2 (порядок равен 2), то определитель что-то не считается:confused: не могу найти ошибку, помогите пожалуйста.

(Может не совсем будет роботать потому что я прямо тут и набрал с копипейстом.)

Твоя ошибка в том что после первого ифа надо было остальное в елсе взять. Но ето машинально.
А теперь концептуально. Видиш, у тебя вычисление для н=2 делается два раза (в ифе и после цыкла). Старайся избегать таких ситуаций.

Извени, но помойму я тебе не так подсказал сам метод. Я тут на бумажке пробую и не получается у меня так посчитать. Пошел учить матчасть.

PS Ето у меня руки кривые на бумажке считать, таки правильно сказал. Ложная тривога.
Завтра покажу как без вспомагательной mat11 обойтись. Сегодня не успеваю.

type
Tmatr = array[1..NMAX, 1..NMAX] of real;

const
mat: Tmatr = ((8, 4, 9, 2),
(3, 7, 4, 5),
(3, 6, 9, 8),
(1, 1, 4, 1));

var
mat1: Tmatr;
n, i, j, k, current: integer;
det, buf: real;

BEGIN
mat1 := mat;
n := 4;
det:=1;
current := 1;
while(n > current) do
begin
if mat1[current, current]=0 then
begin
k:=0;
for i:=current to n do
if mat1[i,current] <> 0 then k:=i;
if k=0 then
begin
det:=0;
break;
end;
for j:=current to n do
begin
buf:=mat1[current,j];
mat1[current,j]:=mat1[k,j];
mat1[k,j]:=buf;
end;
det:=(-1)*det;
end;
for i:=current+1 to n do
begin
buf := mat1[i, current] / mat1[current, current];
for j:=current to n do
mat1[i,j]:=mat1[i,j]-buf*mat1[current,j];
end;
current := current + 1;
end;
for i := 1 to n do
det := det * mat1[i,i];
for i := 1 to n do
begin
for j := 1 to n do
write(mat1[i,j]:10:3, ‘, ‘);
writeln;
end;
writeln(‘det=’,det:8:3);
end.

Диагональ не сводится к единичной, а остается как есть. При обработке матрицы меняется только знак дискриминаннта или он устанавливается в 0. Потом в конце бежым по диагонале.

Замечание тебе
1.

Условие лутше ставить перед обменом местами строк. Кроме того при к=0 нужно прекращать приведение матрицы, а тто потом сразу деление на 0 вылезет.

2. В паскале можно переприсвоить масив полностю, а не поелементно. Но для етого надо чтоб они были одного типа. Тоесть примерно так.

type
Tmatr = array[1..NMAX, 1..NMAX] of real;

const
mat: Tmatr = ((8, 4, 9, 2),
(3, 7, 4, 5),
(3, 6, 9, 8),
(1, 1, 4, 1));

3. Не обязательно роботать через елемент [1,1]. Сделaл через current. Так у тебя остается неиспорченая матрица. (Выводится в конце).

4. Можно убрать вспомагательную матрицу и делать все на одной.

5. Убрал проверку на розмер матрицы ровный 2. Ето конечно лишняя итерацыя цыкла, но мое мнение что надо стараться делать код более универсальным. Тоесть чтоб он обрабатывал любые входные данные одинаково. Так снижается вероятность ошибок. В етом ты уже сам убедился. 🙂

6. Основное замечание. Индексируй масивы с нуля. Ето секономит тебе кучу времени и нервов когда начнеш писать на Си подобных языках.

Надеюсь мой код будет тебе полезным.

procedure output_matrix(n:integer;mat:mat1);<Вывод матрицы>
var i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to n do
begin
write(mat[i,j]:5:5);
write(‘ ‘);
end;
writeln;
end;
writeln;
end;

procedure bermuda(var nt,vt,d:mat1; n:integer);<Разбиение матрицы на 2 треугольные>
var i,j,k:integer;
s:real;
begin
for i:=1 to n do
begin
nt[i,1]:=d[i,1];
vt[i,1]:=0;
end;
for j:=1 to n do
begin
vt[1,j]:=d[1,j]/nt[1,1];
if j>1 then nt[1,j]:=0;
end;
for i:=2 to n do
for j:=2 to n do
begin
if i>=j then
begin
s:=0;
for k:=1 to j-1 do
s:=s+nt[i,k]*vt[k,j];
nt[i,j]:=d[i,j]-s;
vt[i,j]:=0;
if i=j then vt[i,j]:=1;
end
else
begin
s:=0;
for k:=1 to i-1 do
s:=s+nt[i,k]*vt[k,j];
vt[i,j]:=(d[i,j]-s)/nt[i,i];
nt[i,j]:=0;
end;
end;
end;

procedure ont(n:integer; var mat,obnt:mat1);<нахождение обратной нижней треугольной матрицы>
var i,j,a:integer;
s:real;
begin
for i:=1 to n do
begin
for j:=1 to n do
begin
if i=j then obnt[i,j]:=1/mat[i,j];
if i j then
begin
s:=0;
for a:=j to i-1 do
begin
s:=s+mat[i,a]*obnt[a,j];
obnt[i,j]:=-1*s/mat[i,i];
end;
end;
end;
end;
end;

procedure ovt(n:integer; var mat,obvt:mat1);<нахождение обратной верхней треугольной матрицы>
var i,j,a:integer;
s:real;
begin
for i:=n downto 1 do
begin
for j:=1 to n do
begin
if i>=j then obvt[i,j]:=mat[i,j];
if j=i+1 then obvt[i,j]:=-mat[i,j];
if j>i+1 then
begin
s:=0;
for a:=i+1 to j-1 do
begin
s:=s+mat[i,a]*obvt[a,j];
obvt[i,j]:=-1*(mat[i,j]+s);
end;
end;
end;
end;
end;

procedure multi_matrix(n:integer; m1,m2:mat1; var mm:mat1);<произведение матриц>
var i,j,a:integer;
x:real;
begin
for i:=1 to n do
for j:=1 to n do
begin
x:=0;
for a:=1 to n do x:=x+m1[i,a]*m2[a,j];
mm[i,j]:=x;
end;
end;
end.

Конечно код не маленький, но кому не трудно просмотрите пожалуйста. При тестировании он для всех матриц работает нормально, кроме тех в которых самый первый элемент (т.е. с индексом [1,1]) равен нулю, для них не считает:(
Пытаюсь найти сам, но что-то не получается (это как с русским языком, свои ошибки сразу не находишь, надо отвлечся, а на сежий глаз легче увидеть, особенно если она какая-нить глупая)

Turbo Pascal Examples

Пример десятый. Нахождение обратной матрицы.

В первой программе используется псевдо-метод Гаусса. Известно, что если к матрице приписать справа единичную матрицу, а затем с помощью линейных преобразований привести левую матрицу к единичной, проводя те же преобразования над правой (изначально единичной) матрицей, то на ее месте образуется матрица, обратная к исходной. К линейным преобразованиям относятся прибавление одной строки, умноженной на произвольный коэффициент, к другой. Решение можно разбить на два этапа: «прямой» и «обратный» ход.
Есть исходная матрица, приписываем к ней единичную:
а[1,1], а[1,2], . а[1,n]; 1, 0, . 0;
а[2,1], а[2,2], . а[2,n]; 0, 1, . 0;
.
а[n,1], а[n,2], . а[n,n]; 0, 0, . 1;
Во время «прямого» хода необходимо добиться нулей под главной диаганалью левой матрицы. Берем первую строку и делим ее на а[1,1]. Теперь на месте а[1,1] стоит 1. Вычитаем из второй строки первую умноженную на а[2,1] — на месте этого эл-та образуется ноль. Аналогично для всех строк до n-ной. Теперь в первом столбце матрицы ниже единицы стоят нули.
Переходим ко второй строке и для всех строк ниже второй повторям описанную процедуру. Теперь ниже диагонали и во второй строке нули. Так продолжаем до (n-1)-ой строки. Для n-ной строки достаточно разделить ее на а[n,n]. Матрица а приведена к верхней треугольной. На месте единичной образовалась некая матрица.
Примечание 1. Если на месте диагонального элемента левой матрицы образуется число близкое к нулю, то деление на малое число приведет к значительной погрешности вычисления. Поэтому необходимо, чтобы это число было «далеко» от нуля. С этой целью предпринимается следующий шаг: перед тем, как разделить строку на этот элемент, прибавим к строке все нижележащие строки (умноженные на -1 если в этом столбце стоит отрицательный элемент).
Обратный ход. Здесь сначала добвиваемся нулей в последнем столбце матрицы а. Для этого из каждой строки (i) выше n-ной вычитаем n-ную умноженную на а[i,n]. Затем добиваемся нулей в (n-1)-ом столбце и так далее до второго столбца.
Все. Теперь слева имеем единичную матрицу, а справа, на месте единичной — искомая обратная матрица. Для проверки перемножим ее на начальную — должна получиться единичная.

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;

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);
end.

Примечание 2. При решении систем линейных уравнений методом Гаусса используют так называемый метод «выбора ведущего элемента». Необходимость его обусловлена теми же причинами, что описаны в Примечании 1 — близостью к нулю одного из диагональных элементов. Только если в вышеизложенном примере использовалось прибавление к строке «нижнележащих» строк, то выбор ведущего элемента подразумевает перестановку строк в матрице таким образом, чтобы на месте диагонального элемента была строка с максимальным по модулю значением. На практике при решении систем линейных уравнений эта операция означает лишь перестановку уравнений в системе и не влияет на решение. Однако при нахождении обратной матрицы, казалось бы, так поступать нельзя — ведь будет изменен порядок следования строк. Тогда в конце нужно вернуть первоначальный порядок и все должно быть нормально. Практика показала, что это не совсем так. Первоначально когда писалась программа, порядок строк не восстанавливался. Проверка показала, что искомая матрица найдена. Попытки привести строки матрицы в первоначальный порядок, привели к неправильному решению. А вот если порядок не восстанавливать, то решение оказывается правильным. Может кто-нибудь объяснит, почему так происходит?

const n=4;
eps=0.00001; < all numbers less than eps are equal 0 >
type matr=array[1..n,1..n] of real;
vect=array[1..n] of byte;
var a,b,a0:matr;
v:vect;
i,j,imx,np:integer;
max_v,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(v[i]:nz);
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;
procedure SwapRows(var a,b:matr;var v:vect;n,imx,i:integer);
var j,ti:byte;
tr:real;
begin
for j:=1 to n do
begin
tr:=a[imx,j]; a[imx,j]:=a[i,j]; a[i,j]:=tr;
tr:=b[imx,j]; b[imx,j]:=b[i,j]; b[i,j]:=tr;
end;
ti:=v[imx]; v[imx]:=v[i]; v[i]:=ti;
end;
begin
randomize;
for i:=1 to n do
begin
for j:=1 to n do
begin
b[i,j]:=0;
a[i,j]:=random(8);
end;
b[i,i]:=1;
v[i]:=i;
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
< Выбор ведущего элемента >
imx:=i; max_v:=abs(a[imx,i]);
for j:=i+1 to n do
if (abs(a[j,i])>max_v) then
begin
max_v:=abs(a[j,i]);
imx:=j;
end;
< PrintMatr(a,b,n,6,1);>
if (imx<>i) then
SwapRows(a,b,v,n,imx,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;
end;
writeln(‘Returning move:’);
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(‘Matrix doesn»t exists.’);
< return rows order >
if (v[i]<>i) then
SwapRows(a,b,v,n,v[i],i);>
MultMatr(a0,b,a);
writeln(‘Starting matrix, result:’);
PrintMatr(a0,b,n,8,4);
writeln(‘check:’);
PrintMatr(a,a,n,8,5);
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(‘Diagonal summ:’,s1,’ Not diagonal summ:’,s0);
end.

Обратная матрица паскаль

‘ w /> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется .
2. Все тексты программ должны помещаться в теги [code=pas] . [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. «FAQ«, если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение — только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы — на PM!
6. Одна тема — один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме.
8. Спрашивайте и отвечайте четко и по существу.

Группа: Пользователи
Сообщений: 5
Пол: Женский

Репутация:

написала программу, которая виполняет операции над матрицами и почему то обратную матрицу находит неверно. помогите найти ошыбку. вот процедурки для вычисления:


Ето вывод в case:
2

Если нужно, могу скинуть весь исходник.

Сообщение отредактировано: Lapp — 23.03.2011 15:08

Даа. bembi, ты просто гигант мысли. В ТАКОМ разобраться — это надо самому быть компьютером..

Но все же потребуется все целиком. Я причесал, отформатировал, конечно, но догадываться, какие у тебя там типы — извини, большого желания нет.

Мне хватило этой строчки.

for j:=1 to ng do write(x[i,j]:8:2); writeln; end;

где тот бегин, к которому относится этот енд? Я когда так пишу в 1 строчку, то бегин и енд на одной строке.

Уникум

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: 159

Злостный любитель

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: 62

Неправда. Все верно находит. Проверил на матрице

при ng = 3, в результате после вызова inversm матрица Y приняла вид:

, что полностью соответствует истине. А уж что ты потом делаешь с матрицей, что ты там вычисляешь в Z — это к делу не относится. Как я уже сказал, сама процедура инвертирования работает правильно.

P.S. Все-таки, третий параметр inversm неплохо было бы описать как Var, чтоб в случае ошибки это можно было определить снаружи, в основной программе.

Группа: Пользователи
Сообщений: 5
Пол: Женский

Репутация:

Убрал исходник под спойлер, там все-таки 750 строк.

Сообщение отредактировано: volvo — 27.03.2011 7:46

Ты не хочешь меня слушать? Я ж говорю: матрица вычисляется правильно. То есть, (см. на строки 365-370)

Пионер

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация:

Очень необходима помощь! Помогите найти ошибку в этой программе, второй день найти не могу:

Определитель вычисляет правильно, а вот обратную матрицу нет .
Когда вводишь матрицу:
1 2
3 4

Выводится:
-0,5 0,5
0,5 -0,5

А должно быть:
-2 1
1.5 -0.5
Что и где пропущено?

Сообщение отредактировано: Shmaniche — 10.04.2013 13:22

Читать еще:  Php отправка письма с вложением
Ссылка на основную публикацию
Adblock
detector