当前位置: 代码网 > it编程>前端脚本>Python > 【数值计算方法】数值积分&微分-python实现-p3

【数值计算方法】数值积分&微分-python实现-p3

2024年08月03日 • Python •我要评论
原文链接:https://www.cnblogs.com/aksoam/p/18279394更多精彩,关注博客园主页,不断学习!不断进步!

原文链接:https://www.cnblogs.com/aksoam/p/18332123
更多精彩,关注博客园主页,不断学习!不断进步!

我的主页

csdn很少看私信,有事请b站私信

博客园主页-发文字笔记-常用

有限元鹰的主页 内容:

  1. abaqus数值模拟相关
  2. python科学计算
  3. 开源框架,编程学习笔记

哔哩哔哩主页-发视频-常用

fe-有限元鹰的个人空间 内容:

  1. 模拟案例
  2. 网格划分
  3. 游戏视频,及其他搬运视频

6. 多重积分

本节考虑多重积分的两种计算方法:

  • 第一种方法可看成前面几节关于单重积分的推广 ,计算重数较小的积分时有效 .
  • 第二种方法称为蒙特卡罗 (monte carlo) 方法 , 是一种随机算法 , 处理高维积分时特别有效

6.1 从一重积分推广到二重积分

以二重积分为例,考虑:

i = ∬ ω f ( x , y ) d x d y , i=\iint_{\omega}f(x,y)\mathrm{d}x\mathrm{d}y, i=∬ω​f(x,y)dxdy,

其中, ω = a ≤ x ≤ b , φ 1 ( x ) ≤ y ≤ φ 2 ( x ) \omega={a\leq x\leq b,\varphi_1(x)\leq y\leq \varphi_2(x)} ω=a≤x≤b,φ1​(x)≤y≤φ2​(x)

img

根据二重积分性质:

i = ∬ ω f ( x , y ) d x d y = ∫ a b d x ∫ φ 1 ( x ) φ 2 ( x ) f ( x , y ) d y . i=\iint_\omega f(x,y)\mathrm{d}x\mathrm{d}y=\int_a^b\mathrm{d}x\int_{\varphi_1(x)}^{\varphi_2(x)}f(x,y)\mathrm{d}y. i=∬ω​f(x,y)dxdy=∫ab​dx∫φ1​(x)φ2​(x)​f(x,y)dy.

令:

f ( x ) = ∫ φ 1 ( x ) φ 2 ( x ) f ( x , y ) d y , f(x)=\int_{\varphi_1(x)}^{\varphi_2(x)}f(x,y)\mathrm{d}y, f(x)=∫φ1​(x)φ2​(x)​f(x,y)dy,

i = ∫ a b f ( x ) d x ≈ ∑ i = 0 n ω i ( 1 ) f ( x i ) . i=\int_a^bf(x)\mathrm{d}x\approx\sum_{i=0}^n\omega_i^{(1)}f(x_i). i=∫ab​f(x)dx≈i=0∑n​ωi(1)​f(xi​).

为了求出 f ( x i ) f(x_i) f(xi​),将区间 [ φ 1 ( x ) , φ 2 ( x ) ] [\varphi_1(x),\varphi_2(x)] [φ1​(x),φ2​(x)] 分为m份. 利用单重积分求积公式得:

f ( x i ) = ∫ φ 1 ( x i ) φ 2 ( x i ) f ( x i , y ) d y ≈ ∑ j = 0 m ω j ( 2 ) f ( x i , y j ) . f(x_i)=\int_{\varphi_1(x_i)}^{\varphi_2(x_i)}f(x_i,y)\mathrm{d}y\approx\sum_{j=0}^m\omega_j^{(2)}f(x_i,y_j). f(xi​)=∫φ1​(xi​)φ2​(xi​)​f(xi​,y)dy≈j=0∑m​ωj(2)​f(xi​,yj​).

ω i ( 1 )  和  ω j ( 2 ) \omega_i^{(1)}\text{ 和 }\omega_j^{(2)} ωi(1)​ 和 ωj(2)​ 分别是 x 方向和 y 方向的求积系数.记 ω i j = ω i ( 1 ) ⋅ ω j ( 2 ) \omega_{ij}=\omega_i^{(1)}\cdot\omega_j^{(2)} ωij​=ωi(1)​⋅ωj(2)​ ,则有二重积分的求积公式:

i = ∬ ω f ( x , y ) d x d y ≈ ∑ i = 0 n ∑ j = 0 m ω i j f ( x i , y j ) . (8) i=\iint_\omega f(x,y)\mathrm{d}x\mathrm{d}y\approx\sum_{i=0}^n\sum_{j=0}^m\omega_{ij}f(x_i,y_j).\tag{8} i=∬ω​f(x,y)dxdy≈i=0∑n​j=0∑m​ωij​f(xi​,yj​).(8)

因此一般来说 , 计算高维数值积分用复合辛普森公式以及前几节介绍的方法都失效.

6.2 蒙特卡罗方法

记 x i ( i = 1 , 2 , ⋅ ⋅ ⋅ , n ) x_i (i = 1,2,··· ,n) xi​(i=1,2,⋅⋅⋅,n) 为相互独立的服从区间 [0,1] 上均匀分布的随机变量,则:

i n [ f ] = 1 n ∑ i = 1 n f ( x i ) . i_n[f]=\frac{1}{n}\sum_{i=1}^nf(x_i). in​[f]=n1​i=1∑n​f(xi​).

x i x_i xi​ 可通过 n 次独立实验得到 . 由概率论中的大数定理 , 当 n → ∞ 时 , i n [f] 依概率收敛于 f(x)的积分值, 即:

i n [ f ] → p i [ f ] . i_n[f]\xrightarrow{\mathrm{p}}i[f]. in​[f]p ​i[f].

可以估计f的方差 v a r ( f ) var(f) var(f) ,取随机变量x的n个样本值 x 1 , x 2 , ⋯   , x n x_1,x_2,\cdots,x_n x1​,x2​,⋯,xn​ ,令:

i ‾ n = 1 n ∑ i = 1 n f ( x i ) . \overline{i}_n=\frac{1}{n}\sum_{i=1}^{n}f(x_i). in​=n1​i=1∑n​f(xi​).

then:

var ⁡ ( f ) ≈ 1 n ∑ i = 1 n ( f ( x i ) − i ‾ n ) 2 {\operatorname{var}(f)}\approx{\frac{1}{n}}\sum_{i=1}^{n}(f(x_{i})-\overline{i}_{n})^{2} var(f)≈n1​i=1∑n​(f(xi​)−in​)2

这个思路推广到高维积分:

i = ∫ 0 1 ⋯ ∫ 0 1 f ( x 1 , x 2 , ⋯   , x d ) d x 1 d x 2 ⋯ d x d . i=\int_0^1\cdots\int_0^1f(x_1,x_2,\cdots,x_d)\mathrm{d}x_1\mathrm{d}x_2\cdots\mathrm{d}x_d. i=∫01​⋯∫01​f(x1​,x2​,⋯,xd​)dx1​dx2​⋯dxd​.

仍可取 n 次独立样本值的算术平均:

i n [ f ] = 1 n ∑ i = 1 n f ( x 1 ( i ) , x 2 ( i ) , ⋯   , x d ( i ) ) i_n[f]=\frac{1}{n}\sum_{i=1}^nf(x_1^{(i)},x_2^{(i)},\cdots,x_d^{(i)}) in​[f]=n1​i=1∑n​f(x1(i)​,x2(i)​,⋯,xd(i)​)

作为多重积分 i 的无偏估计量 , 其方差仍为 v a r ( f ) n \frac{\mathrm{var}(f)}{n} nvar(f)​,收敛速度不受积分区域维数 d 的影响.

  • 推广到[a,b]的积分范围

那么,如果计算积分:

i = ∫ a b f ( x ) d x i=\int_a^bf(x)dx i=∫ab​f(x)dx

对应的蒙特卡洛积分为

i n = 1 n ∑ i = 1 n f ( x i ) p d f ( x i ) i^n=\frac1n\sum_{i=1}^n\frac{f(x_i)}{pdf(x_i)} in=n1​i=1∑n​pdf(xi​)f(xi​)​

其中, p d f ( x i ) pdf(x_i) pdf(xi​) 是概率密度函数, 它描述了随机变量x的概率分布.之前的xu(0,1),pdf(x)=1/(1-0),如果xu(a,b),则pdf(x)=1/(b-a).

  • 积分范围推广到[-inf,+inf]的蒙特卡洛方法

积分:

f = ∫ − ∞ + ∞ f ( x ) d x . f=\int_{-\infty}^{+\infty}f(x)\mathrm{d}x. f=∫−∞+∞​f(x)dx.

可以看成是服从于正态分布随机变量 x 的函数 h(x) 的数学期望, 通过 n 次独立取样的算术平均近似计算:

f ≈ f n = 1 n ∑ i = 1 n h ( x i ) , h ( x ) = 2 π e x 2 2 f ( x ) . f\approx f_{n}=\frac{1}{n}\sum_{i=1}^{n}h(x_{i}),\quad h(x)=\sqrt{2\pi}\mathrm{e}^{\frac{x^{2}}{2}}f(x). f≈fn​=n1​i=1∑n​h(xi​),h(x)=2π ​e2x2​f(x).

可以证明: e ( f n ) = f e(f_n)=f e(fn​)=f

数值微分

介绍两种近似方法:

  • 基于拉格朗日插值多项式的求导方法
  • 基于样条函数的求导方法

7.基于拉格朗日插值多项式的求导方法

已知 f ( x ) f(x) f(x) 在离散点处的函数值 f ( x i ) ( i = 1 , 2 , ⋅ ⋅ ⋅ , n ) f(x_i )(i = 1,2,··· ,n) f(xi​)(i=1,2,⋅⋅⋅,n), 可以作出 n 次拉格朗日插值多项式 l n ( x ) l_n(x) ln​(x) ,再利用 l n ( x ) l_n(x) ln​(x) 的导数来近似代替 f ( x ) f(x) f(x) 的导数 , 此方法称为基于拉格朗日插值多项式的数值求导方法

插值余项为:

r n ( x ) = f ( x ) − l n ( x ) = f ( n + 1 ) ( ξ ) ( n + 1 ) ! π ( x ) , ξ ∈ ( a , b ) . r_{n}(x)=f(x)-l_{n}(x)=\frac{f^{(n+1)}(\xi)}{(n+1)!}\pi(x),\quad\xi\in(a,b). rn​(x)=f(x)−ln​(x)=(n+1)!f(n+1)(ξ)​π(x),ξ∈(a,b).

r n ′ ( x ) = f ′ ( x i ) − l n ′ ( x i ) = f ( n + 1 ) ( ξ ) ( n + 1 ) ! π ′ ( x i ) = f ( n + 1 ) ( ξ ) ( n + 1 ) ! ∏ j = 0 , j ≠ i n ( x i − x j ) . (10) r'_{n}(x)=f'(x_i)-l'_n(x_i)=\frac{f^{(n+1)}(\xi)}{(n+1)!}\pi'(x_i)=\frac{f^{(n+1)}(\xi)}{(n+1)!}\prod_{j=0,j\neq i}^n(x_i-x_j).\tag{10} rn′​(x)=f′(xi​)−ln′​(xi​)=(n+1)!f(n+1)(ξ)​π′(xi​)=(n+1)!f(n+1)(ξ)​j=0,j=i∏n​(xi​−xj​).(10)

以下是基于等距节点的低阶求导计算公式

两点公式

作 f(x) 的线性插值公式:

l 1 ( x ) = x − x 1 x 0 − x 1 f ( x 0 ) + x − x 0 x 1 − x 0 f ( x 1 ) , l_1(x)=\frac{x-x_1}{x_0-x_1}f(x_0)+\frac{x-x_0}{x_1-x_0}f(x_1), l1​(x)=x0​−x1​x−x1​​f(x0​)+x1​−x0​x−x0​​f(x1​),

求导后,令 x = x 0 , x 1 − x 0 = h , x=x_0, x_1-x_0=h, x=x0​,x1​−x0​=h,得:

l 1 ′ ( x 0 ) = f ( x 1 ) − f ( x 0 ) h . l_1'(x_0)=\frac{f(x_1)-f(x_0)}h. l1′​(x0​)=hf(x1​)−f(x0​)​.

根据公式(10),余项为 f ′ ′ ( ξ ) 2 ( x 0 − x 1 ) \frac{f^{\prime\prime}(\xi)}{2}(x_0-x_1) 2f′′(ξ)​(x0​−x1​),即:

f ′ ( x 0 ) = f ( x 1 ) − f ( x 0 ) h − h 2 f ′ ′ ( ξ ) , ξ ∈ ( x 0 , x 1 ) . (11-1) f^{\prime}(x_{0})=\frac{f(x_{1})-f(x_{0})}{h}-\frac{h}{2}f^{\prime\prime}(\xi),\quad\xi\in(x_{0},x_{1}).\tag{11-1} f′(x0​)=hf(x1​)−f(x0​)​−2h​f′′(ξ),ξ∈(x0​,x1​).(11-1)

f ′ ( x 1 ) = f ( x 1 ) − f ( x 0 ) h + h 2 f ′ ′ ( ξ ) , ξ ∈ ( x 0 , x 1 ) . (11-2) f^{\prime}(x_{1})=\frac{f(x_{1})-f(x_{0})}{h}+\frac{h}{2}f^{\prime\prime}(\xi),\quad\xi\in(x_{0},x_{1}).\tag{11-2} f′(x1​)=hf(x1​)−f(x0​)​+2h​f′′(ξ),ξ∈(x0​,x1​).(11-2)

略去余项,(11-1),(11-2)称为计算导数的两点公式.分别是向前差商公式和向后差商公式,精度1阶,误差 o ( h ) o(h) o(h).

三点及五点公式

作 f(x) 的二次插值多项式:

l 2 ( x ) = ( x − x 1 ) ( x − x 2 ) ( x 0 − x 1 ) ( x 0 − x 2 ) f ( x 0 ) + ( x − x 0 ) ( x − x 1 ) ( x 1 − x 0 ) ( x 1 − x 2 ) f ( x 1 ) + ( x − x 0 ) ( x − x 1 ) ( x 2 − x 0 ) ( x 2 − x 1 ) f ( x 2 ) . l_2(x)=\frac{(x-x_1)(x-x_2)}{(x_0-x_1)(x_0-x_2)}f(x_0)+\frac{(x-x_0)(x-x_1)}{(x_1-x_0)(x_1-x_2)}f(x_1)+\frac{(x-x_0)(x-x_1)}{(x_2-x_0)(x_2-x_1)}f(x_2). l2​(x)=(x0​−x1​)(x0​−x2​)(x−x1​)(x−x2​)​f(x0​)+(x1​−x0​)(x1​−x2​)(x−x0​)(x−x1​)​f(x1​)+(x2​−x0​)(x2​−x1​)(x−x0​)(x−x1​)​f(x2​).

令 x = x 0 + t h , x i = x 0 + i h , x=x_0+th, x_i=x_0+ih, x=x0​+th,xi​=x0​+ih, 上式变成:

l 2 ( x 0 + t h ) = 1 2 ( t − 1 ) ( t − 2 ) f ( x 0 ) − t ( t − 2 ) f ( x 1 ) + 1 2 t ( t − 1 ) f ( x 2 ) , l_2(x_0+th)=\frac{1}{2}(t-1)(t-2)f(x_0)-t(t-2)f(x_1)+\frac{1}{2}t(t-1)f(x_2), l2​(x0​+th)=21​(t−1)(t−2)f(x0​)−t(t−2)f(x1​)+21​t(t−1)f(x2​),

求导,并令t=0,1,2,得:

f ′ ( x 0 ) = 1 2 h [ − 3 f ( x 0 ) + 4 f ( x 1 ) − f ( x 2 ) ] + h 2 3 f ( 3 ) ( ξ ) , f ′ ( x 1 ) = 1 2 h [ − f ( x 0 ) + f ( x 2 ) ] − h 2 6 f ( 3 ) ( ξ ) , f ′ ( x 2 ) = 1 2 h [ f ( x 0 ) − 4 f ( x 1 ) + 3 f ( x 2 ) ] + h 2 3 f ( 3 ) ( ξ ) . (12) \begin{aligned} &f^{\prime}(x_{0}) = \frac{1}{2h}[-3f(x_{0})+4f(x_{1})-f(x_{2})]+\frac{h^{2}}{3}f^{(3)}(\xi), \\ &f^{\prime}(x_{1}) = \frac{1}{2h}[-f(x_{0})+f(x_{2})]-\frac{h^{2}}{6}f^{(3)}(\xi), \\ &f^{\prime}(x_{2}) = \frac{1}{2h}[f(x_{0})-4f(x_{1})+3f(x_{2})]+\frac{h^{2}}{3}f^{(3)}(\xi).\tag{12} \end{aligned} ​f′(x0​)=2h1​[−3f(x0​)+4f(x1​)−f(x2​)]+3h2​f(3)(ξ),f′(x1​)=2h1​[−f(x0​)+f(x2​)]−6h2​f(3)(ξ),f′(x2​)=2h1​[f(x0​)−4f(x1​)+3f(x2​)]+3h2​f(3)(ξ).​(12)

以上是带余项的计算导数的三点公式,精度2阶,误差 o ( h 2 ) o(h^2) o(h2).(12-2)为中心差商公式.

同理,五点求导公式为:

f ′ ( x 0 ) = 1 12 h ( − 25 f 0 + 48 f 1 − 36 f 2 + 16 f 3 − 3 f 4 ) + h 4 5 f ( 5 ) ( ξ ) , f ′ ( x 1 ) = 1 12 h ( − 3 f 0 − 10 f 1 + 18 f 2 − 6 f 3 + f 4 ) − h 4 20 f ( 5 ) ( ξ ) , f ′ ( x 2 ) = 1 12 h ( f 0 − 8 f 1 + 8 f 3 − f 4 ) − h 4 30 f ( 5 ) ( ξ ) , f ′ ( x 3 ) = 1 12 h ( − f 0 + 6 f 1 − 18 f 2 + 10 f 3 + 3 f 4 ) − h 4 20 f ( 5 ) ( ξ ) , f ′ ( x 4 ) = 1 12 h ( 3 f 0 − 16 f 1 + 36 f 2 − 48 f 3 + 25 f 4 ) + h 4 5 f ( 5 ) ( ξ ) . (13) \begin{aligned} &f'(x_{0}) =\frac{1}{12h}(-25f_{0}+48f_{1}-36f_{2}+16f_{3}-3f_{4})+\frac{h^{4}}{5}f^{(5)}(\xi), \\ &f'(x_{1}) =\frac{1}{12h}(-3f_{0}-10f_{1}+18f_{2}-6f_{3}+f_{4})-\frac{h^{4}}{20}f^{(5)}(\xi), \\ &f'(x_{2}) =\frac{1}{12h}(f_{0}-8f_{1}+8f_{3}-f_{4})-\frac{h^{4}}{30}f^{(5)}(\xi), \\ &f'(x_{3}) =\frac{1}{12h}(-f_{0}+6f_{1}-18f_{2}+10f_{3}+3f_{4})-\frac{h^{4}}{20}f^{(5)}(\xi), \\ &f'(x_{4}) =\frac{1}{12h}(3f_{0}-16f_{1}+36f_{2}-48f_{3}+25f_{4})+\frac{h^{4}}{5}f^{(5)}(\xi). \tag{13} \end{aligned} ​f′(x0​)=12h1​(−25f0​+48f1​−36f2​+16f3​−3f4​)+5h4​f(5)(ξ),f′(x1​)=12h1​(−3f0​−10f1​+18f2​−6f3​+f4​)−20h4​f(5)(ξ),f′(x2​)=12h1​(f0​−8f1​+8f3​−f4​)−30h4​f(5)(ξ),f′(x3​)=12h1​(−f0​+6f1​−18f2​+10f3​+3f4​)−20h4​f(5)(ξ),f′(x4​)=12h1​(3f0​−16f1​+36f2​−48f3​+25f4​)+5h4​f(5)(ξ).​(13)

8. 基于样条函数的求导方法

max ⁡ a ⩽ x ⩽ b ∣ f ( k ) ( x ) − s ( k ) ( x ) ∣ ⩽ c h 4 − k , k = 0 , 1 , 2 , 3 , \max_{a\leqslant x\leqslant b}|f^{(k)}(x)-s^{(k)}(x)|\leqslant ch^{4-k},\quad k=0,1,2,3, a⩽x⩽bmax​∣f(k)(x)−s(k)(x)∣⩽ch4−k,k=0,1,2,3,

其中, h = max ⁡ 0 ⩽ i ⩽ n − 1 h i . h=\max_{0\leqslant i\leqslant n-1}h_i. h=max0⩽i⩽n−1​hi​.

设 a = x 0 < x 1 < ⋯ < x n = b , h i = x i + 1 − x i ( i = 0 , 1 , ⋯   , n − 1 ) . a=x_0<x_1<\cdots<x_n=b, h_i=x_{i+1}-x_i(i=0,1,\cdots,n-1). a=x0​<x1​<⋯<xn​=b,hi​=xi+1​−xi​(i=0,1,⋯,n−1).,且样条函数s(x)在 x i x_i xi​处的导数为 s ′ ( x i ) = m i s^{\prime}(x_i)=m_i s′(xi​)=mi​,则在区间 ( x i , x i + 1 ) (x_i,x_{i+1}) (xi​,xi+1​)上,s(x)为三次多项式,即:

s i ( x ) = h i + 2 ( x − x i ) h i 3 ( x − x i + 1 ) 2 f i + h i − 2 ( x − x i + 1 ) h i 3 ( x − x i ) 2 f i + 1 + ( x − x i ) ( x − x i + 1 ) 2 h i 2 m i + ( x − x i + 1 ) ( x − x i + 1 ) 2 h i 2 m i + 1 . (14) \begin{gathered} s_i(x) =\frac{h_{i}+2(x-x_{i})}{h_{i}^{3}}(x-x_{i+1})^{2}f_{i}+\frac{h_{i}-2(x-x_{i+1})}{h_{i}^{3}}(x-x_{i})^{2}f_{i+1} \\ +\frac{(x-x_i)(x-x_{i+1})^2}{h_i^2}m_i+\frac{(x-x_{i+1})(x-x_{i+1})^2}{h_i^2}m_{i+1}. \tag{14} \end{gathered} si​(x)=hi3​hi​+2(x−xi​)​(x−xi+1​)2fi​+hi3​hi​−2(x−xi+1​)​(x−xi​)2fi+1​+hi2​(x−xi​)(x−xi+1​)2​mi​+hi2​(x−xi+1​)(x−xi+1​)2​mi+1​.​(14)

想要求出 m i ( i = 0 , 1 , ⋯   , n ) m_i(i=0,1,\cdots,n) mi​(i=0,1,⋯,n).需要 s ′ ′ ( x ) s''(x) s′′(x)在 x i x_i xi​处连续以及边界条件.

  1. 若 s ′ ( x 0 ) = f 0 ′ = m 0 , s ′ ( x n ) = f n ′ = m n s'(x_0)=f_0'=m_0, s'(x_n)=f_n'=m_n s′(x0​)=f0′​=m0​,s′(xn​)=fn′​=mn​已知.m_i满足方程组:

img

img

上述方程组 (5.62), (5.65), (5.66) 称为三转角方程组 . 可用追赶法进行求解 . 再将计算结果代入式 (5.61) 中便得 s(x) 以及 s(x) 在任意点 x 处的导数值

由于上述求导数的方法需要求解线性方程组 , 因此也称为隐式格式 . 它具有数值计算稳定的特点 , 可以求出任意点 ( 不一定为节点 ) 的导数值 , 而且精度较高 .

数值实验

img

# 数值实验t1
from formu_lib import *
def com3pgausslengendre(f,a:float,b:float,n:int):
    # 复合三点高斯-勒让德计算积分
    x=[a+i*(b-a)/n for i in range(n+1)]
    return sum([integ1dguasslegendre(f,x[i],x[i+1],3)for i in range(n)])

# 积分函数
pi=lambda x: 4/(1+x**2)

# 积分范围
a,b=0,1

# 复合simpson计算积分
r1=varstepinteg1d(pi,a,b,1e-8,method=3)

r2=com3pgausslengendre(pi,a,b,100)
showerror(r1,np.pi)
showerror(r2,np.pi)
# 数值解: 3.1415926535528365, 精确解: 3.141592653589793, 误差: 1.1763670223853885e-11
# 数值解: 3.1415926535897927, 精确解: 3.141592653589793, 误差: 1.4135798584282297e-16

img

# t2
from formu_lib import *

# 积分函数
f=lambda x: np.sqrt(4-np.sin(x)**2)
a,b=0,np.pi/4

r1=varstepinteg1d(f,a,b,1e-6,method=3)
showerror(r1,1.53439197)
# 数值解: 1.5343920054108953, 精确解: 1.53439197, 误差: -2.3078128678621626e-08

img

求解代码:

from formu_lib import *

# 积分函数
f8=lambda x: 1/(1+x**2)
a,b=-5,5

result=[]
accurateval=[]
ns=[]
for n in range(1,51):
    result.append(integ1dnewtoncotes(f8,a,b,n))
    ns.append(n)
    accurateval.append(2*np.arctan(5))

from matplotlib import pyplot as plt
plt.plot(ns,result,label='numerical solution')
plt.plot(ns,accurateval,label='accurate solution')
plt.xlabel('newton-cotes points number')
plt.ylabel(' integrate value')
plt.title('newton-cotes integration value vs points number')
plt.show()

img

从上图可以看出,当随着n的增加, 牛顿-科特斯积分的逐渐不稳定, 但误差也越来越大.不收敛.

img

code:

# t4
from formu_lib import *
x=[1900,1910,1920,1930,1940,1950,1960,1970,1980,1990]
fs=[76.0,92.0,106.5,123.2,131.7,150.7,179.3,204.0,226.5,251.4]

df1=diff1dforward(x,fs)
df2=diff1dbackward(x,fs)
df3=diff1dcentral(x,fs)
plotlines([x,x[:],x[:],x],[fs,df1,df2,df3],["population","population growth rate-forward","population growth rate-backward","population growth rate-center"])

alt text

img

img

资料:显式和隐式方法 - 维基百科,自由的百科全书

取步长为h,则: x i = a + i h , i = 0 , 1 , 2 , . . . , n , h = b − a n , x i + 1 − x i = h . x_{i}=a+ih,i=0,1,2,...,n,h=\frac{b-a}{n},x_{i+1}-x_{i}=h. xi​=a+ih,i=0,1,2,...,n,h=nb−a​,xi+1​−xi​=h. 使用向前差商公式,则有:

y ′ ( x i ) = y ( x i + 1 ) − y ( x i ) h y'(x_{i})=\frac{y(x_{i+1})-y(x_{i})}{h} y′(xi​)=hy(xi+1​)−y(xi​)​

代入方程后:

y ( x i + 1 ) − y ( x i ) = h f [ x i , y ( x i ) ] , y(x_{i+1})-y(x_{i})=h f[x_{i},y(x_{i})], y(xi+1​)−y(xi​)=hf[xi​,y(xi​)],

y ( x i + 1 ) = y ( x i ) + h f [ x i , y ( x i ) ] , y(x_{i+1})=y(x_{i})+h f[x_{i},y(x_{i})], y(xi+1​)=y(xi​)+hf[xi​,y(xi​)],

这是显式格式.

如果使用向后差商公式,则有:

y ′ ( x i + 1 ) = y ( x i + 1 ) − y ( x i ) h y'(x_{i+1})=\frac{y(x_{i+1})-y(x_{i})}{h} y′(xi+1​)=hy(xi+1​)−y(xi​)​

代入方程后:

y ( x i + 1 ) − y ( x i ) = h f [ x i + 1 , y ( x i + 1 ) ] , y(x_{i+1})-y(x_{i})=h f[x_{i+1},y(x_{i+1})], y(xi+1​)−y(xi​)=hf[xi+1​,y(xi+1​)],

y ( x i + 1 ) − h f [ x i + 1 , y ( x i + 1 ) ] = y ( x i ) y(x_{i+1})-h f[x_{i+1},y(x_{i+1})]=y(x_{i}) y(xi+1​)−hf[xi+1​,y(xi+1​)]=y(xi​)

这是隐式格式

  • 验证

取 f ( x , y ) = − y 2 , a = 0 , y ( 0 ) = 1 , b = 5 > x > a , n 取值为 100 f(x,y)=-y^2,a=0,y(0)=1,b=5>x>a,n取值为100 f(x,y)=−y2,a=0,y(0)=1,b=5>x>a,n取值为100,则:

# t6
from formu_lib import *
import numpy as np
a,b,n=0,5,100
h=(b-a)/n
x=[a+i*h for i in range(n+1)]

f=lambda x: -x*x

# result var
ye,yi=np.zeros(n+1),np.zeros(n+1)
ye[0],yi[0]=1,1

# explicit method
for i in range(n):
    ye[i+1]=ye[i]+h*f(ye[i])

# implicit method
for i in range(n):
    yi[i+1]=(-1-np.sqrt(1+4*h*yi[i]))/(2*h)

plotlines([x,x],[ye,yi],["y(x)-explictsol","y(x)-implicitsol"])

img

精确结果:
img

赞 (0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com