- 积分
- 0
- 注册时间
- 2009-9-20
- 仿真币
-
- 最后登录
- 1970-1-1
|
发表于 2009-10-17 16:52:26
|
显示全部楼层
来自 湖北武汉
楼主,我刚买回1stopt3.0版运行了一下我上门的程序(仿照你的欧拉法编的)效果不理想,而且每次运行结果都不一样。
我现在仿照上面的4阶龙格库塔方法编程,不知道怎么老是出现错误。希望楼主可以指点一下,在下感激不尽。!!!!!
代码如下:
Constant y1_1=0.3999,y2_1=15.5780,y3_1=0,y4_1=0,y5_1=0,y6_1=0; //Initial Values
Constant m=6,dx=0.1; //m: function number
Parameter p(6); //=[0,10];
Variable t,x[OutPut],y[OutPut],z[OutPut],e[OutPut],f[OutPut],g[OutPut];
Minimum;
StartProgram [Pascal];
Procedure MainModel;
var i,j: integer;
y1_2, y2_2, y3_2, y4_2, y5_2, y6_2: double;
y11, y21, y31, y41, y51, y61: double;
rk1, rk2, rk3, rk4, y_y, yy, dydx: array[0..m-1] of double;
x, tx: double;
Procedure Drive(x_d: double; y_d: array of double; var dydx_d: array of
double);
begin
dydx_d[0] :=-p1*y_d[0]*y_d[1]+p2*y_d[3]*y_d[4];
dydx_d[1] :=-p1*y_d[0]*y_d[1]+p2*y_d[3]*y_d[4]-p3*y_d[1]*y_d[2]+p4*y_d
[3]*y_d[4]-p5*y_d[1]*y_d[4]+p6*y_d[3]*y_d[5];
dydx_d[2] :=p1*y_d[0]*y_d[1]-p2*y_d[3]*y_d[4]-p3*y_d[1]*y_d[2]+p4*y_d
[3]*y_d[4];
dydx_d[3] :=p1*y_d[0]*y_d[1]-p2*y_d[3]*y_d[4]+p3*y_d[1]*y_d[2]-p4*y_d
[3]*y_d[4]+p5*y_d[1]*y_d[4]-p6*y_d[3]*y_d[5];
dydx_d[4] :=p3*y_d[1]*y_d[2]-p4*y_d[3]*y_d[4]-p5*y_d[1]*y_d[4]+p6*y_d
[3]*y_d[5];
dydx_d[6] :=p5*y_d[1]*y_d[4]-p6*y_d[3]*y_d[5];
end;
begin
yy[0]:=y1_1;
yy[1]:=y2_1;
yy[2]:=y3_1;
yy[3]:=y4_1;
yy[4]:=y5_1;
yy[5]:=y6_1;
y_y[0]:=y1_1;
y_y[1]:=y2_1;
y_y[2]:=y3_1;
y_y[3]:=y4_1;
y_y[4]:=y5_1;
y_y[5]:=y6_1;
for i := 0 to DataLengh-1 do begin
for j := 0 to m-1 do y_y[j] :=yy[j];
for j := 0 to m-1 do y_y[j] := yy[j];
tx := dx*i;
x := tx;
Drive(x, yy, dydx);
for j := 0 to m-1 do rk1[j] := dydx[j];
x := tx+0.5*dx;
for j := 0 to m-1 do
yy[j] := y_y[j] + 0.5*rk1[j]*dx;
Drive(x, yy, dydx);
for j := 0 to m-1 do
rk2[j] := dydx[j];
x := tx+0.5*dx;
for j := 0 to m-1 do
yy[j] := y_y[j] + 0.5*rk2[j]*dx;
Drive(x, yy, dydx);
for j := 0 to m-1 do
rk3[j] := dydx[j];
x := tx+dx;
for j := 0 to m-1 do
yy[j] := y_y[j] + rk3[j]*dx;
Drive(x, yy, dydx);
for j := 0 to m-1 do
rk4[j] := dydx[j];
for j := 0 to m-1 do
yy[j] := y_y[j] + (1/6)*(rk1[j]+2*rk2[j]+2*rk3[j]+rk4[j])*dx;
x[i] := yy[0];
y[i] := yy[1];
z[i] := yy[2];
e[i] := yy[3];
f[i] := yy[4];
g[i] := yy[5];
end;
end;
EndProgram;
Data;
//0 0.3999 15.5780 0 0 0 0
5.3833 0.0346 11.2058 0.1986 4.3713 0.0817 0.0850
9.1833 0.0249 11.1680 0.1597 4.4097 0.1607 0.0546
12.9833 0.0261 11.0306 0.1198 4.5472 0.1639 0.0901
16.7667 0.0366 10.6350 0.0322 4.9419 1.1042 0.2269
20.5667 0.0329 10.5443 0.0350 5.0329 0.0643 0.2677
23.4167 0.0431 10.6538 0.0533 4.9241 0.0565 0.2470 |
|