本博文源于matlab插值,大家可能对拟合和插值分的不是很临清。其中拟合的任务就是根据x和y寻找出一条最适合的曲线描绘x和y的值,而插值呢就是根据已知点的信息构造一个近似的函数,最简单的插值法是多项式插值。
其最大的不同:拟合曲线不要求一定通过数据点,而插值的曲线要求必须通过数据点
下面通过一个例子来看各类插值对一个函数的逼近效果
例子:用最近点插值、线条插值、样条插值、立方插值对y=cosx在[0,6]上的一维插值效果进行比较
在举例之前,大家如果对这几个函数方法不熟悉的话,我再罗嗦一下:
nearest:最近点插值,通过四舍五入取已知数据点最近的值
linear:线性插值,用直线连接数据点,插值点的值取对应直线上的值
spline:样条插值,用三次样条曲线通过数据点,插值点的值取对应曲线上的值
cubic:立方插值,用三次曲线拟合并通过数据点
好了,既然知道这些了,看到程序源码就会一清二楚了!都是基于interp1情况下的哟!
>> x=0:6;
>> y=cos(x);
>> xi=0:.25:6;
>> yi1 = interp1(x,y,xi,'*nearest');
>> yi2 = interp1(x,y,xi,'*linear');
>> yi3 = interp1(x,y,xi,'*spline');
>> yi4 = interp1(x,y,xi,'*cubic');
>> plot(x,y,'ro',xi,yi1,'--',xi,yi2,'-',xi,yi3,'k.-',xi,yi4,'m:')
>> legend('原始数据','最近点插值','线性插值','样条插值','立方插值')
>>
总结:
看见样条插值效果最后,之后是立方插值、线性插值,效果最差是最近点插值。不同的插值函数用的情况可能不同,博主一般都用一遍,反正都是一条代码的事情,然后进行合适的选择即可。