- 常用的求PI的公式为PI/4=1-1/3+1/5-1/7+1/9-1/11+1/13…我们可以编写代码并对其进行精度控制,例如,当某一项的值小于1e-6,输出我们想要的结果。
代码如下:
s=1.0
n=1
t=1.0
pi=0
while(abs(t)>1e-6):
pi=pi+t
n=n+2
s=-s
t=s/n
print “PI is {:.10}”.format(pi*4)
PI is 3.141590654
其实以上的算法完全应用了数学的公式来对PI进行求值。易于直观理解。但是假如我们不知道PI的数学公式,有没有一种办法求PI?
在工程、物理、化学等领域有一个著名的模式蒙特卡洛模拟,通过该模拟算法(暂且叫算法吧)。它是通过概率论统计为指导的一种重要的模拟方法。
我们以上图为例说明蒙特卡洛模拟的应用
当我们的途中点以随机的方式进行抛洒的时候,如果我们抛洒的点足够多,由概率统计,我们可以知道图一区域的点的个数和图二区域的点的个数的比值应该就是二者面积的比值。图一面积为PIRR/4,而正方形的面积为2R2R/4。设图一点数为N,图二和图一点数为M。则可得PI=4(N/M)。我们编写代码如下,假设为单位圆。
from random import random
DATAS=100100100
hits=0.0
for i in range(1,DATAS+1):
x,y=random(),random()
dist=pow(x2+y2,0.5)
if dist<=1.0:
hits=hits+1;
pi=4*(hits/DATAS)
print “this PI is {}”.format(pi)
this PI is 3.142472
虽然误差有点大,但是不失为一种求PI的计算方法。蒙塔卡罗模拟感觉可以解决许多的问题。除了求PI值,我们可以用来编程求解不规则图形的面积等。毕竟万事万物都逃不过随机。