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

利用蒙特卡罗方法计算圆周率

(2015-12-10 17:33:00)
标签:

蒙特卡罗

圆周率

pi

python

分类: 教育

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

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

它诞生于上个世纪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 | 产品答疑

新浪公司 版权所有