什么是牛顿迭代法
牛顿迭代法,顾名思义,是一种通过迭代向目标值逼近的方法,常用于数值分析当中(比如求非基本函数的根)。
牛顿迭代可以证明从定义域内的任何初始点开始迭代,最终一定可以收敛到目标值。
牛顿迭代公式简单理解
将问题作如下简化:假设给定一个函数,求其零点。
可以看到在图中,初始点横坐标为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=pn−f′(pn)f(pn)
(斜率公式转换就可以了)
用牛顿迭代法实现开根号
其实就是自己实现sqrt()函数,如果从0开始遍历的话效率是比较低的,使用二分法也相对比较麻烦,最简单且高效的还是牛顿迭代法。
首先将问题转换,对A开根号相当于求函数
f
(
x
)
=
x
2
−
A
f(x) = x^{2} - A
f(x)=x2−A的根。
对函数求导并套入公式中,接下来就可以愉快地等待迭代的结果啦。
代码:
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;
}