计算平方根的方法(二分法、牛顿迭代)
1.二分法求平方根
算法过程描述:
Input: num, 精度e
Output:根号num
1.low = 0, high = num
2.若精度不达到要求(e0 > e)则继续;否则输出guess,程序结束
3.guess = (low + high) / 2
4.如果guess^2 > num,则high = guess; 重新计算精度e0 = guess^2 - num; 继续执行步骤2
5.如果guess^2 <= num,则low = guess; 重新计算精度e0 = num - guess^2; 继续执行步骤2
1 public double bi_sqrt(double num, double e) { 2 double low = 0; 3 double high = num; 4 double guess = num / 2; 5 double e0 = e+1;//为了有第一次循环;使e0 > e 6 int count = 0; 7 while (e0 > e) { 8 guess = (low + high) / 2; 9 if (guess * guess > num) { 10 high = guess; 11 e0 = guess*guess - num; 12 } else { 13 low = guess; 14 e0 = num - guess*guess; 15 } 16 count++; 17 System.out.println("times: " + count + " guess: " + guess); 18 } 19 return guess; 20 }
2. 牛顿迭代法
计算步骤:为了求根号a的近似值,先随便猜一个近似值x,然后不断令x等于x和a/x的平均数。
基本原理:f(x)=x^2-a 不断用(x,f(x))的切线来逼近方程x^2-a=0的根。根号a实际上就是x^2-a=0的一个正实根,这个函数的导数是2x。也就是说,函数上任一点(x,f(x))处的切线斜率是2x。那么,x-f(x)/(2x)就是一个比x更接近的近似值。代入f(x)=x^2-a得到x-(x^2-a)/(2x),也就是(x+a/x)/2。
1 public double newton_sqrt(double num, double e){ 2 double guess = num / 2; 3 double e0 = e + 1; 4 int count = 0; 5 while(e0 > e){ 6 guess = (guess + num / guess) / 2; 7 e0 = guess * guess - num; 8 count++; 9 System.out.println("times: " + count + " guess: " + guess); 10 } 11 return guess; 12 }
3.性能对比
1 public static void main(String[] args) { 2 System.out.println("二分法"); 3 bi_sqrt(10,0.00001); 4 System.out.println("牛顿迭代"); 5 newton_sqrt(10,0.00001); 6 }
1 二分法 2 times: 1 guess: 2.5 3 times: 2 guess: 1.25 4 times: 3 guess: 1.875 5 times: 4 guess: 2.1875 6 times: 5 guess: 2.34375 7 times: 6 guess: 2.265625 8 times: 7 guess: 2.2265625 9 times: 8 guess: 2.24609375 10 times: 9 guess: 2.236328125 11 times: 10 guess: 2.2314453125 12 times: 11 guess: 2.23388671875 13 times: 12 guess: 2.235107421875 14 times: 13 guess: 2.2357177734375 15 times: 14 guess: 2.23602294921875 16 times: 15 guess: 2.236175537109375 17 times: 16 guess: 2.2360992431640625 18 times: 17 guess: 2.2360610961914062 19 times: 18 guess: 2.2360801696777344 20 times: 19 guess: 2.2360706329345703 21 times: 20 guess: 2.2360658645629883 22 牛顿迭代 23 times: 1 guess: 2.25 24 times: 2 guess: 2.236111111111111 25 times: 3 guess: 2.2360679779158037
浙公网安备 33010602011771号