24小时热门版块排行榜    

查看: 2116  |  回复: 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的回帖
回帖支持 ( 显示支持度最高的前 50 名 )

dingd

铁杆木虫 (职业作家)

【答案】应助回帖

★ ★
fegg7502: 金币+2, 3ks 2014-06-24 08:37:30
1stOpt求解:
CODE:
Parameter k(1:6)=[0,];
Variable t,C1,C2,C3,C4;
ODEFunction
C1' =-k1*c1-k2*c1-k3*c1;
c2' =k1*c1-k4*c2-k5*c2;
c3' =k2*c1+k4*c2-k6*c3;
c4' =k3*c1+k5*c2+k6*c3;
Data;
0        0.877667262        0.188437508        0.069051676        0.067639913
10        0.683038504        0.34538674        0.138009043        0.135964027
20        0.398422967        0.413279625        0.203080312        0.189874719
30        0.266300405        0.468253074        0.289896419        0.348481733
40        0.142059055        0.397710816        0.305786676        0.424846321
50        0.068339284        0.34043909        0.335003128        0.497043462
60        0.049669997        0.312376889        0.351124377        0.609259358
70        0.025110016        0.237590973        0.335397788        0.723901322
80        0.012801963        0.197342301        0.32083196        0.736810004
90        0.005763427        0.156055501        0.306141448        0.834373408
100        0.002640872        0.10259385        0.238964753        0.755687994
110        0.001332663        0.091170321        0.248694235        0.903738353
120        0.004102735        0.066072318        0.220813975        0.917511998

均方差(RMSE):0.0342804029597939
残差平方和(SSE):0.0564070093001208
相关系数(R): 0.987248267799082
相关系数之平方(R^2): 0.974659142272288
确定系数(DC): 0.926823479328214
F统计(F-Statistic): 32.9626551943557

参数                  最佳估算
--------------------        -------------
k1        0.0370425256452885
k2        0.00710349406895418
k3        5.77456144864321E-15
k4        0.0133020100728549
k5        0.0152085764268797
k6        0.012960507249766
想用遗传算法求解动力学参数
c1.jpg


想用遗传算法求解动力学参数-1
c2.jpg


想用遗传算法求解动力学参数-2
c3.jpg


想用遗传算法求解动力学参数-3
c4.jpg

9楼2014-06-23 13:46:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通回帖

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: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的回帖

飞鸿印雪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的回帖

飞鸿印雪jay

银虫 (小有名气)


fegg7502: 金币+1, 鼓励交流 2014-06-24 08:37:14
引用回帖:
3楼: Originally posted by 月只蓝 at 2014-06-22 22:37:13
可以用GA算个初值,给lsqnonlin函数,这样的初值比较合理。
要是嫌麻烦,直接给出数据,让有高版本的1stopt的虫子跑一下也可以。

还想用fmincon()进行参数估计初值的,然后带入lsqnonlin算参数,但是用fmincon估算得到的参数初值都比较大,而用lsqnonlin得到是0.x,我感觉又不对。
使用函数fmincon()估计得到的参数值为:
        k1 = 1142.104196787
        k2 = 1422.318008542
        k3 = 2030.140731692
        k4 = 60.162585855
        k5 = 190.663749814
        k6 = 47.821277380
The sum of the squares is: 8.001056406e+00


Local minimum possible.

lsqnonlin stopped because the final change in the sum of squares relative to
its initial value is less than the default value of the function tolerance.

<stopping criteria details>



使用函数lsqnonlin()估计得到的参数值为:
        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
        k5 = 0.012992896 ± 0.009006184
  The sum of the squares is: 5.640933494e-02
不懂为什么?还有是不是和参数比方程个数多有关?
6楼2014-06-23 00:20:39
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

飞鸿印雪jay

银虫 (小有名气)


fegg7502: 金币+1, 鼓励交流 2014-06-24 08:37:20
请专家帮我看看,我的程序到底有没有问题?还是数学模型本身的问题?数学模型是我自己写的。怎样改进?谢谢大神啦!
7楼2014-06-23 00:27:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

飞鸿印雪jay

银虫 (小有名气)

引用回帖:
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 ...

我还发觉和x0的初值付的有关,如果初值付(1.2,0,0,0),拟合结果误差会小点,但是初值是我实验测得的,如果改了又不符合实际了。不懂!
8楼2014-06-23 00:34:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

飞鸿印雪jay

银虫 (小有名气)

引用回帖:
9楼: Originally posted by dingd at 2014-06-23 13:46:02
1stOpt求解:

Parameter k(1:6)=;
Variable t,C1,C2,C3,C4;
ODEFunction
C1' =-k1*c1-k2*c1-k3*c1;
c2' =k1*c1-k4*c2-k5*c2;
c3' =k2*c1+k4*c2-k6*c3;
c4' =k3*c1+k5*c2+k6*c3;
Data;
0        0.877667262        0.1 ...

万分感谢大神帮我算了一下,谢谢。好像和matlab算的差不多,为啥k3差别那么大啊?
10楼2014-06-23 23:14:59
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 飞鸿印雪jay 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 328求调剂,英语六级551,有科研经历 +5 生物工程调剂 2026-03-17 9/450 2026-03-21 23:32 by zhujy1982
[考研] 0703化学调剂 +11 妮妮ninicgb 2026-03-15 15/750 2026-03-21 19:15 by ColorlessPI
[考研] 材料与化工(0856)304求B区调剂 +3 邱gl 2026-03-20 7/350 2026-03-21 19:05 by 15709483992
[考研] 求调剂 +5 十三加油 2026-03-21 5/250 2026-03-21 18:48 by 学员8dgXkO
[考研] 265求调剂 +12 梁梁校校 2026-03-19 14/700 2026-03-21 13:38 by lature00
[考研] 070300化学319求调剂 +7 锦鲤0909 2026-03-17 7/350 2026-03-21 03:46 by JourneyLucky
[考研] 一志愿华中科技大学,080502,354分求调剂 +5 守候夕阳CF 2026-03-18 5/250 2026-03-21 01:06 by JourneyLucky
[考研] 一志愿南京理工大学085701资源与环境302分求调剂 +4 葵梓卫队 2026-03-18 6/300 2026-03-20 23:02 by JourneyLucky
[考研] 材料与化工 322求调剂 +4 然11 2026-03-19 4/200 2026-03-20 22:12 by luoyongfeng
[考研] 北科281学硕材料求调剂 +5 tcxiaoxx 2026-03-20 5/250 2026-03-20 21:35 by laoshidan
[考研] 一志愿 南京航空航天大学大学 ,080500材料科学与工程学硕 +5 @taotao 2026-03-20 5/250 2026-03-20 20:16 by JourneyLucky
[考研] 085410人工智能专硕317求调剂(0854都可以) +4 xbxudjdn 2026-03-18 4/200 2026-03-20 09:07 by 不168
[考研] 材料考研调剂 +3 xwt。 2026-03-19 3/150 2026-03-19 11:22 by w沐阳w
[考研] 312求调剂 +8 陌宸希 2026-03-16 9/450 2026-03-18 12:39 by Linda Hu
[考研] 290求调剂 +3 p asserby. 2026-03-15 4/200 2026-03-17 16:35 by wangkm
[考博] 26申博 +4 八6八68 2026-03-16 4/200 2026-03-17 13:00 by 轻松不少随
[考研] 一志愿,福州大学材料专硕339分求调剂 +3 木子momo青争 2026-03-15 3/150 2026-03-17 07:52 by laoshidan
[考研] 333求调剂 +3 文思客 2026-03-16 7/350 2026-03-16 18:21 by 文思客
[考研] 304求调剂 +5 素年祭语 2026-03-15 5/250 2026-03-16 17:00 by 我的船我的海
[考研] 070303 总分349求调剂 +3 LJY9966 2026-03-15 5/250 2026-03-16 14:24 by xwxstudy
信息提示
请填处理意见