插值算法
数学建模比赛中,常常需要根据已知的函数点进行数据、模型的处理和分析,而有的时候现有的数据是极少的,不足以分析支撑分析的进行,这时就需要使用一些数学的方法,“模拟产生”一些新的但又比较靠谱的值来满足需求,这就是插值算法的作用。
一维插值问题
一维插值问题就是平面上的点
(
x
i
,
y
i
)
(
i
=
0
,
1
,
2
,
.
.
.
,
n
)
(x_i,y_i)(i=0,1,2,...,n)
(xi,yi)(i=0,1,2,...,n),多维插值问题为
(
x
1
,
x
2
,
.
.
.
x
n
)
(x_1,x_2,...x_n)
(x1,x2,...xn)
一维插值问题如下:已经有
n
+
1
n+1
n+1个节点
(
x
i
,
y
i
)
(
i
=
0
,
1
,
2
,
.
.
.
,
n
)
(x_i,y_i)(i=0,1,2,...,n)
(xi,yi)(i=0,1,2,...,n),其中
x
i
x_i
xi互不相同,不妨假设
a
=
x
0
<
x
1
<
x
2
<
.
.
.
<
x
n
=
b
a=x_0<x_1<x_2<...<x_n=b
a=x0<x1<x2<...<xn=b,求任意一插值点
x
∗
x^*
x∗(≠
x
i
x_i
xi)处的插值
y
∗
y^*
y∗。
思路:构造函数
y
=
f
(
x
)
y=f(x)
y=f(x),使得
f
(
x
)
f(x)
f(x)过所有节点,求
f
(
x
∗
)
f(x^*)
f(x∗)即可得到
y
∗
y^*
y∗
插值函数的一般定义:
①
若
P
(
x
)
是
次
数
不
超
过
n
的
代
数
多
项
式
,
即
① 若P(x)是次数不超过n的代数多项式,即
①若P(x)是次数不超过n的代数多项式,即
p
(
x
)
=
a
0
+
a
1
x
+
.
.
.
+
a
n
x
n
p(x)=a_0+a_1x+...+a_nx^n
p(x)=a0+a1x+...+anxn
②
若
P
(
x
)
为
分
段
函
数
,
就
称
为
分
段
插
值
② 若P(x)为分段函数,就称为分段插值
②若P(x)为分段函数,就称为分段插值
③
若
P
(
x
)
为
三
角
多
项
式
,
就
称
为
三
角
插
值
。
③若P(x)为三角多项式,就称为三角插值。
③若P(x)为三角多项式,就称为三角插值。
本次我们只讨论多项式插值和分段插值
插值法原理
定理:设有n+1个互不相同的节点
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi),则存在唯一的多项式:
L
n
(
x
)
=
a
0
+
a
1
x
+
a
2
x
2
+
.
.
.
+
a
n
x
n
L_n(x)=a_0+a_1x+a_2x^2+...+a_nx^n
Ln(x)=a0+a1x+a2x2+...+anxn
使得
L
n
(
x
j
)
=
y
j
L_n(x_j)=y_j
Ln(xj)=yj
证明:
构造方程组
{
a
0
+
a
1
x
0
+
a
2
x
0
2
+
.
.
.
+
a
n
x
0
n
=
y
0
a
0
+
a
1
x
1
+
a
2
x
1
2
+
.
.
.
+
a
n
x
1
n
=
y
0
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
=
.
.
.
.
a
0
+
a
1
x
n
+
a
2
x
n
2
+
.
.
.
+
a
n
x
n
n
=
y
n
\left\{ \begin{aligned} a_0+a_1x_0+a_2x_0^2+...+a_nx_0^n & = y_0 \\ a_0+a_1x_1+a_2x_1^2+...+a_nx_1^n & = y_0 \\ .................&=.... \\ a_0+a_1x_n+a_2x_n^2+...+a_nx_n^n & = y_n \end{aligned} \right.
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧a0+a1x0+a2x02+...+anx0na0+a1x1+a2x12+...+anx1n.................a0+a1xn+a2xn2+...+anxnn=y0=y0=....=yn
令:
A
=
[
1
x
0
⋯
x
0
n
1
x
1
⋯
x
1
n
⋮
⋮
⋱
⋮
1
x
n
⋯
x
n
n
]
,
X
=
[
a
0
a
1
⋮
a
n
]
,
Y
=
[
y
0
y
1
⋮
y
n
]
A=\left[ \begin{matrix} 1 & x_0 & \cdots & x_0^n \\ 1 & x_1 & \cdots & x_1^n \\ \vdots & \vdots & \ddots & \vdots \\ 1 & x_n & \cdots & x_n^n \\ \end{matrix} \right] , X=\left[ \begin{matrix} a_0\\ a_1\\ \vdots\\ a_n \end{matrix} \right], Y=\left[ \begin{matrix} y_0\\ y_1\\ \vdots\\ y_n \end{matrix} \right]
A=⎣⎢⎢⎢⎡11⋮1x0x1⋮xn⋯⋯⋱⋯x0nx1n⋮xnn⎦⎥⎥⎥⎤,X=⎣⎢⎢⎢⎡a0a1⋮an⎦⎥⎥⎥⎤,Y=⎣⎢⎢⎢⎡y0y1⋮yn⎦⎥⎥⎥⎤
方
程
的
矩
阵
形
式
:
A
X
=
Y
,
由
于
∣
A
∣
=
∏
i
=
1
n
∏
j
=
0
n
−
1
(
x
i
−
x
j
)
≠
0
,
所
以
方
程
有
唯
一
解
。
方程的矩阵形式:AX=Y,由于|A|=\prod_{i=1}^n\prod_{j=0}^{n-1}(x_i-x_j)\neq0,所以方程有唯一解。
方程的矩阵形式:AX=Y,由于∣A∣=∏i=1n∏j=0n−1(xi−xj)=0,所以方程有唯一解。
从
而
L
n
(
x
)
=
a
0
+
a
1
x
+
a
2
x
2
+
.
.
.
+
a
n
x
n
唯
一
存
在
从而L_n(x)=a_0+a_1x+a_2x^2+...+a_nx^n唯一存在
从而Ln(x)=a0+a1x+a2x2+...+anxn唯一存在
注:
①只要n+1个节点互异,满足上述插值条件的多项式是唯一存在的
②如果不限制多项式的次数,插值多项式并不唯一
分段三次埃尔米特插值
Matlab有内置的函数pchip:
p=pchip(x,y,new_x)
% x是已知的样本点的横坐标
% y是已知的样本点的纵坐标,x与y坐标同为行或列向量
%new_x是要插入处对应的横坐标
下面我们开始举一个例子:
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-')
plot函数用法:
plot(x1,y1,x2,x3)
线方式 | 含义 |
---|---|
- | 实线 |
: | 点线 |
-. | 虚线线 |
– | 波折线 |
点方式 | 符号 |
---|---|
. | 圆点 |
+ | 加号 |
* | 星号 |
x | x形 |
o | o小圆形 |
颜色 | 符号 |
---|---|
y | 黄 |
r | 红 |
g | 绿 |
b | 蓝 |
w | 白 |
k | 黑 |
m | 紫 |
c | 青 |
三次样条插值
Matlab有内置的函数spline:
p=spline(x,y,new_x)
% x是已知的样本点的横坐标
% y是已知的样本点的纵坐标,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')%标注显示在东南方向
可以看出,三次样条生成的曲线更加光滑。在实际建模中,由于我们不知道数据的生成过程,因此这两种插值都可以使用。当然,以上的插值算法可以进行数据的预测。只需要把new_x的部分改为想要预测的坐标就可以了。