Monte carlo 求解积分

15 篇文章 1 订阅
文章介绍了使用Montecarlo方法进行积分求解的原理和步骤,包括单变量和多变量情形。在单变量情况下,通过生成服从均匀分布的随机数,计算函数值的平均来逼近积分值。多变量时,该方法对多元积分同样适用。文中还给出了R语言的代码示例,展示如何利用MC方法近似计算积分,并与理论值进行比较,证明了模拟次数增加时,结果的准确性提高。
摘要由CSDN通过智能技术生成

Monte carlo 求解积分

1 单变量情形

假设待求解积分形式为
θ = ∫ 0 1 f ( x ) d x \theta=\int_0^1 f(x) \mathrm{d} x θ=01f(x)dx
其中 θ \theta θ为积分值。引入随机变量 X ∼ U ( 0 , 1 ) X\sim U(0,1) XU(0,1),则 θ = E [ f ( X ) ] \boldsymbol{\theta}=E[f(X)] θ=E[f(X)]。若 X i ( i = 1 , … n ) X_i(i=1,\dots n) Xi(i=1,n)均服从 U ( 0 , 1 ) U(0,1) U(0,1),则 f ( X i ) f(X_i) f(Xi)是均值为 θ \theta θ的独立同分布随机变量。根据大数定律有
∑ i = 1 k f ( X i ) k → E [ f ( X ) ] = θ , k → ∞ \sum_{i=1}^k \frac{f\left(X_i\right)}{k} \rightarrow E[f(X)]=\theta,k\to \infty i=1kkf(Xi)E[f(X)]=θ,k
上述公式意味着只需要获得大量服从 U ( 0 , 1 ) U(0,1) U(0,1)的随机数,通过 f f f作用求其均值即可近似于原积分值 θ \theta θ。这种积分近似方法称为Monte carlo(MC)方法。

若积分上下限不为(0,1),考虑如下积分
θ = ∫ a b f ( x ) d x \theta=\int_a^b f(x) \mathrm{d} x θ=abf(x)dx
可以通过如下线性变换进行转化
y = x − a b − a ,   d y = d x b − a y=\frac{x-a}{b-a}, \mathrm{~d} y=\frac{\mathrm{d} x}{b-a} y=baxa, dy=badx
于是
θ = ∫ 0 1 f ( a + ( b − a ) y ) ( b − a ) d y \theta=\int_0^1 f(a+(b-a) y)(b-a) \mathrm{d} y θ=01f(a+(ba)y)(ba)dy
根据上述思想,可以通过如下步骤实现积分

1 首先构建服从(0,1)均与分布的采集器,并获得 n n n各随机数 x i ∈ ( 0 , 1 ) x_i\in(0,1) xi(0,1)

2 再将所有随机数带入函数 f ( a + ( b − a ) y ) ( b − a ) f(a+(b-a) y)(b-a) f(a+(ba)y)(ba)求出 n n n个函数值

3 对2中 n n n个函数值进行平均

下面通过 R R R进行MC求解积分
∫ − 2 2 e − x 2 d x \int_{-2}^2e^{-x^2}dx 22ex2dx

f1 = function(n,lower,upper,fun){
  "
  n:随机数个数
  lower:积分下限
  upper:积分上限
  fun:被积函数
  "
  x = runif(n)
  sum((upper-lower)*fun(lower+(upper-lower)*x))/n
}

# 定义函数
g = function(x) exp(-x^2)
res = numeric()
for(i in 1:10000) res[i] = f1(i,-1,1,g) 
plot(res,type = 'l',xlab = 'n')
# 添加理论值
abline(h = integrate(g,-1,1)$value,col = 'red',lwd = 2)
grid(nx = 20,ny=20,lwd =2)

在这里插入图片描述

上图看出,随着模拟次数增加,使用MC方法得到的值与理论值更加接近。其中理论值使用R内嵌函数计算

integrate(g,-1,1)
# 1.493648 with absolute error < 1.7e-14

2 多变量情形

对于单变量而言,MC方法作用并不是非常明显,对于多元积分求解具有更高效的作用。

假设多元函数 f f f是关于变量 x i ( i = 1 , 2 … n ) x_i(i=1,2\dots n) xi(i=1,2n)的函数,需要求解
θ = ∫ 0 1 ∫ 0 1 ⋯ ∫ 0 1 f ( x 1 , x 2 , ⋯   , x n ) d x 1   d x 2 ⋯ d x n \theta=\int_0^1 \int_0^1 \cdots \int_0^1 f\left(x_1, x_2, \cdots, x_n\right) \mathrm{d} x_1 \mathrm{~d} x_2 \cdots \mathrm{d} x_n θ=010101f(x1,x2,,xn)dx1 dx2dxn
注意到使用MC方法关键是估计 θ \theta θ
θ = E [ f ( X 1 , X 2 , ⋯   , X n ) ] \theta=E\left[f\left(X_1, X_2, \cdots, X_n\right)\right] θ=E[f(X1,X2,,Xn)]
其中 X i X_i Xi i i d iid iid 且服从 U ( 0 , 1 ) U(0,1) U(0,1)。产生 k k k个独立集合,每个集合由 n n n个独立的服从 U ( 0 , 1 ) U(0,1) U(0,1)随机变量构成,
U 1 1 , U 2 1 , ⋯   , U n 1 U 1 2 , U 2 2 , ⋯   , U n 2 ⋮ U 1 k , U 2 k , ⋯   , U n k \begin{gathered} U_1^1, U_2^1, \cdots, U_n^1 \\ U_1^2, U_2^2, \cdots, U_n^2 \\ \vdots \\ U_1^k, U_2^k, \cdots, U_n^k \end{gathered} U11,U21,,Un1U12,U22,,Un2U1k,U2k,,Unk
g ( U 1 i , U 2 i , ⋯   , U n i ) , i = 1 , 2 , ⋯   , k g\left(U_1^i, U_2^i, \cdots, U_n^i\right), i=1,2, \cdots, k g(U1i,U2i,,Uni),i=1,2,,k具有均值 θ \theta θ的独立同分布随机变量,于是当 k → ∞ k\to \infty k
∑ i = 1 k f ( U 1 i , U 2 i , ⋯   , U n i ) k → E [ f ( X 1 , X 2 , ⋯   , X n ) ] = θ \frac{\sum_{i=1}^k f\left(U_1^i, U_2{ }^i, \cdots, U_n^i\right)}{k}\to E\left[f\left(X_1, X_2, \cdots, X_n\right)\right] = \theta ki=1kf(U1i,U2i,,Uni)E[f(X1,X2,,Xn)]=θ

# 二重积分
X = runif(10000)
Y = runif(10000)
f = function(x,y) cos(x^2+y^2)
sum(f(X,Y))/10000

res2 = numeric()
for(i in 1:2000){
  res2[i] = sum(f(X,Y)[1:i])/i
}
# 理论值
l2 = function(x){
  cos(x[1]^2+x[2]^2)
}
library(cubature)
z = adaptIntegrate(l2, c(0, 0), c(1, 1), maxEval=10000)
# 模拟值
plot(res2,type = 'l',xlab = 'n',lwd = 2)
abline(h = z$integral)
grid(nx = 20,ny=20,lwd =2)

在这里插入图片描述


-END-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值