通俗易懂的Monte Carlo积分方法(四)

本文详细阐述了蒙特卡洛方法的理论目标,包括辛钦大数定律与中心极限定理的应用,探讨了误差描述、收敛性以及如何通过增大样本量和优化随机变量减少误差。实例演示了如何使用Python计算三维积分,并展示了误差预测的实战应用。
摘要由CSDN通过智能技术生成

1.理论目标

​ 利用辛钦大数定律中心极限定理 M e n t o C a r l o Mento Carlo MentoCarlo方法的收敛性和误差进行定量的描述。

2.收敛性的描述

​ 若随机变量 X i ( i = 1 , 2 , . . . N ) X_i(i=1,2,...N) Xi(i=1,2,...N)独立同分布的随机变量,其期望值 E x < ∞ Ex<\infty Ex<,由辛钦大数定律计算可以得到如下关系, ∀ ϵ > 0 : \forall \epsilon>0: ϵ>0:
l i m N → ∞ P { ∣ 1 N ∑ i = 1 N X i − E x ∣ < ϵ } = 1 lim_{N\rightarrow\infty}P\{|\frac{1}{N}\sum_{i=1}^{N}X_i-Ex|<\epsilon\}=1 limNP{N1i=1NXiEx<ϵ}=1
​ 如果我们设:
X ‾ N = 1 N ∑ i = 1 N X i \overline{X}_N=\frac{1}{N}\sum_{i=1}^NX_i XN=N1i=1NXi
​ 那么当 N → ∞ N\rightarrow \infty N时, X ‾ N \overline{X}_N XN依概率 1 1 1收敛到 E x Ex Ex。这就是其收敛性的数学基础。

3.误差的描述与控制

​ 若随机变量 X i ( i = 1 , 2 , . . . N ) X_i(i=1,2,...N) Xi(i=1,2,...N)独立同分布的随机变量,且具有误差 σ 2 ( σ 2 ≠ 0 ) \sigma^2(\sigma^2\ne0) σ2(σ2=0),且:
σ 2 = ∫ − ∞ ∞ ( x − E x ) 2 f ( x ) d x < ∞ \sigma^2=\int_{-\infty}^{\infty}(x-Ex)^2f(x)dx<\infty σ2=(xEx)2f(x)dx<
​ 其中: E x Ex Ex为数学期望, f ( x ) f(x) f(x) X i X_i Xi的概率密度函数。

​ 如果我们设样本个数为 N N N,且 X ‾ N = 1 N ∑ i = 1 N X i \overline{X}_N=\frac{1}{N}\sum_{i=1}^NX_i XN=N1i=1NXi,由中心极限定理:
l i m n → ∞ ∑ i = 1 N X i ∼ N ( N E x , N σ 2 ) lim_{n \rightarrow \infty}\sum_{i=1}^NX_i \sim N(NEx,N\sigma^2) limni=1NXiN(NEx,Nσ2)
​ 得到如下的数学关系:
l i m N → ∞ P { ∣ ∑ i = 1 N X i − N E x N σ 2 ∣ < λ a } = 1 2 π ∫ − λ a λ a e − t 2 2 d t lim_{N \rightarrow \infty}P\{|\frac{\sum_{i=1}^NX_i-NEx}{\sqrt{N\sigma^2}}|<\lambda_a\}=\frac{1}{\sqrt{2\pi}}\int_{-\lambda_a}^{\lambda_a}e^{-\frac{t^2}{2}}dt limNP{Nσ2 i=1NXiNEx<λa}=2π 1λaλae2t2dt
​ 化简一下:
l i m N → ∞ P { ∣ X ‾ N − E x ∣ < λ a σ N } = 2 2 π ∫ 0 λ a e − t 2 2 d t = 1 − α lim_{N\rightarrow\infty}P\{|\overline{X}_N-Ex|<\frac{\lambda_a \sigma}{\sqrt{N}}\}=\frac{2}{\sqrt{2\pi}}\int_0^{\lambda_a}e^{-\frac{t^2}{2}}dt=1-\alpha limNP{XNEx<N λaσ}=2π 20λae2t2dt=1α
​ 其中, α \alpha α为置信度,当 α = 0.5 , 0.05 , 0.003 \alpha=0.5,0.05,0.003 α=0.5,0.05,0.003时, λ a \lambda_a λa分别对应于 0.6745 , 1.96 , 3 0.6745,1.96,3 0.6745,1.96,3

​ 因此我们可以给出误差的定量描述: ∣ X ‾ N − E x ∣ < λ a σ N |\overline{X}_N-Ex|<\frac{\lambda_a\sigma}{\sqrt{N}} XNEx<N λaσ 1 − α 1-\alpha 1α的概率成立。而且误差的收敛速度的阶数为 O ( N − 1 2 ) O(N^{-\frac{1}{2}}) O(N21)。因此到后面随着 N N N的增加,误差收敛的速度会越来越慢。

​ 如果我们做一下定义 ϵ \epsilon ϵ为误差:
ϵ = λ a σ N \epsilon = \frac{\lambda_a\sigma}{\sqrt{N}} ϵ=N λaσ
​ 那么要想控制 N N N使得误差以 1 − α 1-\alpha 1α的概率小于 ϵ \epsilon ϵ,那么:
N > ( λ a σ ϵ ) 2 N>(\frac{\lambda_a\sigma}{\epsilon})^2 N>(ϵλaσ)2
​ 或者控制 σ \sigma σ使得误差以 1 − α 1-\alpha 1α的概率小于 ϵ \epsilon ϵ,那么:
σ < N ϵ λ a \sigma<\frac{\sqrt{N}\epsilon}{\lambda_a} σ<λaN ϵ
​ 如果要控制 N N N的话,那我们就得计算 σ \sigma σ的值,然而 σ \sigma σ的值不太好计算。我们就用下面的式子做 σ \sigma σ的无偏估计:
σ ^ = 1 N ∑ i = 1 N X i 2 − ( 1 N ∑ i = 1 N X i ) 2 \hat{\sigma} = \sqrt{\frac{1}{N}\sum^N_{i=1}X_i^2-(\frac{1}{N}\sum_{i=1}^NX_i)^2} σ^=N1i=1NXi2(N1i=1NXi)2

4.减少误差的技巧

​ 在给定置信度 α \alpha α后, ϵ \epsilon ϵ σ \sigma σ N N N共同决定,那么增大 N N N和减小 σ \sigma σ都可以减小误差 ϵ \epsilon ϵ。但是, ϵ \epsilon ϵ随和 N N N却是呈现平方反比的关系。因此单纯的增大 N N N效果并不明显,还得想办法减小 σ \sigma σ的值来减小误差。

关于减少 σ \sigma σ的各种技巧,本篇博文就不再赘述。

5.代码的实现

要求计算 ∭ Ω x 2 d V \iiint_{\Omega}x^2dV Ωx2dV,其中 Ω : { ( x , y , z ) ∣ x 2 + y 2 ≤ z ≤ 1 } \Omega:\{(x,y,z)|\sqrt{x^2+y^2}\leq z\leq 1\} Ω:{(x,y,z)x2+y2 z1}。并且给出误差的动态描述。规定 α = 0.05 \alpha = 0.05 α=0.05
在这里插入图片描述

#计算Mentor Carlo积分
import random
import matplotlib.pyplot as plt
import math
def Cal_cul(x,y,z):
    if (z<1)&(z>=math.sqrt(x**2+y**2)):
        return x**2
    else:
        return 0

def lambdaTable(alpha):
    if alpha==0.5:
        return 0.6745
    elif alpha == 0.05:
        return 1.96
    else:
        return 3

def int3Cul(a,b,c,Numbers,alpha):
    V = 2*a*2*b*c
    sum1 = 0
    sum2 = 0
    lambda_a = lambdaTable(alpha)
    for i in range(Numbers):
        x = -a+2*a*random.random()
        y = -b+2*b*random.random()
        z = c*random.random()
        sum1 += Cal_cul(x,y,z)
        sum2 += (Cal_cul(x,y,z))**2
    int3Value = V*1/Numbers*sum1
    sigma = math.sqrt(1/Numbers*sum2-(1/Numbers*sum1)**2)
    error = lambda_a*sigma/math.sqrt(Numbers)
    print('在试验次数为{:}的情况下,计算的积分值是{:.3f},有{:.2f}的概率认为误差小于{:.5f}'.format(Numbers,int3Value,1-alpha,error))

if __name__== '__main__':
    int3Cul(1,1,1,10000,0.05)

输出的结果是:

在试验次数为10000的情况下,计算的积分值是0.159,0.95的概率认为误差小于0.00223

Process finished with exit code 0

实际上我们可以知道上述三重积分理论值是 π 20 \frac{\pi}{20} 20π。而计算的积分值是 0.159 0.159 0.159。它们的误差值:
∣ π 20 − 0.159 ∣ = ˙ 0.00192 < 0.00223 |\frac{\pi}{20}-0.159|\dot{=}0.00192<0.00223 20π0.159=˙0.00192<0.00223
说明我们的误差预测大概率是正确的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值