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

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




👉🏻👉🏻👉🏻 ВСЯ ИНФОРМАЦИЯ ДОСТУПНА ЗДЕСЬ ЖМИТЕ 👈🏻👈🏻👈🏻



























































Вы можете узнать стоимость помощи в написании студенческой работы.


Помощь в написании работы, которую точно примут!

Похожие работы на - Программная реализация модального управления для линейных стационарных систем

Скачать Скачать документ
Информация о работе Информация о работе


Скачать Скачать документ
Информация о работе Информация о работе


Скачать Скачать документ
Информация о работе Информация о работе


Скачать Скачать документ
Информация о работе Информация о работе


Скачать Скачать документ
Информация о работе Информация о работе


Скачать Скачать документ
Информация о работе Информация о работе

Нужна качественная работа без плагиата?

Не нашел материал для своей работы?


Поможем написать качественную работу Без плагиата!

«Программная реализация модального управления для линейных стационарных систем»
1. Для объекта управления с математическим описанием
[pic], (1) [pic]- задано, где [pic] - n-мерный вектор состояния, [pic],
[pic]- матрица действительных коэффициентов,
[pic]- матрица действительных коэффициентов, найти управление в функции переменных состояния объекта, т.е.
[pic], (2) где[pic]- матрица обратной связи, такое, чтобы замкнутая система была
устойчивой.
2. Корни характеристического уравнения замкнутой системы
[pic] (3) должны выбираться по усмотрению (произвольно) с условием устойчивости
системы (3).
1. Разработать алгоритм решения поставленной задачи.
2. Разработать программу решения поставленной задачи с интерактивным экранным интерфейсом в системах Borland Pascal, Turbo Vision, Delphi - по выбору.
3. Разработать программу решения систем дифференциальных уравнений (1) и (3) с интерактивным экранным интерфейсом.
4. Разработать программу графического построения решений систем (1) и (3) с интерактивным экранным интерфейсом.
Наряду с общими методами синтеза оптимальных законов управления для
стационарных объектов всё большее применение находят методы, основанные на
решении задачи о размещении корней характеристического уравнения замкнутой
системы в желаемое положение. Этого можно добиться надлежащим выбором
матрицы обратной связи по состоянию. Решение указанной задачи является
предметом теории модального управления (термин связан с тем, что корням
характеристического уравнения соответствуют составляющие свободного
движения, называемые модами).
Соглашения:
. Задаваемый объект управления математически описывается уравнением
[pic], (1) где [pic] и [pic] - матрицы действительных коэффициентов,
[pic] - порядок системы (1).
. Обратная связь по состоянию имеет вид
[pic], (2) где[pic]- матрица обратной связи.
. Система с введенной обратной связью описывается уравнением
[pic] (3)
. Характеристическое уравнение системы (1) имеет вид
[pic] (4)
. Характеристическое уравнение системы (3) с задаваемыми (желаемыми) корнями [pic]имеет вид
Алгоритм:
1. Для исходной системы (1) составляем матрицу управляемости
[pic]
2. Обращаем матрицу [pic], т.е. вычисляем [pic]. Если [pic] не существует (т.е. матрица [pic] - вырожденная), то прекращаем вычисления: полное управление корнями характеристического уравнения (5) не возможно.
3. Вычисляем матрицу [pic]
4. Составляем матрицу
[pic]
5. Вычисляем матрицу, обратную матрице [pic], т.е. [pic]
6. Вычисляем матрицу [pic] - матрицу [pic] в канонической форме фазовой переменной:
[pic] где [pic]- коэффициенты характеристического уравнения (4). Матрица [pic] в канонической форме имеет вид
[pic]
7. Составляем вектор [pic] , элементам которого являются коэффициенты характеристического уравнения (4), т.е. [pic], [pic], где [pic] - элементы матрицы [pic].
8. Находим коэффициенты характеристического уравнения (5) (см. пояснения) и составляем из них вектор [pic]. 9. Вычисляем вектор [pic]. [pic] - искомая матрица обратной связи системы (3), но она вычислена для системы, матрицы которой заданы в канонической форме фазовой переменной ([pic] и [pic]).
10. Для исходной системы (3) матрица обратной связи получается по формуле
[pic] Матрица [pic] - искомая матрица обратной связи.
Пояснения к алгоритму: В данной работе рассматривается случай, когда управление единственно и
информация о переменных состояния полная. Задача модального управления
тогда наиболее просто решается, если уравнения объекта заданы в
канонической форме фазовой переменной. Так как управление выбрано в виде линейной функции переменных состояния
[pic], где [pic] является матрицей строкой [pic]. В таком случае уравнение
замкнутой системы приобретает вид [pic]. Здесь
[pic] Характеристическое уравнение такой замкнутой системы будет следующим
[pic] Поскольку каждый коэффициент матрицы обратной связи [pic] входит только в
один коэффициент характеристического уравнения, то очевидно, что выбором
коэффициентов [pic] можно получить любые коэффициенты характеристического
уравнения, а значит и любое расположение корней. Если же желаемое характеристическое уравнение имеет вид
[pic],
то коэффициенты матрицы обратной связи вычисляются с помощью соотношений:
[pic] Если при наличии одного управления нормальные уравнения объекта заданы не
в канонической форме (что наиболее вероятно), то, в соответствии с пунктами
№1-6 алгоритма, от исходной формы с помощью преобразования [pic] или [pic]
нужно перейти к уравнению [pic] в указанной канонической форме. Управление возможно, если выполняется условие полной управляемости (ранг
матрицы управляемости M должен быть равен n). В алгоритме об управляемости
системы судится по существованию матрицы [pic]: если она существует, то
ранг матрицы равен ее порядку (n). Для объекта управления с единственным
управлением матрица [pic] оказывается также единственной. Для нахождения коэффициентов [pic] характеристического уравнения (5), в
работе используется соотношения между корнями [pic] и коэффициентами
[pic] линейного алгебраического уравнения степени n:
[pic], (k = 1, 2, ... , n) где многочлены [pic]- элементарные симметрические функции, определяемые
следующим образом:
[pic] где Sk - сумма всех [pic] произведений, каждое из которых содержит k
сомножителей xj с несовпадающими коэффициентами.
Текст программной реализации приведен в ПРИЛОЖЕНИИ №1. Вот несколько
кратких пояснений.
. Программа написана на языке Object Pascal при помощи средств Delphi 2.0, и состоит из следующих основных файлов:
OptsUnit.pas
. KursovayaWork.dpr - файл проекта, содержащий ссылки на все формы проекта и инициализирующий приложение.
. В модуле MainUnit.pas находится описание главной формы приложения, а также сконцентрированы процедуры и функции, поддерживаюшие нужный интерфейс программы.
. Модули SubUnit.pas и Operates.pas содержат процедуры и функции, составляющие смысловую часть программной реализации алгоритма, т.е. процедуры решения задачи модально управления, процедуры решения систем дифференциальных уравнений, процедуры отображения графиков решений систем и т.д. Там также находятся процедуры отображения результатов расчетов на экран.
. В модуле Matrix.pas расположено описание класса TMatrix - основа матричных данных в программе.
. Модули HelpUnit.pas и OptsUnit.pas носят в программе вспомогательный характер.
. Для решения систем дифференциальных уравнений использован метод Рунге- Кутта четвертого порядка точности с фиксированным шагом. Метод был позаимствован из пакета программ NumToolBox и адаптирован под новую модель матричных данных.
. Обращение матриц производится методом исключения по главным диагональным элементам (метод Гаусса). Этот метод так же был позаимствован из NumToolBox и соответствующе адаптирован.
MainUnit in 'MainUnit.pas' {Form_Main},
OptsUnit in 'OptsUnit.pas' {Form_Options},
HelpUnit in 'HelpUnit.pas' {Form_Help};
Application.Title := 'Модальное управление';
Application.CreateForm(TForm_Main, Form_Main);
Application.CreateForm(TForm_Options, Form_Options);
Application.CreateForm(TForm_Help, Form_Help);
Application.Run; end.
unit MainUnit;
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
ComCtrls, Tabnotbk, Menus, StdCtrls, Spin, ExtCtrls, Buttons, Grids,
OleCtrls, VCFImprs, GraphSvr, ChartFX {, ChartFX3};
TabbedNotebook_Main: TTabbedNotebook;
Label3: TLabel; procedure BitBtn_CloseClick(Sender: TObject); procedure BitBtn_OptionsClick(Sender: TObject); procedure BitBtn_ComputeClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure SpinEdit_DimChange(Sender: TObject); procedure StringGrid_RootsSetEditText(Sender: TObject; ACol,
ARow: Longint; const Value: string); procedure RadioGroup_RootsTypeClick(Sender: TObject); procedure TabbedNotebook_MainChange(Sender: TObject; NewTab: Integer; var AllowChange: Boolean); procedure StringGrid_SetEditText(Sender: TObject; ACol,
ARow: Longint; const Value: string); procedure BitBtn_HelpClick(Sender: TObject); procedure RadioGroupChartClick(Sender: TObject); private procedure FillFixedCellsInAllGrids; procedure FillCellsInAllGrids; public procedure BindGrids; procedure UnBindGrids; end;
uses Matrix, SubUnit, OptsUnit, Operates, CFXOCX2, HelpUnit;
DefOptions = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goColSizing, goEditing, goAlwaysShowEditor, goThumbTracking]; {$R *.DFM}
procedure TForm_Main.FillFixedCellsInAllGrids; var
Order := SpinEdit_Dim.Value; for i := 1 to Order do begin
StringGrid_ANp0.Cells[i, 0] := Str;
StringGrid_ANp0.Cells[0, i] := Str;
StringGrid_Roots.Cells[i, 0] := Str;
StringGrid_Kpp0.Cells[i, 0] := Str;
StringGrid_ABKpp1.Cells[i, 0] := Str;
StringGrid_ABKpp1.Cells[0, i] := Str;
StringGrid_InCond.Cells[i, 0] := Str;
StringGrid_Kpp1.Cells[i, 0] := Str;
StringGrid_Solve1.Cells[i, 0] := 'X' + IntToStr(i);
StringGrid_Solve2.Cells[i, 0] := 'X' + IntToStr(i);
StringGrid_Solve1.Cells[0, 0] := 'Время';
StringGrid_Solve2.Cells[0, 0] := 'Время'; end; end;
procedure TForm_Main.FillCellsInAllGrids; var
Order := SpinEdit_Dim.Value; for i := 1 to Order do for j := 1 to Order do begin
StringGrid_Roots.Cells[i, 1] := '-1';
StringGrid_Roots.Cells[i, 2] := '0';
StringGrid_Kpp0.Cells[i, 1] := '0';
StringGrid_ABKpp1.Cells[j, i] := '0';
StringGrid_ABKpp1.Cells[i, i] := '1';
StringGrid_InCond.Cells[i, 1] := '0';
StringGrid_Kpp1.Cells[i, 1] := '0'; end;
StringGrid_Roots.Cells[0, 1] := 'Re';
StringGrid_Roots.Cells[0, 2] := 'Im';
StringGrid_Bp0.Cells[1, 0] := '1'; end;
procedure TForm_Main.BindGrids; begin
CopyGrid(StringGrid_Ap1, StringGrid_Ap0);
CopyGrid(StringGrid_Bp1, StringGrid_Bp0);
CopyGrid(StringGrid_Kpp1, StringGrid_Kpp0);
StringGrid_Ap1.Options := DefOptions - [goEditing];
StringGrid_Bp1.Options := DefOptions - [goEditing];
StringGrid_Kpp1.Options := DefOptions - [goEditing]; end;
procedure TForm_Main.UnBindGrids; begin
StringGrid_Ap1.Options := DefOptions;
StringGrid_Bp1.Options := DefOptions;
StringGrid_Kpp1.Options := DefOptions; end;
procedure TForm_Main.BitBtn_CloseClick(Sender: TObject); begin
procedure TForm_Main.BitBtn_OptionsClick(Sender: TObject); var
LS: TCheckBoxState; begin with Form_Options do begin
ShowModal; if ModalResult = mrCancel then begin
CheckBox_Link.State := LS; end else if ((SpinEdit0.Value V0) or (SpinEdit1.Value V1)) or
((SpinEdit2.Value V2) or (SpinEdit3.Value V3)) then begin
BitBtn_Compute.Enabled := True; case BitBtn_Compute.Tag of
4, 5 :BitBtn_Compute.Tag := BitBtn_Compute.Tag - 4;
6, 7 :BitBtn_Compute.Tag := BitBtn_Compute.Tag - 4;
8, 9 :BitBtn_Compute.Tag := BitBtn_Compute.Tag - 8;
10, 11 :BitBtn_Compute.Tag := BitBtn_Compute.Tag - 8;
12, 13 :BitBtn_Compute.Tag := BitBtn_Compute.Tag - 12;
14, 15 :BitBtn_Compute.Tag := BitBtn_Compute.Tag - 12; end; end; end; end;
procedure TForm_Main.BitBtn_ComputeClick(Sender: TObject); begin
BitBtn_Compute.Enabled := False; if Form_Options.CheckBox_Link.State = cbChecked then BindGrids; case TabbedNotebook_Main.PageIndex of
BitBtn_Compute.Tag := BitBtn_Compute.Tag + 1; end;
ShowChart(Succ(RadioGroupChart.ItemIndex));
BitBtn_Compute.Tag := BitBtn_Compute.Tag + 14; end;
BitBtn_Compute.Tag := BitBtn_Compute.Tag + 4; end;
BitBtn_Compute.Tag := BitBtn_Compute.Tag + 8; end; end; end;
procedure TForm_Main.FormCreate(Sender: TObject); const
StringGrid_Ap0.ColWidths [0] := FirstColWidth;
StringGrid_Anp0.ColWidths [0] := FirstColWidth;
StringGrid_Bp0.ColWidths [0] := FirstColWidth;
StringGrid_Roots.ColWidths [0] := FirstColWidth;
StringGrid_Ap1.ColWidths [0] := FirstColWidth;
StringGrid_ABKpp1.ColWidths [0] := FirstColWidth;
StringGrid_Bp1.ColWidths [0] := FirstColWidth;
StringGrid_Kpp0.ColWidths [0] := FirstColWidth;
StringGrid_Kpp1.ColWidths [0] := FirstColWidth;
StringGrid_InCond.ColWidths [0] := FirstColWidth;
procedure TForm_Main.SpinEdit_DimChange(Sender: TObject); var
StringGrid_Roots.ColCount := Order;
StringGrid_ABKpp1.ColCount := Order;
StringGrid_ABKpp1.RowCount := Order;
StringGrid_InCond.ColCount := Order;
BitBtn_Compute.Enabled := True; end;
procedure TForm_Main.StringGrid_RootsSetEditText(Sender: TObject; ACol,
ARow: Longint; const Value: string); var
Val : string; begin if (ARow = 2) and (Value '') then begin
Val := StringGrid_Roots.Cells [ACol, ARow]; if StrToFloat (Value) 0 then
StringGrid_Roots.Cells[Succ(ACol),ARow]:=FloatToStr(-
StrToFloat(Value)); if StrToFloat (Value) = 0 then
StringGrid_Roots.Cells [Succ(ACol),ARow] := FloatToStr(0); end; end;
procedure TForm_Main.RadioGroup_RootsTypeClick(Sender: TObject); var
W := StrToFloat (Edit_W.Text); case RadioGroup_RootsType.ItemIndex of
0 :StringGrid_Roots.Options := DefOptions;
1 :begin for j := 1 to Order do begin
StringGrid_Roots.Cells [j, 1] := FloatToStr (-W);
StringGrid_Roots.Cells [j, 2] := '0';
StringGrid_Roots.Options := DefOptions - [goEditing]; end end;
NHalf := Order div 2; for j := 1 to NHalf do begin
StringGrid_Roots.Cells [j, 1] := FloatToStr (Cos (NAlfa) *
W);
StringGrid_Roots.Cells [Order - Pred (j), 1] := FloatToStr
(Cos (-NAlfa) * W);
StringGrid_Roots.Cells [j, 2] := FloatToStr (Sin (NAlfa) *
W);
StringGrid_Roots.Cells [Order - Pred (j), 2] := FloatToStr
(Sin (-NAlfa) * W); end; if Odd (Order) then begin
StringGrid_Roots.Cells [NHalf +1, 1] := FloatToStr (-W);
StringGrid_Roots.Cells [NHalf +1, 2] := '0'; end;
StringGrid_Roots.Options := DefOptions - [goEditing]; end; end;
procedure TForm_Main.TabbedNotebook_MainChange(Sender: TObject;
NewTab: Integer; var AllowChange: Boolean); begin with BitBtn_Compute do case NewTab of
SpinEdit_Dim.Enabled := True; if Tag in [1, 3, 5, 7, 9, 11, 13, 15] then Enabled := False else Enabled := True;
BitBtn_Compute.Caption := 'Рассчитать модальное управление'; end;
SpinEdit_Dim.Enabled := True; if Tag in [2, 3, 6, 7, 10, 11, 14, 15] then Enabled := False else Enabled := True;
BitBtn_Compute.Caption := 'Решить системы дифф. уравнений '; if Form_Options.CheckBox_Link.State = cbChecked then BindGrids; end;
SpinEdit_Dim.Enabled := False; if Tag in [4, 5, 6, 7, 12, 13, 14, 15] then Enabled := False else Enabled := True;
BitBtn_Compute.Caption := 'Обновить результаты решений '; end;
SpinEdit_Dim.Enabled := False; if Tag in [8, 9, 10, 11, 12, 13, 14, 15] then Enabled := False else Enabled := True;
BitBtn_Compute.Caption := 'Обновить диаграмму решения '; end; end; end;
procedure TForm_Main.StringGrid_SetEditText(Sender: TObject; ACol,
ARow: Longint; const Value: string); begin if not BitBtn_Compute.Enabled then case TabbedNotebook_Main.PageIndex of
0 :if Form_Options.CheckBox_Link.State = cbChecked then
BitBtn_Compute.Tag := BitBtn_Compute.Tag - 3 else
BitBtn_Compute.Tag := BitBtn_Compute.Tag - 1;
1 :BitBtn_Compute.Tag := BitBtn_Compute.Tag - 2; end;
BitBtn_Compute.Enabled := True; end;
procedure TForm_Main.BitBtn_HelpClick(Sender: TObject); begin
procedure TForm_Main.RadioGroupChartClick(Sender: TObject); begin case RadioGroupChart.ItemIndex of
procedure CopyGrid(AGrid, BGrid: TStringGrid); procedure LoadMatrixSolveFromStrGrd (AMatrix: TMatrix; AGrid:
TStringGrid); procedure ComputeFromPage0; procedure ComputeFromPage1; procedure ComputeFromPage2; procedure ComputeFromPage3; procedure ShowChart(NumberOfChart: Byte);
procedure CopyGrid(AGrid, BGrid: TStringGrid); var i, j: LongInt; begin
AGrid.RowCount := BGrid.RowCount; for j := 0 to AGrid.ColCount do for i := 0 to AGrid.RowCount do
AGrid.Cells[j, i] := BGrid.Cells[j, i]; end;
function CropStr (Str: String): String; var i: Byte;
Str_1: String; Begin for i := Length(Str) downto 1 do if Str [i] = ' ' then Str := Copy(Str, 1, i-1) else Break;
Str_1 := Str; for i := 1 to Length(Str) do if Str[i] = ' ' then Str_1 := Copy(Str, i+1, Length(Str) - i) else Break;
procedure LoadMatrixFromStrGrd (AMatrix: TMatrix; AGrid: TStringGrid); var i, j: Word; begin
AMatrix.Resize (Pred(AGrid.ColCount), Pred(AGrid.RowCount)); for i := 1 to AMatrix.RowCount do for j := 1 to AMatrix.ColCount do begin if CropStr(AGrid.Cells[j, i]) = '' then AGrid.Cells[j, i] := '0';
AMatrix[j ,i] := StrToFloat(AGrid.Cells[j, i]) end end;
procedure OutPutMatrixToStrGrd (AMatrix: TMatrix; AGrid: TStringGrid); var i, j: Word; begin
AGrid.ColCount := Succ(AMatrix.ColCount);
AGrid.RowCount := Succ(AMatrix.RowCount); for i := 1 to AMatrix.RowCount do for j := 1 to AMatrix.ColCount do begin
AGrid.Cells[j, i] := FloatToStrF(AMatrix[j ,i],ffGeneral,5,3); end end;
procedure OutPutMatrixSolveToStrGrd (AMatrix: TMatrix; AGrid:
TStringGrid); var i, j, k: Word; begin
AGrid.ColCount := AMatrix.ColCount;
AGrid.RowCount := Succ(AMatrix.RowCount); for i := 1 to AMatrix.RowCount do for j := 1 to AMatrix.ColCount do begin if j = AMatrix.ColCount then k := 0 else k := j;
AGrid.Cells[j, 0] := 'X' + IntToStr (j);
AGrid.Cells[k, i] := FloatToStrF(AMatrix[j ,i],ffGeneral,5,3); end;
procedure LoadMatrixSolveFromStrGrd (AMatrix: TMatrix; AGrid:
TStringGrid); var i, j, k: Word; begin
AMatrix.Resize (AGrid.ColCount, Pred(AGrid.RowCount)); for i := 1 to AMatrix.RowCount do for j := 0 to AMatrix.ColCount do begin if j = 0 then k := AMatrix.ColCount else k := j; if CropStr(AGrid.Cells[j, i]) = '' then AGrid.Cells[j, i] := '0';
AMatrix[k ,i] := StrToFloat(AGrid.Cells[j, i]) end end;
K : ShortInt; mDummy1, mDummy2, mA, mB, mKp, mM, mN, mN1: TMatrix; cvRoots: TComplexVector; begin with Form_Main do begin
mA := TMatrix.Create(Order, Order); mB := TMatrix.Create(1, Order); mM := TMatrix.Create(Order, Order); mDummy1 := TMatrix.Create(Order, Order); mN1 := TMatrix.Create(Order, 1); mN := TMatrix.Create(Order, Order); mDummy2 := TMatrix.Create(Order, Order); mKp := TMatrix.Create(Order, 1);
LoadMatrixFromStrGrd (mA, StringGrid_Ap0);
for j := 1 to Order do begin mDummy1.Assign(mA); mDummy1.NthPower(j - 1); mDummy1.MultFromRight(mB); for i := 1 to Order do mM[j, i] := mDummy1[1, i]; end;
Raise ESingularMatrix.Create('Система неполностью управляема:' +
'Измените значения коэффициентов
матриц А и B');
mN1.SetNull; mN1[Order, 1] := 1; mN1.MultFromRight(mM);
for i := 1 to Order do begin mDummy2.Assign(mA); mDummy2.NthPower(i-1); mDummy1.Assign(mN1); mDummy1.MultFromRight(mDummy2); for j := 1 to Order do mN[j, i] := mDummy1[j, 1]; end;
mDummy1.Assign(mN); if not mDummy1.Inverse then
Raise ESingularMatrix.Create('Не могу обратить матрицу N !!!'#10 +
'(не разбрасывайтесь порядками
коэффициентов матриц)'); mA.MultFromLeft(mN); mA.MultFromRight(mDummy1);
OutPutMatrixToStrGrd(mA, StringGrid_Anp0);
cvRoots.Dim := Order; for j := 1 to Order do begin cvRoots.Data[j].Re := StrToFloat(StringGrid_Roots.Cells[j, 1]); cvRoots.Data[j].Im := StrToFloat(StringGrid_Roots.Cells[j, 2]); end;
for j := 1 to Order do begin if Odd (j) then K := -1 else K := +1; mKp[Order-Pred(j), 1] := - mA[Order-Pred(j), Order] -
K * SymmetricalFunction(cvRoots, j); end; mKp.MultFromRight(mN);
OutPutMatrixToStrGrd (mKp, StringGrid_Kpp0);
mDummy1.Free; mDummy2.Free; mA.Free; mB.Free; mKp.Free; mM.Free; mN.Free; mN1.Free; end; end;
Order: TOrder; mA, mB, mABKp, mInCond, mKp: TMatrix; mSolutionValues: TMatrix;
LowerLimit, UpperLimit, NumReturn, NumIntervals: Word; begin with Form_Main do begin
mA := TMatrix.Create(Order, Order); mB := TMatrix.Create(1, Order); mKp := TMatrix.Create(Order, 1); mInCond := TMatrix.Create(Order, 1);
LoadMatrixFromStrGrd(mA, StringGrid_Ap1);
LoadMatrixFromStrGrd(mB, StringGrid_Bp1);
LoadMatrixFromStrGrd(mKp, StringGrid_Kpp1);
LoadMatrixFromStrGrd(mInCond, StringGrid_InCond);
mABKp := TMatrix.Create(Order, Order); mABKp.Assign(mB); mABKp.MultFromRight(mKp); mABKp.AddMatrix(mA);
OutPutMatrixToStrGrd(mABKp, StringGrid_ABKpp1);
mB.MultConst(StrToFloat(Edit_U.Text));
NumIntervals := SpinEdit3.Value; end;
mSolutionValues := TMatrix.Create(1, 1);
NumReturn, NumIntervals, mSolutionValues);
OutPutMatrixSolveToStrGrd(mSolutionValues, StringGrid_Solve1);
NumReturn, NumIntervals, mSolutionValues);
OutPutMatrixSolveToStrGrd(mSolutionValues, StringGrid_Solve2);
EO.Message := 'Не буду считать !!!'#10 +
'С уменьшите разброс коэффициентов в матрицах'#10
+
'либо измените опции (уменьшите их pls.)';
mA.Free; mB.Free; mABKp.Free; mInCond.Free; mKp.Free; mSolutionValues.Free; end; end;
procedure ShowChart(NumberOfChart: Byte); var
NumReturn, Point: Word; mSolutionValues: TMatrix;
Divisor = 3.4E+38; var i, j: LongInt;
Least := Greatest; for j := 1 to Order do for i := 1 to NumReturn do begin if mSolutionValues[j, i] > Greatest then Greatest :=
mSolutionValues[j, i]; if mSolutionValues[j, i] < Least then Least := mSolutionValues[j,
i]; end;
Form_Main.ChartFX.Adm[CSA_MAX] := Greatest;
Form_Main.ChartFX.Adm[CSA_MIN] := Least;
Form_Main.ChartFX.Title[CHART_TOPTIT] := 'Y = Y '' * '; end;
NumReturn := Form_Options.SpinEdit2.Value; mSolutionValues := TMatrix.Create(1, 1);
ComputeFromPage1; case NumberOfChart of
LoadMatrixSolveFromStrGrd(mSolutionValues,
StringGrid_Solve1);
ChartFX.OpenDataEx(Cod_Values, Order, Pred(NumReturn)); for Serie := 1 to Order do begin
ChartFX.SerLeg[Pred(Serie)] := 'X ' + IntToStr(Serie);
ChartFX.ThisSerie := Pred(Serie); for Point := 0 to Pred(NumReturn) do
ChartFX.Value[Point] := mSolutionValues[Serie,
Succ(Point)]; end;
ChartFX.OpenDataEx(Cod_XValues, Order, Pred(NumReturn)); for Serie := 1 to Order do begin
ChartFX.ThisSerie := Pred(Serie); for Point := 0 to Pred(NumReturn) do
ChartFX.XValue[Point] := mSolutionValues[1,
Succ(Point)]; end;
LoadMatrixSolveFromStrGrd(mSolutionValues,
StringGrid_Solve2);
ChartFX.OpenDataEx(Cod_Values, Order, Pred(NumReturn)); for Serie := 1 to Order do begin
ChartFX.SerLeg[Pred(Serie)] := 'X ' + IntToStr(Serie);
ChartFX.ThisSerie := Pred(Serie); for Point := 0 to Pred(NumReturn) do
ChartFX.Value[Point] := mSolutionValues[Serie,
Succ(Point)]; end;
ChartFX.CloseData(Cod_Values); end; end; mSolutionValues.Free; end; end;
procedure ComputeFromPage3; begin case Form_Main.RadioGroupChart.ItemIndex of
EMatrixOperatingError = class (Exception);
FCols, FRows: Word; function GetCell (ACol, ARow: Word): Float; procedure SetCell (ACol, ARow: Word; AValue: Float); function GetItem (NumItem: LongInt): Float; procedure SetItem (NumItem: LongInt; AValue: Float); procedure SwitchRows (FirstRow, SecondRow: Word); public constructor Create (NCols, NRows: Word); destructor Destroy; override; procedure Assign (AMatrix: TMatrix); procedure ReSize (NewCols, NewRows: Word); procedure SetNull; procedure SetSingle; procedure SetNegative; procedure AddConst (AConst: Float); procedure AddMatrix (AMatrix: TMatrix); procedure MultConst (MConst: Float); procedure MultFromRight (MMatrix: TMatrix); procedure MultFromLeft (MMatrix: TMatrix); procedure NthPower (Power: Word); procedure Transpose; function Inverse: Boolean; function Determinant: Float; function Rang: Float; property ColCount: Word read FCols; property RowCount: Word read FRows; property Cells [ACol, ARow: Word]: Float read GetCell write SetCell;
default; property Items [NumItem: LongInt]: Float read GetItem write SetItem; end;
function IncPtr (p: Pointer; i: LongInt): Pointer; asm push EBX mov EBX,EAX add EBX,EDX mov EAX,EBX pop EBX end;
function TMatrix.GetCell (ACol, ARow: Word): Float; var
CellPtr := IncPtr(DataPtr, (FRows * Pred(ACol) + Pred(ARow)) *
SizeOf(Float));
procedure TMatrix.SetCell (ACol, ARow: Word; AValue: Float); var
CellPtr := IncPtr(DataPtr, (FRows * Pred(ACol) + Pred(ARow)) *
SizeOf(Float));
function TMatrix.GetItem (NumItem: LongInt): Float; var
CellPtr := IncPtr(DataPtr, Pred(NumItem) * SizeOf(Float));
procedure TMatrix.SetItem (NumItem: LongInt; AValue: Float); var
CellPtr := IncPtr(DataPtr, Pred(NumItem) * SizeOf(Float));
procedure TMatrix.SwitchRows (FirstRow, SecondRow: Word); var i: Word;
Buffer: Float; begin for i := 1 to FCols do begin
SetCell(i, FirstRow, GetCell(i, SecondRow));
SetCell(i, SecondRow, Buffer); end; end;
constructor TMatrix.Create (NCols, NRows: Word); begin inherited Create;
DataPtr := AllocMem(FCols * FRows * SizeOf(Float)); end;
FreeMem(DataPtr); inherited Destroy; end;
procedure TMatrix.Assign (AMatrix: TMatrix); var
NewMatrixSize := AMatrix.ColCount * AMatrix.RowCount * SizeOf(Float);
ReAllocMem(DataPtr, NewMatrixSize);
CopyMemory(DataPtr, AMatrix.DataPtr, NewMatrixSize);
procedure TMatrix.ReSize (NewCols, NewRows: Word); var
NewMatrixSize := NewCols * NewRows * SizeOf(Float);
ReAllocMem(DataPtr, NewMatrixSize);
ZeroMemory (DataPtr, FCols * FRows * SizeOf(Float)); end;
procedure TMatrix.SetSingle; var i: Word; begin if FCols FRows then
Raise EMatrixOperatingError.Create ('Единичная матрица должна быть '+
SetNull; for i := 1 to FCols do SetCell (i, i, 1); end; end;
procedure TMatrix.SetNegative; var i: LongInt; begin for i := 1 to FCols * FRows do SetItem(i, - GetItem(i)); end;
procedure TMatrix.AddConst (AConst: Float); var i: LongInt; begin for i := 1 to FCols * FRows do SetItem (i, GetItem(i) + AConst); end;
procedure TMatrix.AddMatrix (AMatrix: TMatrix); var i: LongInt; begin for i := 1 to FCols * FRows do SetItem (i, GetItem(i) + AMatrix.Items
[i]); end;
procedure TMatrix.MultConst (MConst: Float); var i: LongInt; begin for i := 1 to FCols * FRows do SetItem (i, GetItem(i) * MConst); end;
procedure TMatrix.MultFromRight (MMatrix: TMatrix); var j, i, k: Word;
DummyMatrix := TMatrix.Create (MMatrix.ColCount, FRows); if FCols MMatrix.RowCount then
Raise EMatrixOperatingError.Create ('Перемножаемые матрицы должны
быть '+
'соответствующей размерности') else for i := 1 to FRows do for j := 1 to MMatrix.ColCount do begin
DummyRes := 0; for k := 1 to FCols do
DummyRes := DummyRes + Cells[k, i] * MMatrix[j, k];
DummyMatrix[j, i] := DummyRes; end;
procedure TMatrix.MultFromLeft (MMatrix: TMatrix); var j, i, k: Word;
DummyMatrix := TMatrix.Create (FCols, MMatrix.RowCount); if MMatrix.ColCount FRows then
Raise EMatrixOperatingError.Create ('Перемножаемые матрицы должны
быть '+
'соответствующей размерности') else for i := 1 to MMatrix.ColCount do for j := 1 to FCols do begin
DummyRes := 0; for k := 1 to MMatrix.ColCount do
DummyRes := DummyRes + MMatrix[k, i] * Cells[j, k];
DummyMatrix[j, i] := DummyRes; end;
procedure TMatrix.NthPower (Power: Word); var i: Word;
DummyMatrix := TMatrix.Create (FCols, FRows);
DummyMatrix.Assign (Self); if FCols FRows then
Raise EMatrixOperatingError.Create ('Возводимая в степень матрица
должна '+
'быть квадратной') else case Power of
1 : begin end; else for i := 2 to Power do MultFromRight (DummyMatrix); end;
procedure TMatrix.Transpose; var i, j: Word;
Dummy: Float; begin if FCols FRows then
Raise EMatrixOperatingError.Create ('Транспонируемая матрица должна
быть '+
'квадратной') else for i := 1 to FCols do for j := 1 to FRows do if j > i then begin
function TMatrix.Inverse: Boolean; var
DummyMatrix := TMatrix.Create (FCols, FRows); if (FCols FRows) or (FCols = 0) then
Raise EMatrixOperatingError.Create ('Инвертируемая матрица должна
быть '+
'квадратной и ненулевого
размера'); if FCols = 1 then if ABS(GetItem(1)) < NearlyZero then Singular := True else DummyMatrix.Items[1] := 1 / GetItem(1); if FCols > 1 then begin
Inc(RefRow); if ABS(Cells[RefRow, RefRow]) < NearlyZero then begin
Inc(NewRow); if ABS(Cells[RefRow, NewRow]) > NearlyZero then begin
DummyMatrix.SwitchRows(NewRow, RefRow);
Singular := False; end; until (not Singular) or (NewRow >= FCols); end; if not Singular then begin
Divisor := Cells[RefRow, RefRow]; for Term := 1 to FCols do begin
SetCell(Term, RefRow, GetCell(Term, RefRow)/Divisor);
DummyMatrix[Term, RefRow] := DummyMatrix[Term,
RefRow]/Divisor; end; for Row := 1 to FCols do if (Row RefRow) and (ABS(Cells[RefRow, Row]) >
NearlyZero) then begin
Multiplier := - Cells[RefRow, Row] / Cells[RefRow,
RefRow]; for Term := 1 to FCols do begin
SetCell(Term, Row, GetCell(Term, Row) +
Multiplier * GetCell(Term,
RefRow));
DummyMatrix[Term, Row] := DummyMatrix[Term, Row] +
Multiplier * DummyMatrix[Term,
RefRow]; end end; end; until Singular or (RefRow >= FCols); end;
DummyMatrix.Free; if not Singular then Result := True else Result := False; end;
function TMatrix.Determinant: Float; begin
function TMatrix.Rang: Float; begin
ESingularMatrix = class (Exception);
Data : array [1..MaxArraySize] of TComplex;
function SymmetricalFunction (Roots: TComplexVector; K: byte): Float; procedure DiffSystemSolve (matrixA, matrixB: TMatrix;
function SymmetricalFunction (Roots: TComplexVector; K: byte): Float; var
function SummComplex (FirstNC, SecondNC: TComplex): TComplex; begin
Result.Re := FirstNC.Re + SecondNC.Re;
Result.Im := FirstNC.Im + SecondNC.Im; end;
function MultComplex (FirstNC, SecondNC: TComplex): TComplex; begin
Result.Re := FirstNC.Re * SecondNC.Re - FirstNC.Im * SecondNC.Im;
Result.Im := FirstNC.Re * SecondNC.Im + FirstNC.Im * SecondNC.Re; end;
function DivComplex (FirstNC, SecondNC: TComplex): TComplex; var
Z := Sqr(SecondNC.Re) + Sqr(SecondNC.Im);
Result.Re := (FirstNC.Re * SecondNC.Re + FirstNC.Im * SecondNC.Im) / Z;
Result.Im := (FirstNC.Im * SecondNC.Re - FirstNC.Re * SecondNC.Im) / Z; end;
function CombinationSumm (LowLimit, HighLimit, K: byte): TComplex; var i: byte; begin
Result.Im := 0; if LowLimit = HighLimit then Result := Roots.Data[LowLimit] else for i := LowLimit to HighLimit - K + 1 do if K = 1 then Result := SummComplex(Result, Roots.Data [i]) else Result := SummComplex(Result,
Z := CombinationSumm(1, Roots.Dim, K);
procedure DiffSystemSolve (matrixA, matrixB: TMatrix;
function TargetALL (matrixA, mayrixB: TMatrix; Values: TMatrix; KRow:
Word): Float; var j: Word; begin try
Result := matrixB.I
Похожие работы на - Программная реализация модального управления для линейных стационарных систем Реферат. Радиоэлектроника.
Реферат: Сущность и основные черты немецкой классической философии 2
Курсовая работа по теме Взаимодействие правоохранительных органов в сфере предупреждения таможенных преступлений в Республике Казахстан
Контрольная работа: Методика функціонально-вартісного аналізу на підприємстві
Реферат по теме Факторы и механизмы организационного развития
Доклад по теме Доменико Скарлатти (Scarlatti)
Краткое Содержание Капитанская Дочка Сочинение Александра Гринева
Реферат по теме Маркетингова політика розподілу
Курсовая Работа На Тему Проблема Человека В Истории Философии
Кукольный Театр Не Только Для Детей Реферат
Реферат: The Effects Of Globalization On The Implementation
Тексты Докторских Диссертаций
Реферат: History Of Basketball Essay Research Paper Inventor
Курсовая работа по теме Формы и методы антимонопольного регулирования в России
Отчет по практике по теме Совместные следственно-оперативные мероприятия
Реферат: Инфекционные заболевания от животных. Скачать бесплатно и без регистрации
Реферат по теме Зарождение науки о закономерностях случайных явлении
Реферат по теме Строительство и наладка системы обеззараживания питьевой воды
Курсовая работа: Экономический рост в России: основные показатели и тенденции
Как Делать Дипломную Работу Образец 2022
Ветеринария Курсовая Работа По Клинической Диагностике
Курсовая работа: Формирование государственной инновационной политики и нормативно-правовой базы, стимулирующей инновационную деятельность
Курсовая работа: Противоречия интеграции и адаптации, связанные с социальной реабилитацией инвалидов
Похожие работы на - Правила ведения переговоров

Report Page