π-Day的庆祝方式——用蒙特卡洛方法近似求π

2009年,在麻省理工学院的首先倡议下,美国众议院正式通过一项无约束力决议(Non-binding resolution)(HRES 224),将每年的3月14号设定为“圆周率日”即“Pi Day”。2011年,国际数学协会也正式宣布将每年的3月14日设为“国际数学节”

在这个隆重的节日里,我们就用蒙特卡洛方法来亲手验证一下π的值吧!!!

蒙特卡洛方法简单点理解就是一种应用随机数进行仿真试验的方法。

计算的基本思路

我们都知道S=πr2S=πr2
那么当r=1r=1时,S=πS=π

我们先假设有一个边长为1的正方形
π-Day的庆祝方式——用蒙特卡洛方法近似求π_第1张图片

正方形中的扇形面积正好是1/4的圆

如果我们随机产生(0,1)之间的数,那么我们只要算出随机点落在扇形面积内的概率,就会得到圆的面积的1/4,乘以4之后将得到圆的面积,同时以近似求解出π的值

python3实验结果

代码

# -*- coding: utf-8 -*-
"""
Created on Wed Mar 14 21:27:33 2018

@author: liang
"""
import random 
import decimal
from decimal import Decimal  #进行精度控制
print(decimal.getcontext())  
decimal.getcontext().prec = 1000

'''
试验方法
'''
def caculate_pi():
    #落在扇形区域内的点
    sum_in=0
    #样本数量
    n_sample=9999

    #计算落在扇形区域的次数
    for i in range(n_sample):
        x,y=random.random(),random.random()
        if x**2+y**2 <= 1:
            sum_in=sum_in+1

    #实验得到pi值
    test_pi=(Decimal(sum_in)/Decimal(n_sample))*4
    print('实验得出的pi的值为: ',test_pi)
    return test_pi

if __name__=='__main__':
    N=1000#实验次数

    #将得到的结果平均
    sum_pi=0
    for i in range(N):
        sum_pi+=caculate_pi()

    #最终得到的pi的值
    print('**************最终实验得出的pi的值为:  *****************',(Decimal(sum_pi)/Decimal(N)))

其中Decimal 包进行计算精度的控制。

得到的结果:
π-Day的庆祝方式——用蒙特卡洛方法近似求π_第2张图片

我们经过1000次实验,每次实验随机产生9999个点来近似计算π值。
可见最终得到:
3.1415529552955295529552955295529552955295529552955295529552955295529552……
也是挺接近π的值的。

最后,祝大家π-Day快乐!!!

你可能感兴趣的:(数学,蒙特卡洛,π)