研一时为应付高等工程数学考试整理的有关数值分析部分的内容,目的是为了应付考试。
对于有 n n n 位有效数字的 x x x 的近似值 x ∗ x^* x∗, 其科学计数法表示形式 x ∗ = a 1 . a 2 . . . a n × 1 0 m ( a 1 ≠ 0 ) x^* = a_1.a_2...a_n\times 10^m \ \ (a_1 \ne 0) x∗=a1.a2...an×10m (a1=0)
绝对误差限 : ∣ e ∣ = ∣ x ∗ − x ∣ ≤ 1 2 ∗ 1 0 m + 1 − n 相对误差限 : ∣ e r ∣ = ∣ x ∗ − x ∣ ∣ x ∣ ≈ ∣ x ∗ − x ∣ ∣ x ∗ ∣ ≤ 1 2 ∗ a 1 ∗ 1 0 1 − n \begin{array} {ll} 绝对误差限 &:& |e| &=& |x^*-x| &\le& \frac{1}{2} * 10^{m+1-n} \\ \\ 相对误差限 &:& |e_r| &=& \frac{|x^*-x|}{|x|} \approx \frac{|x^*-x|}{|x^*|} &\le& \frac{1}{2*a_1} * 10^{1-n} \end{array} 绝对误差限相对误差限::∣e∣∣er∣==∣x∗−x∣∣x∣∣x∗−x∣≈∣x∗∣∣x∗−x∣≤≤21∗10m+1−n2∗a11∗101−n
连续型
( f , g ) = ∫ a b ρ ( x ) × f ( x ) × g ( x ) d x (f,g)=\int_a^b \rho(x)\times f(x) \times g(x) dx (f,g)=∫abρ(x)×f(x)×g(x)dx
离散型
x x x | x 0 x_0 x0 | x 1 x_1 x1 | x 2 x_2 x2 | x 3 x_3 x3 |
---|---|---|---|---|
f ( x ) f(x) f(x) | f ( x 0 ) f(x_0) f(x0) | f ( x 1 ) f(x_1) f(x1) | f ( x 2 ) f(x_2) f(x2) | f ( x 3 ) f(x_3) f(x3) |
g ( x ) g(x) g(x) | g ( x 0 ) g(x_0) g(x0) | g ( x 1 ) g(x_1) g(x1) | g ( x 2 ) g(x_2) g(x2) | g ( x 3 ) g(x_3) g(x3) |
( f , g ) = f T g 向量内积 \begin{array} {ll} (f,g) &=& f^Tg &向量内积 \\ \end{array} (f,g)=fTg向量内积
G n ⋅ A = D G_n \cdot A = D Gn⋅A=D
其中: G n = [ ( φ 0 , φ 0 ) ( φ 0 , φ 1 ) ⋯ ( φ 0 , φ n ) ( φ 1 , φ 0 ) ( φ 1 , φ 1 ) ⋯ ( φ 1 , φ n ) ⋮ ⋮ ⋮ ( φ n , φ 0 ) ( φ n , φ 1 ) ⋯ ( φ n , φ n ) ] n + 1 A = [ a 0 a 1 . . . a n ] D = [ ( φ 0 , f ) ( φ 1 , f ) . . . ( φ n , f ) ] G_n=\left[\begin{array}{cccc} \left(\varphi_0, \varphi_0\right) & \left(\varphi_0, \varphi_1\right) & \cdots & \left(\varphi_0, \varphi_n\right) \\ \left(\varphi_1, \varphi_0\right) & \left(\varphi_1, \varphi_1\right) & \cdots & \left(\varphi_1, \varphi_n\right) \\ \vdots & \vdots & & \vdots \\ \left(\varphi_n, \varphi_0\right) & \left(\varphi_n, \varphi_1\right) & \cdots & \left(\varphi_n, \varphi_n\right) \end{array}\right]_{n+1} \ \ A = \left[\begin{array}{lll} a_0 \\ a_1 \\... \\ a_n \end{array} \right] \ \ \ D= \left[\begin{array}{lll} (\varphi_0, f) \\ (\varphi_1,f) \\... \\ (\varphi_n, f) \end{array} \right] Gn= (φ0,φ0)(φ1,φ0)⋮(φn,φ0)(φ0,φ1)(φ1,φ1)⋮(φn,φ1)⋯⋯⋯(φ0,φn)(φ1,φn)⋮(φn,φn) n+1 A= a0a1...an D= (φ0,f)(φ1,f)...(φn,f)
正交多项式递推公式
g k + 1 ( x ) = ( x − α k ) × g k ( x ) − β k × g k − 1 ( x ) , k = 0 , 1 , 2 , ⋯ g _ { k + 1 } ( x ) = ( x - \alpha _ { k } ) \times g _ { k } ( x ) - \beta _ k \times g_{ k - 1 } ( x ) , \quad k = 0, 1 , 2 , \cdots gk+1(x)=(x−αk)×gk(x)−βk×gk−1(x),k=0,1,2,⋯
其中:
{ α k = ( x × g k , g k ) ( g k , g k ) β k = ( g k , g k ) ( g k − 1 , g k − 1 ) β 0 = 0 g 0 ( x ) = 1 \left\{ \begin{array} {ll} \alpha_k &=& \frac{ ( x \times g_k , g_k ) } { ( g_{ k }, g_{k} ) } \\ \beta_k &=& \frac { ( g_k , g_k ) } { ( g_{ k-1 } , g_{ k-1 } ) } \\ \beta_0 &=& 0 \\ g_0(x) &=& 1 \end{array} \right. ⎩ ⎨ ⎧αkβkβ0g0(x)====(gk,gk)(x×gk,gk)(gk−1,gk−1)(gk,gk)01
算法流程
G n ⋅ A = D G_n \cdot A = D Gn⋅A=D
其中: G n = [ ( g 0 , g 0 ) 0 ⋯ 0 0 ( g 1 , g 1 ) ⋯ 0 ⋮ ⋮ ⋮ 0 0 ⋯ ( g n , g n ) ] n + 1 A = [ a 0 a 1 . . . a n ] D = [ ( g 0 , f ) ( g 1 , f ) . . . ( g n , f ) ] G_n=\left[\begin{array}{cccc} (g_0, g_0) & 0 & \cdots & 0 \\ 0& (g_1, g_1) & \cdots & 0 \\ \vdots & \vdots & & \vdots \\ 0 & 0 & \cdots & (g_n, g_n) \end{array}\right]_{n+1} \ \ A = \left[\begin{array}{lll} a_0 \\ a_1 \\... \\ a_n \end{array} \right] \ \ \ D= \left[\begin{array}{lll} (g_0, f) \\ (g_1,f) \\... \\ (g_n, f) \end{array} \right] Gn= (g0,g0)0⋮00(g1,g1)⋮0⋯⋯⋯00⋮(gn,gn) n+1 A= a0a1...an D= (g0,f)(g1,f)...(gn,f)
故可以直接解出 a k = ( g k , f ) ( g k , g k ) a_k = \frac{(g_k, f)}{(g_k, g_k)} ak=(gk,gk)(gk,f)
定义
积分区间在 [ − 1 , 1 ] [-1,1] [−1,1], 权函数 ρ ( x ) = 1 \rho(x)=1 ρ(x)=1, 由 g 1 ( x ) = x g_1(x)=x g1(x)=x 正交化得到的多项式称为 Legendre多项式
区间变换公式
将积分区间由 x ∈ [ a , b ] x \in [a,b] x∈[a,b] 转变为 t ∈ [ − 1 , 1 ] t \in [-1, 1] t∈[−1,1]
x = b − a 2 × t + b + a 2 x = \frac{b-a}{2} \times t + \frac{b+a}{2} x=2b−a×t+2b+a
通项公式
一般使用 P n ( x ) P_n(x) Pn(x) 替换 φ n ( x ) \varphi_n(x) φn(x) 来表示Legendre多项式
P n ( x ) = 1 2 n × n ! d n d x n ( x 2 − 1 ) n P_n(x) = \frac{1}{2^n \times n!} \frac{d^n}{dx^n}(x^2-1)^n Pn(x)=2n×n!1dxndn(x2−1)n
阶数 | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
Legendre多项式 | 1 | x x x | 1 2 ( 3 x 2 − 1 ) \frac{1}{2}(3x^2-1) 21(3x2−1) | 1 2 ( 5 x 3 − 3 x ) \frac{1}{2}(5x^3-3x) 21(5x3−3x) | 1 8 ( 35 x 4 − 30 x 2 + 3 ) \frac{1}{8}(35x^4-30x^2+3) 81(35x4−30x2+3) |
性质
正交性
( P k , P k ) = ∫ − 1 1 1 × P k ( x ) × P k ( x ) d x = 2 2 k + 1 (P_k, P_k) = \int_{-1}^{1} 1 \times P_k(x) \times P_k(x) dx = \frac{2}{2 k + 1} (Pk,Pk)=∫−111×Pk(x)×Pk(x)dx=2k+12
Legendre多项式的递推公式
( n + 1 ) × P n + 1 ( x ) = ( 2 n + 1 ) × x × P n ( x ) − n × P n − 1 ( x ) (n+1) \times P_{n+1}(x) = (2n+1) \times x \times P_n(x) - n \times P_{n-1}(x) (n+1)×Pn+1(x)=(2n+1)×x×Pn(x)−n×Pn−1(x)
定义
积分区间在 [ − 1 , 1 ] [-1,1] [−1,1], 权函数 ρ ( x ) = 1 1 − x 2 \rho(x) = \frac{1}{\sqrt{1-x^2}} ρ(x)=1−x21, 由 g 1 ( x ) = x g_1(x)=x g1(x)=x 正交化得到的正交多项式称为 Chebyshev多项式
通项公式
一般使用 T n ( x ) T_n(x) Tn(x) 替换 φ n ( x ) \varphi_n(x) φn(x) 来表示Chebyshev多项式
T n ( x ) = c o s ( n × a r c c o s ( x ) ) T_n(x) = cos(n \times arccos(x)) Tn(x)=cos(n×arccos(x))
阶数 | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
Chebyshev多项式 | 1 | x x x | 2 x 2 − 1 2x^2-1 2x2−1 | 4 x 3 − 3 x 4x^3-3x 4x3−3x | 8 x 4 − 8 x 2 + 1 8x^4-8x^2+1 8x4−8x2+1 |
性质
正交性
( T k , T k ) = { π 2 , k = 0 π , k ≠ 0 (T_k, T_k) = \left\{ \begin{array} {ll} \frac{\pi}{2} &,k=0 \\ \pi &,k\ne 0 \\ \end{array} \right. (Tk,Tk)={2ππ,k=0,k=0
T n ( x ) = 0 T_n(x) = 0 Tn(x)=0 的解
x k = c o s ( 2 k − 1 2 n π ) x_k = cos(\frac{2k-1}{2n}\pi) xk=cos(2n2k−1π)
n n n 次最佳平方逼近
使用 n n n 次正交函数族来拟合给定函数
平方误差
记 f ( x ) f(x) f(x) 是待拟合的函数, s ( x ) = ∑ k = 0 n ( a k × P k ( x ) ) s(x) = \sum_{k=0}^n(a_k \times P_k(x)) s(x)=∑k=0n(ak×Pk(x)) 是用来拟合的多项式
∣ ∣ δ ∣ ∣ 2 2 = ∣ ∣ f ( x ) − s ( x ) ∣ ∣ 2 2 = ( f − s , f − s ) = ( f − s , f ) − ( f − s , s ) = ( f − s , f ) = ( f , f ) − ( s , f ) = ( f , f ) − ( f , ∑ k = 0 n ( a k × g k ) ) = ( f , f ) − ∑ k = 0 n a k × ( f , g k ) = ( f , f ) − ∑ k = 0 n a k × a k × ( g k , g k ) \begin{array} {ll} ||\delta||_2^2 = ||f(x)-s(x)||_2^2 &=& (f-s, f-s) \\ \\ &=& (f-s, f) - (f-s, s) \\ \\ &=& (f-s,f) \\ \\ &=& (f,f) - (s,f) \\ \\ &=& (f,f) - (f, \sum_{k=0}^n(a_k \times g_k)) \\ \\ &=& (f,f) - \sum_{k=0}^na_k \times (f, g_k) \\ \\ &=& (f,f) - \sum_{k=0}^na_k \times a_k \times (g_k, g_k) \end{array} ∣∣δ∣∣22=∣∣f(x)−s(x)∣∣22=======(f−s,f−s)(f−s,f)−(f−s,s)(f−s,f)(f,f)−(s,f)(f,f)−(f,∑k=0n(ak×gk))(f,f)−∑k=0nak×(f,gk)(f,f)−∑k=0nak×ak×(gk,gk)
在离散的情况下, 此时无论是Legendre多项式还是Chebyshev多项式, 都不能直接使用正交性的结论, 需要根据离散情况下的内积定义进行计算 ( g k , g k ) (g_k, g_k) (gk,gk)
给定数据表, 计算数据的二次多项式拟合
i | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
x i x_i xi | 0 | 0.25 | 0.5 | 0.75 | 1 |
y i y_i yi | 0.10 | 0.35 | 0.81 | 1.09 | 1.96 |
权函数 w i w_i wi | 1 | 1 | 1 | 1 | 1 |
解析: 多项式的正交化算法
算法开始: g 0 ( x ) = 1 g_0(x)=1 g0(x)=1
i | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
x i x_i xi | 0 | 0.25 | 0.5 | 0.75 | 1 |
y i y_i yi | 0.10 | 0.35 | 0.81 | 1.09 | 1.96 |
权函数 w i w_i wi | 1 | 1 | 1 | 1 | 1 |
g 0 = 1 g_0=1 g0=1 | 1 | 1 | 1 | 1 | 1 |
计算 α k , β k \alpha_k, \beta_k αk,βk, 即 α 0 , β 0 \alpha_0, \beta_0 α0,β0
{ α k = ( x × g k , g k ) ( g k , g k ) β k = ( g k , g k ) ( g k − 1 , g k − 1 ) β 0 = 0 \left\{ \begin{array} {ll} \alpha_k &=& \frac{ ( x \times g_k , g_k ) } { ( g_{ k }, g_{k} ) } \\ \beta_k &=& \frac { ( g_k , g_k ) } { ( g_{ k-1 } , g_{ k-1 } ) } \\ \beta_0 &=& 0 \\ \end{array} \right. ⎩ ⎨ ⎧αkβkβ0===(gk,gk)(x×gk,gk)(gk−1,gk−1)(gk,gk)0
i | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
x i x_i xi | 0 | 0.25 | 0.5 | 0.75 | 1 |
y i y_i yi | 0.10 | 0.35 | 0.81 | 1.09 | 1.96 |
权函数 w i w_i wi | 1 | 1 | 1 | 1 | 1 |
g 0 = 1 g_0=1 g0=1 | 1 | 1 | 1 | 1 | 1 |
x × g 0 x\times g_0 x×g0 | 0 | 0.25 | 0.5 | 0.75 | 1 |
得到: α 0 = 0.5 , β 0 = 0 \alpha_0=0.5, \beta_0=0 α0=0.5,β0=0
通过正交多项式的递推公式 g k + 1 ( x ) = ( x − α k ) × g k ( x ) − β k × g k − 1 ( x ) g _ { k + 1 } ( x ) = ( x - \alpha _ { k } ) \times g _ { k } ( x ) - \beta _ k \times g_{ k - 1 } ( x ) gk+1(x)=(x−αk)×gk(x)−βk×gk−1(x) 得到 g 1 ( x ) = x − 0.5 g_1(x)=x-0.5 g1(x)=x−0.5, 重复步骤(1)到(3)
i | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
x i x_i xi | 0 | 0.25 | 0.5 | 0.75 | 1 |
y i y_i yi | 0.10 | 0.35 | 0.81 | 1.09 | 1.96 |
权函数 w i w_i wi | 1 | 1 | 1 | 1 | 1 |
g 0 = 1 g_0=1 g0=1 | 1 | 1 | 1 | 1 | 1 |
x × g 0 x\times g_0 x×g0 | 0 | 0.25 | 0.5 | 0.75 | 1 |
g 1 = x − 0.5 g_1=x-0.5 g1=x−0.5 | -0.5 | -0.25 | 0 | 0.25 | 0.5 |
#插值法
P n ( x ) = ∑ k = 0 n ( a k × x k ) \begin{array} {ll} P_n(x) = \sum_{k=0}^{n}(a_k \times x^k) \end{array} Pn(x)=∑k=0n(ak×xk)
R n ( x ) = f ( n + 1 ) ( ϵ ) ( n + 1 ) ! w n + 1 ( x ) \begin{array} {ll} R _ { n } ( x ) &=& \frac { f ^ { ( n + 1 ) } ( \epsilon ) } { ( n + 1 ) ! } w _ { n + 1 } ( x ) \\ \end{array} Rn(x)=(n+1)!f(n+1)(ϵ)wn+1(x)
其中, w n + 1 ( x ) = ∏ i = 0 n ( x − x i ) w_{n+1}(x) = \prod_{i=0}^{n}(x-x_i) wn+1(x)=∏i=0n(x−xi)
面对给出的 n + 1 n+1 n+1 组数据点
x x x | x 0 x_0 x0 | x 1 x_1 x1 | … | x n x_n xn |
---|---|---|---|---|
y y y | y 0 y_0 y0 | y 1 y_1 y1 | … | y n y_n yn |
如果使用插值多项式的基本形式, 则面临解如下的一个高阶线性方程组 X ⋅ A = Y X \cdot A = Y X⋅A=Y
其中: X = [ 1 x 0 . . . x 0 n 1 x 1 . . . x 1 n . . . 1 x n . . . x n n ] , A = [ a 0 a 1 . . . a n ] , Y = [ y 0 y 1 . . . y n ] X = \left[\begin{array}{lll} 1&x_0&...&x^n_0 \\ 1&x_1&...&x^n_1\\... \\ 1&x_n&...&x^n_n \end{array} \right], \ \ A = \left[\begin{array}{lll} a_0 \\ a_1 \\... \\ a_n \end{array} \right], \ \ Y= \left[\begin{array}{lll} y_0 \\ y_1 \\... \\ y_n \end{array} \right] X= 11...1x0x1xn.........x0nx1nxnn , A= a0a1...an , Y= y0y1...yn
缺点: 对于 n n n 较大的高阶线性方程组, 称为病态方程组. 不适用
P n ( x ) = ∑ k = 0 n ( l k ( x ) × y k ) = ∑ k = 0 n ( l k ( x ) × y ( x k ) ) \begin{array}{ll} P_n(x) &=& \sum_{k=0}^{n}(l_k(x) \times y_k) \\ \\ &=& \sum_{k=0}^{n}(l_k(x) \times y(x_k)) \end{array} Pn(x)==∑k=0n(lk(x)×yk)∑k=0n(lk(x)×y(xk))
由代数多项式基本形式的 直接求解系数 ⇒ \Rightarrow ⇒ Lagrange插值法的 寻找基函数 l k ( x ) l_k(x) lk(x)
将左边点 ( x i , y i ) (x_i, y_i) (xi,yi) 代入到Lagrange插值形式中, 得到基函数 l k ( x ) l_k(x) lk(x) 应该满足如下性质
l i ( x j ) = { 1 , i = j 0 , i ≠ j l_i(x_j)= \left\{ \begin{array}{ll} 1, & i=j \\ 0, & i \neq j \end{array} \right. li(xj)={1,0,i=ji=j
所以有
l i ( x ) = ∏ j = 0 , i ≠ j j = n x − x j x i − x j l_i(x) = \prod_{j=0,i\ne j}^{j=n}\frac{x-x_j}{x_i-x_j} li(x)=j=0,i=j∏j=nxi−xjx−xj
分别使用线性插值和2次插值计算 ln(11.75) 的近似值
x x x | 10 | 11 | 12 | 13 |
---|---|---|---|---|
y = l n ( x ) y=ln(x) y=ln(x) | 2.3026 | 2.3979 | 2.4849 | 2.5649 |
线性插值: 使用两个插值点(最接近待计算的值)
L 1 ( x ) = ( x − x 1 ) ( x 0 − x 1 ) ⋅ y 0 + ( x − x 0 ) ( x 1 − x 0 ) ⋅ y 1 \begin{array}{l} L_1(x) = \frac{(x-x_1)}{(x_0-x_1)} \cdot y_0 + \frac{(x-x_0)}{(x_1-x_0)} \cdot y_1 \end{array} L1(x)=(x0−x1)(x−x1)⋅y0+(x1−x0)(x−x0)⋅y1
2次插值: 使用三个插值点
L 2 ( x ) = ( 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 L_2(x) = \frac{\left(x-x_1\right)\left(x-x_2\right)}{\left(x_0-x_1\right)\left(x_0-x_2\right)} \cdot y_0 + \frac{\left(x-x_0\right)\left(x-x_2\right)}{\left(x_1-x_0\right)\left(x_1-x_2\right)} \cdot y_1 + \frac{\left(x-x_0\right)\left(x-x_1\right)}{\left(x_2-x_0\right)\left(x_2-x_1\right)} \cdot y_2 L2(x)=(x0−x1)(x0−x2)(x−x1)(x−x2)⋅y0+(x1−x0)(x1−x2)(x−x0)(x−x2)⋅y1+(x2−x0)(x2−x1)(x−x0)(x−x1)⋅y2
N ( x ) = a 0 + a 1 ∗ ( x − x 0 ) + a 2 ∗ ( x − x 0 ) ( x − x 1 ) + . . . + a n − 1 ∗ ( x − x 0 ) . . . ( x − x n − 1 ) N(x) = a_0 + a_1 * (x - x_0) + a_2 * (x-x_0)(x-x_1) + ... + a_{n-1}*(x-x_0)...(x-x_{n-1}) N(x)=a0+a1∗(x−x0)+a2∗(x−x0)(x−x1)+...+an−1∗(x−x0)...(x−xn−1)
对于大区间使用高阶多项式插值会产生Runge(龙格)现象 ⇒ \Rightarrow ⇒ 对多个小区间使用低阶多项式插值
用有限的几个点的函数值 f ( x 0 ) , f ( x 1 ) , . . . , f ( x n ) f(x_0), f(x_1), ..., f(x_n) f(x0),f(x1),...,f(xn) 的线性组合来近似某个区间 [ a , b ] [a,b] [a,b] 上的积分
∫ a b f ( x ) d x = ∑ k = 0 n ( A k × f ( x k ) ) \int_a^b f(x) dx = \sum_{k=0}^n (A_k \times f(x_k)) ∫abf(x)dx=k=0∑n(Ak×f(xk))
A k A_k Ak 称为求积系数, x k x_k xk 称为求积点
求积公式是近似方法, 但希望求积公式能够对尽可能多的函数准确成立, 因此提出了代数精度的概念
定理: 在给定区间 [ a , b ] [a,b] [a,b] 上, 对于给定的 n + 1 n+1 n+1 个互不相同的节点, 一定存在求积系数 A 0 , A 1 , . . . A n A_0, A_1,...A_n A0,A1,...An, 使得求积公式至少具有 n n n 次代数精度
∫ a b ρ ( x ) × f ( x ) d x ≈ ∫ a b ρ ( x ) × L n ( x ) d x = ∫ a b ρ ( x ) × ∑ k = 0 n ( l k ( x ) × y k ) d x = ∑ k = 0 n ( y k × ∫ a b [ ρ ( x ) × l k ( x ) ] d x ) = ∑ k = 0 n ( f ( x k ) × A k ) \begin{array}{ll} \int_a^b \rho(x) \times f(x) dx \approx \int_a^b \rho(x) \times L_n(x) dx &=& \int_a^b \rho(x) \times \sum_{k=0}^n (l_k(x) \times y_k) dx \\ \\ &=& \sum_{k=0}^n (y_k \times \int_a^b [\rho(x) \times l_k(x)] dx ) \\ \\ &=& \sum_{k=0}^n (f(x_k) \times A_k ) \end{array} ∫abρ(x)×f(x)dx≈∫abρ(x)×Ln(x)dx===∫abρ(x)×∑k=0n(lk(x)×yk)dx∑k=0n(yk×∫ab[ρ(x)×lk(x)]dx)∑k=0n(f(xk)×Ak)
其中: A k = ∫ a b [ ρ ( x ) × l k ( x ) ] d x A_k = \int_a^b[ \rho(x) \times l_k(x) ]dx Ak=∫ab[ρ(x)×lk(x)]dx, 默认情况下 ρ ( x ) = 1 \rho(x)=1 ρ(x)=1, 故 A k = ∫ a b l k ( x ) d x A_k=\int_a^b l_k(x) dx Ak=∫ablk(x)dx
判断一个公式是否是插值型求积公式, 通过判断其求积系数是否满足 A k = ∫ a b l k ( x ) d x A_k = \int_a^b l_k(x) dx Ak=∫ablk(x)dx. 若满足则为插值型求积公式
由上面的代数精度定理, 可以知道 n + 1 n+1 n+1 个互不相同的节点 { x 0 , x 1 , . . . , x n } \{x_0,x_1,...,x_n\} {x0,x1,...,xn} 一定至少具有 n n n 次代数精度, 进一步插值型求积公式可以通过 A k = ∫ a b l k ( x ) d x A_k = \int_a^b l_k(x) dx Ak=∫ablk(x)dx 来确定求积系数
对 ∫ 0 3 f ( x ) d x \int_0^3 f(x) dx ∫03f(x)dx 构造一个至少具有3次代数精度的求积公式
解析
至少 n = 3 n=3 n=3 次代数精度 ⇒ \Rightarrow ⇒ 使用具有 n + 1 = 4 n+1=4 n+1=4 个任意的插值节点的插值型求积公式必定能够满足要求, 取 { 0 , 1 , 2 , 3 } \{0,1,2,3\} {0,1,2,3}
相应的拉格朗日基函数
l 0 ( x ) = ( x − x 1 ) ( x − x 2 ) ( x − x 3 ) ( x 0 − x 1 ) ( x 0 − x 2 ) ( x 0 − x 3 ) = ( x − 1 ) ( x − 2 ) ( x − 3 ) ( 0 − 1 ) ( 0 − 2 ) ( 0 − 3 ) l 1 ( x ) = ( x − x 0 ) ( x − x 2 ) ( x − x 3 ) ( x 1 − x 0 ) ( x 1 − x 2 ) ( x 1 − x 3 ) = ( x − 0 ) ( x − 2 ) ( x − 3 ) ( 1 − 0 ) ( 1 − 2 ) ( 1 − 3 ) l 2 ( x ) = ( x − x 0 ) ( x − x 1 ) ( x − x 3 ) ( x 2 − x 0 ) ( x 2 − x 1 ) ( x 2 − x 3 ) = ( x − 0 ) ( x − 1 ) ( x − 3 ) ( 2 − 0 ) ( 2 − 1 ) ( 2 − 3 ) l 3 ( x ) = ( x − x 0 ) ( x − x 1 ) ( x − x 2 ) ( x 3 − x 0 ) ( x 3 − x 1 ) ( x 3 − x 2 ) = ( x − 0 ) ( x − 1 ) ( x − 2 ) ( 3 − 0 ) ( 3 − 1 ) ( 3 − 2 ) l_0(x)=\frac{(x-x_1)(x-x_2)(x-x_3)}{(x_0-x_1)(x_0-x_2)(x_0-x_3)} = \frac{(x-1)(x-2)(x-3)}{(0-1)(0-2)(0-3)}\\l_1(x)=\frac{(x-x_0)(x-x_2)(x-x_3)}{(x_1-x_0)(x_1-x_2)(x_1-x_3)} = \frac{(x-0)(x-2)(x-3)}{(1-0)(1-2)(1-3)}\\l_2(x)=\frac{(x-x_0)(x-x_1)(x-x_3)}{(x_2-x_0)(x_2-x_1)(x_2-x_3)} = \frac{(x-0)(x-1)(x-3)}{(2-0)(2-1)(2-3)}\\l_3(x)=\frac{(x-x_0)(x-x_1)(x-x_2)}{(x_3-x_0)(x_3-x_1)(x_3-x_2)} = \frac{(x-0)(x-1)(x-2)}{(3-0)(3-1)(3-2)} l0(x)=(x0−x1)(x0−x2)(x0−x3)(x−x1)(x−x2)(x−x3)=(0−1)(0−2)(0−3)(x−1)(x−2)(x−3)l1(x)=(x1−x0)(x1−x2)(x1−x3)(x−x0)(x−x2)(x−x3)=(1−0)(1−2)(1−3)(x−0)(x−2)(x−3)l2(x)=(x2−x0)(x2−x1)(x2−x3)(x−x0)(x−x1)(x−x3)=(2−0)(2−1)(2−3)(x−0)(x−1)(x−3)l3(x)=(x3−x0)(x3−x1)(x3−x2)(x−x0)(x−x1)(x−x2)=(3−0)(3−1)(3−2)(x−0)(x−1)(x−2)
计算求积系数 A k = ∫ 0 3 l k ( x ) d x A_k = \int_0^3 l_k(x) dx Ak=∫03lk(x)dx
插值型求积公式 ∫ 0 3 f ( x ) d x = A 0 × f ( 0 ) + A 1 × f ( 1 ) + A 2 × f ( 2 ) + A 3 × f ( 3 ) \int_0^3 f(x) dx=A_0 \times f(0) + A_1 \times f(1) + A_2 \times f(2) + A_3 \times f(3) ∫03f(x)dx=A0×f(0)+A1×f(1)+A2×f(2)+A3×f(3)
若求积系数 A k > 0 , k = 0 , 1 , 2 , . . . A_k > 0, k=0,1,2,... Ak>0,k=0,1,2,..., 则称求积公式是稳定的
R [ f ] = ∫ a b f ( x ) d x − ∫ a b L n ( x ) d x = ∫ a b f ( x ) − ∑ k = 0 n ( l k ( x ) × y k ) d x = ∫ a b f ( n + 1 ) ( ϵ ) ( n + 1 ) ! ∏ i = 0 n ( x − x i ) d x = ∫ a b f ( n + 1 ) ( ϵ ) ( n + 1 ) ! w n + 1 ( x ) d x \begin{array}{ll} R[f] &=& \int_a^b f(x) dx - \int_a^b L_n(x) dx \\ \\ &=& \int_a^b f(x) - \sum_{k=0}^n (l_k(x) \times y_k) dx \\ \\ &=& \int_a^b \frac{f^{(n+1)}(\epsilon)}{(n+1)!}\prod_{i=0}^{n}(x-x_i)dx \\ \\ &=& \int_a^b \frac{f^{(n+1)}(\epsilon)}{(n+1)!} w_{n+1}(x)dx \\ \end{array} R[f]====∫abf(x)dx−∫abLn(x)dx∫abf(x)−∑k=0n(lk(x)×yk)dx∫ab(n+1)!f(n+1)(ϵ)∏i=0n(x−xi)dx∫ab(n+1)!f(n+1)(ϵ)wn+1(x)dx
作为插值型求积公式中一类特殊且常用的形式, 额外限制了求积点的选择(等距节点), 即 h = b − a n , x k = a + k × h h = \frac{b-a}{n}, x_k = a + k \times h h=nb−a,xk=a+k×h, 默认包含了两个端点
∫ a b f ( x ) d x = ∑ k = 0 n ( f ( x k ) × A k ) = ( b − a ) × ∑ k = 0 n ( f ( x k ) × C k ( n ) ) \begin{array}{ll} \int_a^b f(x) dx &=& \sum_{k=0}^n (f(x_k) \times A_k ) \\ \\ &=& (b-a)\times \sum_{k=0}^n (f(x_k) \times C^{(n)}_k ) \end{array} ∫abf(x)dx==∑k=0n(f(xk)×Ak)(b−a)×∑k=0n(f(xk)×Ck(n))
其中: C k ( n ) C_k^{(n)} Ck(n) 称为Cotes系数, 满足 C k ( n ) = 1 b − a A k = ( − 1 ) n − k n × k ! × ( n − k ) ! ∫ 0 n ∏ i = 0 , i ≠ k n ( t − i ) d t C_k^{(n)} = \frac{1}{b-a} A_k = \frac{(-1)^{n-k}}{n \times k! \times (n-k)!} \int_0^n \prod_{i=0, i\ne k}^n(t-i)dt Ck(n)=b−a1Ak=n×k!×(n−k)!(−1)n−k∫0n∏i=0,i=kn(t−i)dt
n\k | 0 | 1 | 2 | 3 |
---|---|---|---|---|
0 | nan | |||
1 | 1/2 | 1/2 | ||
2 | 1/6 | 4/6 | 1/6 | |
3 | 1/8 | 3/8 | 3/8 | 1/8 |
n = 1 梯形公式 : R [ f ] = − ( b − a ) 3 12 f ( 2 ) ( ϵ ) n = 2 辛普森公式 : R [ f ] = − ( b − a ) 5 2880 f ( 4 ) ( ϵ ) \begin{array}{ll} n=1 & 梯形公式 &:& R[f] &=& -\frac{(b-a)^3}{12}f^{(2)}(\epsilon) \\ \\ n=2 & 辛普森公式 &:& R[f] &=& -\frac{(b-a)^5}{2880}f^{(4)}(\epsilon) \\ \end{array} n=1n=2梯形公式辛普森公式::R[f]R[f]==−12(b−a)3f(2)(ϵ)−2880(b−a)5f(4)(ϵ)
n n n 阶Newton求积公式 ⇒ \Rightarrow ⇒ h ( n ) h(n) h(n) 次代数精度 ⇒ \Rightarrow ⇒ h ( n ) + 1 h(n) + 1 h(n)+1 阶导数 ⇒ \Rightarrow ⇒ ( b − a ) h ( n ) + 2 (b-a)^{h(n)+2} (b−a)h(n)+2
分别使用梯形公式和辛普森公式计算积分 ∫ 1 2 e 1 x d x \int_1^2 e^{\frac{1}{x}} dx ∫12ex1dx 的近似值, 并估计截断误差
使用区间越大, 根据插值公式的余项可以分析出需要更大的 n n n 才能保持相应的精度. 一方面, 当 n n n 越大时, C k ( n ) C_k^{(n)} Ck(n) 不方便计算; 另一方面, 当 n > 8 n>8 n>8 时, A k ≯ 0 A_k \not\gt 0 Ak>0, 因此求积公式也是不稳定的
因此, 将区间划分为小区间, 在每个小区间上分别使用低阶的Newton插值公式
给定 n + 1 n+1 n+1 个求积点, 可以得到 2 n + 1 2n+1 2n+1 次代数精度的求积公式, 不一定包含区间端点(大概率不包含)
一般的插值型求积公式: 任意求积点 ⇒ \Rightarrow ⇒ Newton求积公式: 等距求积点 ⇒ \Rightarrow ⇒ Gauss求积公式: 正交多项式的零点作为求积点
Legendre多项式的使用条件:
预测: 用显式法计算下一步或下n步的值,
校正: 将预测值代入到隐式法中进行求解, 修正预测值
向前差分公式 $y’(x_k) &\approx& \frac{y(x_{k+1})-y(x_{k})}{x_{k+1}-x_{k}} \$ 得
y ( x k + 1 ) = y ( x k ) + Δ x × y ′ ( x k ) y k + 1 = y k + h × y k ′ \begin{array}{lll} y(x_{k+1}) &=& y(x_{k}) + \Delta x \times y'(x_{k}) \\ \\ y_{k+1} &=& y_{k} + h \times y'_{k} \\ \end{array} y(xk+1)yk+1==y(xk)+Δx×y′(xk)yk+h×yk′
def euler(x0, y0, threshold, h, f):
"""
显式Euler方法
:param x0: x初值
:param y0: y初值
:param threshold: 上界,阈值
:param h: 步长
:param f: 导函数, 即y'
:return: 包含迭代过程中出现的(x,y)坐标的一个字典
"""
x = x0
y = y0
xList = [x]
yList = [y]
result = {'x': xList,
'y': yList}
while True:
# 终止条件
if x >= threshold:
break
# 迭代公式
y = y + h * f(x, y)
# 更新x, 推进迭代过程
x = x + h
# 保存数据
result['x'].append(x)
result['y'].append(y)
return result
由向后差分公式 y ′ ( x k + 1 ) ≈ y ( x k + 1 ) − y ( x k ) x k + 1 − x k y'(x_{k+1}) \approx \frac{y(x_{k+1})-y(x_{k})}{x_{k+1}-x_{k}} y′(xk+1)≈xk+1−xky(xk+1)−y(xk) 得
y k + 1 = y k + h × y k + 1 ′ y_{k+1} = y_{k} + h \times y'_{k+1} yk+1=yk+h×yk+1′
当 y ′ y' y′ 是 y y y 的线性函数, 即函数表达式的形式满足 y ′ = g ( x ) × y + t ( x ) y' = g(x) \times y + t(x) y′=g(x)×y+t(x) 时, 有
y k + 1 = y k + h × y k + 1 ′ = y k + h × [ g ( x k + 1 ) × y k + 1 + t ( x k + 1 ) ] = y k + h × t ( x k + 1 ) 1 − h × g ( x k + 1 ) \begin{array}{ll} y_{k+1} &=& y_{k} + h \times y'_{k+1} \\ \\ &=& y_k + h \times [g(x_{k+1}) \times y_{k+1} + t(x_{k+1})] \\ \\ &=& \frac{y_k + h \times t(x_{k+1})}{1-h \times g(x_{k+1})} \\ \end{array} yk+1===yk+h×yk+1′yk+h×[g(xk+1)×yk+1+t(xk+1)]1−h×g(xk+1)yk+h×t(xk+1)
def implicitEuler(x0, y0, threshold, h, g, t):
"""
隐式Euler方法
:param x0: x初值
:param y0: y初值
:param threshold: 上界,阈值
:param h: 步长
:param g: y'=g*y+t
:param t: y'=g*y+t
:return: 包含迭代过程中出现的(x,y)坐标的一个字典
"""
x = x0
y = y0
xList = [x]
yList = [y]
result = {'x': xList,
'y': yList}
while True:
# 终止条件
if x >= threshold:
break
# 迭代公式, 注意这里是 t(x+h)
y = (y + h * t(x + h)) / (1 - h * g(x))
# 更新x, 推进迭代过程
x = x + h
# 保存数据
result['x'].append(x)
result['y'].append(y)
return result
加权平均 ⇒ \Rightarrow ⇒ Runge-Kutta方法
y k + 1 = y k + h × ( 1 2 y k ′ + 1 2 y k + 1 ′ ) \begin{array}{ll} y_{k+1} &=& y_{k} + h \times (\frac{1}{2}y'_{k} + \frac{1}{2}y'_{k+1}) \\ \end{array} yk+1=yk+h×(21yk′+21yk+1′)
同样在满足 y ′ = g ( x ) × y + t ( x ) y' = g(x) \times y + t(x) y′=g(x)×y+t(x) 条件后, 有
y k + 1 = y k + h × ( 1 2 y k ′ + 1 2 y k + 1 ′ ) = y k + h × 1 2 ( g ( x k ) × y ( x k ) + t ( x k ) + g ( x k + 1 ) × y ( x k + 1 ) + t ( x k + 1 ) ) = ( 1 + 1 2 × h × g ( x k ) ) × y ( x k ) + 1 2 × h × ( t ( x k ) + t ( x k + 1 ) ) 1 − 1 2 × h × g ( x k + 1 ) = ( 2 + h × g k ) × y k + h × ( t k + t k + 1 ) 2 − h × g k + 1 \begin{array}{ll} y_{k+1} &=& y_{k} + h \times (\frac{1}{2}y'_{k} + \frac{1}{2}y'_{k+1}) \\ \\ &=& y_{k} + h \times \frac{1}{2}(g(x_{k})\times y(x_k) + t(x_k) + g(x_{k+1}) \times y(x_{k+1}) + t(x_{k+1})) \\ \\ &=& \frac{(1+\frac{1}{2} \times h \times g(x_k))\times y(x_k) + \frac{1}{2} \times h \times (t(x_{k}) + t(x_{k+1}))}{1-\frac{1}{2}\times h \times g(x_{k+1})} \\ \\ &=& \frac{(2+ h \times g_k)\times y_k + h\times (t_{k} + t_{k+1})}{2- h \times g_{k+1}} \\ \end{array} yk+1====yk+h×(21yk′+21yk+1′)yk+h×21(g(xk)×y(xk)+t(xk)+g(xk+1)×y(xk+1)+t(xk+1))1−21×h×g(xk+1)(1+21×h×g(xk))×y(xk)+21×h×(t(xk)+t(xk+1))2−h×gk+1(2+h×gk)×yk+h×(tk+tk+1)
def middleEuler(x0, y0, threshold, h, g, t):
"""
梯形公式Euler方法
:param x0: x初值
:param y0: y初值
:param threshold: 上界,阈值
:param h: 步长
:param g: y'=g*y+t
:param t: y'=g*y+t
:return: 包含迭代过程中出现的(x,y)坐标的一个字典
"""
x = x0
y = y0
xList = [x]
yList = [y]
result = {'x': xList,
'y': yList}
while True:
# 终止条件
if x >= threshold:
break
# 迭代公式
y = ((2 + h * g(x)) * y + h * (t(x) + t(x + h))) / (2 - h * g(x + h))
# 更新x, 推进迭代过程
x = x + h
# 保存数据
result['x'].append(x)
result['y'].append(y)
return result
不需要隐式法中额外的限制条件, 能够应用于更多的场合
y k + 1 ( 1 ) = y k + h × f ( x k , y k ) y k + 1 = y k + h × f ( x k , y k ) + f ( x k + 1 , y k + 1 ( 1 ) ) 2 \begin{array}{ll} y_{ k + 1 }^{(1)} &=& y _ { k } + h \times f ( x _ { k } , y _ { k } ) \\ \\ y_{k + 1} &=& y _ { k } + h \times \frac { f ( x _ { k } , y _ { k } ) + f ( x _ { k + 1 } , y^{(1)}_{ k + 1 } ) } { 2 } \\ \end{array} yk+1(1)yk+1==yk+h×f(xk,yk)yk+h×2f(xk,yk)+f(xk+1,yk+1(1))
def optimizateEuler(x0, y0, threshod, h, f):
x = x0
y = y0
xList = [x]
yList = [y]
result = {'x': xList,
'y': yList}
while True:
if x >= threshod:
break
# euler公式预测
y_tmp = y + h * f(x, y)
# 改进euler公式校正
y = y + h * (f(x, y) + f(x + h, y_tmp)) / 2
x = x + h
# 保存数据
result['x'].append(x)
result['y'].append(y)
return result
对于任意一个常微分方程问题, 假设能够解出其精确解 y ( x ) y(x) y(x), 那么在同一基准线上, 仅仅比较下一次精确解的准确值和迭代公式的估计值的差即为局部截断误差.
T n + 1 = y ( x n + h ) − y ^ n + 1 ( x n , y n ) = y ( x n + h ) − [ y ( x n ) + h × y ′ ( x n ) ] = y ( x n ) + y ′ ( x n ) × h + y ′ ′ ( x n ) 2 ! × h 2 + O ( h 3 ) − [ y ( x n ) + h × y ′ ( x n ) ] ( 泰勒展开 ) = y ′ ′ ( x n ) 2 ! × h 2 + O ( h 3 ) \begin{array}{ll} T_{n+1} &=& y(x_{n} + h) - \hat{y}_{n+1}(x_n, y_n)\\ \\ &=& y(x_{n}+h) - [y(x_n) + h \times y'(x_n)]\\ \\ &=& y(x_n) + y'(x_n) \times h + \frac{y''(x_n)}{2!} \times h^2 + O(h^3) - [y(x_n) + h \times y'(x_n)] &(泰勒展开)\\ \\ &=& \frac{y''(x_n)}{2!} \times h^2 + O(h^3) \end{array} Tn+1====y(xn+h)−y^n+1(xn,yn)y(xn+h)−[y(xn)+h×y′(xn)]y(xn)+y′(xn)×h+2!y′′(xn)×h2+O(h3)−[y(xn)+h×y′(xn)]2!y′′(xn)×h2+O(h3)(泰勒展开)
之所以称之为局部截断误差, 是因为除了在初值条件的时候, 精确解和迭代公式都不在同一基准线上, 迭代公式每一步都会产生误差, 因此逐渐偏离基准线, 整体截断误差应该表示为 y ( x n + h ) − y ^ n + 1 ( x n , y ^ n ) y(x_n+h)-\hat{y}_{n+1}(x_n, \hat{y}_n) y(xn+h)−y^n+1(xn,y^n)
加权平均 ⇒ \Rightarrow ⇒ Runge-Kutta方法
y k + 1 = y k + h × ( ∑ i = 0 n ( λ i × k i ) \begin{array}{ll} y_{k+1} &=& y_{k} + h \times (\sum_{i=0}^{n}(\lambda_i \times k_i) \\ \end{array} yk+1=yk+h×(∑i=0n(λi×ki)
其中: k i k_i ki 满足一系列规则
没懂
绝对稳定性用来对步长的选取进行限制, 不能任意选择
通过Taylor展开并局部线性化, 一般形式的一阶微分方程总可以化作如下的模型方程
y ′ = ∂ y ′ ( x , y ) ∂ y × y = ∂ f ( x , y ) ∂ y × y = λ × y \begin{array}{ll} y' &=& \frac{\partial y'(x,y)}{\partial y} \times y \\ \\ &=& \frac{\partial f(x,y)}{\partial y} \times y \\ \\ &=& \lambda \times y \\ \end{array} y′===∂y∂y′(x,y)×y∂y∂f(x,y)×yλ×y
单步法经过整理后, 可以得到形式如下
y n + 1 = E ( λ h ) × y n 其中 E ( λ h ) 由选择的方法决定 \begin{array}{ll} y_{n+1} &=& E(\lambda h) \times y_n &其中E(\lambda h)由选择的方法决定\\ \end{array} yn+1=E(λh)×yn其中E(λh)由选择的方法决定
误差传播公式同上
e n + 1 = E ( λ h ) × e n \begin{array}{ll} e_{n+1} &=& E(\lambda h) \times e_n \\ \end{array} en+1=E(λh)×en
为保证绝对稳定, 因此需要满足条件 ∣ E ( λ h ) ∣ ≤ 1 |E(\lambda h)| \le 1 ∣E(λh)∣≤1
任取一个非零向量 u 0 = k 1 e 1 + k 2 e 2 + ⋯ k n e n u_0 = k_1 e_1 + k_2 e_2 + \cdots k_n e_n u0=k1e1+k2e2+⋯knen
迭代公式
u k = A ⋅ u k − 1 = A k ⋅ u 0 = A k ⋅ ( k 1 e 1 + k 2 e 2 + ⋯ k n e n ) ≈ ( λ 1