【问题标题】:Create a recursive function that solves this equation创建一个求解该方程的递归函数
【发布时间】:2018-12-12 20:27:13
【问题描述】:

创建一个递归函数,迭代求解这个方程: 2x3 – 10x +4 = 0。这是解决方案,我不明白为什么当我将值 1 和 0.40400000 传递给方法solve() 时,我会得到结果 2。它是如何工作的?

public static double solve(double x)
{
    double y = 2*x*x*x - 10*x + 4;
    if (y > -0.01 && y < 0.01)
        return x;
    else return solve(x + 0.001);
}

public static void main(String[] args) {
    System.out.println(solve(1));
    // 0.40400000   when starting from 0
    // 2             when starting from 1
}

【问题讨论】:

  • Create a recursive function that solves this equation iteratively 有点自相矛盾。我还建议通过调试器运行它以查看“幕后”发生了什么
  • @GBlodgett iterative 这个词是一个数学术语。
  • 这是一个公平的观察,@rustyx,但实际上通过递归计算算法实现迭代数学过程仍然没有多大意义。
  • 这感觉有些常量也需要双精度数。你可能会失去一些精度。正如建议的那样,调试器会告诉你发生了什么。

标签: java


【解决方案1】:

基本上,该函数的作用是:它只是以0.001 为步长测试x 的所有可能值,直到找到满足方程且误差小于0.01 的值。

函数或多或少等价于以下,可能更容易理解:

public static double solve(double x) {
    while (true) {                      // repeat...
        double y = 2*x*x*x - 10*x + 4;  // calculate y
        if (-0.01 < y && y < 0.01)      // y close to 0 ?
            return x;                   // "good enough" solution found
        x += 0.001;                     // try next value for x
    }
}

您的方程式有多个解(请参阅Wolfram Alpha 进行可视化),因此根据起点,可能会有不同的解。您应该从例如开始获得另一种解决方案x = -3.

但是,该功能存在几个问题。首先,如果您传递的x 大于解方程的最大x,它将无限运行,因此为x 提供上限可能是合理的。但如果坡度非常陡峭,它也可能会错过解决方案,因此它会一步从&lt; -0.01 变为&gt; +0.01。更好的方法可能是只记住y 的符号,并查看它在哪一步从正变为负或反之亦然,或者在最小值或最大值为 0 的情况下将两者结合起来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 2019-10-18
    • 2012-12-08
    • 1970-01-01
    • 2019-05-27
    • 2011-11-13
    相关资源
    最近更新 更多