2.5 Реализация численных решений в среде Delphi
ВЫВОД: сравнивая относительные погрешности двух методов (аналитико-сеточного с постоянным воздействием и явного) можно сделать соответствующие выводы:
Аналитико-сеточный метод описывает данное воздействие на много лучше нежели явный. Это видно из графика относительных погрешностей (Рисунок 2.2). Относительные погрешности явного метода на много больше, чем относительные погрешности аналитико-сеточного метода.
Приложение а
program ODU1;
{$APPTYPE CONSOLE}
uses
SysUtils,
MyType,
Math,
classes, Graphics,
Graphik in 'Graphik.pas' {GraphikFm};
var
Im,I,Key: Ir;
A,K,Y0,DT,a0,a1,a2,a3,Start: Db; // a0, a1, a2, a3 - коофициенты воздействия
D1,D2,D4,D5,C1,C2,C3,C4,Yamax,Yamin: Db;
T,X,Ya,Yac,Yya, DYac, DYya, ddYac, ddYya: Vec;
F1,F2:TextFile;
begin
AssignFile(F1,'Input1.txt');
Reset(F1);
Readln(F1,A,K,Y0,Im,DT,a0,a1,a2,a3,Start);
CloseFile(F1);
Writeln('A=', A:7:4, ' K=', K:7:4, ' Y0=', Y0:7:4);
Writeln(' Im=', Im:3, ' DT=', DT:5:2);
Writeln(' a0=', a0:7:4, ' a1=', a1:7:4, ' a2=', a2:7:4, ' a3=', a3:7:4 );
Readln;
D1:=exp(-DT/A); // коэфициенты аналитико-сеточного метода
D2:=(1-exp(-DT/A))*k/2;
D4:=1-DT/A; // коэфециенты явного метода
D5:=k*DT/A;
C1:=K*a0; // коэфициенты аналитического решения
C2:=K*a1*(cos(a3)+A*a2*sin(a3))/(power((A*a2),2)+1);
C3:=K*a1*(sin(a3)-A*a2*cos(a3))/(power((A*a2),2)+1);
T[1]:=Start;
X[1]:=a0+a1*sin(a2*T[1])*cos(a3)+a1*cos(a2*T[1])*sin(a3);
Ya[1]:=(Y0-C1-C3)*exp(-T[1]/A)+C1+C2*sin(a2*T[1])+C3*cos(a2*T[1]);
Yac[1]:=Y0; // Аналитико-сеточный метод с линейным воздействием
Yya[1]:=Y0; // явный метод
Yamin:=Ya[1];
Yamax:=Ya[1];
for I := 2 to Im do
begin
T[i]:=Start+Dt*(I-1);
X[i]:=a0+a1*sin(a2*T[i])*cos(a3)+a1*cos(a2*T[i])*sin(a3);
Ya[i]:=(Y0-C1-C3)*exp(-T[i]/A)+C1+C2*sin(a2*T[i])+C3*cos(a2*T[i]);
Yac[i]:=D1*Yac[i-1]+D2*(x[i]+x[i-1]);
Yya[i]:=D4*Yya[i-1]+D5*x[i];
end;
for I := 1 to Im do
begin
if Ya[i]>Yamax then Yamax:=Ya[i] else
if Ya[i]<Yamin then Yamin:=Ya[i];
end;
for I := 1 to Im do
begin
DYac[i]:=Yac[i]-Ya[i]; // погрешность
DYya[i]:=Yya[i]-Ya[i];
ddYac[i]:=DYac[i]/(Yamax-Yamin)*100; // относиельная погрешность
ddYya[i]:=DYya[i]/(Yamax-Yamin)*100;
end;
Writeln('T',#9,'X',#9,'Ya',#9,'Ytp',#9,'Yya'#9,'DYtp',#9,'DYya',#9,'ddYtp',#9,'ddYya');
for I := 1 to Im do
Writeln(T[i]:3:2,X[i]:8:4,Ya[i]:8:4,Yac[i]:8:4,Yya[i]:8:4,DYac[i]:8:4,DYya[i]:8:4,ddYac[i]:8:4, ddYya[i]:8:4);
GrProp.Line1Color := clRed;
GrProp.Line2Color := clBlack;
GrProp.Line3Color := clBlue;
GrProp.Line4Color := clGreen;
GrProp.Point1Color := clRed;
GrProp.Point2Color := clBlack;
GrProp.Point3Color := clBlue;
GrProp.Point4Color := clGreen;
GrProp.GridDigitsY := 3;
GrProp.GridDigitsX := 3;
GrProp.Line1Caption := 'X(t)';
GrProp.Line2Caption := 'Ya(t)';
GrProp.Line3Caption := 'Yya(t)';
GrProp.Line4Caption := 'Yac(t)';
ShowGraphik (T, X, T, Ya, T, Yac, T, Yya, Im,Im,Im,Im);
GrProp.Line1Caption := 'dYac(t)';
GrProp.Line2Caption := 'dYya(t)';
GrProp.Line3Caption := '';
GrProp.Line4Caption := '';
ShowGraphik (T, ddYac, T, ddYya, T, Yac, T, Yya, Im,Im,0,0);
AssignFile(F2,'Output1.txt');
ReWrite(F2);
Writeln(F2,'A=', A:7:4, ' K=', K:7:4, ' Y0=', Y0:7:4);
Writeln(F2,' Im=', Im:3, ' DT=', DT:5:2);
Writeln(F2,' a0=', a0:7:4, ' a1=', a1:7:4, ' a2=', a2:7:4, ' a3=', a3:7:4);
Writeln(F2, 'T',#9,'X',#9,'Ya',#9,'Yac'#9,'Yya',#9,'DYac',#9,'DYya',#9,'dYac',#9,'dYya');
for I := 1 to Im do
Writeln(F2, T[i]:3:2,X[i]:8:4,Ya[i]:8:4, Yac[i]:8:4, Yya[i]:8:4, DYac[i]:8:4, DYya[i]:8:4, ddYac[i]:8:4, ddYya[i]:8:4 );
CloseFile(F2);
readln;
end.