关于非线性曲线拟合问题,有不少可以转化为线性曲线,然后使用线性最小二乘法来算,比如y=a*exp(b*x),只要两边同时取对数,便可转化为线性问题,不过能转化的终究是少数,例如y=c+a*exp(b*x),便不能转化为线性问题了。我学习了matlab指定函数拟合命令fittype和fit,介绍给大家。
问题:x=[1,2,3,4,5,6,7,8];
y=[15.3,20.5,27.4,36.6,49.1,65.6,87.8,117.6];求y=a*exp(b*x)中的a,b
指定函数拟合:
x=x';y=y';%数据必须是列向量
syms t;
f=fittype('a*exp(b*t)','independent','t','coefficient',{'a','b'});
func=fit(x,y,f) %这里已求出来了a=11.42,b=0.2914
y1=func(x); sum((y-y1).^2) %算一下误差的平方和是 0.0119
而转化为线性问题求出来的a=11.44,b=0.2913,误差的平方和是 0.0262;
如果大家出现了这个问题
Warning: Start point not provided, choosing random start point.
> In Warning>Warning.throw at 31
In fit>iFit at 320
In fit at 109
是因为没有给定a和b的初始值,我们可以在拟合前估计一下a,b,然后把func=fit(x,y,f)改为func2=fit(x,y,f,'startpoint',[11,0.3]);和0.3都是我的估计值
当然指定函数拟合也有它的弊端,对于非常复杂的函数式,博主有好几次都没拟合出满意的曲线。