多项式根发现二分法

时间:2012-01-14 22:56:40

标签: algorithm math bisection

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

据我了解,根据评估多项式的​​结果,我可以确定根是否为负数或正数...但是我不确定我将使用什么作为x。

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

4 个答案:

答案 0 :(得分:2)

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

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

根是负面还是正面无关紧要。我不确定这是否能回答你的问题,但我希望这有助于你理解算法。

答案 1 :(得分:0)

许多寻根者允许用户提供一个或多个起点来开始搜索。这允许用户尝试“摆弄”结果以找到不同的根或允许取景器收敛到根。

如果允许用户提供起始值没有意义,您可以通过探测一些点来开始:

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

如果输入是奇数多项式,则最终会发现合适的二分范围。如果输入是偶数多项式,则可能永远不会捕获符号更改(考虑f(x)= x ^ 2 - 它永远不会为负),因此请准备好在某个(可配置的)探测量之后放弃。 / p>

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

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

您可能会觉得这很有帮助。

使用System;

命名空间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