【问题标题】:Finding roots of a function with binary search and recursion使用二分查找和递归查找函数的根
【发布时间】:2016-08-09 12:09:21
【问题描述】:

请有人解释一下,为什么我们需要 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;
} 

【问题讨论】:

标签: c algorithm binary-search


【解决方案1】:

该算法正在实现称为Bisection Method 的东西。这个想法是从一个间隔开始(在你的情况下由maxmin 分隔),评估中点的值,然后适当地缩短间隔。

这与实线中的二分查找完全一样。然而,由于我们试图找到一个实数值,函数可能不会在有限次数的迭代中终止于实数值(例如,当答案是 sqrt(2) 时)。此外,由于该方法计算浮点变量,通常您不会得到确切的值。然而,迭代算法应该在有限的迭代集合中终止。因此,当间隔变得足够小时(即abs(max - min) &lt; &lt;some error value&gt;时,我们可以让函数终止。意思是得到的答案在正确答案的some error value之内。

正如@Elyasin 在 cmets 中提到的,代码可以返回 maxmin 或介于两者之间的任何值作为答案。可能有一些关于开放和封闭区间的考虑,因此返回(max + min) / 2.0 也是一个安全的选择。

【讨论】:

    【解决方案2】:

    使用递归函数,您必须有一些基本情况,无需递归即可找到答案,否则递归永远不会停止。

    编写代码的人选择说,当 x 坐标之间的差距小于指定的误差时,您离根足够近。当这两个值足够接近时,返回哪一个实际上并不重要,但也许(max + min) / 2.0 会更好。但是必须返回一些值作为“离根足够近的 x 坐标”。

    请注意,代码不安全。如果minmax 都计算为负数,它可能不会收敛到一个解决方案;如果它们都评估为正数,则可能不会收敛到解决方案。

    【讨论】:

    • 我给你一个积分,因为我是这个网站的新手,我没有足够的声誉积分。无论如何,谢谢!
    【解决方案3】:

    eps 是将被接受的错误限制。 在许多在线裁判(OJ)中,您会看到小于 10^-6,10^-8 的相对误差将被忽略。 假设 eps =0.000001 所以如果 (max-min) 的值小于 eps 这意味着 我们达到了我们想要的结果...

    【讨论】:

      猜你喜欢
      • 2020-11-13
      • 2011-02-08
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 2021-04-08
      • 1970-01-01
      • 2012-12-19
      相关资源
      最近更新 更多