| 查看: 3479 | 回复: 15 | ||
| 当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖 | ||
[求助]
matlab拟合方程参数时初值的选择
|
||
|
A+B=C A+W=R R+B=C+W 先考虑的三个反应都是可逆反应,有以下几个式子:编写程序如下 %30℃ clear all clc global keq1 keq2 t0 c0 keq1 = 3.94; % 平衡常数k1 keq3 = 1.08; % 平衡常数k3 t0 = [5,10, 15, 30, 45, 60,90,120,160,200,240,300,360]; c0 = [5.939601,5.203973,0,0.022484,0.078956] % A B C R W 组成的初始浓度 ci=[3.742508811 4.213566482 0.990406938 0.252498405 0.090415512; 3.045716838 3.387013322 1.816960097 0.215546741 0.081072022; 2.504754523 2.901991595 2.301981824 0.193427102 0.099462604; 1.65098702 2.036686653 3.167286766 0.170236582 0.095144044; 1.271633833 1.655460403 3.548513016 0.124730781 0.10334349; 1.129887499 1.630815394 3.573158025 0.129798695 0.097764543; 1.01239208 1.460748979 3.74322444 0.144649391 0.073614958; 1.007417603 1.429180292 3.774793127 0.123477124 0.094249307; 0.990005723 1.499216939 3.704756481 0.135524067 0.076072022; 0.970073726 1.493966669 3.71000675 0.130791851 0.076387812; 0.96903024 1.429705429 3.77426799 0.119510017 0.101202216; 0.980873385 1.457988124 3.745985296 0.124189274 0.097022161; 0.98477262 1.453402965 3.750570455 0.1200936 0.0762608]; % cA cC cR 对应时间数值 k0=[1 1 1]; % k1+, k2, k3+ 初始向值 lb = [0 0 0]; ub = [1000 1000 500]; % 上下限 % 使用函数lsqnonlin()进行参数估计 [k,resnorm,residual,exitflag] = lsqnonlin(@ObjFunc,k0,lb,ub,[],ci); k1plus=k(1); k1minus= k1plus/keq1; k2=k(2); k3plus=k(3); k3minus= k3plus/keq3; % ------------------------------------------------------------------ function f = ObjFunc(k,ci) % 目标函数 global t0 c0 [t,c_cal] = ode45(@Euqations,t0,c0,[],k); f= sum((c_cal-ci)^2); % ------------------------------------------------------------------ function dcdt = Euqations(t,c,k) global keq1 keq2 k1plus=k(1); k1minus= k1plus/keq1; k2=k(2); k3plus=k(3); k3minus= k3plus/keq3; cA=c(:,1); cB=c(:,2); cC=c(:,3); cR=c(:,4); cW=c(:,5); dcAdt = k1plus*cA*cB-k1minus*cC+k2*cA*cW; dcCdt = -k1plus*cA*cB+k1minus*cC+k3plus*cB*cR-k3minus*cC*cW; dcRdt = k2*cA*cW-k3plus*cB*cR+k3minus*cC*cW; dcdt = [dcAdt; dcCdt;dcRdt]; 但是k的初值一直影响结果,程序要怎么改一下初值对结果影响不大(这个程序有问题,) |
» 猜你喜欢
反铁磁体中的磁性切换:两种不同的机制已成功可视化
已经有0人回复
求标准粉末衍射卡号 ICDD 01-076-1802
已经有0人回复
物理学I论文润色/翻译怎么收费?
已经有250人回复
新西兰Robinson研究所招收全奖PhD
已经有0人回复
石墨烯转移--二氧化硅衬底石墨烯
已经有0人回复
笼目材料中量子自旋液体基态的证据
已经有0人回复
数学教学论硕士可以读数学物理博士吗?
已经有0人回复
德国亥姆霍兹Hereon中心汉堡分部招镁合金腐蚀裂变SCC课题方向2026公派博士生
已经有3人回复
澳门大学 应用物理及材料工程研究院 潘晖教授课题组诚招博士后
已经有2人回复
» 本主题相关价值贴推荐,对您同样有帮助:
在matlab中拟合曲面的表达式
已经有29人回复
matlab 求指点 动力学方程拟合过程中导数的获取
已经有10人回复
matlab拟合拟均相动力学参数
已经有6人回复
matlab-常微分方程参数估计
已经有12人回复
求教origin拟合简单的渗流方程(又称逾渗方程),做复合材料的应该会遇到吧
已经有20人回复
非线性拟合估计方程参数(matlab,spss,origin都可以)
已经有4人回复
matlab非线性参数拟合问题
已经有7人回复
MATLAB求解一个比较复杂的方程
已经有14人回复
【求助】用matlab最优化方法进行参数拟合
已经有17人回复
【求助】使用MATLAB拟合出按照公式的系数
已经有19人回复
如何用MATLAB拟合指数函数
已经有3人回复
【求助】最小二乘法编写指数拟合方程
已经有19人回复
【求助】使用Matlab拟合反应动力学方程问题
已经有7人回复
fielding
木虫 (正式写手)
- 应助: 5 (幼儿园)
- 金币: 3544.5
- 散金: 135
- 红花: 4
- 帖子: 672
- 在线: 219.3小时
- 虫号: 822444
- 注册: 2009-08-05
- 性别: GG
- 专业: 能源化工
【答案】应助回帖
★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
lxyy: 金币+10, ★★★很有帮助 2012-03-30 12:30:33
感谢参与,应助指数 +1
lxyy: 金币+10, ★★★很有帮助 2012-03-30 12:30:33
|
function KineticsEst clear all clc x0 = [4.639975 5.289842 0 0.039974 0.063806]; % A B C R W 组成的初始浓 k0=[1 1 1]; % k1, k2, k3 初始向值 lb = [0 0 0]; ub = [1 +inf +inf]; % 上下限 KineticsData3; yexp = Kinetics(:,2:6); % 使用函数lsqnonlin()进行参数估计 [k,resnorm,residual,exitflag,output,lambda,jacobian]=... lsqnonlin(@ObjFunc,k0,lb,ub,[],x0,yexp); fprintf('\n\n使用函数lsqnonlin()估计得到的参数值为:\n') fprintf('\tk1 = %.4f ± %.4f\n',k(1)) fprintf('\tk2 = %.4f ± %.4f\n',k(2)) fprintf('\tk3 = %.4f ± %.4f\n',k(3)) % ------------------------------------------------------------------ function f = ObjFunc(k,x0,yexp) % 目标函数 tspan = [0;5;10;15;30;46;60;90;120;160;200;240;300;360]; [t x] = ode45(@Euqations,tspan,x0,[],k); y(:,1) = x(:,1); y(:,2:5) = x(:,2:5); f1 = y(:,1) - yexp(:,1); f2 = y(:,2) - yexp(:,2); f3 = y(:,3) - yexp(:,3); f4 = y(:,4) - yexp(:,4); f5 = y(:,5) - yexp(:,5); f = [f1; f2; f3; f4;f5]; % ------------------------------------------------------------------ function dcdt = Euqations(t,x,k) r1 = k(1)*x(1)*x(2)-k(1)*x(3)/3.94; r2 = k(2)*x(1)*x(5); r3 = k(3)*x(2)*x(4)-k(3)*x(3)*x(5)/1.08; dcAdt = -r1-r2; dcBdt = -r1-r3; dcCdt = r1+r3; dcRdt = r2-r3; dcWdt = -r2+r3; dcdt = [dcAdt;dcBdt; dcCdt;dcRdt;dcWdt;]; |
16楼2012-03-29 18:30:31







回复此楼