Реферат: Программная реализация модального управления для линейных стационарных систем
![](/file/7d5aacc146456be8f3642.jpg)
🛑 👉🏻👉🏻👉🏻 ИНФОРМАЦИЯ ДОСТУПНА ЗДЕСЬ ЖМИТЕ 👈🏻👈🏻👈🏻
«Программная реализация модального управления для линейных стационарных систем»
1. Для объекта управления с математическим описанием
где - n-мерный вектор состояния, ,
- матрица действительных коэффициентов,
- матрица действительных коэффициентов,
найти управление в функции переменных состояния объекта, т.е.
где - матрица обратной связи, такое, чтобы замкнутая система была устойчивой.
2. Корни характеристического уравнения замкнутой системы
должны выбираться по усмотрению (произвольно) с условием устойчивости системы (3).
1. Разработать алгоритм решения поставленной задачи.
2. Разработать программу решения поставленной задачи с интерактивным экранным интерфейсом в системах BorlandPascal, TurboVision, Delphi - по выбору.
3. Разработать программу решения систем дифференциальных уравнений (1) и (3) с интерактивным экранным интерфейсом.
4. Разработать программу графического построения решений систем (1) и (3) с интерактивным экранным интерфейсом.
Наряду с общими методами синтеза оптимальных законов управления для стационарных объектов всё большее применение находят методы, основанные на решении задачи о размещении корней характеристического уравнения замкнутой системы в желаемое положение. Этого можно добиться надлежащим выбором матрицы обратной связи по состоянию. Решение указанной задачи является предметом теории модального управления
(термин связан с тем, что корням характеристического уравнения соответствуют составляющие свободного движения, называемые модами).
· Задаваемый объект управления математически описывается уравнением
где и - матрицы действительных коэффициентов,
· Обратная связь по состоянию имеет вид
· Система с введенной обратной связью описывается уравнением
· Характеристическое уравнение системы (1) имеет вид
· Характеристическое уравнение системы (3) с задаваемыми (желаемыми) корнями имеет вид
1. Для исходной системы (1) составляем матрицу управляемости
2. Обращаем матрицу , т.е. вычисляем .
Если не существует (т.е. матрица - вырожденная), то прекращаем вычисления: полное управление корнями характеристического уравнения (5) не возможно.
5. Вычисляем матрицу, обратную матрице , т.е.
6. Вычисляем матрицу - матрицу в канонической форме фазовой переменной:
где - коэффициенты характеристического уравнения (4).
Матрица в канонической форме имеет вид
7. Составляем вектор , элементам которого являются коэффициенты характеристического уравнения (4), т.е. , ,
8. Находим коэффициенты характеристического уравнения (5) (см. пояснения) и составляем из них вектор .
- искомая матрица обратной связи системы (3), но она вычислена для системы, матрицы которой заданы в канонической форме фазовой переменной ( и ).
10. Для исходной системы (3) матрица обратной связи получается по формуле
Матрица - искомая матрица обратной связи.
В данной работе рассматривается случай, когда управление единственно и информация о переменных состояния полная. Задача модального управления тогда наиболее просто решается, если уравнения объекта заданы в канонической форме фазовой переменной.
Так как управление выбрано в виде линейной функции переменных состояния , где является матрицей строкой . В таком случае уравнение замкнутой системы приобретает вид . Здесь
Характеристическое уравнение такой замкнутой системы будет следующим
Поскольку каждый коэффициент матрицы обратной связи входит только в один коэффициент характеристического уравнения, то очевидно, что выбором коэффициентов можно получить любые коэффициенты характеристического уравнения, а значит и любое расположение корней.
Если же желаемое характеристическое уравнение имеет вид
то коэффициенты матрицы обратной связи вычисляются с помощью соотношений:
Если при наличии одного управления нормальные уравнения объекта заданы не в канонической форме (что наиболее вероятно), то, в соответствии с пунктами №1-6 алгоритма, от исходной формы с помощью преобразования или нужно перейти к уравнению в указанной канонической форме.
Управление возможно, если выполняется условие полной управляемости (ранг матрицы управляемости M
должен быть равен n
). В алгоритме об управляемости системы судится по существованию матрицы : если она существует, то ранг матрицы равен ее порядку ( n
). Для объекта управления с единственным управлением матрица оказывается также единственной.
Для нахождения коэффициентов характеристического уравнения (5), в работе используется соотношения между корнями и коэффициентами линейного алгебраического уравнения степени n
:
где многочлены - элементарные симметрические функции, определяемые следующим образом:
где S k
- сумма всех произведений, каждое из которых содержит k
сомножителей x j
с несовпадающими коэффициентами.
Текст программной реализации приведен в ПРИЛОЖЕНИИ №1. Вот несколько кратких пояснений.
· Программа написана на языке ObjectPascal при помощи средств Delphi 2.0, и состоит из следующих основных файлов:
· 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);
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, Tabnotbk, Menus, StdCtrls, Spin, ExtCtrls, Buttons, Grids,
OleCtrls, VCFImprs, GraphSvr, ChartFX {, ChartFX3};
TabbedNotebook_Main: TTabbedNotebook;
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;
procedure StringGrid_SetEditText(Sender: TObject; ACol,
ARow: Longint; const Value: string);
procedure BitBtn_HelpClick(Sender: TObject);
procedure RadioGroupChartClick(Sender: TObject);
procedure FillFixedCellsInAllGrids;
uses Matrix, SubUnit, OptsUnit, Operates, CFXOCX2, HelpUnit;
DefOptions = [goFixedVertLine, goFixedHorzLine,
goAlwaysShowEditor, goThumbTracking];
procedure TForm_Main.FillFixedCellsInAllGrids;
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] := 'Время';
procedure TForm_Main.FillCellsInAllGrids;
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';
StringGrid_Roots.Cells[0, 1] := 'Re';
StringGrid_Roots.Cells[0, 2] := 'Im';
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];
StringGrid_Ap1.Options := DefOptions;
StringGrid_Bp1.Options := DefOptions;
StringGrid_Kpp1.Options := DefOptions;
procedure TForm_Main.BitBtn_CloseClick(Sender: TObject);
procedure TForm_Main.BitBtn_OptionsClick(Sender: TObject);
if ((SpinEdit0.Value <> V0) or (SpinEdit1.Value <> V1)) or
((SpinEdit2.Value <> V2) or (SpinEdit3.Value <> V3)) then
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;
procedure TForm_Main.BitBtn_ComputeClick(Sender: TObject);
if Form_Options.CheckBox_Link.State = cbChecked then BindGrids;
case TabbedNotebook_Main.PageIndex of
BitBtn_Compute.Tag := BitBtn_Compute.Tag + 1;
ShowChart(Succ(RadioGroupChart.ItemIndex));
BitBtn_Compute.Tag := BitBtn_Compute.Tag + 14;
BitBtn_Compute.Tag := BitBtn_Compute.Tag + 4;
BitBtn_Compute.Tag := BitBtn_Compute.Tag + 8;
procedure TForm_Main.FormCreate(Sender: TObject);
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);
StringGrid_Roots.ColCount := Order;
StringGrid_ABKpp1.ColCount := Order;
StringGrid_ABKpp1.RowCount := Order;
StringGrid_InCond.ColCount := Order;
procedure TForm_Main.StringGrid_RootsSetEditText(Sender: TObject; ACol,
ARow: Longint; const Value: string);
if (ARow = 2) and (Value <> '') then
Val := StringGrid_Roots.Cells [ACol, ARow];
StringGrid_Roots.Cells[Succ(ACol),ARow]:=FloatToStr(- StrToFloat(Value));
StringGrid_Roots.Cells [Succ(ACol),ARow] := FloatToStr(0);
procedure TForm_Main.RadioGroup_RootsTypeClick(Sender: TObject);
case RadioGroup_RootsType.ItemIndex of
0 :StringGrid_Roots.Options := DefOptions;
StringGrid_Roots.Cells [j, 1] := FloatToStr (-W);
StringGrid_Roots.Cells [j, 2] := '0';
StringGrid_Roots.Options := DefOptions - [goEditing];
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);
StringGrid_Roots.Cells [NHalf +1, 1] := FloatToStr (-W);
StringGrid_Roots.Cells [NHalf +1, 2] := '0';
StringGrid_Roots.Options := DefOptions - [goEditing];
procedure TForm_Main.TabbedNotebook_MainChange(Sender: TObject;
NewTab: Integer; var AllowChange: Boolean);
if Tag in [1, 3, 5, 7, 9, 11, 13, 15] then Enabled := False
BitBtn_Compute.Caption := 'Рассчитать модальное управление';
if Tag in [2, 3, 6, 7, 10, 11, 14, 15] then Enabled := False
BitBtn_Compute.Caption := 'Решить системы дифф. уравнений ';
if Form_Options.CheckBox_Link.State = cbChecked then BindGrids;
if Tag in [4, 5, 6, 7, 12, 13, 14, 15] then Enabled := False
BitBtn_Compute.Caption := 'Обновить результаты решений ';
if Tag in [8, 9, 10, 11, 12, 13, 14, 15] then Enabled := False
BitBtn_Compute.Caption := 'Обновить диаграмму решения ';
procedure TForm_Main.StringGrid_SetEditText(Sender: TObject; ACol,
ARow: Longint; const Value: string);
case TabbedNotebook_Main.PageIndex of
0 :if Form_Options.CheckBox_Link.State = cbChecked then
BitBtn_Compute.Tag := BitBtn_Compute.Tag - 3
BitBtn_Compute.Tag := BitBtn_Compute.Tag - 1;
1 :BitBtn_Compute.Tag := BitBtn_Compute.Tag - 2;
procedure TForm_Main.BitBtn_HelpClick(Sender: TObject);
procedure TForm_Main.RadioGroupChartClick(Sender: TObject);
procedure CopyGrid(AGrid, BGrid: TStringGrid);
procedure LoadMatrixSolveFromStrGrd (AMatrix: TMatrix; AGrid: TStringGrid);
procedure ShowChart(NumberOfChart: Byte);
procedure CopyGrid(AGrid, BGrid: TStringGrid);
AGrid.Cells[j, i] := BGrid.Cells[j, i];
function CropStr (Str: String): String;
if Str [i] = ' ' then Str := Copy(Str, 1, i-1)
if Str[i] = ' ' then Str_1 := Copy(Str, i+1, Length(Str) - i)
procedure LoadMatrixFromStrGrd (AMatrix: TMatrix; AGrid: TStringGrid);
AMatrix.Resize (Pred(AGrid.ColCount), Pred(AGrid.RowCount));
if CropStr(AGrid.Cells[j, i]) = '' then AGrid.Cells[j, i] := '0';
AMatrix[j ,i] := StrToFloat(AGrid.Cells[j, i])
procedure OutPutMatrixToStrGrd (AMatrix: TMatrix; AGrid: TStringGrid);
AGrid.ColCount := Succ(AMatrix.ColCount);
AGrid.RowCount := Succ(AMatrix.RowCount);
AGrid.Cells[j, i] := FloatToStrF(AMatrix[j ,i],ffGeneral,5,3);
procedure OutPutMatrixSolveToStrGrd (AMatrix: TMatrix; AGrid: TStringGrid);
AGrid.ColCount := AMatrix.ColCount;
AGrid.RowCount := Succ(AMatrix.RowCount);
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);
procedure LoadMatrixSolveFromStrGrd (AMatrix: TMatrix; AGrid: TStringGrid);
AMatrix.Resize (AGrid.ColCount, Pred(AGrid.RowCount));
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])
mA := TMatrix.Create(Order, Order);
mM := TMatrix.Create(Order, Order);
mDummy1 := TMatrix.Create(Order, Order);
mN := TMatrix.Create(Order, Order);
mDummy2 := TMatrix.Create(Order, Order);
LoadMatrixFromStrGrd (mA, StringGrid_Ap0);
LoadMatrixFromStrGrd (mB, StringGrid_Bp0);
Raise ESingularMatrix.Create('Система неполностью управляема:' +
'Измените значения коэффициентов матриц А и B');
for j := 1 to Order do mN[j, i] := mDummy1[j, 1];
Raise ESingularMatrix.Create('Не могу обратить матрицу N !!!'#10 +
'(не разбрасывайтесь порядками коэффициентов матриц)');
OutPutMatrixToStrGrd(mA, StringGrid_Anp0);
cvRoots.Data[j].Re := StrToFloat(StringGrid_Roots.Cells[j, 1]);
cvRoots.Data[j].Im := StrToFloat(StringGrid_Roots.Cells[j, 2]);
if Odd (j) then K := -1 else K := +1;
mKp[Order-Pred(j), 1] := - mA[Order-Pred(j), Order] -
K * SymmetricalFunction(cvRoots, j);
OutPutMatrixToStrGrd (mKp, StringGrid_Kpp0);
mA, mB, mABKp, mInCond, mKp: TMatrix;
LowerLimit, UpperLimit, NumReturn, NumIntervals: Word;
mA := TMatrix.Create(Order, Order);
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);
OutPutMatrixToStrGrd(mABKp, StringGrid_ABKpp1);
mB.MultConst(StrToFloat(Edit_U.Text));
mSolutionValues := TMatrix.Create(1, 1);
OutPutMatrixSolveToStrGrd(mSolutionValues, StringGrid_Solve1);
OutPutMatrixSolveToStrGrd(mSolutionValues, StringGrid_Solve2);
EO.Message := 'Не буду считать !!!'#10 +
'С уменьшите разброс коэффициентов в матрицах'#10 +
'либо измените опции (уменьшите их pls.)';
procedure ShowChart(NumberOfChart: Byte);
if mSolutionValues[j, i] > Greatest then Greatest := mSolutionValues[j, i];
if mSolutionValues[j, i] < Least then Least := mSolutionValues[j, i];
Form_Main.ChartFX.Adm[CSA_MAX] := Greatest;
Form_Main.ChartFX.Adm[CSA_MIN] := Least;
Form_Main.ChartFX.Title[CHART_TOPTIT] := 'Y = Y '' * ';
NumReturn := Form_Options.SpinEdit2.Value;
mSolutionValues := TMatrix.Create(1, 1);
LoadMatrixSolveFromStrGrd(mSolutionValues, StringGrid_Solve1);
ChartFX.OpenDataEx(Cod_Values, Order, Pred(NumReturn));
ChartFX.SerLeg[Pred(Serie)] := 'X ' + IntToStr(Serie);
for Point := 0 to Pred(NumReturn) do
ChartFX.Value[Point] := mSolutionValues[Serie, Succ(Point)];
ChartFX.OpenDataEx(Cod_XValues, Order, Pred(NumReturn));
for Point := 0 to Pred(NumReturn) do
ChartFX.XValue[Point] := mSolutionValues[1, Succ(Point)];
LoadMatrixSolveFromStrGrd(mSolutionValues, StringGrid_Solve2);
ChartFX.OpenDataEx(Cod_Values, Order, Pred(NumReturn));
ChartFX.SerLeg[Pred(Serie)] := 'X ' + IntToStr(Serie);
for Point := 0 to Pred(NumReturn) do
ChartFX.Value[Point] := mSolutionValues[Serie, Succ(Point)];
case Form_Main.RadioGroupChart.ItemIndex of
EMatrixOperatingError = class (Exception);
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);
constructor Create (NCols, NRows: Word);
procedure Assign (AMatrix: TMatrix);
procedure ReSize (NewCols, NewRows: Word);
procedure AddConst (AConst: Float);
procedure AddMatrix (AMatrix: TMatrix);
procedure MultConst (MConst: Float);
procedure MultFromRight (MMatrix: TMatrix);
procedure MultFromLeft (MMatrix: TMatrix);
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;
function IncPtr (p: Pointer; i: LongInt): Pointer;
function TMatrix.GetCell (ACol, ARow: Word): Float;
CellPtr := IncPtr(DataPtr, (FRows * Pred(ACol) + Pred(ARow)) * SizeOf(Float));
procedure TMatrix.SetCell (ACol, ARow: Word; AValue: Float);
CellPtr := IncPtr(DataPtr, (FRows * Pred(ACol) + Pred(ARow)) * SizeOf(Float));
function TMatrix.GetItem (NumItem: LongInt): Float;
CellPtr := IncPtr(DataPtr, Pred(NumItem) * SizeOf(Float));
procedure TMatrix.SetItem (NumItem: LongInt; AValue: Float);
CellPtr := IncPtr(DataPtr, Pred(NumItem) * SizeOf(Float));
procedure TMatrix.SwitchRows (FirstRow, SecondRow: Word);
SetCell(i, FirstRow, GetCell(i, SecondRow));
constructor TMatrix.Create (NCols, NRows: Word);
DataPtr := AllocMem(FCols * FRows * SizeOf(Float));
procedure TMatrix.Assign (AMatrix: TMatrix);
NewMatrixSize := AMatrix.ColCount * AMatrix.RowCount * SizeOf(Float);
ReAllocMem(DataPtr, NewMatrixSize);
CopyMemory(DataPtr, AMatrix.DataPtr, NewMatrixSize);
procedure TMatrix.ReSize (NewCols, NewRows: Word);
NewMatrixSize := NewCols * NewRows * SizeOf(Float);
ReAllocMem(DataPtr, NewMatrixSize);
ZeroMemory (DataPtr, FCols * FRows * SizeOf(Float));
Raise EMatrixOperatingError.Create ('Единичнаяматрицадолжнабыть '+
for i := 1 to FCols do SetCell (i, i, 1);
for i := 1 to FCols * FRows do SetItem(i, - GetItem(i));
procedure TMatrix.AddConst (AConst: Float);
for i := 1 to FCols * FRows do SetItem (i, GetItem(i) + AConst);
procedure TMatrix.AddMatrix (AMatrix: TMatrix);
for i := 1 to FCols * FRows do SetItem (i, GetItem(i) + AMatrix.Items [i]);
procedure TMatrix.MultConst (MConst: Float);
for i := 1 to FCols * FRows do SetItem (i, GetItem(i) * MConst);
procedure TMatrix.MultFromRight (MMatrix: TMatrix);
DummyMatrix := TMatrix.Create (MMatrix.ColCount, FRows);
Raise EMatrixOperatingError.Create ('Перемножаемыематрицыдолжныбыть '+
DummyRes := DummyRes + Cells[k, i] * MMatrix[j, k];
procedure TMatrix.MultFromLeft (MMatrix: TMatrix);
DummyMatrix := TMatrix.Create (FCols, MMatrix.RowCount);
Raise EMatrixOperatingError.Create ('Перемножаемыематрицыдолжныбыть '+
DummyRes := DummyRes + MMatrix[k, i] * Cells[j, k];
procedure TMatrix.NthPower (Power: Word);
DummyMatrix := TMatrix.Create (FCols, FRows);
Raise EMatrixOperatingError.Create ('Возводимая в степень матрица должна '+
for i := 2 to Power do MultFromRight (DummyMatrix);
Raise EMatrixOperatingError.Create ('Транспонируемаяматрицадолжнабыть '+
DummyMatrix := TMatrix.Create (FCols, FRows);
if (FCols <> FRows) or (FCols = 0) then
Raise EMatrixOperatingError.Create ('Инвертируемаяматрицадолжнабыть '+
'квадратной и ненулевого размера');
if ABS(GetItem(1)) < NearlyZero then Singular := True
else DummyMatrix.Items[1] := 1 / GetItem(1);
if ABS(Cells[RefRow, RefRow]) < NearlyZero then
if ABS(Cells[RefRow, NewRow]) > NearlyZero then
DummyMatrix.SwitchRows(NewRow, RefRow);
until (not Singular) or (NewRow >= FCols);
SetCell(Term, RefRow, GetCell(Term, RefRow)/Divisor);
DummyMatrix[Term, RefRow] := DummyMatrix[Term, RefRow]/Divisor;
if (Row <> RefRow) and (ABS(Cells[RefRow, Row]) > NearlyZero) then
Multiplier := - Cells[RefRow, Row] / Cells[RefRow, RefRow];
SetCell(Term, Row, GetCell(Term, Row) +
Multiplier * GetCell(Term, RefRow));
DummyMatrix[Term, Row] := DummyMatrix[Term, Row] +
Multiplier * DummyMatrix[Term, RefRow];
until Singular or (RefRow >= FCols);
if not Singular then Result := True
function TMatrix.Determinant: Float;
ESingularMatrix = class (Exception);
Data : array [1..MaxArraySize] of TComplex;
function SymmetricalFunction (Roots: TComplexVector; K: byte): Float;
procedure DiffSystemSolve (matrixA,
function SymmetricalFunction (Roots: TComplexVector; K: byte): Float;
function SummComplex (FirstNC, SecondNC: TComplex): TComplex;
Result.Re := FirstNC.Re + SecondNC.Re;
Result.Im := FirstNC.Im + SecondNC.Im;
function MultComplex (FirstNC, SecondNC: TComplex): TComplex;
Result.Re := FirstNC.Re * SecondNC.Re - FirstNC.Im * SecondNC.Im;
Result.Im := FirstNC.Re * SecondNC.Im + FirstNC.Im * SecondNC.Re;
function DivComplex (FirstNC, SecondNC: TComplex): TComplex;
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;
function CombinationSumm (LowLimit, HighLimit, K: byte): TComplex;
if LowLimit = HighLimit then Result := Roots.Data[LowLimit]
for i := LowLimit to HighLimit - K + 1 do
if K = 1 then Result := SummComplex(Result, Roots.Data [i])
Z := CombinationSumm(1, Roots.Dim, K);
procedure DiffSystemSolve (matrixA, matrixB: TMatrix;
function TargetALL (matrixA, mayrixB: TMatrix; Values: TMatrix; KRow: Word): Float;
Result := Result + matrixA[j, KRow] * Values.Items[j];
on EO: EOverflow do EO.Message := 'Небудусчитать !!!'#10 +
'С уменьшите разброс коэффициентов в матрице А'#10 +
'либо измените опции (уменьшите их pls.)';
procedure Push (var ValuesStack: Ptr;
NewNode^.Values := TMatrix.Create(NumTimeCol, 1);
NewNode^.Values.Assign(CurrentValues);
procedure Pop (var ValuesStack: Ptr;
CurrentValues.Assign(OldNode^.Values);
procedure GetValues(NumReturn, NumIntervals: Word; var ValuesStack: Ptr;
SolutionValues.ReSize(NumTimeCol, Succ(NumReturn));
CurrValues := TMatrix.Create(NumTimeCol, 1);
while (Term / NumIntervals >= Index / NumReturn) and (Term >= 0) do
SolutionValues[j, Succ(Index)] := CurrValues.Items[j];
procedure Step(Spacing: Float; CurrentValues: TMatrix; F: TMatrix);
F.Items[i] := Spacing * TargetALL (matrixA, matrixB, CurrentValues, i);
Spacing := (UpperLimit - LowerLimit) / NumIntervals;
CurrentValues := TMatrix.Create(1, 1);
CurrentValues.Assign(InitialValues);
CurrentValues.ReSize(NumTimeCol, 1);
CurrentValues.Items[NumTimeCol] := LowerLimit;
TempValues := TMatrix.Create(NumTimeCol, 1);
F1 := TMatrix.Create(NumTimeCol, 1);
F2 := TMatrix.Create(NumTimeCol, 1);
F3 := TMatrix.Create(NumTimeCol, 1);
F4 := TMatrix.Create(NumTimeCol, 1);
TempValues.Items[NumTimeCol] := CurrentValues.Items[NumTimeCol] + HalfSpacing;
TempValues.Items[Term] := CurrentValues.Items[Term] + 0.5 * F1.Items[Term];
TempValues.Items[Term] := CurrentValues.Items[Term] + 0.5 * F2.Items[Term];
TempValues.Items[NumTimeCol] := CurrentValues.Items[NumTimeCol] + Spacing;
TempValues.Items[Term] := CurrentValues.Items[Term] + F3.Items[Term];
{ Fourth step - calculate F4[1]; first equation }
{ Combine F1, F2, F3, and F4 to get }
{ the solution at this mesh point }
CurrentValues.Items[NumTimeCol] := CurrentValues.Items[NumTimeCol] + Spacing;
CurrentValues.Items[Term] := CurrentValues.Items[Term] +
(F1.Items[Term] + 2 * F2.Items[Term] +
2 * F3.Items[Term] + F4.Items[Term]) /6;
GetValues(NumReturn, NumIntervals, ValuesStack, SolutionValues);
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
procedure SpinEdit0Change(Sender: TObject);
procedure SpinEdit2Change(Sender: TObject);
procedure CheckBox_LinkClick(Sender: TObject);
procedure TForm_Options.SpinEdit0Change(Sender: TObject);
SpinEdit1.MinValue := Succ(SpinEdit0.Value);
if SpinEdit1.Value < SpinEdit1.MinValue then SpinEdit1.Value:= SpinEdit1.MinValue;
procedure TForm_Options.SpinEdit2Change(Sender: TObject);
SpinEdit3.MinValue := SpinEdit2.Value;
if SpinEdit3.Value < SpinEdit3.MinValue then SpinEdit3.Value:= SpinEdit3.MinValue;
procedure TForm_Options.CheckBox_LinkClick(Sender: TObject);
if CheckBox_Link.State = cbChecked then Form_Main.BindGrids
Название: Программная реализация модального управления для линейных стационарных систем
Раздел: Рефераты по радиоэлектронике
Тип: реферат
Добавлен 17:52:39 26 июля 2005 Похожие работы
Просмотров: 139
Комментариев: 16
Оценило: 5 человек
Средний балл: 4.4
Оценка: неизвестно Скачать
Срочная помощь учащимся в написании различных работ. Бесплатные корректировки! Круглосуточная поддержка! Узнай стоимость твоей работы на сайте 64362.ru
Если Вам нужна помощь с учебными работами, ну или будет нужна в будущем (курсовая, дипломная, отчет по практике, контрольная, РГР, решение задач, онлайн-помощь на экзамене или "любая другая" учебная работа...) - обращайтесь: https://clck.ru/P8YFs - (просто скопируйте этот адрес и вставьте в браузер) Сделаем все качественно и в самые короткие сроки + бесплатные доработки до самой сдачи/защиты! Предоставим все необходимые гарантии.
Привет студентам) если возникают трудности с любой работой (от реферата и контрольных до диплома), можете обратиться на FAST-REFERAT.RU , я там обычно заказываю, все качественно и в срок) в любом случае попробуйте, за спрос денег не берут)
Да, но только в случае крайней необходимости.
Реферат: Программная реализация модального управления для линейных стационарных систем
Курсовая работа: Денежные затраты предприятий
План Курсовой Подготовки
Курсовая работа по теме История государства и права Франции
Дипломная работа по теме Теория и практика проблемного обучения в начальной школе
Трудовой Договор Курсовая
Реферат На Тему Основи Криптографії
Отчет по практике: Основные процессы, протекающие при производстве хлеба
Курсовая работа по теме Разработка системы управления базой данных 'Футбольная команда Manchester United'
Расследование Преступлений В Сфере Экономической Деятельности Курсовая
Дипломная работа по теме Анализ финансового состояния ООО ПТК 'ТАК'
Курсовая работа по теме Методика определения активного хлора в питьевой воде
Индивидуальность Эссе Обществознание
Курсовая работа по теме Половое воспитание подростков
Реферат: Экономические показатели библиотечной работы, их значение для оптимизации деятельности библиотеки. Скачать бесплатно и без регистрации
Ницше Хомо Эссе Слушать
Рецепт Семейного Счастья Сочинение
Дипломная работа по теме Формирование идеологии самурайского сословия в XVI-XVIII веках в Японии
Курсовая Работа По Разработке Сайта
Курсовая работа по теме Психологічні чинники задоволеності шлюбом
Курсовая работа по теме Реализация культурологического компонента обучения на уроках английского языка в средних классах
Доклад: Как уменьшить сумму налогов
Реферат: Инвентаризация
Реферат: Экзаменационные вопросы и билеты за первый семестр 2001 года по гостиничному бизнесу