有人可以解释一下,为什么我们需要max和min之间的差异小于误差(三次方程的根)?它背后的逻辑是什么?为什么我们需要返回min?
以下是代码:
#include <stdio.h>
#include <stdlib.h>
double func(double x)
{
return x * x * x + 2 * x * x - 2;
}
double zeroFinder(double min, double max, double error)
{
if ((max - min) < error)
{
return min;
}
double x = (max + min) / 2;
if (func(x) < 0)
{
min = x;
}
else
{
max = x;
}
return zeroFinder(min, max, error);
}
int main(void)
{
zeroFinder(0.0, 1.0, 0.01);
zeroFinder(0.0, 1.0, 0.001);
zeroFinder(0.0, 1.0, 0.000001);
zeroFinder(0.0, 1.0, 0.0000000001);
return 0;
}
答案 0 :(得分:2)
该算法正在实现称为Bisection Method的内容。我们的想法是从一个区间开始(在您的情况下由max
和min
分隔),评估中点的值,然后适当地缩短区间。
这就像在实线上进行二分查找一样。然而,由于我们试图找到实际值,因此该函数可能不会在有限数量的迭代中终止于实际值(例如,当答案是sqrt(2)
时)。此外,由于该方法计算浮点变量,通常您将无法获得精确值。然而,迭代算法应该在有限的迭代集中终止。因此,当间隔变得足够小时(即abs(max - min) < <some error value>
时,我们可以让函数终止。这意味着获得的答案在正确答案的some error value
范围内。
正如@Elyasin在评论中提到的那样,代码可以返回max
,min
或其间的任何值作为答案。关于开放和关闭间隔可能有一些考虑因素,因此返回(max + min) / 2.0
也是一个安全的选择。
答案 1 :(得分:0)
使用递归函数,你必须有一些基本情况,可以在没有递归的情况下找到答案,否则递归永远不会停止。
编写代码的人选择说当x坐标之间的间隙小于指定的误差时,你就足够接近根。当这两个值足够接近时,返回哪一个并不重要,但是(max + min) / 2.0
可能会更好。但是某些值必须返回为&#39; x坐标足够接近根&#39;。
请注意,代码不安全。如果min
和max
评估为负数,则可能不会收敛于解决方案;如果它们都评估为正数,则可能不会收敛于解决方案。
答案 2 :(得分:0)
eps是错误限制,将被接受。 在许多在线法官(OJ)中,您会看到小于10 ^ -6,10 ^ -8的相对误差将被忽略。 假设eps = 0.000001,所以如果(max-min)的值小于eps,则意味着 我们达到了预期的结果...