使用python计算PI值
1、pi的计算有好多方法,比较好算的一个是蒙特卡洛方法, 它利用圆与其外接正方形面积之比为pi/4的关系,通过大量均匀分布点,计算落在单位圆和单位正方形的数量之比再乘以4便得到pi的近似值。
也就是这个性质:正方形内部有一个相切的圆,它们的面积之比是π/4(初中数学学的)
2、方法:
1)给出随机点,画圆
2)通过距离判断点在圆内还是圆外,然后统计圆内点的数量
import cv2 as cvimport numpy as npimport copyimport osfrom random import randomfrom random import randintfrom math import sqrt
image = np.zeros((500, 500, 3), dtype="uint8")red = (0, 0, 255) #8green = (0, 255, 0)cv.rectangle(image, (0, 0), (500, 500), red)cv.imshow("rectangle", image)
这是一个500*500的正方形,500是为了看起来方便,毕竟取1太小了看不见。
3、给出样本值
num = 1000 样本值drawpoint = 0 打点数量for i in range(1,num): x,y=randint(0,500),randint(0,500) 随机整数 point = (x,y) cv.circle(image, point, 1, green, 1) 打点 position = sqrt(x**2+y**2) if position <= 500: # 统计比较 drawpoint = drawpoint+1 累加 pi = 4*(drawpoint/num) 求PIprint(pi)
cv.imshow("drawpoint", image)
我们随机打出了num个点。
4、画内切圆,这样就好看了
ptCenter = (0, 0) # 中心点位置axesSize = (500, 500) # 长轴半径为500,短轴半径为500rotateAngle = 0 # 旋转角度为 0startAngle = 0endAngle = 360point_color = (0, 0, 255) thickness = 1lineType = 1cv.ellipse(image, ptCenter, axesSize, rotateAngle, startAngle, endAngle, point_color, thickness, lineType)cv.imshow("pi", image) cv.waitKey(0)
5、再看PI的数值
3.156 样本数 1000
6、我们再增加样本数 10000 观察PI是多少
看到无数点点 密集恐惧症啊。。。
PI = 3.1504
7、在增加100000
PI = 3.13428
所以 样本点越多,计算出的数据将会越接近真识的pi