S.P.随机模拟(Python实现)

S.P.随机模拟(Python实现)

  • 随机模拟(Stochastic Simulation)
  • 逆变换法
  • 接受-拒绝法(acceptance-rejection)
  • 随机模拟计算圆周率π

随机模拟(Stochastic Simulation)

随机模拟又称Monte-Carlo方法,是一种基于“随机数”的计算方法。该方法在上个世纪,是十大算法之一。
S.P.随机模拟(Python实现)_第1张图片
随机模拟我们可以理解为:让计算机去扔骰子,最基本的在于随机数的生成。

逆变换法

S.P.随机模拟(Python实现)_第2张图片
逆变换法方法简单,算法效率高,但存在局限:

  1. 程序运行可能出错,有的分布函数的反函数在0或1初的值是无穷大
  2. 分布函数必须严格单调递增,否则反函数不存在,需要用广义反函数
  3. 如果反函数的解析表达式无法写出,可能导致计算速度过慢,甚至无法计算

接受-拒绝法(acceptance-rejection)

接受-拒绝法的思想可以形象地比喻为制作沙雕,经历由粗到细的雕琢过程。
S.P.随机模拟(Python实现)_第3张图片
其缺陷在于效率较低,由于算法要随机地拒绝许多建议的随机数,根据算法效率,我们估计迭代N次后最终会得到随机数的数量大约是N/M。选择合适的建议概率密度函数g(x)是算法的关键。

在完全使Mg(x)罩住f(x)的前提下,g(x)选择的原则是:

  1. M尽可能小
  2. 建议概率密度函数g(x)要容易被抽样
  3. 在满足前面两个要求的基础上,Mg(x)尽可能与f(x)形似

随机模拟计算圆周率π

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
% matplotlib inline

r=1.0 
a,b=(0.0,0.0) 
xmin,xmax=a-r,a+r
ymin,ymax=b-r,b+r
n=10000

x=np.random.uniform(xmin,xmax,n)
y=np.random.uniform(ymin,ymax,n)

fig=plt.figure(figsize=(6,6))
axes=fig.add_subplot(1,1,1)
plt.plot(x,y,'ro',markersize=1)
plt.axis('equal')

d=np.sqrt((x-a)**2 + (y-b)**2)
res=sum(np.where(d<r,1,0))
print('落在圆内的点有%i个' % res)

pi = 4*res/n
print("π的近似值为:",pi)

from matplotlib.patches import Circle
circle=Circle(xy=(a,b),radius=r,alpha=0.5,color='r')
axes.add_patch(circle)
plt.grid(True,linestyle='--',linewidth='0.5')

落在圆内的点有7841个
π的近似值为: 3.1364S.P.随机模拟(Python实现)_第4张图片

你可能感兴趣的:(Stochastic,Processes,Python)