数值分析-插值法
插值多项式
函数是一种“形”为艺术的美。书面讲函数就是反映某种内在规律的数量关系。而现实中我们往往
只能得到一系列数据点的值,为了研究函数的变化规律,我们就要做一个既能反映函数特性,又便于
计算的简单函数。
低阶插值多项式
插值函数
y
=
f
(
x
)
y=f(x)
y=f(x)在
[
a
,
b
]
[a,b]
[a,b]上有定义,已知
a
≤
x
0
<
x
1
<
⋯
<
x
n
≤
b
a\le x_{0}< x_{1}<\dots < x_{n}\le b
a≤x0<x1<⋯<xn≤b (注意这里有
n
+
1
n+1
n+1个不同的点,下面不再重复),称
x
0
,
x
1
,
…
,
x
n
x_{0},x_{1},\dots,x_{n}
x0,x1,…,xn为插值节点,
[
a
,
b
]
[a,b]
[a,b]为插值区间。若有一个简单函数
P
(
x
)
P(x)
P(x)(这里的简单是相对意义),有
P
(
x
i
)
=
y
i
,
i
=
0
,
1
,
…
,
n
P(x_{i})=y_{i},i=0,1,\dots,n
P(xi)=yi,i=0,1,…,n则称
P
(
x
)
P(x)
P(x)为插值函数,相应的求
P
(
x
)
P(x)
P(x)的方法为插值法。
(1)若
P
(
x
)
P(x)
P(x)是由
1
,
x
,
x
2
,
…
,
x
n
1,x,x^{2},\dots,x^{n}
1,x,x2,…,xn的线性组合,则称
P
(
x
)
P(x)
P(x)为插值多项式,即:
P
(
x
)
=
a
0
+
a
1
x
+
a
2
x
2
+
⋯
+
a
n
x
n
P(x)=a_{0}+a_{1}x+a_{2}x^{2}+\dots+a_{n}x^{n}
P(x)=a0+a1x+a2x2+⋯+anxn相应的插值法为多项式插值
(2)若
P
(
x
)
P(x)
P(x)为分段多项式,例如后面要讲的分段插值就是这种。相应的插值方法为分段插值
(3)若
P
(
x
)
P(x)
P(x)为三角多项式,例如傅里叶级数。相应的插值方法为三角插值
类型 | 插值方法 | 例子 |
---|---|---|
插值多项式 | `多项式插值 | 朗格朗日插值多项式、牛顿插值多项式 |
分段多项式 | 分段插值 | 分段线性插值、分段Hermit插值 |
三角多项式 | 三角插值 | 傅里叶级数展开 |
为什么要弄这么多类型的多项式呢?这涉及到数值分析中的一个基本思想——误差、复杂度。直观的讲,误差就是拟合函数与实际函数的贴合程度,复杂度就是拟合函数所需的数据量(这里的数据量指数据总量和类型)以及计算的负责度。一般情况下,想要误差越小,所需的数据量就要越多,两者是相互矛盾的。
插值多项式的次数*
在
[
a
,
b
]
[a,b]
[a,b]上,已知
n
+
1
n+1
n+1个点,
a
≤
x
0
<
x
1
<
⋯
<
x
n
≤
b
a\le x_{0}< x_{1}<\dots < x_{n}\le b
a≤x0<x1<⋯<xn≤b 上的函数值
y
i
=
f
(
x
i
)
(
i
=
0
,
1
,
…
,
n
)
y_{i}=f(x_{i})(i=0,1,\dots,n)
yi=f(xi)(i=0,1,…,n)。
插值多项式的两个基本思想:
- 经过每个节点。即: P ( x i ) = y i , i = 0 , 1 , … , n P(x_{i})=y_{i},i=0,1,\dots,n P(xi)=yi,i=0,1,…,n
-
P
(
x
)
P(x)
P(x)是由
1
,
x
,
x
2
,
…
,
x
n
1,x,x^{2},\dots,x^{n}
1,x,x2,…,xn的线性组合,即:
P
(
x
)
=
a
0
+
a
1
x
+
a
2
x
2
+
⋯
+
a
n
x
n
P(x)=a_{0}+a_{1}x+a_{2}x^{2}+\dots+a_{n}x^{n}
P(x)=a0+a1x+a2x2+⋯+anxn
因此,我们就建立了 n + 1 n+1 n+1元线性方程组:
{ a 0 + a 1 x 0 + ⋯ + a n x 0 n = y 0 a 0 + a 1 x 1 + ⋯ + a n x 1 n = y 1 ⋮ a 0 + a 1 x n + ⋯ + a n x n n = y n \left\{\begin{matrix} a_{0} +a_{1}x_{0}+\dots+a_{n}x_{0}^{n}=y_{0} \\a_{0} +a_{1}x_{1}+\dots+a_{n}x_{1}^{n}=y_{1}\\ \vdots & & & & \\ a_{0} +a_{1}x_{n}+\dots+a_{n}x_{n}^{n}=y_{n}\end{matrix}\right. ⎩ ⎨ ⎧a0+a1x0+⋯+anx0n=y0a0+a1x1+⋯+anx1n=y1⋮a0+a1xn+⋯+anxnn=yn
代数中讲,如果方程组的系数矩阵行列式不等于0,则解唯一。注意这里的 x x x, y y y是已知的, a a a为未知量。因此此方程的系数矩阵为:
[ 1 x 0 … x 0 n 1 x 1 … x 1 n ⋮ ⋮ ⋮ 1 x n … x n n ] \begin{bmatrix} 1 & x_{0} & \dots &x_{0}^{n} \\1 & x_{1} & \dots &x_{1}^{n}\\\vdots & \vdots & &\vdots\\1 & x_{n} & \dots &x_{n}^{n}\end{bmatrix} 11⋮1x0x1⋮xn………x0nx1n⋮xnn
这是一个 V a n d e r m o n d e Vandermonde Vandermonde矩阵,detA= ∏ i , j = 0 , i > j n ( x i − x j ) ≠ 0 \prod_{i,j=0,i>j}^{n}(x_{i}-x_{j})\ne 0 ∏i,j=0,i>jn(xi−xj)=0 ( x x x互异),因此, a 0 , a 1 … , a n a_{0},a_{1}\dots,a_{n} a0,a1…,an存在且唯一。如果最高次大于n,即未知数数量多于方程数量,有无穷多解。如果最高次小于n,存在无解的情况。因此这就是为什么构造最高次为n次的插值多项式需要 n + 1 n+1 n+1个数据的原因。
线性插值多项式
通过上文,解线性方程组是求插值多项式系数的一种方法。解线性方程组就要求我们计算矩阵,
低阶矩阵还行,但是高阶呢?不止是我们,计算机也不愿意去做。因此数学家就想去探索一种更简
单的方法去求插值多项式的系数。于是就有了拉格朗日插值法以及牛顿插值法。(让我们一起来感受
数学之美)
拉格朗日插值
出于敬佩,必先了解这位杰出的数学家。拉格朗日简介.
我们知道插值多项式有两个基本思想(见前文)。所以,我们就想到这样一个形式:
L
(
x
)
=
∑
i
=
0
n
l
i
(
x
)
y
i
L(x)=\sum_{i=0}^{n} l_{i}(x)y_{i}
L(x)=i=0∑nli(x)yi
其中称
l
i
(
x
)
l_{i}(x)
li(x)为插值基函数。
l
i
(
x
)
=
{
1
x
=
x
i
0
x
≠
x
i
l_{i}(x)=\left\{\begin{matrix} 1 &x=x_i \\ 0 &x\ne x_i\end{matrix}\right.
li(x)={10x=xix=xi,也就是说
l
i
(
x
)
l_{i}(x)
li(x)有两个约束条件:在
x
i
x_i
xi处取值为1,其它节点取值为0。用函数的语言讲
l
i
(
x
)
l_i(x)
li(x)的零点为
x
0
,
x
1
,
…
,
x
i
−
1
,
x
i
+
1
,
…
,
x
n
x_0,x_1,\dots,x_{i-1},x_{i+1},\dots,x_n
x0,x1,…,xi−1,xi+1,…,xn。因此,脑海中想到
l
i
(
x
)
l_i(x)
li(x)的一种构造方式为:
l
i
(
x
)
=
K
i
(
x
−
x
0
)
…
(
x
−
x
i
−
1
)
(
x
−
x
i
+
1
)
…
(
x
−
x
n
)
=
K
i
∏
0
,
j
≠
i
n
(
x
−
x
j
)
l_{i}(x)=K_i(x-x_0)\dots(x-x_{i-1})(x-x_{i+1})\dots(x-x_n)=K_i\prod_{0,j\ne i}^{n} (x-x_j)
li(x)=Ki(x−x0)…(x−xi−1)(x−xi+1)…(x−xn)=Ki0,j=i∏n(x−xj)
这里的
K
i
K_i
Ki为未知参数。但是别忘了
l
i
(
x
)
l_{i}(x)
li(x)在
x
i
x_i
xi处取值为1,因此
K
i
=
1
∏
j
=
0
,
j
≠
i
n
(
x
i
−
x
j
)
K_i=\frac{1}{\prod_{j=0,j\ne i}^{n} (x_i-x_j)}
Ki=∏j=0,j=in(xi−xj)1
因此,通过这种构造方法就可以很容易地给出
L
(
x
)
L(x)
L(x)的形式:
L
(
x
)
=
∑
i
=
0
n
∏
0
,
j
≠
i
n
(
x
−
x
j
)
∏
j
=
0
,
j
≠
i
n
(
x
i
−
x
j
)
y
i
L(x)=\sum_{i=0}^{n} \frac{\prod_{0,j\ne i}^{n} (x-x_j)}{\prod_{j=0,j\ne i}^{n} (x_i-x_j)}y_{i}
L(x)=i=0∑n∏j=0,j=in(xi−xj)∏0,j=in(x−xj)yi
这里有一种简单的系数记忆方法,
y
i
=
x
与其它所有节点的差的累乘
x
i
与其它所有节点的差的累乘
y_i=\frac{x与其它所有节点的差的累乘}{x_i与其它所有节点的差的累乘}
yi=xi与其它所有节点的差的累乘x与其它所有节点的差的累乘
虽然拉格朗日插值多项式
L
(
x
)
L(x)
L(x)看起来和
P
(
x
)
P(x)
P(x)好像不一样,但是其实展开后是一样的。因为我们前面讲过
P
(
x
)
P(x)
P(x)是惟一的,而
L
(
x
)
L(x)
L(x)也是一个最高次为
n
n
n次的多项式同时也满足插值多项式的两个基本条件。因此
L
(
x
)
≡
P
(
x
)
L(x)\equiv P(x)
L(x)≡P(x)。
牛顿插值
既然有了拉格朗日插值多项式,为什么还有人构造牛顿多项式呢?举个例子:你辛辛苦苦构造完拉格朗日插值多项式后,发现还有一个节点你没算。这时你会感到崩溃,因为你做的拉格朗日插值多项式已经毫无意义了。这就有人想,有没有一种构造方法使得插值多项式是逐次生成的呢?这里不得不提另外一位大神——牛顿。牛顿简介.
数学中最重要的一个方法那就是从定义出发。我们现在不妨观察前几项来找规律。
名称 | 形式 | 节点 |
---|---|---|
N 0 ( x ) N_0(x) N0(x) | y 0 y_0 y0 | ( x 0 , y 0 ) (x_0,y_0) (x0,y0) |
N 1 ( x ) N_1(x) N1(x) | y 0 + y 1 − y 0 x 1 − x 0 ( x − x 0 ) y_0+\frac{y_1-y_0}{x_1-x_0}(x-x_0) y0+x1−x0y1−y0(x−x0) | ( x 0 , y 0 ) , ( x 1 , y 1 ) (x_0,y_0),(x_1,y_1) (x0,y0),(x1,y1) |
N 2 ( x ) N_2(x) N2(x) | y 0 + y 1 − y 0 x 1 − x 0 ( x − x 0 ) + y 2 − y 0 x 2 − x 0 − y 1 − y 0 x 1 − x 0 x 2 − x 1 ( x − x 1 ) ( x − x 0 ) y_0+\frac{y_1-y_0}{x_1-x_0}(x-x_0)+\frac{\frac{y_2-y_0}{x_2-x_0}-\frac{y_1-y_0}{x_1-x_0}}{x_2-x_1}(x-x_1)(x-x_0) y0+x1−x0y1−y0(x−x0)+x2−x1x2−x0y2−y0−x1−x0y1−y0(x−x1)(x−x0) | ( 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) |
像这样算,笔者要累死。牛顿当然不可能这样算呀,通过观察,牛顿引入了均差的概念。
名称 | 形式 |
---|---|
一阶均差 | f [ x 0 , x 1 ] = y 1 − y 0 x 1 − x 0 f[x_0,x_1]=\frac{y_1-y_0}{x_1-x_0} f[x0,x1]=x1−x0y1−y0 |
二阶均差 | f [ x 0 , x 1 , x 2 ] = f [ x 0 , x 2 ] − f [ x 0 , x 1 ] x 2 − x 1 f[x_0,x_1,x_2]=\frac{f[x_0,x_2]-f[x_0,x_1]}{x_2-x_1} f[x0,x1,x2]=x2−x1f[x0,x2]−f[x0,x1] |
⋮ \vdots ⋮ | ⋮ \vdots ⋮ |
n阶均差 | f [ x 0 , x 1 , … , x n ] = f [ x 0 , x 1 , … , x n − 2 , x n ] − f [ x 0 , x 1 , … , x n − 1 ] x n − x n − 1 f[x_0,x_1,\dots,x_n]=\frac{f[x_0,x_1,\dots,x_{n-2},x_n]-f[x_0,x_1,\dots,x_{n-1}]}{x_n-x_{n-1}} f[x0,x1,…,xn]=xn−xn−1f[x0,x1,…,xn−2,xn]−f[x0,x1,…,xn−1] |
很多同学可能对均差不是很熟悉。现在我们从根本出发,介绍均差及其性质:
-
k
k
k阶均差可表示为
y
0
,
y
1
,
…
,
y
n
y_0,y_1,\dots,y_n
y0,y1,…,yn的线性组合,即:
f [ x 0 , x 1 , … , x k ] = ∑ j = 0 n y j ( x j − x 0 ) … ( x j − x j − 1 ) ( x j − x j + 1 ) … ( x j − x k ) f[x_0,x_1,\dots,x_k]=\sum_{j=0}^{n}\frac{y_j}{(x_j-x_0)\dots(x_j-x_{j-1})(x_j-x_{j+1})\dots(x_j-x_{k})} f[x0,x1,…,xk]=j=0∑n(xj−x0)…(xj−xj−1)(xj−xj+1)…(xj−xk)yj
证明如下(请先阅读牛顿插值多项式再来看这里):
前面讲到 n + 1 n+1 n+1个点构造的插值多项式唯一,则 P ( x ) ≡ L n ( x ) ≡ N n ( x ) P(x)\equiv L_n(x)\equiv N_n(x) P(x)≡Ln(x)≡Nn(x)。
我们对 k + 1 k+1 k+1个点进行拉格朗日插值和牛顿插值,最高次数都为 k k k。
拉格朗日插值最高次项次数为:
∑ i = 0 n y i ∏ j = 0 , j ≠ i n ( x i − x j ) (1) \sum_{i=0}^{n} \frac{y_{i}}{\prod_{j=0,j\ne i}^{n} (x_i-x_j)}\tag{1} i=0∑n∏j=0,j=in(xi−xj)yi(1)
牛顿插值最高项次数为:
f [ x 0 , x 1 , … , x k ] f[x_0,x_1,\dots,x_k] f[x0,x1,…,xk]
两者都是最高次项的系数,多项式相等,则各项系数都要相等。 □ \Box □ - 由(1)知,均差内部元素的排列不影响其值
f
[
x
0
,
x
1
,
…
,
x
k
]
≡
f
[
x
1
,
x
0
,
…
,
x
k
]
≡
f
[
x
k
,
x
0
,
…
,
x
k
−
1
]
f[x_0,x_1,\dots,x_k] \equiv f[x_1,x_0,\dots,x_k] \equiv f[x_k,x_0,\dots,x_{k-1}]
f[x0,x1,…,xk]≡f[x1,x0,…,xk]≡f[xk,x0,…,xk−1]
牛顿插值多项式
有了均差的定义,我们就很容易给出牛顿插值多项式啦。
N n ( x ) = y 0 + f [ x 0 , x 1 ] ( x − x 0 ) + f [ x 0 , x 1 , x 2 ] ( x − x 0 ) ( x − x 1 ) + ⋯ + f [ x 0 , x 1 , … , x n ] ( x − x 0 ) … ( x − x n − 1 ) N_n(x)=y_0+f[x_0,x_1](x-x_0)+f[x_0,x_1,x_2](x-x_0)(x-x_1)+\dots+f[x_0,x_1,\dots,x_n](x-x_0)\dots(x-x_{n-1}) Nn(x)=y0+f[x0,x1](x−x0)+f[x0,x1,x2](x−x0)(x−x1)+⋯+f[x0,x1,…,xn](x−x0)…(x−xn−1)
至少在形式上是很舒服的。例如新增一个节点 x n + 1 x_{n+1} xn+1,则为 N n ( x ) + f [ x 0 , x 1 , … , x n + 1 ] ( x − x 0 ) … ( x − x n ) N_n(x)+f[x_0,x_1,\dots,x_{n+1}](x-x_0)\dots(x-x_n) Nn(x)+f[x0,x1,…,xn+1](x−x0)…(x−xn)现在就算忘记哪个节点,也没事了。等等!!!均差算起来好麻烦(ಥ_ಥ)。
从前面的定义,我们知道了均差是一步一步来的。就是从前一项均差推出后一项均差。因此,构造均差表可以使得计算逻辑更加清晰。
x k x_k xk | y k y_k yk | 一阶均差 | 二阶均差 | 三阶均差 |
---|---|---|---|---|
x 0 x_0 x0 | y 0 y_0 y0 | |||
x 1 x_1 x1 | y 1 y_1 y1 | f [ x 0 , x 1 ] f[x_0,x_1] f[x0,x1] | ||
x 2 x_2 x2 | y 2 y_2 y2 | f [ x 0 , x 2 ] f[x_0,x_2] f[x0,x2] | f [ x 0 , x 1 , x 2 ] f[x_0,x_1,x_2] f[x0,x1,x2] | |
x 3 x_3 x3 | y 3 y_3 y3 | f [ x 0 , x 3 ] f[x_0,x_3] f[x0,x3] | f [ x 0 , x 2 , x 3 ] f[x_0,x_2,x_3] f[x0,x2,x3] | f [ x 0 , x 1 , x 2 , x 3 ] f[x_0,x_1,x_2,x_3] f[x0,x1,x2,x3] |
⋮ \vdots ⋮ | ⋮ \vdots ⋮ | ⋮ \vdots ⋮ | ⋮ \vdots ⋮ | ⋮ \vdots ⋮ |
(实际计算从左往右,从上向下,根据定义计算每个值。根据均差的性质,构造牛顿插值多项式)
两者的插值余项
因为
L
n
(
x
)
L_n(x)
Ln(x),
N
n
(
x
)
N_n(x)
Nn(x)是对实际函数
f
(
x
)
f(x)
f(x)的一个近似,则其截断误差为
R
n
(
x
)
=
f
(
x
)
−
P
n
(
x
)
(2)
R_n(x)=f(x)-P_n(x)\tag{2}
Rn(x)=f(x)−Pn(x)(2)也叫作插值余项。注意这里的截断误差或插值余项都是估计的。回归主题,插值法的实际意义是使计算简便同时又能反映函数内在的数量规律。所以,有两种情形,一种我们不知道实际函数长啥样,但是想反映规律。另一种我们知道实际函数,但是太复杂不便于计算。因此为了衡量插值函数与真实函数的偏差,我们需要对“偏差”进行一个估计。
定理:
f
(
x
)
∈
C
n
+
1
[
a
,
b
]
f(x) \in C^{n+1} \left [ a,b \right ]
f(x)∈Cn+1[a,b](在数学中
C
n
+
1
C^{n+1}
Cn+1表示连续且
n
+
1
n+1
n+1阶导存在),插值余项
R
n
(
x
)
=
f
(
x
)
−
P
n
(
x
)
=
f
(
n
+
1
)
(
ε
)
(
n
+
1
)
!
∏
j
=
0
n
(
x
−
x
j
)
,
ε
∈
(
a
,
b
)
且依赖于
x
0
,
…
,
x
n
的选取
R_n(x)=f(x)-P_n(x)=\frac{f^{(n+1)} (\varepsilon) }{(n+1)!}{\prod_{j=0}^{n} (x-x_j)},\varepsilon\in \left ( a,b \right )且依赖于x_0,\dots,x_n的选取
Rn(x)=f(x)−Pn(x)=(n+1)!f(n+1)(ε)j=0∏n(x−xj),ε∈(a,b)且依赖于x0,…,xn的选取
两个典型的埃尔米特插值
第一种典型:
H
(
x
i
)
=
y
i
(
i
,
0
,
1
,
2
)
H(x_i)=y_i(i,0,1,2)
H(xi)=yi(i,0,1,2)及
H
(
x
1
)
′
=
y
1
′
H(x_1)^{'}=y_1^{'}
H(x1)′=y1′
用牛顿插值函数思想构造形式:
H
(
x
)
=
y
0
+
f
[
x
0
,
x
1
]
(
x
−
x
0
)
+
f
[
x
0
,
x
1
,
x
2
]
(
x
−
x
0
)
(
x
−
x
1
)
+
A
(
x
−
x
0
)
(
x
−
x
1
)
(
x
−
x
2
)
H(x)=y_0+f[x_0,x_1](x-x_0)+f[x_0,x_1,x_2](x-x_0)(x-x_1)+A(x-x_0)(x-x_1)(x-x_2)
H(x)=y0+f[x0,x1](x−x0)+f[x0,x1,x2](x−x0)(x−x1)+A(x−x0)(x−x1)(x−x2)
两边同时求一阶导,再利用
H
(
x
1
)
′
=
y
1
′
H(x_1)^{'}=y_1^{'}
H(x1)′=y1′就能计算出
A
A
A:
A
=
y
1
′
−
f
[
x
0
,
x
1
]
−
f
[
x
0
,
x
1
,
x
2
]
(
x
1
−
x
0
)
(
x
1
−
x
0
)
(
x
1
−
x
2
)
A=\frac{y_1^{'}-f[x_0,x_1]-f[x_0,x_1,x_2](x_1-x_0)}{(x_1-x_0)(x_1-x_2)}
A=(x1−x0)(x1−x2)y1′−f[x0,x1]−f[x0,x1,x2](x1−x0)
实际上,
x
1
x_1
x1处的一阶导数信息可以通过极限的思想去间接计算,或者已知实际函数求
x
1
x_1
x1的一阶导数。余项表达式:
R
(
x
)
=
f
(
4
)
(
ε
)
4
!
(
x
−
x
0
)
(
x
−
x
1
)
2
(
x
−
x
2
)
,
ε
∈
(
a
,
b
)
且依赖于
x
0
,
x
1
,
x
2
的选取
R(x)=\frac{f^{(4)} (\varepsilon) }{4!}{(x-x_0)(x-x_1)^2(x-x_2)},\varepsilon\in \left ( a,b \right )且依赖于x_0,x_1,x_2的选取
R(x)=4!f(4)(ε)(x−x0)(x−x1)2(x−x2),ε∈(a,b)且依赖于x0,x1,x2的选取
第二种典型:两点三次Hermit插值,插值点为
x
k
x_k
xk及
x
k
+
1
x_{k+1}
xk+1,已知:
H
3
(
x
k
)
=
y
k
,
H
3
(
x
k
+
1
)
=
y
k
+
1
H
3
′
(
x
k
)
=
m
k
H
3
′
(
x
k
+
1
)
=
m
k
+
1
}
\left.\begin{matrix} H_3(x_k)=y_k, & H_3(x_{k+1})=y_{k+1}\\ H_3^{'}(x_k)=m_k &H_3^{'}(x_{k+1})=m_{k+1}\end{matrix}\right\}
H3(xk)=yk,H3′(xk)=mkH3(xk+1)=yk+1H3′(xk+1)=mk+1}
用拉格朗日插值思想构造形式:
H
3
(
x
)
=
α
k
(
x
)
y
k
+
α
k
+
1
(
x
)
y
k
+
1
+
β
k
(
x
)
y
k
′
+
β
k
+
1
(
x
)
y
k
+
1
′
H_3(x)=\alpha _k(x)y_k+\alpha _{k+1}(x)y_{k+1}+\beta _k(x)y_k^{'}+\beta _{k+1}(x)y_{k+1}^{'}
H3(x)=αk(x)yk+αk+1(x)yk+1+βk(x)yk′+βk+1(x)yk+1′
这里的
α
k
(
x
)
\alpha _k(x)
αk(x),
α
k
+
1
(
x
)
\alpha _{k+1}(x)
αk+1(x),
β
k
(
x
)
\beta _k(x)
βk(x),
β
k
+
1
(
x
)
\beta _{k+1}(x)
βk+1(x)为三次埃尔米特插值基函数。满足两个基本条件,在节点处的取值相等,在节点处的导数值相等。具体参考Hermite插值法.
最终结果:
H
3
(
x
)
=
(
1
+
2
x
−
x
k
x
k
+
1
−
x
k
)
(
x
−
x
k
+
1
x
k
−
x
k
+
1
)
2
y
k
+
(
1
+
2
x
−
x
k
+
1
x
k
−
x
k
+
1
)
(
x
−
x
k
+
1
x
k
−
x
k
+
1
)
2
y
k
+
1
+
(
x
−
x
k
)
(
x
−
x
k
+
1
x
k
−
x
k
+
1
)
2
m
k
+
(
x
−
x
k
+
1
)
(
x
−
x
k
+
1
x
k
−
x
k
+
1
)
2
m
k
+
1
H_3(x)=(1+2\frac{x-x_k}{x_{k+1}-x_k})(\frac{x-x_{k+1}}{x_k-x_{k+1}})^2y_k+(1+2\frac{x-x_{k+1}}{x_{k}-x_{k+1}})(\frac{x-x_{k+1}}{x_k-x_{k+1}})^2y_{k+1}+(x-x_k)(\frac{x-x_{k+1}}{x_k-x_{k+1}})^2m_k+(x-x_{k+1})(\frac{x-x_{k+1}}{x_k-x_{k+1}})^2m_{k+1}
H3(x)=(1+2xk+1−xkx−xk)(xk−xk+1x−xk+1)2yk+(1+2xk−xk+1x−xk+1)(xk−xk+1x−xk+1)2yk+1+(x−xk)(xk−xk+1x−xk+1)2mk+(x−xk+1)(xk−xk+1x−xk+1)2mk+1
插值余项:
R
(
x
)
=
f
(
4
)
(
ε
)
4
!
(
x
−
x
k
)
2
(
x
−
x
k
+
1
)
2
,
ε
∈
(
x
k
,
x
k
+
1
)
R(x)=\frac{f^{(4)} (\varepsilon) }{4!}{(x-x_k)^2(x-x_{k+1})^2},\varepsilon\in \left ( x_k,x_{k+1}\right )
R(x)=4!f(4)(ε)(x−xk)2(x−xk+1)2,ε∈(xk,xk+1)
高阶插值的病态性质(龙格现象)
通过学习Hermite插值,我们可以构造高次的插值多项式。这有人就会问多项式的次数是不是越高越好?但实际上并非如此,当 n → ∞ n\to \infty n→∞, P ( x ) P(x) P(x)不一定收敛于 f ( x ) f(x) f(x),这我们称为是高次插值的病态性质,也叫龙格现象。龙格现象.
分段插值
既然我们不能用次数太高的插值多项式拟合,但是我们又想尽可能的提高精度,又怎么办呢?数学中的有一个重要思想划分(分割),图论中讲的是图的等价类划分、微积分里讲的是分割取点求极限、最优化里讲的动态规划等等。名称有很多,但是思想是一个,就是将复杂问题分解成若干简单问题。既然我们不能从总体上构造足够“完美”的插值多项式,那么我们可以划分每个小区间去求小区间上的“完美”插值多项式。分段线性插值就应运而生了。
分段线性插值
分段线性插值就是通过插值点用折线段连接起来逼近 f ( x ) f(x) f(x),在 [ x k , x k + 1 ] [x_k,x_{k+1}] [xk,xk+1]上,插值多项式为 P k ( x ) = x − x k + 1 x k − x k + 1 y k + x − x k x k + 1 − x k y k + 1 P_k(x)=\frac{x-x_{k+1}}{x_k-x_{k+1}}y_k+\frac{x-x_{k}}{x_{k+1}-x_k}y_{k+1} Pk(x)=xk−xk+1x−xk+1yk+xk+1−xkx−xkyk+1
分段三次埃尔米特插值
分段线性插值函数 P k ( x ) P_k(x) Pk(x)的导数是间断的(也就节点处两侧一阶导数不相同),因此分段三次埃尔米特插值函数具有一阶导数连续的优良性质,在 [ x k , x k + 1 ] [x_k,x_{k+1}] [xk,xk+1]上,插值多项式为 H 3 ( x ) = ( 1 + 2 x − x k x k + 1 − x k ) ( x − x k + 1 x k − x k + 1 ) 2 y k + ( 1 + 2 x − x k + 1 x k − x k + 1 ) ( x − x k + 1 x k − x k + 1 ) 2 y k + 1 + ( x − x k ) ( x − x k + 1 x k − x k + 1 ) 2 m k + ( x − x k + 1 ) ( x − x k + 1 x k − x k + 1 ) 2 m k + 1 H_3(x)=(1+2\frac{x-x_k}{x_{k+1}-x_k})(\frac{x-x_{k+1}}{x_k-x_{k+1}})^2y_k+(1+2\frac{x-x_{k+1}}{x_{k}-x_{k+1}})(\frac{x-x_{k+1}}{x_k-x_{k+1}})^2y_{k+1}+(x-x_k)(\frac{x-x_{k+1}}{x_k-x_{k+1}})^2m_k+(x-x_{k+1})(\frac{x-x_{k+1}}{x_k-x_{k+1}})^2m_{k+1} H3(x)=(1+2xk+1−xkx−xk)(xk−xk+1x−xk+1)2yk+(1+2xk−xk+1x−xk+1)(xk−xk+1x−xk+1)2yk+1+(x−xk)(xk−xk+1x−xk+1)2mk+(x−xk+1)(xk−xk+1x−xk+1)2mk+1
三次样条插值*
分段低次插值都有一致收敛性,但光滑性较差。实际中,有很多问题需要二阶连续导数的,那这又怎么办?工程师给出了一个很完美的模型——样条模型。(( ͡° ͜ʖ ͡°)所以说,当你数学学到心烦意乱时,不妨出去走走)回到主题,什么是三次样条函数呢?
定义:
S
(
x
)
∈
C
2
[
a
,
b
]
S(x)\in C^{2} \left [ a,b \right ]
S(x)∈C2[a,b],经过每个节点且每个小区间
[
x
k
,
x
k
+
1
]
[x_k,x_{k+1}]
[xk,xk+1]上是三次多项式,则称
S
(
x
)
S(x)
S(x)是节点
x
0
,
x
1
,
…
,
x
n
x_0,x_1,\dots,x_n
x0,x1,…,xn上的三次样条函数。(注意这里的
S
(
x
)
S(x)
S(x)是分段函数)
因为
S
(
x
)
S(x)
S(x)是三次多项式,所以每个小区间
[
x
k
,
x
k
+
1
]
[x_k,x_{k+1}]
[xk,xk+1]上要确定4个待定系数。根据
S
(
x
)
∈
C
2
[
a
,
b
]
S(x)\in C^{2} \left [ a,b \right ]
S(x)∈C2[a,b],在节点处应满足:
S
(
x
k
−
0
)
=
S
(
x
k
+
0
)
S(x_k-0)=S(x_k+0)
S(xk−0)=S(xk+0),
S
′
(
x
k
−
0
)
=
S
′
(
x
k
+
0
)
S^{'}(x_k-0)=S^{'}(x_k+0)
S′(xk−0)=S′(xk+0),
S
′
′
(
x
k
−
0
)
=
S
′
′
(
x
k
+
0
)
S^{''}(x_k-0)=S^{''}(x_k+0)
S′′(xk−0)=S′′(xk+0)
这里一共有
3
n
−
3
3n-3
3n−3个条件,在加上通过每个节点,共有
4
n
−
2
4n-2
4n−2个条件。因此还需要2个条件才能确定
S
(
x
)
S(x)
S(x)。我们常在左右端点处各加一个边界条件(左端点
x
0
x_0
x0,右端点
x
n
x_n
xn),根据实际情况有以下三种:
- 已知两端的一阶导数值,即:
S ′ ( x 0 ) = f 0 ′ , S ′ ( x n ) = f n ′ (3) S^{'}(x_0)=f_0^{'},S^{'}(x_n)=f_n^{'}\tag{3} S′(x0)=f0′,S′(xn)=fn′(3) - 已知两端的二阶导数值,即:
S ′ ′ ( x 0 ) = f 0 ′ ′ , S ′ ′ ( x n ) = f n ′ ′ (4) S^{''}(x_0)=f_0^{''},S^{''}(x_n)=f_n^{''}\tag{4} S′′(x0)=f0′′,S′′(xn)=fn′′(4)
特殊情况(自然边界条件):
S ′ ′ ( x 0 ) = S ′ ′ ( x n ) = 0 (4’) S^{''}(x_0)=S^{''}(x_n)=0\tag{4'} S′′(x0)=S′′(xn)=0(4’) - 当
f
(
x
)
f(x)
f(x)是以
x
n
−
x
0
x_n-x_0
xn−x0为周期的的周期函数时,则要求
S
(
x
)
S(x)
S(x)也为周期函数,即:
{ S ( x 0 + 0 ) = S ( x n − 0 ) , S ′ ( x 0 + 0 ) = S ′ ( x n − 0 ) S ′ ′ ( x 0 + 0 ) = S ′ ′ ( x n − 0 ) , (5) \left\{\begin{matrix} S(x_0+0)=S(x_n-0),&S^{'}(x_0+0)=S^{'}(x_n-0) \\ S^{''}(x_0+0)=S^{''}(x_n-0),&\end{matrix}\right.\tag{5} {S(x0+0)=S(xn−0),S′′(x0+0)=S′′(xn−0),S′(x0+0)=S′(xn−0)(5)
若 y 0 = y n y_0=y_n y0=yn,则称 S ( x ) S(x) S(x)为周期样条函数。
下面是求解过程
(1)因为 S ( x ) " S(x)^{"} S(x)"在每个小区间 [ x k , x k + 1 ] [x_k,x_{k+1}] [xk,xk+1]连续,即通过拉格朗日插值思想,构造形式:
S ( x ) " = M k x − x k + 1 x k − x k + 1 + M k + 1 x − x k x k + 1 − x k S(x)^{"}=M_k\frac{x-x_{k+1}}{x_k-x_{k+1}}+M_{k+1}\frac{x-x_k}{x_{k+1}-x_k} S(x)"=Mkxk−xk+1x−xk+1+Mk+1xk+1−xkx−xk
在这里我们令 h k = x k + 1 − x k h_k=x_{k+1}-x_k hk=xk+1−xk
(2)我们对两端取积分并利用节点函数值得:
S ( x ) = M k ( x k + 1 − x ) 3 6 h k + M k + 1 ( x − x k ) 3 6 h k + ( y k − M k h k 2 6 ) x k + 1 − x h k + ( y k + 1 − M k + 1 h k 2 6 ) x − x k h k , k = 0 , … , n − 1 S(x)=M_k\frac{(x_{k+1}-x)^3}{6h_k}+M_{k+1}\frac{(x-x_k)^3}{6h_k}+(y_k-\frac{M_kh_k^2}{6})\frac{x_{k+1}-x}{h_k}+(y_{k+1}-\frac{M_{k+1}h_k^2}{6})\frac{x-x_k}{h_k},k=0,\dots,n-1 S(x)=Mk6hk(xk+1−x)3+Mk+16hk(x−xk)3+(yk−6Mkhk2)hkxk+1−x+(yk+1−6Mk+1hk2)hkx−xk,k=0,…,n−1
这里的 M k M_k Mk是待定参数。
(3)根据 S ′ ( x k − 0 ) = S ′ ( x k + 0 ) S^{'}(x_k-0)=S^{'}(x_k+0) S′(xk−0)=S′(xk+0)条件有:
{ S ′ ( x k − 0 ) = h k − 1 6 M k − 1 + h k − 1 3 M k + y k − y k − 1 h k S ′ ( x k + 0 ) = − h k 3 M k − h k 6 M k + 1 + y k + 1 − y k h k + 1 \left\{\begin{matrix} S^{'}(x_k-0)=\frac{h_{k-1}}{6}M_{k-1}+\frac{h_{k-1}}{3}M_{k}+\frac{y_k-y_{k-1}}{h_k}\\S^{'}(x_k+0)=-\frac{h_k}{3}M_k-\frac{h_k}{6}M_{k+1}+\frac{y_{k+1}-y_k}{h_{k+1}}\end{matrix}\right. {S′(xk−0)=6hk−1Mk−1+3hk−1Mk+hkyk−yk−1S′(xk+0)=−3hkMk−6hkMk+1+hk+1yk+1−yk
因此有:
μ k M k − 1 + 2 M k + λ k M k + 1 = d k , k = 1 , … , n − 1 \mu _{k} M_{k-1}+2M_k+\lambda _kM_{k+1}=d_k,k=1,\dots,n-1 μkMk−1+2Mk+λkMk+1=dk,k=1,…,n−1
其中: μ k = h k − 1 h k − 1 + h k , λ k = h k h k − 1 + h k , d k = 6 f [ x k − 1 , x k , x k + 1 ] , k = 1 , … , n − 1 \mu _k=\frac{h_{k-1}}{h_{k-1}+h_k},\lambda _k=\frac{h_k}{h_{k-1}+h_k},d_k=6f[x_{k-1},x_k,x_{k+1}],k=1,\dots,n-1 μk=hk−1+hkhk−1,λk=hk−1+hkhk,dk=6f[xk−1,xk,xk+1],k=1,…,n−1
对于边界条件(3),有: [ 2 λ 0 μ 1 2 λ 1 ⋱ ⋱ ⋱ μ n − 1 2 λ n − 1 μ n 2 ] = [ M 0 M 1 ⋮ M n − 1 M n ] = [ d 0 d 1 ⋮ d n − 1 d n ] (*) \begin{bmatrix} 2 & \lambda_0 & & & \\ \mu_1 & 2 & \lambda_1 & & \\ & \ddots & \ddots & \ddots & \\ & & \mu _{n-1} & 2 &\lambda _{n-1} \\ & & & \mu _n &2\end{bmatrix}=\begin{bmatrix} M_0\\M_1 \\\vdots\\ M_{n-1}\\ M_{n}\end{bmatrix}=\begin{bmatrix}d_0\\d_1 \\\vdots\\ d_{n-1}\\ d_{n}\end{bmatrix}\tag{*} 2μ1λ02⋱λ1⋱μn−1⋱2μnλn−12 = M0M1⋮Mn−1Mn = d0d1⋮dn−1dn (*)
其中 λ 0 = 1 , d 0 = 6 h 0 ( f [ x 0 , x 1 ] − f 0 ′ ) , μ n = 1 , d n = 6 h n − 1 ( f n ′ − f [ x n − 1 , x n ] ) \lambda _0=1,d_0=\frac{6}{h_0}(f[x_0,x_1]-f_0^{'}),\mu_n=1,d_n=\frac{6}{h_{n-1}}(f_n^{'}-f[x_{n-1},x_n]) λ0=1,d0=h06(f[x0,x1]−f0′),μn=1,dn=hn−16(fn′−f[xn−1,xn])
对于边界条件(4),有:
[ 2 λ 0 μ 1 2 λ 1 ⋱ ⋱ ⋱ μ n − 1 2 λ n − 1 μ n 2 ] = [ M 0 M 1 ⋮ M n − 1 M n ] = [ d 0 d 1 ⋮ d n − 1 d n ] \begin{bmatrix} 2 & \lambda_0 & & & \\ \mu_1 & 2 & \lambda_1 & & \\ & \ddots & \ddots & \ddots & \\ & & \mu _{n-1} & 2 &\lambda _{n-1} \\ & & & \mu _n &2\end{bmatrix}=\begin{bmatrix} M_0\\M_1 \\\vdots\\ M_{n-1}\\ M_{n}\end{bmatrix}=\begin{bmatrix}d_0\\d_1 \\\vdots\\ d_{n-1}\\ d_{n}\end{bmatrix} 2μ1λ02⋱λ1⋱μn−1⋱2μnλn−12 = M0M1⋮Mn−1Mn = d0d1⋮dn−1dn
其中 M 0 = f 0 ′ ′ , M n = f n ′ ′ , λ 0 = μ n , = 0 , d 0 = 2 f 0 ′ ′ , d n = 2 f n ′ ′ M_0=f_0^{''},M_n=f_n^{''},\lambda _0=\mu_n,=0,d_0=2f_0^{''},d_n=2f_n^{''} M0=f0′′,Mn=fn′′,λ0=μn,=0,d0=2f0′′,dn=2fn′′
对于边界(5),有: M 0 = M n , μ n M 1 + μ n M n − 1 + 2 M n = d n M_0=M_n,\mu _{n} M_{1}+\mu_nM_{n-1}+2M_{n}=d_n M0=Mn,μnM1+μnMn−1+2Mn=dn
即: [ 2 λ 0 μ 1 2 λ 1 ⋱ ⋱ ⋱ μ n − 1 2 λ n − 1 μ n 2 ] = [ M 0 M 1 ⋮ M n − 1 M n ] = [ d 0 d 1 ⋮ d n − 1 d n ] \begin{bmatrix} 2 & \lambda_0 & & & \\ \mu_1 & 2 & \lambda_1 & & \\ & \ddots & \ddots & \ddots & \\ & & \mu _{n-1} & 2 &\lambda _{n-1} \\ & & & \mu _n &2\end{bmatrix}=\begin{bmatrix} M_0\\M_1 \\\vdots\\ M_{n-1}\\ M_{n}\end{bmatrix}=\begin{bmatrix}d_0\\d_1 \\\vdots\\ d_{n-1}\\ d_{n}\end{bmatrix} 2μ1λ02⋱λ1⋱μn−1⋱2μnλn−12 = M0M1⋮Mn−1Mn = d0d1⋮dn−1dn
其中 λ n = h 0 h n − 1 + h 0 , μ n = h n − 1 h n − 1 + h 0 , d k = 6 f [ x 0 , x 1 ] − f [ x n − 1 , x n ] h 0 + h n − 1 \lambda _n=\frac{h_0}{h_{n-1}+h_0},\mu _n=\frac{h_{n-1}}{h_{n-1}+h_0},d_k=6\frac{f[x_0,x_1]-f[x_{n-1},x_n]}{h_0+h_{n-1}} λn=hn−1+h0h0,μn=hn−1+h0hn−1,dk=6h0+hn−1f[x0,x1]−f[xn−1,xn]
求解(*)就是解线性方程组,特殊的是系数矩阵为严格三对角占优矩阵,可以使用追赶法求解。追赶法.
以上就是关于数值分析中插值法的自我梳理内容,欢迎各位在评论区批评指正,若有错误,小编会及时更新版本。(❛‿˂̵✧)