夜光序言:
谁かを见杀しにするくらいなら、
一绪に死んだほうがずっとましだ。
如果对别人见死不救的话,那还不如一起死了算了。
正文:π的计算
圆周率π是一个无理数,没有任何一个精确公式能够计算π值, π的计算只能采用近似算法。
国际公认的PI值计算采用蒙特卡洛方法。
蒙特卡洛(Monte Carlo)方法,又称随机抽样或统计试验方法。当所求解问题是某种事件出现的概率,或某随机变量期望值时,可以通过某种“试验”的方法求解。
简单说,蒙特卡洛是利用随机试验求解问题的方法。
应用蒙瑞特卡罗方法求解π的步骤是这样的:
首先构造一个单位正方形 和 1/4圆
随机向单位正方形和圆结构抛洒大量点,对于每个点,可能在圆内或者圆外,当随机抛点数量达到一定程度,
圆内点将构成圆的面积,全部抛点将构成矩形面积。圆内点数除以圆外点数就是面积之比,即π/4。随机点数量越大,得到的π值越精确
π计算问题的IPO表示如下:
输入:抛点的数量
处理:对于每个抛洒点,计算点到圆心的距离,通过距离判断该点在圆内或是圆外。统计在圆内点的数量
输出:π值
示例程序1:π的计算
# 夜光:数学奥秘
from random import random
from math import sqrt
from time import clock
DARTS = 1200
hits = 0
clock()
for i in range(1,DARTS):
x,y = random(),random()
dist = sqrt(x**2 + y**2)
if dist <=1.0:
hits = hits + 1
pi = 4*(hits/DARTS)
print("夜光:pi的值是%s"%pi)
print("程序运行的时间是%-5.5ss"%clock())
研究:由于DARTS点数量较少,π的值不是很精确
通过增加DARTS数量继续试验,同时,运行时间也逐渐增加【研究数据】
PS:
在2^30数量级上,π的值就相对准确了。
进一步增加DARTS数量,能够进一步增加精度
输入部分通过初始变量DARTS给出;
输出部分通过print函数打印到屏幕上
操作部分主要代码如下:
代码主体是一个循环,模拟抛洒多个点的过程
对于一个抛点,通过random()函数给出随机的坐标值(x,y),然后利用开方函数sqrt()计算抛点到原点距离
然后通过if语句判断这个距离是否落在圆内
最终,根据总抛点落入圆内的数量,计算比值,从而得到π值
蒙特卡洛方法【科研方法】
蒙特卡洛方法提供了一个利用计算机中随机数和随机试验解决现实中无法通过公式求解问题的思路。
它广泛应用在金融工程学,宏观经济学,计算物理学
(如粒子输运计算、量子热力学计算、空气动力学计算)等