牛顿在Java中递归的方法

时间:2015-06-08 04:14:45

标签: java recursion newtons-method

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

我的第二个问题是当我将E变量声明为0.0000001和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));
    }
}

1 个答案:

答案 0 :(得分:3)

当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. 你的等式只有一个零。
  3. 在案例1中,由于没有零,您将陷入最佳状态。在情况2中,零处于最佳状态,这将导致程序进入无穷大。

    所以首先你要检查你的f(x)是否为零,因为你可能找到了答案。另外转移到侧面,只要步长不是太大,如果有的话,它应该找到零。