给定精度下最快的多项式求根器

计算科学 迭代法 多项式
2021-11-27 23:40:15

我正在寻找一个非常快速的多项式根查找器,希望使用 matlab 代码。我不需要非常准确的结果,小数点后 2-3 位就可以了。此外,该方法应该能够选择性地将根的初始猜测作为输入。如果最初的猜测很接近,这应该会加快这个过程。

我需要这个做什么?我正在处理图像,我正在实施的方法需要在图像中的每个像素处找到多项式的根。鉴于典型图像来自 512x512 及以上,如果需要,该方法必须以牺牲准确性为代价快速。

4个回答

这似乎是一个有点异国情调的建议,但如果你的多项式是固定的、低阶的,为什么不使用同伴/同事矩阵的特征值作为根的初始值呢?

这可能很昂贵,但如果您必须对稍微修改的多项式重复该操作,您可以使用一到两个步骤的逆迭代来更新根。尽管每次迭代都涉及矩阵逆,但请回想一下,同事/同伴矩阵加上逆迭代移位只是一个附加了额外列的双对角矩阵,因此系统可以求解O(n)操作。

如果你有一个合理的起始猜测,并且你试图找到一个根的函数不是过于复杂,那么你就无法击败牛顿的方法。它也很容易实现——大多数语言的 10 行练习。

如果您没有准备好初步猜测,我会尝试Bairstow 的方法如果需要,还可以进行牛顿细化(但如果您对 2-3 位数字感到满意,则可能不会)。

为了完成数值方法的枚举,如果已知的根确实是下一个多项式的根的良好近似,那么可以使用 Weierstraß 方法,俗称 Durand-Kerner 方法。它一次更新所有根,并且与牛顿法一样快,实际上是牛顿法用于多维问题。

Aberth-Ehrlich 方法是相关的,但不确定更高的计算量是否会带来整体更快的收敛。


此外,由于您正在进行某种光线追踪,由多项式曲面与光线相交产生的单变量多项式,您可以将图像划分为 6x6 或 8x8 块,计算中心像素的根,然后计算梯度交点处的曲面。您可以通过使用衍生代码生成器 Tapenade 来获得有关如何做到这一点的灵感。

使用点x和梯度f(x)对于切平面方程f(x),x=f(x),x,通过与光线相交,您可以获得更好的初始近似值xv(t)=c+tv其他像素首先与切平面。

检查f(x),v0,这发生在接近视觉轮廓的地方。这些是任何方法中的关键案例,因为它们有多个或非常接近的根源。