24小时热门版块排行榜    

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

liqianmelody

至尊木虫 (著名写手)

[求助] 求助用matlab三次样条法算一个反应的反应速率已有1人参与

本人不会用matlab这个软件,我有实验数据,请各位精通的人帮我算一下表格标黄的那列反应速率,谢谢了!数据在附件里了,PS:附件中上传时间较晚的那个是正确文件
回复此楼

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com
  • 附件 1 : 动力学实验数据.doc
  • 2014-03-26 14:46:39, 79.5 K
  • 附件 2 : 动力学实验数据.doc
  • 2014-03-26 14:48:30, 79.5 K

» 猜你喜欢

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

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

pdl9527

专家顾问 (小有名气)


fegg7502: 金币+1, 鼓励交流 2014-03-29 08:42:59
如果其他温度求出来的参数差别很大怎么办,能不能求得不同温度的参数然后求平均值做呢?
8楼2014-03-28 21:42:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 14 个回答

月只蓝

主管区长 (职业作家)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
fegg7502: 金币+10, 3ks 2014-03-29 08:41:56
比较粗糙的办法是求数值导数,根据t CA的数据即可求出,如果需要MATLAB代码参见:http://muchong.com/bbs/viewthread.php?tid=7020495;
精确点的方法是先拟合出动力学方程中的各参数,以第一组数据(即T=325.15K这组)为例,楼主没给出反应方程式,根据三个浓度随时间的增幅,推测反应式为:
                                 A   +     B      =       C
C为生成物,初始浓度为0。忽略反应前后体系体积变化,则CA0=0.1530+0.0206=0.1736;CB0=3.4505+0.0206=3.4711;设物质A的瞬时浓度为CA,有:
                                 A        +          B            =             C
初始浓度                     CA0                CB0                        0
瞬时浓度                     CA                [CB0-(CA0-CA)]         CA0-CA

-(dCA/dt)=kCAmCBn=k0*exp(-Ea/RT)* CA^m*CB^n
得dCA/dt=-k0*exp(-Ea/RT)* CA^m* [CB0-(CA0-CA)]^n      (1)
该微分方程无法积分求得关于CA的代数式解析解,故直接对式(1)作常微分方程的拟合,求出指前因子k0、活化能Ea、两个反应级数m和n,这样把不同时间t对应的CA代入式(1)即得dCA/dt,取负得-dCA/dt。
MATLAB代码如下:
CODE:
function ode3333
clear all;clc

format long

global T
T=323.15;
tspan=[0
    30
60
90
120
180
240
300
360
420
480
540
600
];

t1=length(tspan);
yexp=[0.1530
0.1222
0.1036
0.0874
0.0619
0.0331
0.0305
0.0241
0.0185
0.0120
0.0080
0.0050
]';

t2=length(yexp);



y0=0.1736;

k0=[0.1 10000 2 2];
lb=-[1 1 1 1]*1e9;
ub=[1 1 1 1]*1e9;        

yy=[y0 yexp];

[k,resnorm,residual,exitflag,output,lambda,jacobian] = ...
    lsqnonlin(@ObjFunc,k0,lb,ub,[],tspan,y0,yexp);
ci = nlparci(k,residual,jacobian);
fprintf('\n\n使用函数lsqnonlin()估计得到的参数值为:\n')
fprintf('\t k0 = %.4f\n',k(1))
fprintf('\t Ea = %.4f\n',k(2))
fprintf('\t m = %.4f\n',k(3))
fprintf('\t n = %.4f\n',k(4))

%fprintf('\t反应级数 n = %.4f\n',k(2))
fprintf('  The sum of the squares is: %.1e\n\n',resnorm)
ts=0:1:max(tspan);

[ts ys]=ode45(@KineticsEqs,ts,y0,[],k);
[ttt XXsim] = ode45(@KineticsEqs,tspan,y0,[],k);
y=XXsim(2:end);
xexp=yexp;
R2=1-sum((xexp'-y).^2)./sum((xexp'-mean(y)).^2);
fprintf('\n\t相关系数之平方R^2 = %.6f',R2);
k0=k(1);
Ea=k(2);
m=k(3);
n=k(4);
y=yexp';
dydt_a=-k0*exp(-Ea/8.314/T)*y.^m.*(3.2975+y).^n;
[-dydt_a]


figure(1)
plot(ts,ys,'b',tspan,yy,'or'),legend('计算值','实验值','Location','best'),


%---------------------------------------------------------
function f = ObjFunc(k,tspan,y0,yexp)           % 目标函数
[t Xsim] = ode45(@KineticsEqs,tspan,y0,[],k) ;
Xsim;
ysim = Xsim(2:end);
f=ysim-yexp';
%----------------------------------------------------------

function dydt = KineticsEqs(t,y,k)
global T
k0=k(1);
Ea=k(2);
m=k(3);
n=k(4);
dydt=-k0*exp(-Ea/8.314/T)*y.^m.*(3.2975+y).^n;

计算结果显示:
k0 = 923.7021
         Ea = 9079.9827
         m = 1.1387
         n = -6.7529
相关系数之平方R^2 = 0.994517

-dCA/dt:

1.0e-003 *

   0.865245002514304
   0.711666673454071
   0.611807848360504
   0.520628349512815
   0.369919263546430
   0.192217346733282
   0.176046594470231
   0.136397181433893
   0.102089651326710
   0.063193844805022
   0.040152229316972
   0.023656194149690
拟合结果见附图1。
其他T下面的数据,修改代码中T、tspan、yexp对应的数据即可。

如果楼主嫌麻烦,直接用前面说的求数值导数的方法也可以。
求助用matlab三次样条法算一个反应的反应速率
附图1.jpg

MATLAB、MS小问题、普通问题请发帖求助!时间精力有限,恕不接受无偿私信求助。
2楼2014-03-26 20:00:43
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

月只蓝

主管区长 (职业作家)

【答案】应助回帖

★ ★
fegg7502: 金币+2, 应助指数+1, 3ks 2014-03-29 08:42:05
注意到你要求用三次样条法,三次B样条法求数值导数的例子参见下列链接的第12楼
http://muchong.com/bbs/viewthread.php?tid=6744599&fpage=1&target=self&page=2
涉及代码为”
CODE:
% 动力学数据
t = [0  20  40  60  120  180  300];
CAm = [10  8  6  5  3  2  1];

% 用最小二乘样条拟合法计算微分dCA/dt--使用不经过实验点的B样条插值函数
knots = 3;
K = 3;                  % 三次B样条
sp = spap2(knots,K,t,CAm);
pp = fnder(sp);         % 计算B样条函数的导函数
dCAdt = fnval(pp,t)    % 计算t处的导函数值
rAm = dCAdt;


该代码转自原链接第12楼。
MATLAB、MS小问题、普通问题请发帖求助!时间精力有限,恕不接受无偿私信求助。
3楼2014-03-26 20:19:21
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

liqianmelody

至尊木虫 (著名写手)


fegg7502: 金币+1, 鼓励交流 2014-03-29 08:42:18
引用回帖:
3楼: Originally posted by 月只蓝 at 2014-03-26 20:19:21
注意到你要求用三次样条法,三次B样条法求数值导数的例子参见下列链接的第12楼
http://muchong.com/bbs/viewthread.php?tid=6744599&fpage=1&target=self&page=2
涉及代码为”
% 动力学数据
t = ;
C ...

谢谢你帮我解释那么多,您楼上做出了动力学方程的结果和我之前找人做的不太一样,您做出的结果不太跟我的实际一样,之前是通过1stopt做出的,没有做出反应速率,所以这次就想做出这个,我是做分离的,对matlab一点也不懂,所以插入什么代码的也不会,就想请人帮我做出结果,我看您对此比较精通,如果您可以帮我做出,感激涕零,顺便可以追加金币,谢谢了!!!
4楼2014-03-26 21:21:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
信息提示
请填处理意见