怎么用蒙特卡洛模拟(monte carlo)

原文地址链接:https://www.jianshu.com/p/bd0bc6775da6
001 什么是蒙特卡洛模拟
蒙特卡洛模拟,又称为统计实验方法
以概率论和统计理论方法为基础的一种计算方法
通过随机数来解决很多计算问题
主要步骤是:
将实际问题转化为概率模型
通过计算机实现统计模拟,以获得问题的近似解

002 基本原理
蒙特卡洛模拟抓住事物运动的几何数量和几何特征,利用数学方法来模拟,是一种数字模拟实验。它是一个以概率模型为基础,按照这个模型所描绘的过程,通过模拟实验的结果,作为问题的近似解。
可以把蒙特卡洛解法分为三步
1.构造或描绘概率过程
2.实现从已知概率分布抽样
3.建立各种估计量

借助计算机技术,蒙特卡洛模拟方法有两大优点
1.简单,省去了繁复的数学推导和验算过程,使普通人能够理解
2.快速,确定了概率模型,后续运算完全用计算机实现

蒙特卡洛模拟的特点:
随机采样得到的近似解,随着随机采样数值增多,得到正确结果的概率越大

003 怎么用
回到最初的测试题,用蒙特卡洛模拟计算圆周率π
圆周率π的计算推导十分复杂,普通人难以明白,但是我们可以用数值模拟的方式计算出圆周率

在这个正方形内部有个内切圆,他们的面积之比是π/4
现在,在这个正方形内部随机生产10000个点(坐标是(x,y)),计算它们与中心点的距离,从而判断是否落在圆内。
园内的点数/正方形内的点数 = π/4
以此来计算得出π的值
在这里插入图片描述

直接上代码(python3.6)

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

n = 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,'ko',markersize = 1) #plot绘图 markersize表示点的大小;‘ro’r表示red,o表示圆圈
plt.axis('equal')

d = np.sqrt((x-a)**2 + (y-a)**2)
#res 得到圆中的点数
res = sum(np.where(d<r,1,0)) #numpy.where(conditon,x,y) 满足条件输出x,不满足输出y

pi = res/n*4
print('pi:',pi)
#计算pi的近似值,蒙特卡洛模拟方法,用统计值去近似真实值

#绘制圆形子图
circle = Circle(xy = (a,b), radius = r,alpha = 0.5, color = 'gray')
axes.add_patch(circle)#添加圆形子图
plt.grid(True,linestyle = '--',linewidth = '0.8')
plt.show()

#总结
#蒙特卡洛模拟是用统计值逼近真实值,展示了统计思想

JupyterNotebook运行结果如下
在这里插入图片描述
随着我们设置的点的数量n越多,计算的到的pi值就会越接近真实值3.1415926

### PyCharm 打开文件显示全的解决方案 当遇到PyCharm打开文件显示全的情况时,可以尝试以下几种方法来解决问题。 #### 方法一:清理缓存并重启IDE 有时IDE内部缓存可能导致文件加载异常。通过清除缓存再启动程序能够有效改善此状况。具体操作路径为`File -> Invalidate Caches / Restart...`,之后按照提示完成相应动作即可[^1]。 #### 方法二:调整编辑器字体设置 如果是因为字体原因造成的内容显示问题,则可以通过修改编辑区内的文字样式来进行修复。进入`Settings/Preferences | Editor | Font`选项卡内更改合适的字号大小以及启用抗锯齿功能等参数配置[^2]。 #### 方法三:检查项目结构配置 对于某些特定场景下的源码视图缺失现象,可能是由于当前工作空间未能正确识别全部模块所引起。此时应该核查Project Structure的Content Roots设定项是否涵盖了整个工程根目录;必要时可手动添加遗漏部分,并保存变更生效[^3]。 ```python # 示例代码用于展示如何获取当前项目的根路径,在实际应用中可根据需求调用该函数辅助排查问题 import os def get_project_root(): current_file = os.path.abspath(__file__) project_dir = os.path.dirname(current_file) while not os.path.exists(os.path.join(project_dir, '.idea')): parent_dir = os.path.dirname(project_dir) if parent_dir == project_dir: break project_dir = parent_dir return project_dir print(f"Current Project Root Directory is {get_project_root()}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值