- •«Исследование динамических систем»
- •1 Идентификация обыкновенного линейного дифференциального уравнения 1го порядка
- •1.1 Постановка задачи
- •1.2 Описание используемых методов
- •1.2.1 Аппроксимация на смежных отрезках
- •1.2.1 Аппроксимация на скользящих интервалах
- •1.3 . Результаты решения задачи аппроксимации
- •1.3.1 Проведение идентификации в среде Excel
- •1.3.2 Проведение идентификации в среде Delphi
- •1.3.3 Проверка и сравнение результатов идентификации
- •1.4 Заключение
- •2 Исследование динамики системы
- •2.1 Постановка задачи
- •2.2 Запись конечно-разностных аналогов дифференциальных уравнений
- •2.3 Решение в среде Excel
- •2.4 Решение в среде Delphi
- •2.5 Заключение
- •Литература
- •Приложение 1
- •Приложение 2
2.5 Заключение
В этой части курсовой работы было проведено численное моделирования динамических процессов в системе автоматического регулирования с помощью двух программных приложений -ExcelиDelphi.
Результаты, полученные при использовании этих двух пакетов, показали идентичные решения.
Литература
1. Бронштейн И.Н., Семендяев К.А. Справочник по математике для инженеров и учащихся втузовю -13-е изд., исправленное.-М.: Наука, Гл.Ред. физ.-мат. лит., 1986. -544 с.
2. Вычислительная техника и программирование. Часть 3 «Основы алгоритмизации, про-граммирования и решения инженерных и экономических задач на ЭВМ». Учебное посо-бие / Под общей редакцией проф. Меркта Р.В. – Одесса: ОГМУ,2000. –97 с.
3. Электронные учебно-методические материалы кафедры «Техническая кибернетика».
4. Меркт, «Вычислительная техника и программирование. Часть 3», ОНМУ,
Одесса – 2004.
5. Г.В. Галисеев, «Программирование в среде Delphi», Москва – Санкт-Петербург – Киев, 2004.
Приложение 1
Текст модуля MyType
unit MyType;
interface
type
Vec = array[0..200] of Double;
VecSh = array[0..20] of Double;
Mat = array[0..20,0..21] of Double;
implementation
end.
Текст модуля MyProc
unit MyProc;
interface
uses
MyType,
SysUtils,
Classes,
Math;
procedure Gauss(N:Integer; A:Mat; var X:VecSh; var S:Double);
procedure Gram(N:Integer; var A:Mat; var X,Y:Vec; var M,K:Integer);
procedure Aprox(Kpol,Jm:Integer; T,Xp,Yp:Vec; var A,B:VecSh;
var Xa,Ya,YYa:Vec; var R2X,R2Y:Double);
implementation
procedure Gauss(N:Integer; A:Mat; var X:VecSh; var S:Double);
var
I,J,K,K1,N1 : Integer;
R : Double;
begin
// if A.RowCount+1 <> A.ColCount then
// raise Exception.Create('Матрица кооэффициентов некорректна');
N1:=N+1;
for K:=0 to N-1 do begin
K1:=K+1;
S:=A[K,K];
J:=K;
for I:=K1 to N-1 do begin
R:=A[I,K];
if Abs(R) > Abs(S) then begin
S:=R;
J:=I;
end;
end;
// if S=0.0 then ShowMessage('s=0');
// raise Exception.Create('Матрица кооэффициентов вырождена');
if J<> K then
for I:=K to N1-1 do begin
R:=A[K,I];
A[K,I]:=A[J,I];
A[J,I]:=R
end;
for J:=K1 to N1-1 do A[K,J]:=A[K,J]/S;
for I:=K1 to N-1 do begin
R:=A[I,K];
for J:=K1 to N1-1 do A[I,J]:=A[I,J]-A[K,J]*R;
end;
end;
// if S<>0.0 then
for I:=N-1 downto 0 do begin
S:=A[I,N1-1];
for J:=I+1 to N-1 do S:=S-A[I,J]*X[J];
X[I]:=S;
end;
end;
procedure Gram(N:Integer; var A:Mat; var X,Y:Vec; var M,K:Integer);
var
I1,Pp,I,J,L : Integer;
S : Double;
Begin
M:=K+1;
for I:=0 to M-1 do
begin
for J:=0 to M-1 do
begin
S:=0; Pp:=I+J;
for L:=1 to N do
S:=S+Power(X[L],Pp);
A[I,J]:=S;
end;
I1:=I;
S:=0;
for L:=1 to N do
S:=S+Y[L]*Power(X[L],I1);
A[I,M]:=S;
end;
End;
procedure Aprox(Kpol,Jm:Integer; T,Xp,Yp:Vec; var A,B:VecSh;
var Xa,Ya,YYa:Vec; var R2X,R2Y:Double);
var
M,K,J : Integer;
S,S1,S2,S3 : Double;
R : VecSh;
Ag : Mat;
Begin
Gram(Jm,Ag,T,Xp,M,Kpol);
Gauss(M,Ag,R,S);
B:=R;
Gram(Jm,Ag,T,Yp,M,Kpol);
Gauss(M,Ag,R,S);
A:=R;
for J:=1 to Jm do begin
Xa[J]:=0;
Ya[J]:=0;
YYa[J]:=0;
for K:=0 to Kpol do begin
Xa[J]:=Xa[J]+B[K]*Power(T[J],K);
Ya[J]:=Ya[J]+A[K]*Power(T[J],K);
end;
for K:=1 to Kpol do
YYa[J]:=YYa[J]+K*A[K]*Power(T[J],K-1);
end;
S1:=0;
S2:=0;
S3:=0;
For J:=1 to Jm do
begin
S1:=S1+Sqr(Xp[J]-Xa[J]);
S2:=S2+Sqr(Xp[J]);
S3:=S3+Xp[J];
end;
R2X:=1-S1/(S2-Sqr(S3)/Jm);
S1:=0;
S2:=0;
S3:=0;
For J:=1 to Jm do
begin
S1:=S1+Sqr(Yp[J]-Ya[J]);
S2:=S2+Sqr(Yp[J]);
S3:=S3+Yp[J];
end;
R2Y:=1-S1/(S2-Sqr(S3)/Jm);
End;
end.
Текст программы идентификации IdentODY1
program IdentODY1;
{$APPTYPE CONSOLE}
uses
Math {: CoClass},
sysutils {: CoClass},
classes {: CoClass},
Dialogs {: CoClass},
MyType {: CoClass},
MyProc {: CoClass},
Graphics {: CoClass},
Graphik {: CoClass};
var
Ne,Ine,Jm,Im,J,I,I1,Kpol,Nz : Integer;
C1,K1,R2X,R2Y,R2Xmin,R2Ymin,S : Double;
A,B,R : VecSh;
Te,Xe,Ye,T,Xp,Yp,Xa,Ya,YYa : Vec;
Aind : Mat;
F1,F2,F3 : TextFile;
begin
AssignFile(F1,'Input_1.txt');
AssignFile(F2,'Input_2.txt');
AssignFile(F3,'Output_1.txt');
ReSet(F1);
ReSet(F2);
ReWrite(F3);
Readln(F1,Ne,Jm,Kpol);
Writeln('Ne=',Ne:2,' Jm=',Jm:2,' Kpol=',Kpol:2);
Writeln(F3,'Ne=',Ne:2,' Jm=',Jm:2,' Kpol=',Kpol:2);
for I:=0 to 20 do
for J:=0 to 21 do Aind[I,J]:=0;
/////////////////////////////////////////////////
for Ine := 1 to Ne do begin
//////////////////////////////////////////////////
Readln(F2,Im);
Writeln(F3,'Ine=', Ine:3,' Im=',Im:3);
Writeln('Ine=', Ine:3,' Im=',Im:3);
Writeln(F3,' T ',' Xe ',' Ye ');
for I:=0 to Im-1 do begin
Readln(F2,Te[I],Xe[I],Ye[I]);
Writeln(F3,Te[I]:10:5,Xe[I]:10:5,Ye[I]:10:5);
end;
GrProp.Line1Color := clBlack;
GrProp.Line2Color := clRed;
GrProp.Point1Color := clBlack;
GrProp.Point2Color := clRed;
GrProp.GridDigitsY := 3;
GrProp.GridDigitsX := 3;
ShowGraphik(Te,Xe,Te,Ye,Te,Xe,Te,Ye,Im,Im,Im,Im);
Readln;
for Nz:=0 to Im-Jm-1 do begin
for J:=0 to Jm-1 do begin
I:=J+Nz;
T[J]:=Te[I]-Te[Nz];
Xp[J]:=Xe[I];
Yp[J]:=Ye[I];
end;
Aprox(Kpol,Jm,T,Xp,Yp,A,B,Xa,Ya,YYa,R2X,R2Y);
If ((Ine=1) and (Nz=0)) or (R2Xmin>R2X) then R2Xmin:=R2X;
If ((Ine=1) and (Nz=0)) or (R2Ymin>R2Y) then R2Ymin:=R2Y;
for J:=0 to Jm-1 do begin
Aind[0,0]:=Aind[0,0]+Sqr(YYa[J]);
Aind[0,1]:=Aind[0,1]-Xa[J]*YYa[J];
Aind[0,2]:=Aind[0,2]-Ya[J]*YYa[J];
Aind[1,1]:=Aind[1,1]+Sqr(Xa[J]);
Aind[1,2]:=Aind[1,2]+Xa[J]*Ya[J];
end;
Aind[1,0]:=Aind[0,1];
end;
end;
//////////////////////////////////////////////////
Gauss(2,Aind,R,S);
C1:=R[0];
K1:=R[1];
Writeln(F3,' C1=',C1:10:5,' K1=',K1:10:5);
Writeln(F3,'R2Xmin=',R2Xmin:5:3,' R2Ymin=',R2Ymin:5:3);
Writeln(' C1=',C1:10:5,' K1=',K1:10:5);
Writeln('R2Xmin=',R2Xmin:5:3,' R2Ymin=',R2Ymin:5:3);
Readln;
Close(F1);
Close(F2);
Close(F3);
end.