24小时热门版块排行榜    

查看: 3046  |  回复: 7

ronghengyidu

木虫 (小有名气)

[求助] matlab拟合反应动力学参数 已有1人参与

本人是matlab大白,最近仿照黄华江编著的“实用化工计算机模拟”例题7-5拟合动力学参数,
           动力学方程为dc1/dt=k1*c1/(k2+k3*c1+k4*c2+k5*c1*c2),拟合k1,k2,k3,k4,k5,
           matlab程序和动力学数据见附件,运行出现如下错误,请各位大拿帮助。
                  

Error: File: KineticsEst.m Line: 47 Column: 60
Unbalanced or unexpected parenthesis or bracket.

Error in run (line 64)
evalin('caller', [script ';']);

Error: File: KineticsEst.m Line: 47 Column: 60
Unbalanced or unexpected parenthesis or bracket.

Error in run (line 64)
evalin('caller', [script ';']);
回复此楼

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com
  • 附件 1 : KineticsEst.m
  • 2016-10-03 16:39:52, 1.98 K
  • 附件 2 : KineticsData.m
  • 2016-10-03 16:40:16, 365 bytes

» 收录本帖的淘帖专辑推荐

程序

» 猜你喜欢

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

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

lu_yu_lan

新虫 (初入文坛)

【答案】应助回帖

★ ★
感谢参与,应助指数 +1
月只蓝: 金币+2, 感谢应助! 2016-10-04 21:59:50
楼主的问题,没有看明白,找到了 黄华江编著的“实用化工计算机模拟”例题7-5拟合动力学参数

7个微分方程,5个拟合参数k1,k2,k3,k4,k5,初值t=0时,x为0.1883,  0.2507,  0.0467,  0.0899,  0.1804,  0.1394,  0.1046

  q = 8.75 + k5,
  dx1/t=  k5-q*x1- k1*x1*x2-k4*x1*x6*sqrt(0.9),
  dx2/t=  7.0-q*x2 - k1*x1*x2-2*k2*x2*x3,
  dx3/t=  1.75 -q*x3 - k2*x2*x3,
  dx4/t=  -q*x4 + 2*k1*x1*x2-k3*x4*x5,
  dx5/t=  -q*x5 + 3*k2*x2*x3-k3*x4*x5,
  dx6/t=  -q*x6 + 2*k3*x4*x5-k4*x1*x6*sqrt(0.9),
  dx7/t=  -q*x7 + 2*k4*x1*x6*sqrt(0.9)

数据:t,x1,x4,x5,x6
    0         0.1883        0.0899    0.1804         0.1394
    0.0100    0.2047    0.0866    0.1729    0.1297
    0.0200    0.2181    0.0856    0.1680    0.1205
    0.0300    0.2291    0.0863    0.1647    0.1123
    0.0400    0.2382    0.0878    0.1623    0.1053
    0.0500    0.2459    0.0899    0.1604    0.0995
    0.0600    0.2523    0.0921    0.1588    0.0948
    0.0700    0.2576    0.0945    0.1574    0.0911
    0.0800    0.2622    0.0968    0.1561    0.0882
    0.0900    0.2660    0.0989    0.1548    0.0859
    0.1000    0.2692    0.1010    0.1537    0.0842
    0.1100    0.2719    0.1028    0.1525    0.0830
    0.1200    0.2742    0.1045    0.1515    0.0821
    0.1300    0.2761    0.1060    0.1505    0.0814
    0.1400    0.2777    0.1074    0.1495    0.0810
    0.1500    0.2790    0.1086    0.1487    0.0807
    0.1600    0.2801    0.1096    0.1479    0.0805
    0.1700    0.2811    0.1106    0.1471    0.0803
    0.1800    0.2819    0.1114    0.1465    0.0803
    0.1900    0.2825    0.1121    0.1458    0.0803
    0.2000    0.2830    0.1127    0.1453    0.0803

用OpenLu求解:
CODE:
!!!using["IMSL","luopt","math"]; //使用命名空间
f(t,x1,x2,x3,x4,x5,x6,x7,dx1,dx2,dx3,dx4,dx5,dx6,dx7 : q : k1,k2,k3,k4,k5)=
{
  q = 8.75 + k5,
  dx1=  k5-q*x1- k1*x1*x2-k4*x1*x6*sqrt(0.9),
  dx2=  7.0-q*x2 - k1*x1*x2-2*k2*x2*x3,
  dx3=  1.75 -q*x3 - k2*x2*x3,
  dx4=  -q*x4 + 2*k1*x1*x2-k3*x4*x5,
  dx5=  -q*x5 + 3*k2*x2*x3-k3*x4*x5,
  dx6=  -q*x6 + 2*k3*x4*x5-k4*x1*x6*sqrt(0.9),
  dx7=  -q*x7 + 2*k4*x1*x6*sqrt(0.9)
};
目标函数(_k1,_k2,_k3,_k4,_k5 : i,s,tyz,tyy : tyArray,tA,k1,k2,k3,k4,k5)=
{
  k1=_k1, k2=_k2, k3=_k3, k4=_k4, k5=_k5,   //传递优化变量,函数f中要用到k1,k2,k3,k4,k5
  tyz=ode[@f,tA,ra1(0.1883,  0.2507,  0.0467,  0.0899,  0.1804,  0.1394,  0.1046)],
  tyy=tyArray(zeros), tyy(all:0,1)=subg(tyz,all:0,1), tyy(all:2,4)=subg(tyz,all:4,6),
  sum[(tyy-tyArray).^2.0,0]
};
main(::tyArray,tA)=
{
      tyArray=matrix{   //存放实验数据t,x1,x4,x5,x6
"
    0                0.1883        0.0899    0.1804          0.1394
    0.0100    0.2047    0.0866    0.1729    0.1297
    0.0200    0.2181    0.0856    0.1680    0.1205
    0.0300    0.2291    0.0863    0.1647    0.1123
    0.0400    0.2382    0.0878    0.1623    0.1053
    0.0500    0.2459    0.0899    0.1604    0.0995
    0.0600    0.2523    0.0921    0.1588    0.0948
    0.0700    0.2576    0.0945    0.1574    0.0911
    0.0800    0.2622    0.0968    0.1561    0.0882
    0.0900    0.2660    0.0989    0.1548    0.0859
    0.1000    0.2692    0.1010    0.1537    0.0842
    0.1100    0.2719    0.1028    0.1525    0.0830
    0.1200    0.2742    0.1045    0.1515    0.0821
    0.1300    0.2761    0.1060    0.1505    0.0814
    0.1400    0.2777    0.1074    0.1495    0.0810
    0.1500    0.2790    0.1086    0.1487    0.0807
    0.1600    0.2801    0.1096    0.1479    0.0805
    0.1700    0.2811    0.1106    0.1471    0.0803
    0.1800    0.2819    0.1114    0.1465    0.0803
    0.1900    0.2825    0.1121    0.1458    0.0803
    0.2000    0.2830    0.1127    0.1453    0.0803
"
    },
    tA=tyArray(all:0), //tA取矩阵的列
    ClearImslErr(),    //清空IMSL错误输出
    ERSET(0,0,0),      //关闭IMSL所有警告
    Opt[@目标函数],    //Opt函数全局优化
    ERSET(0,2,2), ERSET(0,1,0)   //恢复IMSL警告
};

结果(k1,k2,k3,k4,k5,目标函数值):
17.60849027475542         73.06467445464085         51.32551162517818         23.02494410245102         6.001239504989786         6.794401934343191e-008

优于原书matlab结果:
17.49,  72.2996,  50.9086,  22.5339,  5.9799, 3.614535245714516e-007

» 本帖已获得的红花(最新10朵)

2楼2016-10-03 21:21:39
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ronghengyidu

木虫 (小有名气)

送红花一朵
引用回帖:
2楼: Originally posted by lu_yu_lan at 2016-10-03 21:21:39
楼主的问题,没有看明白,找到了 黄华江编著的“实用化工计算机模拟”例题7-5拟合动力学参数

7个微分方程,5个拟合参数k1,k2,k3,k4,k5,初值t=0时,x为0.1883,  0.2507,  0.0467,  0.0899,  0.1804,  0.1394,  0 ...

非常感谢您的回复,我只有一个微分方程,dc1/dt=k1*c1/(k2++k3*c1+k4*c2+k5*c1*c2), 拟合5个参数k1,k2,k3,k4,k5。我的t,c1,c2数据在附件中,matlab程序也在附件中,这两个文件都可以用记事本打开。在这里我把程序和实验数据再贴出来。

function KineticsEst
% 动力学ODE方程模型的参数估计


clear all
clc

k0 = [0.5  0.5  0.5  0.5  0.5];         % 参数初值
lb = [0  0  0  0  0];                   % 参数下限
ub = [+inf  +inf  +inf  +inf  +inf];    % 参数上限
x0 = [150  1500];
KineticsData;
yexp = ExpData(:,2:3);                  % yexp: 实验数据[x1        x2]

% 使用函数fmincon()进行参数估计
[k,fval,flag] = fmincon(@ObjFunc4Fmincon,k0,[],[],[],[],lb,ub,[],[],yexp);
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('  The sum of the squares is: %.1e\n\n',fval)
k_fmincon = k;

% 使用函数lsqnonlin()进行参数估计
[k,resnorm,residual,exitflag,output,lambda,jacobian] = ...
    lsqnonlin(@ObjFunc4LNL,k0,lb,ub,[],x0,yexp);      
ci = nlparci(k,residual,jacobian);
fprintf('\n\n使用函数lsqnonlin()估计得到的参数值为:\n')
Output

% 以函数fmincon()估计得到的结果为初值,使用函数lsqnonlin()进行参数估计
k0 = k_fmincon;
[k,resnorm,residual,exitflag,output,lambda,jacobian] = ...
    lsqnonlin(@ObjFunc4LNL,k0,lb,ub,[],x0,yexp);      
ci = nlparci(k,residual,jacobian);
fprintf('\n\n以fmincon()的结果为初值,使用函数lsqnonlin()估计得到的参数值为:\n')
Output


% ------------------------------------------------------------------
function f = ObjFunc4Fmincon(k,x0,yexp)
tspan = ExpData(:,1);
[t x] = ode45(@KineticEqs,tspan,x0,[],k);   
y(:,1:2) = x(:,1:2);
f = sum((y(:,1)-yexp(:,1)).^2) + sum((y(:,2)-yexp(:,2)).^2));

% ------------------------------------------------------------------
function f = ObjFunc4LNL(k,x0,yexp)
tspan = = ExpData(:,1);
[t x] = ode45(@KineticEqs,tspan,x0,[],k);   
y(:,1:2) = x(:,1:2);
f1 = y(:,1) - yexp(:,1);
f2 = y(:,2) - yexp(:,2);
f = [f1; f2];

% ------------------------------------------------------------------
function dxdt = KineticEqs(t,x,k)
dxdt =  ...
k(1)*x(1)./(k(2)+k(3)*x(1)+k(4)*x(2)+k(5)*x(1).*x(2));



实验数据如下:

动力学数据:
    t      c1         c2   
    0      150              1500          
    10    137.3    1487.3   
    30    107.7    1457.7   
    60    72.8     1422.8  
    90    48.8     1398.8   
    120   22.9     1372.9   
    150   11.8     1361.8   
    180   5.4      1355.4   
    220   1.9      1351.9  
    240   0.9      1350.9  


期望楼上能够指点,如果您能够给出openLU程序,我也非常感谢,因为我第一次听说这个程序,怕仿照编程又要出错。非常感谢您在节假日能够回答我的问题。
3楼2016-10-04 05:01:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lu_yu_lan

新虫 (初入文坛)

引用回帖:
3楼: Originally posted by ronghengyidu at 2016-10-04 05:01:01
非常感谢您的回复,我只有一个微分方程,dc1/dt=k1*c1/(k2++k3*c1+k4*c2+k5*c1*c2), 拟合5个参数k1,k2,k3,k4,k5。我的t,c1,c2数据在附件中,matlab程序也在附件中,这两个文件都可以用记事本打开。在这里我把程序 ...

是不是还有一个微分方程,dc2/dt=... ...。
否则应该怎样使用c2数据呢?

» 本帖已获得的红花(最新10朵)

4楼2016-10-04 08:37:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ronghengyidu

木虫 (小有名气)

送红花一朵
引用回帖:
4楼: Originally posted by lu_yu_lan at 2016-10-04 08:37:24
是不是还有一个微分方程,dc2/dt=... ...。
否则应该怎样使用c2数据呢?...

C2初始值是C1初始值的十倍,但是反应过程中C1消耗值与C2消耗值一样
5楼2016-10-04 19:30:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lu_yu_lan

新虫 (初入文坛)

【答案】应助回帖

引用回帖:
5楼: Originally posted by ronghengyidu at 2016-10-04 19:30:02
C2初始值是C1初始值的十倍,但是反应过程中C1消耗值与C2消耗值一样...

根据楼主的意思,微分方程及拟合参数似乎可以简化为:dc1/dt=c1/(k1+k2*c1+k3*c1^2)
相应地,数据也去掉1500那一列。
OpenLu代码:
CODE:
!!!using["IMSL","luopt","math"]; //使用命名空间
f(t,c1,dc1:: k1,k2,k3)=
{
   dc1=c1/(k1+k2*c1+k3*c1^2)
};
目标函数(_k1,_k2,_k3 : tyz: tyArray,tA,k1,k2,k3)=
{
   k1=_k1, k2=_k2, k3=_k3, //传递优化变量,函数f中要用到k1,k2,k3
   tyz=ode[@f,tA,ra1(150)],
   sum[(tyArray-tyz).^2.0,0]
};
main(::tyArray,tA)=
{
       tyArray=matrix{   //存放实验数据
"
     0     150               
     10    137.3        
     30    107.7        
     60    72.8      
     90    48.8         
     120   22.9        
     150   11.8         
     180   5.4         
     220   1.9      
     240   0.9      
"
    },
    tA=tyArray(all:0), //tA取矩阵的列
    ClearImslErr(),    //清空IMSL错误输出
    ERSET(0,0,0),      //关闭IMSL所有警告
    Opt[@目标函数],    //Opt函数全局优化
    ERSET(0,2,2), ERSET(0,1,0)   //恢复IMSL警告
};

结果(k1,k2,k3,目标函数值):
-28.81117789336092        -0.6456997498853914       1.11232432991073e-003     19.60179363209554

图形:
CODE:
!!!using("IMSL","win","math");
f(t,c1,dc1:: k1,k2,k3)=
{
   dc1=c1/(k1+k2*c1+k3*c1^2)
};
init(x,t::k1,k2,k3)=
  x = matrix[
"
     0     150               
     10    137.3        
     30    107.7        
     60    72.8      
     90    48.8         
     120   22.9        
     150   11.8         
     180   5.4         
     220   1.9      
     240   0.9
"
  ],
  t=x(all:0).reshape(),
  k1=-28.81117789336092, k2=-0.6456997498853914, k3=1.11232432991073e-003,
  luShareX2(x, ode[@f,t,ra1(150)]);
ChartWnd[@init];

matlab拟合反应动力学参数
tuxing.png

6楼2016-10-04 22:50:57
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lu_yu_lan

新虫 (初入文坛)

【答案】应助回帖

引用回帖:
5楼: Originally posted by ronghengyidu at 2016-10-04 19:30:02
C2初始值是C1初始值的十倍,但是反应过程中C1消耗值与C2消耗值一样...

如果保留1500的c2那一列数据,则微分方程为:
dc1/dt=c1/(k1+k2*c1+k3*c1^2),
dc2/dt=dc1/dt

OpenLu代码:
CODE:
!!!using["IMSL","luopt","math"]; //使用命名空间
f(t,c1,c2,dc1,dc2 :: k1,k2,k3)=
{
   dc1=c1/(k1+k2*c1+k3*c1^2),
   dc2=dc1
};
目标函数(_k1,_k2,_k3 : tyz: tyArray,tA,k1,k2,k3)=
{
   k1=_k1, k2=_k2, k3=_k3,   //传递优化变量,函数f中要用到k1,k2,k3
   tyz=ode[@f,tA,ra1(150, 1500)],
   sum[(tyArray-tyz).^2.0,0]
};
main(::tyArray,tA)=
{
    tyArray=matrix{   //存放实验数据
"
     0     150      1500         
     10    137.3    1487.3   
     30    107.7    1457.7   
     60    72.8     1422.8  
     90    48.8     1398.8   
     120   22.9     1372.9   
     150   11.8     1361.8   
     180   5.4      1355.4   
     220   1.9      1351.9  
     240   0.9      1350.9
"
    },
    tA=tyArray(all:0), //tA取矩阵的列
    ClearImslErr(),    //清空IMSL错误输出
    ERSET(0,0,0),      //关闭IMSL所有警告
    Opt[@目标函数],    //Opt函数全局优化
    ERSET(0,2,2), ERSET(0,1,0)   //恢复IMSL警告
};

结果(k1,k2,k3,目标函数值):
-28.81145245946761        -0.6456992022469275       1.112333606324668e-003    39.20358725345449

可以看出,拟合参数值是相同的。
以下是c1、c2的计算值:
             0.           150.          1500.
            10.        135.485        1485.48
            30.        108.705         1458.7
            60.        73.9603        1423.96
            90.        45.8941        1395.89
           120.        25.0957         1375.1
           150.        11.8172        1361.82
           180.        4.86412        1354.86
           220.        1.31349        1351.31
           240.       0.665649        1350.67
7楼2016-10-04 22:59:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lu_yu_lan

新虫 (初入文坛)

【答案】应助回帖

引用回帖:
5楼: Originally posted by ronghengyidu at 2016-10-04 19:30:02
C2初始值是C1初始值的十倍,但是反应过程中C1消耗值与C2消耗值一样...

dc1/dt=k1*c1/(k2+k3*c1+k4*c2+k5*c1*c2),
      =c1/(k1*k2+k1*k3*c1+k1*k4*c2+k1*k5*c1*c2)
另由于“C1消耗值与C2消耗值一样”,故设c2=c1+k6,此例中k6=1350。带入上式,化简,只有三个拟合参数。
可以简化为:dc1/dt=c1/(k1+k2*c1+k3*c1^2)
相应地,数据也要去掉1500那一列。
8楼2016-10-05 07:38:07
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 ronghengyidu 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 售SCI一区T0P文章,我:8.O.55.1.O54,科目全,可伽急 +3 u1xkze8ybe 2026-07-30 7/350 2026-07-31 12:10 by syhhffkrym
[论文投稿] 售SCI一区T0P文章,我:8.O.55.1.O.5.4,科目全,可+急 +3 u1xkze8ybe 2026-07-30 3/150 2026-07-31 12:08 by syhhffkrym
[硕博家园] 售SCI一区T0P文章,我:8.O.55.1.O.5.4,科目全,可+急 +3 u1xkze8ybe 2026-07-30 6/300 2026-07-31 12:05 by syhhffkrym
[教师之家] 基础研究怎么拉横向,学校到款任务越来越多,难以完成 拉横向,都有哪些途径啊 +6 锦衣卫寒战 2026-07-28 6/300 2026-07-31 11:27 by syl200707
[高分子] HXDI做水性聚氨酯乳液,是不是特别容易出渣 15+3 yuyusuv 2026-07-29 3/150 2026-07-31 09:21 by huizingga
[基金申请] 小木虫看见有人已经知道结果了 +15 1234567wang 2026-07-25 19/950 2026-07-31 08:30 by ZJTJZ
[基金申请] 2026年国自然面上资助率 +8 布布和一二 2026-07-30 8/400 2026-07-31 01:51 by alongwaytogo
[基金申请] 系统今天又提示维护了,估计离放榜不远了 +11 winnerche 2026-07-29 15/750 2026-07-30 23:08 by jnhyjjm
[基金申请] 微信指数没变化,科研之友没阅读 +14 wangze12014 2026-07-28 17/850 2026-07-30 20:10 by kissu88
[考博] 申请2027年材料/化学类博士 10+3 考研老狗? 2026-07-25 5/250 2026-07-30 19:33 by 白色木鱼
[基金申请] 你们的时间戳变了吗 +3 archvillain 2026-07-30 4/200 2026-07-30 18:53 by levinzhwen
[基金申请] 今年的WR进展到哪一步了? +5 wsgjhwz 2026-07-25 9/450 2026-07-30 12:59 by 可淡不可忘
[有机交流] 产物和副产物价值比较 30+4 小汤02 2026-07-27 5/250 2026-07-30 12:44 by czyzsu
[基金申请] 时间戳他又来了 +14 晓晓爱翠翠 2026-07-26 17/850 2026-07-29 16:30 by 呵呵二哥
[有机交流] 这个自发加氧反应的机理是什么? 50+4 YUAN2273 2026-07-25 7/350 2026-07-29 12:27 by xiaobenpu
[基金申请] 没消息就是被刷了呗 +13 lambert2014 2026-07-24 14/700 2026-07-29 10:38 by msh145800
[基金申请] 这种情况还有戏吗 +5 drbart 2026-07-27 11/550 2026-07-29 05:50 by drbart
[基金申请] 同事接到电话了,我却没有 +4 1234567wang 2026-07-27 4/200 2026-07-28 10:11 by GOODLUCKER
[基金申请] 准备明年的基金了 +5 Tide man 2026-07-27 5/250 2026-07-28 09:25 by newfuzzy1
[分析] 水蒸气蒸馏法乳化现象 +3 月光娇娇 2026-07-26 3/150 2026-07-26 23:25 by caiyun
信息提示
请填处理意见