有效地确定多项式在区间[0,T]中是否有根

时间:2010-12-22 00:50:57

标签: math numerical-methods polynomial-math

我有非平凡度(4+)的多项式,需要鲁棒有效地确定它们是否在区间[0,T]中有根。根的确切位置或数量与我无关,我只需要知道是否至少有一个。

现在我正在使用区间运算作为快速检查,看看我是否可以证明没有根可以存在。如果我不能,我正在使用Jenkins-Traub来解决多项式根的所有。这显然是低效的,因为它检查所有真正的根并找到它们的确切位置,我最终不需要的信息。

我应该使用标准算法吗?如果没有,在完成所有根的完整Jenkins-Traub求解之前,我还能做任何其他有效的检查吗?

例如,我可以做的一个优化是检查我的多项式f(t)在0和T处是否具有相同的符号。如果不是,则在该区间中显然存在根。如果是这样,我可以求解f'(t)的根,并在区间[0,T]中的f'的所有根处求f。当且仅当所有这些评估具有与f(0)和f(T)相同的符号时,f(t)在该区间中没有根。这减少了我必须根找到的多项式的次数。不是一个巨大的优化,但也许比没有好。

5 个答案:

答案 0 :(得分:16)

Sturm's theorem可让您计算(a, b)范围内的实根数。鉴于根的数量,您知道是否至少有一个。从本文第4页的下半部分开始:

设f(x)为实多项式。用f0(x)表示它,用f1(x)表示它的导数f'(x)。按照欧几里德的算法继续进行

f0(x) = q1(x) · f1(x) − f2(x),
f1(x) = q2(x) · f2(x) − f3(x),
.
.
.
fk−2(x) = qk−1(x) · fk−1(x) − fk,

其中fk是常数,并且对于1≤i≤k,fi(x)的程度低于fi-1(x)的程度。余数的符号与欧几里德算法中的符号无关。

请注意,最后一个非消失余数fk(或当fk = 0时为fk-1)是最常见的 f(x)和f'(x)的除数。序列f0,f1,。 。 。,fk(或当fk = 0时为fk-1)被称为多项式f的Sturm序列。

定理1(Sturm定理)多项式f(x)的不同实零的数量 (a,b)中的实系数等于序列f0(a),...,fk-1(a),fk中符号变化次数超过序列中符号变化的次数f0(b),...,fk-1(b),fk。

答案 1 :(得分:3)

你当然可以对你的区间算术进行二元搜索。从[0,T]开始并将其替换为多项式。如果结果间隔不包含0,则表示您已完成。如果是,则将间隔除以2并递归每一半。该方案可以很快找到每个根的大致位置。

如果你最终得到4个单独的间隔,你知道你已经完成了。否则,我认为你需要得到间隔[x,y],其中f'([x,y])不包含零,这意味着函数单调递增或递减,因此最多包含一个零。双根可能会出现问题,我不得不考虑更多。

编辑:如果您怀疑有多个根,请使用相同的过程找到f'的根。

答案 2 :(得分:1)

使用Descartes rule of signs收集一些信息。只计算系数中符号变化的数量。这为您提供了正实根数的上限。考虑多项式P。

P = 131.1 - 73.1 * x + 52.425 * x ^ 2 - 62.875 * x ^ 3 - 69.225 * x ^ 4 + 11.225 * x ^ 5 + 9.45 * x ^ 6 + x ^ 7

事实上,我已经构建了P来拥有一个简单的根列表。他们是......

{-6, -4.75, -2, 1, 2.3, -i, +i}

我们可以确定区间[0,3]中是否有根?请注意,端点处的P值没有符号变化。

P(0) = 131.1
P(3) = 4882.5

P的系数有多少符号变化?有4个符号变化,因此可能有多达4个正根。

但是,现在用x + 3代替x代替P.所以

Q(x) = P(x+3) = ...
  4882.5 + 14494.75*x + 15363.9*x^2 + 8054.675*x^3 + 2319.9*x^4 + 370.325*x^5 + 30.45*x^6 + x^7

看到Q(x)系数没有符号变化。所有系数都是正值。因此,没有大于3的根。

因此在区间[0,3]中可能有2个或4个根。

至少这会告诉你是否要全神贯注。当然,如果函数在区间的每一端都有相反的符号,我们知道在该区间内有一个奇数根。

答案 3 :(得分:1)

效率不高,但非常可靠。你可以构造多项式的Companion Matrix(一个稀疏矩阵,其特征值是多项式的根)。

有一些有效的特征值算法可以在给定的区间内找到特征值。其中一个是inverse iteration(可以找到最接近某个输入值的特征值。只需将间隔的中间点作为上述值)。

答案 4 :(得分:0)

如果值f(0)*f(t)<=0,则保证您拥有根。否则,您可以开始将域拆分为两部分(二分)并检查两端的值,直到您确信该段中没有根。

如果f(0)*f(t)>0你要么没有,有两个,四个......根。您的限制是多项式顺序。如果f(0)*f(t)<0你可能有一个,三个,五个......根。