Файл: Практикум по программированию задач матричного исчисления. Все задачи касаются выполнения определенных действий над матрицами.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 08.11.2023

Просмотров: 68

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Лабораторная работа №1

Задание:

Написать и отладить программу, выполняющую произведение двух матриц с комплексными коэффициентами, представленными в показательной форме записи (Ae).

Цель лабораторной работы



Получить навыки работы на персональной ЭВМ в среде программирования Quick Basic или Turbo Pascal, а также практикум по программированию задач матричного исчисления.

Все задачи касаются выполнения определенных действий над матрицами. Примерный список задач:

  1. сложение матриц с комплексными коэффициентами;

  2. перемножение матриц с вещественными коэффициентами;

  3. перемножение матриц с комплексными коэффициентами;

  4. вычисление нормы матрицы;

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

  6. вычисление обратной матрицы;

  7. вычисление ранга матрицы;

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


Краткие теоретические сведения, необходимые для решения поставленной задачи



Комплексные числа представляют собой расширение множества действительных чисел и являются суммой действительных и мнимых чисел. Мнимыми являются числа, квадрат которых отрицателен. Мнимая единица, квадрат которой дает –1, обозначается i или j. Соответственно, комплексное число Z можно представить как сумму

Z = X + jY,

где X = Re ­Z – действительня часть числа Z,

Y = Im ­Z – мнимая часть числа Z.

При этом Xи Y – действительные числа.

Существует также показательная форма записи комплексного числа

Z = Aej,

где – модуль числа Z,

φ – аргумент Z. В зависимости от знаков X и Y φ = arctg(Y/ X) или
φ = arctg(Y/ X) + π.

При этом

X = Acos φ,

Y = Asin φ.

Как мнимая, так и действительная части комплексного числа могут быть равными нулю. В первом случае (X = 0) комплексное число вырождается в чисто мнимое, во втором (Y = 0) – в действительное.

Матрица – математический объект, записываемый в виде прямоугольной таблицы элементов кольца или поля (например, целых, действительных или комплексных чисел), который представляет собой совокупность строк и столбцов, на пересечении которых находятся его элементы. Количество строк и столбцов задает размер матрицы.


Пусть имеются две матрицы A и B размерности nA × mA и nB × mB (n – число строк, m – число столбцов) и с элементами aij и bij. Произведением матриц A и B называется матрица C, элементы которой равны



При этом необходимо, чтобы mA = nB.

Блок-схема алгоритма программы



Блок-схемы алгоритма программы и ее подпрограмм приведены на рисунках 1–5.


Рисунок 1 – Блок-схема алгоритма программы



Рисунок 2 – Блок-схема алгоритма подпрограммы умножения матриц с комплексными элементами


Рисунок 3 – Блок-схема алгоритма подпрограммы сложения комплексных чисел


Рисунок 4 – Блок-схема алгоритма подпрограммы сложения комплексных чисел



Рисунок 5 – Блок-схема алгоритма подпрограммы вычисления арктангенса с учетом знаков катетов

Текст программы




Program Lab1;
Type

// Комплексное число

Complex = record

A, // модуль

phi: Real; // аргумент

end;

// Матрица комплексных чисел

Matrix = array[,] of Complex;
// Арктангенс с учетом знаков сторон

function ArcTan(x, y: Real): Real;

begin

if y = 0 then Result := 0

else if x = 0 then

if y > 0 then Result := Pi/2

else Result := -Pi/2

else Result := ArcTan(y/x);

if x < 0 then

if Result < 0 then

Result := Result + Pi

else

Result := Result - Pi;

end;

// Сложение комплексных чисел

function ComplexPlus(C1, C2: Complex): Complex;

var x, y, x1, x2, y1, y2: Real;

begin

x1 := C1.A * cos(C1.phi);

y1 := C1.A * sin(C1.phi);

x2 := C2.A * cos(C2.phi);

y2 := C2.A * sin(C2.phi);

x := x1 + x2;

y := y1 + y2;

Result.A := sqrt(x*x + y*y);

Result.phi := arctan(x, y);

end;
// Умножение комплексных чисел

function ComplexMul(C1, C2: Complex): Complex;

begin

Result.A := C1.A * C2.A;

Result.phi := C1.Phi + C2.Phi;

end;
// Умножение матриц

function MatrixMul(M1, M2: Matrix): Matrix;

var L, L1, L2: Integer;

C: Complex;

begin

if (Length(M1, 1) <> Length(M2, 0))

then begin

writeln('Ошибка. Размерности матриц должны соответствовать.');



halt(1);

end;

L1 := Length(M1, 0);

L2 := Length(M2, 1);

L := Length(M2, 0);

SetLength(Result, L1, L2);

for var i: Integer := 0 to L1 - 1 do

for var j: Integer :=0 to L2 - 1 do begin

Result[i, j].A := 0;

Result[i, j].Phi := 0;

for var k: Integer :=0 to L-1 do begin

C := ComplexMul(M1[i, k], M2[k, j]);

Result[i, j] := ComplexPlus(Result[i, j], C);

end;

end;

end;
// Представление комплексного числа

function ComplexString(C: Complex; Len: Integer := 0): String;

begin

if C.A = 0 then Result := '0'

else begin

Result := C.A.ToString;

if C.phi <> 0 then begin

Result := Result + ' * exp(';

if C.phi < 0 then

Result := Result + '-';

Result := Result + 'j' + abs(C.phi).ToString + ')';

end;

end;

while Length(Result) < Len do Result := ' ' + Result;

end;
// Вывод комплексного числа

Procedure ComplexPrint(C: Complex; Len: Integer := 0);

begin

write(ComplexString(C, Len), #9#9);

end;
// Вывод матрицы комплексных чисел

Procedure MatrixPrint(M: Matrix);

var MaxLength: array of Integer;

Cols, L: Integer;

begin

Cols := Length(M, 1);

SetLength(MaxLength, Cols);

for var i: Integer := 0 to Cols - 1 do begin

MaxLength[i] := 0;

for var j: Integer := 0 to Length(M, 0) - 1 do begin

L := Length(ComplexString(M[j, i]));

if L > MaxLength[i] then

MaxLength[i] := L;

end;

end;

for var i: Integer := 0 to Length(M, 0) - 1 do begin

for var j: Integer := 0 to Cols - 1 do begin

ComplexPrint(M[i, j], MaxLength[j]);

Write(' ');

end;

writeln;

end;

end;
// Ввод комплексного числа

function ComplexRead: Complex;

begin

Write('Введите модуль комплексного числа: ');

Read(Result.A);

Write('Введите аргумент комплексного числа: ');

Read(Result.phi);

end;
// Ввод матрицы комплексных чисел

function MatrixRead(L1, L2: Integer): Matrix;

begin

SetLength(Result, L1, L2);

Writeln('Ввод матрицы ' + L1 + ' x ' + L2);

for var i: Integer := 1 to L1 do

for var j: Integer := 1 to L2 do begin

writeln('Ввод элемента [', i, ', ', j, ']');

Result[i-1, j-1] := ComplexRead;

end;

end;
var M1, M2, M: Matrix;

n1, n2: Integer;

begin

Writeln('Программа вычисления произведение двух матриц ' +

'с комплексными коэффициентами,');

Writeln('представленными в показательной форме записи (A exp (j phi)).');
Write('Введите число строк матрицы 1: ');

Readln(n1);

Write('Введите число столбцов матрицы 1: ');

Readln(n2);

M1 := MatrixRead(n1, n2);

Writeln('Матрица M1:');

MatrixPrint(M1);

Write('Введите число строк матрицы 2: ');

Readln(n1);

if n1 <> n2 then begin

writeln('Ошибка. Размерности матриц должны соответствовать.');


halt(1);

end;

Write('Введите число столбцов матрицы 2: ');

Readln(n2);

M2 := MatrixRead(n1, n2);

Writeln('Матрица M2:');

MatrixPrint(M2);

M := MatrixMul(M1, M2);

Writeln('Матрица M = M1 * M2:');

MatrixPrint(M);

end.

Инструкция оператору



Программа предназначена для вычисления произведение двух матриц с комплексными коэффициентами, представленными в показательной форме записи (Ae).

При запуске программа выдает сообщение «Программа вычисления произведение двух матриц с комплексными коэффициентами, представленными в показательной форме записи (A exp (j phi)).»

По запросу необходимо ввести перемножаемые матрицы. После ввода каждой матрицы они выводятся на экран для контроля. Затем осуществляется вычисление матриц и вывод результата.

Ввод матрицы осуществляется в следующем порядке.

  1. По запросу «Введите число строк матрицы N:» необходимо ввести число строк матрицы N, где N может быть 1 или 2.

  2. По запросу «Введите число столбцов матрицы N:» необходимо ввести число столбцов матрицы N, где N может быть 1 или 2.

  3. Далее в цикле по запросам вида «Ввод элемента [i, j]» (i, j номер строки и столбца, соответственно) осуществляется ввод комплексного элемента матрицы.

Ввод комплексного числа осуществляется в следующем порядке.

  1. По запросу «Введите модуль комплексного числа» вводится модуль числа.

  2. По запросу «Введите аргумент комплексного числа» вводится аргумент (мнимый показатель) числа.



Контрольный пример





На рисунке 6 показан скриншот расчета тестового примера. Видно, что результат расчета правильный.


Рисунок 6 – Скриншот расчета тестового примера


Вывод



В ходе выполнения работы на языке программирования Pascal ABC написана и отлажена программа, выполняющая произведение двух матриц с комплексными коэффициентами, представленными в показательной форме записи (Ae). Приведены блок-схемы вычислительных алгоритмов программы, разработана инструкция оператору. Решение тестового задания подтвердило корректную работу программы.