- •Задание на расчетно-графическую работу
- •Исходные данные для исследования.
- •Выбор переменных состояния и формировка уравнений состояния в пространстве состояний.
- •Получение эквивалентной передаточной функции системы.
- •Определение фробениусовой канонической формы уравнений состояния.
- •Определение жордановой канонической формы уравнений состояния.
- •Определение устойчивости, управляемости и наблюдаемости исследуемой сау.
- •Определение устойчивости исследуемой системы.
- •Определение управляемости исследуемой системы.
- •Определение наблюдаемости исследуемой системы.
- •Получение переходной характеристики с помощью системы matlab.
- •Составление программы расчета переходной характеристики исследуемой сау.
- •Определение переходной характеристики исследуемой сау с помощью составленной программы и оценка параметров системы.
- •Получение графических изображений реакций сау при одиночных трапецеидальном, импульсном и гармоническом сигналах.
- •Получение графического изображения реакции сау при последовательностях единичного ступенчатого, импульсного и гармонического сигналов.
- •Анализ-заключение по результатам работы.
- •Список используемой литературы
- •Приложение. Листинг программы.
Приложение. Листинг программы.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Buttons, ExtCtrls, jpeg, pngimage, Grids,CategoryButtons;
type
TMass= array of array of Real;
TVector= array of Real;
TVec= array of array of Integer;
type
TForm1 = class(TForm)
procedure BitBtn4Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure RadioGroup1Click(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
procedure Edit12Change(Sender: TObject);
private
procedure RK22 (A:TMass; n: integer; var t,U1: Extended; h: real; var X: TVector);
function RP(n: integer; A: TMass; X: TVector; t: real; U1:Extended): Real;
function Read(Str: string; i,j: integer): Real;
function ReadPS(Str: string; j,n: integer): Integer;
function Signal(i: byte;t: Extended): Real;
function Trapеzion(t: Extended): Real;
function Harmonic(t: Extended): Real;
function Impulse(t: Extended): Real;
function ReadSignal(t: Extended): Extended;
end;
var
Form1: TForm1;
C,A: TMass;
F,Z: TVector;
P: TVec;
t: Extended;
i,j,k: integer;
implementation
uses Unit2, Unit3;
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject);
var
tk: real;
n: integer;
X: TVector;
U: Extended;
U1: Extended;
const
h = 0.001;
begin
Form2.Series1.Clear;
Form2.Series2.Clear;
Form1.Left:= (Screen.Width - Form1.Width) div 2;
Form1.Top:= Screen.Height - Form1.Height - 50;
Form2.Left:= (Screen.Width - Form2.Width) div 2;
Form2.Top:= Form1.Top - 250 ;
Form2.Show;
t:= 0; // начальное время
tk:= StrToFloat(Edit13.Text); // конечное время
n:= StrToInt(Edit12.Text); // кол-во уравнений состояния
SetLength(X,n);
for i := 0 to (n-1) do
begin
X[i]:=0;
end;
i:=0;
for j := 0 to n do
begin
SetLength(P,i+1,j+1);
SetLength(C,i+1,j+1);
P[i,j]:= ReadPS(Edit6.Text,j,n);
C[i,j]:= Read(Edit6.Text,i,j);
end;
P:= nil;
SetLength(P,n,(n+1));
SetLength(A,n,(n+1));
for i := 0 to (n-1) do
for j := 0 to n do
begin
P[i,j]:= ReadPS(StringGrid2.Rows[i].Text,j,n);
A[i,j]:= Read(StringGrid2.Rows[i].Text,i,j);
end;
while (t<tk) do
begin
U1:= ReadSignal(t);
RK22(A,n,t,U1,h,X);
U:=0;
for j := 0 to n do
begin
if (j<n) then
U:= U + C[0,j]*X[j]
else
U:= U + C[0,j]*U1;
end;
Form2.Series1.AddXY(t,U);
t:=t+h;
end;
Form2.Chart1.Title.Caption:= 'Реакция САУ на';
case RadioGroup1.ItemIndex of
0:Form2.Chart1.Title.Caption:= Form2.Chart1.Title.Caption + ' единичное ступенчатое воздействие';
1:Form2.Chart1.Title.Caption:= Form2.Chart1.Title.Caption + ' трапецеидальное воздействие';
2:Form2.Chart1.Title.Caption:= Form2.Chart1.Title.Caption + ' гармоническое воздействие';
3:Form2.Chart1.Title.Caption:= Form2.Chart1.Title.Caption + ' импульсное воздействие';
end;
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
Form3 := TForm3.Create(Self);
try
begin
Form3.Image1.Picture.LoadFromFile('info.png');
Form3.ShowModal;
end;
finally
Form3.Free;
end;
end;
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
Form2.Close;
case RadioGroup1.ItemIndex of
0: i:=0;
1: i:=1;
2: i:=2;
3: i:=3;
end;
TRadioButton( RadioGroup1.Controls[i] ).Font.Size:= 9;
Timer2.Enabled:= True;
Image2.Picture.LoadFromFile('iChat.png');
Edit7.Text:='';
Edit8.Text:='';
Edit9.Text:='';
Edit10.Text:='';
Edit11.Text:='';
end;
function TForm1.Read(Str: string; i,j: integer): Real;
var
k1,k2: integer;
begin
if P[i,j]=0 then
begin
Result:=0;
end
else
begin
if (j=0) then
k1:= 1
else
k1:= P[i,j-1] + 5;
k2:= P[i,j] - k1;
Result:= StrToFloat(copy(Str,k1,k2));
end;
end;
function TForm1.ReadPS(Str: string; j, n: integer): integer;
var
S, Z: string;
begin
Z:= '*X[';
Inc(j);
if (j<=n) then
begin
S:= Z + IntToStr(j) + ']';
result:= Pos(S,Str);
end
else
result:= Pos('*U',Str);
end;
function TForm1.ReadSignal(t: Extended): Extended;
begin
case RadioGroup1.ItemIndex of
0: result:=Signal(0,t);
1: begin
if (Edit7.Text='') or (Edit8.Text='') or (Edit9.Text='') or(Edit10.Text='') or (Edit11.Text='') then
begin
Mes;
exit;
end;
result:=Signal(1,t);
end;
2: begin
if (Edit7.Text='') or (Edit9.Text='') or (Edit11.Text='') then
begin
Mes;
exit;
end;
result:=Signal(2,t);
end;
3: begin
if (Edit7.Text='') or (Edit9.Text='') or(Edit10.Text='') or (Edit11.Text='') then
begin
Mes;
exit;
end;
result:=Signal(3,t);
end;
end;
end;
procedure TForm1.RK22(A: TMass; n: integer; var t,U1: Extended; h: real; var X: TVector);
var
h2: real;
X1: TVector;
begin
h2:=h/2;
SetLength(X1,n);
SetLength(F,n);
for i:= 0 to (n-1) do
begin
F[i]:= RP(n,A,X,t,U1);
X1[i]:= X[i]+h2*F[i];
end;
for i:= 0 to (n-1) do
begin
F[i]:= RP(n,A,X1,t,U1);
X[i]:=X[i]+h*F[i];
end;
end;
function TForm1.RP(n: integer; A: TMass; X: TVector; t: real;U1: Extended): Real;
begin
result:= 0;
for j := 0 to n do
begin
if j=0 then
result:= A[i,j]*X[j]
else
if (j<n) then
result:= result + A[i,j]*X[j]
else
result:= result + A[i,j]*U1;
end;
end;
function TForm1.Signal(i: byte; t: Extended): Real;
begin
case i of
0: begin
result:=1;
Form2.Series2.AddXY(t,result);
end;
1: result:= Trapеzion(t);
2: result:= Harmonic(t);
3: result:= Impulse(t);
end;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
const
L = 474;
begin
if RadioGroup1.ItemIndex=0 then
begin
Form1.Width := L;
Form1.Left:= (Screen.Width - Form1.Width) div 2;
Timer2.Enabled:= False;
exit;
end;
FormPlus;
while (Form1.ClientWidth < 859) do
begin
Form1.ClientWidth:= Form1.ClientWidth + 1;
Form1.Left:= (Screen.Width - Form1.Width) div 2;
end;
GroupBox8.Caption := '';
GroupBox8.Visible:= True;
GroupBox9.Visible:= True;
SpeedButton1.Caption:= 'A';
if RadioGroup1.ItemIndex=1 then
begin
GroupBox8.Caption := ' Трапецеидальный входной сигнал';
GroupBox10.Visible:= True;
GroupBox11.Visible:= True;
GroupBox12.Visible:= True;
GroupBox13.Visible:= True;
GroupBox14.Visible:= True;
Edit7.Visible:= True;
Edit8.Visible:= True;
Edit9.Visible:= True;
Edit10.Visible:= True;
Edit11.Visible:= True;
SpeedButton2.Caption:= 't0';
SpeedButton3.Caption:= 't1';
SpeedButton4.Caption:= 't2';
SpeedButton5.Caption:= 't3';
Image1.Picture.LoadFromFile('Trapеzion.png');
end;
if RadioGroup1.ItemIndex=2 then
begin
GroupBox8.Caption := ' Гармонический входной сигнал';
GroupBox10.Visible:= True;
GroupBox12.Visible:= True;
GroupBox14.Visible:= True;
Edit7.Visible:= True;
Edit9.Visible:= True;
Edit11.Visible:= True;
SpeedButton3.Caption:= 'w';
SpeedButton5.Caption:= 'f0';
Image1.Picture.LoadFromFile('Harmonic.png');
end;
if RadioGroup1.ItemIndex=3 then
begin
GroupBox8.Caption := ' Импульсный входной сигнал';
GroupBox10.Visible:= True;
GroupBox12.Visible:= True;
GroupBox13.Visible:= True;
GroupBox14.Visible:= True;
Edit7.Visible:= True;
Edit9.Visible:= True;
Edit10.Visible:= True;
Edit11.Visible:= True;
SpeedButton3.Caption:= 't1';
SpeedButton4.Caption:= 't2';
SpeedButton5.Caption:= 't3';
Image1.Picture.LoadFromFile('Impulse.png');
end;
if (Form1.ClientWidth = 859) then
StatusBar1.Panels[4].Text:=' Вид и числовые значения входного воздействия';
Timer2.Enabled:= False;
end;
function TForm1.Trapеzion(t: Extended): Real;
var
x0,x1,x2,x3,x4, l, a: Real;
begin
SetLength(Z,5);
Z[0]:= StrToFloat(Edit7.Text); // A
Z[1]:= StrToFloat(Edit9.Text); // t1
Z[2]:= StrToFloat(Edit10.Text); // t2
Z[3]:= StrToFloat(Edit11.Text); // t3
Z[4]:= StrToFloat(Edit8.Text); // t0
l:= Z[2]+Z[3];
if t<Z[4] then
begin
result:=0;
Form2.Series2.AddXY(t,result);
exit;
end
else
begin
t:= t - Z[4];
if t>l then
begin
i:= Trunc(t/l);
a:= i*l;
end
else
a:=0;
end;
x0:= a;
x1:= (Z[2] - Z[1])/2 + a;
x2:= 0.5*Z[1] + 0.5*Z[2] + a;
x3:= Z[2] + a;
x4:= Z[2] + Z[3] + a;
if (t>=x0) and (t<x1) then
result:= Z[0]*((t-x0)/(x1-x0));
if (t>=x1) and (t<x2) then
result:= Z[0];
if (t>=x2) and (t<=x3) then
result:= Z[0]*(1-((t-x2)/(x3-x2)));
if (t>x3) and (t<x4) then
result:= 0;
t:= t + Z[4];
Form2.Series2.AddXY(t,result);
end;
function TForm1.Harmonic(t: Extended): Real;
var
A, w, f: Real;
begin
A:= StrToFloat(Edit7.Text);
w:= StrToFloat(Edit9.Text);
f:= StrToFloat(Edit11.Text);
result:= A*sin(w*t+f);
Form2.Series2.AddXY(t,result);
end;
function TForm1.Impulse(t: Extended): Real;
var
x1,x2,x3, l, a: Real;
begin
SetLength(Z,4);
Z[0]:= StrToFloat(Edit7.Text); // A
Z[1]:= StrToFloat(Edit9.Text); // t1
Z[2]:= StrToFloat(Edit10.Text); // t2
Z[3]:= StrToFloat(Edit11.Text); // t3
l:= Z[2]+Z[3];
if t<Z[1] then
begin
result:=0;
Form2.Series2.AddXY(t,result);
exit;
end;
t:=t-Z[1];
if t>l then
begin
i:= Trunc(t/l);
a:= i*l;
end
else
a:=0;
x1:= a;
x2:= Z[2] + a;
x3:= Z[2] + Z[3]+ a;
if (t>=x1) and (t<x2) then result:= Z[0];
if (t>=x2) and (t<x3) then result:= 0;
t:= t + Z[1];
Form2.Series2.AddXY(t,result);
end;
end.