蒙特卡罗方法是用野蛮粗暴的蛮力对抗精细数学的计算思维,可以将复杂的数学问题转化为简单粗暴的重复步骤,在工程上有很多应用。 用蒙特卡罗方法还计算了圆周率。 请看另一个博客。
zgdxg同济大学
蒙特卡罗方法计算自然常数e
蒙特卡罗方法计算自然常数e
原理
四边形的面积是积分后的值
原理:采用蒙特卡罗方法随机在左图矩形方格撒点,统计y=1/x内外点的个数,
根据几何概形,估算曲线下曲面四边形的面积。
另外,根据定积分可以计算出该部分的面积为ln2,即e** (推定的面积)==2,从而可以求出e。
散布点越多,e的计算值也越接近2.71828的真实值。
源代码
# zgdxg 2019-3-14
导入随机
import matplotlib.pyplot as plt
import numpy as np
DARTS=1024*1024 #总散布点的个数
counts=0 #曲线下下降的点数
e=0 # e的计算值
xs=[ 0,0 ]
ys=[ 0,0 ]
#开始画左图:散布点估计曲线下的面积
PLT.subplot(121 ) )。
x=NP.arange(0.5、2.5、0.001 ) )。
PLT.ylim (0,1.25 ) y轴坐标范围
PLT.xlabel(x ) ) # x轴标签
PLT.ylabel(y ) ) # y轴标签
绘制PLT.plot(x,1/x ) #反比例函数曲线
PLT.legend(loc=1) #在右上角添加图例
PLT.legend(['y=1/x'] ) #图例的内容
绘制PLT.plot ([ 1,1,2,2 ],[ 0,1,1,0 ],' r ',linewidth=0.2 ) #散布范围框
forIinrange(darts ) :
x=random.uniform (1,2 ) ) ) ) ) ) )。
y=random.uniform () 0,1 ) ) ) ) ) ) )。
if y 1/x: #点位于曲线下方
计数=1
PLT.subplot(121 ) )。
PLT.plot(x,y,' g.' ) )。
else: #点在曲线上
PLT.subplot(121 ) )。
PLT.plot(x,y,' r.' ) )。
if counts0:
e=pow(2,i/counts ) )。
#开始画右图: e的计算值与投掷次数的关系
PLT.subplot(122 ) )。
xs[0]=xs[1] #上一个e值和下一个e值通过xs和ys列表中的两个元素两点连接
xs[1]=i
ys[0]=ys[1]
ys[1]=e
PLT.ylim (0,4.5 ) # y轴坐标范围
PLT.xlabel('numberoftry ' ) # x轴标签
PLT.ylabel(estimationofe ) ) y轴标签
PLT.y ticks (NP.arange (0,4.5,0.5 ) ) y轴刻度线
PLT.title(e: ) :10f(ncount: ) ).format图中的标题将动态更新
绘制PLT.axhline(NP.e,linewidth=0.05,color='r ' ) 2.71828参考线
画出e的计算值随PLT.plot(xs,ys,' B- ',linewidth=0.3 ) #散布次数而变化的曲线
PLT.ion(#使图像保持交互式更新
控制PLT.Pause(0.2 )散布速度
可视化
蒙特卡罗方法计算自然常数e