
割圆术来计算圆周率
所谓割圆术,就是不断倍增圆内接正多边形的边数求出圆周率的方法,由魏晋时期的数学家刘徽首创。
原理是这样的:假设圆的半径为1,现在我们接入了一个正六边形,如图画出一个三角形AOB,容易得出这是一个正三角形,因此边AB长为1。现在我们过O做AB的的垂线,与AB交于P,与圆交于C。
下一步,求AC长。求出AC的长来,我们就会得出圆内接12边形的周长来(6边形,每条边演变成2条)。APC为直角三角形,AP长为0.5,CP为OC减去OP,OP为OA平方减AP平方之后开平方。AC为AP平方加CP平方之后再开方。然后12边形的周长为12倍的AC,用12边形求圆周率就是12边形的周长除以2(因为半径为1)。
以此类推,可求24、48、96…6*2^n边形对应的圆周率。
下面用代码实现一下:
import math
# times为分割次数,分割一次边数增加一倍。
def geiyuan(times):
# 初始边长,即内接6边形的边长。
bianchang = 1
# 初始边数,即内接6边形的边数
bianshu = 6
#这是求边数加一倍后的新边长
def fanbeihoubianchang(x):
#求过圆心的三角形的高
gao = math.sqrt(1-(x /2)**2)
#返回新边长
return math.sqrt((x /2)**2 + (1-gao)**2)
#这里用一个循环,每多一次分割次数算一次
for i in range(times):
#用函数求翻倍后的边长
bianchang = fanbeihoubianchang(bianchang)
#边数为原来的2倍
bianshu=bianshu*2
#圆周率为内接正多边形周长除以直径
pi = bianchang*bianshu/2
#计算完毕,返回边数及圆周率
return bianshu, pi
#先算一下分割20次后的圆周率吧。
for i in range(1,21):
#这里将中间过程算出的圆周率打印出来
print('分割{}次,边数为{},圆周率为{:.10f}'.format(i, *geiyuan(i)))
#与math库中的圆周率做一下对比。
print('math库中的圆周率常量值为{:.10f}'.format(math.pi))
结果:

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/75024
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!