数学理论—— 蒙特卡洛近似

本文通过数学理论,详细讲解了如何利用蒙特卡洛方法估算圆周率、一元和多元积分,并演示了期望估计的实际应用。通过代码实例展示了如何用随机抽样计算这些复杂数学问题的近似解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 圆周率估算

1.1 理论

  • 边长为2的正方形的横坐标范围为[-1,1],纵坐标为[-1,1]。
  • 数据点(x,y)的横坐标从[-1,1]中均匀抽样得到,纵坐标从[-1,1]中均匀抽样得到,则数据点落在圆内的概率为: p = A 2 A 1 = π 4 p=\frac{A_2}{A_1}=\frac{\pi}{4} p=A1A2=4π
  • 计算误差为: o ( 1 n ) o(\frac{1}{\sqrt{n}}) o(n 1)
    在这里插入图片描述
    则计算圆周率的流程为:
  1. 设定一个大数n,计数器m。
  2. for i = 1 to n: x ← [ − 1 , 1 ] y ← [ − 1 , 1 ] m ← m + 1 ( 当 x 2 + y 2 ≤ 1 时 ) x\gets[-1,1]\\y\gets[-1,1]\\ \\m\gets m+1(当x^2+y^2≤1时) x[1,1]y[1,1]mm+1(x2+y21)
  3. π ← 4 m n \pi \gets \frac{4m}{n} πn4m

1.2 代码实现

import random
n = 10000000
m = 0
for i in range(n):
    x = random.uniform(-1,1)
    y = random.uniform(-1,1)
    if x**2 + y**2 <= 1:
        m += 1
print(4*m/n)    
3.1415656

2. 近似积分

2.1 一元积分(univariate)

  • 计算如下积分: I = ∫ a b f ( x ) d x I=\int_a^b{f(x)}d_x I=abf(x)dx
  1. 从[a,b]中进行n次抽样,得到: x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn
  2. 计算: Q n = ( b − a ) ⋅ 1 n ⋅ ∑ i = 1 n f ( x i ) Q_n=(b-a)\cdot \frac{1}{n}\cdot \sum_{i=1}^n f(x_i) Qn=(ba)n1i=1nf(xi)
  3. 可用Qn去近似积分I,因为大数定律可以保证其误差反比于: n \sqrt n n
    代码为:
import random
def f(x):
    return x**2
a = -1
b = 1
n = 100000000
sum_num = 0
for i in range(n):
    x = random.uniform(a,b)
    sum_num += f(x)
Q = (b-a)* sum_num / n 
print(Q)

结果为:

0.6666073503023225

2.2 多元积分(multivariate)

求取积分: I = ∫ Ω f ( X ) d X I=\int_{\Omega}f(X)d_X I=Ωf(X)dX

  1. Ω \Omega Ω中进行n次抽样,得到: X 1 , X 2 , . . . , X n X_1,X_2,...,X_n X1,X2,...,Xn
  2. 计算: V = ∫ Ω d X V=\int_\Omega d_X V=ΩdX
  3. 计算: Q n = V ⋅ 1 n ⋅ ∑ i = 1 n f ( X i ) Q_n=V\cdot \frac{1}{n}\cdot \sum_{i=1}^n f(X_i) Qn=Vn1i=1nf(Xi)
  4. 可用Qn去近似积分I,因为大数定律可以保证其误差反比于: n \sqrt n n
    求取下式积分: f ( x , y ) = { 1 , x 2 + y 2 ≤ 1 0 , o t h e r w i s e Ω = [ − 1 , 1 ] ⋅ [ − 1 , 1 ] I = ∫ Ω f ( x , y ) d x d y f(x,y)=\left\{ \begin{aligned} 1&, x^2+y^2≤1 \\ 0&,otherwise \end{aligned} \right.\\ \Omega=[-1,1]\cdot[-1,1]\\I=\int_{\Omega}f(x,y)d_xd_y f(x,y)={10,x2+y21,otherwiseΩ=[1,1][1,1]I=Ωf(x,y)dxdy
    代码为:
def f(x,y):
    if x**2 + y**2 <= 1:
        return 1
    return 0
a1 = -1
a2 = -1
b1 = 1
b2 = 1
n = 10000000
sum_num = 0
for i in range(n):
    x = random.uniform(a1,b1)
    y = random.uniform(a2,b2)
    sum_num += f(x,y)
V = 2*2 
Q = V*sum_num / n 
print(Q)
3.1415416

3 期望估计(Estimate of Expection)

  • X为d维随机变量
  • P(X)为X的概率密度函数: P ( X ) ← p r o b a b i l i t y d e n s i t y f u n c t i o n P(X)\gets probability\quad density\quad function P(X)probabilitydensityfunction
  • ∫ R P ( X ) d X = 1 \int_RP(X)d_X=1 RP(X)dX=1
    计算f(X)的期望:
  1. 依据P(X)进行随机抽样,得到: X 1 , X 2 , . . . , X n X_1,X_2,...,X_n X1,X2,...,Xn
  2. 计算: Q n = 1 n ⋅ ∑ i = 1 n f ( X i ) Q_n=\frac{1}{n}\cdot \sum_{i=1}^n f(X_i) Qn=n1i=1nf(Xi)
  3. Q n ≈ E X ∼ P [ f ( X ) ] Q_n\approx E_{X\sim P}[f(X)] QnEXP[f(X)]

代码为:

n = 10000000
sum_num = 0
for i in range(n):
    x = random.normalvariate(2,1)
    sum_num += x
print(sum_num/n)
2.000336379227587

本文部分内容为参考此视频

by CyrusMay 2022 04 04

生命是华丽错觉
时间是贼偷走一切
————五月天(如烟)————

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值