
- •Одесский национальный морской университет
- •1Идентификация обыкновенного дифференциального уравнения первого порядка
- •1.1 Исходные данные для идентификации
- •1.2 Методика идентификации
- •3. Моделирование работы динамической системы
- •3.1 Постановка задачи.
- •3.2 Приведение математической модели объекта к системе обыкновенных дифференциальных уравнений 1го порядка.
- •3.4 Выбор шага интегрирования для обеспечения устойчивого решения.
- •3 .6 Блок- схема алгоритма моделирования
- •3.7 Результаты моделирования.
- •1Использованные литературные источники
- •Приложение Приложение 1. Модули задачи идентификации.
- •Приложение 2. Модули задачи моделирования.
Приложение 2. Модули задачи моделирования.
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin, Grids;
type
TModelMainFm = class(TForm)
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Button1: TButton;
Edit11: TEdit;
Edit12: TEdit;
Label10: TLabel;
SpinEdit1: TSpinEdit;
Label11: TLabel;
Label12: TLabel;
Button2: TButton;
Button3: TButton;
StringGrid1: TStringGrid;
SaveDialog1: TSaveDialog;
procedure FormCreate(Sender: TObject);
procedure EditKeyPress(Sender: TObject; var Key: Char);
procedure Edit1Exit(Sender: TObject);
procedure Edit2Exit(Sender: TObject);
procedure Edit3Exit(Sender: TObject);
procedure Edit4Exit(Sender: TObject);
procedure Edit5Exit(Sender: TObject);
procedure Edit6Exit(Sender: TObject);
procedure Edit7Exit(Sender: TObject);
procedure Edit8Exit(Sender: TObject);
procedure Edit9Exit(Sender: TObject);
procedure Edit11Exit(Sender: TObject);
procedure Edit12Exit(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
procedure CheckVal(Ed : TEdit; var V : Double; Pres: Integer = 3);
procedure SaveToFile(Fn:String);
end;
var
ModelMainFm: TModelMainFm;
implementation
{$R *.dfm}
var
n : Integer;
A1,A2,B,K1,K2,K3,Z0,Y0,YY0,E,dt: Double;
T,X,Y,F,Z : array of Double;
procedure TModelMainFm.CheckVal(Ed: TEdit; var V: Double; Pres: Integer = 3);
begin
try
V := StrToFloat(Ed.Text);
Ed.Text := FloatToStrF(V,ffFixed,8,Pres);
except
on E: EConvertError do begin
ShowMessage('Неверное число');
Ed.SetFocus;
end;
end;
end;
procedure TModelMainFm.FormCreate(Sender: TObject);
begin
CheckVal(Edit1,A1);
CheckVal(Edit2,A2);
CheckVal(Edit3,B,5);
CheckVal(Edit4,K1);
CheckVal(Edit5,K2);
CheckVal(Edit6,K3,5);
CheckVal(Edit7,Y0);
CheckVal(Edit8,YY0);
CheckVal(Edit9,Z0);
CheckVal(Edit11,dt);
CheckVal(Edit12,E,5);
N := 25;
SetLength(T,n+1);
SetLength(X,n+1);
SetLength(Y,n+1);
SetLength(F,n+1);
SetLength(Z,n+1);
SaveDialog1.InitialDir := Application.ExeName;
end;
procedure TModelMainFm.EditKeyPress(Sender: TObject; var Key: Char);
var
Kt : Char;
begin
Kt := Key;
Key := #0;
if Kt in ['0'..'9',#3,#8,'-'] then Key := Kt;
if Kt in ['.',','] then Key := DecimalSeparator;
if Kt = #13 then SelectNext(ActiveControl,True,True);
end;
procedure TModelMainFm.Edit1Exit(Sender: TObject);
begin
CheckVal(Edit1,A1);
end;
procedure TModelMainFm.Edit2Exit(Sender: TObject);
begin
CheckVal(Edit2,A2);
end;
procedure TModelMainFm.Edit3Exit(Sender: TObject);
begin
CheckVal(Edit3,B,5);
end;
procedure TModelMainFm.Edit4Exit(Sender: TObject);
begin
CheckVal(Edit4,K1);
end;
procedure TModelMainFm.Edit5Exit(Sender: TObject);
begin
CheckVal(Edit5,K2);
end;
procedure TModelMainFm.Edit6Exit(Sender: TObject);
begin
CheckVal(Edit6,K3,5);
end;
procedure TModelMainFm.Edit7Exit(Sender: TObject);
begin
CheckVal(Edit7,Y0);
end;
procedure TModelMainFm.Edit8Exit(Sender: TObject);
begin
CheckVal(Edit8,YY0);
end;
procedure TModelMainFm.Edit9Exit(Sender: TObject);
begin
CheckVal(Edit9,Z0);
end;
procedure TModelMainFm.Edit11Exit(Sender: TObject);
begin
CheckVal(Edit11,dt);
end;
procedure TModelMainFm.Edit12Exit(Sender: TObject);
begin
CheckVal(Edit12,E,5);
end;
procedure TModelMainFm.SpinEdit1Change(Sender: TObject);
begin
n := SpinEdit1.Value;
end;
procedure TModelMainFm.Button1Click(Sender: TObject);
var
i,G : Integer;
D1,D2,D3,D4,D5,D6,D7 : Double;
YY,FF,ZZ : Double;
begin
SetLength(T,n+1);
SetLength(X,n+1);
SetLength(Y,n+1);
SetLength(F,n+1);
SetLength(Z,n+1);
{ Calculattion of D1..D7 }
D1:=A1/(A1+dt*A2);
D2:=-dt/(A1+dt*A2);
D3:=dt*K1/(A1+dt*A2);
D4:=dt*K2/(A1+dt*A2);
D5:=dt;
D6:=B/(dt+B);
D7:=dt*K3/(B-dt);
{ Primary conditions }
i:=0;
T[i]:=0;
X[i]:=0.5+0.5*T[i]-0.01*sqr(T[i])*T[i];
Y[i]:=Y0;
F[i]:=YY0;
Z[i]:=Z0;
{ Prediction }
Y[i+1]:=Y0;
F[i+1]:=YY0;
Z[i+1]:=Z0;
{ Calculattion of X=f(t) }
for i:=1 to n do
begin
T[i]:=dt*i;
X[i]:=0.5+0.5*T[i]-0.01*sqr(T[i])*T[i];
{ Calculattion of F=f(t), Y=f(t), Z=f(t) }
Repeat
G:=0;
FF:=D1*F[i-1]+D2*Y[i]+D3*X[i]+D4*Z[i];
YY:=Y[i-1]+D5*F[i];
ZZ:=D6*Z[i-1]+D7*Y[i];
if abs(F[i]-FF)>E then G:=G+1;
if abs(Y[i]-YY)>E then G:=G+1;
if abs(Z[i]-ZZ)>E then G:=G+1;
F[i]:=FF;
Y[i]:=YY;
Z[i]:=ZZ;
Until G=0;
{ Prediction }
if i<n then begin
Y[i+1]:=Y[i];
F[i+1]:=F[i];
Z[i+1]:=Z[i];
end;
end;
{ Output results}
StringGrid1.RowCount := N + 2;
StringGrid1.Cells[0,0] := 'I';
StringGrid1.Cells[1,0] := 'T';
StringGrid1.Cells[2,0] := 'X';
StringGrid1.Cells[3,0] := 'Y';
StringGrid1.Cells[4,0] := 'F';
StringGrid1.Cells[5,0] := 'Z';
for I := 0 to n do begin
StringGrid1.Cells[0,I+1] := IntToStr(I);
StringGrid1.Cells[1,I+1] := FloatToStrF(T[I],ffFixed,8,3);
StringGrid1.Cells[2,I+1] := FloatToStrF(X[I],ffFixed,8,5);
StringGrid1.Cells[3,I+1] := FloatToStrF(Y[I],ffFixed,8,5);
StringGrid1.Cells[4,I+1] := FloatToStrF(F[I],ffFixed,8,5);
StringGrid1.Cells[5,I+1] := FloatToStrF(Z[I],ffFixed,8,5);
end;
end;
procedure TModelMainFm.SaveToFile(Fn: String);
var
f1 : TextFile;
I : integer;
begin
AssignFile(f1,Fn);
ReWrite(f1);
Writeln(f1,' i T X Y F Z');
for i:=0 to n do begin
Writeln(f1,i:2,' ',T[i]:9:5,' ',X[i]:9:5,' ',Y[i]:9:5,' ',
F[i]:9:5,' ',Z[i]:9:5);
end;
CloseFile(f1);
end;
procedure TModelMainFm.Button3Click(Sender: TObject);
begin
Close;
end;
procedure TModelMainFm.Button2Click(Sender: TObject);
begin
if SaveDialog1.Execute then SaveToFile(SaveDialog1.FileName);
end;
end.