Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/23: Рейтинг темы: голосов - 23, средняя оценка - 4.87
3 / 3 / 0
Регистрация: 22.02.2009
Сообщений: 13

Составить подпрограмму для получения обратной матрицы

12.04.2009, 21:33. Показов 4514. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем суть проблемы: нарыл эту программку, но она не работает... в самом начале в строке " TMatrix=array [1..MAX,1..MAX] of extended;" выдает: " Ошибка 42: Ошибка в выражении" и курсор перемещает после равно... Пробовал ставить двоеточие заместо равно, но тогда он пишет что "структура слишком большая". В общем помогите пожалуйста исправить ошибку... и самое главное: пожалуйста добавьте комментарии к каждой строчке программы кому не трудно, а то я в паскале не шарю, а рассказывать придется.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
const MAX=100;
TMatrix=array [1..MAX,1..MAX] of extended;
 
procedure Inverse(var A,Result:TMatrix; dim:integer);
var i,j,k:integer;
temp:TMatrix;
value:extended;
begin
 
for i:=1 to dim do
for j:=1 to dim do
begin
temp[i,j]:=A[i,j];
 
if i=j then
Result[i,j]:=1.0
else
Result[i,j]:=0.0;
end;
 
for i:=1 to dim-1 do
begin
value:=temp[i,i];
 
 
for j:=1 to dim do
begin
temp[i,j]:=temp[i,j]/value;
Result[i,j]:=Result[i,j]/value;
end;
 
for j:=i+1 to dim do
begin
value:=temp[j,i];
 
for k:=1 to dim do
begin
temp[j,k]:=temp[j,k]-temp[i,k]*value;
Result[j,k]:=Result[j,k]-Result[i,k]*value;
end;
end;
 
end;
 
value:=temp[dim,dim];
 
for i:=1 to dim do
begin
temp[dim,i]:=temp[dim,i]/value;
Result[dim,i]:=Result[dim,i]/value;
end;
 
for i:=dim downto 2 do
for j:=i-1 downto 1 do
begin
value:=temp[j,i];
 
for k:=1 to dim do
begin
temp[j,k]:=temp[j,k]-temp[i,k]*value;
Result[j,k]:=Result[j,k]-Result[i,k]*value;
end;
end;
 
end;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.04.2009, 21:33
Ответы с готовыми решениями:

Составить процедуру для получения из квадратной матрицы A(n,n), n<=6 матрицы B(n,n-1) путем вычеркивания элементов главной диагонали исходной
Помогите пожалуйста составить процедуру для Паскаля: Составить процедуру для получения из квадратной матрицы A(n,n), n&lt;=6 матрицы...

Составить программу для вычисления обратной матрицы для матрицы А размерностью 5х5
составить программу для вычисления обратной матрицы для матрицы А размерностью 5х5, выводится массив с помощью макросов в Word ...

Алгоритм получения обратной матрицы.
Помогите получить обратную матрицу. Мучаюсь и не как не могу получить :( Навоял вот такой алгоритм но кажется что он врёт... Посчитав в...

15
 Аватар для Gulnaz
5 / 5 / 1
Регистрация: 14.03.2008
Сообщений: 74
12.04.2009, 22:04
Массивы в Паскале объявляются следующим способом:
type
digit = array [0..9]of char;
ты забыл слово type перед TMatrix после объявления константы.
1
3 / 3 / 0
Регистрация: 22.02.2009
Сообщений: 13
13.04.2009, 19:11  [ТС]
Спасибо Gulnaz
Поставил type перед массивом, поменял в 3 и 8 строке extended на real (а то без этого не пахало), но при компилировании пишет "Непредвиденный конец файла". Уже кучу ендов ставил и стирал, чет не помогает... хз че делать... помогите пожалуйста, и еще кому не трудно добавьте плиз комментарии)
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
14.04.2009, 15:54
нарыл эту программку, но она не работает..
Ну, а где сама программа, это же только одна процедура.
0
22 / 22 / 10
Регистрация: 26.02.2009
Сообщений: 49
14.04.2009, 16:23
В прошлом семестре сдавал такую прогу на численных методах.
Вот, немного подправил чисто для получения обратной матрицы:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
const nmax = 20;
 
type matr = array[1..nmax,1..nmax] of real;
 
function Det(size:integer; var m : matr):real;forward;
 
function AlgDop(size:integer;m:matr;row,col:integer):real;
var temp : matr;
    i,j:integer;
begin
for i:=1 to row-1 do begin
  for j:=1 to col-1 do temp[i,j]:=m[i,j];
  for j:=col+1 to size do temp[i,j-1]:=m[i,j];
end;
for i:=row+1 to size do begin
  for j:=1 to col-1 do temp[i-1,j]:=m[i,j];
  for j:=col+1 to size do temp[i-1,j-1]:=m[i,j];
end;
if (row+col) mod 2 = 0 then Result := det(size-1,temp)
else Result := -det(size-1,temp);
end;
 
function Det(size:integer; var m : matr):real;
var i:integer;
    r:real;
begin
if size = 1 then
  result:=m[1,1]
else
if size = 2 then
  result:=(m[1,1]*m[2,2]-m[1,2]*m[2,1])
else begin
  r:=0;
  for i:=1 to size do begin
    r := r + m[1,i]*AlgDop(size,m,1,i);
  end;
  result:=r;
end;
end;
 
procedure ObrMatr(var a:matr;var am:matr;n:integer);
var i,j:integer;
    dt:real;
begin
dt:=det(n,a);
if abs(dt)<1e-15 then begin
  write('Malenkiy opredelitel!');
  exit;
end;
for i:=1 to n do begin
  for j:=1 to n do am[i,j]:=AlgDop(n,a,j,i)/dt;
end;
end;
 
procedure print_matr(n:integer;var a:matr);
var i,j:integer;
begin
writeln;
for i:=1 to n do begin
  for j:=1 to n do write(a[i,j]:7:3);writeln;
end;
end;
 
var a,obr:matr;
    i,j,n:integer;
 
begin
write('Vvedite N: ');
readln(n);
for i:=1 to n do begin
  for j:=1 to n do read(a[i,j]);readln;
end;
ObrMatr(a,obr,n);
print_matr(n,a);
print_matr(n,obr);
readln;
end.
1
3 / 3 / 0
Регистрация: 22.02.2009
Сообщений: 13
25.04.2009, 21:15  [ТС]
Спасибо, Extremall, но она не работает)
Вообщем при компилировании выдает то что result - неизвестный идентификатор.... ну объявил я его в переменных как реал, и при компилировании прога запустилась и пишет:

"Vvedite N"

Ввожу, но ничего не происходит
Помогите кто-нибудь, что надо сделать?
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
25.04.2009, 21:41
Поправил, но вряд ли сдашь, раз такие мелочи сам поправить не мог.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
uses crt;
const nmax = 20;
type
matr = array[1..nmax,1..nmax] of real;
function Det(size:integer; var m : matr):real;forward;
function AlgDop(size:integer;m:matr;row,col:integer):real;
var temp : matr;
    i,j:integer;
begin
for i:=1 to row-1 do
 begin
  for j:=1 to col-1 do temp[i,j]:=m[i,j];
  for j:=col+1 to size do temp[i,j-1]:=m[i,j];
end;
for i:=row+1 to size do
 begin
  for j:=1 to col-1 do temp[i-1,j]:=m[i,j];
  for j:=col+1 to size do temp[i-1,j-1]:=m[i,j];
end;
if (row+col) mod 2 = 0 then AlgDop := det(size-1,temp)
else AlgDop := -det(size-1,temp);
end;
 
function Det(size:integer; var m : matr):real;
var i:integer;
    r:real;
begin
if size = 1 then Det:=m[1,1]
else
if size = 2 then Det:=(m[1,1]*m[2,2]-m[1,2]*m[2,1])
else
 begin
  r:=0;
  for i:=1 to size do begin
    r := r + m[1,i]*AlgDop(size,m,1,i);
  end;
  Det:=r;
end;
end;
 
procedure ObrMatr(a:matr;var am:matr;n:integer);
var i,j:integer;
    dt:real;
begin
dt:=det(n,a);
if abs(dt)<1e-15 then begin
  writeln('Malenkiy opredelitel!');
  exit;
end;
for i:=1 to n do begin
  for j:=1 to n do am[i,j]:=AlgDop(n,a,j,i)/dt;
end;
end;
 
procedure print_matr(n:integer;var a:matr);
var i,j:integer;
begin
for i:=1 to n do
 begin
  for j:=1 to n do
  write(a[i,j]:7:3);
  writeln;
 end;
end;
 
var a,obr:matr;
    i,j,n:integer;
 
begin
clrscr;
write('Vvedite N: ');
readln(n);
writeln('‚ўҐ¤ЁвҐ ',n*n,'elementov matricy:');
for i:=1 to n do
for j:=1 to n do
   begin
    write('a[',i,',',j,']=');
    readln(a[i,j]);
   end;
clrscr;
writeln('Ishodnaya matrica:');
print_matr(n,a);
ObrMatr(a,obr,n);
writeln('Obratnaya matrica:');
print_matr(n,obr);
readln
end.
1
3 / 3 / 0
Регистрация: 22.02.2009
Сообщений: 13
26.04.2009, 14:29  [ТС]
Спасибо, Puporev, прога работает! Кто-нибудь, пожалуйста, может дать вкратце комментарии хотя бы по поводу что делает функция AlgDop, Det, процедура ObrMatr и PrintMatr?
0
22 / 22 / 10
Регистрация: 26.02.2009
Сообщений: 49
26.04.2009, 15:18
ObrMatr - составляет обратную матрицу. Из теории известно, что это транспонированная матрица алгебраических дополнений элементов исходной матрицы, делённая на определитель исходной матрицы.

PrintMatr - печатает матрицу на экран.

AlgDop - вычисление алгебраического дополнения элемента матрицы. В неё передаётся матрица, её размер и координаты нужного элемента.

Det - вычисление определителя матрицы.

Для понимания того, как именно работают эти процедуры, нужно знать теорию. Например - что такое определитель, алгебраическое дополнение, транспонированная матрица и т. п.
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
26.04.2009, 15:27
Короче сюда.
http://www.google.ru/search?q=... 0%E8%F6%E0
0
3 / 3 / 0
Регистрация: 22.02.2009
Сообщений: 13
01.05.2009, 18:57  [ТС]
Блин никак до меня не дойдет кароче.... че там происходит в этих функциях и процедурах... то что они вычисляют определитель и алгебр. доп эт понятно) Пожалуйста кто-нибудь может очень подробно расписать каждый этап проги?

Добавлено через 21 минуту 26 секунд
Блин забыл написать саму прогу)

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
uses crt;
const nmax = 20;
type
matr = array[1..nmax,1..nmax] of real;
function Det(size:integer; var m : matr):real;forward;
function AlgDop(size:integer;m:matr;row,col:integer):real;
var temp : matr;
    i,j:integer;
begin
for i:=1 to row-1 do
 begin
  for j:=1 to col-1 do temp[i,j]:=m[i,j];
  for j:=col+1 to size do temp[i,j-1]:=m[i,j];
end;
for i:=row+1 to size do
 begin
  for j:=1 to col-1 do temp[i-1,j]:=m[i,j];
  for j:=col+1 to size do temp[i-1,j-1]:=m[i,j];
end;
if (row+col) mod 2 = 0 then AlgDop := det(size-1,temp)
else AlgDop := -det(size-1,temp);
end;
 
function Det(size:integer; var m : matr):real;
var i:integer;
    r:real;
begin
if size = 1 then Det:=m[1,1]
else
if size = 2 then Det:=(m[1,1]*m[2,2]-m[1,2]*m[2,1])
else
 begin
  r:=0;
  for i:=1 to size do begin
    r := r + m[1,i]*AlgDop(size,m,1,i);
  end;
  Det:=r;
end;
end;
 
procedure ObrMatr(a:matr;var am:matr;n:integer);
var i,j:integer;
    dt:real;
begin
dt:=det(n,a);
if abs(dt)<1e-15 then begin
  writeln('Malenkiy opredelitel!');
  exit;
end;
for i:=1 to n do begin
  for j:=1 to n do am[i,j]:=AlgDop(n,a,j,i)/dt;
end;
end;
 
procedure print_matr(n:integer;var a:matr);
var i,j:integer;
begin
for i:=1 to n do
 begin
  for j:=1 to n do
  write(a[i,j]:7:3);
  writeln;
 end;
end;
 
var a,obr:matr;
    i,j,n:integer;
 
begin
clrscr;
write('Vvedite N: ');
readln(n);
writeln('Введите ',n*n,'elementov matricy:');
for i:=1 to n do
for j:=1 to n do
   begin
    write('a[',i,',',j,']=');
    readln(a[i,j]);
   end;
clrscr;
writeln('Ishodnaya matrica:');
print_matr(n,a);
ObrMatr(a,obr,n);
writeln('Obratnaya matrica:');
print_matr(n,obr);
readln
end.
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
01.05.2009, 19:21
Если Вы можете все это проделать вручную на бумаге, то должны разобраться и с программой, если не умеете это делать, то никие комментарии Вам не помогут, а переписывать здесь учебник никто не собирается.
Единственно что надо пояснить, поскольку это не так часто встречается в учебных программах, то эту строчку
function Det(size:integer; var m : matr):real;forward;
Это объявление функции, которая будет описана ниже, поскольку она применяется в функции
function AlgDop(size:integer;m:matr;row,col:integer):real;
которая в свою очередь используется в первой функции.
0
3 / 3 / 0
Регистрация: 22.02.2009
Сообщений: 13
04.05.2009, 21:04  [ТС]
Лано я понял... пока сам не разберусь ниче не поможет... скажите хоть тогда что такое row и col в функции AlgDop?
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
04.05.2009, 21:23
что такое row и col
Неужели так трудно догадаться, что это количество строк и столбцов соответствекнно. Что, никогда матрицы не писали?
1
0 / 0 / 0
Регистрация: 10.05.2009
Сообщений: 3
10.05.2009, 10:59
Хотел бы задать вопрос по всем этим замутам с row и col
Мне одному из курса алгебры кажется, что обратной матрицей обладает только квадратная матрица, т.е. row=col=n и всякие
for j:=1 to col-1 do temp[i,j]:=m[i,j];
for j:=col+1 to size do temp[i,j-1]:=m[i,j];

кажутся более чем странными? объясните пожалуйста
0
22 / 22 / 10
Регистрация: 26.02.2009
Сообщений: 49
14.05.2009, 16:04
row и col - это координаты элемента в передаваемой матрице, алгебраическое дополнение которого нужно посчитать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.05.2009, 16:04
Помогаю со студенческими работами здесь

Составить подпрограмму-процедуру для вычисления текущего значения s(x) с произвольным количеством итераций n и подпрограмму-функцию y(x).
помогите пожалуйста с написанием работы Решить задачу, используя подпрограмму-процедуру для вычисления текущего значения s(x) с...

Составить подпрограмму–функцию для нахождения суммы элементов матрицы, расположенных выше главной диагонали
Народ,помогите ,пожалуйста, с программой: Составить подпрограмму–функцию для нахождения суммы эле-ментов квадратной матрицы,...

Составить программу для нахождения сумм элементов каждой строки матрицы, используя подпрограмму-функцию
2. даны действительные матрицы А(15,10) и В(9,7). Составить программу для нахождения сумм элементов каждой строки, используя...

Составить подпрограмму вычисления нормы матрицы
Помогите написать код:

Составить подпрограмму вычисления нормы матрицы
а как решать не знаю:cry: подскажите


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru