插值问题
物理问题 → \rightarrow → 离散化 → \rightarrow → 计算机处理
离散的物理数据,但不知道实际函数→ \rightarrow → 构造近似函数作为实际函数f ( x ) f(x) f ( x ) 的逼近
插值问题的数学表述: f ( x ) f(x) f ( x ) 是定义在区间[ a , b ] [a, b] [ a , b ] 的函数,( x 0 , y 0 ) , ( x 1 , y 1 ) , ( x 2 , y 2 ) . . . , ( x n , y n ) (x_0, y_0),\ (x_1, y_1),\ (x_2, y_2)...,\ (x_n, y_n) ( x 0 , y 0 ) , ( x 1 , y 1 ) , ( x 2 , y 2 ) ... , ( x n , y n ) 是该区间上n + 1 n+1 n + 1 个不同的点。我们需要构造一个便于计算的函数P ( x ) P(x) P ( x ) ,s.t.
P ( x i ) = y i (1.1) P(x_i) = y_i \tag{1.1}
P ( x i ) = y i ( 1.1 )
则称P ( x ) P(x) P ( x ) 是f ( x ) f(x) f ( x ) 的插值函数,[ a , b ] [a, b] [ a , b ] 是插值区间,( x i , y i ) (x_i, y_i) ( x i , y i ) 是插值节点。同时在其他x ≠ x i x \neq x_i x = x i 点上,P ( x ) P(x) P ( x ) 可以作为f ( x ) f(x) f ( x ) 的近似。
多项式插值
设P n ( x ) = a 0 + a 1 x + a 2 x 2 + . . . + a n x n , a 0 , a 1 , . . . , a n ∈ R P_n(x) = a_0 + a_1x + a_2x^2 + ... + a_nx^n,\;\; a_0, a_1, ..., a_n \in \mathbb{R} P n ( x ) = a 0 + a 1 x + a 2 x 2 + ... + a n x n , a 0 , a 1 , ... , a n ∈ R ,且满足插值条件1.1 {1.1} 1.1 。
将插值条件写成线性方程组的形式:
{ 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 1 ⋮ a 0 + a 1 x n + a 2 x n 2 + ⋯ + a n x n n = y n \begin{cases}
a_0 + a_1 x_0 + a_2 x_0^2 + \cdots + a_n x_0^n = y_0 \\
a_0 + a_1 x_1 + a_2 x_1^2 + \cdots + a_n x_1^n = y_1 \\
\vdots \\
a_0 + a_1 x_n + a_2 x_n^2 + \cdots + a_n x_n^n = y_n
\end{cases}
⎩ ⎨ ⎧ 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 1 ⋮ a 0 + a 1 x n + a 2 x n 2 + ⋯ + a n x n n = y n
这样可用矩阵语言表述:
( y 0 y 1 ⋮ y n ) = ( 1 x 0 ⋯ x 0 n 1 x 1 ⋯ x 1 n 1 x 2 ⋯ x 2 n 1 x n ⋯ x n n ) ( a 0 a 1 ⋮ a n ) \begin{pmatrix}
y_0 \\
y_1 \\
\vdots \\
y_n
\end{pmatrix}
=
\begin{pmatrix}
1 & x_0 & \cdots & x_0^n \\
1 & x_1 & \cdots & x_1^n \\
1 & x_2 & \cdots & x_2^n \\
1 & x_n & \cdots & x_n^n
\end{pmatrix}
\begin{pmatrix}
a_0 \\
a_1 \\
\vdots \\
a_n
\end{pmatrix}
y 0 y 1 ⋮ y n = 1 1 1 1 x 0 x 1 x 2 x n ⋯ ⋯ ⋯ ⋯ x 0 n x 1 n x 2 n x n n a 0 a 1 ⋮ a n
记作( 1.2 ) (1.2) ( 1.2 ) 。上述系数矩阵是方阵(这很显然),记作X X X 。由线性代数的知识可知,当系数行列式∣ X ∣ ≠ 0 |X| \neq 0 ∣ X ∣ = 0 时,齐次方程组X t = 0 Xt = 0 Xt = 0 只有零解,对应的非齐次方程组X t = b Xt = b Xt = b 只存在一组特解。
求解:
Y = X a ⇒ a = X − 1 Y Y = Xa\\
\Rightarrow a = X^{-1}Y
Y = X a ⇒ a = X − 1 Y
其中Y Y Y 和a a a 分别表示y i y_i y i 和a i a_i a i 对应的的列向量,X − 1 X^{-1} X − 1 表示X X X 的逆矩阵。
注意到系数矩阵恰巧时范德蒙德(Vandermonde)矩阵。由线性代数知识可知,Vandermonde行列式的值为(将对应矩阵记作V):
det ( V ) = ∣ 1 x 0 ⋯ x 0 n 1 x 1 ⋯ x 1 n ⋮ ⋮ ⋱ ⋮ 1 x n ⋯ x n n ∣ = ∏ 0 ≤ j < i ≤ n ( x i − x j ) ≠ 0 \det(V) = \begin{vmatrix}
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{vmatrix}
= \prod_{0 \leq j < i \leq n}(x_i - x_j) \neq 0
det ( V ) = 1 1 ⋮ 1 x 0 x 1 ⋮ x n ⋯ ⋯ ⋱ ⋯ x 0 n x 1 n ⋮ x n n = 0 ≤ j < i ≤ n ∏ ( x i − x j ) = 0
Vandermonde行列式求解步骤:
已知det ( V ) = ∣ 1 x 0 ⋯ x 0 n 1 x 1 ⋯ x 1 n ⋮ ⋮ ⋱ ⋮ 1 x n ⋯ x n n ∣ \det(V) = \begin{vmatrix}
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{vmatrix} det ( V ) = 1 1 ⋮ 1 x 0 x 1 ⋮ x n ⋯ ⋯ ⋱ ⋯ x 0 n x 1 n ⋮ x n n
由行列式的性质:转置以及某行的k k k 倍加到另一行,行列式的值不变。
因此做变换:先转置,再从最后一行开始r i − x 0 r i − 1 r_i - x_0r_{i-1} r i − x 0 r i − 1 (r i r_i r i 表示x i x_i x i 所在的行)得到
det ( V T ) = ∣ 1 1 ⋯ 1 x 0 x 1 ⋯ x n x 0 2 x 1 2 ⋯ x n 2 ⋮ ⋮ ⋱ ⋮ x 0 n x 1 n ⋯ x n n ∣ = ∣ 1 1 ⋯ 1 0 x 1 − x 0 ⋯ x n − x 0 0 x 1 2 − x 1 x 0 ⋯ x n 2 − x n x 0 ⋮ ⋮ ⋱ ⋮ 0 x 1 n − x 1 n − 1 x 0 ⋯ x n n − x n n − 1 x 0 ∣ = ∣ x 1 − x 0 x 2 − x 0 ⋯ x n − x 0 x 1 ( x 1 − x 0 ) x 2 ( x 2 − x 0 ) ⋯ x n ( x n − x 0 ) ⋮ ⋮ ⋱ ⋮ x 1 n − 1 ( x 1 − x 0 ) x 2 n − 1 ( x 2 − x 0 ) ⋯ x n n − 1 ( x n − x 0 ) ∣ = ∏ i = 1 n ( x i − x 0 ) ∣ 1 1 ⋯ 1 x 1 x 2 ⋯ x n x 1 2 x 2 2 ⋯ x n 2 ⋮ ⋮ ⋱ ⋮ x 1 n − 1 x 2 n − 1 ⋯ x n n − 1 ∣ \begin{align*}
\det(V^T) &= \begin{vmatrix}
1 & 1 & \cdots & 1 \\
x_0 & x_1 & \cdots & x_n\\
x_0^2 & x_1^2 & \cdots & x_n^2\\
\vdots & \vdots & \ddots & \vdots\\
x_0^n & x_1^n & \cdots & x_n^n
\end{vmatrix}\\
&= \begin{vmatrix}
1 & 1 & \cdots & 1 \\
0 & x_1-x_0 & \cdots & x_n-x_0\\
0 & x_1^2-x_1x_0 & \cdots & x_n^2-x_nx_0\\
\vdots & \vdots & \ddots & \vdots\\
0 & x_1^n-x_1^{n-1}x_0 & \cdots & x_n^n-x_n^{n-1}x_0
\end{vmatrix}\\
&= \begin{vmatrix}
x_1-x_0 & x_2-x_0 & \cdots & x_n-x_0\\
x_1(x_1-x_0) & x_2(x_2-x_0) & \cdots & x_n(x_n-x_0)\\
\vdots & \vdots &\ddots & \vdots\\
x_1^{n-1}(x_1-x_0) & x_2^{n-1}(x_2-x_0) & \cdots & x_n^{n-1}(x_n-x_0)
\end{vmatrix}\\
& = \prod_{i=1}^n(x_i-x_0)
\begin{vmatrix}
1 & 1 & \cdots & 1\\
x_1 & x_2 & \cdots & x_n\\
x_1^2 & x_2^2 & \cdots & x_n^2\\
\vdots & \vdots & \ddots & \vdots\\
x_1^{n-1} & x_2^{n-1} & \cdots & x_n^{n-1}
\end{vmatrix}
\end{align*}
det ( V T ) = 1 x 0 x 0 2 ⋮ x 0 n 1 x 1 x 1 2 ⋮ x 1 n ⋯ ⋯ ⋯ ⋱ ⋯ 1 x n x n 2 ⋮ x n n = 1 0 0 ⋮ 0 1 x 1 − x 0 x 1 2 − x 1 x 0 ⋮ x 1 n − x 1 n − 1 x 0 ⋯ ⋯ ⋯ ⋱ ⋯ 1 x n − x 0 x n 2 − x n x 0 ⋮ x n n − x n n − 1 x 0 = x 1 − x 0 x 1 ( x 1 − x 0 ) ⋮ x 1 n − 1 ( x 1 − x 0 ) x 2 − x 0 x 2 ( x 2 − x 0 ) ⋮ x 2 n − 1 ( x 2 − x 0 ) ⋯ ⋯ ⋱ ⋯ x n − x 0 x n ( x n − x 0 ) ⋮ x n n − 1 ( x n − x 0 ) = i = 1 ∏ n ( x i − x 0 ) 1 x 1 x 1 2 ⋮ x 1 n − 1 1 x 2 x 2 2 ⋮ x 2 n − 1 ⋯ ⋯ ⋯ ⋱ ⋯ 1 x n x n 2 ⋮ x n n − 1
可以看到又出现了Vandermonde行列式,不过此时阶数− 1 -1 − 1 。再进行一轮上述操作,又得到因子∏ j = 2 n ( x j − x 1 ) \prod_{j=2}^n (x_j-x_1) ∏ j = 2 n ( x j − x 1 ) 。以此类推,最终可得:
det ( V T ) = det ( V ) = ∏ i = 1 n ( x i − x 0 ) ∏ j = 2 n ( x j − x 1 ) ∏ ⋯ ( x n − x n − 1 ) = ∏ 0 ≤ j < i ≤ n ( x i − x j ) \begin{align*}
\det(V^T) &= \det(V) = \prod_{i=1}^n(x_i-x_0)\prod_{j=2}^n (x_j-x_1)\prod \cdots (x_n-x_{n-1})\\
&=\prod_{0 \leq j < i \leq n}(x_i - x_j)
\end{align*}
det ( V T ) = det ( V ) = i = 1 ∏ n ( x i − x 0 ) j = 2 ∏ n ( x j − x 1 ) ∏ ⋯ ( x n − x n − 1 ) = 0 ≤ j < i ≤ n ∏ ( x i − x j )
定理:对于n + 1 n+1 n + 1 个互不相同的插值节点,满足插值条件的n n n 次多项式插值函数存在且唯一。
多项式插值方法一 —— 拉格朗日插值法
引入:线性插值
给定两个点( x 0 , y 0 ) (x_0, y_0) ( x 0 , y 0 ) ,( x 1 , y 1 ) (x_1, y_1) ( x 1 , y 1 ) 求解
{ a 0 + a 1 x 0 = y 0 a 0 + a 1 x 1 = y 1 \begin{cases}
a_0+ a_1x_0 = y_0\\
a_0+ a_1x_1 = y_1
\end{cases}
{ a 0 + a 1 x 0 = y 0 a 0 + a 1 x 1 = y 1
解出:
{ a 0 = y 0 x 1 − y 1 x 0 x 1 − x 0 a 1 = y 0 − y 1 x 0 − x 1 \begin{cases}
a_0 = \frac{y_0x_1-y_1x_0}{x_1-x_0}\\
a_1 = \frac{y_0 - y_1}{x_0 - x_1}
\end{cases}
{ a 0 = x 1 − x 0 y 0 x 1 − y 1 x 0 a 1 = x 0 − x 1 y 0 − y 1
可得
P 1 ( x ) = a 0 + a 1 x = y 1 x 0 − y 0 x 1 x 0 − x 1 + y 0 − y 1 x 0 − x 1 x = x − x 1 x 0 − x 1 y 0 − x − x 0 x 0 − x 1 y 1 P_1(x) = a_0+ a_1x = \frac{y_1x_0-y_0x_1}{x_0-x_1} + \frac{y_0 - y_1}{x_0 - x_1}x =\frac{x-x_1}{x_0 - x_1}y_0 - \frac{x-x_0}{x_0-x_1}y_1
P 1 ( x ) = a 0 + a 1 x = x 0 − x 1 y 1 x 0 − y 0 x 1 + x 0 − x 1 y 0 − y 1 x = x 0 − x 1 x − x 1 y 0 − x 0 − x 1 x − x 0 y 1
记 l 0 = x − x 1 x 0 − x 1 , l 1 = x − x 0 x 1 − x 0 l_0 = \frac{x-x_1}{x_0-x_1}, \; l_1 = \frac{x-x_0}{x_1-x_0} l 0 = x 0 − x 1 x − x 1 , l 1 = x 1 − x 0 x − x 0 ,那么 P 1 = l 0 ( x ) y 0 + l 1 ( x ) y 1 ⇒ l 0 ( x ) , l 1 ( x ) P_1 = l_0(x) y_0 + l_1(x) y_1 \; \Rightarrow \; l_0(x), l_1(x) P 1 = l 0 ( x ) y 0 + l 1 ( x ) y 1 ⇒ l 0 ( x ) , l 1 ( x ) 为插值基函数。
推广:拉格朗日插值
首先需要明白插值基函数的性质。它们满足在插值节点x k x_k x k 上等于1,其余地方为0。即:
l k ( x i ) = { 1 i = k 0 i ≠ k l_k(x_i) =
\begin{cases}
1 \quad i = k\\
0 \quad i\neq k
\end{cases}
l k ( x i ) = { 1 i = k 0 i = k
构造:
P n ( x ) = ∑ k = 0 n l k ( x ) ⋅ y k , l k ( x ) = ∏ j ≠ k x − x j x k − x j P_n(x) = \sum_{k=0}^n l_k(x) \cdot y_k, \quad l_k(x) = \prod_{j \neq k} \frac{x - x_j}{x_k - x_j}
P n ( x ) = k = 0 ∑ n l k ( x ) ⋅ y k , l k ( x ) = j = k ∏ x k − x j x − x j
其中l k ( x ) l_k(x) l k ( x ) 是基函数。
易验证拉格朗日插值基函数满足以下性质:
归一性:l k ( x i ) = { 1 i = k 0 o / w l_k(x_i) =
\begin{cases}
1 \quad i = k\\
0 \quad o/w
\end{cases} l k ( x i ) = { 1 i = k 0 o / w
多项式次数:每个l k l_k l k 是n n n 次多项式。
举例理解
上面的线性插值已经是一个例子。现在看n = 2 n = 2 n = 2 :
对于( x 0 , x 1 , x 2 ) (x_0,x_1,x_2) ( x 0 , x 1 , x 2 ) ,
l 0 ( x ) = ( x − x 1 ) ( x − x 2 ) ( x 0 − x 1 ) ( x 0 − x 2 ) l 1 ( x ) = ( x − x 0 ) ( x − x 2 ) ( x 1 − x 0 ) ( x 1 − x 2 ) l 2 ( x ) = ( x − x 0 ) ( x − x 1 ) ( x 2 − x 0 ) ( x 2 − x 1 ) \begin{aligned}
l_0(x) &= \frac{(x-x_1)(x-x_2)}{(x_0-x_1)(x_0-x_2)} \\
l_1(x) &= \frac{(x-x_0)(x-x_2)}{(x_1-x_0)(x_1-x_2)} \\
l_2(x) &= \frac{(x-x_0)(x-x_1)}{(x_2-x_0)(x_2-x_1)}
\end{aligned}
l 0 ( x ) l 1 ( x ) l 2 ( x ) = ( x 0 − x 1 ) ( x 0 − x 2 ) ( x − x 1 ) ( x − x 2 ) = ( x 1 − x 0 ) ( x 1 − x 2 ) ( x − x 0 ) ( x − x 2 ) = ( x 2 − x 0 ) ( x 2 − x 1 ) ( x − x 0 ) ( x − x 1 )
更高阶同理。
线性插值误差
定理:设 f ( x ) f(x) f ( x ) 一阶连续可导,且 f ′ ′ ( x ) f''(x) f ′′ ( x ) 在区间 ( a , b ) (a, b) ( a , b ) 上存在,则对任意 x ∈ [ a , b ] x \in [a, b] x ∈ [ a , b ] ,存在 ξ ∈ [ a , b ] \xi \in [a, b] ξ ∈ [ a , b ] 使得:
R ( x ) = f ( x ) − P 1 ( x ) = f ′ ′ ( ξ ) 2 ( x − x 0 ) ( x − x 1 ) R(x) = f(x) - P_1(x) = \frac{f''(\xi)}{2}(x-x_0)(x-x_1)
R ( x ) = f ( x ) − P 1 ( x ) = 2 f ′′ ( ξ ) ( x − x 0 ) ( x − x 1 )
这里的 P 1 ( x ) P_1(x) P 1 ( x ) 是线性插值的基函数。
证明:
∵ f ( x 0 ) = P 1 ( x 0 ) ; f ( x 1 ) = P 1 ( x 1 ) \because f(x_0) = P_1(x_0); \quad f(x_1) = P_1(x_1) ∵ f ( x 0 ) = P 1 ( x 0 ) ; f ( x 1 ) = P 1 ( x 1 )
∴ R ( x ) = f ( x ) − P 1 ( x ) \therefore R(x) = f(x)-P_1(x) ∴ R ( x ) = f ( x ) − P 1 ( x ) 存在两个零点x 0 , x 1 x_0, x_1 x 0 , x 1
∴ \therefore ∴ 可以设 R ( x ) = k ( x ) ( x − x 0 ) ( x − x 1 ) R(x) = k(x)(x-x_0)(x-x_1) R ( x ) = k ( x ) ( x − x 0 ) ( x − x 1 ) ,且:
f ( x ) − P 1 ( x ) = k ( x ) ( x − x 0 ) ( x − x 1 ) (1.2) f(x)-P_1(x) = k(x)(x-x_0)(x-x_1) \tag{1.2}
f ( x ) − P 1 ( x ) = k ( x ) ( x − x 0 ) ( x − x 1 ) ( 1.2 )
构造辅助函数:
ϕ ( t ) = f ( t ) − P 1 ( t ) − k ( x ) ( t − x 0 ) ( t − x 1 ) \phi(t) = f(t) - P_1(t) - k(x)(t-x_0)(t-x_1)
ϕ ( t ) = f ( t ) − P 1 ( t ) − k ( x ) ( t − x 0 ) ( t − x 1 )
则可以将1.2 {1.2} 1.2 看成ϕ ( t ) \phi(t) ϕ ( t ) 在t = x t=x t = x 时的取值,且ϕ ( x ) = 0 \phi(x) = 0 ϕ ( x ) = 0
则由以上讨论,ϕ ( t ) \phi(t) ϕ ( t ) 在 x 0 , x , x 1 x_0,x,x_1 x 0 , x , x 1 处有零点。由Rolle定理,ϕ ′ ( t ) \phi'(t) ϕ ′ ( t ) 在 ( x 0 , x 1 ) , ( x 1 , x 2 ) (x_0, x_1),\, (x_1, x_2) ( x 0 , x 1 ) , ( x 1 , x 2 ) 上存在零点,分别记作 ( ξ 1 , ξ 2 ) (\xi_1,\xi_2) ( ξ 1 , ξ 2 ) 。再由罗尔定理,ϕ ′ ′ ( t ) \phi''(t) ϕ ′′ ( t ) 在 ( ξ 1 , ξ 2 ) (\xi_1,\xi_2) ( ξ 1 , ξ 2 ) 有零点,记作 ξ \xi ξ 。
∴ ϕ ′ ′ ( ξ ) = 0 \therefore \phi''(\xi) = 0 ∴ ϕ ′′ ( ξ ) = 0 对 ϕ ( t ) \phi(t) ϕ ( t ) 两边求二阶导得:
ϕ ′ ′ ( t ) = f ′ ′ ( t ) − P 1 ′ ′ ( t ) − 2 k ( x ) = 0 \phi''(t) = f''(t) - P_1''(t) - 2k(x) = 0
ϕ ′′ ( t ) = f ′′ ( t ) − P 1 ′′ ( t ) − 2 k ( x ) = 0
又 ∵ P 1 ( t ) \because P_1(t) ∵ P 1 ( t ) 是线性插值基函数,仅有一次项 ∴ P 1 ′ ′ ( x ) = 0 \therefore P_1''(x) = 0 ∴ P 1 ′′ ( x ) = 0 ⇒ \quad \Rightarrow ⇒ f ′ ′ ( ξ ) = 2 k ( x ) f''(\xi) = 2k(x) f ′′ ( ξ ) = 2 k ( x )
再代回原式即可得证。
一般形式的误差估计: 对于 n n n 次插值多项式 P n ( x ) P_n(x) P n ( x ) :
R n ( x ) = f ( x ) − P n ( x ) = f ( n + 1 ) ( ξ ) ( n + 1 ) ! ω n + 1 ( x ) R_n(x) = f(x) - P_n(x) = \frac{f^{(n+1)}(\xi)}{(n+1)!}\omega_{n+1}(x)
R n ( x ) = f ( x ) − P n ( x ) = ( n + 1 )! f ( n + 1 ) ( ξ ) ω n + 1 ( x )
其中:
ω n + 1 ( x ) = ∏ i = 0 n ( x − x i ) \omega_{n+1}(x) = \prod_{i=0}^n (x-x_i)
ω n + 1 ( x ) = i = 0 ∏ n ( x − x i )
可以看出:节点越密集 (( x − x i ) (x-x_i) ( x − x i ) 越小),误差越小。
很多情况下,f ( x ) f(x) f ( x ) 未知,f ( n + 1 ) f^{(n+1)} f ( n + 1 ) 也难以得知,因此可采用以下方法估计误差:
使用 n + 2 n+2 n + 2 个数据点进行两次插值运算:前 n + 1 n+1 n + 1 点构造 P n ( x ) P_n(x) P n ( x ) ;后 n + 1 n+1 n + 1 点构造 P ^ n ( x ) \hat{P}_n(x) P ^ n ( x ) 。
两次的误差分别是:
R n ( x ) = f ( x ) − P n ( x ) = f ( n + 1 ) ( ξ 1 ) ( n + 1 ) ! ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x n ) R ^ n ( x ) = f ( x ) − P ^ n ( x ) = f ( n + 1 ) ( ξ 2 ) ( n + 1 ) ! ( x − x 1 ) ( x − x 2 ) ⋯ ( x − x n + 1 ) R_n(x) = f(x) - P_n(x) = \frac{f^{(n+1)}(\xi_1)}{(n+1)!}(x-x_0)(x-x_1)\cdots(x-x_n)\\
\hat{R}_n(x) = f(x) - \hat{P}_n(x) = \frac{f^{(n+1)}(\xi_2)}{(n+1)!}(x-x_1)(x-x_2)\cdots(x-x_{n+1})
R n ( x ) = f ( x ) − P n ( x ) = ( n + 1 )! f ( n + 1 ) ( ξ 1 ) ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x n ) R ^ n ( x ) = f ( x ) − P ^ n ( x ) = ( n + 1 )! f ( n + 1 ) ( ξ 2 ) ( x − x 1 ) ( x − x 2 ) ⋯ ( x − x n + 1 )
整理可得误差关系式:
f ( x ) − P n ( x ) ≈ x − x 0 x 0 − x n + 1 ( P n ( x ) − P ^ n ( x ) ) f(x) - P_n(x) \approx \frac{x-x_0}{x_0-x_{n+1}}(P_n(x)-\hat{P}_n(x))
f ( x ) − P n ( x ) ≈ x 0 − x n + 1 x − x 0 ( P n ( x ) − P ^ n ( x ))
这里说说得到这个误差关系式的具体步骤:
已知
R n ( x ) = f ( x ) − P n ( x ) = f ( n + 1 ) ( ξ 1 ) ( n + 1 ) ! ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x n ) R ^ n ( x ) = f ( x ) − P ^ n ( x ) = f ( n + 1 ) ( ξ 2 ) ( n + 1 ) ! ( x − x 1 ) ( x − x 2 ) ⋯ ( x − x n + 1 ) R_n(x) = f(x) - P_n(x) = \frac{f^{(n+1)}(\xi_1)}{(n+1)!}(x-x_0)(x-x_1)\cdots(x-x_n)\\
\hat{R}_n(x) = f(x) - \hat{P}_n(x) = \frac{f^{(n+1)}(\xi_2)}{(n+1)!}(x-x_1)(x-x_2)\cdots(x-x_{n+1})
R n ( x ) = f ( x ) − P n ( x ) = ( n + 1 )! f ( n + 1 ) ( ξ 1 ) ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x n ) R ^ n ( x ) = f ( x ) − P ^ n ( x ) = ( n + 1 )! f ( n + 1 ) ( ξ 2 ) ( x − x 1 ) ( x − x 2 ) ⋯ ( x − x n + 1 )
我们假设 f ( n + 1 ) ( ξ 1 ) ≈ f ( n + 1 ) ( ξ 2 ) f^{(n+1)}(\xi_1) \approx f^{(n+1)}(\xi_2) f ( n + 1 ) ( ξ 1 ) ≈ f ( n + 1 ) ( ξ 2 ) ,即高阶导数在 ξ 1 \xi_1 ξ 1 和 ξ 2 \xi_2 ξ 2 处的值相近 。于是可以将两个误差表达式中的高阶导数项消去:
R n ( x ) R ^ n ( x ) ≈ ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x n ) ( x − x 1 ) ( x − x 2 ) ⋯ ( x − x n + 1 ) = x − x 0 x − x n + 1 \frac{R_n(x)}{\hat{R}_n(x)} \approx \frac{(x - x_0)(x - x_1) \cdots (x - x_n)}{(x - x_1)(x - x_2) \cdots (x - x_{n+1})} = \frac{x - x_0}{x - x_{n+1}}
R ^ n ( x ) R n ( x ) ≈ ( x − x 1 ) ( x − x 2 ) ⋯ ( x − x n + 1 ) ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x n ) = x − x n + 1 x − x 0
⇒ R n ( x ) ≈ x − x 0 x − x n + 1 R ^ n ( x ) \Rightarrow R_n(x) \approx \frac{x - x_0}{x - x_{n+1}} \hat{R}_n(x)
⇒ R n ( x ) ≈ x − x n + 1 x − x 0 R ^ n ( x )
由于R ^ n ( x ) = f ( x ) − P ^ n ( x ) \hat{R}_n(x) = f(x) - \hat{P}_n(x) R ^ n ( x ) = f ( x ) − P ^ n ( x ) ,则代入可得:
f ( x ) − P n ( x ) ≈ x − x 0 x − x n + 1 ( f ( x ) − P ^ n ( x ) ) f(x) - P_n(x) \approx \frac{x - x_0}{x - x_{n+1}} (f(x) - \hat{P}_n(x))
f ( x ) − P n ( x ) ≈ x − x n + 1 x − x 0 ( f ( x ) − P ^ n ( x ))
将 f ( x ) f(x) f ( x ) 的项移到左边:
f ( x ) ( 1 − x − x 0 x − x n + 1 ) ≈ P n ( x ) − x − x 0 x − x n + 1 P ^ n ( x ) f(x) \left(1 - \frac{x - x_0}{x - x_{n+1}}\right) \approx P_n(x) - \frac{x - x_0}{x - x_{n+1}} \hat{P}_n(x)
f ( x ) ( 1 − x − x n + 1 x − x 0 ) ≈ P n ( x ) − x − x n + 1 x − x 0 P ^ n ( x )
⇒ f ( x ) x 0 − x n + 1 x − x n + 1 ≈ P n ( x ) − x − x 0 x − x n + 1 P ^ n ( x ) \Rightarrow f(x) \frac{x_0-x_{n+1}}{x-x_{n+1}} \approx P_n(x)-\frac{x - x_0}{x - x_{n+1}} \hat{P}_n(x)
⇒ f ( x ) x − x n + 1 x 0 − x n + 1 ≈ P n ( x ) − x − x n + 1 x − x 0 P ^ n ( x )
⇒ f ( x ) ≈ x − x n + 1 x 0 − x n + 1 [ P n ( x ) − x − x 0 x − x n + 1 P ^ n ( x ) ] = x − x n + 1 x 0 − x n + 1 P n ( x ) − x − x 0 x 0 − x n + 1 P ^ n ( x ) = x 0 − x n + 1 + x − x 0 x 0 − x n + 1 P n ( x ) − x − x 0 x 0 − x n + 1 P ^ n ( x ) = P n ( x ) + x − x 0 x 0 − x n + 1 [ P n ( x ) − P ^ n ( x ) ] \begin{aligned}
\Rightarrow f(x) &\approx \frac{x-x_{n+1}}{x_0-x_{n+1}}[P_n(x)-\frac{x - x_0}{x - x_{n+1}} \hat{P}_n(x)]\\
&=\frac{x-x_{n+1}}{x_0-x_{n+1}}P_n(x) - \frac{x-x_0}{x_0-x_{n+1}}\hat{P}_n(x)\\
&=\frac{x_0-x_{n+1}+x-x_0}{x_0-x_{n+1}}P_n(x) - \frac{x-x_0}{x_0-x_{n+1}} \hat{P}_n(x)\\
&=P_n(x) + \frac{x-x_0}{x_0-x_{n+1}}[P_n(x) - \hat{P}_n(x)]
\end{aligned}
⇒ f ( x ) ≈ x 0 − x n + 1 x − x n + 1 [ P n ( x ) − x − x n + 1 x − x 0 P ^ n ( x )] = x 0 − x n + 1 x − x n + 1 P n ( x ) − x 0 − x n + 1 x − x 0 P ^ n ( x ) = x 0 − x n + 1 x 0 − x n + 1 + x − x 0 P n ( x ) − x 0 − x n + 1 x − x 0 P ^ n ( x ) = P n ( x ) + x 0 − x n + 1 x − x 0 [ P n ( x ) − P ^ n ( x )]
移项整理即可得到误差关系式。
拉格朗日插值法的优点/缺点:
优点:
显示公式:无需解线性方程组,直接构造多项式。
理论直观
缺点:
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 def Pn_x (x_variables, x_data, y_data ): """ 计算拉格朗日插值多项式在 x_variables 处的值 参数: x_variables: float 或 array-like, 插值点的自变量值 x_data: list 或 array-like, 已知数据点的自变量值 y_data: list 或 array-like, 已知数据点的因变量值 返回: float 或 array-like, 插值多项式在 x_variables 处的值 """ n = len (x_data) result = 0.0 for i in range (n): term = y_data[i] for j in range (n): if j != i: term *= (x_variables - x_data[j]) / (x_data[i] - x_data[j]) result += term return result
多项式插值方法二——牛顿插值法
引入
目的:避开拉格朗日插值法“新增节点需重新计算所有基函数”这一问题。
由数学知识可知任何一个多项式都可以表示为:
N n ( x ) = a 0 + ∑ k = 1 n a k ∏ i = 0 k − 1 ( x − x i ) N_n(x) = a_0 + \sum_{k=1}^n a_k \prod_{i=0}^{k-1} (x - x_i)
N n ( x ) = a 0 + k = 1 ∑ n a k i = 0 ∏ k − 1 ( x − x i )
在牛顿形式下,我们可以认为此时 a k a_k a k 对应的基函数是 k k k 的多项式∏ i = 0 k − 1 ( x − x i ) \prod_{i=0}^{k-1} (x - x_i) ∏ i = 0 k − 1 ( x − x i ) ,它们相互独立。因此有更高阶数加入的时候只需计算相应新的多项式系数即可。
计算步骤
将插值条件P ( x i ) = y i P(x_i) = y_i P ( x i ) = y i 写成线性方程组的形式:
{ y 0 = a 0 = f ( x 0 ) y 1 = y 0 + a 1 ( x 1 − x 0 ) = f ( x 1 ) y 2 = y 0 + a 1 ( x 2 − x 0 ) + a 2 ( x 2 − x 0 ) ( x 2 − x 1 ) = f ( x 2 ) . . . y n = y 0 + a 1 ( x n − x 0 ) + a 2 ( x n − x 0 ) ( x n − x 1 ) + . . . + a n ( x n − x 0 ) ( x n − x 1 ) . . . ( x n − x n − 1 ) = f ( x n ) \begin{cases}
y_0 = a_0 = f(x_0)\\
y_1 = y_0 +a_1 (x_1-x_0) = f(x_1)\\
y_2 = y_0 + a_1 (x_2-x_0) + a_2(x_2-x_0)(x_2-x_1) = f(x_2)\\
...\\
y_n = y_0 + a_1 (x_n-x_0) + a_2(x_n-x_0)(x_n-x_1) + ... + a_n(x_n-x_0)(x_n-x_1)...(x_n-x_{n-1}) = f(x_n)
\end{cases}
⎩ ⎨ ⎧ y 0 = a 0 = f ( x 0 ) y 1 = y 0 + a 1 ( x 1 − x 0 ) = f ( x 1 ) y 2 = y 0 + a 1 ( x 2 − x 0 ) + a 2 ( x 2 − x 0 ) ( x 2 − x 1 ) = f ( x 2 ) ... y n = y 0 + a 1 ( x n − x 0 ) + a 2 ( x n − x 0 ) ( x n − x 1 ) + ... + a n ( x n − x 0 ) ( x n − x 1 ) ... ( x n − x n − 1 ) = f ( x n )
引入差商的概念:
由( y 0 , y 1 ) (y_0, y_1) ( y 0 , y 1 ) 我们引入一阶差商
F ( x 0 , x 1 ) = f ( x 1 ) − f ( x 0 ) x 1 − x 0 = a 1 F(x_0, x_1) = \frac{f(x_1) - f(x_0)}{x_1 - x_0} = a_1
F ( x 0 , x 1 ) = x 1 − x 0 f ( x 1 ) − f ( x 0 ) = a 1
类似可得更高阶的差商公式:
F ( x 0 , x 1 , x 2 ) = F ( x 2 , x 1 ) − F ( x 0 , x 1 ) x 2 − x 0 ⋯ F ( x 0 , . . . , x n ) = F ( x 1 , . . . , x n ) − F ( x 0 , . . . , x n − 1 ) x n − x 0 F(x_0, x_1,x_2) = \frac{F(x_2, x_1)-F(x_0, x_1)}{x_2-x_0}\\
\cdots \\
F(x_0,...,x_n) = \frac{F(x_1,...,x_n)-F(x_0,...,x_{n-1})}{x_n-x_0}
F ( x 0 , x 1 , x 2 ) = x 2 − x 0 F ( x 2 , x 1 ) − F ( x 0 , x 1 ) ⋯ F ( x 0 , ... , x n ) = x n − x 0 F ( x 1 , ... , x n ) − F ( x 0 , ... , x n − 1 )
根据以上公式我们可以改写差商形式的牛顿插值多项式:
P n ( x ) = a 0 + ∑ k = 1 n a k ⋅ ∏ i = 0 k − 1 ( x − x i ) = F ( x 0 ) + ∑ k = 1 n F ( x 0 , . . . , x k ) ⋅ ∏ i = 0 k − 1 ( x − x i ) \begin{aligned}
P_n(x) &= a_0 + \sum_{k=1}^n a_k \cdot \prod_{i=0}^{k-1} (x - x_i) \\
&= F(x_0) + \sum_{k=1}^n F(x_0,...,x_k) \cdot \prod_{i=0}^{k-1}(x-x_i)
\end{aligned}
P n ( x ) = a 0 + k = 1 ∑ n a k ⋅ i = 0 ∏ k − 1 ( x − x i ) = F ( x 0 ) + k = 1 ∑ n F ( x 0 , ... , x k ) ⋅ i = 0 ∏ k − 1 ( x − x i )
对应关系:a k = F ( x 0 , . . . , x k ) a_k = F(x_0, ..., x_k) a k = F ( x 0 , ... , x k )
这里以 a 2 a_2 a 2 为例,详细展开系数的计算:
易知
a 2 = f ( x 2 ) − f ( x 0 ) − F ( x 0 , x 1 ) ( x 2 − x 0 ) ( x 2 − x 0 ) ( x 2 − x 1 ) = f ( x 2 ) − f ( x 0 ) − f ( x 1 ) − f ( x 0 ) x 1 − x 0 ( x 2 − x 0 ) ( x 2 − x 0 ) ( x 2 − x 1 ) = ( f ( x 2 ) − f ( x 0 ) ) ( x 1 − x 0 ) − ( f ( x 1 ) − f ( x 0 ) ) ( x 2 − x 0 ) ( x 2 − x 0 ) ( x 2 − x 1 ) ( x 1 − x 0 ) = f ( x 2 ) − f ( x 0 ) ( x 2 − x 0 ) ( x 2 − x 1 ) − f ( x 1 ) − f ( x 0 ) ( x 1 − x 0 ) ( x 2 − x 1 ) (1.3) \begin{aligned}
a_2 &= \frac{f(x_2)-f(x_0)-F(x_0, x_1)(x_2-x_0)}{(x_2-x_0)(x_2-x_1)}\\
&= \frac{f(x_2)-f(x_0)-\frac{f(x_1) - f(x_0)}{x_1 - x_0}(x_2-x_0)}{(x_2-x_0)(x_2-x_1)}\\
&= \frac{(f(x_2)-f(x_0))(x_1-x_0)-(f(x_1)-f(x_0))(x_2-x_0)}{(x_2-x_0)(x_2-x_1)(x_1-x_0)} \\
&= \frac{f(x_2)-f(x_0)}{(x_2-x_0)(x_2-x_1)} - \frac{f(x_1) - f(x_0)}{(x_1-x_0)(x_2-x_1)}\\
\end{aligned} \tag{1.3}
a 2 = ( x 2 − x 0 ) ( x 2 − x 1 ) f ( x 2 ) − f ( x 0 ) − F ( x 0 , x 1 ) ( x 2 − x 0 ) = ( x 2 − x 0 ) ( x 2 − x 1 ) f ( x 2 ) − f ( x 0 ) − x 1 − x 0 f ( x 1 ) − f ( x 0 ) ( x 2 − x 0 ) = ( x 2 − x 0 ) ( x 2 − x 1 ) ( x 1 − x 0 ) ( f ( x 2 ) − f ( x 0 )) ( x 1 − x 0 ) − ( f ( x 1 ) − f ( x 0 )) ( x 2 − x 0 ) = ( x 2 − x 0 ) ( x 2 − x 1 ) f ( x 2 ) − f ( x 0 ) − ( x 1 − x 0 ) ( x 2 − x 1 ) f ( x 1 ) − f ( x 0 ) ( 1.3 )
而更常见的形式为:
a 2 = f ( x 2 ) − f ( x 1 ) x 2 − x 1 − f ( x 1 ) − f ( x 0 ) x 1 − x 0 x 2 − x 0 (1.4) a_2 = \frac{\frac{f(x_2) - f(x_1)}{x_2 - x_1}-\frac{f(x_1) - f(x_0)}{x_1 - x_0}}{x_2-x_0} \tag{1.4}
a 2 = x 2 − x 0 x 2 − x 1 f ( x 2 ) − f ( x 1 ) − x 1 − x 0 f ( x 1 ) − f ( x 0 ) ( 1.4 )
下证( 1.3 ) (1.3) ( 1.3 ) 和( 1.4 ) (1.4) ( 1.4 ) 等价性:
( 1.3 ) = ( f ( x 2 ) − f ( x 0 ) ) ( x 1 − x 0 ) − ( f ( x 1 ) − f ( x 0 ) ) ( x 2 − x 0 ) ( x 2 − x 0 ) ( x 2 − x 1 ) ( x 1 − x 0 ) = ( x 1 f ( x 2 ) − x 0 f ( x 2 ) − x 1 f ( x 0 ) + x 0 f ( x 0 ) ) − ( x 2 f ( x 1 ) − x 0 f ( x 1 ) − x 2 f ( x 0 ) + x 0 f ( x 0 ) ) ( x 2 − x 1 ) ( x 2 − x 0 ) ( x 1 − x 0 ) = x 1 f ( x 2 ) − x 0 f ( x 2 ) − x 1 f ( x 0 ) − x 2 f ( x 1 ) + x 0 f ( x 1 ) + x 2 f ( x 0 ) ( x 2 − x 1 ) ( x 2 − x 0 ) ( x 1 − x 0 ) = f ( x 2 ) ( x 1 − x 0 ) + f ( x 1 ) ( x 0 − x 2 ) + f ( x 0 ) ( x 2 − x 1 ) ( x 2 − x 1 ) ( x 2 − x 0 ) ( x 1 − x 0 ) \begin{aligned}
(1.3) &= \frac{(f(x_2)-f(x_0))(x_1-x_0)-(f(x_1)-f(x_0))(x_2-x_0)}{(x_2-x_0)(x_2-x_1)(x_1-x_0)}\\
&= \frac{(x_1f(x_2)-x_0f(x_2)-x_1f(x_0)+x_0f(x_0))-(x_2f(x_1)-x_0f(x_1)-x_2f(x_0)+x_0f(x_0))}{(x_2-x_1)(x_2-x_0)(x_1-x_0)}\\
&= \frac{x_1f(x_2)-x_0f(x_2)-x_1f(x_0)-x_2f(x_1)+x_0f(x_1)+x_2f(x_0)}{(x_2-x_1)(x_2-x_0)(x_1-x_0)}\\
&= \frac{f(x_2)(x_1-x_0)+f(x_1)(x_0-x_2)+f(x_0)(x_2-x_1)}{(x_2-x_1)(x_2-x_0)(x_1-x_0)}
\end{aligned}
( 1.3 ) = ( x 2 − x 0 ) ( x 2 − x 1 ) ( x 1 − x 0 ) ( f ( x 2 ) − f ( x 0 )) ( x 1 − x 0 ) − ( f ( x 1 ) − f ( x 0 )) ( x 2 − x 0 ) = ( x 2 − x 1 ) ( x 2 − x 0 ) ( x 1 − x 0 ) ( x 1 f ( x 2 ) − x 0 f ( x 2 ) − x 1 f ( x 0 ) + x 0 f ( x 0 )) − ( x 2 f ( x 1 ) − x 0 f ( x 1 ) − x 2 f ( x 0 ) + x 0 f ( x 0 )) = ( x 2 − x 1 ) ( x 2 − x 0 ) ( x 1 − x 0 ) x 1 f ( x 2 ) − x 0 f ( x 2 ) − x 1 f ( x 0 ) − x 2 f ( x 1 ) + x 0 f ( x 1 ) + x 2 f ( x 0 ) = ( x 2 − x 1 ) ( x 2 − x 0 ) ( x 1 − x 0 ) f ( x 2 ) ( x 1 − x 0 ) + f ( x 1 ) ( x 0 − x 2 ) + f ( x 0 ) ( x 2 − x 1 )
( 1.4 ) = f ( x 2 ) − f ( x 1 ) ( x 2 − x 1 ) ( x 2 − x 0 ) − f ( x 1 ) − f ( x 0 ) ( x 1 − x 0 ) ( x 2 − x 0 ) = ( x 1 − x 0 ) ( f ( x 2 ) − f ( x 1 ) ) − ( x 2 − x 1 ) ( f ( x 1 ) − f ( x 0 ) ) ( x 2 − x 1 ) ( x 2 − x 0 ) ( x 1 − x 0 ) = x 1 f ( x 2 ) − x 1 f ( x 1 ) − x 0 f ( x 2 ) + x 0 f ( x 1 ) − ( x 2 f ( x 1 ) − x 2 f ( x 0 ) − x 1 f ( x 1 ) + x 1 f ( x 0 ) ) ( x 2 − x 1 ) ( x 2 − x 0 ) ( x 1 − x 0 ) = x 1 f ( x 2 ) − x 0 f ( x 2 ) + x 0 f ( x 1 ) − x 2 f ( x 1 ) + x 2 f ( x 0 ) − x 1 f ( x 0 ) ( x 2 − x 1 ) ( x 2 − x 0 ) ( x 1 − x 0 ) = f ( x 2 ) ( x 1 − x 0 ) + f ( x 1 ) ( x 0 − x 2 ) + f ( x 0 ) ( x 2 − x 1 ) ( x 2 − x 1 ) ( x 2 − x 0 ) ( x 1 − x 0 ) \begin{aligned}
(1.4) &= \frac{f(x_2)-f(x_1)}{(x_2-x_1)(x_2-x_0)} - \frac{f(x_1)-f(x_0)}{(x_1-x_0)(x_2-x_0)}\\
&= \frac{(x_1-x_0)(f(x_2)-f(x_1))-(x_2-x_1)(f(x_1)-f(x_0))}{(x_2-x_1)(x_2-x_0)(x_1-x_0)}\\
&= \frac{x_1f(x_2)-x_1f(x_1)-x_0f(x_2)+x_0f(x_1)-(x_2f(x_1)-x_2f(x_0)-x_1f(x_1)+x_1f(x_0))}{(x_2-x_1)(x_2-x_0)(x_1-x_0)}\\
&= \frac{x_1f(x_2)-x_0f(x_2)+x_0f(x_1)-x_2f(x_1)+x_2f(x_0)-x_1f(x_0)}{(x_2-x_1)(x_2-x_0)(x_1-x_0)}\\
&= \frac{f(x_2)(x_1-x_0) + f(x_1)(x_0-x_2) + f(x_0)(x_2-x_1)}{(x_2-x_1)(x_2-x_0)(x_1-x_0)}
\end{aligned}
( 1.4 ) = ( x 2 − x 1 ) ( x 2 − x 0 ) f ( x 2 ) − f ( x 1 ) − ( x 1 − x 0 ) ( x 2 − x 0 ) f ( x 1 ) − f ( x 0 ) = ( x 2 − x 1 ) ( x 2 − x 0 ) ( x 1 − x 0 ) ( x 1 − x 0 ) ( f ( x 2 ) − f ( x 1 )) − ( x 2 − x 1 ) ( f ( x 1 ) − f ( x 0 )) = ( x 2 − x 1 ) ( x 2 − x 0 ) ( x 1 − x 0 ) x 1 f ( x 2 ) − x 1 f ( x 1 ) − x 0 f ( x 2 ) + x 0 f ( x 1 ) − ( x 2 f ( x 1 ) − x 2 f ( x 0 ) − x 1 f ( x 1 ) + x 1 f ( x 0 )) = ( x 2 − x 1 ) ( x 2 − x 0 ) ( x 1 − x 0 ) x 1 f ( x 2 ) − x 0 f ( x 2 ) + x 0 f ( x 1 ) − x 2 f ( x 1 ) + x 2 f ( x 0 ) − x 1 f ( x 0 ) = ( x 2 − x 1 ) ( x 2 − x 0 ) ( x 1 − x 0 ) f ( x 2 ) ( x 1 − x 0 ) + f ( x 1 ) ( x 0 − x 2 ) + f ( x 0 ) ( x 2 − x 1 )
可见 ( 1.3 ) ⟺ ( 1.4 ) (1.3) \iff (1.4) ( 1.3 ) ⟺ ( 1.4 ) 。
而由定义可得
F ( x 2 , x 1 ) = f ( x 2 ) − f ( x 1 ) x 2 − x 1 F(x_2, x_1) = \frac{f(x_2) - f(x_1)}{x_2 - x_1}
F ( x 2 , x 1 ) = x 2 − x 1 f ( x 2 ) − f ( x 1 )
所以根据( 1.4 ) (1.4) ( 1.4 ) ,我们可以把 a 2 a_2 a 2 写成
a 2 ≜ F ( x 0 , x 1 , x 2 ) = F ( x 1 , x 2 ) − F ( x 0 , x 1 ) x 2 − x 0 a_2 \triangleq F(x_0, x_1, x_2) = \frac{F(x_1, x_2) - F(x_0, x_1)}{x_2-x_0}
a 2 ≜ F ( x 0 , x 1 , x 2 ) = x 2 − x 0 F ( x 1 , x 2 ) − F ( x 0 , x 1 )
这就是上面给出的形式。
(所以怎么直接由( 1.3 ) (1.3) ( 1.3 ) 推出( 1.4 ) (1.4) ( 1.4 ) ……求大神评论区指点。我自己也会想想办法的。)
牛顿差商的性质
线性叠加:
利用数学归纳法可以证明:F ( x 0 , x 1 , . . . , x m ) = ∑ j = 0 m f ( x j ) ( x j − x 0 ) ⋯ ( x j − x j − 1 ) ( x j − x j + 1 ) ⋯ ( x j − x m ) F(x_0, x_1, ..., x_m) = \sum^m_{j=0}\frac{f(x_j)}{(x_j-x_0)\cdots(x_j-x_{j-1})(x_j-x_{j+1})\cdots(x_j-x_m)}
F ( x 0 , x 1 , ... , x m ) = j = 0 ∑ m ( x j − x 0 ) ⋯ ( x j − x j − 1 ) ( x j − x j + 1 ) ⋯ ( x j − x m ) f ( x j )
线性性:
若h ( x ) = α f ( x ) + β g ( x ) h(x) = \alpha f(x) + \beta g(x) h ( x ) = α f ( x ) + β g ( x ) ,则:
H ( x 0 , . . . , x n ) = α F ( x 0 , . . . , x n ) + β G ( x 0 , . . . , x n ) H(x_0,...,x_n) = \alpha F(x_0,...,x_n) + \beta G(x_0,...,x_n)
H ( x 0 , ... , x n ) = α F ( x 0 , ... , x n ) + βG ( x 0 , ... , x n )
对称性
差商值与节点排列顺序无关:
F ( x 0 , x 1 , . . . , x n ) = F ( x σ ( 0 ) , x σ ( 1 ) , . . . , x σ ( n ) ) F(x_0,x_1,...,x_n) = F(x_{\sigma(0)},x_{\sigma(1)},...,x_{\sigma(n)})
F ( x 0 , x 1 , ... , x n ) = F ( x σ ( 0 ) , x σ ( 1 ) , ... , x σ ( n ) )
其中σ \sigma σ 是任意排列
差商和导数关系:
若 f ( x ) ∈ C n [ a , b ] f(x)\in C^n[a,b] f ( x ) ∈ C n [ a , b ] ,则存在 ξ ∈ ( a , b ) \xi\in(a,b) ξ ∈ ( a , b ) 使得:
F ( x 0 , . . . , x n ) = f ( n ) ( ξ ) n ! F(x_0,...,x_n) = \frac{f^{(n)}(\xi)}{n!}
F ( x 0 , ... , x n ) = n ! f ( n ) ( ξ )
差商表可加性:
新增节点x n + 1 x_{n+1} x n + 1 时:
F ( x 0 , . . . , x n + 1 ) = F ( x 1 , . . . , x n + 1 ) − F ( x 0 , . . . , x n ) x n + 1 − x 0 F(x_0,...,x_{n+1}) = \frac{F(x_1,...,x_{n+1}) - F(x_0,...,x_n)}{x_{n+1}-x_0}
F ( x 0 , ... , x n + 1 ) = x n + 1 − x 0 F ( x 1 , ... , x n + 1 ) − F ( x 0 , ... , x n )
其中F ( x 1 , . . . , x n + 1 ) F(x_1,...,x_{n+1}) F ( x 1 , ... , x n + 1 ) 可由性质1算出。
代码实现
1 def P_n (x_variables, x_data, y_data )
龙格(Runge)现象
指在高次多项式插值中,随着插值节点数量的增加,插值结果在区间端点附近出现剧烈振荡的现象。这种现象由德国数学家Carl Runge在研究多项式插值时首次发现。
解决方法:多次线性插值
将插值区间划分为若干子区间,在每个子区间上用线性多项式 进行插值的方法。给定节点( x 0 , y 0 ) , ( x 1 , y 1 ) , . . . , ( x n , y n ) (x_0,y_0),(x_1,y_1),...,(x_n,y_n) ( x 0 , y 0 ) , ( x 1 , y 1 ) , ... , ( x n , y n ) ,我们构造的插值函数应该满足:
S ( x i ) = y i S(x_i) = y_i S ( x i ) = y i (通过所有节点)
S ( x ) S(x) S ( x ) 在每个[ x i , x i + 1 ] [x_i,x_{i+1}] [ x i , x i + 1 ] 上是线性函数
整体函数连续(C 0 C^0 C 0 连续)
具体实现步骤:
找到待插值点x x x 及其所在的区间[ x k , x k + 1 ] [x_k,x_{k+1}] [ x k , x k + 1 ]
计算:P 1 ( x ) = x − x k + 1 x k − x k + 1 y k + x − x k x k + 1 − x k y k + 1 P_1(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} P 1 ( x ) = x k − x k + 1 x − x k + 1 y k + x k + 1 − x k x − x k y k + 1 (参照拉格朗日插值的形式)
缺陷:C 1 C^1 C 1 不连续,无法保证插值节点的光滑性。
样条插值
样条插值(Spline Interpolation)是一种分段低次多项式插值 方法,通过强制拼接点处的光滑条件来保证整体曲线的平滑性。(相当于多次线性插值的一种解决方案)
原理
插值函数需要满足:
S i ( x i ) = y i S_i(x_i)=y_i S i ( x i ) = y i , S i ( x i + 1 ) = y i + 1 S_i(x_{i+1})=y_{i+1} S i ( x i + 1 ) = y i + 1 (插值条件)
连续性:
C 0 C^0 C 0 : S i − 1 ( x i ) = S i ( x i ) S_{i-1}(x_i) = S_i(x_i) S i − 1 ( x i ) = S i ( x i )
C 1 C^1 C 1 : S i − 1 ′ ( x i ) = S i ′ ( x i ) S'_{i-1}(x_i) = S'_i(x_i) S i − 1 ′ ( x i ) = S i ′ ( x i )
C 2 C^2 C 2 : S i − 1 ′ ′ ( x i ) = S i ′ ′ ( x i ) S''_{i-1}(x_i) = S''_i(x_i) S i − 1 ′′ ( x i ) = S i ′′ ( x i )
最常用:三次样条插值函数,即在每段[ x i , x i + 1 ] [x_i,x_{i+1}] [ x i , x i + 1 ] 上构造:
S i ( x ) = a i + b i ( x − x i ) + c i ( x − x i ) 2 + d i ( x − x i ) 3 S_i(x) = a_i + b_i(x-x_i) + c_i(x-x_i)^2 + d_i(x-x_i)^3
S i ( x ) = a i + b i ( x − x i ) + c i ( x − x i ) 2 + d i ( x − x i ) 3
对n + 1 n+1 n + 1 个插值点,总共有n n n 个区间,那么总参数有4 n 4n 4 n 个。
约束条件(加起来一共4 n 4n 4 n 个):
插值条件:提供 n + 1 n+1 n + 1 个
连续性:提供 3 ( n − 1 ) 3(n-1) 3 ( n − 1 ) 个
边界条件:提供2个
边界条件还能分为以下三种情况:
第一类边界条件:一阶导数值指定,即S ′ ( x 0 ) = y 0 ′ S'(x_0)=y'_0 S ′ ( x 0 ) = y 0 ′ ,S ′ ( x n ) = y n ′ S'(x_n)=y'_n S ′ ( x n ) = y n ′
第二类边界条件:二阶导数值指定,即S ′ ′ ( x 0 ) = y 0 ′ ′ S''(x_0)=y''_0 S ′′ ( x 0 ) = y 0 ′′ ,S ′ ′ ( x n ) = y n ′ ′ S''(x_n)=y''_n S ′′ ( x n ) = y n ′′
自然边界条件:S ′ ′ ( x 0 ) = S ′ ′ ( x n ) = 0 S''(x_0)=S''(x_n)=0 S ′′ ( x 0 ) = S ′′ ( x n ) = 0
周期性边界条件:S ′ ( x 0 ) = S ′ ( x n ) S'(x_0)=S'(x_n) S ′ ( x 0 ) = S ′ ( x n ) ,S ′ ′ ( x 0 ) = S ′ ′ ( x n ) S''(x_0)=S''(x_n) S ′′ ( x 0 ) = S ′′ ( x n )
求解步骤
以上面提到的三次样条插值为例,对于x ∈ [ x k , x k + 1 ) x \in [x_k, x_{k+1}) x ∈ [ x k , x k + 1 ) :
S k ( x ) = a k + b k h + c k h 2 + d k h 3 ( h = x − x k ) S k ′ ( x ) = b k + 2 c k h + 3 d k h 2 S k ′ ′ ( x ) = 2 c k + 6 d k h \begin{aligned}
S_k(x) &= a_k + b_k h + c_k h^2 + d_k h^3 \quad (h = x-x_k) \\
S'_k(x) &= b_k + 2c_k h + 3d_k h^2 \\
S''_k(x) &= 2c_k + 6d_k h
\end{aligned}
S k ( x ) S k ′ ( x ) S k ′′ ( x ) = a k + b k h + c k h 2 + d k h 3 ( h = x − x k ) = b k + 2 c k h + 3 d k h 2 = 2 c k + 6 d k h
应满足条件:
S k ( x k ) = y k ⇒ a k = y k S_k(x_k) = y_k \Rightarrow a_k = y_k S k ( x k ) = y k ⇒ a k = y k (插值条件)
S k ( x k + 1 ) = y k + 1 ⇒ a k + h k b k + h k 2 c k + h k 3 d k = y k + 1 S_k(x_{k+1}) = y_{k+1} \Rightarrow a_k + h_k b_k + h_k^2 c_k + h_k^3 d_k = y_{k+1} S k ( x k + 1 ) = y k + 1 ⇒ a k + h k b k + h k 2 c k + h k 3 d k = y k + 1 (其中 h k = x k + 1 − x k h_k = x_{k+1}-x_k h k = x k + 1 − x k )( C 0 C^0 C 0 连续性条件)
b k + 2 h k c k + 3 h k 2 d k = b k + 1 b_k + 2h_k c_k + 3h_k^2 d_k = b_{k+1} b k + 2 h k c k + 3 h k 2 d k = b k + 1 ( C 1 C^1 C 1 连续性条件)
2 c k + 6 h k d k = 2 c k + 1 2c_k + 6h_k d_k = 2c_{k+1} 2 c k + 6 h k d k = 2 c k + 1 ( C 2 C^2 C 2 连续性条件)
求解该方程组:
令 m k = 2 c k m_k = 2c_k m k = 2 c k ,则
由二阶导数连续条件:d k = m k + 1 − m k 6 h k d_k = \frac{m_{k+1}-m_k}{6h_k}
d k = 6 h k m k + 1 − m k
代入C 0 C^0 C 0 连续性条件得:b k = y k + 1 − y k h k − h k 2 m k − h k 6 ( m k + 1 − m k ) b_k = \frac{y_{k+1}-y_k}{h_k} - \frac{h_k}{2}m_k - \frac{h_k}{6}(m_{k+1}-m_k)
b k = h k y k + 1 − y k − 2 h k m k − 6 h k ( m k + 1 − m k )
将上式代入C 1 C^1 C 1 连续条件,整理得到:
h k m k + 2 ( h k + h k + 1 ) m k + 1 + h k + 1 m k + 2 = 6 ( y k + 2 − y k + 1 h k + 1 − y k + 1 − y k h k ) h_k m_k + 2(h_k+h_{k+1})m_{k+1} + h_{k+1}m_{k+2} = 6\left(\frac{y_{k+2}-y_{k+1}}{h_{k+1}} - \frac{y_{k+1}-y_k}{h_k}\right)
h k m k + 2 ( h k + h k + 1 ) m k + 1 + h k + 1 m k + 2 = 6 ( h k + 1 y k + 2 − y k + 1 − h k y k + 1 − y k )
加上两个边界条件的约束 ⇒ \Rightarrow ⇒ 建立线性方程组求解m k m_k m k ,m k + 1 m_{k+1} m k + 1 ,m k + 2 m_{k+2} m k + 2 以及对应的系数 a k a_k a k ,b k b_k b k ,c k c_k c k ,d k d_k d k 。
举例
例如,在 S ′ ′ ( x 0 ) = S ′ ′ ( x n ) = 0 S''(x_0) = S''(x_n) = 0 S ′′ ( x 0 ) = S ′′ ( x n ) = 0 的自然边界条件下,(等会再给个详细的整理过程)
( 1 0 0 0 ⋯ 0 h 0 2 ( h 0 + h 1 ) h 1 0 ⋯ 0 0 h 1 2 ( h 1 + h 2 ) h 2 ⋯ 0 ⋮ ⋮ ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ h n − 2 2 ( h n − 2 + h n − 1 ) h n − 1 0 0 ⋯ 0 0 1 ) ( m 0 m 1 m 2 ⋮ m n − 1 m n ) = 6 ( y 2 − y 1 h 1 − y 1 − y 0 h 0 y 3 − y 2 h 2 − y 2 − y 1 h 1 ⋮ y n − y n − 1 h n − 1 − y n − 1 − y n − 2 h n − 2 0 ) \begin{pmatrix}
1 & 0 & 0 & 0 & \cdots & 0 \\
h_0 & 2(h_0 + h_1) & h_1 & 0 & \cdots & 0 \\
0 & h_1 & 2(h_1 + h_2) & h_2 & \cdots & 0 \\
\vdots & \vdots & \vdots & \vdots & \ddots & \vdots \\
0 & 0 & \cdots & h_{n-2} & 2(h_{n-2} + h_{n-1}) & h_{n-1} \\
0 & 0 & \cdots & 0 & 0 & 1
\end{pmatrix}
\begin{pmatrix}
m_0 \\
m_1 \\
m_2 \\
\vdots \\
m_{n-1} \\
m_n
\end{pmatrix}
= 6
\begin{pmatrix}
\frac{y_2 - y_1}{h_1} - \frac{y_1 - y_0}{h_0} \\
\frac{y_3 - y_2}{h_2} - \frac{y_2 - y_1}{h_1} \\
\vdots \\
\frac{y_n - y_{n-1}}{h_{n-1}} - \frac{y_{n-1} - y_{n-2}}{h_{n-2}} \\
0
\end{pmatrix}
1 h 0 0 ⋮ 0 0 0 2 ( h 0 + h 1 ) h 1 ⋮ 0 0 0 h 1 2 ( h 1 + h 2 ) ⋮ ⋯ ⋯ 0 0 h 2 ⋮ h n − 2 0 ⋯ ⋯ ⋯ ⋱ 2 ( h n − 2 + h n − 1 ) 0 0 0 0 ⋮ h n − 1 1 m 0 m 1 m 2 ⋮ m n − 1 m n = 6 h 1 y 2 − y 1 − h 0 y 1 − y 0 h 2 y 3 − y 2 − h 1 y 2 − y 1 ⋮ h n − 1 y n − y n − 1 − h n − 2 y n − 1 − y n − 2 0
可以利用Gauss消元法 / LU分解法 / Gauss-Seidel迭代法求解上述矩阵。
代码实现
数据拟合
数据拟合是通过数学模型近似描述离散数据点的方法,与插值的区别在于:
插值:强制通过所有数据点
拟合:允许存在偏差,追求整体趋势匹配
基本思想:偏差最小化。
设逼近函数ϕ ( x ) \phi(x) ϕ ( x ) 和真实数据y i y_i y i (i = 1 , 2 , . . . , n i=1, 2, ..., n i = 1 , 2 , ... , n )。则最小化偏差可以由以下方式定义:
L 1 范数(绝对偏差和): min ∑ i = 1 n ∣ ϕ ( x i ) − y i ∣ L 2 范数(平方偏差和): min ∑ i = 1 n ( ϕ ( x i ) − y i ) 2 L ∞ 范数(最大偏差): min max 1 ≤ i ≤ n ∣ ϕ ( x i ) − y i ∣ L_1\text{范数(绝对偏差和)}:\min \sum_{i=1}^n |\phi(x_i) - y_i|\\
L_2\text{范数(平方偏差和)}:\min \sum_{i=1}^n (\phi(x_i) - y_i)^2\\
L_{\infty}\text{范数(最大偏差)}:\min {\max_{1 \leq i \leq n}|\phi(x_i) - y_i|}
L 1 范数(绝对偏差和) : min i = 1 ∑ n ∣ ϕ ( x i ) − y i ∣ L 2 范数(平方偏差和) : min i = 1 ∑ n ( ϕ ( x i ) − y i ) 2 L ∞ 范数(最大偏差) : min 1 ≤ i ≤ n max ∣ ϕ ( x i ) − y i ∣
最小二乘法拟合
数学原理:最小化残差平方和
min ∑ i = 1 n ( y i − f ( x i ) ) 2 \min \sum_{i=1}^n (y_i - f(x_i))^2
min i = 1 ∑ n ( y i − f ( x i ) ) 2
线性拟合
考虑f ( x ) = a + b x f(x) = a + bx f ( x ) = a + b x 。
∴ \therefore ∴ 残差平方和:Q ( a , b ) = ∑ i = 1 n ( f ( x i ) − y i ) 2 = ∑ i = 1 n ( a + b x i − y i ) 2 Q(a,b) = \sum_{i=1}^n (f(x_i) - y_i)^2 = \sum_{i=1}^n (a + b x_i - y_i)^2 Q ( a , b ) = ∑ i = 1 n ( f ( x i ) − y i ) 2 = ∑ i = 1 n ( a + b x i − y i ) 2
为使 Q ( a , b ) Q(a, b) Q ( a , b ) 最小,需满足:
{ ∂ Q ∂ a = 2 ∑ i = 1 n ( a + b x i − y i ) = 0 ∂ Q ∂ b = 2 ∑ i = 1 n ( a + b x i − y i ) x i = 0 \begin{cases}
\frac{\partial Q}{\partial a} = 2\sum_{i=1}^n (a + b x_i - y_i) = 0\\
\frac{\partial Q}{\partial b} = 2\sum_{i=1}^n (a + b x_i - y_i)x_i = 0
\end{cases}
{ ∂ a ∂ Q = 2 ∑ i = 1 n ( a + b x i − y i ) = 0 ∂ b ∂ Q = 2 ∑ i = 1 n ( a + b x i − y i ) x i = 0
将方程组整理为矩阵形式:
( n ∑ x i ∑ x i ∑ x i 2 ) ( a b ) = ( ∑ y i ∑ x i y i ) \begin{pmatrix}
n & \sum x_i \\
\sum x_i & \sum x_i^2
\end{pmatrix}
\begin{pmatrix}
a \\
b
\end{pmatrix}
=
\begin{pmatrix}
\sum y_i \\
\sum x_i y_i
\end{pmatrix}
( n ∑ x i ∑ x i ∑ x i 2 ) ( a b ) = ( ∑ y i ∑ x i y i )
求解( a , b ) (a, b) ( a , b ) 即可。(同前,可以用Gauss消元法 / LU分解法 / Gauss-Seidel迭代法)
多项式拟合
k次多项式模型:
f ( x ) = ∑ j = 0 k a j x j = a 0 + a 1 x + a 2 x 2 + . . . + a k x k f(x) = \sum_{j=0}^k a_j x^j = a_0 + a_1 x + a_2 x^2 + ... + a_k x^k
f ( x ) = j = 0 ∑ k a j x j = a 0 + a 1 x + a 2 x 2 + ... + a k x k
残差表达式
Q ( a 0 , a 1 , . . . , a k ) = ∑ i = 1 n ( a 0 + a 1 x i + a 2 x i 2 + . . . + a k x i k − y i ) 2 Q(a_0, a_1, ..., a_k) = \sum_{i=1}^n(a_0 + a_1 x_i + a_2 x_i^2 + ... + a_k x_i^k - y_i)^2
Q ( a 0 , a 1 , ... , a k ) = i = 1 ∑ n ( a 0 + a 1 x i + a 2 x i 2 + ... + a k x i k − y i ) 2
对系数求导:
{ ∂ Q ∂ a 0 = 2 ∑ i = 1 n ( a 0 + a 1 x i + a 2 x i 2 + . . . + a k x i k − y i ) = 0 ∂ Q ∂ a 1 = 2 ∑ i = 1 n ( a 0 + a 1 x i + a 2 x i 2 + . . . + a k x i k − y i ) ⋅ x i = 0 ∂ Q ∂ a 2 = 2 ∑ i = 1 n ( a 0 + a 1 x i + a 2 x i 2 + . . . + a k x i k − y i ) ⋅ x i 2 = 0 ⋮ ∂ Q ∂ a k = 2 ∑ i = 1 n ( a 0 + a 1 x i + a 2 x i 2 + . . . + a k x i k − y i ) ⋅ x i k = 0 \begin{cases}
\frac{\partial Q}{\partial a_0} = 2 \sum_{i=1}^n(a_0 + a_1 x_i + a_2 x_i^2 + ... + a_k x_i^k - y_i) = 0\\
\frac{\partial Q}{\partial a_1} = 2 \sum_{i=1}^n (a_0 + a_1 x_i + a_2 x_i^2 + ... + a_k x_i^k - y_i) \cdot x_i = 0\\
\frac{\partial Q}{\partial a_2} = 2 \sum_{i=1}^n (a_0 + a_1 x_i + a_2 x_i^2 + ... + a_k x_i^k - y_i) \cdot x_i^2 = 0\\
\vdots\\
\frac{\partial Q}{\partial a_k} = 2 \sum_{i=1}^n (a_0 + a_1 x_i + a_2 x_i^2 + ... + a_k x_i^k - y_i) \cdot x_i^k = 0
\end{cases}
⎩ ⎨ ⎧ ∂ a 0 ∂ Q = 2 ∑ i = 1 n ( a 0 + a 1 x i + a 2 x i 2 + ... + a k x i k − y i ) = 0 ∂ a 1 ∂ Q = 2 ∑ i = 1 n ( a 0 + a 1 x i + a 2 x i 2 + ... + a k x i k − y i ) ⋅ x i = 0 ∂ a 2 ∂ Q = 2 ∑ i = 1 n ( a 0 + a 1 x i + a 2 x i 2 + ... + a k x i k − y i ) ⋅ x i 2 = 0 ⋮ ∂ a k ∂ Q = 2 ∑ i = 1 n ( a 0 + a 1 x i + a 2 x i 2 + ... + a k x i k − y i ) ⋅ x i k = 0
整理:
{ a 0 ∑ 1 + a 1 ∑ x i + ⋯ + a k ∑ x i k = ∑ y i a 0 ∑ x i + a 1 ∑ x i 2 + ⋯ + a k ∑ x i k + 1 = ∑ x i y i ⋮ a 0 ∑ x i k + a 1 ∑ x i k + 1 + ⋯ + a k ∑ x i 2 k = ∑ x i k y i \begin{cases}
a_0 \sum 1 + a_1 \sum x_i + \cdots + a_k \sum x_i^k = \sum y_i \\
a_0 \sum x_i + a_1 \sum x_i^2 + \cdots + a_k \sum x_i^{k+1} = \sum x_i y_i \\
\vdots \\
a_0 \sum x_i^k + a_1 \sum x_i^{k+1} + \cdots + a_k \sum x_i^{2k} = \sum x_i^k y_i
\end{cases}
⎩ ⎨ ⎧ a 0 ∑ 1 + a 1 ∑ x i + ⋯ + a k ∑ x i k = ∑ y i a 0 ∑ x i + a 1 ∑ x i 2 + ⋯ + a k ∑ x i k + 1 = ∑ x i y i ⋮ a 0 ∑ x i k + a 1 ∑ x i k + 1 + ⋯ + a k ∑ x i 2 k = ∑ x i k y i
整理成矩阵形式:
( n ∑ x i ⋯ ∑ x i k ∑ x i ∑ x i 2 ⋯ ∑ x i k + 1 ⋮ ⋮ ⋱ ⋮ ∑ x i k ∑ x i k + 1 ⋯ ∑ x i 2 k ) ( a 0 a 1 ⋮ a k ) = ( ∑ y i ∑ x i y i ⋮ ∑ x i k y i ) \begin{pmatrix}
n & \sum x_i & \cdots & \sum x_i^k\\
\sum x_i & \sum x_i^2 & \cdots & \sum x_i^{k+1} \\
\vdots & \vdots & \ddots & \vdots \\
\sum x_i^k & \sum x_i^{k+1} & \cdots & \sum x_i^{2k}
\end{pmatrix}
\begin{pmatrix}
a_0 \\
a_1 \\
\vdots \\
a_k
\end{pmatrix}
=
\begin{pmatrix}
\sum y_i \\
\sum x_i y_i \\
\vdots \\
\sum x_i^k y_i
\end{pmatrix}
n ∑ x i ⋮ ∑ x i k ∑ x i ∑ x i 2 ⋮ ∑ x i k + 1 ⋯ ⋯ ⋱ ⋯ ∑ x i k ∑ x i k + 1 ⋮ ∑ x i 2 k a 0 a 1 ⋮ a k = ∑ y i ∑ x i y i ⋮ ∑ x i k y i
求解即可。
非线性拟合
模型类型
变换方法
线性形式
指数模型 y = a e b x y=ae^{bx} y = a e b x
取对数
ln y = ln a + b x \ln y = \ln a + bx ln y = ln a + b x
幂函数 y = a x b y=ax^b y = a x b
取对数
ln y = ln a + b ln x \ln y = \ln a + b\ln x ln y = ln a + b ln x
?对数模型 y = a ln x + b y=a\ln x + b y = a ln x + b
-
直接拟合
倒数模型 y = x a + b x y = \frac{x}{a+bx} y = a + b x x
取倒数
1 y = a x + b \frac{1}{y} = \frac{a}{x} + b y 1 = x a + b
容易出现的问题:欠拟合&过拟合。(有机器学习基础的应该都了解……不解释了。)
数值微分
利用离散的点进行数值微分。
Case 1:非边界点微分值的计算
假设数据点均匀分布,x i = x 0 + i ⋅ h x_i = x_0 + i \cdot h x i = x 0 + i ⋅ h ,在x i − 1 x_{i-1} x i − 1 、x i x_i x i 、x i + 1 x_{i+1} x i + 1 附近Taylor展开:
f i + 1 = f i + h f i ′ + h 2 2 f i ′ ′ + h 3 6 f i ′ ′ ′ + O ( h 4 ) f_{i+1} = f_i + h f'_i + \frac{h^2}{2} f''_i + \frac{h^3}{6} f'''_i + O(h^4)
f i + 1 = f i + h f i ′ + 2 h 2 f i ′′ + 6 h 3 f i ′′′ + O ( h 4 )
f i − 1 = f i − h f i ′ + h 2 2 f i ′ ′ − h 3 6 f i ′ ′ ′ + O ( h 4 ) f_{i-1} = f_i - h f'_i + \frac{h^2}{2} f''_i - \frac{h^3}{6} f'''_i + O(h^4)
f i − 1 = f i − h f i ′ + 2 h 2 f i ′′ − 6 h 3 f i ′′′ + O ( h 4 )
就可以得到以下公式:
类型
公式
误差阶
前向差分
f ′ ( x ) ≈ f i + 1 − f i h f'(x) \approx \frac{f_{i+1}-f_i}{h} f ′ ( x ) ≈ h f i + 1 − f i
O ( h ) O(h) O ( h )
后向差分
f ′ ( x ) ≈ f i − f i − 1 h f'(x) \approx \frac{f_i-f_{i-1}}{h} f ′ ( x ) ≈ h f i − f i − 1
O ( h ) O(h) O ( h )
中心差分
f ′ ( x ) ≈ f i + 1 − f i − 1 2 h f'(x) \approx \frac{f_{i+1}-f_{i-1}}{2h} f ′ ( x ) ≈ 2 h f i + 1 − f i − 1
O ( h 2 ) O(h^2) O ( h 2 )
再在x i − 2 x_{i-2} x i − 2 、x i + 2 x_{i+2} x i + 2 处展开:
f i + 2 = f i + 2 h ⋅ f i ′ + 4 h 2 2 ! f i ′ ′ + 8 h 3 3 ! f i ′ ′ ′ + . . . f_{i+2} = f_i + 2h \cdot f_i' + \frac{4h^2}{2!} f_i'' + \frac{8h^3}{3!} f_i'''+...
f i + 2 = f i + 2 h ⋅ f i ′ + 2 ! 4 h 2 f i ′′ + 3 ! 8 h 3 f i ′′′ + ...
f i − 2 = f i − 2 h ⋅ f i ′ + 4 h 2 2 ! f i ′ ′ − 8 h 3 3 ! f i ′ ′ ′ + . . . f_{i-2} = f_i - 2h \cdot f_i' + \frac{4h^2}{2!} f_i'' - \frac{8h^3}{3!} f_i'''+...
f i − 2 = f i − 2 h ⋅ f i ′ + 2 ! 4 h 2 f i ′′ − 3 ! 8 h 3 f i ′′′ + ...
f i − 2 + 8 f i + 1 − f i + 2 − 8 f i − 1 f_{i-2}+8f_{i+1}-f_{i+2}-8f_{i-1} f i − 2 + 8 f i + 1 − f i + 2 − 8 f i − 1 消去 f i ′ ′ ′ f_i''' f i ′′′ 、f i ′ ′ f_i'' f i ′′ 和 f i f_i f i ,可得:
f i ′ = f i − 2 − 8 f i − 1 + 8 f i + 1 − f i + 2 12 h + O ( h 4 ) f'_i = \frac{f_{i-2}-8f_{i-1}+8f_{i+1}-f_{i+2}}{12h} + O(h^4)
f i ′ = 12 h f i − 2 − 8 f i − 1 + 8 f i + 1 − f i + 2 + O ( h 4 )
类似地,可以得到三点或五点的二阶微分:
f i ′ ′ = f i + 1 − 2 f i + f i − 1 h 2 + O ( h 2 ) f_i'' = \frac{f_{i+1} - 2f_i + f_{i-1}}{h^2} + O(h^2)
f i ′′ = h 2 f i + 1 − 2 f i + f i − 1 + O ( h 2 )
f i ′ ′ = − f i − 2 + 16 f i − 1 − 30 f i + 16 f i + 1 − f i + 2 12 h 2 + O ( h 4 ) f_i'' = \frac{-f_{i-2} + 16f_{i-1} - 30f_i + 16f_{i+1} - f_{i+2}}{12h^2} + O(h^4)
f i ′′ = 12 h 2 − f i − 2 + 16 f i − 1 − 30 f i + 16 f i + 1 − f i + 2 + O ( h 4 )
Case 2:边界点微分值的计算
以x 0 x_0 x 0 为例。
利用两点计算一阶微分:
f ′ ( x 0 ) = f 1 − f 0 h + O ( h ) f'(x_0) = \frac{f_1-f_0}{h} + O(h)
f ′ ( x 0 ) = h f 1 − f 0 + O ( h )
缺陷:精度只有O ( h ) O(h) O ( h ) 。
利用三点计算一阶微分:
{ f 0 = f 0 f 1 = f 0 + h ⋅ f 0 ′ + h 2 2 ! ⋅ f 0 ′ ′ + O ( h 3 ) f 2 = f 0 + 2 h ⋅ f 0 ′ + 4 h 2 2 ! ⋅ f 0 ′ ′ + O ( h 3 ) \begin{cases}
f_0 = f_0\\
f_1 = f_0 + h \cdot f_0' + \frac{h^2}{2!} \cdot f_0'' + O(h^3)\\
f_2 = f_0 + 2h \cdot f_0' + \frac{4h^2}{2!} \cdot f_0'' + O(h^3)
\end{cases}
⎩ ⎨ ⎧ f 0 = f 0 f 1 = f 0 + h ⋅ f 0 ′ + 2 ! h 2 ⋅ f 0 ′′ + O ( h 3 ) f 2 = f 0 + 2 h ⋅ f 0 ′ + 2 ! 4 h 2 ⋅ f 0 ′′ + O ( h 3 )
通过他们的线性组合将 f 0 ′ ′ f_0'' f 0 ′′ 消去,我们可以有:
f 0 ′ = 4 f 1 − 3 f 0 − f 2 2 h + O ( h 2 ) f_0' = \frac{4f_1 - 3f_0 - f_2}{2h} + O(h^2)
f 0 ′ = 2 h 4 f 1 − 3 f 0 − f 2 + O ( h 2 )
同理,x n x_n x n 处利用三点计算一阶微分:
f n ′ = 3 f n + f n − 2 − 4 f n − 1 2 h + O ( h 2 ) f_n' = \frac{3f_n + f_{n-2} - 4f_{n-1}}{2h} + O(h^2)
f n ′ = 2 h 3 f n + f n − 2 − 4 f n − 1 + O ( h 2 )
数值积分
实际中常见情况:f ( x ) f(x) f ( x ) 表达式未知,仅以离散点列 ( x i , f ( x i ) ) (x_i,f(x_i)) ( x i , f ( x i )) 给出 or 很难求出 f ( x ) f(x) f ( x ) 的原函数。
⇒ \Rightarrow ⇒ 可以用分割小区间再数值求和的方法求解积分。
由前面知识可知,拉格朗日插值L n ( x ) = ∑ k = 0 n l k ( x ) ⋅ f ( x k ) L_n(x) = \sum_{k=0}^n l_k(x) \cdot f(x_k) L n ( x ) = ∑ k = 0 n l k ( x ) ⋅ f ( x k ) ,其中 l k ( x ) l_k(x) l k ( x ) 为插值基函数。用 L n ( x ) L_n(x) L n ( x ) 代替 f ( x ) f(x) f ( x ) 可得:
I ( f ) = ∫ a b f ( x ) d x = f ( x ) 换成 L n ( x ) ∫ a b L n ( x ) d x = ∫ a b ∑ k = 0 n l k ( x ) f ( x k ) d x I(f) = \int_a^b f(x) \text{d}x \overset{f(x)换成L_n(x)}{=} \int_{a}^{b} L_n(x) \text{d}x = \int_{a}^{b} \sum_{k=0}^{n} l_k(x) f(x_k) \text{d}x
I ( f ) = ∫ a b f ( x ) d x = f ( x ) 换成 L n ( x ) ∫ a b L n ( x ) d x = ∫ a b k = 0 ∑ n l k ( x ) f ( x k ) d x
这里的积分与求和可以交换顺序(别问我为什么……我不是学数学的):
∫ a b ∑ k = 0 n l k ( x ) f ( x k ) d x = ∑ i = 0 n [ ∫ a b l i ( x ) d x ] f ( x i ) = ∑ i = 0 n α i f ( x i ) \int_{a}^{b} \sum_{k=0}^{n} l_k(x) f(x_k) \text{d}x = \sum_{i=0}^{n} \left[ \int_{a}^{b} l_i(x) dx \right] f(x_i) = \sum_{i=0}^{n} \alpha_i f(x_i)
∫ a b k = 0 ∑ n l k ( x ) f ( x k ) d x = i = 0 ∑ n [ ∫ a b l i ( x ) d x ] f ( x i ) = i = 0 ∑ n α i f ( x i )
此时 x i x_i x i 是求积分节点,α i \alpha_i α i 是求积分系数。
Newton-Cotes积分方法: 对积分区间 [ a , b ] [a,b] [ a , b ] 作 n n n 等分,步长 h = b − a n h = \frac{b-a}{n} h = n b − a 进行积分节点构造。
非复化数值积分
下面就以Newton-Cotes积分方法为例,查看一阶、二阶和多阶插值下的计算情况。
一阶梯形积分:我们知道两点插值 (n = 1 n=1 n = 1 )
L 1 ( x ) = l 0 ( x ) y 0 + l 1 ( x ) y 1 = x − x 1 x 0 − x 1 ⋅ y 0 + x − x 0 x 1 − x 0 ⋅ y 1 L_1(x) = l_0(x)y_0 + l_1(x)y_1 = \frac{x-x_1}{x_0-x_1} \cdot y_0 + \frac{x-x_0}{x_1-x_0} \cdot y_1
L 1 ( x ) = l 0 ( x ) y 0 + l 1 ( x ) y 1 = x 0 − x 1 x − x 1 ⋅ y 0 + x 1 − x 0 x − x 0 ⋅ y 1
代回积分表达式:
∫ a b f ( x ) d x = ∫ a b L 1 ( x ) d x = ∫ a b ∑ i = 0 1 l i ( x ) f ( x i ) d x = ∫ a b l 0 ( x ) d x ⋅ f ( a ) + ∫ a b l 1 ( x ) d x ⋅ f ( b ) = b − a 2 [ f ( a ) + f ( b ) ] \begin{aligned}
\int_a^b f(x) \text{d}x = \int_a^b L_1(x) \text{d}x &= \int_a^b \sum_{i=0}^1 l_i(x) f(x_i) \text{d}x\\
&= \int_a^b l_0(x) \text{d}x \cdot f(a) + \int_a^b l_1(x) \text{d}x \cdot f(b)\\
&= \frac{b - a}{2} \left[ f(a) + f(b) \right]
\end{aligned}
∫ a b f ( x ) d x = ∫ a b L 1 ( x ) d x = ∫ a b i = 0 ∑ 1 l i ( x ) f ( x i ) d x = ∫ a b l 0 ( x ) d x ⋅ f ( a ) + ∫ a b l 1 ( x ) d x ⋅ f ( b ) = 2 b − a [ f ( a ) + f ( b ) ]
【 这里计算一下∫ a b l 0 ( x ) d x \int_a^b l_0(x) \text{d}x ∫ a b l 0 ( x ) d x :
∫ a b l 0 ( x ) d x = ∫ a b x − b a − b d x = 1 a − b ( x 2 2 − b x ) ∣ a b = 1 2 ( a − b ) ( b − a ) ( a − b ) \int_a^b l_0(x) \text{d}x = \int_a^b \frac{x-b}{a-b} \text{d}x = \frac{1}{a-b} (\frac{x^2}{2}-bx)\mid^b_a = \frac{1}{2(a-b)}(b-a)(a-b)
∫ a b l 0 ( x ) d x = ∫ a b a − b x − b d x = a − b 1 ( 2 x 2 − b x ) ∣ a b = 2 ( a − b ) 1 ( b − a ) ( a − b )
∫ a b l 1 ( x ) d x \int_a^b l_1(x) \text{d}x ∫ a b l 1 ( x ) d x 同理 】
误差公式前面也已得出:
R ( x ) = f ( x ) − P 1 ( x ) = f ′ ′ ( ξ ) 2 ( x − x 0 ) ( x − x 1 ) R(x) = f(x) - P_1(x) = \frac{f''(\xi)}{2}(x-x_0)(x-x_1)
R ( x ) = f ( x ) − P 1 ( x ) = 2 f ′′ ( ξ ) ( x − x 0 ) ( x − x 1 )
代入积分:
E 1 ( x ) = ∫ a b f ′ ′ ( ξ ) 2 ( x − a ) ( x − b ) d x = f ′ ′ ( ξ ) 2 ∫ a b ( x − a ) ( x − b ) d x = − f ′ ′ ( ξ ) 12 ( b − a ) 3 \begin{aligned}
E_1(x) &= \int_a^b \frac{f''(\xi)}{2}(x - a)(x - b) \text{d}x\\
&= \frac{f''(\xi)}{2} \int_a^b (x - a)(x - b) \text{d}x = -\frac{f''(\xi)}{12}(b - a)^3
\end{aligned}
E 1 ( x ) = ∫ a b 2 f ′′ ( ξ ) ( x − a ) ( x − b ) d x = 2 f ′′ ( ξ ) ∫ a b ( x − a ) ( x − b ) d x = − 12 f ′′ ( ξ ) ( b − a ) 3
二阶辛普森(Simpson)积分:n = 2 n=2 n = 2 ,三点插值
L 2 ( x ) = l 0 ( x ) ⋅ y 0 + l 1 ( x ) ⋅ y 1 + l 2 ( x ) ⋅ y 2 = ( x − x 1 ) ( x − x 2 ) ( x 0 − x 1 ) ( x 0 − x 2 ) y 0 + ( x − x 0 ) ( x − x 2 ) ( x 1 − x 0 ) ( x 1 − x 2 ) y 1 + ( x − x 0 ) ( x − x 1 ) ( x 2 − x 0 ) ( x 2 − x 1 ) y 2 \begin{aligned}
L_2(x) &= l_0(x) \cdot y_0 + l_1(x) \cdot y_1 + l_2(x) \cdot y_2\\
&= \frac{(x - x_1)(x - x_2)}{(x_0 - x_1)(x_0 - x_2)}y_0 + \frac{(x - x_0)(x - x_2)}{(x_1 - x_0)(x_1 - x_2)}y_1 + \frac{(x - x_0)(x - x_1)}{(x_2 - x_0)(x_2 - x_1)}y_2
\end{aligned}
L 2 ( x ) = l 0 ( x ) ⋅ y 0 + l 1 ( x ) ⋅ y 1 + l 2 ( x ) ⋅ y 2 = ( x 0 − x 1 ) ( x 0 − x 2 ) ( x − x 1 ) ( x − x 2 ) y 0 + ( x 1 − x 0 ) ( x 1 − x 2 ) ( x − x 0 ) ( x − x 2 ) y 1 + ( x 2 − x 0 ) ( x 2 − x 1 ) ( x − x 0 ) ( x − x 1 ) y 2
带入积分表达式:
∫ a b f ( x ) d x = ∫ a b L 2 ( x ) d x = ∫ a b ∑ i = 0 2 l i ( x ) f ( x i ) d x = ∫ a b l 0 ( x ) d x ⋅ f ( a ) + ∫ a b l 1 ( x ) d x ⋅ f ( a + b 2 ) + ∫ a b l 2 ( x ) d x ⋅ f ( b ) = b − a 6 [ f ( a ) + 4 f ( a + b 2 ) + f ( b ) ] \begin{aligned}
\int_a^b f(x) \text{d}x = \int_a^b L_2(x) \text{d}x &= \int_a^b \sum_{i=0}^2 l_i(x) f(x_i) \text{d}x\\
&= \int_a^b l_0(x) \text{d}x \cdot f(a) + \int_a^b l_1(x) \text{d}x \cdot f\left(\frac{a+b}{2}\right) + \int_a^b l_2(x) \text{d}x \cdot f(b)\\
&= \frac{b-a}{6} \left[ f(a) + 4f\left(\frac{a+b}{2}\right) + f(b) \right]
\end{aligned}
∫ a b f ( x ) d x = ∫ a b L 2 ( x ) d x = ∫ a b i = 0 ∑ 2 l i ( x ) f ( x i ) d x = ∫ a b l 0 ( x ) d x ⋅ f ( a ) + ∫ a b l 1 ( x ) d x ⋅ f ( 2 a + b ) + ∫ a b l 2 ( x ) d x ⋅ f ( b ) = 6 b − a [ f ( a ) + 4 f ( 2 a + b ) + f ( b ) ]
(这里的误差项我不确定课件上的是否正确……[ac01])
以此类推,可总结如下:(我懒得一一去算了……有空来填这个坑)
Step size ( h )
Common name
Formula
Error term
b − a b - a b − a
Trapezoidal rule
h 2 ( f 0 + f 1 ) \frac{h}{2}(f_0 + f_1) 2 h ( f 0 + f 1 )
− 1 12 h 3 f ′ ′ ( ξ ) -\frac{1}{12}h^3f''(\xi) − 12 1 h 3 f ′′ ( ξ )
b − a 2 \frac{b - a}{2} 2 b − a
Simpson’s rule
h 3 ( f 0 + 4 f 1 + f 2 ) \frac{h}{3}(f_0 + 4f_1 + f_2) 3 h ( f 0 + 4 f 1 + f 2 )
− 1 90 h 5 f ( 4 ) ( ξ ) -\frac{1}{90}h^5f^{(4)}(\xi) − 90 1 h 5 f ( 4 ) ( ξ )
b − a 3 \frac{b - a}{3} 3 b − a
Simpson’s 3/8 rule
3 h 8 ( f 0 + 3 f 1 + 3 f 2 + f 3 ) \frac{3h}{8}(f_0 + 3f_1 + 3f_2 + f_3) 8 3 h ( f 0 + 3 f 1 + 3 f 2 + f 3 )
− 3 80 h 5 f ( 4 ) ( ξ ) -\frac{3}{80}h^5f^{(4)}(\xi) − 80 3 h 5 f ( 4 ) ( ξ )
b − a 4 \frac{b - a}{4} 4 b − a
Boole’s rule
2 h 45 ( 7 f 0 + 32 f 1 + 12 f 2 + 32 f 3 + 7 f 4 ) \frac{2h}{45}(7f_0 + 32f_1 + 12f_2 + 32f_3 + 7f_4) 45 2 h ( 7 f 0 + 32 f 1 + 12 f 2 + 32 f 3 + 7 f 4 )
− 8 945 h 7 f ( 6 ) ( ξ ) -\frac{8}{945}h^7f^{(6)}(\xi) − 945 8 h 7 f ( 6 ) ( ξ )
复化数值积分
Runge现象:在高次多项式插值中,随着插值节点数量的增加,插值结果在区间端点附近出现剧烈振荡。(前面已经提过)
∴ \therefore ∴ 实际计算过程(复化数值积分思想):把积分区间分割成多个子区间,然后在每个子区间采用一阶梯形积分或二阶辛普森积分,再将所有子区间积分值加起来。
复化梯形积分:
对被积函数 f ( x ) f(x) f ( x ) 在积分区间 [ a , b ] [a, b] [ a , b ] 内作等距分割,h = b − a n h = \frac{b-a}{n} h = n b − a ,并且在每个区间内做线性插值,那么
∫ a b f ( x ) d x = ∑ i = 0 n ∫ x i x i + 1 f ( x ) d x = ∑ i = 0 n ∫ x i x i + 1 L 1 ( x ) + R n ( x ) d x = ∑ i = 0 n ( h 2 [ f ( x i ) + f ( x i + 1 ) ] − f ′ ′ ( η i ) h 3 12 ) = ∑ i = 0 n ( h 2 [ f ( x i ) + f ( x i + 1 ) ] − f ′ ′ ( η i ) h 3 12 ) ≈ h [ 1 2 f ( a ) + ∑ i = 1 n − 1 f ( x i ) + 1 2 f ( b ) ] \begin{aligned}
\int_{a}^{b} f(x) \text{d}x = \sum_{i=0}^{n} \int_{x_i}^{x_{i+1}} f(x) \text{d}x &= \sum_{i=0}^{n} \int_{x_i}^{x_{i+1}} L_1(x) + R_n(x) \text{d}x\\
&= \sum_{i=0}^{n} \left( \frac{h}{2} [f(x_i) + f(x_{i+1})] - f''(\eta_i) \frac{h^3}{12} \right)\\
&= \sum_{i=0}^{n} \left( \frac{h}{2} [f(x_i) + f(x_{i+1})] - f''(\eta_i) \frac{h^3}{12} \right)\\
&\approx h \left[ \frac{1}{2} f(a) + \sum_{i=1}^{n-1} f(x_i) + \frac{1}{2} f(b) \right]
\end{aligned}
∫ a b f ( x ) d x = i = 0 ∑ n ∫ x i x i + 1 f ( x ) d x = i = 0 ∑ n ∫ x i x i + 1 L 1 ( x ) + R n ( x ) d x = i = 0 ∑ n ( 2 h [ f ( x i ) + f ( x i + 1 )] − f ′′ ( η i ) 12 h 3 ) = i = 0 ∑ n ( 2 h [ f ( x i ) + f ( x i + 1 )] − f ′′ ( η i ) 12 h 3 ) ≈ h [ 2 1 f ( a ) + i = 1 ∑ n − 1 f ( x i ) + 2 1 f ( b ) ]
同时我们可以估计其误差为(第二个等号到第三个等号,以及最后两个等号之间均用了积分中值定理):
E n ( f ) = ∑ i = 0 n ( − f ′ ′ ( η i ) h 3 12 ) = h 2 12 ∑ i = 0 n ( − f ′ ′ ( η i ) ⋅ h ) = − h 2 12 ∑ i = 0 n ∫ x i x i + 1 f ′ ′ ( x ) d x = − h 2 12 ∫ a b f ′ ′ ( x ) d x = − h 2 12 ( b − a ) f ′ ′ ( η ) \begin{aligned}
E_n(f) = \sum_{i=0}^{n} \left( -f''(\eta_i) \frac{h^3}{12} \right) &= \frac{h^2}{12}\sum_{i=0}^{n} (-f''(\eta_i) \cdot h) \\
&= -\frac{h^2}{12}\sum_{i=0}^{n}\int_{x_i}^{x_{i+1}} f''(x) \text{d}x \\
&= -\frac{h^2}{12} \int_{a}^{b} f''(x) \text{d}x\\
&= -\frac{h^2}{12} (b-a) f''(\eta)\\
\end{aligned}
E n ( f ) = i = 0 ∑ n ( − f ′′ ( η i ) 12 h 3 ) = 12 h 2 i = 0 ∑ n ( − f ′′ ( η i ) ⋅ h ) = − 12 h 2 i = 0 ∑ n ∫ x i x i + 1 f ′′ ( x ) d x = − 12 h 2 ∫ a b f ′′ ( x ) d x = − 12 h 2 ( b − a ) f ′′ ( η )
又 ∵ \because ∵ h = b − a n h = \frac{b-a}{n} \; h = n b − a 代入上式:
L.H.S. = − ( b − a ) 3 12 n 2 f ′ ′ ( η ) , η ∈ ( a , b ) \text{L.H.S.}= -\frac{(b-a)^3}{12n^2} f''(\eta), \quad \eta \in (a, b)
L.H.S. = − 12 n 2 ( b − a ) 3 f ′′ ( η ) , η ∈ ( a , b )
复化 Simpson 积分:
对各子区间做二阶多项式插值。
对积分区间 [ a , b ] [a,b] [ a , b ] 内作偶数等距分割,n = 2 m n=2m n = 2 m ,此时我们有 2 m + 1 2m+1 2 m + 1 个积分节点和 m m m 个积分区间,积分步长 h = b − a n h = \frac{b-a}{n} h = n b − a 。每次积分在 ( x 2 i , x 2 i + 1 , x 2 i + 2 ) (x_{2i}, x_{2i+1}, x_{2i+2}) ( x 2 i , x 2 i + 1 , x 2 i + 2 ) 三点上进行:
∫ a b f ( x ) d x = ∑ i = 0 m − 1 ∫ x 2 i x 2 i + 2 f ( x ) d x = ∑ i = 0 m − 1 { 2 h 6 [ f ( x 2 i ) + 4 f ( x 2 i + 1 ) + f ( x 2 i + 2 ) ] − ( 2 h ) 5 2880 f ( 4 ) ( η i ) } ( 这里步长为 2 h ) = h 3 [ f ( a ) + 4 ∑ i = 0 m − 1 f ( x 2 i + 1 ) + 2 ∑ i = 1 m − 1 f ( x 2 i ) + f ( b ) ] + E n ( f ) \begin{aligned}
\int_a^b f(x) \text{d}x &= \sum_{i=0}^{m-1} \int_{x_{2i}}^{x_{2i+2}} f(x) \text{d}x\\
&= \sum_{i=0}^{m-1} \{ \frac{2h}{6} \left[ f(x_{2i}) + 4f(x_{2i+1}) + f(x_{2i+2}) \right] - \frac{(2h)^5}{2880} f^{(4)}(\eta_i) \} (\text{这里步长为}2h)\\
&= \frac{h}{3} \left[ f(a) + 4 \sum_{i=0}^{m-1} f(x_{2i+1}) + 2 \sum_{i=1}^{m-1} f(x_{2i}) + f(b) \right] + E_n(f)
\end{aligned}
∫ a b f ( x ) d x = i = 0 ∑ m − 1 ∫ x 2 i x 2 i + 2 f ( x ) d x = i = 0 ∑ m − 1 { 6 2 h [ f ( x 2 i ) + 4 f ( x 2 i + 1 ) + f ( x 2 i + 2 ) ] − 2880 ( 2 h ) 5 f ( 4 ) ( η i )} ( 这里步长为 2 h ) = 3 h [ f ( a ) + 4 i = 0 ∑ m − 1 f ( x 2 i + 1 ) + 2 i = 1 ∑ m − 1 f ( x 2 i ) + f ( b ) ] + E n ( f )
其中误差项
E n ( f ) = ∑ i = 0 m − 1 − ( 2 h ) 5 2880 f ( 4 ) ( η i ) ≈ − h 4 180 ( b − a ) f ( 4 ) ( η ) = − ( b − a ) 5 180 n 4 f ( 4 ) ( η ) η ∈ ( a , b ) \begin{aligned}
E_n(f)=\sum_{i=0}^{m-1}-\frac{(2h)^5}{2880} f^{(4)}(\eta_i) &\approx -\frac{h^4}{180}(b-a)f^{(4)}(\eta)\\
&= -\frac{(b-a)^5}{180n^4}f^{(4)}(\eta) \quad \eta \in (a,b)
\end{aligned}
E n ( f ) = i = 0 ∑ m − 1 − 2880 ( 2 h ) 5 f ( 4 ) ( η i ) ≈ − 180 h 4 ( b − a ) f ( 4 ) ( η ) = − 180 n 4 ( b − a ) 5 f ( 4 ) ( η ) η ∈ ( a , b )
(约化技巧与复化梯形积分误差项类似,注意这里的步长为2 h 2h 2 h 。)
数据滤波
实际观测中永远免不了随机噪声。噪声分类:
过程噪声:物理系统演化过程中系统本身的随机性
测量噪声:做测量时测量行为带来的随机性
滤波方法一:平滑滤波
滤波方法二:卡尔曼滤波