利用二分法和牛顿法开根号

https://www.cnblogs.com/wangkundentisy/p/8118007.html

问题描述

给定一个数,如何求它的平方根(不能使用内置函数,如sqrt()函数)。


二分法

这是比较容易想到的一种方法。通过比较中间值与最终值的大小来改变中间值,最终在满足某个精度的情况下返回这个中间值作为最终结果。代码如下:

#include
#include
using namespace std;
double MySqrt(double n)
{
    double _max = n; //此处一定为浮点数,不要用整数
    double _min = 0.0;
    double p = 1e-5; //此处为精度,当满足该精度时,返回该近似值
    double  mid = (_max + _min) / 2.0;
    while(fabs(mid * mid - n) > p)//此处是浮点数之差的绝对值与精度进行比较
    {
        if(mid * mid < n)
            _min = mid;
        else if(mid * mid > n)
            _max = mid;
        else
            return mid;
        mid = (_max + _min) / 2.0;
    }
    return mid;
}
int main()
{
    cout<80)<

牛顿法

牛顿迭代法(Newton’s method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根。另外该方法广泛用于计算机编程中。

r r f(x)=0 f ( x ) = 0 的根,选取 x0 x 0 作为r初始近似值,过点 (x0,f(x0)) ( x 0 , f ( x 0 ) ) 做曲线 y=f(x) y = f ( x ) 的切线 L L L L 的方程为 y=f(x0)+f(x0)(xx0) y = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) ,求出 L L x x 轴交点的横坐标 x1=x0f(x0)/f(x0) x 1 = x 0 − f ( x 0 ) / f ′ ( x 0 ) ,称 x1 x 1 r r 的一次近似值。

过点 (x1,f(x1)) ( x 1 , f ( x 1 ) ) 做曲线 y=f(x) y = f ( x ) 的切线,并求该切线与 x x 轴交点的横坐标 x2=x1f(x1)/f(x1) x 2 = x 1 − f ( x 1 ) / f ′ ( x 1 ) ,称 x2 x 2 r r 的二次近似值。重复以上过程,得 r r 的近似值序列,其中 x(n+1)=x(n)f(x(n))/f(x(n)) x ( n + 1 ) = x ( n ) - f ( x ( n ) ) / f ′ ( x ( n ) ) ,称为 r r n+1 n + 1 次近似值,上式称为牛顿迭代公式。

而开根号的问题可以看作求解 f(x)=x2a=0 f ( x ) = x 2 − a = 0 的根。

(1)在曲线 f(x)=x2a f ( x ) = x 2 − a 上任取一点 (x0,f(x0)) ( x 0 , f ( x 0 ) ) x00 x 0 ≠ 0 ,该点的切线方程为:

f(xn+1)f(xn)=f(xn)(xn+1xn) f ( x n + 1 ) − f ( x n ) = f ′ ( x n ) ( x n + 1 − x n )

(2)该切线与x轴的交点为:
xn+1=xnf(xn)f(xn)=(xn+axn)2 x n + 1 = x n − f ( x n ) f ′ ( x n ) = ( x n + a x n ) 2

#include
#include
using namespace std;
double MySqrt(double n)
{
    double x = 1.0;//设置初值
    double p = 1e-5;//设置精度
    while(fabs(x*x - n) > p)
    {
        x = (x + n / x) / 2.0;
    }
    return x;
}
int main()
{
    cout<82)<

你可能感兴趣的:(算法)