当前位置: 代码网 > 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)} ω=axb,φ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=abdxφ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=abf(x)dxi=0nω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)dyj=0mω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)dxdyi=0nj=0mωijf(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]=n1i=1nf(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=n1i=1nf(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)n1i=1n(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=0101f(x1,x2,,xd)dx1dx2dxd.

仍可取 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]=n1i=1nf(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=abf(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=n1i=1npdf(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). ffn=n1i=1nh(xi),h(x)=2π e2x2f(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=in(xixj).(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)=x0x1xx1f(x0)+x1x0xx0f(x1),

求导后,令 x = x 0 , x 1 − x 0 = h , x=x_0, x_1-x_0=h, x=x0,x1x0=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′′(ξ)(x0x1),即:

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)2hf′′(ξ),ξ(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)+2hf′′(ξ),ξ(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)=(x0x1)(x0x2)(xx1)(xx2)f(x0)+(x1x0)(x1x2)(xx0)(xx1)f(x1)+(x2x0)(x2x1)(xx0)(xx1)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(t1)(t2)f(x0)t(t2)f(x1)+21t(t1)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)]+3h2f(3)(ξ),f(x1)=2h1[f(x0)+f(x2)]6h2f(3)(ξ),f(x2)=2h1[f(x0)4f(x1)+3f(x2)]+3h2f(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+48f136f2+16f33f4)+5h4f(5)(ξ),f(x1)=12h1(3f010f1+18f26f3+f4)20h4f(5)(ξ),f(x2)=12h1(f08f1+8f3f4)30h4f(5)(ξ),f(x3)=12h1(f0+6f118f2+10f3+3f4)20h4f(5)(ξ),f(x4)=12h1(3f016f1+36f248f3+25f4)+5h4f(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, axbmaxf(k)(x)s(k)(x)ch4k,k=0,1,2,3,

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

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+1xi(i=0,1,,n1).,且样条函数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)=hi3hi+2(xxi)(xxi+1)2fi+hi3hi2(xxi+1)(xxi)2fi+1+hi2(xxi)(xxi+1)2mi+hi2(xxi+1)(xxi+1)2mi+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=nba,xi+1xi=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-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com