【问题标题】:Newton's method with recursion in JavaJava中带有递归的牛顿方法
【发布时间】:2015-08-22 10:45:34
【问题描述】:

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

我的第二个问题是,当我在代码的主要部分中将 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));
    }
}

【问题讨论】:

  • 能否提供样本输入和输出?
  • public static void main(String[] args) { double x=2;双 e=0.0000001;双a=1; System.out.println("X 的平方根是" + sqrtR(x,e,a)); } }
  • 我可能已经想通了,如何添加迭代次数?
  • 乘以 1.0 绝对没有效果。可以简化。
  • 你是什么意思,你不确定 1.0 “做什么”?代码试图将某个值乘以 1,这是没有意义的。你不明白哪一部分?有人可能认为他们有充分的理由这样做,但他们错了。

标签: java recursion newtons-method


【解决方案1】:

当 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) 在那个时候是否为零,因为你可能已经找到了答案。否则移到一边,只要步长不太大,如果有一个,它应该找到零。

【讨论】:

  • 好吧,所以我应该将 a 设置为 1 作为初始猜测值?
  • 取决于方程式。在某些情况下,函数没有零,在这种情况下,即使您移动 1 牛顿法也可能会将您推回到相同的最优值。将更详细地更新答案。
猜你喜欢
  • 2022-01-16
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多