Monte carlo 求解积分
文章目录
- Monte carlo 求解积分
- @[toc]
- 1 单变量情形
- 2 多变量情形
文章目录
- Monte carlo 求解积分
- @[toc]
- 1 单变量情形
- 2 多变量情形
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)
X∼U(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=1∑kkf(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=b−ax−a, dy=b−adx
于是
θ
=
∫
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+(b−a)y)(b−a)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+(b−a)y)(b−a)求出 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
∫−22e−x2dx
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,2…n)的函数,需要求解
θ
=
∫
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
θ=∫01∫01⋯∫01f(x1,x2,⋯,xn)dx1 dx2⋯dxn
注意到使用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,⋯,Un2⋮U1k,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
k∑i=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)