|
|
【答案】应助回帖
用OpenLu求解,Lu脚本代码:
!!!using["luopt","math"]; //使用命名空间
f(x,y,dy, params::k1,k2)=
{
dy=k1*(0.701*exp(-3.211*x)+0.299*exp(-0.067*x))-k2*y,
0 //必须返回0
};
目标函数(_k1,_k2 : i,s,tyz : tyArray,tA,max,k1,k2)=
{
k1=_k1, k2=_k2, //传递优化变量
//最后一个参数50表示gsl_ode函数在计算时,最多循环计算50次,这样可以提高速度
tyz=gsl_ode[@f,nil,0.0,tA,ra1(0), 1e-6, 1e-6, 2, 1e-6,50],
i=0, s=0, while{++i<max, s=s+[tyz(i,1)-tyArray(i,1)]^2},
s
};
main(::tyArray,tA,max)=
{
tyArray=matrix{ //存放实验数据xi,yi
"0 0
0.33 0.061043
1 0.03675
2 0.05932
4 0.095993
6 0.072057
10 0.05085
15 0.04678
24 0.047673
30 0.034973
48 0.030375
72 0"
},
len[tyArray,0,&max], tA=tyArray(all:0), //用len函数取矩阵的行数,tA取矩阵的列
Opt1[@目标函数] //Opt1函数全局优化
};
结果:
0.1325616120497096 0.358508535326814 3.242596823546582e-003 |
|