课程3.5 模特卡罗模拟理论概述

编程入门 行业动态 更新时间:2024-10-11 01:19:49

课程3.5  <a href=https://www.elefans.com/category/jswz/34/1389713.html style=模特卡罗模拟理论概述"/>

课程3.5 模特卡罗模拟理论概述

什么是蒙特卡罗方法?

蒙特卡罗方法,又称随机抽样或者统计 试验方法,是以概率和统计理论方法为基础的一种计算方法。
使用随机数(或更常见的为伪随机数)来解决很多计算问题的方法。将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解。

1.基本原理

蒙特卡罗通过抓住事物运动的几何数量和几何特征,利用数字方法来加以模拟,即进行一种数字模拟实验,它是以一个概率模型为基础,按照这个模拟所描绘的过程,通过模拟实验的结果,作为问题的近似解,可以把蒙特卡罗解题归结为三个主要步骤:

  1. 构造或描述概率过程;
  2. 实现从已知概率分布抽样;
  3. 建立各种估计量;

特点:随机采样上计算得到近似结果,随着采样增多,得到的结果是正确结果的概率逐渐加大

2.π的计算

正方形内部有一个相切的圆,它们的面积之比是π/4
现在在这个正方形内部,随机产生10000个点(即10000个坐标对(x,y)),计算它们与中心点的距离,总而判断是否落在圆的内部。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
% matplotlib inlinen = 10000
r = 1.0 #半径
a,b = (0.0,0.0) #圆心
xmin,xmax = a-r,a+r 
ymin,ymax = b-r,b+r
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)
result = sum(np.where(d<r,1,0))
pi = 4 * result / n #正方形面积4r**2,圆的面积πr**2from matplotlib.patches import Circle
circle = Circle(xy=(a,b),radius=r,alpha=0.6,color='gray')
axes.add_patch(circle)
plt.grid(True,linestyle="--",linewidth=0.8)
plt.show()

3.积分的计算

计算任意积分–>计算函数y=x2在[0,1]区间的积分
这个函数在(1,1)点的取值为1,所以整个红色区域在一个面积为1的正方形里,在该正方形内部,产生大量的随机点,可以计算出有多少点落在红色区域(判断条件y<x
2),这个比重就是所要求的积分值

#计算积分y=x**2
n = 10000 #投点次数
r = 1.0
a,b = (0.0,0.0) #圆心
x_min,x_max = 0.0,1.0
y_min,y_max = 0.0,1.0 #矩形区域边界x = np.random.uniform(x_min,x_max,n)
y = np.random.uniform(y_min,y_max,n) #在矩形区域内随机投点def f(x):return x**2 #创建函数result = sum(np.where(y<f(x),1,0))
#统计落在函数f(x)图像下方的点的数目integral = result / n
print('integral:',integral) #计算定积分的近似值#绘制散点图
fig = plt.figure(figsize=(6,6))
axes = fig.add_subplot(111)
axes.plot(x,y,'ro',markersize=1)
plt.axis('equal')#绘制f(x)函数图
xi = np.linspace(0,1,100)
yi = xi ** 2
plt.plot(xi,yi,'--k')
plt.fill_between(xi,yi,0,color='gray',alpha=0.5,label='area')
plt.grid()

4.厕所排队问题

1.两场电影结束时间相隔较长,互不影响;
2.每场电影结束之后会有20个人想上厕所;
3.这20个人会在0到10分钟之内全部到达厕所;
4.每个人上厕所时间在1-3分钟之间
首先模拟最简单的情况,也就是厕所只有一个位置,不考虑两人共用的情况则每人必须等上一人出恭完毕方可进行
分析:对于每个人都有如下几个参数:
到达时间、等待时间、开始上厕所时间、结束时间

import pandas as pd
import numpy as np
import matplotlib.pyplot as pltarrivingtime = np.random.uniform(0,10,size=20)
arrivingtime.sort()
workingtime = np.random.uniform(1,3,size=20)
# np.random.uniform 随机数:均匀分布的样本值
print(arrivingtime)
#print(workingtime)startingtime = [0 for i in range(20)]
finishtime = [0 for i in range(20)]
waitingtime = [0 for i in range(20)]
emptytime = [0 for i in range(20)] #开始时间都是0startingtime[0] = arrivingtime[0]
finishtime[0] = startingtime[0] + workingtime[0]
waitingtime[0] = startingtime[0] - arrivingtime[0]print(startingtime[0],workingtime[0],finishtime[0],waitingtime[0])for i in range(1,len(arrivingtime)):if finishtime[i-1] > arrivingtime[i]:startingtime[i] = finishtime[i-1]else:startingtime[i] = arrinvingtime[i]emptytime[i] = arrivingtime[i] - finishtime[i-1]finishtime[i] = startingtime[i]+workingtime[i]waitingtime[i] = startingtime[i]-workingtime[i]print('第%d个人:到达时间 开始时间 “工作”时间 完成时间 等待时间\n' % i,arrivingtime[i],startingtime[i],workingtime[i],finishtime[i],waitingtime[i],'\n')
print('arerage waiting time is %f' % np.mean(waitingtime))
#判断:如果下一个人在上一个人完成之前到达,则开始时间=上一个人完成时间
#否则:开始时间 = 到达时间,且存在空闲时间 = 到达时间-上一个人完成时间fig = plt.figure(figsize = (6,4))
plt.plot(waitingtime,'--go')
plt.title('蒙特卡罗模拟 - 排队上厕所问题')
plt.show()

更多推荐

课程3.5 模特卡罗模拟理论概述

本文发布于:2024-03-14 02:02:25,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1735380.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模特   卡罗   理论   课程

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!