[关闭]
@867976167 2015-08-05T00:24:10.000000Z 字数 1295 阅读 2066

求平方根的方法

数学


牛顿迭代法

它是一种在实数域和复数域上近似求解方程的方法。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x)=0的根。
首先,选择一个接近函数f(x)零点的x0,计算相应的f(x0)和切线斜率f(x0)(这里f表示函数f的导数)。然后我们计算穿过点(x0,f(x0))并且斜率为f(x0)的直线和x轴的交点的x坐标,也就是求如下方程的解:

f(x0)=(x0x)f(x0)

我们将新求得的点的x坐标命名为x1,通常x1会比x0更接近方程f(x)=0的解。因此我们现在可以利用x1开始下一轮迭代。迭代公式可化简为如下所示:

xn+1=xnf(xn)f(xn)
已经证明,如果f是连续的,并且待求的零点x是孤立的,那么在零点x周围存在一个区域,只要初始值x0位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果f(x)不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。

根据上面我们可以把求平方根看做求下面公式

f(x)=x2N

求导得到:

f(x)=2x

可以推出下面公式

xn+1=xnf(xn)(2xn)

最后得到:

xn+1=12(xn+Nxn)

下面牛顿法求平方根代码:

  1. public int sqrt(int n) {
  2. int ret = 0;
  3. double x = n;
  4. double y = 1;
  5. double e = 0.0000000000000000001;
  6. while ((x - y) > e) {//判断是否相等,浮点数相等不能之间判断
  7. x = x + (y - x) / 2;//当x不等于y是,继续计算
  8. y = n / x;
  9. }
  10. return (int) y;
  11. }

二分搜索法

将x可以看做从1到x是递增符合二分的要求,首先计算mid2是否等于x,如果相等,返回;大于则在左边寻找;小于则在右边寻找。

  1. public int sqrt(int x) {
  2. int low = 0;
  3. int high = x;
  4. if(x<0){
  5. return -1;
  6. }
  7. if(1==x||x==0){
  8. return x;
  9. }
  10. int mid = low + (high - low) / 2;
  11. while (low <=high) {
  12. long res = (long)mid * mid;//由于int相乘可能导致溢出,使用long,使用double也行
  13. if (res > x) {
  14. high=mid-1;//不减1导致无限循环
  15. }else if(res<x){
  16. low=mid+1;//
  17. }else{
  18. return mid;
  19. }
  20. mid = low + (high - low) / 2;
  21. }
  22. return (long)mid*mid>x?mid-1:mid;
  23. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注