牛顿迭代法实现开根号

什么是牛顿迭代法

牛顿迭代法,顾名思义,是一种通过迭代向目标值逼近的方法,常用于数值分析当中(比如求非基本函数的根)。
牛顿迭代可以证明从定义域内的任何初始点开始迭代,最终一定可以收敛到目标值

牛顿迭代公式简单理解

将问题作如下简化:假设给定一个函数,求其零点
牛顿迭代法实现开根号_第1张图片
可以看到在图中,初始点横坐标为p0,从该点作切线与纵坐标相交于(p1, 0),下一步又取p1作为迭代的基本点,作切线得到p2。直观地看到随着迭代pn逐渐地逼近真正的零点p,假设在第n次迭代,pn恰好等于p,则pn+1也等于p,迭代的坐标不会再发生变化,此时就可以将pn作为结果返回了。
迭代过程的公式为
p n + 1 = p n − f ( p n ) f ′ ( p n ) p_{n+1} = p_n - \frac{f(p_n)}{f^{'}(p_n)} pn+1=pnf(pn)f(pn)
(斜率公式转换就可以了)

用牛顿迭代法实现开根号

其实就是自己实现sqrt()函数,如果从0开始遍历的话效率是比较低的,使用二分法也相对比较麻烦,最简单且高效的还是牛顿迭代法。
牛顿迭代法实现开根号_第2张图片
首先将问题转换,对A开根号相当于求函数 f ( x ) = x 2 − A f(x) = x^{2} - A f(x)=x2A的根。
对函数求导并套入公式中,接下来就可以愉快地等待迭代的结果啦。

代码:
ps: 采用的是整数除法,如果想要得到浮点数结果的话请自行修改数据类型。

int main() {
     
	int N;
	cin >> N;
	if (N <= 1) {
     
		cout << N << endl;
		return 0;
	}
    long long next = N;
    while(next > N / next) {
     
        next = (next + N / next) / 2;
    }
    cout << next << endl;
}

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