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



 

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

Ниоднаполноценнаяпрограмманеобходитсябездокументацииилихотябыэлементарногодокумента«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: varS,o:integer;

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

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

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

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

unitUnit1;

{$modeobjfpc}{$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);

procedureButton3Click(Sender: TObject);

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

Var
Form1: TForm1;

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

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

Программа имеет три процедуры. Первая процедура прячет ненужные элементы по нажатии кнопки «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 принимает значение равное трем и программа рассчитывает матрицу третьего порядка. Так как переменная может иметь только два значения, то в блоке ifthenelseтретий оператор будет отсутствовать. Для расчета матриц 3-го порядка мы введем переменные, для записи промежуточных значений при расчете определителя. Далее представлен код выполняющий расчеты матрицы второго порядка. Во первых, код срабатывает только если s=0:

if s=0 thenbegin

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

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:=('Нетобратнойматрицы')

elsebegin

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:=('Нетобратнойматрицы')

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

elsebegin

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; просмотров: 290; Мы поможем в написании вашей работы!

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






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