问题
算法一书中,提到求平方根的方法sqrt
用到了牛顿迭代法
牛顿迭代法
很多方程在求解根时比较困难(或者说求解精确根比较款那),并且我们经常会遇到求平方根无法直接得出结果的时候,牛顿迭代法就发挥了作用,牛顿迭代法的思想主要是利用切线方程无限逼近的特点求得结果,用于获取近似根。假设有f(x)=(x-2)^2
,用牛顿迭代法求根((x-2)^2=0
)过程如下:
选取一点做切线,然后作垂线交曲线于另一点,继续以另一点作为切点做切线,这样无限逼近即可求得函数的根。
用牛顿迭代法求平方根
可以利用牛顿迭代法求得数的开方,假设有数c,需要求得根号c。假设结果为result,则有
result^2 = c
,即求函数f(x) = result^2-c
的根
代码实现牛顿迭代法
public static double sqrt(double c){
if(c<0) return Double.NaN;
// 从该值开始迭代
double result = c;
// 定义一个极小值误差,当结果小于该误差时可以返回结果
double err = 1e-15;
// 函数为fx = x^2 - c 当小于一个极小值时可以认为是近似根,否则继续做切线
while (Math.abs(Math.pow(result,2)-c)>err){
result = (c/result+result)/2.0;
}
return result;
}
分析
函数为fx = x^2 - c
,导数方程为f = 2xn
,则过点(xn,xn^2-c)
的切线方程为:y=2xn(x-xn)+xn^2-c
,固切线与x轴交点为(xn+c/xn)/2
,即对应代码中的result = (c/result+result)/2.0;