通俗易懂的Monte Carlo积分方法(一)
通俗易懂的Monte Carlo积分方法(一)
Monte Carlo积分的投点法计算:
- Monte Carlo算法(投点法)的数学基础:
伯努利大数定律:
设fA为n重伯努利试验中事件A发生的次数,而P为事件A发生的概率,那么∀ϵ>0有下面的式子成立:设f_{A}为n重伯努利试验中事件A发生的次数, 而 \\P为事件A发生的概率,那么\forall\epsilon > 0\\有下面的式子成立:设fA为n重伯努利试验中事件A发生的次数,而P为事件A发生的概率,那么∀ϵ>0有下面的式子成立:
limn→∞P{∣fAn−P∣<ϵ}=1lim_{n\rightarrow\infty}P\{|\frac{f_A}{n}-P|<\epsilon\}=1limn→∞P{∣nfA−P∣<ϵ}=1
这个定律其实告诉我们的是当样本次数足够大的时候,频率是可以逼
近概率的。那么现在的关键问题是如何逼近?以及需要多大的样本才能准确的逼近?
-
Monte Carlo积分的计算:
1.解决如何逼近的问题:
首先,我们假设要计算的定积分是:
I=∫abf(x)dxI=\int_a^bf(x)dxI=∫abf(x)dx
其中,而其中0<f(x)<M0<f(x)<M0<f(x)<M,由积分的面积定义我们可以得到:
∫abf(x)dx=∣S∣\int_a^bf(x)dx=|S|∫abf(x)dx=∣S∣
其中:∣S∣|S|∣S∣为S={(x,y):a⩽x⩽b,f(x)>y}S=\{(x,y):a\leqslant x\leqslant b,f(x)>y \}S={(x,y):a⩽x⩽b,f(x)>y}的面积
考虑在平面区域[a,b]×[0,M][a,b]\times[0,M][a,b]×[0,M]上的随机变量ξ\xiξ那么:
P{ξ∈S}=∫abf(x)dx(b−a)M P\{\xi\in S\} = \frac{\int_a^bf(x)dx}{(b-a)M} P{ξ∈S}=(b−a)M∫abf(x)dx
对于N\NN个独立的均匀随机数ξi,i=1,2..N\xi_i,i=1,2..Nξi,i=1,2..N,
记:Ns为{ξ1,ξ2,...,ξn}∈SN_s为\{\xi_1,\xi_2,...,\xi_n\} \in SNs为{ξ1,ξ2,...,ξn}∈S 的次数。
由大数定律可知,∀ϵ>0\forall\epsilon>0∀ϵ>0:
limN→∞P{∣NsN−∫abf(x)dx(b−a)M∣<ϵ}=1
lim_{N\rightarrow\infty}P\{|\frac{N_s}{N}-\frac{\int_a^bf(x)dx}{(b-a)M}|<\epsilon\} = 1
limN→∞P{∣NNs−(b−a)M∫abf(x)dx∣<ϵ}=1
即:
∫abf(x)dx≈NsM(b−a)N(N足够大)
\int_a^bf(x)dx \approx\frac{N_sM(b-a)}{N}(N足够大)
∫abf(x)dx≈NNsM(b−a)(N足够大)
Python实现的代码:
例:求∫02x2dx\int_{0}^2x^2dx∫02x2dx的值:
import random,time
start = time.perf_counter()
random.seed(10)
Num = 0
numbers = 100000
Num_s = 0
b = 2
a = 0
M = 2**2
for i in range(numbers):
x_value = (b-a)*random.random()
y_value = M*random.random()
if (y_value <= x_value**2)&(y_value>0):
Num_s += 1
Num += 1
P = Num_s/Num*M*(b-a)
print("\r目前的积分值是:{:.2f},时间是{:.5f}s".format(P,time.perf_counter()-start),end = ' ')
2.解决需要多大样本的问题:
中心极限定理估计样本个数:
中心极限定理就不赘述了,不懂得建议看教材《概率论与数理统计》。
在NNN足够大的时候,中心极限定理可以得到NNN的估计值。
在这里,我们取I^=NsM(b−a)N\hat{I}=\frac{N_sM(b-a)}{N}I^=NNsM(b−a),由于Ns=∑i=1nxi,xi∈{0,1},xi∼B(1,P)N_s=\sum_{i=1}^nx_i,x_i\in\{0,1\},x_i\sim B(1,P)Ns=∑i=1nxi,xi∈{0,1},xi∼B(1,P)(二项分布)。而:
EI^=∫abf(x)dx
E\hat{I} = \int_a^bf(x)dx
EI^=∫abf(x)dx
而对应的方差为:
VarI^=(b−a)2M2P(1−P)N
Var\hat{I} = \frac{(b-a)^2M^2P(1-P)}{N}
VarI^=N(b−a)2M2P(1−P)
对于允许误差ϵ\epsilonϵ,以及允许δ\deltaδ的失败概率,确定Nϵ,δN_{\epsilon,\delta}Nϵ,δ,使得:
P{∣I^−∫abf(x)dx∣>ϵ}<δ
P\{{|\hat{I}-\int_a^bf(x)dx|>\epsilon}\}<\delta
P{∣I^−∫abf(x)dx∣>ϵ}<δ
设ϕδ\phi_{\delta}ϕδ满足:
δ=12π∫ϕδ∞e−x22dx
\delta = \frac{1}{\sqrt{2\pi}}\int_{\phi_\delta}^{\infty}e^{-\frac{x^2}{2}}dx
δ=2π1∫ϕδ∞e−2x2dx
由中心极限定理:
I^∼N(EI^,VarI^)
\hat{I}\sim N(E\hat{I},Var\hat{I})
I^∼N(EI^,VarI^)
可得:
P{∣I^−∫abf(x)dx∣VarI^≥ϕδ2}≤δ
P\{{\frac{|\hat{I}-\int_a^bf(x)dx|}{\sqrt{Var\hat{I}}}}\geq\phi_{\frac{\delta}{2}}\}\leq\delta
P{VarI^∣I^−∫abf(x)dx∣≥ϕ2δ}≤δ
如果我们选择NNN使得ϕδ2VarI^≤ϵ\phi_{\frac{\delta}{2}}\sqrt{Var\hat{I}}\leq\epsilonϕ2δVarI^≤ϵ即可限制误差在我们预设的范围之内:
最后求得:
N>(b−a)2M2ϕδ224ϵ2
N>\frac{(b-a)^2M^2\phi_{\frac{\delta}{2}}^2}{4\epsilon^2}
N>4ϵ2(b−a)2M2ϕ2δ2
更多推荐

所有评论(0)