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

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

Курсовая работа:

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

Постановка задачи:

1. Для объекта управления с математическим описанием

[pic], (1) [pic]- задано, где [pic] - n-мерный вектор состояния, [pic],

[pic]- начальный вектор состояния,

[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] - n-мерный вектор состояния

[pic]- скалярное управление,

[pic] - порядок системы (1).
. Обратная связь по состоянию имеет вид

[pic], (2) где[pic]- матрица обратной связи.
. Система с введенной обратной связью описывается уравнением

[pic] (3)
. Характеристическое уравнение системы (1) имеет вид

[pic] (4)
. Характеристическое уравнение системы (3) с задаваемыми (желаемыми) корнями [pic]имеет вид

[pic] (5)

Алгоритм:
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], то коэффициенты матрицы обратной связи вычисляются с помощью соотношений:

[pic]
Если при наличии одного управления нормальные уравнения объекта заданы не в канонической форме (что наиболее вероятно), то, в соответствии с пунктами
№1-6 алгоритма, от исходной формы с помощью преобразования [pic] или [pic] нужно перейти к уравнению [pic] в указанной канонической форме.
Управление возможно, если выполняется условие полной управляемости (ранг матрицы управляемости M должен быть равен n). В алгоритме об управляемости системы судится по существованию матрицы [pic]: если она существует, то ранг матрицы равен ее порядку (n). Для объекта управления с единственным управлением матрица [pic] оказывается также единственной.
Для нахождения коэффициентов [pic] характеристического уравнения (5), в работе используется соотношения между корнями [pic] и коэффициентами
[pic] линейного алгебраического уравнения степени n:

[pic], (k = 1, 2, ... , n) где многочлены [pic]- элементарные симметрические функции, определяемые следующим образом:

[pic],

[pic],

[pic],

...

[pic] где Sk - сумма всех [pic] произведений, каждое из которых содержит k сомножителей xj с несовпадающими коэффициентами.

Программная реализация алгоритма.

Текст программной реализации приведен в ПРИЛОЖЕНИИ №1. Вот несколько кратких пояснений.
. Программа написана на языке Object Pascal при помощи средств Delphi 2.0, и состоит из следующих основных файлов:

KursovayaWork.dpr

MainUnit.pas

SubUnit.pas

Matrix.pas

Operates.pas

HelpUnit.pas

OptsUnit.pas
. KursovayaWork.dpr - файл проекта, содержащий ссылки на все формы проекта и инициализирующий приложение.
. В модуле MainUnit.pas находится описание главной формы приложения, а также сконцентрированы процедуры и функции, поддерживаюшие нужный интерфейс программы.
. Модули SubUnit.pas и Operates.pas содержат процедуры и функции, составляющие смысловую часть программной реализации алгоритма, т.е. процедуры решения задачи модально управления, процедуры решения систем дифференциальных уравнений, процедуры отображения графиков решений систем и т.д. Там также находятся процедуры отображения результатов расчетов на экран.
. В модуле Matrix.pas расположено описание класса TMatrix - основа матричных данных в программе.
. Модули HelpUnit.pas и OptsUnit.pas носят в программе вспомогательный характер.
. Для решения систем дифференциальных уравнений использован метод Рунге-
Кутта четвертого порядка точности с фиксированным шагом. Метод был позаимствован из пакета программ NumToolBox и адаптирован под новую модель матричных данных.
. Обращение матриц производится методом исключения по главным диагональным элементам (метод Гаусса). Этот метод так же был позаимствован из
NumToolBox и соответствующе адаптирован.

Пориложение.

program KursovayaWork;

uses

Forms,

MainUnit in 'MainUnit.pas' {Form_Main},

OptsUnit in 'OptsUnit.pas' {Form_Options},

SubUnit in 'SubUnit.pas',

Matrix in 'Matrix.pas',

Operates in 'Operates.pas',

HelpUnit in 'HelpUnit.pas' {Form_Help};

{$R *.RES}

begin

Application.Initialize;

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;

interface

uses

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

ComCtrls, Tabnotbk, Menus, StdCtrls, Spin, ExtCtrls, Buttons, Grids,

OleCtrls, VCFImprs, GraphSvr, ChartFX {, ChartFX3};

type

TForm_Main = class(TForm)

BevelMain: TBevel;

TabbedNotebook_Main: TTabbedNotebook;

SpinEdit_Dim: TSpinEdit;

BitBtn_Close: TBitBtn;

BitBtn_Compute: TBitBtn;

StringGrid_Ap0: TStringGrid;

StringGrid_Anp0: TStringGrid;

StringGrid_Roots: TStringGrid;

StringGrid_Kpp0: TStringGrid;

StringGrid_Bp0: TStringGrid;

RadioGroup_RootsType: TRadioGroup;

Label_A1p0: TLabel;

Label_Ap0: TLabel;

Label_mBp0: TLabel;

Label_Roots: TLabel;

Label_Kpp0: TLabel;

BevelLine: TBevel;

Label_Dim: TLabel;

StringGrid_Ap1: TStringGrid;

StringGrid_Bp1: TStringGrid;

Label_Ap1: TLabel;

Label_Bp1: TLabel;

StringGrid_Kpp1: TStringGrid;

Label_Kpp1: TLabel;

StringGrid_InCond: TStringGrid;

Label_InCond: TLabel;

Label_U: TLabel;

Edit_U: TEdit;

BitBtn_Options: TBitBtn;

BitBtn_Help: TBitBtn;

StringGrid_ABKpp1: TStringGrid;

Label_ABKpp1: TLabel;

Edit_W: TEdit;

Label_w: TLabel;

RadioGroupChart: TRadioGroup;

ChartFX: TChartFX;

LabelW1: TLabel;

StringGrid_Solve1: TStringGrid;

StringGrid_Solve2: TStringGrid;

Label1: TLabel;

Label2: TLabel;

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;

var

Form_Main: TForm_Main;

implementation

uses Matrix, SubUnit, OptsUnit, Operates, CFXOCX2, HelpUnit;

const

DefOptions = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goColSizing, goEditing, goAlwaysShowEditor, goThumbTracking];
{$R *.DFM}

procedure TForm_Main.FillFixedCellsInAllGrids; var

Order : TOrder; i: byte;

Str: string; begin

Order := SpinEdit_Dim.Value; for i := 1 to Order do begin

Str := IntToStr(i);

StringGrid_Ap0.Cells[0, i] := Str;

StringGrid_Ap0.Cells[i, 0] := Str;

StringGrid_Bp0.Cells[0, i] := Str;

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_Ap1.Cells[0, i] := Str;

StringGrid_Ap1.Cells[i, 0] := Str;

StringGrid_Bp1.Cells[0, i] := 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 : TOrder; i, j : byte; begin

Order := SpinEdit_Dim.Value; for i := 1 to Order do for j := 1 to Order do begin

StringGrid_Ap0.Cells[j, i] := '0';

StringGrid_Ap0.Cells[i, i] := '1';

StringGrid_Bp0.Cells[1, i] := '0';

StringGrid_Roots.Cells[i, 1] := '-1';

StringGrid_Roots.Cells[i, 2] := '0';

StringGrid_Kpp0.Cells[i, 1] := '0';

StringGrid_Ap1.Cells[j, i] := '0';

StringGrid_Ap1.Cells[i, i] := '1';

StringGrid_Bp1.Cells[1, i] := '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;

FillFixedCellsInAllGrids;

StringGrid_Roots.Cells[0, 1] := 'Re';

StringGrid_Roots.Cells[0, 2] := 'Im';

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

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

Close; end;

procedure TForm_Main.BitBtn_OptionsClick(Sender: TObject); var

V0, V1, V2, V3: LongInt;

LS: TCheckBoxState; begin with Form_Options do begin

V0 := SpinEdit0.Value;

V1 := SpinEdit1.Value;

V2 := SpinEdit2.Value;

V3 := SpinEdit3.Value;

LS := CheckBox_Link.State;

ShowModal; if ModalResult = mrCancel then begin

SpinEdit0.Value := V0;

SpinEdit1.Value := V1;

SpinEdit2.Value := V2;

SpinEdit3.Value := V3;

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

0 : begin

ComputeFromPage0;

BitBtn_Compute.Tag := BitBtn_Compute.Tag + 1; end;

1 : begin

ComputeFromPage1;

ShowChart(Succ(RadioGroupChart.ItemIndex));

BitBtn_Compute.Tag := BitBtn_Compute.Tag + 14; end;

2 : begin

ComputeFromPage2;

BitBtn_Compute.Tag := BitBtn_Compute.Tag + 4; end;

3 : begin

ComputeFromPage3;

BitBtn_Compute.Tag := BitBtn_Compute.Tag + 8; end; end; end;

procedure TForm_Main.FormCreate(Sender: TObject); const

FirstColWidth = 20; begin

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;

FillCellsInAllGrids;

BindGrids; end;

procedure TForm_Main.SpinEdit_DimChange(Sender: TObject); var

Order: byte; begin

Order := Succ(SpinEdit_Dim.Value);

StringGrid_Ap0.ColCount := Order;

StringGrid_Ap0.RowCount := Order;

StringGrid_Anp0.ColCount := Order;

StringGrid_Anp0.RowCount := Order;

StringGrid_Bp0.RowCount := Order;

StringGrid_Roots.ColCount := Order;

StringGrid_Kpp0.ColCount := Order;

StringGrid_Ap1.ColCount := Order;

StringGrid_Ap1.RowCount := Order;

StringGrid_Bp1.RowCount := Order;

StringGrid_ABKpp1.ColCount := Order;

StringGrid_ABKpp1.RowCount := Order;

StringGrid_InCond.ColCount := Order;

StringGrid_Kpp1.ColCount := Order;

FillFixedCellsInAllGrids;

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

Order: TOrder; j: byte;

NHalf: byte;

StartAlfa, NAlfa, dAlfa: Float;

W: Float; begin

Order := SpinEdit_Dim.Value;

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;

2 :begin dAlfa := Pi / Order;

StartAlfa := Pi/2 - dAlfa/2;

NHalf := Order div 2; for j := 1 to NHalf do begin

NAlfa := StartAlfa + dAlfa * j;

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;

end;

procedure TForm_Main.TabbedNotebook_MainChange(Sender: TObject;

NewTab: Integer; var AllowChange: Boolean); begin with BitBtn_Compute do case NewTab of

0 :begin

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;

1 :begin

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;

2 :begin

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;

3 :begin

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

Страницы: 1, 2



Реклама
В соцсетях
бесплатно скачать рефераты бесплатно скачать рефераты бесплатно скачать рефераты бесплатно скачать рефераты бесплатно скачать рефераты бесплатно скачать рефераты бесплатно скачать рефераты