加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

用蒙特卡罗方法求解圆周率

(2017-09-24 11:07:46)
分类: 程序设计
  一、蒙特卡洛基本思想:     
        计算机模拟经常采用随机模拟方法或统计试验方法,这就是蒙特卡洛方法。它是通过不断产生随机数序列来模拟过程。自然界中有的过程本身就是随机的过程,物理现象中如粒子的衰变过程、粒子在介质中的输运过程„等。当然蒙特卡洛方法也可以借助概率模型来解决不直接具有随机性的确定性问题。     对求解问题本身就具有概率和统计性的情况,例如中子在介质中的传播,核衰变的过程等,我们可以直接使用直接蒙特卡洛 模拟方法。该方法是按照实际问题所遵循的概率统计规律。直接蒙特卡洛方法最充分体现出蒙特卡洛方法无可比拟的特殊性和优越性,因而在物理学的各种各样的问题中得到广泛的应用。该方法也就是通常所说的“计算机实验”。                蒙特卡洛方法也可以人为地构造出一个合适的概率模型,依照对该模型进行大量的统计实验,使它的某些统计参量正好是待求问题的解。这也就是所谓的间接蒙特卡洛方法。我在这里求解圆周率就是用的间接蒙特卡洛方法。 
二、圆周率求解的基本思想:      
       根据圆面积的求解公式s=πr2可推导出,圆周率的求解公式 π=s/r2,根据此公式,可知,只要计算出圆的面积,测得圆的半径即可求得圆周率。圆的半径可直接测得,但是圆的面积并不好求,传统的做法有微圆分  割法,如右图,将圆周无限分割成三角形这些三角 形都是等边的,可以通过求解三角形的面积间接求 得圆的面积,但是这样的圆周率并不精确。在本题 中采用计算机模拟来间接求得圆的面积,具体做

三、用蒙特卡洛方法求解圆周率:

上面已经知道了蒙特卡洛应用的今本思想以及圆周率求解的基本原理与方法,那么我们用蒙特卡洛方法求解圆周率,从0到2之间任意取一组数,这一组数的每个元素包含两个变量x和y,x代表所取点的横坐标,y代表所取点的纵坐标,x和y由计算机随机抽取,然后编辑公式筛选符合条件的点,筛选条件为,x和y都被包含在圆内。然后设定一个计数器m,每当有一个点符合条件,则m加1,如此一直循环到取够所设定的点数,然后用m值除以设定的点数,得到一个值,然后再乘以4,这时得到的值就是圆的面积,然后用得到的这个面积除以半径的平方(因为设定的圆的半径为1,所以具体操作时不再考虑,得到的圆的面积直接就是圆周率的值)  说明:本例中先取0到20000之间的随机数,然后再用这些点除以


蒙特卡罗方法是一种计算方法。原理是通过大量随机样本,去了解一个系统,进而得到所要计算的值。

它非常强大和灵活,又相当简单易懂,很容易实现。对于许多问题来说,它往往是最简单的计算方法,有时甚至是唯一可行的方法。

它诞生于上个世纪40年代美国的"曼哈顿计划",名字来源于赌城蒙特卡罗,象征概率。

  π的计算

第一个例子是,如何用蒙特卡罗方法计算圆周率π。

正方形内部有一个相切的圆,它们的面积之比是π/4。

http://www.ruanyifeng.com/blogimg/asset/2015/bg2015072611.jpg

http://www.ruanyifeng.com/blogimg/asset/2015/bg2015072603.jpg

现在,在这个正方形内部,随机产生10000个点(即10000个坐标对 (x, y)),计算它们与中心点的距离,从而判断是否落在圆的内部。

http://www.ruanyifeng.com/blogimg/asset/2015/bg2015072604.jpg

如果这些点均匀分布,那么圆内的点应该占到所有点的 π/4,因此将这个比值乘以4,就是π的值。通过R语言脚本随机模拟30000个点,π的估算值与真实值相差0.07%。

以上算法用python实现。

源代码:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from random import random

from math import sqrt


total = 10000

x = y = inn = out = 0.0


for i in range(total):

    x = random()

    y = random()

    #print(x, y)

    if (i % (total/10) == 0):

        print(i)

    if (sqrt(x * x + y * y)<1.0):

        inn += 1.0

    else:

        out += 1.0

print(total, inn, out)

print(inn*4 / total)


通过修改total的值来实现随机概率事件。

计算结果:

当total=10000时,计算的结果为3.15

当total=100000时,计算的结果为3.14528

当total=1000000时,计算的结果为3.141228

当total=10000000时,计算的结果为3.141518

当total=100000000时,计算的结果为3.14186572

当total=1000000000时,计算的结果为3.14166922

结论:

可见,随着随机概率事件次数越大,圆周率的数值就越精确。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有