python实现蒙特卡洛模拟_随机模拟——蒙特卡洛算法及Python实现_weixin_39808143的博客-程序员秘密

技术标签: python实现蒙特卡洛模拟  

随机模拟——蒙特卡洛算法及Python实现

irony • 2020 年 04 月 24 日

蒙特卡洛算法介绍蒙特卡洛算法(Monte Carlo method)也称统计模拟算法,是一种以概率统计理论为指导的数值计算方法方法。是指使用随机数来解决很多计算问题的方法。

蒙特卡洛方法基本思想

通常蒙特卡洛算法可以分为两种:

1,一种是所求解的问题本身具有内在随机性,借助计算机的运算能力可以直接模拟这种随机的过程。

2,另一种是所求解的问题可以转化为某种随机分布的特征数,比如随机事件出现的概率,或者随机变量的期望值。通过随机抽样的方法,以随机事件出现的频率估计其概率,或者以抽样的数字特征估算随机变量的数字特征,并将其作为问题的解。这种方法多用于求解复杂的多维积分的问题。

蒙特卡洛方法的理论依据是大数定理,即重复试验多次,随机事件的频率近似于它的概率。

论文中利用蒙特卡洛法求定积分

蒙特卡洛一个重要的应用就是求定积分,例子如下:

假设曲线函数为$f(x)$,则易得阴影部分面积:

$$ \int_{a}^{b} f(x)\, dx $$

然后通过牛顿莱布尼兹公式进行积分求解,而蒙特卡洛算法则运用不同的思想。当我们在$[a,b]$之间随机取一点$x$时,它对应的函数值就是$f(x)$。接下来我们就可以用$f(x) * (b-a)$来估计曲线下方的面积,也就是积分值,但是很显然这种估计方式是非常粗略的。

在上图中,做了四次随机采样,得到了四个随机样本$x_1,x_2,x_3,x_4$,并且得到了这四个样本的$f(x_i)$的值分别为$f(x_1),f(x_2),f(x_3),f(x_4)$。对于这四个样本,每个样本都可求取一个近似的面积值,大小为$f(x_i)*(b-a)$。然后求取所有面积的平均值就完成了蒙特卡洛求积分的过程。

用以下公式表述上述过程:

$$

\begin{array}{lcr}

S = \frac{1}{4}(b-a)(f(x_1)+f(x_2)+f(x_3)+f(x_4))\\

\quad = \frac{1}{4}(b-a)\sum_{i=1}^4 f(x_i)

\end{array}

$$

蒙特卡洛Python实现

1,求取圆周率$\pi$

代码如下:import random

def cal_pai():

n = 1000000

r = 1

a, b = (0, 0)

# 求投点的上下界

x_low, x_up = a - r, a + r

y_low, y_up = b - r, b + r

# 记录落于圆内的点数

count = 0

for i in range(0, n):

x = random.uniform(x_low, x_up)

y = random.uniform(y_low, y_up)

if x**2 + y**2 <= r**2:

count += 1

return (count / n) * 4

if __name__ == '__main__':

print(cal_pai())

简单介绍一下算法思路:利用投点法,在边长为2的正方形内部找到内接圆,内接圆的半径为1,所以易得内接圆于外接正方形的面积比为$\frac{\pi}{4}$。现在向正方形内部投点,并计算点与圆心的距离。其中$n$为投点的总数,$count$为投在圆内的投点个数,则$\pi$可以由以下格式求出:

$$ \pi = \frac{count}{n} * 4 $$

代码运行结果:$3.140748$,每次运行结果不同。依据大数定理,n越大,$\pi$值越准确。

2,求定积分$\int_{0}^{1} x^2\, dx$

代码如下:import random

def integral():

n = 1000000

x_min, x_max = 0, 1

S = 0

for i in range(0, n):

x = random.uniform(x_min, x_max)

y = x ** 2

S += (x_max - x_min) * y

return 1 / n * S

if __name__ == '__main__':

print(integral())

代码运行结果:$0.33371372617627443$

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39808143/article/details/111404153

智能推荐

图像梯度和平滑_铿锵的玫瑰的博客-程序员秘密

图像梯度 图像平滑参考网址https://blog.csdn.net/myarrow/article/details/53232254

Java学习总结——抽象类与接口_原来是松松呀~的博客-程序员秘密

拾叁——抽象类与接口一、抽象类在 Java 中可以创建一种类专门用来做父类,这种类称为 “ 抽象类 ”。抽象类实际上也是一个类,只是与之前的普通类相比,内部新增了抽象方法。1.抽象类的基本概念抽象方法是只声明而未实现的方法,所有的抽象方法必须使用 abstract 关键字声明,包含抽象方法的类也必须使用 abstract class 声明。抽象类定义规则如下:(1)抽象类和...

【计算机操作系统】测试题:动态分区内存分配;调页系统;分页存储管理;快表是什么?计算指令操作数地址;有效存储访问时间,缺页次数,缺页率;_使用修改位的目的是:_霜前月下的博客-程序员秘密

目录填空题:选择题:简答题:应用题: 填空题: 1. 在动态分区式内存分配算法中,倾向于优先使用低地址部分空闲区的算法是 首次适应算法 ;能使内存空间中空闲区分布较均匀的算法是 循环首次适应算法。 2. 在请求调页系统中的调页策略有 预调页策略,它是以预测为基础的;另一种是 请求调页策略 由于较易实现,故目前使用较多。 3. ...

rdkit SMARTS支持和扩展_smart rdkit_qq_36801966的博客-程序员秘密

文章目录一、引入所需库二、SMARTS 不支持的特性三、SMARTS 支持的扩展3.1 杂化方式查询3.2 配位键3.3 邻居杂原子查询3.4 范围查询3.5 SMARTS语法参考四、子结构匹配4.1 具有SMARTS查询的功能组rdkit 支持Daylight定义的SMARTS的绝大部分标准特性以及一些有用的拓展一、引入所需库#! /usr/bin/python# coding: utf-8import osfrom rdkit import Chemfrom rdkit.Chem imp

内部类最通俗易懂_寒笑半步巅的博客-程序员秘密

内部类详解如果一个事物内部包含另一个事物,就是一个类中包含着其他类。**例如:**身体和心脏的关系,汽车和发动机的关系。。。分类:成员内部类 public /protected/(default)/private局部内部类(匿名内部类)无访问修饰符1、成员内部类package com.hanxiao.inner;public class Body { private String name; public class Hert{

Vue(uni.app如何避免手势冲突)_uniapp手势冲突_椿雪的博客-程序员秘密

手势冲突问题解决办法问题一:在h5页面上由于手势冲突导致页面自动返回,主要用于(电子签名)解决办法代码&lt;template&gt; &lt;view&gt; &lt;button @tap="createCanvas"&gt;{{i18n.autograph.autographBtn}}&lt;/button&gt; &lt;view class="signature" v-show="showCanvas" @touchmove.prevent&gt; &lt;c

随便推点

封装:el-upload上传图片组件(解决图片闪动、多选问题)-程序员秘密

(1)粘贴上传图片,不点击输入框,点击粘贴元素所在的行空白处,然后按ctrl+v也会触发粘贴paste事件,即也会自动上传,但此时点击确定所在行,再按ctrl+v又不触发了,失焦导致?:使用el-upload组件,自定义上传方法(调后台接口),传图片file给后台,后台返回对应阿里云的oss链接,前端临时保存,最后点击页面提交按钮,再传后台oss数组链接。

怎么自学python,大概要多久?上岸程序员告诉你_普通网友的博客-程序员秘密

我就是从零基础开始学的Python,也算是一个过来人了吧,现在看来当初我也是走了许多弯路,来给大家分享一下我的经验吧。首先是最重要的一点,想清楚你为什么要去学Python?你是想要做一个网站,写一个顺手的工具,还是只要能够通过学校的考试就行,这很大程度的影响了你该如何去学Python,学到什么程度或者是你是否该转去学习另一种语言。如果你只是想做一个个人网站或者博客,你大可去学PHP,甚至根本不用学,网上有很多网站模板,直接就能用。如果你们和当初的我一样是希望通过Python写一些小工具来提升自己在职场上的

云服务器我的数据保存在哪个文件夹,云服务器存储在哪里_葱切成葱花的博客-程序员秘密

云服务器存储在哪里 内容精选换一换整机镜像是包含云服务器操作系统、应用软件和业务数据的镜像。一般适用于云服务器数据整体搬迁,例如:将云服务器共享给其他租户将“华北-北京一”的云服务器迁移至“华南-广州”区域将老旧云服务器上的数据迁移至新服务器使用云备份创建整机镜像时,必须选择一个存储库,这个存储库相当于存储容器,镜像、备份都存放在该容器中。用户需要为存储库付费。使用云服务可以。如果您有业务部署在华...

UE4小技巧之官方Snippet导入_unreal engine 4 snippets_执手画眉弯的博客-程序员秘密

UE4 官方Snippet导入Visual Studio Snippets for Unreal Engine C++ ProjectsHow to install snippets?How to use snippets?UE4 引擎自带了一部分扩展部件在Engine/Extras/ 目录下,平时最常用的是UnrealVS的Vistual Studio插件,另外还有一个比较实用的就是VisualStudioSnippets。在 Engine/Extras/VisualStudioSnippets/ 文

mc9s08dz60 BootLoader基于bin文件_bin文件怎么包含bootloader_Allen__Xia的博客-程序员秘密

项目需求: 统一BootLoader下载协议为客户协议。 统一BootLoader下载文件类型为bin文件。 Boot时需要备份,如果中途下载失败需要恢复成之前版本。硬件环境:  MCU: mc9s08dz60. ZLG USB-CAN II. 项目控制器。软件环境:  WIN7. CodeWarrior10.7.通常来说,大家写NXP的BootLo...

半监督学习_mousever的博客-程序员秘密

传统的机器学习技术分为两类,一类是无监督学习,一类是监督学习。无监督学习只利用未标记的样本集,而监督学习则只利用标记的样本集进行学习。但在很多实际问题中,只有少量的带有标记的数据,因为对数据进行标记的代价有时很高,比如在生物学中,对某种蛋白质的结构分析或者功能鉴定,可能会花上生物学家很多年的工作,而大量的未标记的数据却很容易得到。这就促使能同时利用标记样本和未标记样

推荐文章

热门文章

相关标签