C++ 如何求方程的最大负根

C++ 如何求方程的最大负根,c++,C++,我需要写一个函数来求方程的最大负根。然后包括这个模块,用于精确的f(x)=x^5+3x^3+x^2+1,但不仅限于此 因此,有两个问题: 1) 我使用了od二分法,所以我不明白我需要添加什么来让我的函数找到最大负x,即使我们有区间(a,0) 2) 我没有infinum,所以我的程序可能永远不会结束,我只有上确界x=0,因为我们只处理负x,但是如何找出确切的间隔呢?我认为它一定与衍生品有关,但如何 这是我的函数,func是main.cpp中函数的指针 const double epsilon=

我需要写一个函数来求方程的最大负根。然后包括这个模块,用于精确的f(x)=x^5+3x^3+x^2+1,但不仅限于此

因此,有两个问题:

  • 1) 我使用了od二分法,所以我不明白我需要添加什么来让我的函数找到最大负x,即使我们有区间(a,0)
  • 2) 我没有infinum,所以我的程序可能永远不会结束,我只有上确界x=0,因为我们只处理负x,但是如何找出确切的间隔呢?我认为它一定与衍生品有关,但如何
这是我的函数,func是main.cpp中函数的指针

const double epsilon=0.1;
double dichotomy(double infinum, double supremum,  double(*func)(double)) {
  double x;
  while (supremum - infinum > epsilon) {
    x = (infinum + supremum) / 2;
    if (func(supremum) * func(x) < 0)
      infinum = x;
    else
      supremum = x;
  }
  return (infinum + supremum) / 2;
}
常数双ε=0.1;
双二分法(双内界、双上界、双(*func)(双)){
双x;
while(上确界-下确界>ε){
x=(中界+上界)/2;
if(func(上确界)*func(x)<0)
中缀=x;
其他的
上确界=x;
}
返回值(内界+上界)/2;
}

对于任意函数,没有找到最大负实根的好方法。您的代码似乎使用了二进制搜索的一些变体,尽管我不太确定
func(supremum)*func(x)
应该代表什么。通常,即使对于您给出的示例
f(x)=x^5+3x^3+x^2+1
,二进制搜索也不能保证找到最大负实根。这是因为函数不是单调的。我不相信你能修改二进制搜索来处理任意函数。但是,如果您可以将函数集限制为多项式,则有一些算法可以满足您的需要。例如,请参阅。此外,你还可以尝试用三次搜索等方式修改二进制搜索,以处理所有类型的多项式。

是的,减去它,但我没有发现类似的问题,也没有找到没有给定区间a的解,为什么你想知道给出这样一个不完整的问题(与提供a相反)会被否决?@πάνταῥεῖ 这里有什么不清楚的?我说了任务,说了我面临的麻烦,并提供了我必须开发的函数代码,以找到最大负根。我还需要找出准确的工作时间间隔。我总是觉得自己是被嘲笑的对象,但没有人会问我简单的问题,只是减去它。如果我们手动选择间隔,有没有简单的方法来解决这个问题?我可以想到一个算法。给定一个区间,在该区间内取尽可能多的随机点。对于每个点,沿函数从该点“下降”,直到触及根。也就是说,对于每个点,获取该点处函数的导数,并根据其符号向左或向右移动搜索。在每个点上执行此操作,直到找到根为止。然后,你可以简单地取你找到的负根的最大值。要获得函数某一点的导数,请在该点周围的小间隔处对函数求值。