нужна помощь.
Здравствуйте. Тут такой проблема, написана программка, Решение дифференциальных уравнений методом Милна. Проблема в том,что значения какие-то странные. Может кто помочь? Не знаю,что не так
Вот код:
PHP код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
StringGrid1: TStringGrid;
Edit3: TEdit;
Label4: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Const
n=10;
eps=10e-6;
var
Form1: TForm1;
x0,y0,z0,h:real;
k1,k2,k3,k4:real;
r1,r2,r3,r4:real;
abs_pogr:real;
z,zkor,zpr,ypr,ykor,x,y:array [0..n] of real;
i,j:integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1. Cells[0,0]:='x';
StringGrid1. Cells[1,0]:='y';
StringGrid1. Cells[2,0]:='z';
end;
function f1(xa,ya,za:real):real;
begin
f1:=2*sqr(xa)+2*ya+za;
end;
function f2(xa,ya,za:real):real;
begin
f2:=1-2*sqr(xa)+2*ya-za;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
x0:=Strtofloat(Edit1.Text);
y0:=Strtofloat(Edit2.Text);
h:=Strtofloat(Edit2.Text);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
x[0]:=x0;
y[0]:=y0;
z[0]:=y0;
i:=0;
{ Gotovim 1-e 3 tochki po metodu runge-kutta }
while i<=3 do
begin
k1:=h*f1(x[i],y[i],z[i]);
r1:=h*f2(x[i],y[i],z[i]);
k2:=h*f1(x[i]+h/2,y[i]+k1/2,z[i]+r1/2);
r2:=h*f2(x[i]+h/2,y[i]+k1/2,z[i]+r1/2);
k3:=h*f1(x[i]+h/2,y[i]+k2/2,z[i]+r2/2);
r3:=h*f2(x[i]+h/2,y[i]+k2/2,z[i]+r2/2);
k4:=h*f1(x[i]+h,y[i]+k3,z[i]+r3);
r4:=h*f2(x[i]+h,y[i]+k3,z[i]+r3);
y[i+1]:=y[i]+(k1+2*k2+2*k3+k4)/6;
z[i+1]:=z[i]+(r1+2*r2+2*r3+r4)/6;
x[i+1]:=x[i]+h;
i:=i+1;
i:=4;
while x[i]<=1.0+h{eps> abs_pogr} do
begin
{ etap prognoza i korrektsii}
ypr[i]:=y[i-4]+(4*h)/3*(2*f1(x[i-3],y[i-3],z[i-3])-f1(x[i-2],y[i-2],z[i-2])+2*f1(x[i-1],y[i-1],z[i-1]));
ykor[i]:=y[i-2]+(h/3)*(f1(x[i-2],y[i-2],z[i-2])+4*f1(x[i-1],y[i-1],z[i-1])+f1(x[i],ypr[i],z[i]));
zpr[i]:=z[i-4]+(4*h)/3*(2*f2(x[i-3],y[i-3],z[i-3])-f2(x[i-2],y[i-2],z[i-2])+2*f2(x[i-1],y[i-1],z[i-1]));
zkor[i]:=z[i-2]+(h/3)*(f2(x[i-2],y[i-2],z[i-2])+4*f2(x[i-1],y[i-1],z[i-1])+f2(x[i],zpr[i],z[i]));
abs_pogr:=abs(ykor[i]-ypr[i])/29;
if abs_pogr>eps then
y[i]:=ykor[i]
else
y[i]:=ypr[i];
abs_pogr:=abs(zkor[i]-zpr[i])/29;
if abs_pogr>eps then
z[i]:=zkor[i]
else
z[i]:=zpr[i];
x[i+1]:=x[i]+h;
i:=i+1;
end;
for i:=1 to n+1 do
begin
StringGrid1.Cells[0,i] := FloatToStr(x[i]);
StringGrid1.Cells[1,i] := FloatToStr(y[i]);
StringGrid1.Cells[2,i] := FloatToStr(z[i]);
end;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
close
end;
end.
|