复杂积分的计算机模拟数值计算方法

本文介绍 Monte Carlo 方法如何应用于数值积分中难以解析求解的问题,通过随机抽样来估算积分值,并以具体实例说明该方法的有效性和准确性。

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

本篇文章讲讲Monte Carlo方法在数值计算上的应用,这一问题是MCMC(Markov Chain Monte Carlo)采样的子问题。
假定需求积分为I= θ P(θ)dθ ,其中P(θ) 的积分式很难求得,比如P(θ)=sinθθ  

其问题可以转化为求一个随机变量的函数的期望的问题。设θQ(θ) θ 服从概率密度函数为Q(θ) 的分布。将P(θ)Q(θ)  看作是关于随机变量θ 的函数,上述积分可转化为I= θ P(θ)Q(θ) Q(θ)dθ=E[P(θ)Q(θ) ] 关于随机变量θ 的函数P(θ)Q(θ)  的数学期望。

Monte Carlo方法的核心是对于随机变量θ 大规模采样,可以依E ˆ [P(θ)Q(θ) ]=1n  n i=1 P(θ i )Q(θ i )  得到期望的估计值E ˆ  .

依大数定律:

lim n E ˆ =E 

当采样的规模足够大时,有:
E ˆ E 

需要注意的是若积分限为[a,b]则所选取的θQ(θ) 中的概率密度函数的定义域也是[a,b]。

举个例子,还是以P(θ)=sinθθ  为例,设所求积分为I 1 = 1 0 sinθθ dθ ,设θU(01) 服从[0,1]上的均匀分布,概率密度函数为f(θ)=1,(0θ1) 

I 1 == θ sinθθ 1dθ=E[sinθθ ] 

积分I 1  的近似估计值为:
I 1 1n  i=1 n sinθ i θ i   

Python代码:

#coding:utf-8
import numpy as np
import random

n = 10000 #采样数

def func(x):
    x = random.uniform(0, 1)
    return np.sin(x)/x

print sum(map(func, range(n)))/n

#输出为0.945611582984

计算sinθ 在[0,1]内积分,符号结果为cos0cos1=1cos1 

#将上述函数改为np.sin(x) 后输出为0.460831340906
>>> import numpy as np
>>> 1 - np.cos(1)
0.45969769413186035

可见采样数为10000时结果相差不大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值