Результат решения задачи - Методика оценки устойчивости линейных динамических систем по критерию В. И. Зубова

Из данной матрицы А необходимо вычислить матрицу В по формуле. Результат решения приведен ниже

А=

Действия при вычислении формулы: вычитаем из единичной матрицы Е исходную матрицу А. Обозначим как матрица G

G=- =

Находим матрицу обратную полученной при помощи ее определителя. Нахождение определителя приведено ниже;

=1,9*-3,1*+

+0,2*=31,447

Находим дополнение для каждого элемента полученной матрицы.

G11==19,15

G 12==1,88

G 13==4,45

G 21==13,01

G 22==8,01

G 23==0,56

G 31==9,22

G 32==6,16

G 33==7,89

Получаем матрицу из дополнений.

GV=

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

(GV)Т=

=G-1 ==

Вычитаем из единичной матрицы обратную умноженную на число 2. Тем самым получаем формулу искомую матрицу B.

В=-2*=

После нахождения матрицы В необходимо вычислить ее нормы по формулам приведенным в теоретическом описании.

А) Максимальная по сумме элементов строка.

=0,2179+0,8274+0,5864=1.6317

Б) Максимальный по сумме элементов столбец.

=0,8274+0,4906+0,0356=1.4764

В) Квадратный корень из суммы квадратов элементов матрицы

= 1.0686

Г) Максимальное значение элемента матрицы В

=0,5864

Условием асимптотической устойчивости системы является условие

,

Которое наблюдается в одном случае.

=0,5864 <1

Но для надежности возведем в квадрат каждый элемент матрицы В и заново вычислим нормы.

В^2=

А) Максимальная по сумме элементов строка.

=0,0783+0,3535+0,3173=0,7491

Б) Максимальный по сумме элементов столбец.

=0,1598+0,3173+0,4281= 0,9052

В) Квадратный корень из суммы квадратов элементов матрицы

= 0,5813

Г) Максимальное значение элемента матрицы В

=0,4281

В данном случае все нормы матрицы меньше единицы, что является условием асимптотической устойчивости системы.

Полученные выше значения выражений, вычислены в математической программе MatLab. Исходный код представлен в приложении 3. Эти значения могут отличатся от полученных в результате любого другого способа вычисления в связи с тем, что MatLab более профессионально решает даные выражения. В написанной мной программе в независимости от того, что алгоритм решения соблюдался, были замечены некоторые несоответствия, однако они не повлияли на определение окончательного результата исследования. Итоговые данные приведены на рисунках 1-3.

первое действие

Рисунок 1 Первое действие

нахождение обратной матрицы

Рисунок 2 Нахождение обратной матрицы

окончательные вычисления

Рисунок 3 Окончательные вычисления

Список литературы

    1. Бессекерский В. А., Попов Е. П. Теория систем автоматического регулирования.- М: Наука, 1972. - 767 с. 2. Меркин Д. Р. Введение в теорию устойчивости движения. - М.: Наука, 1981.-312с. 3. Фельдбаум А. А., Бутковский А. Г. Методы теории автоматического управления. - М.: Наука, 1971. - 743с. 4. Цыпкин Я. З. Основы теории автоматического управления. - М.: Наука, 1977. - 559с. 5. Демидович Б. П., Марон И. А. Основы вычислительной математики. - М.: Наука, 1970. - 659с.

Приложение 1

Описание процедур.

Модуль Skoba. pas

Procedure tform1.norm1;

Данная процедура вычисляет первую норму матрицы. Локальные переменные приведены ниже в таблице 1.

Алгоритм.

Переменной n1 присваиваем сумму элементов первой строки.

Переменной n2 присваиваем сумму элементов второй строки.

Переменной n3 присваиваем сумму элементов третьей строки.

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

Таблица 1 Локальные переменные

Идентификатор

Тип

Назначение

N1

Extended

Сумма элементов первой строки

N2

Extended

Сумма элементов второй строки

N3

Extended

Сумма элементов третьей строки

Procedure tform1.norm2;

Данная процедура вычисляет вторую норму матрицы. Локальные переменные приведены ниже в таблице 2.

Алгоритм. Переменной n1 присваиваем сумму элементов первого столбца. Переменной n2 присваиваем сумму элементов второго столбца.

Переменной n3 присваиваем сумму элементов третьего столбца.

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

Таблица 2 Локальные переменные

Идентификатор

Тип

Назначение

N1

Extended

Сумма элементов первого столбца

N2

Extended

Сумма элементов второго столбца

N3

Extended

Сумма элементов третьего столбца

Procedure tform1.norm3;

Данная процедура вычисляет третью норму матрицы. Локальная переменная приведена ниже в таблице 3.

Алгоритм.

Переменной n присваиваем значение формулы, по которой вычисляется данная матрица.

Выводим ее значение в текстовое поле.

Таблица 3 Локальные переменные

Идентификатор

Тип

Назначение

N

Extended

Квадратный корень из суммы квадратов элементов матрицы

Procedure tform1.norm4;

Данная процедура вычисляет четвертую норму матрицы. Локальные переменные приведены ниже в таблице 4.

Алгоритм. Заносим значения элементов матрицы в двумерный массив n. Производим сортировку массива и наименьшее значение выводим в текстовое поле.

Таблица 4 Локальные переменные

Идентификатор

Тип

Назначение

Max

Extended

Элемент матрицы

N

Array[0..2,0..2] of extended;

Двумерный массив применяемый для сортировки элементов

Procedure TForm1.FormCreate(Sender: TObject);

Процедура запускается при создании окна и прописывает в элементах StringGrid1 и StringGrid3 начальную матрицу и единичную, необходимую при решении, соответственно. Процедура содержит входную переменную Sender - тип tobject, этот параметр определяет, какой объект программы вызывает данную процедуру.

Procedure TForm1.RadioGroup1Click(Sender: TObject);

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

Procedure TForm1.Button6Click(Sender: TObject);

Процедура закрывает программу при подтверждении появляющегося сообщения.

Procedure TForm1.Button1Click(Sender: TObject);

Процедура вычисляет разность единичной и начальной матрицы.

Procedure TForm1.Button2Click(Sender: TObject);

Процедура вычисляет обратную матрицу, путем деления каждого элемента матрицы полученной в процедуре RadioGroup1Click на определитель исходной матрицы.

Procedure TForm1.Button5Click(Sender: TObject);

Вычисляет определитель матрицы.

Procedure TForm1.Button3Click(Sender: TObject);

Умножает на число 2 обратную матрицу.

Procedure TForm1.Button4Click(Sender: TObject);

Вычитает из единичной матрицы, матрицу, полученную в приведенных выше вычислениях. Тем самым вычисляем необходимую формулу.

Procedure TForm1.SpeedButton1Click(Sender: TObject);

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

Procedure TForm1.Button7Click(Sender: TObject);

Возводит каждый член матрицы в квадрат. При повторном нажатии возводит каждый член полученной матрицы в квадрат и так далее.

Procedure TForm1.SpeedButton2Click(Sender: TObject);

Процедура вычисляет нормы матрицы и выводит итог исследования.

Алгоритм.

Запускаем по очереди все процедуры вычисления норм.

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

В обратном случае выводится сообщение, данная система асимптотически не устойчива. Необходимо возвести в квадрат каждый член матрицы и вычислить нормы по новой, до тех пор пока хотя бы одна не станет меньше единицы.

Procedure TForm1.Image1Click(Sender: TObject);

Procedure TForm1.Image2Click(Sender: TObject);

Procedure TForm1.Image3Click(Sender: TObject);

Procedure TForm1.Image4Click(Sender: TObject);

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

Глобальные переменные, используемы в программе, приведены в таблице 5.

Таблица 5 Глобальные переменные

Идентификатор

Тип

Назначение

Form1

TForm1

Идентификатор формы приложения

X

Integer

Номер строки матрицы

Y

Integer

Номер столбца матрицы

G11

Extended

Дополнение первого элемента матрицы (Е-А)

G12

Extended

Дополнение второго элемента матрицы (Е-А)

G13

Extended

Дополнение третьего элемента матрицы (Е-А)

G21

Extended

Дополнение четвертого элемента матрицы (Е-А)

G22

Extended

Дополнение пятого элемента матрицы (Е-А)

G23

Extended

Дополнение шестого элемента матрицы (Е-А)

G31

Extended

Дополнение седьмого элемента матрицы (Е-А)

G32

Extended

Дополнение восьмого элемента матрицы (Е-А)

G33

Extended

Дополнение девятого элемента матрицы (Е-А)

Приложение 2

Листинг программы.

Модуль Skoba. pas

Unit Skoba;

Interface

Uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Grids, StdCtrls, Buttons, ExtCtrls, jpeg;

Type

TForm1 = class(TForm)

GroupBox1: TGroupBox;

StringGrid1: TStringGrid;

GroupBox2: TGroupBox;

StaticText1: TStaticText;

GroupBox3: TGroupBox;

StringGrid2: TStringGrid;

SpeedButton1: TSpeedButton;

Bevel1: TBevel;

RadioGroup1: TRadioGroup;

Edit1: TEdit;

Label1: TLabel;

GroupBox4: TGroupBox;

Button1: TButton;

StringGrid4: TStringGrid;

GroupBox5: TGroupBox;

GroupBox6: TGroupBox;

GroupBox7: TGroupBox;

StringGrid5: TStringGrid;

StringGrid6: TStringGrid;

Button2: TButton;

GroupBox8: TGroupBox;

StringGrid7: TStringGrid;

Button3: TButton;

GroupBox9: TGroupBox;

StringGrid8: TStringGrid;

Button4: TButton;

StringGrid3: TStringGrid;

GroupBox10: TGroupBox;

StringGrid9: TStringGrid;

Button5: TButton;

Bevel2: TBevel;

Label2: TLabel;

Image1: TImage;

Image2: TImage;

Image3: TImage;

Image4: TImage;

Edit2: TEdit;

Edit3: TEdit;

Edit4: TEdit;

Edit5: TEdit;

SpeedButton2: TSpeedButton;

Label3: TLabel;

Button6: TButton;

Memo1: TMemo;

Memo2: TMemo;

Button7: TButton;

Bevel3: TBevel;

Label4: TLabel;

Procedure FormCreate(Sender: TObject);

Procedure RadioGroup1Click(Sender: TObject);

Procedure Button6Click(Sender: TObject);

Procedure Button1Click(Sender: TObject);

Procedure Button2Click(Sender: TObject);

Procedure Button5Click(Sender: TObject);

Procedure Button3Click(Sender: TObject);

Procedure Button4Click(Sender: TObject);

Procedure SpeedButton1Click(Sender: TObject);

Procedure SpeedButton2Click(Sender: TObject);

Procedure Image3Click(Sender: TObject);

Procedure norm1;

Procedure norm2;

Procedure norm3;

Procedure norm4;

Procedure Image4Click(Sender: TObject);

Procedure Image1Click(Sender: TObject);

Procedure Image2Click(Sender: TObject);

Procedure Button7Click(Sender: TObject);

Private

{ Private declarations }

Public

{ Public declarations }

End;

Var

Form1: TForm1;

X, y:integer;

G11,g12,g13,g21,g22,g23,g31,g32,g33:extended;

Implementation

{$R *.dfm}

Procedure tform1.norm1;

Var

N1,n2,n3:extended;

Begin

N1:=abs(strtofloat(stringgrid2.Cells[0,0]))+abs(strtofloat(stringgrid2.Cells[1,0]))+abs(strtofloat(stringgrid2.Cells[2,0]));

N3:=abs(strtofloat(stringgrid2.Cells[0,2]))+abs(strtofloat(stringgrid2.Cells[1,2]))+abs(strtofloat(stringgrid2.Cells[2,2]));

N2:=abs(strtofloat(stringgrid2.Cells[0,1]))+abs(strtofloat(stringgrid2.Cells[1,1]))+abs(strtofloat(stringgrid2.Cells[2,1]));

If (n1>n2) and (n1>n3) then

Edit2.Text:=floattostr(n1);

If (n2>n1) and (n2>n3) then

Edit2.Text:=floattostr(n2);

If (n3>n2) and (n3>n1) then

Edit2.Text:=floattostr(n3);

End;

Procedure tform1.norm2;

Var

N1,n2,n3:extended;

Begin

N1:=abs(strtofloat(stringgrid2.Cells[0,0]))+abs(strtofloat(stringgrid2.Cells[0,1]))+abs(strtofloat(stringgrid2.Cells[0,2]));

N3:=abs(strtofloat(stringgrid2.Cells[1,0]))+abs(strtofloat(stringgrid2.Cells[1,1]))+abs(strtofloat(stringgrid2.Cells[1,2]));

N2:=abs(strtofloat(stringgrid2.Cells[2,0]))+abs(strtofloat(stringgrid2.Cells[2,1]))+abs(strtofloat(stringgrid2.Cells[2,2]));

If (n1>n2) and (n1>n3) then

Edit3.Text:=floattostr(n1);

If (n2>n1) and (n2>n3) then

Edit3.Text:=floattostr(n2);

If (n3>n2) and (n3>n1) then

Edit3.Text:=floattostr(n3);

End;

Procedure tform1.norm3;

Var

N:extended;

Begin

N:=sqrt(sqr(strtofloat(stringgrid2.Cells[0,0]))+sqr(strtofloat(stringgrid2.Cells[0,1]))+sqr(strtofloat(stringgrid2.Cells[0,2]))+

Sqr(strtofloat(stringgrid2.Cells[1,0]))+sqr(strtofloat(stringgrid2.Cells[1,1]))+sqr(strtofloat(stringgrid2.Cells[1,2]))+

Sqr(strtofloat(stringgrid2.Cells[2,0]))+sqr(strtofloat(stringgrid2.Cells[2,1]))+sqr(strtofloat(stringgrid2.Cells[2,2])));

Edit4.Text:=floattostr(n);

End;

Procedure tform1.norm4;

Var

Max:extended;

N:array[0..2,0..2] of extended;

Begin

For x:=0 to StringGrid2.ColCount-1 do

For y:=0 to StringGrid2.RowCount-1 do

N[x, y]:=strtofloat(StringGrid2.Cells[x, y]);

Max:=n[0,0];

For x:=0 to StringGrid2.ColCount-1 do

For y:=0 to StringGrid2.RowCount-1 do

If max<n[x, y] then

Max:=n[x, y];

Edit5.Text:=floattostr(max);

End;

-------------

Procedure TForm1.FormCreate(Sender: TObject);

Begin

StringGrid1.Cells[0,0]:='-0,9';

StringGrid1.Cells[1,0]:='3,1';

StringGrid1.Cells[2,0]:='-0,2';

StringGrid1.Cells[0,1]:='-0,4';

StringGrid1.Cells[1,1]:='-2,5';

StringGrid1.Cells[2,1]:='3,2';

StringGrid1.Cells[0,2]:='1,1';

StringGrid1.Cells[1,2]:='-1,5';

StringGrid1.Cells[2,2]:='-3,1';

StringGrid3.Cells[0,0]:='1';

StringGrid3.Cells[1,0]:='0';

StringGrid3.Cells[2,0]:='0';

StringGrid3.Cells[0,1]:='0';

StringGrid3.Cells[1,1]:='1';

StringGrid3.Cells[2,1]:='0';

StringGrid3.Cells[0,2]:='0';

StringGrid3.Cells[1,2]:='0';

StringGrid3.Cells[2,2]:='1';

End;

Procedure TForm1.RadioGroup1Click(Sender: TObject);

Begin

Case RadioGroup1.ItemIndex of

0: begin

GroupBox4.Visible:=true;

GroupBox5.Visible:=true;

Stringgrid4.Visible:=true;

Button1.Visible:=true;

GroupBox6.Visible:=false;

GroupBox7.Visible:=false;

Button2.Visible:=false;

GroupBox8.Visible:=false;

GroupBox9.Visible:=false;

Button3.Visible:=false;

Button4.Visible:=false;

GroupBox10.Visible:=false;

Edit1.Visible:=false;

Button5.Visible:=false;

Label1.Visible:=false;

Memo1.Visible:=false;

End;

1:begin

Try

------------------------------Вычисляем дополнения ----------------------------------

G11:=strtofloat(stringgrid4.cells[1,1])*strtofloat(stringgrid4.cells[2,2])-strtofloat(stringgrid4.cells[2,1])*strtofloat(stringgrid4.cells[1,2]);

G12:=strtofloat(stringgrid4.cells[0,1])*strtofloat(stringgrid4.cells[2,2])-strtofloat(stringgrid4.cells[2,1])*strtofloat(stringgrid4.cells[0,2]);

G13:=strtofloat(stringgrid4.cells[0,1])*strtofloat(stringgrid4.cells[1,2])-strtofloat(stringgrid4.cells[1,1])*strtofloat(stringgrid4.cells[0,2]);

G21:=strtofloat(stringgrid4.cells[1,0])*strtofloat(stringgrid4.cells[2,2])-strtofloat(stringgrid4.cells[2,0])*strtofloat(stringgrid4.cells[1,2]);

G22:=strtofloat(stringgrid4.cells[0,0])*strtofloat(stringgrid4.cells[2,2])-strtofloat(stringgrid4.cells[2,0])*strtofloat(stringgrid4.cells[0,2]);

G23:=strtofloat(stringgrid4.cells[0,0])*strtofloat(stringgrid4.cells[1,2])-strtofloat(stringgrid4.cells[1,0])*strtofloat(stringgrid4.cells[0,2]);

G31:=strtofloat(stringgrid4.cells[1,0])*strtofloat(stringgrid4.cells[2,1])-strtofloat(stringgrid4.cells[2,0])*strtofloat(stringgrid4.cells[1,1]);

G32:=strtofloat(stringgrid4.cells[0,0])*strtofloat(stringgrid4.cells[2,1])-strtofloat(stringgrid4.cells[2,0])*strtofloat(stringgrid4.cells[0,1]);

G33:=strtofloat(stringgrid4.cells[0,0])*strtofloat(stringgrid4.cells[1,1])-strtofloat(stringgrid4.cells[1,0])*strtofloat(stringgrid4.cells[0,1]);

------------------------------Вычислили дополнения ----------------------------------

StringGrid5.Cells[0,0]:=floattostr(g11);

StringGrid5.Cells[1,0]:=floattostr(-g21);

StringGrid5.Cells[2,0]:=floattostr(g31);

StringGrid5.Cells[0,1]:=floattostr(-g12);

StringGrid5.Cells[1,1]:=floattostr(g22);

StringGrid5.Cells[2,1]:=floattostr(-g32);

StringGrid5.Cells[0,2]:=floattostr(g13);

StringGrid5.Cells[1,2]:=floattostr(-g23);

StringGrid5.Cells[2,2]:=floattostr(g33);

If stringGrid5.cells[1,1]='' then

MessageBox(0,'Сделайте предыдущее действие','Внимание',MB_OK or MB_iconinformation);

Memo1.visible:=true;

Memo1.Clear;

Memo1.lines. Add('Для того, чтобы вычислить обратную матрицу, необходимо разделить каждый член полученной транспонированой матрицы на определитель исходной');

GroupBox6.Visible:=true;

GroupBox7.Visible:=true;

Button2.Visible:=true;

GroupBox4.Visible:=false;

GroupBox5.Visible:=false;

Stringgrid4.Visible:=false;

Button1.Visible:=false;

GroupBox8.Visible:=false;

GroupBox9.Visible:=false;

Button3.Visible:=false;

GroupBox10.Visible:=false;

Button4.Visible:=false;

Edit1.Visible:=true;

Button5.Visible:=true;

Label1.Visible:=true;

Except

MessageBox(0,'Сделайте предыдущее действие','Внимание',MB_OK or MB_iconinformation);

End

End;

2: begin

GroupBox8.Visible:=true;

GroupBox9.Visible:=true;

Button3.Visible:=true;

GroupBox10.Visible:=false;

Button4.Visible:=false;

Edit1.Visible:=false;

Button5.Visible:=false;

Label1.Visible:=false;

If stringGrid7.cells[1,1]='' then

MessageBox(0,'Сделайте предидущее действие','Внимание',MB_OK or MB_iconinformation);

Memo1.visible:=false;

End;

3: begin

GroupBox4.Visible:=true;

Button4.Visible:=true;

GroupBox9.Visible:=true;

GroupBox5.Visible:=false;

GroupBox6.Visible:=false;

GroupBox8.Visible:=false;

GroupBox10.Visible:=true;

Edit1.Visible:=false;

Button5.Visible:=false;

Label1.Visible:=false;

If stringGrid8.cells[1,1]='' then

MessageBox(0,'Сделайте предидущее действие','Внимание',MB_OK or MB_iconinformation);

Memo1.visible:=false;

End;

End;

End;

Procedure TForm1.Button6Click(Sender: TObject);

Var

Btn:integer;

Begin

Btn:=messageBox(0,'Закрыть программу.','Внимание',mb_YESNO);

If btn=IDYes then

Close;

End;

{вычитание матриц вывод E-A}

Procedure TForm1.Button1Click(Sender: TObject);

Begin

For x:=0 to StringGrid4.ColCount-1 do

For y:=0 to StringGrid4.RowCount-1 do

StringGrid4.Cells[x, y]:=floattostr(strtofloat(StringGrid3.Cells[x, y])-strtofloat(StringGrid1.Cells[x, y]));

End;

Procedure TForm1.Button2Click(Sender: TObject);

Begin

If edit1.text='' then

MessageBox(0,'Сначала вычислите определитель матрицы.','Внимание',MB_OK or MB_iconinformation)

Else

Try

For x:=0 to StringGrid6.ColCount-1 do

For y:=0 to StringGrid6.RowCount-1 do

StringGrid6.Cells[x, y]:=floattostr( strtofloat(StringGrid5.Cells[x, y])/(strtofloat(stringgrid4.Cells[0,0])*(strtofloat(stringgrid4.cells[1,1])*strtofloat(stringgrid4.cells[2,2])-strtofloat(stringgrid4.cells[2,1])*strtofloat(stringgrid4.cells[1,2])) -

Strtofloat(stringgrid4.Cells[1,0])*(strtofloat(stringgrid4.cells[0,1])*strtofloat(stringgrid4.cells[2,2])-strtofloat(stringgrid4.cells[2,1])*strtofloat(stringgrid4.cells[0,2])) +

Strtofloat(stringgrid4.Cells[2,0])*(strtofloat(stringgrid4.cells[0,1])*strtofloat(stringgrid4.cells[1,2])-strtofloat(stringgrid4.cells[1,1])*strtofloat(stringgrid4.cells[0,2]))));

Except

MessageBox(0,'Сделайте предидущее действие','Внимание',MB_OK or MB_iconinformation);

End;

For x:=0 to StringGrid7.ColCount-1 do

For y:=0 to StringGrid7.RowCount-1 do

StringGrid7.Cells[x, y]:=StringGrid6.Cells[x, y];

End;

{определитель матрицы}

Procedure TForm1.Button5Click(Sender: TObject);

Begin

Try

Edit1.Text:= floattostr(strtofloat(stringgrid4.Cells[0,0])*(strtofloat(stringgrid4.cells[1,1])*strtofloat(stringgrid4.cells[2,2])-

Strtofloat(stringgrid4.cells[2,1])*strtofloat(stringgrid4.cells[1,2])) -

Strtofloat(stringgrid4.Cells[1,0])*(strtofloat(stringgrid4.cells[0,1])*strtofloat(stringgrid4.cells[2,2])-

Strtofloat(stringgrid4.cells[2,1])*strtofloat(stringgrid4.cells[0,2])) +

Strtofloat(stringgrid4.Cells[2,0])*(strtofloat(stringgrid4.cells[0,1])*strtofloat(stringgrid4.cells[1,2])-

Strtofloat(stringgrid4.cells[1,1])*strtofloat(stringgrid4.cells[0,2])));

Except

MessageBox(0,'Нет матрицы. Сделайте предидущее действие.','Внимание',MB_OK or MB_iconinformation);

End;

End;

Procedure TForm1.Button3Click(Sender: TObject);

Begin

Try

For x:=0 to StringGrid8.ColCount-1 do

For y:=0 to StringGrid8.RowCount-1 do

StringGrid8.Cells[x, y]:=floattostr(strtofloat(StringGrid7.Cells[x, y])*2);

Except

MessageBox(0,'Сделайте предидущее действие','Внимание',MB_OK or MB_iconinformation);

End;

End;

Procedure TForm1.Button4Click(Sender: TObject);

Begin

Try

For x:=0 to StringGrid9.ColCount-1 do

For y:=0 to StringGrid9.RowCount-1 do

StringGrid9.Cells[x, y]:=floattostr(strtofloat(StringGrid3.Cells[x, y])-strtofloat(StringGrid8.Cells[x, y]));

Except

MessageBox(0,'Сделайте предидущее действие','Внимание',MB_OK or MB_iconinformation);

End;

End;

Procedure TForm1.SpeedButton1Click(Sender: TObject);

Begin

For x:=0 to StringGrid4.ColCount-1 do

For y:=0 to StringGrid4.RowCount-1 do

StringGrid4.Cells[x, y]:=floattostr(strtofloat(StringGrid3.Cells[x, y])-strtofloat(StringGrid1.Cells[x, y]));

------------------------------Вычисляем дополнения ----------------------------------

G11:=strtofloat(stringgrid4.cells[1,1])*strtofloat(stringgrid4.cells[2,2])-strtofloat(stringgrid4.cells[2,1])*strtofloat(stringgrid4.cells[1,2]);

G12:=strtofloat(stringgrid4.cells[0,1])*strtofloat(stringgrid4.cells[2,2])-strtofloat(stringgrid4.cells[2,1])*strtofloat(stringgrid4.cells[0,2]);

G13:=strtofloat(stringgrid4.cells[0,1])*strtofloat(stringgrid4.cells[1,2])-strtofloat(stringgrid4.cells[1,1])*strtofloat(stringgrid4.cells[0,2]);

G21:=strtofloat(stringgrid4.cells[1,0])*strtofloat(stringgrid4.cells[2,2])-strtofloat(stringgrid4.cells[2,0])*strtofloat(stringgrid4.cells[1,2]);

G22:=strtofloat(stringgrid4.cells[0,0])*strtofloat(stringgrid4.cells[2,2])-strtofloat(stringgrid4.cells[2,0])*strtofloat(stringgrid4.cells[0,2]);

G23:=strtofloat(stringgrid4.cells[0,0])*strtofloat(stringgrid4.cells[1,2])-strtofloat(stringgrid4.cells[1,0])*strtofloat(stringgrid4.cells[0,2]);

G31:=strtofloat(stringgrid4.cells[1,0])*strtofloat(stringgrid4.cells[2,1])-strtofloat(stringgrid4.cells[2,0])*strtofloat(stringgrid4.cells[1,1]);

G32:=strtofloat(stringgrid4.cells[0,0])*strtofloat(stringgrid4.cells[2,1])-strtofloat(stringgrid4.cells[2,0])*strtofloat(stringgrid4.cells[0,1]);

G33:=strtofloat(stringgrid4.cells[0,0])*strtofloat(stringgrid4.cells[1,1])-strtofloat(stringgrid4.cells[1,0])*strtofloat(stringgrid4.cells[0,1]);

------------------------------Вычислили дополнения ----------------------------------

StringGrid5.Cells[0,0]:=floattostr(g11);

StringGrid5.Cells[1,0]:=floattostr(-g21);

StringGrid5.Cells[2,0]:=floattostr(g31);

StringGrid5.Cells[0,1]:=floattostr(-g12);

StringGrid5.Cells[1,1]:=floattostr(g22);

StringGrid5.Cells[2,1]:=floattostr(-g32);

StringGrid5.Cells[0,2]:=floattostr(g13);

StringGrid5.Cells[1,2]:=floattostr(-g23);

StringGrid5.Cells[2,2]:=floattostr(g33);

For x:=0 to StringGrid7.ColCount-1 do

For y:=0 to StringGrid7.RowCount-1 do

StringGrid7.Cells[x, y]:=floattostr( strtofloat(StringGrid5.Cells[x, y])/(strtofloat(stringgrid4.Cells[0,0])*(strtofloat(stringgrid4.cells[1,1])*strtofloat(stringgrid4.cells[2,2])-strtofloat(stringgrid4.cells[2,1])*strtofloat(stringgrid4.cells[1,2])) -

Strtofloat(stringgrid4.Cells[1,0])*(strtofloat(stringgrid4.cells[0,1])*strtofloat(stringgrid4.cells[2,2])-strtofloat(stringgrid4.cells[2,1])*strtofloat(stringgrid4.cells[0,2])) +

Strtofloat(stringgrid4.Cells[2,0])*(strtofloat(stringgrid4.cells[0,1])*strtofloat(stringgrid4.cells[1,2])-strtofloat(stringgrid4.cells[1,1])*strtofloat(stringgrid4.cells[0,2]))));

For x:=0 to StringGrid8.ColCount-1 do

For y:=0 to StringGrid8.RowCount-1 do

StringGrid8.Cells[x, y]:=floattostr(strtofloat(StringGrid7.Cells[x, y])*2);

For x:=0 to StringGrid9.ColCount-1 do

For y:=0 to StringGrid9.RowCount-1 do

StringGrid2.Cells[x, y]:=floattostr(strtofloat(StringGrid3.Cells[x, y])-strtofloat(StringGrid8.Cells[x, y]));

End;

Procedure TForm1.SpeedButton2Click(Sender: TObject);

Begin

Try

Norm1;

Norm2;

Norm3;

Norm4;

Button7.Visible:=true;

Memo2.Visible:=true;

If (abs(strtofloat(edit3.Text))<1) or (abs(strtofloat(edit3.Text))<1) or (abs(strtofloat(edit4.Text))<1) or (abs(strtofloat(edit5.Text))<1) then

Begin

Memo2.Clear;

Memo2.lines. Add('Данная система асимптотически устойчива.');

End

Else

Begin

Memo2.Clear;

Memo2.lines. Add('Данная система асимптотически не устойчива. Необходимо возвести в квадрат каждый член матрицы и вычислить нормы по новой, до тех пор пока хотя бы одна не станет меньше единицы.');

End

Except

MessageBox(0,'Сначала вычислите матрицу.','Внимание',MB_OK or MB_iconinformation);

End;

End;

Procedure TForm1.Image3Click(Sender: TObject);

Begin

Try

Norm1;

Except

MessageBox(0,'Сначала вычислите матрицу.','Внимание',MB_OK or MB_iconinformation);

End;

End;

Procedure TForm1.Image4Click(Sender: TObject);

Begin

Try

Norm2;

Except

MessageBox(0,'Сначала вычислите матрицу.','Внимание',MB_OK or MB_iconinformation);

End;

End;

Procedure TForm1.Image1Click(Sender: TObject);

Begin

Try

Norm3;

Except

MessageBox(0,'Сначала вычислите матрицу.','Внимание',MB_OK or MB_iconinformation);

End;

End;

Procedure TForm1.Image2Click(Sender: TObject);

Begin

Try

Norm4;

Except

MessageBox(0,'Сначала вычислите матрицу.','Внимание',MB_OK or MB_iconinformation);

End;

End;

Procedure TForm1.Button7Click(Sender: TObject);

Begin

Try

For x:=0 to StringGrid2.ColCount-1 do

For y:=0 to StringGrid2.RowCount-1 do

StringGrid2.Cells[x, y]:=floattostr(sqr(strtofloat(StringGrid2.Cells[x, y])));

Except

MessageBox(0,'Сделайте предидущее действие','Внимание',MB_OK or MB_iconinformation);

End;

End;

End.

Приложение 3

Листинг вычисления в программе MatLab.

>> A=[-0.9 3.1 -0.2; -0.4 -2.5 3.2; 1.1 -1.5 -3.1]

A =

    -0.9000 3.1000 -0.2000 -0.4000 -2.5000 3.2000 1.1000 -1.5000 -3.1000

>> C=E-A

C =

    1.9000 -3.1000 0.2000 0.4000 3.5000 -3.2000 -1.1000 1.5000 4.1000

>> q=det(C)

Q =

31.4470

>> A12=[C(2,1) C(2,3); C(3,1) C(3,3)]

A12 =

    0.4000 -3.2000 -1.1000 4.1000

>> A13=[C(2,1) C(2,2); C(3,1) C(3,2)]

A13 =

    0.4000 3.5000 -1.1000 1.5000

>> A21=[C(1,2) C(1,3); C(3,2) C(3,3)]

A21 =

    -3.1000 0.2000 1.5000 4.1000

>> A22=[C(1,1) C(1,3); C(3,1) C(3,3)]

A22 =

    1.9000 0.2000 -1.1000 4.1000

>> A23=[C(1,1) C(1,2); C(3,1) C(3,2)]

A23 =

    1.9000 -3.1000 -1.1000 1.5000

>> A31=[C(1,2) C(1,3); C(2,2) C(2,3)]

A31 =

    -3.1000 0.2000 3.5000 -3.2000

>> A32=[C(1,1) C(1,3); C(2,1) C(2,3)]

A32 =

    1.9000 0.2000 0.4000 -3.2000

>> A33=[C(1,1) C(1,2); C(2,1) C(2,2)]

A33 =

    1.9000 -3.1000 0.4000 3.5000

>> G=[det(A11) - det(A12) det(A13); - det(A21) det(A22) - det(A23); det(A31) - det(A32) det(A33)]

G =

    19.1500 1.8800 4.4500 13.0100 8.0100 0.5600 9.2200 6.1600 7.8900

>> T=[G(1,1) G(2,1) G(3,1); G(1,2) G(2,2) G(3,2); G(1,3) G(2,3) G(3,3)]

T =

    19.1500 13.0100 9.2200 1.8800 8.0100 6.1600 4.4500 0.5600 7.8900

>> O=T/q {Обратная матрица}

    O = 0.6090 0.4137 0.2932 0.0598 0.2547 0.1959 0.1415 0.0178 0.2509

>> B=E-2*O

B =

    -0.2179 -0.8274 -0.5864 -0.1196 0.4906 -0.3918 -0.2830 -0.0356 0.4982

>> norm(B,1)

Ans =

1.4764

>> norm(B)

Ans =

1.0686

>> norm(B, inf)

Ans =

1.6317

>> W=B^2 ///Возводим в квадрат

W =

    0.3124 -0.2047 0.1598 0.0783 0.3535 -0.3173 -0.0751 0.1990 0.4281

>> norm(W,1)

Ans =

0.9052

>> norm(W)

Ans =

0.5813

>> norm(W, inf)

Ans =

0.7491

>> O*C

Ans =

    1.0000 0.0000 0 0 1.0000 0 0 0 1.0000

Приложение 4

Проверка нахождения обратной матрицы

Для того чтобы проверить правильность нахождения обратной матрицы необходимо получить единичную матрицу при умножении начальной матрицы на ее обратную.

G*G-1=E

* =

Алгоритм умножения матриц таков: умножаем первую строчку первой матрицы на первый столбец второй матрицы по формуле:

Сij=Ai1*B1j+ Ai2*B2j+ Ai3*B3j+ . . . + Ain*Bnj

    1,9*0,609-3,1*0,058+0,2*0,1415=1 1,9*0,4137-3,1*0,2547+0,2*0, 0178=0 1.9 *0.2932-3.1*0.1959+0.2*0.2509=0 0.4 *0.609+3.5*0.0598-3.2*0.1415=0 0.4 *0.4137+3.5*0.2547-3.2*0.0178=1 0.4 *0.2932+3.5*0.1959-3.2*0.2509=0 -1.1*0.609+1.5*0.0598+4.1*0.1415=0 -1.1*0.4137+1.5*0.2547+4.1*0.0178=0 -1.1*0.2932+1.5*0.1959+4.1*0.2509=1

Похожие статьи




Результат решения задачи - Методика оценки устойчивости линейных динамических систем по критерию В. И. Зубова

Предыдущая | Следующая