| 查看: 1619 | 回复: 6 | |||
[交流]
使用lsqnonlin函数优化动力学参数,总是得不到合理的结果
|
|
大家好: 我最近在使用matlab回归动力学参数,首先是使用4阶龙哥库塔算法进行积分,之后使用lsqnonlin进行非线性最小二乘拟合,运行已经写好的m文件,总是得不到合理的结果,不知道是不是自己程序编写有问题,请大神指导,谢谢。 下面粘贴上自己的m文件: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function zqq100 % 动力学ODE方程模型的参数估计 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear all clc kz0 = [1.73 -3 4.3 3.4 29.4 26.46 22.8 29.4]; % 参数初值 lb = []; % 参数下限 ub = []; % 参数上限 x0 = [72516.987800 7922.540990 2213.519110 2440.339360]; KineticsData; yexp = ExpData(:,2:5); % yexp: 实验数据[x1 x2 x3 x4] %再参数化 a = 0; b = 0.022146; d=0.000022146; tt=a:d:b; z = func(tt); Tintegral = quadl(@func,a,b); % 实际上应该是(1000/T)integral Taverage = Tintegral/(b-a) ; % 实际上应该是(1000/T)average % 优化参数设置 options=optimset ('Display','iter','TolX',1e-25,'TolFun',1e-25,'LargeScale','off','MaxIter',2,'MaxFunEvals',inf); % 使用函数lsqnonlin()进行参数估计 [kz,resnorm,residual,exitflag,output,lambda,jacobian] = ... lsqnonlin(@ObjFunc4LNL,kz0,lb,ub,options,x0,yexp,Taverage); ci = nlparci(kz,residual,jacobian); %把回归参数转化为自己需要的参数 k01 = exp(kz(1)+kz(5)*Taverage); ke1 = exp(ci(1,2)-kz(1)+(ci(5,2)-kz(5))*Taverage); Ea1 = kz(5)*1000*8.314; Ee1 = (ci(5,2)-kz(5))*1000*8.314; k02 = exp(kz(2)+kz(6)*Taverage); ke2 = exp(ci(2,2)-kz(2)+(ci(6,2)-kz(6))*Taverage); Ea2 = kz(6)*1000*8.314; Ee2 = (ci(6,2)-kz(6))*1000*8.314; k03 = exp(kz(3)+kz(7)*Taverage); ke3 = exp(ci(3,2)-kz(3)+(ci(7,2)-kz(7))*Taverage); Ea3 = kz(7)*1000*8.314; Ee3 = (ci(7,2)-kz(7))*1000*8.314; k04 = exp(kz(4)+kz(8)*Taverage); ke4 = exp(ci(4,2)-kz(4)+(ci(8,2)-kz(8))*Taverage); Ea4 = kz(8)*1000*8.314; Ee4 = (ci(8,2)-kz(8))*1000*8.314; % ------------------------------------------------------------------ % 输出结果 fprintf('\n\n使用函数lsqnonlin()估计得到的参数值为:\n') fprintf('\tk01 = %.4f ± %.4f\n',k01,ke1) fprintf('\tk02 = %.4f ± %.4f\n',Ea1,Ee1) fprintf('\tk03 = %.4f ± %.4f\n',k02,ke2) fprintf('\tk04 = %.4f ± %.4f\n',Ea2,Ee2) fprintf('\tEa1 = %.4f ± %.4f\n',k03,ke3) fprintf('\tEa2 = %.4f ± %.4f\n',Ea3,Ee3) fprintf('\tEa3 = %.4f ± %.4f\n',k04,ke4) fprintf('\tEa4 = %.4f ± %.4f\n',Ea4,Ee4) fprintf(' The sum of the squares is: %.1e\n\n',resnorm) % ------------------------------------------------------------------ function f = ObjFunc4LNL(kz,x0,yexp,Taverage) tspan = [0.000000 0.006021 0.009538 0.012340 0.014647 0.016594 0.018268 0.019730 0.020395 0.021021 0.021613 0.022146]; [t x] = ode45(@KineticEqs,tspan,x0,[],kz,Taverage); y(:,1:4)=x(:,1:4); f1 = y(:,1) - yexp(:,1); f2 = y(:,2) - yexp(:,2); f3 = y(:,3) - yexp(:,3); f4 = y(:,4) - yexp(:,4); f = [f1; f2; f3; f4]; % ------------------------------------------------------------------ function dxdt = KineticEqs(t,x,kz,Taverage) T = 2E+09*t.^4 - 8E+07*t.^3 + 1E+06*t.^2 + 1593.6*t + 823.94; D = 1000./T-Taverage; k(1)=exp(kz(1)-kz(5)*D); k(2)=exp(kz(2)-kz(6)*D); k(3)=exp(kz(3)-kz(7)*D); k(4)=exp(kz(4)-kz(8)*D); dxdt = ... [ ( - k(1)*x(1) ) ( - k(1)*x(1) - k(3)*x(3) + k(2)*x(2) ) ( - k(1)*x(1) + k(3)*x(3) + k(4)*x(3) ) ( - k(2)*x(2) - k(3)*x(3) - k(4)*x(3) ) ]; % ------------------------------------------------------------------ function z = func(tt) z =1000./( 2E+09*tt.^4 - 8E+07*tt.^3 + 1E+06*tt.^2 + 1593.6*tt + 823.94); 数据文件 % 动力学数据: % t y1 y2 y3 y4 ExpData = ... [ 0.000000 72516.987800 7922.540990 2213.519110 2440.339360 0.006021 42499.607900 22206.384100 3306.398400 3606.838600 0.009538 29000.355000 29930.619400 3600.077060 3836.127990 0.012340 20185.280200 35570.546400 3528.468400 3684.127360 0.014647 14159.635500 39715.404600 3262.616960 3307.931340 0.016594 9923.223120 42747.821100 2919.806950 2824.661990 0.018268 6889.657400 44873.256100 2561.423650 2313.346410 0.019730 4712.646380 46269.306400 2219.932610 1823.752130 0.020395 3871.540620 46727.452000 2061.574630 1592.788930 0.021021 3166.514550 47033.087200 1914.970250 1369.417740 0.021613 2580.686780 47184.935100 1784.008050 1149.425230 0.022146 2121.809490 47180.789300 1679.141140 937.562404 ] [ Last edited by zhangqq72270 on 2013-8-14 at 10:15 ] |
» 猜你喜欢
上海工程技术大学张培磊教授团队招收博士生
已经有3人回复
上海工程技术大学【激光智能制造】课题组招收硕士
已经有5人回复
求助院士们,这个如何合成呀
已经有4人回复
临港实验室与上科大联培博士招生1名
已经有9人回复
想换工作。大多数高校都是 评职称时 认可5年内在原单位取得的成果吗?
已经有7人回复
需要合成515-64-0,50g,能接单的留言
已经有4人回复
自荐读博
已经有4人回复
写了一篇“相变储能技术在冷库中应用”的论文,论文内容以实验为主,投什么期刊合适?
已经有6人回复
带资进组求博导收留
已经有10人回复
最近几年招的学生写论文不引自己组发的文章
已经有11人回复
» 本主题相关价值贴推荐,对您同样有帮助:
matlab的lsqnonlin函数怎么用
已经有7人回复
紧急求助,利用Matlab对实验数据进行拟合求解参数。
已经有27人回复
关于matlab的参数估计
已经有15人回复
怎样用一组参数同时拟合两个曲线--matlab
已经有5人回复
Matlab最小二乘参数优化
已经有3人回复
帮忙给看看这个matlab优化函数 问题
已经有8人回复
动力学参数拟合
已经有26人回复
MATLAB非线性优化拟合怎么改才正确
已经有3人回复
matlab fmincon优化函数 怎样知道每次得到的迭代点
已经有3人回复
求助 用Oringin拟合转状态方程
已经有6人回复
请教matlab反应动力学参数估计遇到的问题,谢谢
已经有15人回复
拟合非线性方程系数的精度问题
已经有5人回复
matlab拟合方程参数时初值的选择
已经有15人回复
matlab拟合模型参数
已经有5人回复
lsqnonlin函数拟合微分方程组参数拟合问题
已经有10人回复
matlab非线性参数拟合问题
已经有7人回复
【求助】催化反应动力学matlab计算各基元反应的速率常数时,该如何避免较小量被忽略?
已经有3人回复
【求助】催化反应动力学
已经有5人回复
【求助】matlab 二次规划的优化的问题
已经有4人回复
【求助】使用Matlab拟合反应动力学方程问题
已经有7人回复
【求助】使用Matlab预估动力学方程问题
已经有13人回复
» 抢金币啦!回帖就可以得到:
虚位以待,共探前沿:热烈欢迎报考北京工业大学纳米多孔材料课题组2026级博士研究生
+1/255
湖北大学食品安全研究团队诚招博士后
+1/175
导电高分子用什么工艺处理分子链的堆叠会更加规整???
+1/88
广州
+1/83
中国海洋大学与中国水产科学研究院 联合培养 专硕 食品加工与安全
+1/79
坐标北京不异地
+1/74
【招生啦招生啦】武汉理工大学朱曼副研究员招收2026年9月入学博士/硕士研究生
+1/31
浙江师范大学申利国教授招聘博士后研究人员
+1/30
上海大学 力工学院 锂电池方向 博士研究生招生
+1/29
南科大夏海平院士-深大张平玉课题组联合招聘博士后
+1/29
有没有在ITO或者FTO玻璃上做好的CdS薄膜购买?
+1/27
SCI,计算机相关可以写
+1/26
SCI计算机相关论文
+1/25
SCI,计算机相关可以写
+1/23
天津大学化学系吴立朋课题组申请考核制博士招生/博后招聘
+1/12
天津大学化学系吴立朋课题组申请考核制博士招生/博后招聘
+1/7
有多余纯化系统,20-200mm高压制备分离系统,配套齐全可对外代工、委托加工、项目合作
+1/4
电催化博士求职
+1/3
海南大学!海洋与极地地质团队长期招收博士和博士后
+1/1
上海理工大学“新能源材料”专业-赵斌教授招收博士生【申请考核制】
+1/1
2楼2013-08-14 10:22:39
3楼2013-08-14 10:25:21
★
小木虫: 金币+0.5, 给个红包,谢谢回帖
小木虫: 金币+0.5, 给个红包,谢谢回帖
| 强非线性的是不是需要用其他算法,比如GA这类全局搜索的,这种问题如果给的初值不在平衡点的吸引域内是不是就没法获得很好的效果。 |
» 本帖已获得的红花(最新10朵)
4楼2013-08-16 11:38:32
5楼2013-08-16 11:48:16
6楼2013-08-16 14:49:19
7楼2013-08-16 14:49:43







回复此楼
zhangqq72270