我很好奇我有这段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));
}
}
答案 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中,零处于最佳状态,这将导致程序进入无穷大。
所以首先你要检查你的f(x)是否为零,因为你可能找到了答案。另外转移到侧面,只要步长不是太大,如果有的话,它应该找到零。