- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
计算机算圆率
摘要:圆周率在数学学习和研究中是十分常用的常数。在中国,对圆周率的研究已有很长的历史,求圆周率的算法也是多种多样。随着电脑技术得发展,圆周率也越来越精确,而计算圆周率也成为检验电脑性能的重要方法。
关键词:圆周率 割圆法 蒙特卡罗法 Pascal语言
一.圆周率简介:
古今中外,许多人致力于圆周率的研究与计算。为了计算出圆周率的越来越好的近似值,一代代的数学家为这个神秘的数贡献了无数的时间与心血。十九世纪前,圆周率的计算进展相当缓慢,十九世纪后,计算圆周率的世界纪录频频创新。整个十九世纪,可以说是圆周率的手工计算量最大的世纪。进入二十世纪,随着计算机的发明,圆周率的计算有了突飞猛进。借助于超级计算机,人们已经得到了圆周率的2061亿位精度。现代科技领域使用的圆周率值,有十几位已经足够了。如果用35位精度的圆周率值,来计算一个能把太阳系包起来的一个圆的周长,误差还不到质子直径的百万分之一。现在的人计算圆周率, 多数是为了验证计算机的计算能力,还有,就是为了兴趣。
我将在本次研究性学习活动中,选取几种恰当的计算圆周率的算法,并结合课内所学知识,利用Pascal语言编写合适的程序,计算圆周率的大概值。
二.割圆法:
ABOθ
A
B
O
θ
如图,这是一个半径为1的圆和它的内接正n边形
的一部分。
易知:;则 。
当n趋于无穷大时,圆周长
所以,。
程序清单如下:
var n:integer;
pi:real;
begin
readln(n);
pi:=n*sin((3.1415926)/n);
writeln(pi:8:8);
end.
运行结果如下:
输入
10
20
50
100
1000
10000
输出
333333这种算法虽然简单,但是在运算过程中用到了π,且sin 的运算复杂,不是一个好算法。
hnOxn当然,除了用周长逼近圆外,用多边形的面积
hn
O
xn
如图,这是一个半径为1的圆和它的内接正n边形
弦心距为hn ; 多边形边长为xn ; 面积为Sn。
于是根据勾股定理可得:
,()
易知。不难发现,正2n边形的面积等于正n边形的面积加上n个
等腰三角形的面积,即
()
易知S6=,重复使用上述递推公式,可推出当n趋于无穷大时S的值。而此时多边形的面积S就接近圆的面积π,所以此时S=π。
程序清单如下:
var n,i:integer;
x,s,h:real;
begin
readln(n);
i:=6;
x:=1;
s:=6*sqrt(3)/4;
while i=n do begin
h:=sqrt(1-sqr(x/2));
s:=s+i*x*(1-h)/2;
x:=sqrt(sqr(x/2)+sqr(1-h));
i:=2*i;
end;
writeln(s:10:10);
end.
运行结果如下
输入
10
100
500
1000
5000
10000
20000
输出
3.0000
000000
3.1410
319509
3.1415
576079
3.1415
838921
3.1415
921060
3.1415
925167
3.1415
926194
这种方法运算简单,精度也还可以。但要进一步提升精度,这种方法就显得笨拙了。
三.蒙特卡罗法
蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。
它的基本思想是,当所求解问题是某种随机事件出现的概率,或者是某个随机变量的期望值时,通过某种“实验”的方法,以这种事件出现的频率估计这一随机事件的概率,或者得到这个随机变量的某些数字特征,并将其作为问题的解。
具体思路如下:
在如图边长为2的正方形中随意取一点,根据几何概型的知识可得P(点在圆内)=
利用计算机产生N个随机点,并计算落在圆内
的点个数N1,则当N趋于无穷大时,P(点在圆内)==
所以。
程序清单如下:
var a,b:real;
n,i,m:longint;
begin
readln(n);
randomize;
for i:=1 to n do begin
a:=random;
b:=random;
a:=2*(a-0.5);
b:=2*(b-0.5);
if (sqr(a)+sqr(b))1 then m:=m+1;
end;
writeln(4*
文档评论(0)