师弟有一堆实验数据要拟合,MATLAB调用cftool工具箱,采用GUI模式显然会让人吐血,而用函数调用的方法就比较方便了。当然origin等软件可以批量弄,线性方程时matlab可以调用[p,e]=polyfit(x,y,n)完成。对于方程需要自定义时,个人认为Matlab的效率就更高了。
下面举个简化的拟合简单无温度系数形式的Arrhenius方程 K=A*exp(-E/RT) 例子:
1.原始数据:
T=[1000 1200 1400 1600 1800 2000];
K=[1.30E-04 1.60E-01 26 1.20E+03 2.30E+04 2.50E+05];
拟合方程形式 y=a*exp(b*x) 的Exponential形式
对T做一下基本转换:
Tr=-1./T;
2.先调用cftool,进行相关设置
a. Data中设置x_data,y_data后Create data set
b. Fitting中设置New Fit,Type of
fit: Exponential--->a*exp(b*x),后Apply
c. Curve Fitting
Tool中File-->Generate M-file
3.修改 第一行 function createFit(Tr,K)为function [cf_,gof] =
createFit(Tr,K)
找到 % Fit
this model using new data
cf_= fit(Tr(ok_),K(ok_),ft_,'Startpoint',st_);
修改为:
% Fit this model using new data
[cf_,gof]
= fit(Tr(ok_),K(ok_),ft_,'Startpoint',st_);
4. 保存该M文件为createFit.m
5. 调用函数方法:
[c,g]=createFit(Tr,K)
根据系数的结构用"."运算符取出拟合系数等,如
a=c.a
b=c.b
RMSE=g.rmse
6. cftool可自定义函数,如果拟合数据不理想需要设置系数范围,如拟合含温度系数形式的Arrhenius方程
K=A*exp(-E/RT)*(T)^n 时:
st_ =
[abc(i,1) abc(i,2) abc(i,3)
]; �c为预测系数矩阵,i为循环的列号
ft_ =
fittype('a*exp(b*x)*(-1/x)^c',...
'dependent',{'y'},'independent',{'x'},...
'coefficients',{'a', 'b', 'c'});
7. 将拟合系数写入解的矩阵中:
factor(i,:)=[c.a
c.b g.rmse];
自编程序需要调用 data文件中的T,K然后把
factor写入data文件中。由于拟合不能保证100%有解,所以需要人工干涉运行,Good Luck!
个人认为拟合含温度系数的Arrhenius方程的n时,是有些困难的。因为当n!=0时,根据曲线走势要先给出a,b的预测值,限定一下预测范围,然后再通过循环调整c值得到温度系数n.数据量小的话这个过程需要一定的人工参与,但当数据量比较大时,就需要循环判断得出残差值小的系数矩阵。这个在Matlab里面实现还是比较方便的。