赞
踩
本篇主要介绍在三种插值方法:拉格朗日插值、分段线性插值、三次样条插值,以及这三种方法在matlab中如何实现。
令
上式称为
matlab没有现成的lagrange函数,需要手动写,如下:
x0,y0为原始坐标点,维度必须相同。
x为待插值的点。
y是返回值,是最终插值结果。
- function y=lagrange(x0,y0,x) %x0,y0为初始坐标,x为需要插值的点,返回的y为插值结果
- n=length(x0);m=length(x);
- for i=1:m
- z=x(i);
- s=0;
- for j=1:n
- p=1;
- for k=1:n
- if k~=j
- p=p*((z-x0(j))/(x0(k)-x0(j)));
- end
- end
- s=p*y0(k)+s;
- end
- y(i)=s;
- end
将每两个相邻的节点用直线连起来,如此形成的一条折线就是分段线性插值函数。计算
用matlab实现分段线性插值不需要自己手动编写函数,matlab有现成的一维插值函数interp1
y=interp1(x0,y0,x,'method')
method指定插值方法,其值可为:
linear:线性插值(默认)
nearest:最近项插值
spline:逐次3次样条插值
cubic:保凹凸性 3 次插值
所有插值方法都要求x0单调。
使用三次样条插值有两种方法:其中一种就是第二种插值方式(分段线性插值),只需要将method修改为spline即可实现。
还有一种实现方式如下:
pp=csape(x0,y0);
y=ppval(pp,x);
其中x0,y0,x与前面含义相同,返回值y即插值结果。
表1给出的 x, y 数据位于机翼断面的下轮廓线上,假设需要得到 x 坐标每改变0.1 时的 y 坐标。试完成加工所需数据,画出曲线。要求用 Lagrange、分段线性和三次样条三种插值方法计算。
表1
x 0 3 5 7 9 11 12 13 14 15 |
y 0 1.2 1.7 2.0 2.1 2.0 1.8 1.2 1.0 1.6 |
解:编写代码如下:
- clear,clc
- x0=[0,3,5,7,9,11,12,13,14,15];
- y0=[0,1.2,1.7,2.0,2.1,2.0,1.8,1.2,1.0,1.6];
- x1=[0:0.1:15];
-
- %拉格朗日插值
- y1=lagrange(x0,y0,x1);
- figure
- plot(x0,y0,x1,y1,'.')
- title('拉格朗日插值')
-
- %分段线性插值
- y2=interp1(x0,y0,x1);
- figure
- plot(x0,y0,x1,y2,'.')
- title('分段线性插值')
-
- %三次样条插值
- y3=interp1(x0,y0,x1,'spline');
- figure
- plot(x0,y0,x1,y3,'.')
- title('三次样条插值')
-
由图可知:拉格朗日插值误差较大,插值大量点的时候不建议使用。分段线性插值结果最好,使用的是method是linear(默认)。三次样条插值有点误差,但不是很大,得到的曲线比较光滑。
学习插值函数时的一点小心得,希望能帮到大家!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。