24小时热门版块排行榜    

查看: 2002  |  回复: 13
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

飞鸿印雪jay

银虫 (小有名气)

[求助] 想用遗传算法求解动力学参数 已有2人参与

dCAdt =-k(1)*C(1)-k(2)*C(1)-k(3)*C(1);                  
dCBdt =k(1)*C(1)-k(4)*C(2)-k(5)*C(2);
dCCdt =k(2)*C(1)+k(4)*C(2)-k(6)*C(3);
dCDdt =k(3)*C(1)+k(5)*C(2)+k(6)*C(3);
请问怎么用遗传算法求解参数k啊,c的数值都是实验已知的,我用lsqnonlin求解,但是精度比较低。
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

飞鸿印雪jay

银虫 (小有名气)


fegg7502: 金币+1, 鼓励交流 2014-06-24 08:37:01
引用回帖:
2楼: Originally posted by dingd at 2014-06-22 22:15:49
微分方程拟合问题建议试试1stOpt,论坛有不少类似案例,搜一下。其它数据有的话贴上来看看。

format long
clear all
clc
tspan = [0  10  20  30  40  50  60 70  80  90  100  110  120];
x0 = [0.877667262        0.188437508        0.069051676        0.067639913];
k0 = [0  0  0  0  0  0];  
lb = [0  0  0  0  0  0];
ub = [+inf +inf +inf +inf +inf +inf];

data=[
0.683038504        0.34538674        0.138009043        0.135964027
0.398422967        0.413279625        0.203080312        0.189874719
0.266300405        0.468253074        0.289896419        0.348481733
0.142059055        0.397710816        0.305786676        0.424846321
0.068339284        0.34043909        0.335003128        0.497043462
0.049669997        0.312376889        0.351124377        0.609259358
0.025110016        0.237590973        0.335397788        0.723901322
0.012801963        0.197342301        0.32083196        0.736810004
0.005763427        0.156055501        0.306141448        0.834373408
0.002640872        0.10259385        0.238964753        0.755687994
0.001332663        0.091170321        0.248694235        0.903738353
0.004102735        0.066072318        0.220813975        0.917511998
];
yexp = data(:,1:4);

[k,resnorm,residual,exitflag,output,lambda,jacobian] =...
lsqnonlin(@ObjFunc,k0,lb,ub,[],tspan,x0,yexp);            
ci = nlparci(k,residual,jacobian);                          
fprintf('\n\n使用函数lsqnonlin()估计得到的参数值为:\n')      
fprintf('\tk1 = %.9f ± %.9f\n',k(1),ci(1,2)-k(1))         
fprintf('\tk2 = %.9f ± %.9f\n',k(2),ci(2,2)-k(2))  
fprintf('\tk3 = %.9f ± %.9f\n',k(3),ci(3,2)-k(3))  
fprintf('\tk4 = %.9f ± %.9f\n',k(4),ci(4,2)-k(4))  
fprintf('\tk5 = %.9f ± %.9f\n',k(5),ci(5,2)-k(5))  
fprintf('\tk6 = %.9f ± %.9f\n',k(6),ci(6,2)-k(6))  
%fprintf('\tk7 = %.9f ± %.9f\n',k(7),ci(7,2)-k(7))
%fprintf('\tk8 = %.9f ± %.9f\n',k(8),ci(8,2)-k(8))
%fprintf('\tk9 = %.9f ± %.9f\n',k(9),ci(9,2)-k(9))
%fprintf('\tk10 = %.9f ± %.9f\n',k(10),ci(10,2)-k(10))
fprintf('The sum of the squares is: %.9e\n\n',resnorm)

function f = ObjFunc(k,tspan,x0,yexp)                          
[t, Xsim] = ode45(@KineticsEqs,tspan,x0,[],k);
Xsim1=Xsim(:,1);
Xsim2=Xsim(:,2);
Xsim3=Xsim(:,3);
Xsim4=Xsim(:,4);
%Xsim5=Xsim(:,5);
%Xsim6=Xsim(:,6);
ysim(:,1) = Xsim1(2:end);
ysim(:,2) = Xsim2(2:end);
ysim(:,3) = Xsim3(2:end);
ysim(:,4) = Xsim4(2:end);
%ysim(:,5) = Xsim5(2:end);
%ysim(:,6) = Xsim6(2:end);
size(ysim(:,1));
size(ysim(:,2));
size(ysim(:,3));
size(ysim(:,4));
%size(ysim(:,5));
%size(ysim(:,6));
size(yexp(:,1));
size(yexp(:,2));
size(yexp(:,3));
size(yexp(:,4));
%size(yexp(:,5));
%size(yexp(:,6));
f = [(ysim(:,1)-yexp(:,1)) (ysim(:,2)-yexp(:,2)) (ysim(:,3)-yexp(:,3)) (ysim(:,4)-yexp(:,4)) ];%(ysim(:,5)-yexp(:,5))


function dCdt = KineticsEqs(t,C,k)                             
dCAdt =-k(1)*C(1)-k(2)*C(1)-k(3)*C(1);                       
dCBdt =k(1)*C(1)-k(4)*C(2)-k(5)*C(2);
dCCdt =k(2)*C(1)+k(4)*C(2)-k(6)*C(3);
dCDdt =k(3)*C(1)+k(5)*C(2)+k(6)*C(3);
dCdt = [dCAdt; dCBdt;dCCdt;dCDdt];
4楼2014-06-23 00:09:40
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 14 个回答

dingd

铁杆木虫 (职业作家)

【答案】应助回帖


感谢参与,应助指数 +1
fegg7502: 金币+1, 3ks 2014-06-24 08:36:44
微分方程拟合问题建议试试1stOpt,论坛有不少类似案例,搜一下。其它数据有的话贴上来看看。
2楼2014-06-22 22:15:49
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

月只蓝

主管区长 (职业作家)

【答案】应助回帖


感谢参与,应助指数 +1
fegg7502: 金币+1, 鼓励交流 2014-06-24 08:36:50
可以用GA算个初值,给lsqnonlin函数,这样的初值比较合理。
要是嫌麻烦,直接给出数据,让有高版本的1stopt的虫子跑一下也可以。
MATLAB、MS小问题、普通问题请发帖求助!时间精力有限,恕不接受无偿私信求助。
3楼2014-06-22 22:37:13
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

飞鸿印雪jay

银虫 (小有名气)


fegg7502: 金币+1, 鼓励交流 2014-06-24 08:37:08
引用回帖:
4楼: Originally posted by 飞鸿印雪jay at 2014-06-23 00:09:40
format long
clear all
clc
tspan = ;
x0 = ;
k0 = ;  
lb = ;
ub = ;

data=;
yexp = data(:,1:4);

=...
lsqnonlin(@ObjFunc,k0,lb,ub,[],tspan,x0,yexp);            
ci = nlparci(k,residua ...

我目前是用这个程序算的,但是结果中的置信区间大于参数本身
        k1 = 0.037030991 ± 0.006759768
        k2 = 0.007075182 ± 0.009153909
        k3 = 0.000041516 ± 0.009209723
        k4 = 0.013350201 ± 0.013257063
        k5 = 0.015151332 ± 0.013589322
        k6 = 0.012992896 ± 0.009006184
The sum of the squares is: 5.640933494e-02
这样是不是不符合物理意义呢?这样得到的结果能用吗?
所以才想用遗传算法,据说全局搜索,精度会高。
5楼2014-06-23 00:13:21
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
信息提示
请填处理意见