Программная реализация модального управления для линейных стационарных систем
Программная реализация модального управления для линейных стационарных систем
Курсовая работа:
«Программная реализация модального управления
для линейных стационарных систем»
Постановка задачи:
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;
Страницы: 1, 2, 3
|