欢迎加入我们卧虎藏龙的python讨论qq群:996113038
┉┉┉┉┉┉ 『导语』 ┉┉┉┉┉┉
割之弥细
所失弥少
割之又割
以至于不可割
则与圆合体而无所失矣
----------《海岛算经》刘徽
中国的圆周率比西方早了近一千年
可谓是古人伟大的发现之一
当古时智慧与现代技术相结合
又会碰撞出怎样的火花呢
接下来让我们一起
用现代的Python
循着古时割圆术的思路
求出圆周率这一奇妙的数字
¨¨¨『代码及相关资源获取』¨¨¨
1:关注“python趣味爱好者”公众号,回复“割圆法 ”获取源代码。
2:加入群聊:996113038。在群文件中下载源代码以及相关资料。
效果演示:
开发工具:
python3.6.4
相关第三方库:
math
turtle
往期精选:
讲解部分:
我们的代码分为两个,一个用来演示割圆法的原理,另一个用来计算割圆法的π值。
首先先讲一下割圆法的原理,其实很简单。大家看一看刚才那个视频就可以了。就是说。一个圆,我们怎样才能求出π。要知道,在中国古代,很长一段时间大家都求不出π的较精确值。
原理就是这样。我们假设存在一个正六边形,边长为1,当然,正六边形的“半径”也是1。
大家都知道这样一个公式:圆的周长=2*π*圆的半径。可以说,我们只需要得到了圆的周长,就可以通过:π=周长/(2*圆的半径)得到π的近似值。
割圆法的基本思路其实就是微积分的思路。即,把正n边形的每一条边都分隔成两个边,让正n边形变成正2n边形。求出正2n边形的边长,进而求出正2n边形的周长。
最后,通过微积分的思想,就可以让正n边形不断接近圆啦。
现在给大家讲一下代码:
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)
以上就是求解π的完整代码,首先我们定义一个zu函数,这个函数就是求解π的函数。其中的形参就是n,代表迭代几次。a和k代表初始边长和初始边数,也就是说这是个边长为1的正6边形。
然后,我们定义一个f(x)来求出正n边形的边长,这个for循环迭代,里面的k是正多边形的边的数量,每次迭代,边的数量增加两倍,通过f(a)求出其半径。
for i in range(n):
a = f(a)
k *= 2
迭代结束后,我们通过
return a * k / 2
求出n边形的近似π值。用到的原理就是:π=周长/(2*圆的半径)
结果已经很接近了
不由得赞叹前辈们的智慧啊
本期分享到此结束
很高兴你能看到最后
作者|齐
编辑|潇洒哥
感谢大家观看
有钱的老板可以打赏一下小编哦
扫描下方二维码,关注我们~
参考资料:
https://github.com/tianlelyd/pythonPainting
https://blog.csdn.net/ggyhang/article/details/102541645
封面来源:花瓣网