【问题标题】:Polynomial Root finding bisection多项式求根二分法
【发布时间】:2012-01-14 22:56:39
【问题描述】:

如果我使用二分法找到多项式的根,并且在某些情况下取决于多项式,根可能是负数,也可能是正数。

我知道我可以根据评估多项式的​​结果来确定根是负数还是正数……但是我不确定我会使用什么作为 x。

任何人都可以在这里提供任何见解吗?

【问题讨论】:

  • 这类问题听起来更适合 Math.SE,甚至 SciComp.SE。

标签: algorithm math bisection


【解决方案1】:

根可以是负数或正数这一事实与二分法无关。可以使用微积分中的intermediate value theorem 来证明根的存在。

所以你所要做的就是找到点x1x2,这样y(x1) 是负数,y(x2) 是正数。然后你从 IVT 中知道x1x2 之间有一个根。您可以通过在该间隔上进行二进制搜索来做到这一点。如果y(x3) = y((x1+x2)/2) 为负数,则在区间[x3,x2] 上重复二分搜索。否则,如果是肯定的,则搜索区间[x1,x3]

根是负数还是正数都没有关系。我不确定这是否能回答你的问题,但我希望能帮助你理解算法。

【讨论】:

  • 当然,不是所有的多项式都有(实)根;例如,1 + x^2。还有一些具有实根的多项式(例如 x^2)永远不会改变符号。
【解决方案2】:

许多根查找器允许用户提供一个或多个起点来开始搜索。这允许用户尝试“调整”结果以找到不同的根或允许查找器收敛到一个根。

如果允许用户提供起始值没有意义,您可以从探索几个点开始:

  • -1, 0, 1
  • -10, 0, 10
  • -100, 0, 100

如果输入是一个奇数多项式,这最终会找到一个合适的二分范围。如果输入是偶数多项式,您可能永远不会发现符号变化(考虑 f(x)=x^2 - 它永远不会是负数),所以准备好在经过一定的(可配置的?)探测后放弃。

我建议在这里将范围扩大 10 次方;由于二分法每次将范围减半,也许这太保守了。 (二等分的迭代需要两到三次迭代才能将范围缩小到下一个“更紧”的括号。)也许更好的是更大的跳跃:

  • -10, 0, 1
  • -1000, 0, 1000
  • -100000, 0, 100000

这将执行更少的探测,但需要更多的二等分。尝试一些多项式并跟踪执行时间,以找到两个建议的根。

【讨论】:

    【解决方案3】:

    您可能会发现这很有帮助。

    使用系统;

    命名空间 Bisection_Method

    {

    class Program
    
    {
    
        public double midPoint (double xl, double xu)
    
    {
    
        return (xl + xu) / 2;
    
    }
    
        public double function(double x)
    
        {
    
            return (x*x-2);
    
        }
    
        static void Main(string[] args)
    
        {
    
            Program root = new Program();
    
            double xm=0, xl=1, xu=2, check=0;
    
            for (int x = 0; x < 20; x++)
    
            {
    
                xm = (xl + xu) / 2;
    
                check = root.function(xl) * root.function(xm);
    
                if (check < 0)
    
                    xu = xm;
    
                else if (check > 0)
    
                    xl = xm;
    
                else if (check == 0)
    
                {
    
                    break;
    
                }
    
            }
    
            Console.WriteLine("The Approximate of the Root is {0}", xm);
    
        }
    
    }
    

    }

    http://mustafa.amnbytes.com/2012/09/bisection-method-program-in-c.html

    【讨论】:

    • 通常不鼓励仅链接的答案。
    • 仅链接的答案很脆弱,因为链接可能会断开。请详细说明链接。
    • 这里有完整的程序!
    【解决方案4】:

    为了使用二分算法,您首先需要找到一个包含根的区间。标准算法在Sturm's Theorem 中给出。

    但是,标准二分算法期望端点中函数值的符号不同。这可能是个问题。最简单的例子是 x^2,它具有 2 阶的单个根 0。由于 x^2 对所有非零 x 都是正数,因此您无法找到适合与二分算法一起使用的包含根的区间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 2017-01-08
      • 2015-12-12
      • 2017-04-19
      • 2015-03-21
      • 1970-01-01
      相关资源
      最近更新 更多