使用牛顿迭代法实现开*方
前言
牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上*似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的*似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附*具有*方收敛,而且该法还可以用来求方程的重根、复根。另外该方法广泛用于计算机编程中。
原理
比如求*方根:,可以转为求这个方程的根
已知曲线方程,我们在点做切线,求:
容易得出,点的切线方程为: 。
要求,即相当于求 的解,即 :。
将f(x)=x2-c,f`(x)=2x代入方程得到x=x-(x2-c)/2x=(x+c/x)/2
实现
public class Client {
public static void main(String[] args) {
System.out.println(Math.sqrt(10));
System.out.println(sqrt(10));
System.out.println(Math.sqrt(-10));
System.out.println(sqrt(-10));
System.out.println(Math.sqrt(0.000));
System.out.println(sqrt(0));
System.out.println(Math.sqrt(0.5));
System.out.println(sqrt(0.5));
}
private static double sqrt(double n) {
if (Double.isNaN(n) || n < 0) {
return Double.NaN;
}
if (n == 0) {
return n;
}
double k = 1.0;
while (Math.abs(k * k - n) > 1e-5) { //精度自己控制
k = (k + n / k) / 2;
}
return k;
}
}
得到的结果和java内置的sqrt方法结果一致。