用蒙特卡罗模拟球π的值

  蒙特卡罗(Monte Carlo)方法,又称随机抽样或统计试验方法,属于计算数学的一个分支,它是在本世纪四十年代中期为了适应当时原子能事业的发展而发展起来的。传统的经验方法由于不能逼近真实的物理过程,很难得到满意的结果,而蒙特卡罗方法由于能够真实地模拟实际物理过程,故解决问题与实际非常符合,可以得到很圆满的结果。这也是我们采用该方法的原因。

  

基本原理及思想编辑

当所要求解的问题是某种事件出现的概率,或者是某个随机变量的期望值时,它们可以通过某种“试验”的方法,得到这种事件出现的频率,或者这个随机变数的平均值,并用它们作为问题的解。这就是蒙特卡罗方法的基本思想。蒙特卡罗方法通过抓住事物运动的几何数量和几何特征,利用数学方法来加以模拟,即进行一种数字模拟实验。它是以一个概率模型为基础,按照这个模型所描绘的过程,通过模拟实验的结果,作为问题的近似解。可以把蒙特卡罗解题归结为三个主要步骤:构造或描述概率过程;实现从已知概率分布抽样;建立各种估计量。

蒙特卡罗解题三个主要步骤编辑

构造或描述概率过程:

对于本身就具有随机性质的问题,如粒子输运问题,主要是正确描述和模拟这个概率过程,对于本来不是随机性质的确定性问题,比如计算定积分,就必须事先构造一个人为的概率过程,它的某些参量正好是所要求问题的解。即要将不具有随机性质的问题转化为随机性质的问题。

实现从已知概率分布抽样:

构造了概率模型以后,由于各种概率模型都可以看作是由各种各样的概率分布构成的,因此产生已知概率分布的随机变量(或随机向量),就成为实现蒙特卡罗方法模拟实验的基本手段,这也是蒙特卡罗方法被称为随机抽样的原因。最简单、最基本、最重要的一个概率分布是(0,1)上的均匀分布(或称矩形分布)。随机数就是具有这种均匀分布的随机变量。随机数序列就是具有这种分布的总体的一个简单子样,也就是一个具有这种分布的相互独立的随机变数序列。产生随机数的问题,就是从这个分布的抽样问题。在计算机上,可以用物理方法产生随机数,但价格昂贵,不能重复,使用不便。另一种方法是用数学递推公式产生。这样产生的序列,与真正的随机数序列不同,所以称为伪随机数,或伪随机数序列。不过,经过多种统计检验表明,它与真正的随机数,或随机数序列具有相近的性质,因此可把它作为真正的随机数来使用。由已知分布随机抽样有各种方法,与从(0,1)上均匀分布抽样不同,这些方法都是借助于随机序列来实现的,也就是说,都是以产生随机数为前提的。由此可见,随机数是我们实现蒙特卡罗模拟的基本工具。

建立各种估计量:

一般说来,构造了概率模型并能从中抽样后,即实现模拟实验后,我们就要确定一个随机变量,作为所要求的问题的解,我们称它为无偏估计。建立各种估计量,相当于对模拟实验的结果进行考察和登记,从中得到问题的解。

例子:

  一个边长为2的正方形,以正放心的中心点画一个半径为1的圆,随机在正方形内产生1亿个随机的点,落在这个圆内的概率 = 圆面积 / 正方形面积 = π / 4。

  以下用java代码测试:

public class ConteCarloMode {
/**Main method*/
public static void main(String[] agrs){
final int NUMBER_OF_TRIALS = 100000000;
int numberOfHits = 0;

for(int i = 0; i < NUMBER_OF_TRIALS; i++){
double x = Math.random()*2 - 1;
double y = Math.random()*2 - 1;
if(x*x + y*y <=1)
numberOfHits++;
}

double pi = 4.0 * numberOfHits / NUMBER_OF_TRIALS;
System.out.println("PI is " + pi);

}

}

实验的值都非常接近于3.14

用蒙特卡罗模拟球π的值

时间: 2024-10-05 04:09:20

用蒙特卡罗模拟球π的值的相关文章

数学模型:4. 蒙特卡罗模拟

随机算法 1. 蒙特卡罗模拟 蒙特卡罗(Monte Carlo)方法,又称随机抽样或统计试验方法,是以概率和统计理论方法为基础的一种计算方法使用随机数(或更常见的伪随机数)来解决很多计算问题的方法.将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解. ① π的计算② 计算积分 y = x**2③ 排队上厕所问题 import numpy as np import pandas as pd import matplotlib.pyplot as plt % m

蒙特卡罗随机模拟

Monte Carlo方法也叫随机模拟.随机抽样或者统计实验方法.其主要用途用于模拟一些无法用数值产生的随机系统.比如当系统的各个单元的特征量已知,但系统过于复杂导致无法预测其准确数学模型,这个时候可以用随机模拟法计算系统的相关参数. 蒙特卡罗的基本思想,为了求解数学.物理.生产管理等方面的问题,首先需要建立一个概率模型或者一个抽样试验来计算所求参数的统计特征,最后通过计算机模拟求出近似解. 我们说蒙特卡罗模拟的是随机现象,那么不同的问题的随机现象是不同的.比如掷骰子,各个点数等概率出现,模拟的

蒙特卡罗(洛)模拟

title: 蒙特卡罗(洛)模拟 date: 2020-02-27 21:26:53 categories: 数学建模 tags: [ MATLAB, 模拟] mathjax: true 引例 布丰投针实验 法国数学家布丰(1707-1788)最早设计了投针试验. 这一方法的步骤是: 1) 取一张白纸,在上面画上许多条间距为a的平行线. 2) 取一根长度为l(l≤a) 的针,随机地向画有平行直线的纸上掷n次,观察针与直线相交的次数,记为m. 3)计算针与直线相交的概率. 18世纪,法国数学家布丰

蒙特卡罗方法(Monte Carlo method)

蒙特卡罗方法(Monte Carlo method) 蒙特卡罗方法概述   蒙特卡罗方法又称统计模拟法.随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法.将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解.为象征性地表明这一方法的概率统计特征,故借用赌城蒙特卡罗命名. 蒙特卡罗方法的提出   蒙特卡罗方法于20世纪40年代美国在第二次世界大战中研制原子弹的"曼哈顿计划&qu

初识蒙特卡罗算法

蒙特卡罗算法,在我看来,是一个很神奇的算法,它可以模拟出很多场景,并且模拟出来的数据,可能与真实的数据相差无几,但模拟的成本远远低于真实数据的获取. 今天,我就用蒙特卡罗算法,做两个简单的模拟.一个是π值计算,另外一个求积分. 一.π值 π值是一个无理数,无限不循环,公元480年左右,南北朝时期的数学家祖之冲进得出精确到小数点后7位的结果,今天,我们用计算机来模拟一把,我模拟的结果如何. 首先来说明模拟的思路,如下图所示,通过推导出正方形和内切圆面积存在比例关系,只要计算出它俩的面积比值,我们就

随机模拟(MCMC)

http://cos.name/2013/01/lda-math-mcmc-and-gibbs-sampling/ http://blog.csdn.net/lin360580306/article/details/51240398 随机模拟(或者统计模拟)方法有一个很酷的别名是蒙特卡罗方法(Monte Carlo Simulation).这个方法的发展始于20世纪40年代,和原子弹制造的曼哈顿计划密切相关,当时的几个大牛,包括乌拉姆.冯.诺依曼.费米.费曼.Nicholas Metropoli

Android tips(十)--&gt;允许模拟位置在Android M下的坑

转载请标明出处:一片枫叶的专栏 本文我们将讲解允许模拟位置在Android M下的坑.做地图类应用的同学应该都知道为了避免软件模拟位置影响正常流程的进行我们一般都会判断用户手机是否打开了模拟位置设置,若打开了则终止用户流程,提醒用户关闭模拟位置设置.在android系统的开发者选项中有一个模拟位置的选项,其作用是允许用户通过代码模拟设备的当前位置,比如地图类应用需要测试在外地的使用情况,通过开启此项选项可以通过代码模拟位置,具体可参考我的:Android中的开发者选项 允许模拟位置的设置选项在手

如何在C#中模拟C++的联合(Union)?[C#, C++] How To Simulate C++ Union In C#?

1 什么是联合? 联合(Union)是一种特殊的类,一个联合中的数据成员在内存中的存储是互相重叠的.每个数据成员都在相同的内存地址开始.分配给联合的存储区数量是“要包含它最大的数据成员”所需的内存数.同一时刻只有一个成员可以被赋给一个值. 下面我们来看看C++中如何表达联合: // Code #01union TokenValue{    char _cval;    int _ival;    double _dval;}; 2 联合的内存布局与内存使用情况. 下面我们来考察一下TokenVa

Material Design学习之 Sliders(详细分析,悬空气球显示进度值,附带Eclipse可以jar)

转载请注明出处:王亟亟的大牛之路 Material Design系列的文章这是第五篇,今天讲滑块控件(Sliders). 之前的传送门:http://blog.csdn.net/ddwhan0123/article/details/50578348(代码实现都靠画,学好View还是很重要的) 老规矩,先说下理论部分 滑块控件(Sliders,简称滑块)可以让我们通过在连续或间断的区间内滑动锚点来选择一个合适的数值.区间最小值放在左边,对应的,最大值放在右边.滑块(Sliders)可以在滑动条的左