已知数据集有[(x0,y0), (x1,y1)…(xn,yn)]
1、"nearest" 最邻近插值:
在数据集寻找两点(xi,yi), (xi+1,yi+1),满足xi≤x≤xi+1。
插值方程fx=yi+1 (x-xi>x-xi+1)yi (x-xi≤x-xi+1)
2、"linear" 分段线性插值:
插值函数为一次多项式fx=ax+b, (x0,y0), (x1,y1)是数据集上相异的两点,且x0<x1。有fx0=x0,fx1=x1代入插值函数解得
fx=y0+y1-y0x1-x0x-x0
3、”spline” 三次样条插值:
设S(x)满足样本点要求,则只需在每个子区间[xj,xj+1]上确定1个三次多项式,假设为:
Sj(x) = ajx3 + bjx2 + cjx + d
假设有n个点,需要n-1条线描述,每条线四个未知数,则未知数个数为4(n-1)。显然中间(n-2)个点具有4个约束条件:
S(xj) = f(xj)
S'(xj+0) = f'(xj-0)
S''(xj+0) = f''(xj-0)
S'''(xj+0) = f'''(xj-0)
两端断点存在约束 S(xi) = f(xi),则约束方程有4(n-2) + 2 = 4(n-1)-2,所以,总的未知数个数比方程个数多两个。所以需要额外的两个约束,于是就有了三种边界条件的插值算法。
第 1 类边界条件:给定端点处的一阶导数值
S'(x1) = y1' ,S'(xn) = yn'
第 2 类边界条件:给定端点处的一阶导数值
S''(x1) = y1'' ,S''(xn) = yn''
第 3 类边界条件是周期性条件,如果y=f(x)是以[xj, xj+1]为周期的函数,于是S(x)在端点处满足条件
S'(x1+0) = S'(xn- 0) ,S''(x1+0) = S''(xn- 0)
4、” pchip” 分段三次hermite插值:
(x0,y0), (x1,y1)是数据集上相异的两点,且x0<x1。
y=fx在xi上的函数值和一阶导数值分别为yi=fxi和mi=f'xi (i=0,1),求三次多项式H3x,使其满足H3xi=yiH3'xi=mi (i=0,1)。
构造三次埃尔米特插值多项式
H3x=y0a0x+y1a1x+m0β0x+m1β1x
条件
函数 |
函数值 |
导数值 |
|
x0 |
x1 |
x0 |
x1 |
a0x |
1 |
0 |
0 |
0 |
a1x |
0 |
1 |
0 |
0 |
β0x |
0 |
0 |
1 |
0 |
β1x |
0- |
0 |
0 |
1 |
由 a0x1=a0'x1=0
可写成 a0x=[a+b(x-x0)](x-x1)2
由a0x0=1 得 a=1(x0-x1)2
再由a0'(x0) = 0得b = - 2(x0-x1)3,所以
a0x = [1+2x-x0x1-x0]( x-x1x0-x1)2
同理(将x0<->x1)
a1x = [1+2x-x0x1-x0]( x-x1x0-x1)2
同样由β0(x0) = β0(x1)= β0'(x1) = 0,可令
β0(x) = c(x-x0)( x-x1)2
再由β0'(x0) = 1,得c = 1(x0-x1)2
β0(x) = (x-x0) ( x-x1x0-x1)2 ,β1(x) = (x-x1) ( x-x0x1-x0)2
a0(x) = [1+2x-x0x1-x0] ( x-x1x0-x1)2 ,β0(x) = (x-x0) ( x-x1x0-x1)2
a1(x) = [1+2x-x1x0-x1] ( x-x0x1-x0)2 ,β1(x) = (x-x1) ( x-x0x1-x0)2
即
a0(x) = [1+2l1(x)]l02(x)
β0(x) = [x-x0]l02(x)
a1(x) = [1+2l0(x)]l12(x)
β1(x) = [x-x1]l12(x)
l02(x) ,l12(x) 为以(x0,y0),(x1,y1) 插值点得Lagrange一次基函数。
可得满足条件得三次埃尔米特插值多项式为
H3x = y0a0(x) + y1a1(x) + m0β0x+m1β1x
= y0[1+2x-x0x1-x0] ( x-x1x0-x1)2 + y1[1+2x-x1x0-x1] ( x-x0x1-x0)2 + m0(x-x0) ( x-x1x0-x1)2 + m1(x-x1) ( x-x0x1-x0)2
X := array(0,0.01)->1;
Y := X^2-X;
Xi := array(0.005,0.01)->1;
Yi := interp(X,Y,Xi,'spline');
return Yi;
//结果:6
1、"nearest"
x_:=array(5,1,19,8);
y_:=array(2,3,1,7);
xi:=array(4,12);
return interp(x_,y_,xi,"nearest");
//返回: array(2,7)
2、" linear" 分段线性插值
x_:=array(5,1,19,8);
y_:=array(2,3,1,7);
xi:=array(4,12);
return interp(x_,y_,xi,"linear");
//返回: array(2.25,4.8182)
3、"spline" 三次样条插值
x_:=array(5,1,19,8);
y_:=array(2,3,1,7);
xi:=array(4,12);
return interp(x_,y_,xi,"spline");
//返回: array(1.1407,13.9444)
4、"pchip" 分段三次hermite插值
x_:=array(5,1,19,8);
y_:=array(2,3,1,7);
xi:=array(4,12);
return interp(x_,y_,xi,"pchip");
//返回: array(2.0156,6.7115)