24小时热门版块排行榜    

查看: 2103  |  回复: 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 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 材料学调剂 +7 提神豆沙包 2026-02-28 9/450 2026-03-01 11:50 by 王伟要上岸啊
[考研] 321求调剂一志愿东北林业大学材料与化工英二数二 +3 虫虫虫虫虫7 2026-03-01 6/300 2026-03-01 11:50 by gaoxiaoniuma
[考研] 调剂 +3 简木ChuFront 2026-02-28 3/150 2026-03-01 11:46 by 王伟要上岸啊
[考研] 302材料工程求调剂 +3 Doleres 2026-03-01 4/200 2026-03-01 11:38 by 王伟要上岸啊
[考研] 高分子化学与物理调剂 +5 好好好1233 2026-02-28 9/450 2026-03-01 10:59 by fengyu211
[硕博家园] 2025届双非化工硕士毕业,申博 +3 更多的是 2026-02-27 4/200 2026-03-01 10:04 by ztg729
[论文投稿] 求助coordination chemistry reviews 的写作模板 10+3 ljplijiapeng 2026-02-27 4/200 2026-03-01 09:07 by babero
[考研] 284求调剂 +5 天下熯 2026-02-28 5/250 2026-03-01 08:49 by ms629
[考研] 材料调剂 +4 爱擦汗的可乐冰 2026-02-28 4/200 2026-03-01 00:38 by 猫猫球alter
[基金申请] 面上模板改不了页边距吧? +5 ieewxg 2026-02-25 6/300 2026-03-01 00:10 by addressing
[考研] 304求调剂 +3 52hz~~ 2026-02-28 5/250 2026-03-01 00:00 by 52hz~~
[考研] 化工专硕348,一志愿985求调剂 +4 弗格个 2026-02-28 6/300 2026-02-28 22:00 by wang_dand
[考博] 26申博 +4 想申博! 2026-02-26 4/200 2026-02-28 21:37 by limorning
[考研] 264求调剂 +3 巴拉巴拉根556 2026-02-28 3/150 2026-02-28 21:31 by gaoxiaoniuma
[考研] 298求调剂 +8 人间唯你是清欢 2026-02-28 11/550 2026-02-28 20:26 by L135790
[高分子] 求环氧树脂研发1名 +3 孙xc 2026-02-25 11/550 2026-02-28 16:57 by ichall
[考研] 265分求调剂不调专业和学校有行学上就 +4 礼堂丁真258 2026-02-28 6/300 2026-02-28 16:18 by 求调剂zz
[考研] 304求调剂 +5 曼殊2266 2026-02-28 6/300 2026-02-28 12:44 by 迷糊CCPs
[基金申请] 面上可以超过30页吧? +12 阿拉贡aragon 2026-02-22 13/650 2026-02-26 22:09 by Hahaxia
[硕博家园] 【博士招生】太原理工大学2026化工博士 +4 N1ce_try 2026-02-24 8/400 2026-02-26 08:40 by N1ce_try
信息提示
请填处理意见