Разработка программы нахождения обратных матриц



 

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

Ни одна полноценная программа не обходится без документации или хотя бы элементарного документа «readme». Поэтому в нашем приложении понадобится подобная инструкция. Для удобства использования инструкции к приложению они будут встроены в интерфейс программы.

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

• TGroupBox

• TButton

• TLabel

• TEdit

• TStatusBar

Инструмент TGroupBox будет очень полезен при разработке интерфэйса программы. С его помощью пользователю будет легко понять где какие элементы обратной матрицы находятся, а так же интерфейс будет иметь приятный и дружелюбный вид. TButton – кнопка по нажатии которой, будет производиться расчет обратной матрицы. С помощью того же элемента будет производиться выборка размера матрицы. Tlabel – комментарий к приложению, используется для вывода информации на экран в окне программы. TEdit – поле, в которое вносятся значения элементов исходной матрицы. TStatusBar – элемент отображаемый строго внизу окна приложения. Для вывода сообщений инструктирующих пользователя по работе с программой, а так же о ходе вычислений именно этот элемент будет наиболее удобен.

Начнем с разработки интерфейса программы. Слева будут расположены элементы ввода данных. Справа – элементы вывода результатов расчета обратной матрицы.


Рисунок 3. Окно программы.

В параметре Caption объекта Tlabel укажем комментарии к кнопкам выбора размера матрицы и вывод значений определителя, а так же знака умножения. В параметре Text компонентах TEdit1 укажем значения элементов матриц: 1. В поле Caption объектов TGroupBox укажем описание содержимого этих элементов. В поле SampleText элемента TStatusBar укажем что требуется сделать для расчета. Данный комментарий будет отображаться в программе по умолчанию.

Приступим к написанию кода приложения. Двойным щелчком по кнопке добавляем строки действия по кнопке. Кнопки подписанные «2х2» и «3ч3» будут отображать соответствующее количество полей ввода; кнопка «счет» будет запускать расчет обратной матрицы используя данные введенные в поля ввода.

Объявим несколько переменных:

• Переменные типа integer: var S,o:integer;

• Два массива с элементами типа integer: m,a:array [1..9] of integer;

Переменная S понадобится для определения размера матрицы самой программой. Переменная o будет равна значению определителя матрицы.

Так как матрица и массив схожи по свойствам, то для хранения информации об элементах исходной и обратной матрицы будет очень удобно их использовать. Размер массива равен количеству элементов матрицы.

Итоговая программа имеет следующий исходный код в разделе описания приложения. Здесь перечислены все используемые в программе модули и классы:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses

Classes, SysUtils, FileUtil, TAGraph, TAFuncSeries, TATransformations,

TATools, RTTICtrls, Forms, Controls,

Graphics, Dialogs, StdCtrls, DbCtrls, Unit2;

Любой код приложения разрабатываемого в Lazarus имеет описание всех элементов представленных в его форме и операторов задействованных в программе. Далее представлен исходный код перечисления этих компонентов:

TForm1 = class(TForm)

Button1: TButton;

Button2: TButton;

Button4: TButton;

Edit1: TEdit;

Edit10: TEdit;

Edit11: TEdit;

Edit19: TEdit;

Edit21: TEdit;

Edit22: TEdit;

Edit23: TEdit;

Edit25: TEdit;

Edit26: TEdit;

Edit27: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Edit17: TEdit;

Edit5: TEdit;

Edit6: TEdit;

Edit7: TEdit;

Edit18: TEdit;

Edit9: TEdit;

GroupBox1: TGroupBox;

GroupBox2: TGroupBox;

GroupBox3: TGroupBox;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

StatusBar1: TStatusBar;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

Для связки исходного кода с формой приложения, которая содержит в себе все перечисленные выше компоненты, требуется ее объявить, как это делается с обычными переменными.

Var
Form1: TForm1;

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

S,o:integer;
m,a:array [1..9] of integer;

Программа имеет три процедуры. Первая процедура прячет ненужные элементы по нажатии кнопки «2х2» если они показаны.

procedure TForm1.Button1Click(Sender: TObject);

begin

S:=0;

edit3.Visible:=false;

edit7.Visible:=false;

edit9.Visible:=false;

edit10.Visible:=false;

edit11.Visible:=false;

edit19.Visible:=false;

edit23.Visible:=false;

edit25.Visible:=false;

edit26.Visible:=false;

edit27.Visible:=false;

end;

 

 

Вторая процедура выполняет противоположные действия. Скрытие и отображение элементов соответствует выбранным размерам матрицы:

procedure TForm1.Button2Click(Sender: TObject);

begin

S:=3;

edit3.Visible:=true;

edit7.Visible:=true;

edit9.Visible:=true;

edit10.Visible:=true;

edit11.Visible:=true;

edit19.Visible:=true;

edit23.Visible:=true;

edit25.Visible:=true;

edit26.Visible:=true;

edit27.Visible:=true;

end;

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

Третья и самая главная процедура вызывает расчет определителя по формуле, расчет транспонированной матрицы алгебраических дополнений, считывание значений и вывод расчетов в окно программы. Ее мы рассмотрим более подробно. Процедуру можно условно разделить на две части. Обе части – это операторы условий. В случае если S равна нулю, то выполняется расчет матрицы второго порядка, второе условие – S принимает значение равное трем и программа рассчитывает матрицу третьего порядка. Так как переменная может иметь только два значения, то в блоке if then else третий оператор будет отсутствовать. Для расчета матриц 3-го порядка мы введем переменные, для записи промежуточных значений при расчете определителя. Далее представлен код выполняющий расчеты матрицы второго порядка. Во первых, код срабатывает только если s=0:

if s=0 then begin

Во вторых, программа записывает значения элементов матрицы в массив а:

a[1]:=strtoint(edit1.Text);

a[2]:=strtoint(edit5.Text);

a[3]:=strtoint(edit2.Text);

a[4]:=strtoint(edit6.Text);

Далее рассчитывается и выводится на экран определитель:

o:=a[1]*a[4]-(a[3]*a[2]);

Label3.caption:=inttostr(o);

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

if o=0

then statusbar1.simpletext:=('Нет обратной матрицы')

else begin

statusbar1.simpletext:=('Выберите порядок и введите значения');

Edit17.Text:=inttostr(a[4]);

edit18.Text:=inttostr(-a[3]);

Edit21.Text:=inttostr(-a[2]);

edit22.Text:=inttostr(a[1]);

end;

end;

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

if s=3 then begin

a[1]:=strtoint(edit1.Text);

a[2]:=strtoint(edit5.Text);

a[3]:=strtoint(edit9.Text);

a[4]:=strtoint(edit2.Text);

a[5]:=strtoint(edit6.Text);

a[6]:=strtoint(edit10.Text);

a[7]:=strtoint(edit3.Text);

a[8]:=strtoint(edit7.Text);

a[9]:=strtoint(edit11.Text);

p1:=a[1]*(a[5]*a[9]-a[6]*a[8]);

p2:=-a[2]*(a[4]*a[9]-a[6]*a[7]);

p3:=a[3]*(a[4]*a[8]-a[5]*a[7]);

o:=p1+p2+p3;

Label3.caption:=inttostr(o);

Далее, как и в первом случае проверяется условие, что определитель не равен нулю. В случае его не нулевого значения выполняется код в операторе else:

if o=0

then statusbar1.simpletext:=('Нет обратной матрицы')

Рассмотрим более подробно расчет обратной матрицы. Сначала возвращается текст инструкции на экран:

else begin

statusbar1.simpletext:=('Выберите порядок и введите значения');

Далее программа рассчитывает все значения элементов матрицы алгебраических дополнений. Некоторые элементы имеют противоположные по знаку значения в итоговой матрице, поэтому знак меняется сразу при их расчете, выражение берется в скобки и перед ними ставится знак минуса. Значения записываются в массив M:

m[1]:=a[5]*a[9]-a[6]*a[8];

m[2]:=-(a[4]*a[9]-a[6]*a[7]);

m[3]:=a[4]*a[8]-a[5]*a[7];

m[4]:=-(a[2]*a[9]-a[3]*a[8]);

m[5]:=a[1]*a[9]-a[3]*a[7];

m[6]:=-(a[1]*a[8]-a[2]*a[7]);

m[7]:=a[2]*a[6]-a[3]*a[5];

m[8]:=-(a[1]*a[6]-a[3]*a[4]);

m[9]:=a[1]*a[5]-a[2]*a[4];

Далее значения выводятся на экран в соответствующие им места, с учетом того, что мы уже транспонировали матрицу:

еdit17.Text:=inttostr(m[1]);

еdit18.Text:=inttostr(m[2]);

edit19.Text:=inttostr(m[3]);

edit21.Text:=inttostr(m[4]);

edit22.Text:=inttostr(m[5]);

edit23.Text:=inttostr(m[6]);

edit25.Text:=inttostr(m[7]);

edit26.Text:=inttostr(m[8]);

edit27.Text:=inttostr(m[9]);

end;

end;

end;

В результате разработки мы получили исправно работающую программу и протестировали ее. Были рассчитаны несколько обратных матриц, как в ручную, так и с помощью программы. В отличии от «живого» расчета, программный дает только правильные результаты.


Рисунок 4. Расчет обратной матрицы третьего порядка.


Рисунок 5. Расчет обратной матрицы второго порядка.


Рисунок 6. Определитель равен нулю.

Итак, в данном параграфе нами была разработана программа расчета обратной матрицы. Данная программа протестирована и имеет большой потенциал. С ее помощью можно не просто рассчитать обратную матрицу, но и увидеть значение определителя. Так же программа может пригодиться для нахождения миноров. Программа имеет «дружелюбный» пользовательский интерфейс с инструкциями к ее использованию и комментариями о ходе решения. Приложение написано таким образом, что имеет перспективы развития и дальнейших разработок для операций большего спектра над матрицами.

 

 

Заключение

 

Итак, в ходе данной работы мы рассмотрели основные виды матриц и операции над ними. В математике существует большое количество различных матриц и операций с ними. Рассматривать их можно бесконечно, поэтому мы решили остановиться на самой распространённой операции, так как она имеет наибольшую актуальность. Для большей функциональности программы были рассмотрены матрицы разного порядка.

Так же, нами были рассмотрены основные принципы работы в среде программирования Lazarus. Были изучены все основные компоненты среды программирования, инструментарий, управление программой. Основные принципы взаимодействия всех этих компонентов. Была написана и протестирована простая программа для практического понимания изученного материала.

В результате, нами была разработана программа расчета обратной матрицы. Данная программа протестирована и имеет большой потенциал. С ее помощью можно не просто рассчитать обратную матрицу, но и увидеть значение определителя. Так же программа может пригодиться для нахождения миноров. Программа имеет «дружелюбный» пользовательский интерфейс с инструкциями к ее использованию и комментариями о ходе решения. Приложение написано таким образом, что имеет перспективы развития и дальнейших разработок для операций большего спектра над матрицами.

 

 


Дата добавления: 2018-05-12; просмотров: 982; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!