万物拓展在新江湾城开设的线下小班课,是以少儿编程课为核心,融合了计算机、天文、地理和物理等多种学科的综合性课程。
万物所有课程的设计都讲求拓展和互联,尤其是与校内基础学科的融合,Python编程亦是如此。
神奇的π
众所周知,圆周率π是⼀个圆的周⻓与直径之⽐,⽽且不论圆的⼤⼩,这个⽐值是常数,永远不变。圆周率的近似值 π ≈ 3.14 家喻户晓,关于它的⽂章和书籍更是多不胜数。
讲故事才是激发兴趣的第一要素
![dfca634ab81184ea65e5a4a1191f7174.png](https://i-blog.csdnimg.cn/blog_migrate/a80479cd04caa8af50c80e67de52fa08.png)
广阔的宇宙像pai一样无限。
两位伟人生于凡尘,归于群星。
我国数学家华罗庚,写过一本数学小册子《从祖冲之的圆周率谈起》,其中有一个故事:从前有个教书先生,平日喜欢喝酒。一天,他把学生们关在教室里,要他们背诵圆周率,自己却提了一壶酒到山上的寺庙找老和尚对饮去了。先生回来后,考问学生有没有把圆周率背下来。有个学生就回应道:“山巅一寺一壶酒,尔乐苦煞吾, 把酒吃,酒杀尔杀不死,乐尔乐”。
先生开始很生气,以为学生是在讽刺他,但很快便意识到这其实是带浓厚乡音的普通话 3.1415926535897932384626,顿时转怒为喜,把这个学生着实称赞了一番。
π 值计算史
“谁能把π算的更多位,谁就更厉害”,这揭开了π值计算史。
- 公元前200年前,古希腊科学家阿基米德
最先对 π 值进行系统严格的估算者应当首推古希腊科学家阿基米德(公元前 287—前 212 年),他得出不等式 3 + 10/71 < π < 3 + 1/7,平均值就是 π ≈ 3.14 · · ·
- 公元200到500年间,刘徽和祖冲之
在我国,三国后期魏国人刘徽(生于公元 250 年左右)留下了宝贵的数学遗产《九章算术注》和《海岛算经》,并创始和使用了“割圆术”,即用圆的内接和外切正多边形来逼近圆的周长。
割圆术为后来南北朝时期数学家祖冲之(公元 429—500 年)的估算 3.1415926 < π < 3.1415927 提供了最基本的方法。此外,祖冲之还以很简单的分数形式给出了圆周率的约率 π ≈ 22/7 和密率 π ≈ 355/113。
![56994286d0ef82274001aa190df502d4.png](https://i-blog.csdnimg.cn/blog_migrate/8e6675662a9882f341153a0175fc85ae.png)
古人计算圆周率,一般都是用正多边形来逼近圆的。阿基米德用正 96 边形逼近圆而得到 π 小数点后 3 位的精度,刘徽用正 3072 边形逼近圆也只能得到 π 小数点后 5 位的精度。
由于这些计算方法的效率极低,估算 π 的历史进程十分缓慢。直到微积分问世以后,情况才大为改观。
- 1706年,英国天文学家 John Machin
1706 年,英国天文学家 John Machin 发现了一个简单的解析公式,并用它计算 π 达到了小数点后 100 位的精确度。
π = 16 arctan(1/5) − 4 arctan(1/239)。
微积分的出现,不但给出了许多关于 π 的解析估计,更大大地加快了其数值计算。且不说优雅漂亮的 Gregory-Leibniz 和差公式
1/1 − 1/3 + 1/5 − 1/7 + 1/9 − · · · = π/4
以及 Wallis 乘积公式
2/1 × 2/3 × 4/3 × 4/5 × 6/5 × 6/7 × 8/7 × 8/9 × · · · = π/2 ,
后来发现能够用来对 π 作快速近似计算的公式还有很多。
- 1914,印度传奇数学家拉马努金
1914 年,自学成才的传奇印度数学家拉马努金就曾经写下过 14 个关于 π 的无穷级数展开公式。
电子计算机出现以后,人类大规模、高精度的计算能力得到了无与伦比的飞跃,使得圆周率计算的进程突飞猛进,实现了计算 π 的(二进制)数字长度一次又一次重大突破。
- 1985年,美国数学家 Bill Gosper
1985 年,美国数学家 Bill Gosper 用拉马努金的一个公式计算圆周率精确到了小数点后 17500000 位。
- 1994 年,苏联裔美国数学家 David 和 Gregory Chudnovsky
1994 年,苏联裔美国数学家 David 和 Gregory Chudnovsky 兄弟在同一个公式的基础上计算 π 到了 4044000000 位。
- 1995年, 日本数学家金田康正
1995 年以后,日本数学家金田康正及其团队更在世界上遥遥领先,在 2003 年把对 π 的 计算提高到了 1.24 万亿位。
- 2010年1月, 法国程序员 Fabrice Bellard
上面的纪录在 2010 年 1 月 8 日由法国一位程序员 Fabrice Bellard 打破。他改进了 Chudnovsky 兄弟的公式,用了 131 天在一部台式计算机上成功地把 π 计算到 2.7 万亿位。
这个数字有多长呢?如果你平均用一秒钟来报出一个数字的话,那么需要 8.5 万年才能读完它的所有数字。
- 2010年8月,日本工程师近藤茂
可是,这个世界纪录到 8 月份又被打破了,日本工程师近藤茂与美国西北大学计算机系的香港学生余智恒合作,把 π 值算到了 5 万亿位。
- 2010年9月,雅虎科技公司的研究员施子和
谁知道,当欢呼声犹在耳际,9 月 17 日英国 BBC 又作出了惊人的报道,说雅虎科技公司的研究员、原香港科技大学毕业生施子和采用“云计算”技术,利用 1000 台计算机同时计算,历时 23 天,将 π 计算到小数点后 2 千万亿位,为 8 个月前法国人 Bellard 记录的近一千倍。
这可不是只增加了大约一千个数位,而是由一千个、每个都有 2.7 万亿位长的数字连接起来。施子和兴奋无比地向全世界宣布了他的计算结果,还说他发现了“π 的小数点后第两千兆位是 0!”
你能记住 π 小数点后多少位?
你或许不以为然,说用计算机来计算π不足为奇。那么,用人脑进行计算和记忆就不容易了吧?如果我告诉你,有人能正确无误地记住 π 的数值从 3.14 开始一直到小数点后几万位数字,你会觉得匪夷所思吧?
其实,多少年来一直有凭人脑记忆背诵 π 数值的吉尼斯世界纪录,目前领先的是中国人吕超。2005年11月20日,当时是西北农林科技大学研究生的吕超用了24小时零 4分的时间,连续背诵出 π 值到小数点后67890位。
读到这里,你如果不是数学粉丝的话其实并不会特别激动:知道 π ≈ 3.14 就已经足够了,谁去关心它长长尾巴上的无穷多位数字呢?
说来也是,造物主有这么多东西可以创造,为什么偏偏造出这个神奇的 π 来,让许许多多的数学家和粉丝们两千多年来呕心沥血地去追寻不休呢?
其实,造物主并不是一些人所想象得那么无聊。
无处不在的神奇数字
你可能早已听说过,π 与地球上的许多河流有关:河流弯曲河道的曲线长度与河道首尾直线距离之比通常都接近于 3.14 —— 河道越是蜿蜒曲折,这个近似值就越好——亚马逊河便是一个例子。
最令人惊叹的是 2010 年11月《科学》杂志上报道的,德国格丁根大学马克 · 普朗克动力学与自组织科学研究所和伯恩斯坦计算神经科学研究中心的科学家 Matthias Kaschube 及其团队的一项研究成果。研究人员发现,相同哺乳类中的三种远亲动物婴猴、 树鼩和蒙眼貂的大脑中,它们视觉皮层的螺旋结构平均分布密度都是一样的,而且都落在 π 值 3.14 的 95% 置信区间之中。
真的?这不会是巧合吧?虽然这个 3.14 不能与用计算机得到的两千万亿位数字相提并论,但对于理论生物学家来说,3.14 已经是一个令他们难以置信的超级精确度了。
科学家们相信,今天的生物大脑都是经过漫长时间通过自组织演化过程而逐渐形成的,并且都具有某种最优的结构和功能。
如果是这样的话,那些哺乳类动物大脑视觉皮层中基本螺旋结构分布都不约而同地呈现出以 3.14 为平均密度之特征,是不是自然进化的最优结果呢?不会是造物主在创世开始时,不经意地在它们的大脑中写下了那个神奇的数字 π 吧?
计算圆周率的方法1--蒙特卡罗的方法
利用蒙特卡罗分析法可用于估算圆周率,如图,在边长为 2 的正方形内作一个半径为 1 的圆,正方形的面积等于 2×2=4,圆的面积等于 π×1×1=π,由此可得出,正方形的面积与圆形的面积的比值为 4:π圆和正方形的面积比是:
现在让我们用电脑生成若干组均匀分布于 0-2 之间的随机数,作为某一点的坐标散布于正方形内,那么落在正方形内的点数 N 与落在圆形内的点数 K 的比值接近于正方形的面积与圆的面积的比值,即,N:K ≈ 4:π,因此,π ≈ 4K/N 。(K是在圆内的,N是总的)
import random
num_all = 0 #随机点总计数器
num_cir = 0 #随机点在圆内的计数器
num_halt = 10000000 #每产生10,000,000个随机点后,计算并打印一次目前的结果
print("将进行无限计算,请用Ctrl_C或其他方式强制退出!!!")
input("按回车(Enter)键开始...")
print("开始计算...,退出请用Ctrl_C或其他强制退出方式...")
print("\n实验次数 计算结果")
while 1 :
for i in range(num_halt):
x = random.random() #获得随机点的横坐标
y = random.random() #获得随机点的纵坐标
if x*x + y*y 1 : #随机点(x,y)在圆内
num_cir = num_cir + 1 #圆内计数器+1
num_all = num_all + 1 #总计数器+1
pi = 4*num_cir/num_all
print(num_all," ", pi)
割圆迭代法:也很直观易懂,效率还不错
现在我们用刘徽和祖冲之的割圆术试试。
割之弥细,所失弥少。割之又割,以至于不可割,则与圆周合体而无所失矣。
与阿基米德相似,刘徽也是从正六边形开始计算的。不同的是,刘徽以面积来计算,他通过分割圆为192边形,计算出圆周率在3.141024与3.142704之间,取其近似值157/50。
![830dbcf60a441e686ac1d38c28cc946a.png](https://i-blog.csdnimg.cn/blog_migrate/d66d718aa8ac387679c37ecb4cbdc8de.png)
原理是这样的:设想一个圆,半径r=1,内接一个正n边形,边长为a,那么当这个多边形的边数n越大,它的周长就越接近圆的周长。所以我们就可以用多边形的周长代替圆的周长并应用圆的周长公式得到:
圆的内接正n边形边长a可以迭代计算:
我们从正六边形开始,它的边长a=r=1,然后计算正12边形、正24边形、正48边形...逐渐逼近圆。
# 因为计算机精度原因,64位机算到49512边形就无法继续提高计算结果的精度了
import math
n=6
a=1
print("%-15s%-20s" % ("内接正n边形","π计算结果"))
print("%-20d%-20.12f" % (n, n*a/2))
for i in range(100) :
n=2*n
a=math.sqrt(2-2*math.sqrt(1-(a/2)**2))
print("%-20d%-20.12f" % (n, n*a/2))
思考:为什么后面的值是0?????
3、梅钦级数法:不直观但也易懂,效率超高
大Boss梅钦(John Machin)用他的神奇公式亲手把π算到了小数点后100位,今天,我们借助Python编程,可以远远超过这个精度。
梅钦公式:
数学上可以进行级数展开,我们表示为:
为了能做到高精度快速计算,我们把所有的级数都变成整数运算,因此,如果我们希望计算到π的小数点后面n位,就在上述公式两边乘以10的n次方,并全部运行整除运算(运算符号是“//”)。最后我们得到的一个π乘以10^n所形成的一个巨大的整数来表示计算结果(如果需要,可以通过字符变换把小数点加回去,这里就略过了)。
基于这样的思路,我们的代码是:
n = int(input("请输入想要计算到小数点后的位数:")) #输入字符转换为整数
t = n+10 #多计算10位,防止尾数取舍的影响
b = 10**t #为算到小数点后t位,两边乘以10^t
x1 = b*4//5 #取整求含4/5的首项
x2 = b // -239 #取整求含1/239的首项
s = x1+x2 #求第一大项
n *= 2 #设置下面循环的终点,即共计算n项
for i in range(3, n, 2): #循环初值=3,末值n,步长=2
x1 //= -25 #取整求每个含1/5的项及符号
x2 //= -57121 #取整求每个含1/239的项及符号
x = (x1+x2) // i #求两项之和,除以对应因子,取整
s += x #求总和
pai = s*4 #求出π
pai //= 10**10 #舍掉后十位
print(pai) #输出圆周率π的值,不带小数点
请运行,然后,请你大胆输入10000,就是说要精确到10000位!
激动人心的时刻到了,不出意外的话,几秒钟就出结果,一万位的π出炉了!
python 对于科学计算有着天然的优势
这得益于Python对数学计算的支持,还有很多数学计算的公式可以直接在python的数学库中找到,并直接使用。
在π的计算中,整数的处理方式,它能处理的整数大小不取决于寄存器大小(例如64位机=8B),而是取决于可用内存的大小(例如8GB,当然系统可能不会给用这么多,但就算给你8MB就非常厉害了),所以能计算的整数是非常非常大的。
如果你愿意等,也可以试试5万位、10万位、20万位,时间会长一些,但现在的家用电脑一般也能算得出来!
若你想要尝试100万位,就不敢保证了,请做好死机的准备。
上课地点:橡树湾小区或老师上门授课。
欢迎扫码添加老师微信号(Zhaojz9687)。
[新江湾城万物课]万物少儿编程课体系介绍