Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 03.11.2018
Сообщений: 3
1

Обращение матрицы, Паскаль. Кто может разъяснить готовую прогу?

26.11.2018, 17:28. Показов 913. Ответов 7

Может кто-нибудь помочь с готовой программой разобраться? Знаю, что это обращение матрицы по теореме Гаусса-Жордана, но как конкретно здесь что означает никак не могу понять.
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
88
89
uses crt;
const nmax = 10;
var A:array[1..nmax,1..nmax] of real;
P:array[1..nmax] of integer;
i,j,k,b,n,t:integer;
e,s:real;
label 1,2,3,4,vyh;
Begin
writeln('программа обращения матрицы методом Гаусса-Жордана');
writeln;
write('введите размерность матрицы А: n=');
readln(n);
writeln('ввод матрицы А:');
for i:=1 to n do
for j:=1 to n do
Begin
write('введите A[',i,',',j,']=');
readln(A[i,j]);
end;
for i :=1 to n do P[i]:=i;
for k:=1 to n do
Begin
e:=0;
b:=0;
for i:=k to n do
if e<abs(A[i,k])then
Begin
e:=abs(A[i,k]);
b:=i
end;
if e=0 then
Begin
writeln('матрица вырождена');
goto vyh;
end;
if k<b then
Begin
for j:=1 to n do
Begin
s:=A[k,j];
A[k,j]:=A[b,j];
A[b,j]:=s
end;
t:=P[k];
P[k]:=P[b];
P[b]:=t;
end;
A[k,k]:=1/A[k,k];
for j:=1 to n do
Begin
if j=k then goto 2;
s:=A[k,j]*A[k,k];
for i:=1 to n do
Begin
if i=k then goto 1;
A[i,j]:=A[i,j]-A[i,k]*s;
1: end;
A[k,j]:=s;
2: end;
for i:=1 to n do
Begin
if i=k then goto 3;
A[i,k]:=-A[i,k]*A[k,k];
3: end;
end;
for k:=1 to n do
4: if k<P[k] then
Begin
i:=P[k];
for j:=1 to n do
Begin
s:=A[j,k];
A[j,k]:=A[j,i];
A[j,i]:=s 
end;
t:=P[i];
P[i]:=P[k];
P[k]:=t;
goto 4;
end;
writeln;
writeln(' О Б Р А Т Н А Я М А Т Р И Ц А');
for i:=1 to n do
Begin
writeln;
for j:=1 to n do write(A[i,j]:10:5)
end;
vyh:readln;
end.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2018, 17:28
Ответы с готовыми решениями:

Кто может разъяснить списки?
Не контейнеры, а которые делаются без них. Классами или структурами. Бьюсь, бьюсь, немного понимаю,...

Может кто разъяснить как выполнить?
Напишите программу, рассчитывающую сумму денег, которые вы получи- те при вложении начальной суммы...

Может кто разъяснить принцип работы со списками через паленомы?
Примерный смысл программы такой: Имеется список коэффициентов и степеней паленома. Ввести число X...

Статическая линковка Qt 5.02. P.S.: Может кто выложит уже готовую под WinXP 32x MinGW?
Привет! В описание версии 5.02 сказано, что теперь статическая линковка работает корректно :) . Это...

7
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5728 / 3437 / 2442
Регистрация: 22.11.2013
Сообщений: 9,653
Записей в блоге: 1
27.11.2018, 08:34 2
Если над единичной матрицей проделать те же преобразования, что приводят основную к единичной, то на месте единичной получим обратную матрицу.
Возможно вот это окажется намного понятнее:
https://www.cyberforum.ru/post12958546.html
1
0 / 0 / 0
Регистрация: 19.10.2018
Сообщений: 7
27.11.2018, 10:40 3
bormant, спасибо, но преподавателю уже показали именно эту программу и блок схему по этой программ, поэтому нужно разобраться именно с этой. Мы сейчас смотрели, тут есть какой то вектор p, хотя я думал что здесь как раз должна быть единичная матрица, но её судя по нашей программе нет, а обратная матрица получается на месте исходной матрицы в какой то момент (не понятно опять же в какой)
В общем единичный матрицы тут нет, зато есть вектор p который принимает последовательно значения 1 2 3 и до размерности
В общем не понятно вообще ничего, как будто здесь не теорема гаусса жордана вообще
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5728 / 3437 / 2442
Регистрация: 22.11.2013
Сообщений: 9,653
Записей в блоге: 1
27.11.2018, 12:35 4
Цитата Сообщение от Neprogramist11 Посмотреть сообщение
как будто здесь не теорема гаусса жордана вообще
Отличное наблюдение.
Достаточно умножить "обратную" матрицу на исходную (неважно, слева или справа) и проверить, получилась ли единичная.
Возьмем матрицу из упомянутой выше темы, про нее точно известно, что она невырожденная:
Pascal
1
2
3
4
5
6
7
8
9
10
11
const nmax = 5;
type TMatrix = array [1..nmax,1..nmax] of Real;
const
  a: TMatrix = (
    (2, 3, 4, 5, 8),
    (0, 5, 9, 5, 7),
    (0, 0, 4, 2, 2),
    (0, 0, 0, 5, 1),
    (0, 0, 0, 0, 3));
var
  d, c: TMatrix;
Pascal
1
2
3
4
5
6
7
8
9
10
11
  d:=a; n:=5;
  { ... }
vyh:
  for i:=1 to n do for j:=1 to n do begin
    s:=0; for k:=1 to n do s:=s+d[i,k]*a[k,j]; c[i,j]:=s;
  end;
  WriteLn;
  for i:=1 to n do begin
    WriteLn; for j:=1 to n do Write(c[i,j]:10:5);
  end;
  ReadLn;
Получили матрицу, состоящую из единиц.
Единичная матрица -- это несколько иное: на главной диагонали единицы, все остальные элементы нули.


Добавлено через 4 минуты
Цитата Сообщение от Neprogramist11 Посмотреть сообщение
уже показали именно эту программу и блок схему по этой программ
С учетом изложенного выше, очевидно зря.
0
0 / 0 / 0
Регистрация: 19.10.2018
Сообщений: 7
27.11.2018, 14:10 5
bormant, а касательно нашей программы, вы разобрались какой здесь метод и как все устроено? Может, за небольшую плату вы нам разжуете нашу программу в математическом смысле?
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5728 / 3437 / 2442
Регистрация: 22.11.2013
Сообщений: 9,653
Записей в блоге: 1
27.11.2018, 14:31 6
Метод чего? Если нахождения обратной матрицы, то этот код обратную матрицу находить не умеет.
То, что он находит, не является обратной матрицей. Это обстоятельство было установлено очень просто: исходную матрицу умножили на «обратную» и НЕ получили единичную матрицу.
1
0 / 0 / 0
Регистрация: 19.10.2018
Сообщений: 7
27.11.2018, 16:21 7
bormant, если вы сейчас про наш код, то здесь нет сомнений, что программа находит обратную матрицу. Преподаватель давал пример матрицы 5х5 и обратная матрица была успешно найдена. Также мы сами решали, все сходилось, попробуйте сами, все работает, только совсем непонятно как оно работает)
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5728 / 3437 / 2442
Регистрация: 22.11.2013
Сообщений: 9,653
Записей в блоге: 1
27.11.2018, 17:17 8
Цитата Сообщение от Neprogramist11 Посмотреть сообщение
здесь нет сомнений, что программа находит обратную матрицу
Хм, действительно опечатался при проверке, вот здесь: s:=s+d[i,k]*a[k,i], должно было быть s:=s+d[i,k]*a[k,j].

Тогда все относительно просто. Особенно если отформатировать и переписать без использования goto, где это совершенно не нужно:
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
const nmax = 10;
var
  A: array[1..nmax,1..nmax] of Real;
  P: array[1..nmax] of Integer;
  i, j, k, b, n, t: Integer;
  e, s: Real;
label vyh;
begin
  WriteLn('программа обращения матрицы методом Гаусса-Жордана');
  WriteLn;
  Write('введите размерность матрицы А: n=');
  ReadLn(n);
  WriteLn('ввод матрицы А:');
  for i:=1 to n do for j:=1 to n do Read(A[i,j]); ReadLn;
  for i:=1 to n do P[i]:=i;
  for k:=1 to n do begin
    e:=0; b:=0;
    for i:=k to n do
      if e<Abs(A[i,k]) then begin
        e:=Abs(A[i,k]); b:=i;
      end;
    if e=0 then begin
      WriteLn('матрица вырождена');
      goto vyh;
    end;
    if k<b then begin
      for j:=1 to n do begin
        s:=A[k,j]; A[k,j]:=A[b,j]; A[b,j]:=s;
      end;
      t:=P[k]; P[k]:=P[b]; P[b]:=t;
    end;
    A[k,k]:=1/A[k,k];
    for j:=1 to n do if j<>k then begin
      s:=A[k,j]*A[k,k];
      for i:=1 to n do if i<>k then
        A[i,j]:=A[i,j]-A[i,k]*s;
      A[k,j]:=s;
    end;
    for i:=1 to n do if i<>k then
      A[i,k]:=-A[i,k]*A[k,k];
  end;
  for k:=1 to n do
    while k<P[k] do begin
      i:=P[k];
      for j:=1 to n do begin
        s:=A[j,k]; A[j,k]:=A[j,i]; A[j,i]:=s;
      end;
      t:=P[i]; P[i]:=P[k]; P[k]:=t;
    end;
  WriteLn;
  WriteLn('О Б Р А Т Н А Я   М А Т Р И Ц А');
  for i:=1 to n do begin
    WriteLn; for j:=1 to n do Write(A[i,j]:10:5);
  end;
vyh:
  ReadLn;
end.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.11.2018, 17:17

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

Получить последовательность (Напишите прогу, кто может?)
пожалуйста напишите прогу, кто может, пожалуйста. Условие:Даны натуральное число n, действительные...

Может кто-нибудь слышал про эту прогу?
Программа по криптографии и/или стеганографии. CryptLink или CryptoLink. Может, кто знает? Киньте...

Может кто перевести эту прогу,для codeblocks
#include &quot;stdafix.h&quot; #include &lt;iostream&gt; using namespace std; int _tmain(int argc, _TCHAR*...

кто может переделать прогу с под С++ билдера на ВинАпи?
кто может переделать прогу с под С++ билдера на ВинАпи? если кто-то сможет тогда дам саму прогу...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.