【问题标题】:Bairstow's method initial quadratic approximationsBairstow 方法初始二次近似
【发布时间】:2015-11-18 23:36:44
【问题描述】:

Bairstow's root finding method 需要非常好的二次因子初始近似值才能收敛。

我尝试了各种常数、随机数、尾随系数中的分数(-a1/a2、-a0/a2;Lin?),但无济于事。

请问,有人知道选择因子的好方法吗?

例如:

1*x^8 + 118*x^7 + 1*x^6 + 2*x^5 - 2*x^4 - 3*x^3 + 3*x^2 + 2*x + 1

使用初始近似值 0.1、0.2 找到根的时间是使用 0.2、2.0 时的 3 倍。

或者:

1*x^8 - 36*x^7 + 546*x^6 - 4536*x^5 + 22449*x^4 - 67284*x^3 + 118124*x^2 - 109584*x + 40320

使用 0.1, 1.2 比使用 0.1, 0.1 需要稍长的时间 (~50%)


尝试对初始二次近似使用柯西界:

R=0
for i in range(1,n+1):
    R=max(abs(a[i]/a[0]),R)
R=1+R
phi=2*pi*random()
x1=complex(R*cos(phi),R*sin(phi))
x2=complex(x1.real,-x1.imag)
r=-x1.real-x2.real
s=(x1*x2).real

不幸的是,这并不能真正加速收敛。

【问题讨论】:

    标签: math polynomial-math polynomials


    【解决方案1】:

    在我撰写文章并提供图片时,我可以告诉您,您确实不需要那么好的近似值。

    如文章中所述,最重要的初始步骤是将多项式减少到偶数次。在那之后,你不能做错了,应该有几乎全局收敛。可以肯定的是,与牛顿方法相同:如果 10 步后没有明显的收敛迹象,则从不同的初始点重新开始。

    计算一些外根半径并选择初始二次因子以使根在该半径内当然是明智的。


    请参阅http://catc.ac.ir/mazlumi/jscodes/bairstow.php 源代码中的 javascript 实现,以了解“幼稚”或“普通”但看似健壮的实现。不减少到均匀度,不关心系数/根大小,...


    该示例有效地是单位磁盘内的奇次多项式,其中一个根-117.9917 在虚拟无穷大。对于每一步的初始化,都应该计算外根半径,即“1+max of abs of coefficients”(前导系数 1)版本中的 R=119。然后用x^2-R^2phi=2*pi*random();x^2+R^2*cos(phi)*x+R^2*sin(phi) 或类似的东西初始化。

    【讨论】:

    • 问题是我可以清楚地看到,当我使用稍微不同的初始近似值时,收敛速度存在巨大差异。我的意思是,肯定有些人一定比其他人更好吗?当有多重性大于一的根时,情况就更糟了。即使是偶次多项式......
    • 第一次不应该发生,至少不应该经常发生。多根永远是个问题。在通常的算法中,只有 Jenkins-Traub 对此相对鲁棒,它仅在小除数中存在取消错误。您能否在问题中记录第一个问题的实例(如果可能很小)?
    • 查看编辑。顺便说一句,当我将示例插入到您链接到的“香草”实现中时,它会冻结。
    • 但只有三四次,说明严重依赖初始条件,在脚本中是随机的。
    • 对不起,我没看懂最后一句:第二部分是半径为 R 的圆上的随机点,但第一部分是什么?我的意思是,我需要对二次因子进行数字猜测,x^2-R^2 中的x 是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多