插值算法
数模比赛中,常常需要根据已知的函数点进行数据、模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,“模拟产生”一些新的但又比较靠谱的值来满足需求,这就是插值的作用。
插值法定义
设函数
y
=
f
(
x
)
y=f (x)
y=f(x) 在区间
[
a
,
b
]
[ a , b ]
[a,b]上有定义,且已知在点
a
≤
x
0
<
x
1
<
.
.
.
<
x
n
≤
b
a ≤ x_0 < x_1 < . . . < x_n ≤ b
a≤x0<x1<...<xn≤b
上的值分别为:
y
0
,
y
1
.
.
.
y
n
y_0 , y_1 . . . y_n
y0,y1...yn若存在一简单函数
P
(
x
)
P(x)
P(x)使得
P
(
x
i
)
=
y
i
,
i
∈
N
P (x_i)=y_i \ ,\ i ∈ N
P(xi)=yi , i∈N
则称
P
(
x
)
P ( x )
P(x)为
f
(
x
)
f ( x )
f(x)的插值函数。称
x
0
,
x
1
.
.
.
x
n
x_0 , x_1 . . . x_n
x0,x1...xn为插值节点。称
[
a
,
b
]
[ a , b ]
[a,b]为插值区间。称求插值函数
P
(
x
)
P ( x )
P(x) 的方法为插值法。
插值法的分类
- 分段插值
- 插值多项式
- 三角插值
一般插值多项式原理
求解线性方程组,得到插值多项式。
缺点 :
- 多次插值会产生龙格现象,即在两端波动极大,产生明显的震荡。在不熟悉曲线运动的前提下,不要轻易使用高次插值
- 插值多项式不能全面反映被插值函数的性态。(导数等)
拉格朗日插值法
-
两个点: ( x 0 , y 0 ) , ( x 1 , y 1 ) (x_0,y_0),(x_1,y_1) (x0,y0),(x1,y1)
-
三个点: ( x 0 , y 0 ) , ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_0,y_0),(x_1,y_1),(x_2,y_2) (x0,y0),(x1,y1),(x2,y2)
-
四个点: ( x 0 , y 0 ) , ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) (x_0,y_0),(x_1,y_1),(x_2,y_2),(x_3,y_3) (x0,y0),(x1,y1),(x2,y2),(x3,y3)
牛顿插值法
与拉格朗日插值法相比,牛顿插值法的计算过程具有继承性。(牛顿插值法每次插值只和前n项的值有关,这样每次只要在原来的函数上添加新的项,就能够产生新的函数)
但是牛顿插值也存在龙格现象的问题。
埃尔米特(Hermite)插值
- 不但要求在节点上的函数值相等,而且还要求对应的导数值也相等,甚至要求高阶导数也相等,满足这种要求的插值多项式就是埃尔米特插值多项式。
- 直接使用Hermite插值得到的多项式次数较高,也存在着龙格现象,因此在实际应用中,往往使用分段三次 Hermite 插值多项式 (PCHIP)。
- Matlab内置函数:
p = pchip(x,y, new_x)
x
是已知的样本点的横坐标;
y
是已知的样本点的纵坐标;
new_x
是要插入处对应的横坐标 - 画图plot函数用法:
plot(x1,y1,x2,y2)
- 线方式:
‐
实线:
点线‐.
虚点线‐ ‐
波折线 - 点方式:
.
圆点+
加号*
星号x
x形o
小圆 - 颜色:
y
黄r
红g
绿b
蓝w
白k
黑m
紫c
青
x = ‐pi:pi; y = sin(x);
new_x = ‐pi:0.1:pi;
p = pchip(x,y,new_x);
plot(x, y, 'o', new_x, p, 'r‐')
三次样条插值
Matlab有内置的函数:p = spline (x,y, new_x)
x
是已知的样本点的横坐标;
y
是已知的样本点的纵坐标;
new_x
是要插入处对应的横坐标
x = ‐pi:pi;
y = sin(x);
new_x = ‐pi:0.1:pi;
p1 = pchip(x,y,new_x); %分段三次埃尔米特插值
p2 = spline(x,y,new_x); %三次样条插值
plot(x,y,'o',new_x,p1,'r‐',new_x,p2,'b‐')
legend('样本点','三次埃尔米特插值','三次样条插值',
‘Location’,‘SouthEast’) %标注显示在东南方向
ps:
legend(string1,string2,string3, …)
分别将字符串1、字符串2、字符串3……标注到图中,每个字符串对应的图标为画图时的图标。Location
用来指定标注显示的位置
n维数据的插值
p=interpn(x1,x2,...,xn,y,new_x1,new_x2,...,new_xn, method)
x1,x2,...,xn
是已知的样本点的横坐标
y
是已知的样本点的纵坐标坐标
new_x1,new_x2,...,new_xn
是要插入点的横坐标
method
是要插值的方法
linear
线性插值(默认算法)
cubic
三次插值;
spline
三次样条插值法;(最为精准)
nearest
最邻近插值算法