Matlab拟合化学 反应速率方程
Matlab拟合化学 反应速率方程
对含温度系数的化学反应速率方程进行拟合。测试发现用cftool的拟合函数进行拟合比调用lsqnonlin()要好用得多。
调试情况:
a=8.188704E+013b=-4799.760247
拟合残差0.996347
输入校正系数
0.001A=1.000208E+011B=-842.079002C=2.499924
拟合残差1.000000
输入校正系数,或按0键接受当前值,进行下一组拟合
0
拟合需要经验,只有估测值好的时候,可以使相关度趋近于1.
源代码:
functionkneticMultiFit
%功能:计算含温度系数的反应速率常数
%
%说明:
%1.拟合方程形式K=A*exp(-E/RT)*(T/298)^n
%2.令x=1/T,a=A,b=-E/R,c=n
%3.首先调用expl1Fit进行k=a*exp(b*x)拟合获得初值系数a
%4.调用expl2Fit进行k=a*exp(b*x)/(x*298)^c拟合得到系数abc
%5.需要调用expl1Fit和expl2Fit文件
%
%补充说明:根据经验,n1时温度系数对高温段影响大,也就是1/T坐标轴靠近0的区域。
%而通过调整系数A使它的初值接近真实值时,而其他参数B和C只需要置零,
%也可使拟合效果比较理想。通过调整factor因子,使曲线在1/T坐标轴靠近0的区域拟合
%度增大,便可以使最终残差趋近于1.
%为了有好的收敛性,将expl2Fit中(第57行左右)ABC的拟合范围做了规定,当拟
%合情况不理想,出现拟合值在边界上时,需要调整ABC的取值范围。默认为:
%'Lower',[0-Inf0.3],'Upper',[Inf03]
%非线性拟合收敛性定义:
%'MaxFunEvals',800,'MaxIter',600,'TolFun',1e-7,'TolX',1e-7clearall,clc
%%---测试计算系数---
T=[1000:50:2000];
A=1e11;
En=-7E3;
R=8.314;
KN=[A*exp(En/R./T).*(T/298).^2.5;A*exp(En/R./T).*(T/298).^1.5];
%%--
%%---键盘输入T和k
%T=input('inputTemperatureTin[x1x2.xn]form');
%k=input('inputknetickin[x1x2.xn]form');
%%---
%%--直接输入T和k
%T=;
%k=;
%%---
%%--读入文件中的数据
%data_fit
%%---
fit_results=;
fori=1:size(KN)
k=KN(i,:);
%%取T的倒数用于拟合计算
Tr=1./T;
%用k=a*exp(b*x)拟合,得到org,g1
[org,g1]=expl1Fit(Tr,k);
fprintf('\na=%E\tb=%f\n',org.a,org.b);
fprintf('拟合残差%f\n',g1.rsquare);
%输入校正系数factor=10.110etc.
factor=input('输入校正系数\n');
%选用不同的a系数
af1=org.a*factor;
%定义其他初值
bf=0;
nf=0;
%%用k=a*exp(b*x)/(x*298)^c拟合,得到f,f_g
[f1,f_g1]=expl2Fit(Tr,k,af1,bf,nf);
fprintf('\nA=%E\tB=%f\tC=%f\n',f1.a,f1.b,f1.c);
fprintf('拟合残差%f\n',f_g1.rsquare);
%提示修改校正系数
factor=input('输入校正系数,或按0键接受当前值,进行下一组拟合\n');
whilefactor~=0closeallaf1=org.a*factor;
[f1,f_g1]=expl2Fit(Tr,k,af1,bf,nf);
fprintf('\nA=%E\tB=%f\tC=%f\n',f1.a,f1.b,f1.c);
fprintf('拟合残差%f\n',f_g1.rsquare);
factor=input('输入校正系数,或按0键接受当前值,进行下一组拟合\n');
endfit_results=[fit_results;f1.af1.bf1.cf_g1.rsquare];
i=i+1;
closeallendfinal_data=[KNfit_results];
savefitfinal_datafunction[cf_,g]=expl1Fit(Tr,k)
%Setupfiguretoreceivedatasetsandfitsfiguref_