拜尔斯托方法初始二次近似



Bairstow求根法需要非常好的二次因子初始逼近才能收敛。

我尝试了各种常数,随机数,分数的尾部系数(-a1/a2, -a0/a2;

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

例如:

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

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

由于我已经完成了这篇文章并提供了图片,我可以告诉您,您真的不需要那么好的近似。

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

当然,计算某个外部根半径并选择初始二次因子使根在该半径内是明智的。


请参阅http://catc.ac.ir/mazlumi/jscodes/bairstow.php源代码中的javascript实现,以获得"幼稚"或"普通"但看似健壮的实现。不归约为偶数次,不关心系数/根量级,…


这个例子是在虚无穷远处具有一个根-117.9917的单元磁盘内的一个有效的奇次多项式。对于每一步的初始化,都需要计算外根半径,即"1+max of abs of coefficients"(leading coefficient 1)版本中的R=119。然后初始化x^2-R^2phi=2*pi*random();x^2+R^2*cos(phi)*x+R^2*sin(phi)或类似的东西。

最新更新