Java 递归牛顿法

Newton's method with recursion in Java

我很好奇我有这段 Java 代码。 我的问题是 return 1.0 * 递归调用的原因是什么? 在代码的其他部分

我的第二个问题是,当我在代码的主要部分将 E 变量声明为 0.0000001 AND A 时,X 变量为双精度,我将 A 设为 0 并进入无限循环。我该如何解决?

public static double sqrtR(long x, double e, double a) {
    if (Math.abs(a * a - x) <= e) {
        return a;
    } else {
        a = (a * a + x) / (2 * a);
        return 1.0 * (sqrtR(x, e, a));
    }
}

当 a 等于 0 时,它会导致 f'(x) = 2a 变为 0,在这种情况下,您在此步骤中除以 0:

a = (a * a + x) / (2 * a);

当f'(x)变为0时,表示你处于最小值或最大值:http://en.wikipedia.org/wiki/Newton%27s_method

将值移动 1 可以根据等式起作用。在某些情况下,函数没有零,在这种情况下,即使您移动 1 牛顿法也可能将您推回到相同的最佳状态。在其他情况下,函数可能有许多不同的最优值,即使存在某些三角函数等解,牛顿法也很容易卡住。

在您的情况下,它应该可以工作,除非以下两种情况之一为真:

  1. 你的方程没有零点。
  2. 你的等式正好有一个零。

在情况 1 中,您将陷入最佳状态,因为没有零。在情况 2 中,零处于最佳状态,这将导致程序趋于无穷大。

所以首先你要检查你的 f(x) 在那个时候是否为零,因为你可能已经找到了答案。否则移到一边,只要步长不是太大,如果有一个,它应该找到零。