创建一个递归函数来求解此方程



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

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
}

基本上,函数所做的是:它只是在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开始得到另一个解决方案。

然而,该功能存在一些问题。首先,如果你通过一个大于求解方程的最大xx,它将无限运行,因此也可以为x提供一个上限。但如果斜率非常陡峭,它也可能会错过一个解决方案,因此它可以一步从< -0.01> +0.01。一个更好的方法可能只是记住y的符号,看看它在哪一步从正变为负,反之亦然,或者在最小值或最大值为0的情况下,两者的组合。

最新更新