二分法、牛顿迭代法求sqrt()

原创 2013年12月04日 16:10:28

给定一个正数a,不用库函数求其平方根。

       设其平方根为x,则有x2=a,即x2-a=0。设函数f(x)= x2-a,则可得图示红色的函数曲线。在曲线上任取一点(x0,f(x0)),其中x0≠0那么曲线上该点的切线方程为

                             (1-1)

       求该切线与x轴的交点得

                            (1-2)

 

      因为1-2式中x0作为分母,所以在之前限定了一下初始值不要选0。那么得到的这个与x轴的交点其实是最终要求得的x的一次逼近,我们再以这个x基准继续迭代就可以求得更逼近的x,至于逼近到什么时候才算完,这个取决于你自己设定的精度。整个过程的迭代只需要几步就可以求得最终的结果。


double nt_sqrt(double n)
{
	double x = 1.0;
	while(abs(x*x-n) > 1e-5)
	    x = (x+n/x)/2;
	return x;
}

http://blog.csdn.net/wumuzi520/article/details/7026808

惊人的代码(求1/sqrt())http://www.cnblogs.com/pkuoliver/archive/2010/10/06/1844725.html



二分法:

int sqrt(int x)
{
    int left = 1, right = x / 2;
    int mid;
    int last_mid; //记录最近一次mid
    if (x < 2) return x;
    while(left <= right)
    {
        mid = left + (right - left) / 2;
        if(x / mid > mid)   // 不要用x > mid * mid,会溢出
        {
            left = mid + 1;
            last_mid = mid;
        }
        else if(x / mid < mid)
        {
            right = mid - 1;
        }
        else
        {
            return mid;
        }
    }
    return last_mid;
}


double sqrt(double n) //用二分法
{
    if(abs(n-(1e-5))<0) //小于0的按照你需要的处理
        return n;
    double mid,last;
    double low,up;
    low=0,up=n;
    mid=(low+up)/2;
    do
    {
        if(mid*mid>n)
            up=mid;
        else
            low=mid;
        last=mid;
        mid=(up+low)/2;
    }
    while(abs(mid-last) > eps); //精度控制
    return mid;
}




巧用二分法实现数学开方(sqrt)运算

二分查找时间复杂度计算与分析implement int sqrt(int x). Compute and return the square root of x.public int sqrt(in...
  • u011489043
  • u011489043
  • 2017年04月11日 20:07
  • 1182

用牛顿迭代法和二分法求方程的根【C语言】

1.用牛顿迭代法求该方程在1.5附近的根:2X^3-4X^2+3X-6=0 #include #include double func(double x) //函数 {return 2*x*x*...
  • huixingshao
  • huixingshao
  • 2016年04月06日 13:24
  • 2865

二分法和牛顿迭代法求平方根(Python实现)

求一个数的平方根函数sqrt(int num) ,在大多数语言中都提供实现。那么要求一个数的平方根,是怎么实现的呢? 实际上求平方根的算法方法主要有两种:二分法(binary search)和牛顿迭代...
  • ycf74514
  • ycf74514
  • 2015年10月09日 10:22
  • 3970

C语言之基本算法25—牛顿迭代法求方程近似根

//牛顿迭代法! /* ============================================================ 题目:用牛顿迭代法求解3*x*x*x-2*x*x...
  • LZX19901012
  • LZX19901012
  • 2015年07月10日 12:07
  • 1709

求解一元多次方程的两种方法:牛顿迭代法和二分法

求解方程x*x*x-2*x-1=0,C语言实现 一:牛顿迭代法,牛顿迭代法是从泰勒公式中取前两项构成线性近似方程,从x0开始,一步一步接近近似解,直到误差在限定范围内。 //牛顿迭代法求求解方程的...
  • WuyZhen_CSDN
  • WuyZhen_CSDN
  • 2015年01月27日 20:33
  • 1682

牛顿迭代法实现平方根函数sqrt

转自利用牛顿迭代法自己写平方根函数sqrt  给定一个正数a,不用库函数求其平方根。        设其平方根为x,则有x2=a,即x2-a=0。设函数f(x)= x2-a...
  • wdjhzw
  • wdjhzw
  • 2014年11月06日 16:49
  • 1334

C语言之基本算法11—牛顿迭代法求平方根

//迭代法 /* ================================================================== 题目:牛顿迭代法求a的平方根!迭代公式:Xn+1...
  • LZX19901012
  • LZX19901012
  • 2015年07月07日 12:57
  • 2277

leetcode:Sqrt(x) 牛顿迭代法求整数开方

牛顿迭代法求Sqrt(x)    为了方便理解,就先以本题为例:    计算x2 = n的解,令f(x)=x2-n,相当于求解f(x)=0的解,如左图所示。    首先取x0,如果x...
  • newfelen
  • newfelen
  • 2014年04月10日 15:46
  • 851

找极值点求最大值 最小值 ( 牛顿迭代法 和 二分)

数论
  • u013514722
  • u013514722
  • 2014年12月02日 15:12
  • 2973

二分法求解平方根的“陷阱”

对于一个整数求解其平方根可以使用“二分法”和“牛顿法”。 所谓“二分法”就是不断地缩小平方根所在的范围,知道收敛到一个数。例如求解数k的平方根t,首先设置t的范围为[left, right](其...
  • yangfeisc
  • yangfeisc
  • 2014年09月29日 22:58
  • 2924
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二分法、牛顿迭代法求sqrt()
举报原因:
原因补充:

(最多只允许输入30个字)