当前位置: 首页 > news >正文

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

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

我的主页

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

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

有限元鹰的主页 内容:

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

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

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

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

文章目录

  • 我的主页
    • 博客园主页-发文字笔记-常用
    • 哔哩哔哩主页-发视频-常用
    • 6. 多重积分
      • 6.1 从一重积分推广到二重积分
      • 6.2 蒙特卡罗方法
  • 数值微分
    • 7.基于拉格朗日插值多项式的求导方法
      • 两点公式
      • 三点及五点公式
    • 8. 基于样条函数的求导方法
  • 数值实验

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 的影响.

在实际计算中, X i X_i Xi一般是程序生成的伪随机数.matlab的rand() 可以产生服从均匀分布U(0,1) 的随机数 ( 实际上是伪随机数 ).python的numpy.random.rand() 可以产生服从均匀分布U(0,1) 的随机数.

  • 推广到[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

资料链接:

  • https://wyman1024.github.io/monte-carlo/
  • https://cosx.org/2010/03/monte-carlo-method-to-compute-integration
  • https://reichtumqian.github.io/ScientificComputingWiKi/

数值微分

讨论如下问题:已知函数 f(x) 在离散点处的函数值 f(x i )(i = 1,2,··· ,n), 求 f(x)导数.

介绍两种近似方法:

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

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 j ) f(x_j) f(xj) 有一定误差以及h很小时,数值误差较大,即算法不稳定.
  • 高次插值会产生龙格现象,因此实际应用中多采用低次拉格朗日插值型求导公式

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

两点公式

作 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).

三点及五点公式

两个公式共同点在于,在一些点处的微分算不出来,微分个数损失.https://www.math.pku.edu.cn/teachers/lidf/docs/statcomp/html/_statcompbook/approx-diff.html

作 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)

五点公式一般比三点公式精确 , 三点公式一般比两点公式精确 ;. 但在实际计算中 , 由于数据 f i f_i fi 有误差 , 并不是h 越小计算效果越好

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

本节我们将用样条函数 S ( x ) S(x) S(x) 代替拉格朗日插值多项式 L n ( x ) L_n(x) Ln(x)作为函数 f ( x ) f(x) f(x)的近似.若 f ( x ) ∈ C 4 [ a , b ] , f(x)\in C^4[a,b], f(x)C4[a,b],则有估计:

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.

此时不但 f(x) 与 S(x) 的函数值很 “ 接近 ”, 它们的导数值也很 “ 接近 ”

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/4r1=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,5result=[]
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

数值积分微分部分完结

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Redis高可用
  • 【pikachu靶场】跨站脚本攻击详细教程Cross-Site Scripting(xss)
  • uni-app便携式蓝牙打印机esc指令改成vue3中使用
  • AI5-PPOCRLabel训练
  • RTL8852bs 初始化流程
  • PLM选型指南:如何选择适合自己企业的系统?
  • 解析capl文件生成XML Test Module对应的xml工具
  • Python面试题:结合Python技术,讲解如何使用OpenCV进行图像处理与计算机视觉任务
  • 平安养老险陕西分公司:反保险欺诈案例(二)——打击保险欺诈,守护金融安全
  • 跨境电商做独立站你需要考虑的几个问题
  • 在线考试系统产品源码功能架构与技术解析
  • IDEA报错无效的目标发行版:17
  • c#中的正则表达式和日期的使用(超全)
  • spring的三级缓存与源码分析--解决循环依赖
  • 内衣洗衣机怎么选?五款超耐用内衣洗衣机推荐!
  • JavaScript 如何正确处理 Unicode 编码问题!
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • ➹使用webpack配置多页面应用(MPA)
  • Asm.js的简单介绍
  • input的行数自动增减
  • java8-模拟hadoop
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Leetcode 27 Remove Element
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • mysql常用命令汇总
  • nginx 配置多 域名 + 多 https
  • nodejs实现webservice问题总结
  • 回流、重绘及其优化
  • 理清楚Vue的结构
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 学习Vue.js的五个小例子
  • 06-01 点餐小程序前台界面搭建
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 函数计算新功能-----支持C#函数
  • #162 (Div. 2)
  • $.ajax()参数及用法
  • (16)Reactor的测试——响应式Spring的道法术器
  • (7)STL算法之交换赋值
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (二)fiber的基本认识
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (一)Thymeleaf用法——Thymeleaf简介
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET/C#⾯试题汇总系列:⾯向对象
  • .NetCore部署微服务(二)
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .NET学习教程二——.net基础定义+VS常用设置
  • .Net转Java自学之路—基础巩固篇十三(集合)