Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 21

Произведение двух матриц с комплексными коэффициентами, представленными в показательной форме записи

29.09.2018, 13:19. Показов 4977. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите написать программу, выполняющую произведение двух матриц с комплексными коэффициентами, представленными в показательной форме записи?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.09.2018, 13:19
Ответы с готовыми решениями:

Сложение двух матриц с комплексными коэффициентами представленные в показательной форме
Помогите пожалуйста отладить программу и составить к ней блок-схему Если нетрудно, то можно её скомпилировать в .exe файл, чтобы можно...

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

Процедуры для работы с комплексными числами, представленными в тригонаметрическом виде
для работы с комплексными числами, представленные в тригонаметрическом виде: 1. Разработать процедуру ввода-вывода комплексных чисел. ...

41
0 / 0 / 0
Регистрация: 30.09.2018
Сообщений: 10
01.10.2018, 22:20
Студворк — интернет-сервис помощи студентам
C этой корректировкой вот здесь выдает ошибку.

Цитата Сообщение от Puporev Посмотреть сообщение
c[i,j]:=algtopok(c1[i,j]);
0
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 21
01.10.2018, 22:58  [ТС]
А в целом скорректированную программу не можете скинуть, пожалуйста?

Добавлено через 30 минут
Цитата Сообщение от bormant Посмотреть сообщение
А вот тут знак потерялся, см.: https://en.wikipedia.org/wiki/Atan2

Добавлено через 9 минут
Pascal
17
18
19
20
21
22
23
24
function algtopok(a:alg):pok;//перевод алгебраической а показательную
var b:pok;
begin
  b.z:=SqRt(Sqr(a.re)+Sqr(a.im));
  b.fi:=arctan(a.im/a.re);
  if a.re<0 then b.fi:=b.fi-Pi;
  algtopok:=b;
end;
Ну и не TP это ни разу, структуры как результат функции он не умеет возвращать.

Добавлено через 1 минуту
Pascal
17
18
19
20
21
22
procedure algtopok(const a: alg; var b: pok); { перевод алгебраической в показательную }
begin
  b.z:=SqRt(Sqr(a.re)+Sqr(a.im));
  b.fi:=arctan(a.im/a.re);
  if a.re<0 then b.fi:=b.fi-Pi;
end;
Просто с этой корректировкой выдает ошибку на - c[i,j]:=algtopok(c1[i,j]); Непонятно из за чего!
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
02.10.2018, 00: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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
const nMax=4; W=10;
type
  TComplex = record
    case Integer of
    0: (re, im: Real);
    1: (r, phi: Real);
  end;
  TCMatrix = array [0..nMax-1,0..nMax-1] of TComplex;
  TCvtProc = procedure (const a: TComplex; var b: TComplex);
  TWrtProc = procedure (const a: TComplex);
 
function DegToRad(const a: Real): Real; begin DegToRad:=a*Pi/180; end;
function RadToDeg(const a: Real): Real; begin RadToDeg:=a*180/Pi; end;
 
procedure cToRad(const a: TComplex; var b: TComplex); far;
begin with b do begin
  r:=a.r; phi:=DegToRad(a.phi)
end; end;
 
procedure cToRPhi(const a: TComplex; var b: TComplex); far;
var t: Real;
begin with a do begin
  t:=re; b.r:=Sqrt(Sqr(t)+Sqr(im)); b.phi:=ArcTan(im/t);
  if t<0 then b.phi:=b.phi-Pi;
end; end;
 
procedure cToReIm(const a: TComplex; var b: TComplex); far;
var t: Real;
begin with a do begin
  t:=r*Cos(phi); b.im:=r*Sin(phi); b.re:=t;
end; end;
 
procedure cWriteReIm(const a: TComplex); far;
var s: String[W];
begin with a do begin
  Write(' ',re:W); Str(im:W,s);
  if s[1]=' ' then s[1]:='+';
  Write(s,'i');
end; end;
 
procedure cWriteRPhi(const a: TComplex); far;
begin with a do begin Write(' ',r:W,' e^',phi: W,'i'); end; end;
 
procedure cAdd(const a, b: TComplex; var c: TComplex);
begin with c do begin
  re:=a.re+b.re; im:=a.im+b.im;
end; end;
 
procedure cMul(const a, b: TComplex; var c: TComplex);
var t: Real;
begin with c do begin
  t:=a.re*b.re-a.im*b.im; im:=a.re*b.im+b.re*a.im; re:=t;
end; end;
 
procedure mCvt(const a: TCMatrix; var b: TCMatrix; m, n: Integer; f: TCvtProc);
var i, j: Integer;
begin
  for i:=0 to m-1 do for j:=0 to n-1 do f(a[i,j],b[i,j]);
end;
 
procedure mMul(const a, b: TCMatrix; var c: TCMatrix; m, n, p: Integer);
var r: TCMatrix; t: TComplex; i, j, k: Integer;
begin
  for i:=0 to m-1 do for j:=0 to p-1 do begin
    FillChar(r[i,j],SizeOf(r[i,j]),#0);
    for k:=0 to n-1 do begin
      cMul(a[i,k],b[k,j],t); cAdd(t,r[i,j],r[i,j]);
    end;
  end;
  c:=r;
end;
 
procedure mWrite(const p: String; const a: TCMatrix; m, n: Integer; Wrt: TWrtProc);
var i, j: Integer;
begin
  WriteLn(p);
  for i:=0 to m-1 do begin
    for j:=0 to n-1 do Wrt(a[i,j]); WriteLn;
  end;
end;
 
procedure mRead(const p: String; var a: TCMatrix; m, n: Integer);
var i, j: Integer;
begin
  Write(p,' (',m,'x',n,'): ');
  for i:=0 to m-1 do for j:=0 to n-1 do with a[i,j] do Read(re,im);
end;
 
const n: Integer = 2;
var a, b, t: TCMatrix;
begin
  WriteLn('Элементы комплексных матриц в показательной форме: модуль угол_фи (в градусах)');
  mRead('A',a,n,n); mRead('B',b,n,n);
  mWrite('A (град.) =',a,n,n,cWriteRPhi);
  mWrite('B (град.) =',b,n,n,cWriteRPhi);
  mCvt(a,a,n,n,cToRad); mCvt(b,b,n,n,cToRad);
  mCvt(a,a,n,n,cToReIm); mCvt(b,b,n,n,cToReIm);
  mMul(a,b,t,n,n,n);
  mWrite('A =',a,n,n,cWriteReIm);
  mWrite('B =',b,n,n,cWriteReIm);
  mWrite('A * B =',t,n,n,cWriteReIm);
end.
Но было бы неплохо сверить арифметику, писалось без проверок...
0
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 21
02.10.2018, 09:25  [ТС]
Цитата Сообщение от bormant Посмотреть сообщение
case Integer of
"Возле case ожидался идентификатор" - пишет ошибку, как быть?
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
02.10.2018, 09:58
Цитата Сообщение от Ex_human Посмотреть сообщение
как быть?
Пойти в раздел того паскаля, с которым работаете. Для Turbo Pascal (и этого подраздела) синтаксис абсолютно корректный.
Как меньшее из зол (с ущербом для понимания но без ущерба для логики) оставить только:
Pascal
1
2
3
4
type
  TComplex = record
    re, im: Real; { они же r, phi в показательной форме }
  end;
и везде по тексту заменить обращение к полям записи "r" на "re", "phi" на "im".

Добавлено через 25 минут
Для PascalABC может закончиться чем-то таким:
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
90
91
92
93
94
95
96
97
98
99
100
const nMax=4; W=11;
type
  TComplex = record
    re, im: Real;
  end;
  TCMatrix = array [0..nMax-1,0..nMax-1] of TComplex;
  TCvtProc = procedure (a: TComplex; var b: TComplex);
  TWrtProc = procedure (a: TComplex);
 
function DegToRad(const a: Real): Real; begin DegToRad:=a*Pi/180; end;
function RadToDeg(const a: Real): Real; begin RadToDeg:=a*180/Pi; end;
 
procedure cToRad(const a: TComplex; var b: TComplex);
begin with b do begin
  re:=a.re; im:=DegToRad(a.im);
end; end;
 
procedure cToRPhi(const a: TComplex; var b: TComplex);
var t: Real;
begin with a do begin
  t:=re; b.re:=Sqrt(Sqr(t)+Sqr(im)); b.im:=ArcTan(im/t);
  if t<0 then b.im:=b.im-Pi;
end; end;
 
procedure cToReIm(const a: TComplex; var b: TComplex);
var t: Real;
begin with a do begin
  t:=re*Cos(im); b.im:=re*Sin(im); b.re:=t;
end; end;
 
procedure cWriteReIm(const a: TComplex);
var s: String;
begin with a do begin
  Write(' ',re:W); Str(im:W,s);
  if s[1]=' ' then s[1]:='+';
  Write(s,'i');
end; end;
 
procedure cWriteRPhi(const a: TComplex);
begin with a do begin Write(' ',re:W,'e',im:W,'i'); end; end;
 
procedure cAdd(const a, b: TComplex; var c: TComplex);
begin with c do begin
  re:=a.re+b.re; im:=a.im+b.im;
end; end;
 
procedure cMul(const a, b: TComplex; var c: TComplex);
var t: Real;
begin with c do begin
  t:=a.re*b.re-a.im*b.im; im:=a.re*b.im-b.re*a.im; re:=t;
end; end;
 
procedure mCvt(const a: TCMatrix; var b: TCMatrix; m, n: Integer; f: TCvtProc);
var i, j: Integer;
begin
  for i:=0 to m-1 do for j:=0 to n-1 do f(a[i,j],b[i,j]);
end;
 
procedure mMul(const a, b: TCMatrix; var c: TCMatrix; m, n, p: Integer);
var r: TCMatrix; t: TComplex; i, j, k: Integer;
begin
  for i:=0 to m-1 do for j:=0 to p-1 do begin
    with r[i,j] do begin re:=0; im:=0; end;
    for k:=0 to n-1 do begin
      cMul(a[i,k],b[k,j],t); cAdd(t,r[i,j],r[i,j]);
    end;
  end;
  c:=r;
end;
 
procedure mWrite(const p: String; const a: TCMatrix; m, n: Integer; Wrt: TWrtProc);
var i, j: Integer;
begin
  WriteLn(p);
  for i:=0 to m-1 do begin
    for j:=0 to n-1 do Wrt(a[i,j]); WriteLn;
  end;
end;
 
procedure mRead(const p: String; var a: TCMatrix; m, n: Integer);
var i, j: Integer;
begin
  Write(p,' (',m,'x',n,'): ');
  for i:=0 to m-1 do for j:=0 to n-1 do with a[i,j] do Read(re,im);
end;
 
const n: Integer = 2;
var a, b, t: TCMatrix;
begin
  WriteLn('Элементы комплексных матриц в показательной форме: модуль угол_фи (в градусах)');
  mRead('A',a,n,n); mRead('B',b,n,n);
  mWrite('A (град.) =',a,n,n,cWriteRPhi);
  mWrite('B (град.) =',b,n,n,cWriteRPhi);
  mCvt(a,a,n,n,cToRad); mCvt(b,b,n,n,cToRad);
  mCvt(a,a,n,n,cToReIm); mCvt(b,b,n,n,cToReIm);
  mMul(a,b,t,n,n,n);
  mWrite('A =',a,n,n,cWriteReIm);
  mWrite('B =',b,n,n,cWriteReIm);
  mWrite('A * B =',t,n,n,cWriteReIm);
end.
0
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 21
02.10.2018, 09:58  [ТС]
Цитата Сообщение от bormant Посмотреть сообщение
const a: TComplex
На данном этапе в PascalABC выдает ошибку на const a. Первоначально не знал, что turbo pascal имеет другую базу синтаксиса. От чего исходить просто непонятно?
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
02.10.2018, 10:04
Цитата Сообщение от Ex_human Посмотреть сообщение
в PascalABC
Смотрите сообщение выше, от слов "Добавлено через 25 минут".

Добавлено через 4 минуты
Цитата Сообщение от Ex_human Посмотреть сообщение
Первоначально не знал, что turbo pascal имеет другую базу синтаксиса
Несложно было догадаться, раз для PascalABC выделена отдельная ветка на форуме. Это не считая того, что указано в его справке.
А кроме того:
В языке Pascal ABC имеются ... а также тип complex, предназначенный для работы с комплексными числами.

Тип complex (комплексный). Значения комплексного типа занимают 16 байт. Константы этого типа записываются в виде (x,y), где x и y - выражения вещественного типа, представляющие собой вещественную и мнимую части комплексного числа. Если переменная c имеет тип complex, то обратиться к ее вещественной и мнимой частям можно как к полям записи: c.re и c.im. Например:
Pascal
1
2
3
4
5
const ci=(0,1);
var c: complex;
...
c.re:=2*c.im;
c:=ci*c+(c.im,c.re);
К переменным типа complex применимы стандартные числовые функции: abs, sin, cos, exp, ln, sqrt, а также функция conj(c), возвращающая комплексно сопряженное к c, и функция carg(c), возвращающая главное значение аргумента комплексного числа c. При вычислении многозначных функций ln, sqrt, carg возвращается главное значение и предполагается, что разрез сделан по отрицательной вещественной оси, причем, верхний берег принадлежит разрезу. Так, carg(c) возвращает значение в диапазоне (-Pi,Pi].
0
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 21
02.10.2018, 10:37  [ТС]
Цитата Сообщение от bormant Посмотреть сообщение
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
A (град.) =
  8.000E+00 e^ 1.200E+02i  1.400E+01 e^ 8.000E+01i
  6.000E+00 e^ 1.000E+01i  5.000E+00 e^ 4.000E+00i
B (град.) =
  2.000E+00 e^ 2.500E+01i  3.000E+00 e^ 1.000E+01i
  7.000E+00 e^ 1.000E+01i  6.000E+00 e^ 3.000E+01i
A =
 -4.000E+00+6.928E+00i  2.431E+00+1.379E+01i
  5.909E+00+1.042E+00i  4.988E+00+3.488E-01i
B =
  1.813E+00+8.452E-01i  2.954E+00+5.209E-01i
  6.894E+00+1.216E+00i  5.196E+00+3.000E+00i
A * B =
 -1.311E+01-1.080E+02i -4.416E+01-8.690E+01i
  4.379E+01+6.764E+00i  4.179E+01+1.315E+01i
Вопрос: Как наиболее явно представить это в показательной форме, именно окончательный результат вычислений?
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
02.10.2018, 19:34
Выполнить преобразование и поменять вывод:
Pascal
1
2
  mCvt(t,t,n,n,cToRPHi); mCvt(t,t,n,n,cToDeg);
  mWrite('A * B (град.) =',t,n,n,cWriteRPhi);
добавить
Pascal
1
2
3
4
procedure cToDeg(const a: TComplex; var b: TComplex);
begin with b do begin
  re:=a.re; im:=RadToDeg(a.im);
end; end;
Но с учетом готового типа complex, наличия для него функций Abs() и CArg(), от половины ручного кода можно легко избавиться. Будет ли лишний ручной код оценен в плюс или в минус -- не могу знать. Ведь для встроенного в PABC complex показательная форма с углом в градусах получается весьма легко:
Pascal
1
Write(Abs(c),'e^',CArg(c)*180/Pi,'i');
Добавлено через 46 минут
Ну и до кучи...
Раз уж выше упоминал про ArcTan2, пусть будет здесь же и ее реализация для Turbo Pascal:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{$IFOPT N+}
function ArcTan2(y, x: Extended): Extended; assembler;
asm
  fld y
  fld x
  fpatan
  fwait
end;
{$ELSE}
function ArcTan2(y, x: Real): Real; { ArcTan(y/x); (-Pi; Pi] }
var r: Real;
begin
  if x=0 then begin
    if      y=0 then r:= 0.0
    else if y>0 then r:= Pi/2
    else{if y<0 then}r:=-Pi/2;
  end else           r:=ArcTan(y/x);
  if x<0.0      then r:=r+Pi;
  if r>Pi       then r:=r-2*Pi;
  ArcTan2:=r;
end;
{$END}
Добавлено через 7 часов 13 минут
После проверок можно остановиться на чем-то подобном:
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
90
91
92
93
94
95
96
97
unit Complex;
interface
type
  TFloat = {$IFOPT N+}Double{$ELSE}Real{$ENDIF};
  PComplex = ^TComplex;
  TComplex = record
    re, im: TFloat;
  end;
 
{$IFOPT N+}
function ArcTan2(y, x: Extended): Extended; assembler;
{$ELSE}
function ArcTan2(y, x: Real): Real;
{$ENDIF}
function cAbs(const a: TComplex): TFloat;
function cArg(const a: TComplex): TFloat;
function cNeg(const a: TComplex; var r: TComplex): PComplex;
function cAdd(const a, b: TComplex; var r: TComplex): PComplex;
function cSub(const a, b: TComplex; var r: TComplex): PComplex;
function cMul(const a, b: TComplex; var r: TComplex): PComplex;
function cDiv(const a, b: TComplex; var r: TComplex): PComplex;
 
implementation
{$IFOPT N+}
function ArcTan2(y, x: Extended): Extended; assembler;
asm
  fld y
  fld x
  fpatan
  fwait
end;
{$ELSE}
function ArcTan2(y, x: Real): Real; { ArcTan(y/x); (-Pi; Pi] }
var r: Real;
begin
  if x=0 then begin
    if      y=0 then r:=0.0
    else if y>0 then r:=Pi/2
    else if y<0 then r:=-Pi/2;
  end else           r:=ArcTan(y/x);
  if x<0.0      then r:=r+Pi;
  if r>Pi       then r:=r-2*Pi;
  ArcTan2:=r;
end;
{$ENDIF}
 
function cAbs(const a: TComplex): TFloat;
begin
  with a do cAbs:=SqRt(Sqr(re)+Sqr(im));
end;
 
function cArg(const a: TComplex): TFloat;
begin
  with a do cArg:=ArcTan2(im,re);
end;
 
function cNeg(const a: TComplex; var r: TComplex): PComplex;
begin with r do begin
  re:=-a.re;
  im:=-a.im;
  cNeg:=@r;
end; end;
 
function cAdd(const a, b: TComplex; var r: TComplex): PComplex;
begin with r do begin
  re:=a.re+b.re;
  im:=a.im+b.im;
  cAdd:=@r;
end; end;
 
function cSub(const a, b: TComplex; var r: TComplex): PComplex;
begin with r do begin
  re:=a.re-b.re;
  im:=a.im-b.im;
  cSub:=@r;
end; end;
 
function cMul(const a, b: TComplex; var r: TComplex): PComplex;
var t: TFloat;
begin with r do begin
  t:= a.re*b.re-a.im*b.im;
  im:=a.re*b.im+a.im*b.re;
  re:=t;
  cMul:=@r;
end; end;
 
function cDiv(const a, b: TComplex; var r: TComplex): PComplex;
var t, s: TFloat;
begin with r do begin
  s:= Sqr(b.re)+Sqr(b.im);
  t:= (a.re*b.re+a.im*b.im)/s;
  im:=(a.re*b.im-a.im*b.re)/s;
  re:=t;
  cDiv:=@r;
end; end;
 
end.
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
uses Complex;
 
const nMax=4; W=11; n: Integer = 2;
 
type
  TCMatrix = array [0..nMax-1,0..nMax-1] of TComplex;
  TWriteProc = procedure (const a: TComplex);
 
procedure cWrite(const a: TComplex); far;
var t: String[31];
begin with a do begin
  Str(im:W,t); if t[1]=' ' then t[1]:='+';
  Write(' ',re:W,' ',t,'i');
end; end;
 
procedure cWriteE(const a: TComplex); far;
var t: String[31];
begin
  Write(' ',cAbs(a):W,'e',cArg(a):W,'i');
end;
 
procedure cWriteED(const a: TComplex); far;
var t: String[31];
begin
  Write(' ',cAbs(a):W,'e',cArg(a)*180/Pi:W,'j');
end;
 
procedure mcMul(const a, b: TCMatrix; var c: TCMatrix; m, n, p: Integer);
var i, j, k: Integer; t: TComplex; r: TCMatrix; 
begin
  FillChar(r,SizeOf(r),#0);
  for i:=0 to m-1 do for j:=0 to p-1 do
    for k:=0 to n-1 do begin
      cMul(a[i,k],b[k,j],t); cAdd(t,r[i,j],r[i,j]);
    end;
  c:=r;
end;
 
procedure mcWrite(const p: String; const a: TCMatrix; m, n: Integer; W: TWriteProc);
var i, j: Integer;
begin
  WriteLn(p);
  for i:=0 to m-1 do begin
    for j:=0 to n-1 do W(a[i,j]); WriteLn;
  end;
end;
 
procedure mcReadED(const p: String; var a: TCMatrix; m, n: Integer);
var i, j: Integer; t: TFloat;
begin
  Write(p,' (',m,'x',m,'): ');
  for i:=0 to m-1 do for j:=0 to n-1 do with a[i,j] do begin
    Read(re,t); t:=t*Pi/180; im:=re*Sin(t); re:=re*Cos(t);
  end;
end;
 
var a, b, c: TCMatrix;
begin 
  WriteLn('Элементы комплексных матриц в показательной форме: модуль угол_фи (в градусах)');
  mcReadED('A',a,n,n);
  mcReadED('B',b,n,n);
  mcWrite('A (град.) =',a,n,n,cWriteED);
  mcWrite('B (град.) =',b,n,n,cWriteED);
  mcWrite('A =',a,n,n,cWrite);
  mcWrite('B =',b,n,n,cWrite);
  mcMul(a,b,c,n,n,n);
  mcWrite('A * B (град.) =',c,n,n,cWriteED);
  mcWrite('A * B =',c,n,n,cWrite);
end.
Прогон:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
A (град.) =
  8.000E+00e 1.200E+02j  1.400E+01e 8.000E+01j
  6.000E+00e 1.000E+01j  5.000E+00e 4.000E+00j
B (град.) =
  2.000E+00e 2.500E+01j  3.000E+00e 1.000E+01j
  7.000E+00e 1.000E+01j  6.000E+00e 3.000E+01j
A =
 -4.000E+00 +6.928E+00i  2.431E+00 +1.379E+01i
  5.909E+00 +1.042E+00i  4.988E+00 +3.488E-01i
B =
  1.813E+00 +8.452E-01i  2.954E+00 +5.209E-01i
  6.894E+00 +1.216E+00i  5.196E+00 +3.000E+00i
A * B (град.) =
  1.080E+02e 9.697E+01j  1.069E+02e 1.144E+02j
  4.640E+01e 1.932E+01j  4.766E+01e 2.876E+01j
A * B =
 -1.311E+01 +1.072E+02i -4.416E+01 +9.732E+01i
  4.379E+01 +1.535E+01i  4.179E+01 +2.293E+01i
Добавлено через 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
function DecOrd(n: Real): Integer;
begin
  DecOrd:=Trunc(Ln(Abs(n))/Ln(10));
end;
 
const W=7;
 
procedure cWrite(const a: TComplex); far;
var t: String[31];
begin with a do begin
  Str(im:W:W-3-DecOrd(im),t); if t[1]=' ' then t[1]:='+';
  Write(' ',re:W:W-3-DecOrd(re),' ',t,'i');
end; end;
 
procedure cWriteE(const a: TComplex); far;
var p, q: Real;
begin
  p:=cAbs(a); q:=cArg(a);
  Write(' ',p:W:W-3-DecOrd(p),'e',q:W:W-3-DecOrd(q),'i');
end;
 
procedure cWriteED(const a: TComplex); far;
var p, q: Real;
begin
  p:=cAbs(a); q:=cArg(a)*180/Pi;
  Write(' ',p:W:W-3-DecOrd(p),'e',q:W:W-3-DecOrd(q),'j');
end;
Тогда вывод станет немного более читаемым:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
A (град.) =
  8.0000e 120.00j  14.000e 80.000j
  6.0000e 10.000j  5.0000e 4.0000j
B (град.) =
  2.0000e 25.000j  3.0000e 10.000j
  7.0000e 10.000j  6.0000e 30.000j
A =
 -4.0000 +6.9282i  2.4311 +13.787i
  5.9088 +1.0419i  4.9878 +0.3488i
B =
  1.8126 +0.8452i  2.9544 +0.5209i
  6.8937 +1.2155i  5.1962 +3.0000i
A * B (град.) =
  107.98e 96.972j  106.87e 114.41j
  46.403e 19.318j  47.665e 28.758j
A * B =
 -13.106 +107.18i -44.157 +97.319i
  43.790 +15.350i  41.786 +22.932i
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
02.10.2018, 20:49
Ну или тупо с 2 знаками после запятой:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const W=10; D=2;
 
procedure cWrite(const a: TComplex); far;
var t: String[31];
begin with a do begin
  Str(im :W:D,t); if t[1]=' ' then t[1]:='+';
  Write(' ',re :W:D,' ',t,'i');
end; end;
 
procedure cWriteE(const a: TComplex); far;
var p, q: Real;
begin
  p:=cAbs(a); q:=cArg(a);
  Write(' ',p :W:D,'e',q :W:D,'i');
end;
 
procedure cWriteED(const a: TComplex); far;
var p, q: Real;
begin
  p:=cAbs(a); q:=cArg(a)*180/Pi;
  Write(' ',p :W:D,'e',q :W:D,'j');
end;
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
A (град.) =
     8.00e  120.00j    14.00e   80.00j
     6.00e   10.00j     5.00e    4.00j
B (град.) =
     2.00e   25.00j     3.00e   10.00j
     7.00e   10.00j     6.00e   30.00j
A =
    -4.00 +   6.93i     2.43 +  13.79i
     5.91 +   1.04i     4.99 +   0.35i
B =
     1.81 +   0.85i     2.95 +   0.52i
     6.89 +   1.22i     5.20 +   3.00i
A * B (град.) =
   107.98e   96.97j   106.87e  114.41j
    46.40e   19.32j    47.66e   28.76j
A * B =
   -13.11 + 107.18i   -44.16 +  97.32i
    43.79 +  15.35i    41.79 +  22.93i
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
03.10.2018, 10:55
Или может быть вот такой формат вывода читать удобнее:
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
const nMax=4; W=7; D=2; G=3; n: Integer = 2;
 
function DecOrd(n: Real): Integer;
begin
  DecOrd:=Trunc(Ln(Abs(n))/Ln(10));
end;
 
function iMax(a, b: Integer): Integer;
begin
  iMax:=a; if a<b then iMax:=b;
end;
 
procedure cWrite(const a: TComplex); far;
begin with a do begin
  Write(' ( ',re :W:W-G-iMax(0,DecOrd(re)),
          ' ',im :W:W-G-iMax(0,DecOrd(im)),' i)');
end; end;
 
procedure cWriteE(const a: TComplex); far;
var p, q: Real;
begin
  p:=cAbs(a); q:=cArg(a);
  Write(' (e',p :W:W-G-iMax(0,DecOrd(p)),
          ' ',q :W:W-G-iMax(0,DecOrd(q)),' i)');
end;
 
procedure cWriteED(const a: TComplex); far;
var p, q: Real;
begin
  p:=cAbs(a); q:=cArg(a)*180/Pi;
  Write(' (e',p :W:W-G-iMax(0,DecOrd(p)),
          ' ',q :W:W-G-iMax(0,DecOrd(q)),' j)');
end;
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
A (град.) =
 (e 8.0000  120.00 j) (e 14.000  80.000 j)
 (e 6.0000  10.000 j) (e 5.0000  4.0000 j)
B (град.) =
 (e 2.0000  25.000 j) (e 3.0000  10.000 j)
 (e 7.0000  10.000 j) (e 6.0000  30.000 j)
A =
 ( -4.0000  6.9282 i) (  2.4311  13.787 i)
 (  5.9088  1.0419 i) (  4.9878  0.3488 i)
B =
 (  1.8126  0.8452 i) (  2.9544  0.5209 i)
 (  6.8937  1.2155 i) (  5.1962  3.0000 i)
A * B (град.) =
 (e 107.98  96.972 j) (e 106.87  114.41 j)
 (e 46.403  19.318 j) (e 47.665  28.758 j)
A * B =
 ( -13.106  107.18 i) ( -44.157  97.319 i)
 (  43.790  15.350 i) (  41.786  22.932 i)
Префикс:
( - алгебраический форма
(e - показательная форма
Суффикс:
i) - показательная форма, радианы
j) - показательная форма, градусы

По-моему, так оно читается поудобнее.

Добавлено через 10 часов 53 минуты
Ex_human,
вот теперь и ошибочки ручного решения хорошо видны, если сравнить ответ с тем, что выше.

Добавлено через 40 минут
Цитата Сообщение от Ex_human Посмотреть сообщение
Просто в ручную не получается того ответа, что выводит программа, дело либо в программе, либо в ручном вводе, либо в ручном решении!(2-ой рисунок)
А вот и ручное решение:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 [(e 8.0000  120.00 j) (e 14.000  80.000 j)]   [(e 2.0000  25.000 j) (e 3.0000  10.000 j)]
 [(e 6.0000  10.000 j) (e 5.0000  4.0000 j)]   [(e 7.0000  10.000 j) (e 6.0000  30.000 j)]
=
 ...
=
 [(e 16.000  145.00 j)+(e 98.000  90.000 j)  (e 24.000  130.00 j)+(e 84.000  110.00 j)]
 [(e 12.000  35.000 j)+(e 35.000  14.000 j)  (e 18.000  20.000 j)+(e 30.000  34.000 j)]
=
 [( -13.106  9.1772 i)+(  0.0000  98.000 i)  ( -15.427  18.385 i)+( -28.730  78.934 i)]
 [(  9.8298  6.8829 i)+(  33.960  8.4673 i)  (  16.914  6.1564 i)+(  24.871  16.776 i)]
=
 [( -13.106  107.18 i) ( -44.157  97.319 i)]
 [(  43.790  15.350 i) (  41.786  22.932 i)]
=
 [(e 107.98  96.972 j) (e 106.87  114.41 j)]
 [(e 46.403  19.318 j) (e 47.665  28.758 j)]
0
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 21
08.10.2018, 19:37  [ТС]
Выдает ошибки при запуске как в pascal turbo(1 изображение), так и в abc pascal(2 изображение)?
Миниатюры
Произведение двух матриц с комплексными коэффициентами, представленными в показательной форме записи   Произведение двух матриц с комплексными коэффициентами, представленными в показательной форме записи  
0
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 21
08.10.2018, 20:25  [ТС]
Цитата Сообщение от bormant Посмотреть сообщение
procedure cWrite(const a: TComplex); far;
Вот на этой строке программа останавливается
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
08.10.2018, 20:30
"Нельзя запустить модуль."
Попытались запустить модуль, получили сообщение. Правильное сообщение, модули нельзя запускать.
Что опять не так?

Добавлено через 2 минуты
PascalABC.NET не знает ключевого слова far, но это не проблема Turbo Pascal в одноименном же разделе.
0
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 21
08.10.2018, 20:39  [ТС]
При компиляции выдает ошибку 15: Файл не найден <COMPLEX.TPU>
Миниатюры
Произведение двух матриц с комплексными коэффициентами, представленными в показательной форме записи  
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
08.10.2018, 21:26
Ну так скомпилируйте <COMPLEX.PAS>, получите <COMPLEX.TPU>. Исходник модуля COMPLEX (unit Complex) выше есть.

Добавлено через 3 минуты
Или выполните Compile - Build, или Compile - Make (можно нажать F9), модуль Complex будет собран из файла COMPLEX.PAS. Вот только запамятовал, где по умолчанию исходник модуля должен лежать, если правильно путаю в текущем каталоге или в каталоге с исходниками из настроек... Ну и должна быть включена компиляция на диск вместо компиляции в память, если правильно путаю.

Добавлено через 14 минут
А поскольку текущий каталог у вас какой-то другой, есть смысл выполнить File - Change dir... - c:\users\volkovs\desktop. И туда же COMPLEX.PAS положить.
0
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 21
08.10.2018, 22:32  [ТС]
А можно найти какую то альтернативу far, чтобы код был работоспособен для ABC Pascal ?
Цитата Сообщение от bormant Посмотреть сообщение
PascalABC.NET не знает ключевого слова far
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
08.10.2018, 22:58
Цитата Сообщение от Ex_human Посмотреть сообщение
можно найти какую то альтернативу far
Можно, кто ж вам запретит:
http://pascalabc.net/downloads... /index.htm

Можно просто убрать это ключевое слово. Станет ли код от этого синтаксически верным или потребуется еще что-то убрать -- мне совершенно неинтересно. Да и, наверное, не стоит об этом продолжать в разделе Turbo Pascal.

Обращаю внимание: PascalABC и PascalABC.NET -- совершенно разные диалекты, для каждого есть свой тематический подфорум, и не зря.
0
168 / 8 / 1
Регистрация: 15.11.2018
Сообщений: 256
11.01.2019, 12:54
Puporev, а как програма будет твоя выглядеть, чтоб было просто А = a + bi; B = c + di; ?
И вывод А * В. Причем матрица В сосотоит из 1 столбца
0
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
11.01.2019, 13:07
Цитата Сообщение от alexfandr Посмотреть сообщение
А = a + bi; B = c + di;
Это мне не понятно.
Произведение комплексной матрицы на комплексный вектор
Если Вы пр продолжение этой темы, то там числа в алгебраической форме.
Вообще создайте новую тему в соответствующем разделе где напишите точное и полное условие задачи.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.01.2019, 13:07
Помогаю со студенческими работами здесь

Действия над числами в тригонометрической и показательной форме записи
z1=i z2=-1-i

Вводится в символьной форме два многочлена от x с целыми коэффициентами. Вывести их произведение в порядке
Вводится в символьной форме два многочлена от x с целыми коэффициентами. Вывести их произведение в порядке уменьшения степеней - также в...

Используя функцию произведения двух матриц, найдите произведение трех матриц А(3,4) В(4,3) С(3,3)
Используя функцию произведения двух матриц, найдите произведение трех матриц А(3,4) В(4,3) С(3,3).

Построение графика показательной функции e^x (e в степени x) с заданными коэффициентами
Здравствуйте! var xline, yline : integer; e, x, y : real; begin x1:= -100; x2:= 100;

СЛУ с комплексными коэффициентами
Нужно решить подобную систему (так-то код на С). Решать буду обычным методом Гаусса. Вопрос в чем, как работать с комплексными числами,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru