24小时热门版块排行榜    

查看: 2193  |  回复: 13
当前主题已经存档。
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

jlzeng

木虫 (正式写手)

[交流] 【求助】反应动力学求解

我在求反应动力学时遇到一个非常棘手的问题,请大家帮忙解决一下,先对每一个关注本贴的人表示感谢!

问题描述:
       有三个可逆反应组成的反应体系如下:
TG+M→←DG+ME (正逆反应速率常数分别为k1、k2)
DG+M→←MG+ME (正逆反应速率常数分别为k3、k4)
MG+M→←GL+ME (正逆反应速率常数分别为k5、k6)

建立反应以上方程的数学模型如下:
dTG/dt=-k1[TG][M]+ k2[DG][ME]
dDG/dt=k1[TG][M]- k2[DG][ME] –k3[DG][M]+ k4[MG][ME]
dMG/dt= k3[DG][M]- k4[MG][ME] –k5[MG][M]+ k6[GL][ME]
dME/dt= k1[TG][M]- k2[DG][ME]+k3[DG][M]- k4[MG][ME] +k5[MG][M]- k6[GL][ME]

其中TG、DG、MG、ME的浓度是可测定的,各物质浓度间存在如下关系:
[GL]=[TG]0-[TG]-[DG]-[MG]= 0.6380-[TG]-[DG]-[MG] ;
[M]=[M]0-[ME]=4.0626-[ME];
方程初始值为
[TG]0=0.6380
[DG]0=0
[MG]0=0
[GL]0=0
[ME]0=0
[M]0=4.0626

我用MATLAB求解某一条件下的动力学常数k,程序如下:

clear all
k0 = [1 1 3 1 5 1];
% 随意给定的参数初值
lb = [0 0 0 0 0 0];
% 随意给定的参数下限
ub = [1000  1000  1000  1000  1000 1000];
% 随意给定的参数上限
X0=[0.638;0;0;0];

%t=0时刻四种物质TG、DG、MG、ME的初始浓度
Xexp=...
[0.6380 0 0 0
0.1512   0.1088  0.1244  1.0757
0.0955  0.0816  0.1454  1.2740
0.0719  0.0632  0.1431  1.3858
0.0500  0.0493  0.1400  1.4838
0.0451  0.0436  0.1283  1.5247
0.0361  0.0351  0.1226  1.5762
0.0346  0.0301  0.1028  1.6149
0.0261  0.0282  0.1016  1.6460
0.0237  0.0257  0.0977  1.6630
]; % 25度0.8%催化剂条件下不同时间(0 0.5 1.5 2 3 4 5 7 10min)各浓度数据

% 第一种计算方法,使用函数fmincon()进行参数估计
[k,fval,flag] = fmincon(@jlzengObjFmincon,k0,[],[],[],[],lb,ub,[],[],X0,Xexp);
fprintf('\n使用函数fmincon()估计得到的参数值为:\n')
fprintf('\tk1 = %.4f\n',k(1))
fprintf('\tk2 = %.4f\n',k(2))
fprintf('\tk3 = %.4f\n',k(3))
fprintf('\tk4 = %.4f\n',k(4))
fprintf('\tk5 = %.4f\n',k(5))
fprintf('\tk6 = %.4f\n',k(6))
fprintf('
The sum of the squares is: %.1e\n\n',fval)
k_fmincon = k;

%第二种计算方法,使用函数Lsqnonlin()进行参数估计
[k,resnorm,residual,exitflag,Output,lambda,jacobian]=...

lsqnonlin(@jlzengObjLsqnonlin,k0,lb,ub,[],X0,Xexp);
ci=nlparci(k,residual,jacobian);
fprintf('\n\n使用lsqnonlin()函数估计得到的参数值为:\n'),Output
fprintf('\n使用函数lsqqnonlin()估计得到的参数值为:\n')
fprintf('\tk1 = %.4f\n',k(1))
fprintf('\tk2 = %.4f\n',k(2))
fprintf('\tk3 = %.4f\n',k(3))
fprintf('\tk4 = %.4f\n',k(4))
fprintf('\tk5 = %.4f\n',k(5))
fprintf('\tk6 = %.4f\n',k(6))
fprintf('
The sum of the squares is: %.1e\n\n',fval)
k_fmincon = k;

三个m文件如下:
function dXdt=jlzengkinetic(t,X,k)                %建立微分方程组,供oed23s调用
dXdt=[ (-k(1)*X(1)*(4.0626-X(4))+k(2)*X(2)*X(4))
    (k(1)*X(1)*(4.0626-X(4))-k(2)*X(2)*X(4)-k(3)*X(2)*(4.0626-X(4))+k(4)*X(3)*X(4))    (k(3)*X(2)*(4.0626-X(4))-k(4)*X(3)*X(4)-k(5)*X(3)*(4.0626-X(4))+k(6)*(0.638-X(1)-X(2)-X(3))*X(4))    (k(1)*X(1)*(4.0626-X(4))-k(2)*X(3)*(4.0626-X(4))+k(3)*X(2)*(4.0626-X(4))-k(4)*X(3)*X(4)+k(5)*X(3)*(4.0626-X(4))-k(6)*(0.638-X(1)-X(2)-X(3))*X(4))];
%--------------------------------------------------
function f = jlzengObjFmincon(k,X0,Xexp)        %建立使用fmincon()进行参数估计的函数
tspan = [0 0.5 1 1.5 2 3 4 5 7 10];
[t X] = ode23s(@jlzengkinetic,tspan,X0,[],k);
f = sum((X(:,1)-Xexp(:,1)).^2) + sum((X(:,2)-Xexp(:,2)).^2)   ...
    + sum((X(:,3)-Xexp(:,3)).^2) + sum((X(:,4)-Xexp(:,4)).^2);  %给物质浓度的计算值
%------------------------------------------------------
function f = jlzengObjLsqnonlin(k,X0,Xexp)              %在前面已经用fmincon求得参数的基础上使用Lsqnonlin对参数进行更精确的计算
tspan =[0 0.5 1 1.5 2 3 4 5 7 10];
[t X] = ode23s(@jlzengkinetic,tspan,X0,[],k);   
f1 = X(:,1) - Xexp(:,1);
f2 = X(:,2) - Xexp(:,2);
f3 = X(:,3) - Xexp(:,3);
f4 = X(:,4) - Xexp(:,4);
f = [f1; f2; f3; f4];
%-------------------------------------------------------

运行结果发现1)两种方法求出的k值差别极大;2)不管将那组k值带入[t X] = ode23s(@jlzengkinetic,tspan,X0,[],k)求出的浓度与实际浓度差别很大;3)任意给定的k值的起始值对结果影响极大。
请高手帮忙!
如果还有没表述清楚的,请提出来.

[ Last edited by sunxiao on 2009-3-8 at 11:17 ]
回复此楼
沉默坚守
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

luckyyjjun

铁虫 (正式写手)

我也遇到楼主类似的问题

★ ★
sunxiao(金币+0,VIP+0):可以发帖求助,广大虫子欢迎您 4-15 05:41
jlzeng(金币+1,VIP+0):你也可以把问题贴出来啊~ 4-22 10:25
jlzeng(金币+1,VIP+0):哪能只给一个BB呢,呵呵,全送你了:) 4-22 10:31
我也遇到楼主类似的问题
13楼2009-04-14 16:54:20
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 14 个回答

jlzeng

木虫 (正式写手)


kuhailangyu(金币+1,VIP+0):帮你加亮显示了,话题不错,讲的也挺详细的,耐心等待相关高手来解答吧! 3-4 11:02
猜想是刚性方程在由OED求数值解时出现了问题(多凸还是不连续时只在局部求解而不是对全局求最优解),不知道能不能强制在0-50之间运行每一个可能的解。
我是学生物的,现在搞化工,对计算实在是一窍不通啊!这一部分的内容是论文里必须的,还望各位高手出手相助,非常感谢!!
沉默坚守
2楼2009-03-04 10:45:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

jlzeng

木虫 (正式写手)

怎么没有人回复啊?
~~~~(>_<~~~~
沉默坚守
3楼2009-03-05 09:10:15
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

hitzhang

木虫 (正式写手)

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
sunxiao(金币+3,VIP+0):欢迎交流,得到楼主认可后,将继续追加奖励 3-5 23:33
jlzeng(金币+10,VIP+0):很有用,但还没有完全解决,非常感谢! 3-6 15:48
我看了一下你的方法,感觉很新颖,是一种纯粹的数值解法,想必你的MATLAB功底不浅。你主要是想通过两个优化工具箱函数利用最小二乘法解微分方程组进而求出速率常数。但是效果不好,我想你下面的分析是有道理的,就算法有效性而言fmincon这个函数口碑不是很好,多数都是用LINGO软件求优化问题,更别说求微分方程组了,而且透明度也不高好像在解决一个黑箱问题,求解对初始条件很敏感。

我这里有个想法仅供你参考:

这个问题的最终目的是求最佳速率常数以尽量满足微分方程组,现在,你有了各个物种随时间变化的浓度,如果知道浓度随时间的变化速率,就可以直接代入微分方程组应用最小而乘求出速率常数k。
浓度变化速率的最佳估计:可以根据你的实验数据构造出在实验范围内符合较好的各个物种的浓度方程。以下是拟和结果:

///////////////////////////////////////////////////////////////////////////////
TG:
       f(x) = a*exp(b*x) + c*exp(d*x)
Coefficients (with 95% confidence bounds):
       a =      0.5502  (0.5149, 0.5856)
       b =      -3.983  (-4.797, -3.17)
       c =     0.08751  (0.05922, 0.1158)
       d =     -0.1857  (-0.2901, -0.08124)

Goodness of fit:
  SSE: 0.0004627
  R-square: 0.9985
  Adjusted R-square: 0.9978
  RMSE: 0.008782



DG:
       f(x) = (p1*x^2 + p2*x + p3) / (x^2 + q1*x + q2)
Coefficients (with 95% confidence bounds):
       p1 =     0.01908  (0.01341, 0.02475)
       p2 =     0.05717  (0.01411, 0.1002)
       p3 =  -1.43e-007  (-0.0008759, 0.0008756)
       q1 =     -0.2444  (-0.8719, 0.3831)
       q2 =      0.1788  (0.04132, 0.3162)

Goodness of fit:
  SSE: 1.816e-005
  R-square: 0.9979
  Adjusted R-square: 0.9963
  RMSE: 0.001906


MG:
       f(x) = (p1*x^2 + p2*x + p3) / (x^2 + q1*x + q2)
Coefficients (with 95% confidence bounds):
       p1 =     0.07364  (0.04582, 0.1015)
       p2 =      0.3095  (-0.1137, 0.7328)
       p3 =  1.802e-005  (-0.00794, 0.007976)
       q1 =      0.9642  (-1.498, 3.426)
       q2 =      0.6633  (0.1897, 1.137)

Goodness of fit:
  SSE: 0.0001089
  R-square: 0.9933
  Adjusted R-square: 0.988
  RMSE: 0.004666


ME:
       f(x) = (p1*x + p2) / (x^2 + q1*x + q2)
Coefficients (with 95% confidence bounds):
       p1 =        2169  (-1.654e+004, 2.088e+004)
       p2 =      0.9198  (-23.22, 25.06)
       q1 =        1265  (-9708, 1.224e+004)
       q2 =       406.4  (-3050, 3862)

Goodness of fit:
  SSE: 0.003249
  R-square: 0.9986
  Adjusted R-square: 0.9978
  RMSE: 0.02327

///////////////////////////////////////////////////////////////////////

这几个浓度方程的拟和结果如如附件中所示。

然后就可以计算在实验时间点上TG, DG, MG, ME的浓度对时间的导数了,结果如下:
////////////////////////////////////////////////////////////////////////

>> dTGdt=[-2.20812330989885;-0.313903194394831;-0.0543072642775238;-0.0178664548644437;-0.0119669262873315;-0.00932216291313879;-0.00773110042346866;-0.00642090783831632;-0.00442930197092527;-0.00253772213004114]'

dTGdt =

   -2.2081   -0.3139   -0.0543   -0.0179   -0.0120   -0.0093   -0.0077   -0.0064   -0.0044   -0.0025

>> dDGdt=[0.319813865326457;-0.0194568056055164;-0.0513088546928754;-0.0279068843505723;-0.0164124937537988;-0.00737171342598024;-0.00411902140843388;-0.00261612659035434;-0.00131890646666286;-0.000639095343223927;]'

dDGdt =

    0.3198   -0.0195   -0.0513   -0.0279   -0.0164   -0.0074   -0.0041   -0.0026   -0.0013   -0.0006

>> dMGdt=[0.466367050839715;0.0999072143408668;0.00933499024234685;-0.00972884650823934;-0.0127379996363272;-0.0104546020606972;-0.00764618068387975;-0.00566858666344666;-0.00339187374122912;-0.00186232961806277;]'

dMGdt =

    0.4664    0.0999    0.0093   -0.0097   -0.0127   -0.0105   -0.0076   -0.0057   -0.0034   -0.0019

>> dMEdt=[5.28500993498458;0.818198974835815;0.315950868952596;0.165592835535058;0.101261692838514;0.0484953510802743;0.0278523652553689;0.0177021334686043;0.00842980322026890;0.00327667396220621;]'

dMEdt =

    5.2850    0.8182    0.3160    0.1656    0.1013    0.0485    0.0279    0.0177    0.0084    0.0033

>>

////////////////////////////////////////////////////////////////////////////

之后的工作就是把这四组数据和实验数据代入微分方程组,求出最佳速率常数。
4楼2009-03-05 21:16:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[硕博家园] 售SCI一区T0P文章,我:8.O.55.1.O.5.4,科目全,可+急 +3 2JOx3r2CYEgw 2026-08-21 5/250 2026-08-23 14:33 by KM5EcsNQRBPn
[硕博家园] 售SCI一区T0P文章,我:8.O55.1.O.54,科目全,可十急 +3 2JOx3r2CYEgw 2026-08-21 6/300 2026-08-23 14:21 by KM5EcsNQRBPn
[基金申请] 2026年的国家社科基金项目通讯评审的新规则与新动向、新挑战 +3 process2012 2026-08-23 4/200 2026-08-23 12:54 by huixian257
[考博] 售SCI一区T0P文章,我:8.O.55.1.O.54,科目齐全,可+急 +3 h4CP7TrQR8Lg 2026-08-22 5/250 2026-08-23 12:09 by LR9qGULyN2ew
[论文投稿] 售SCI一区文章,我:8O5.5.1.O5.4,科目全,可伽急 +3 2JOx3r2CYEgw 2026-08-22 4/200 2026-08-23 04:04 by OEbVnUOu01ol
[硕博家园] 售SCI一区T0P文章,我:8.O.55.1.O.5.4,科目全,可+急 +3 2JOx3r2CYEgw 2026-08-22 7/350 2026-08-23 03:55 by OEbVnUOu01ol
[论文投稿] 售一区SCI文章T0P,我:8O.551.O54,科目全,可十急 +3 2JOx3r2CYEgw 2026-08-22 5/250 2026-08-23 03:52 by OEbVnUOu01ol
[硕博家园] 售SCI一区文章,我:8O5.5.1.O5.4,科目全,可伽急 +3 2JOx3r2CYEgw 2026-08-22 7/350 2026-08-23 03:43 by OEbVnUOu01ol
[硕博家园] 售SCI一区T0P文章,我:8O.55.1.O.54,科目全,可伽急 +4 QTy3jDtz1uLt 2026-08-21 11/550 2026-08-23 02:55 by OEbVnUOu01ol
[基金申请] 93BebMhtakh前后11位开头都是大写 +7 且听虎啸 2026-08-17 8/400 2026-08-22 21:55 by 医学老男孩
[基金申请] filecode,4个jtjc了 +13 ziyangfang 2026-08-19 16/800 2026-08-22 17:08 by WH3796
[基金申请] 时间戳今天,20号变了 +5 archvillain 2026-08-20 5/250 2026-08-22 06:12 by hui_daxiao
[基金申请] 放榜前的不淡定 40+4 snowwithsea 2026-08-19 14/700 2026-08-21 23:51 by cratir
[基金申请] 科研孤儿太难了 +17 我4大白菜 2026-08-20 18/900 2026-08-21 20:57 by zhangev
[基金申请] 看来今天不会放榜了? +8 chengyan1220 2026-08-21 11/550 2026-08-21 17:52 by dcqxinyang
[论文投稿] 投稿咨询 +5 wwm09 2026-08-17 7/350 2026-08-21 10:11 by 期刊论文帮手
[基金申请] 今天放榜没戏了吧 +9 yuleib84 2026-08-19 11/550 2026-08-21 10:06 by gltch
[基金申请] 估计是周四 +3 archvillain 2026-08-18 3/150 2026-08-21 01:48 by jnhyjjm
[基金申请] 时间戳变了,能看出什么问题? +18 基诺咪客 2026-08-17 23/1150 2026-08-20 17:19 by Godzela
[基金申请] 朋友圈看到的 +6 wangzilk 2026-08-18 8/400 2026-08-19 10:55 by Haru815
信息提示
请填处理意见