在利用origin等商业软件对某些复杂的公式进行拟合时,常常会出现未知原因的拟合失败。这并不是说明我们的公式本身有问题,很有可能是因为商业软件本身的算法有问题。这时候就可以应用matlab中的曲线拟合功能进行拟合。下面附上案例代码,为方便后文叙述,不同部分之间用空行隔开。
syms t;
x=[50; 200; 400; 600; 800];
y=[0.00000209; 0.00000267; 0.00000825; 0.000748; 0.0216];
f=fittype('C*(1-(0.0005)^(0.00013-0.000000372*t+0.0000000036*t^2))^(n+1)','independent','t','coefficients',{'C','n'});
[cfun,rsquare]=fit(x,y,f,'Lower',[580,1.4],'Upper',[3000000,3],'StartPoint',[600, 1.5]);
xi=0:1:850;
yi=cfun(xi);
plot(x,y,'r*',xi,yi,'b-');
第一部分进行的操作是定义变量及赋已知点
需要注意的点:
1、自变量t要单独定义
2、已知点必须保存为列向量。
3、列向量要一 一对应(数据量大的时候一定要检查一下)。
第二部分进行的操作是定义拟合函数f
这里调用了fittype函数来进行函数的自定义。其语法可简述为:
f=fittype('公式具体表达','independent','自变量名','coefficients',{'待定参数1','待定参数2'});
ps:有兴趣的小伙伴可以在origin中拟合案例代码中的数据和公式,如果拟合成功了,请不吝赐教。
第三部分进行的是fitoptions设置,即拟合选项的设置。
这里调用了fit函数。其语法可简述为:
[cfun,函数输出设置]=fit(x,y,f,'函数输入设置1',输入设置1具体定义,'函数输入设置2',输入设置2具体定义,...,'函数输入设置n',输入设置n具体定义)
函数输出设置可选rsquare等,需要注意的是其输出是作为一个整体输出的。一般写rsquare,诸如sse、rsquare、dfe、adjusted rsquare、rmse都会给出。所以建议只写rsquare即可。
函数输入设置可选较多,这里只给常用的几个参数设定:
1、lower:拟合参数下界限,和参数一 一对应,案例中'Lower',[580,1.4]即表示拟合过程中参数C取值不小于580,参数n取值不小于1.4。
2、upper:拟合参数上界限,和参数一 一对应,案例中'Upper',[3000000,3]即表示拟合过程中参数C取值不大于3000000,参数n取值不大于3。
3、StartPoint:拟合参数初始值,和参数一 一对应,案例中'StartPoint',[600,1.5]即表示拟合开始时参数C取值为600,参数n取值为1.5。
需要注意的一点是上述参数不知道的情况下可全部删去。但拟合结果会出现以下语句,其大意为计算过程中参数初值由系统随机选定,这将导致拟合结果不可靠。在不知道参数上下界范围的时候,建议删去所有输入设置,多次试算以确定参数大致范围。
警告: Start point not provided, choosing random start point.
> In curvefit.attention.Warning/throw (line 30)
In fit>iFit (line 299)
In fit (line 108)
cfun =
General model:
cfun(t) = C*(1-(0.0005)^(0.00013-0.000000372*t+0.0000000036*t^2))^(n+1)
Coefficients (with 95% confidence bounds):
C = 589.8 (-6265, 7445)
n = 1.488 (-1.303, 4.279)
rsquare =
包含以下字段的 struct:
sse: 1.9441e-05
rsquare: 0.9470
dfe: 3
adjrsquare: 0.9294
rmse: 0.0025
第四部分进行的是拟合自变量范围及间隔设置。
案例中xi=0:1:850;表示绘制0到850之间的拟合曲线,拟合曲线计算间隔为1。(理论上设置间隔越小,最后拟合结果越可靠,建议间隔不要超过3000个)
第五部分通过调用plot函数绘制拟合图像,可自行搜索matlab plot函数用法,这里不做过多解释。
最后结果如下:
cfun =
General model:
cfun(t) = C*(1-(0.0005)^(0.00013-0.000000372*t+0.0000000036*t^2))^(n+1)
Coefficients (with 95% confidence bounds):
C = 2152 (-2.326e+04, 2.756e+04)
n = 1.805 (-1.038, 4.647)
rsquare =
包含以下字段的 struct:
sse: 1.3311e-05
rsquare: 0.9637
dfe: 3
adjrsquare: 0.9517
rmse: 0.0021