初学者都能看懂的蒙特卡洛方法以及python实现

初学者都能看懂的蒙特卡洛方法以及python实现1 什么是蒙特卡洛方法 MonteCarlome 蒙特卡罗方法也称统计模拟方法 是 1940 年代中期由于科学技术的发展和电子计算机的发明 而提出的一种以概率统计理论为指导的数值计算

大家好,欢迎来到IT知识分享网。

1.什么是蒙特卡洛方法(Monte Carlo method)

蒙特卡罗方法也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。
20世纪40年代,在冯·诺伊曼,斯塔尼斯拉夫·乌拉姆和尼古拉斯·梅特罗波利斯在洛斯阿拉莫斯国家实验室为核武器计划工作时,发明了蒙特卡罗方法。因为乌拉姆的叔叔经常在摩纳哥的蒙特卡洛赌场输钱得名,而蒙特卡罗方法正是以概率为基础的方法。
与它对应的是确定性算法。

2.蒙特卡洛方法的基本思想

3.蒙特卡洛求定积分

蒙特卡洛方法的一个重要应用就是求定积分。来看下面的一个例子(参考文献2)
这里写图片描述

当我们在[a,b]之间随机取一点x时,它对应的函数值就是f(x)。接下来我们就可以用f(x) * (b – a)来粗略估计曲线下方的面积,也就是我们需要求的积分值,当然这种估计(或近似)是非常粗略的。
这里写图片描述

在此图中,做了四次随机采样,得到了四个随机样本 x 1 , x 2 , x 3 , x 4 x_1, x_2, x_3, x_4 x1,x2,x3,x4,并且得到了这四个样本的 f ( x i ) f(x_i) f(xi)的值分别为 f ( x 1 ) , f ( x 2 ) , f ( x 3 ) , f ( x 4 ) f(x_1), f(x_2), f(x_3), f(x_4) f(x1),f(x2),f(x3),f(x4)。对于这四个样本,每个样本能求一个近似的面积值,大小为 f ( x i ) ∗ ( b − a ) f(x_i)*(b-a) f(xi)(ba)。为什么能这么干么?对照图下面那部分很容易理解,每个样本都是对原函数f的近似,所以我们认为 f ( x ) f(x) f(x)的值一直都等于 f ( x i ) f(x_i) f(xi)

按照图中的提示,求出上述面积的数学期望,就完成了蒙特卡洛积分。

如果用数学公式表达上述过程:
S = 1 4 ( f ( x 1 ) ( b − a ) + f ( x 2 ) ( b − a ) + f ( x 3 ) ( b − a ) + f ( x 4 ) ( b − a ) ) = 1 4 ( b − a ) ( f ( x 1 ) + f ( x 2 ) + f ( x 3 ) + f ( x 4 ) ) = 1 4 ( b − a ) ∑ i = 1 4 f ( x i ) \begin{aligned} S & = \frac{1}{4}(f(x_1)(b-a) + f(x_2)(b-a) + f(x_3)(b-a) + f(x_4)(b-a)) \\ & = \frac{1}{4}(b-a)(f(x_1) + f(x_2) + f(x_3) + f(x_4)) \\ & = \frac{1}{4}(b-a) \sum_{i=1}^4 f(x_i) \end{aligned} S=41(f(x1)(ba)+f(x2)(ba)+f(x3)(ba)+f(x4)(ba))=41(ba)(f(x1)+f(x2)+f(x3)+f(x4))=41(ba)i=14f(xi)

对于更一般的情况,假设要计算的积分如下:
I = ∫ a b g ( x ) d x I = \int _a ^ b g(x) dx I=abg(x)dx
其中被积函数 g ( x ) g(x) g(x)在[a,b]内可积。如果选择一个概率密度函数为 f X ( x ) f_X(x) fX(x)的方式进行抽样,并且满足 ∫ a b f X ( x ) d x = 1 \int _a ^ b f_X(x)dx = 1 abfX(x)dx=1,那么令 g ∗ ( x ) = g ( x ) f X ( x ) g^*(x) = \frac{g(x)}{f_X(x)} g(x)=fX(x)g(x),原有的积分可以写成如下形式:
I = ∫ a b g ∗ ( x ) f X ( x ) d x I = \int _a ^ b g^*(x) f_X(x)dx I=abg(x)fX(x)dx

那么我们求积分的步骤应该是:
1.产生服从分布律 F X F_X FX的随机变量 X i ( i = 1 , 2 , ⋯   , N ) X_i(i = 1, 2, \cdots,N) Xi(i=1,2,,N)
2.计算均值
I ‾ = 1 N ∑ i = 1 N g ∗ ( X i ) \overline I = \frac{1}{N} \sum_{i = 1}^N g^*(X_i) I=N1i=1Ng(Xi)
此时有 I ‾ ≈ I \overline I \approx I II

当然实际应用中,我们最常用的还是取 f X f_X fX为均匀分布:
f X ( x ) = 1 b − a , a ≤ x ≤ b f_X(x) = \frac{1}{b – a}, a \le x \le b fX(x)=ba1,axb
此时
g ∗ ( x ) = ( b − a ) g ( x ) g^*(x) = (b-a)g(x) g(x)=(ba)g(x)
代入积分表达式有:
I = ( b − a ) ∫ a b g ( x ) 1 b − a d x I = (b-a) \int_a^b g(x) \frac{1}{b-a}dx I=(ba)abg(x)ba1dx

最后有
I ‾ = b − a N ∑ i = 1 N g ( X i ) \overline I = \frac{b-a}{N}\sum_{i=1}^Ng(X_i) I=Nbai=1Ng(Xi)

如果从直观上理解这个式子也非常简洁明了:
在[a,b]区间上按均匀分布取N个随机样本 X i X_i Xi,计算 g ( X i ) g(X_i) g(Xi)并取均值,得到的相当于Y坐标值,然后乘以 ( b − a ) (b-a) (ba)为X坐标长度,得到的即为对应矩形的面积,即积分值。

4.蒙特卡洛方法python实例

首先看一个经典的用蒙特卡洛方法求 π \pi π值。

import random def calpai(): n =  r = 1.0 a, b = (0.0, 0.0) x_neg, x_pos = a - r, a + r y_neg, y_pos = b - r, b + r count = 0 for i in range(0, n): x = random.uniform(x_neg, x_pos) y = random.uniform(y_neg, y_pos) if x*x + y*y <= 1.0: count += 1 print (count / float(n)) * 4 

然后看一个求定积分的例子。
假设我们想求 ∫ 0 1 x 2 d x \int_0^1 x^2 dx 01x2dx的值。具体代码如下。

def integral(): n =  x_min, x_max = 0.0, 1.0 y_min, y_max = 0.0, 1.0 count = 0 for i in range(0, n): x = random.uniform(x_min, x_max) y = random.uniform(y_min, y_max) # x*x > y,表示该点位于曲线的下面。所求的积分值即为曲线下方的面积与正方形面积的比。 if x*x > y: count += 1 integral_value = count / float(n) print integral_value 

代码运行的结果为:

0. 

由此可见,与解析值的结果误差还是比较小的。

参考文献:

1.https://zh.wikipedia.org/wiki/蒙地卡羅方法
2.http://www.scratchapixel.com/lessons/mathematics-physics-for-computer-graphics/monte-carlo-methods-in-practice/monte-carlo-integration
3.https://blog.csdn.net/baimafujinji/article/details/

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/157179.html

(0)
上一篇 2025-02-07 19:05
下一篇 2025-02-07 19:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信