在中国古代,魏晋时期的数学家刘徽于公元263年就提出了“割圆术”的方法,来计算圆的周长,进而可以计算出圆周率。
其实,割圆术的原理并不复杂,它通过圆内接正多边形细割圆周,从而使正多边形的周长无限接近圆周长,进而来求得较为精确的圆周率。
割圆术从圆内接六边形出发,每一次倍增多边形的边数,并计算新的多边形边长。每一次的计算如下图所示(以六边形为例):
设圆半径为r,已知圆内接正n边形的边长为a,即AB=a。如果取正n边形每两个相邻顶点间的弧的中点,和已有的顶点一起,依次相连,就可以获得圆内接正2n边形。图中C即为一个新增的顶点,则正2n边形的边长就是AC的长度。由于△OAB和△CAB均为等腰三角形,所以AD=BD=a/2,OC⊥AB于D,所以△ADO和△ADC均为直角三角形,利用勾股定理,OD2=OA2-AD2=r2-(a/2)2,可以求出OD,而CD=OC-OD=r-OD,再根据AC2=AD2+CD2=CD2+(a/2)2即可求出AC的长度,以此循环,就可以使用割圆术估算圆的周长,进而计算出圆周率π。
在割圆术的处理中,圆的半径是不变的,为了简便可以设为1,而正六边形的边长和外接圆半径是一样的也是1,根据上面的思路,在esProc中可以通过循环计算2n边形的周长,从而计算出π。以循环10次为例,如下图所示:
A | B | C | D | |
1 | 6 | /sides | 1 | /sides length |
2 | for 10 | =C1/2 | /AD | |
3 | =sqrt(1-B2*B2) | /OD | ||
4 | =1-B3 | /CD | ||
5 | >C1=sqrt(B2*B2+B4*B4) | /AC,new side length | ||
6 | >A1=A1*2 | /new sides | ||
7 | =A1*C1 | /circumference | ||
8 | =A7/2 | /π |
在程序中,用A1存储多边形的边数,C1存储多边形边长,由A2循环计算,以循环10次为例,在每次循环中,通过计算重新设定多边形的边数和边长。循环结束后,在A7中通过计算多边形的周长来拟合圆周长,在A8中计算π。
A8中的计算结尾为: