ID507306952

扯闲 有高中理科学习中的亲身感受和一些实用算法 还有漫无目的的小程序等

用有理数逼近平方根

尝试用有理数逼近平方根,且这个方法同样适用于比较精确地笔算平方根

原理:完全平方公式 A=(√A)^2=(x+m)^2=x^2+2mx+m^2

其中A是被开方数,x是我们的估测值,m是误差。

当m很小的时候,可以认为m^2→0,此时m=(A-x^2)/2x

故更加精确的数值x'=x+m=x+(A-x^2)/2x=(A/x+x)/2 即为该方法的原理。

可以证明,在保留一定位数小数的情况下,这种方法获得的数字的稳定值永远大于或等于准确值,但是仍然是相当精确的值。

利用上述公式多次循环可以得到相当准确的值。

这里用Flash AS3写了一个小程序 可以用来模拟该过程

function cu(A:Number,m:String,uu:Number):void{

trace1("R  : "+Math.sqrt(A));

var f:Array=m.split("/");

var f1:Number=Number(f[0]); 

var f2:Number=Number(f[1]);

var t1:Number,t2:Number;

for(var i:Number=1;i<=uu;i++){

trace1((i<10?"0"+i:i)+": "+f1/f2);

trace1(" ("+f1+"/"+f2+")");

t2=2*f1*f2;

t1=f1*f1+f2*f2*A;

f1=t1;

f2=t2;

}


}

function trace1(s:String):void{

put.appendText(s);

put.appendText("\n");

}

cal.addEventListener("click",function(i:*):void{

put.text="";

cu(Number(q0.text),q1.text,int(q2.text));

});

元件摆放如下
程序运行的结果如下(初始值取3/2)


从而可以知道665857/470832已经是较为精确的值了(12位有效数字)。

以下是一些已经获得的结果(就是使用这个程序获得的)

√2 低精度近似665857/470832(12位有效数字)
 高精度近似768398401/543339720 (至少17位有效数字)
≈1.4142135623730951

√3低精度近似3650401/2107560(12位有效数字)
 高精度近似708158977/408855776  (至少17位有效数字)
≈1.7320508075688772

√5低精度近似4870847/2178309(12位有效数字)  51841/23184 (10位有效数字)
 高精度近似5374978561/2403763488  (至少15位有效数字)
≈2.23606797749979

√7低精度近似62921681/23782160(12位有效数字)
 高精度近似2081028097/786554688  (至少17位有效数字)
≈2.6457513110645907

√11低精度近似6874607/2072772(11位有效数字) 79201/23880(10位有效数字)
 高精度近似12545596801/3782639760 (至少14位有效数字)
≈3.3166247903554

_______________________________splitting_______________________________

以下谈一谈关于这个思路在笔算根号中的运用

1.初始值建议取比较逼近的值,但以简单为宜,如√2取3/2,√3取5/3。

2.保留分数直到第3次计算,第3次计算取6位小数(如上图04);精度不高的场合只需计算2次取2位小数(如上图03)。


大概就是这些,欢迎交流想法

评论

热度(6)