- 蒙特卡洛法:蒙特卡洛方法(Monte Carlo,简称MC),是以概率论和数理统计为理论基础、使用随机数(或更常见的伪随机数)解决实际问题的一种随机抽样统计方法,它常用于求解一些带有“随机”性质的实际生活问题和研究一些带有现条件下难以观测的物理量的实验。编程中采用的蒙特卡洛法就是指用随机数的方法。
假设一个正方形,边长a=2,则其内接圆的半径r=1,则圆和正方形的面积比是:
因此,
我们用蒙特卡洛法来获得面积比Sy/Sz:让计算机产生很多的随机点(x,y),其中x、y都是[0,1]之间的随机数,可以用判断 [公式]
是否小于1的方法来确定是否在圆内,则圆内的点数代表圆面积,总点数代表总面积,两者相除就是面积比Sy/Sz。
Python代码如下:
import random
num_all = 0 #随机点总计数器
num_cir = 0 #随机点在圆内的计数器
num_halt = 10000000 #每产生这么多个随机点后,计算并打印一次目前的结果
print("将进行无限计算,请用Ctrl_C或其他方式强制退出!!!")
input("按回车(Enter)键开始...")
print("开始计算...,退出请用Ctrl_C或其他强制退出方式...")
print("\n实验次数 计算结果")
while True :
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)
通过运算我们发现,计算结果的收敛是很慢的,算到超过133亿个随机点,才收敛到3.14159,如下所示:
实验次数 计算结果
13350000000 3.1415928419475656
13360000000 3.141593166766467
13370000000 3.1415929427075544
13380000000 3.1415930633781763
13390000000 3.1415925159073934
13400000000 3.141592089850746
13410000000 3.1415922147651005
13420000000 3.141592147839046
13430000000 3.1415921915115415
13440000000 3.14159239375
13450000000 3.1415922649814125
数学上可以证明,蒙特卡洛法每提高一位精度,需要提高100倍的计算量,因此达到上述小数点后面5位的精度如果花了1小时的话,6位精度要100小时,7位要一年多,8位要100多年。可见,用蒙特卡洛方法要把π算到小数点后面10位以上是很艰难的。即使用效率高得多的C语言,同样时间内也顶多再提高一两位的精度。即使放到大型计算机上去,也提高不了几位。
可见蒙特卡洛法虽然很直观,容易理解,但效率和精度不高,并不实用。不过,蒙特卡洛法本身在计算机编程中还是相当重要的,了解这种方法在其它程序中很可能有用。
蒙特卡洛法蕴含的数学理论,也称统计模拟方法 ,是一种计算机化的数学方法,简而言之就是,就是在求积分时,如果找不到被积函数的原函数,那么利用经典积分方法是得不到积分结果的,但是蒙特卡洛积分方法告诉我们,利用一个 随机变量 对被积函数进行采样,并将采样值进行一定的处理,那么当采样数量很高时,得到的结果可以很好的近似原积分的结果。
蒙特卡洛方法的数学思想:在求圆周率的主要思想是把要求解的问题转化为求解某一随机事件的概率。
2、割圆迭代法:原理是这样的:设想一个圆,半径r=1,内接一个正n边形,边长为a,那么当这个多边形的边数n越大,它的周长就越接近圆的周长。所以我们就可以用多边形的周长代替圆的周长并应用圆的周长公式得到:
圆的内接正n边形边长a可以迭代计算:
我们从正六边形开始,它的边长a=r=1,然后计算正12边形、正24边形、正48边形...逐渐逼近圆。
代码如下:
import math
import math
import math
n=6
a=1
print("%-15s%-20s" % ("内接正n边形","π计算结果"))
print("%-20d%-20.12f" % (n, n*a/2))
for i in range(14) :
n=2*n
a=math.sqrt(2-2*math.sqrt(1-(a/2)**2))
print("%-20d%-20.12f" % (n, n*a/2))
计算结果如下:
内接正n边形 π计算结果
6 3.000000000000
12 3.105828541230
24 3.132628613281
48 3.139350203047
96 3.141031950891
192 3.141452472285
384 3.141557607912
768 3.141583892149
1536 3.141590463237
3072 3.141592106043
6144 3.141592516588
12288 3.141592618641
24576 3.141592645321
49152 3.141592645321
98304 3.141592645321
我们可以看到,因为计算机精度原因,算到正49512边形就无法继续提高计算结果的精度了(64位机)。所以我们只算到了π=3.141592645,
割圆迭代法蕴含的数学思想及其数学理论:极限思想,他把与圆周合体的这个正多边形,就是不可再割的这个正多边形,进行无穷小分割,再分割成无穷多个以圆心为顶点,以多边形每边为底的无穷多个小等腰三角形,这个底乘半径为小三角形面积的两倍,把所有这些底乘半径加起来,应该是圆面积的两倍。那么就等于圆周长乘半径等于两个圆面积。所以一个圆面积等于半周乘半径,所以刘徽说故半周乘半径而为圆幂。
1、割圆术
圆周率的定义:圆的周长与直径的比值的数字常数。
计算方法:刘徽提出了一个计算圆周率的算法。刘徽从圆内接正六边形开始割圆,"割之弥细,所失弥少,割之又割,以至于不可割,则与圆周合体而无所失矣",既是如此继续下去,对于这个正边形,设是边形的面积,是每边长,割的越细,即越大,就越小(为圆的面积),割至不可割时,则圆内接正多边形便与圆周合为一体。
数学理论:设想一个圆,半径,内接一个正边形,边长为,那么当这个多边形的边数越大,它的周长就越接近圆的周长。所以我们就可以用多边形的周长代替圆的周长并应用圆的周长公式得到:,圆的内接正边形边长可以迭代计算: 。我们从正六边形开始,它的边==1,然后计算正12边形、正24边形、正48边形...逐渐逼近圆。
数学思想:
①极限思想。gE)K在割圆术中,刘徽用倍增圆内接正六边形的边数,以正边形当时面积的极限来定义圆面积,他说“又按为图,以六觚之一面乘平径,因而三之,得十二觚之幂,著又割之,次以十二之一觚面乘半径,因而八之,则得二十四之觚幂割之弥细,所失弥少.割之又割,以至于不可割,则与圆合体而无所失矣”这正是极限思想的体现。
②求理思想。刘徽之所以反复论述其基本原理和方法,是因为他把割圆术和圆周率看作是一种普遍原则和一般规律,掌握了其中的一般规律便可以由近知远。
③创新思想与科学思想。实事求是不盲从;化圆为方的辩证思想;数学不仅需要形式逻辑,也需要辩证逻辑。
2、蒙特卡洛法:蒙特卡洛方法是以概率论和数理统计为理论基础、使用随机数(或更常见的伪随机数)解决实际问题的一种随机抽样统计方法,它常用于求解一些带有“随机”性质的实际生活问题和研究一些带有现条件下难以观测的物理量的实验。编程中采用的蒙特卡洛法就是指用随机数的方法。
计算方法:假设一个正方形,边长=2,则其内接圆的半径=1,则圆和正方形的面积比是: 因此,我们用蒙特卡洛法来获得面积比,让计算机产生很多的随机点,其中,都是[0,1]之间的随机数,可以用判断点否在圆内,则圆内的点数代表圆面积,总点数代表总面积,两者相除就是面积比。因此,。
数学原理:也称统计模拟方法,是一种计算机化的数学方法,简而言之就是,就是在求积分时,如果找不到被积函数的原函数,那么利用经典积分方法是得不到积分结果的,但是蒙特卡洛积分方法告诉我们,利用一个随机变量对被积函数进行采样,并将采样值进行一定的处理,那么当采样数量很高时,得到的结果可以很好的近似原积分的结果。
数学思想:在求圆周率的主要思想是把要求解的问题转化为求解某一随机事件的概率。当所求解的问题是某种随机事件出现的概率,或者是某个随机变量的期望值时,可通过某种“实验”的方法,以这一事件出现的概率估计估计这一随机事件的概率,或者得到这个随机变量的某些数字特征,并将其作为问题的解。