看书的时候看到两个比较有意思的小问题,一个是古埃及学者如何发现地球是圆的,并求得地球的近似周长的方法;另一个是利用蒙特卡洛方法求解圆周率的方法。
我们先来看第一个小问题(问题来自于卡尔.萨根的《宇宙》):
亚历山大城有一位多才多艺的学者,埃拉托色尼,他发现每年的6月21日中午,也就是夏至,赛伊尼(一个城市),垂直的树木都没有影子,但是他在他所在的亚历山大港做了一个试验,发现夏至日,垂直的立木依然有影子。如果大地是平的,那么阳光是近似垂直照射下来的,应该是各地的立木都不会产生影子才对。而且无论何时,只要竖立一个同样长度的杆子,他们的影子都该是一样的。因此他认为地球不是平的,并且根据影子的长度,他发现亚历山大港和赛伊尼之间大约有7度的夹角。
根据杆子的长度和影子的长度,可以推算出这个直角三角形的第三边长度,进一步的,可以算出夹角A。又由于两条平行线被三条直线相截的话,两个夹角相等(这些我们初中数学就学过),所以角A=角B,因此亚历山大港直达地心的直线和赛伊尼直达地心的夹角也是7度。根据这个角度就可以算出地球的近似周长。
下面我们用程序来实现一下地球周长的计算:
def get_circumference(angle, distance):
# 两个城市的夹角7度,相距800公里
c = 0
# c * angle/360 = distance,周长乘以360分之7就是两个城市直接的距离
c = distance*360/angle
return c
if __name__ == '__main__':
c = get_circumference(7, 800)
print('地球的周长为: %f公里' % c)
程序输出为:
而地球的真实赤道周长是40075公里,已经非常接近了,误差只有2.7%左右,在古埃及时代已经是非常伟大的成就了。
下面我们来看第二个小问题,蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是一种基于“随机数”的计算方法。蒙特卡罗方法的起源是1777年由法国数学家布丰(Comte de Buffon)提出的用投针实验方法求圆周率。另有一种说法是,该方法起源于美国在二战时研制原子弹的“曼哈顿计划”,该计划的主持人之一数学家冯诺依曼用赌城摩纳哥的蒙特卡罗来命名这种方法。
该方面可以描述为在一个正方形中,以一个端点为圆心,边长为半径画四分之一个圆,然后随机投入很多点,落在圆形内的点计数,做完试验后,用落在原型点内的数量初以投入到正方形中的点的总数,得到圆周率的四分之一,因为假设正方形边长为a,正方形的面积是a2,而四分之一圆的面积是Π*a2/4,两者的商乘以4,就是圆周率Π的值。
# pi的近似值
"""
蒙特卡罗方法的思路是,在一个单位边长的正方形中,以边长为半径,以一个顶点为圆心,在这个正方形上作四分之一圆。
在正方形中随机地投入很多点,使所投入的点落在正方形中每一个位置的机会相等。若点落入四分之一圆内则计数。
重复地向正方形中投入足够多的点,用落入四分之一圆内的点数除以总的点数,得到的就是π的四分之一的近似值。
"""
# x,y生成(0,1)之间的随机数,如果x**2+y**2开根号小于等于1,则表示落入圆中,计数
import random
import math
def solve():
count1 = 0
count2 = 0
for i in range(10000000):
x = random.random()
y = random.random()
if math.sqrt(x**2+y**2)<=1.0:
count2 += 1
count1 += 1
pi = (count2/count1)*4
return pi
if __name__ == '__main__':
pi = solve()
print('pi is: %f' % pi)
可以看到当试验次数增加到1000000次时,和真实值已经非常接近了。
通过这两个小问题可以看到,其实很多看似深奥的问题都有比较合适的解决方法,同时也能感受前人的伟大,很多现在显而易见的的结论在发现之初是非常的不容易的。
网友评论