python3 题解(29 祖冲之割圆法求圆周率)

祖冲之割圆法

【问题】我们可能都 听说过祖冲之用割圆法把圆周率计算到小数后7位。但具体是怎么操作的,可能就不太清楚了。其实从今天看来,原理很简单。
圆的内接正多边形的周长,比较接近圆的周长。
边数越多,越接近。
如果已知了正 n 边形的边长,可如下图,把它变成正 2n 边形(每条边分裂为两条)。

在这里插入图片描述
图中,红色为原来的边。蓝色为分裂后的新边。
已知了半径,原来的边长,根据勾股定理,很容易求出蓝边的长度。

把这个过程继续下去,就可以让多边形的周长很接近圆的周长了。
请编程,用此法求圆周率值。

分析:
不妨把半径定为1。
初始的多边形设为正六边形比较好。因为它长边长等于半径。

import math

def zu(n):
	## 假设边长为1
	def f(x): ## 由当前边长,求割后边长
		h = 1 - math.sqrt(1-(x/2)**2)
		return math.sqrt(h**2 + (a/2)**2)

	a = 1  ## 初始边长
	k = 6  ## 初始边数
	for i in range(n):
		a = f(a)
		k *= 2

	return a * k / 2

if __name__ == '__main__':
	print(zu(10))
	print(math.pi)

可以看到,这个方法的收敛速度很快。
只迭代了10次,就已经很精确了。


需要补基础的,可以看:小甲鱼pyhthon教程,Bilibili站上还有:[耿老师]小甲鱼python作业 解析系列,持续更新中。


版权声明:本文为ggyhang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。