||
计算一个无理数到指定精度,是一个比较有趣而又有实际价值的问题。说它有趣,是因为这里面的方法很多,和很多数学问题都有联系,而说它有实际价值,是因为一个无理数,归根到底还是要变成小数才方便我们认识其大小。鉴于已经有很多文章谈论过圆周率的计算方法了,这里我谈谈sqr(2)的计算。当然,这其中有的方法和计算圆周率一样,而有的就不一样了。
最直接的计算sqr(2)的方法,就是手动开平方。我现在还记得小时候我父亲教我的方法,是用竖式,以小数点为中心,两位分一节,从高位开始计算:
先看最高一节是2,只有1的平方小于2,所以这一位为1(假如有好几个数字的平方小于最高一节,则取最大的那个),原来的2减去1的平方还剩下1,加上后面的一节是为100;
把第一步得到的根——1——变成2倍得到2,需要找到这样一个最大的一位数:这个一位数加20以后乘以它自身不能超过上一步得到的100(这里的20是上一步得到的1乘以20倍),显然应该是4;
接下来是用第一步最后得到的100减去(20+4)×4,得到4,再和下一位的00结合成为400,现在得到的方根是1.4,注意它的2倍是28(忽略小数点);
再继续找到一个最大的一位数,使之小于280加上它之后乘以它自身,显然这个一位数只能是1……以后依次类推。
(图中红线所标数字为开方结果)
据说,可以用这种计算方法证明sqr(2)是无限不循环小数,但是我还不会,希望有人能够帮我。
前面方法的原理是完全平方公式。如果换个角度看sqr(2),显然这是x2-2=0(下文设f(x)=x2-2)的一个解。因此我们可以用求方程近似解的方法计算。一般的高数教材里,往往有计算方程近似解的方法,比如弦线法、牛顿法等等,这里我用二分法进行计算。这种方法的要点在于,方程f(x)=0在初始区间里有且只有一个根,而且f(x)在区间两端的取值异号,又在区间内连续。显然这些条件并不苛刻。
下面我们开始计算:
我们先给一个区间[1,2],取中间值x=1.5,f(x)与f(1)异号,因此我们第二次得到的区间是[1,1.5];
然后再把中间值1.25代入f(x),发现与f(1.5)异号,于是得到新的区间[1.25,1.5];
以后依次类推。
比较以上两种方法,可以看出,方法一适用性比较窄,只能对数字开平方,但是计算比较快,每一轮计算精度提高10倍,或者说误差降低到10%,而第二种方法适用性要广泛得多,但是收敛慢一些,每次计算误差只能降低一半。抛开这一点不论,以上两种方法的共同基础都是实数理论中赫赫有名的“区间套”定理。关于这个定理的详细介绍,就不在本文范围以内了。
第三种方法是泰勒级数法,把(x+1)a在原点附近展开就可以得到一个幂级数:
将a=1/2、x=1代入上式,取前两项、前三项,前四项……其值分别为1.5、1.375、1.4375……
这个式子在a=1/2时的收敛半径是[-1,1],刚好在x=1处收敛,因此可以直接计算。但如果不收敛呢?我们计算sqr(3)的话就会遇到这个问题。解决方法也容易,那就是把3变成4乘以0.75,然后4可以挪到根号外面变成2,这样根号里的部分就剩下0.75,也就是泰勒级数里的x等于-0.25。事实上,这个技巧对于计算sqr(2)也有帮助,因为这样可以使x的绝对值小一些,于是在计算级数时收敛会快一些。
泰勒级数的方法,不但可以计算sqr(2)这样的所谓代数数,还能够计算e、π这样的非代数数,即超越数。所谓代数数,就是可以成为有理系数多项式方程根的数,而超越数则相反。但是泰勒级数法的麻烦之处在于要计算各阶导数,因此不像前面方法那样可以在初等数学范围内解决。
本文给出的最后一种方法是所谓的蒙特卡洛方法。如果你读过如何计算圆周率的文章就应该听说过这种方法。在计算圆周率时这种方法是这样的:画出单位圆,然后向包括这个单位圆的矩形里随机找一些点,当然越多越好,则这些点在圆内的数量比上全体随机点的数量就近似等于圆面积和矩形面积的比,而矩形面积是简单的。这种方法移植到计算sqr(2)就是,随机找一些在(0,2)中间的点,计算一下这些点的平方,其中小于2的点数比全体点数近似等于sqr(2)比2。如果说,计算圆周率用的是二维的蒙特卡洛方法,则计算sqr(2)则是一维版本。这种一方法一是要建立一个恰当的几何模型,二是误差的可控性比较差,毕竟是用到了随机性。
以上方法都很容易编写出计算机程序,这个任务就留给读者了。
ps:话说本来很想写一下用连分数计算sqr(2)的方法,但是写的过程中发现需要费很多笔墨,而且我也未必能说得很明白,只好付之阙如了,有兴趣者可以自行搜索这方面的内容。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-26 21:26
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社