Math 贝尔斯托';初始二次逼近的s方法

Math 贝尔斯托';初始二次逼近的s方法,math,polynomial-math,polynomials,Math,Polynomial Math,Polynomials,为了收敛,二次因子需要非常好的初始近似 我尝试了各种常数、随机数、尾部系数中的分数(-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倍 或: 使用0.1,1.2比使用0.1,0.1所需的时间稍长(~50%) 尝试将柯西界用于初始二次近似:

为了收敛,二次因子需要非常好的初始近似

我尝试了各种常数、随机数、尾部系数中的分数(-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倍

或:

使用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步之后没有明显的收敛迹象,用不同的初始点重新开始

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


请参阅的源代码中的javascript实现,以了解“简单”或“普通”但看似健壮的实现。不降低到均匀程度,不考虑系数/根震级



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

问题是,我可以清楚地看到,当我使用甚至稍有不同的初始近似值时,收敛速度存在巨大差异。我的意思是,肯定有些人比其他人更好?当根的多重性大于1时,情况就更糟了。即使对于偶数次多项式……第一次也不应该发生,至少不会经常发生。多根总是一个问题。在通常的算法中,只有Jenkins-Traub相对鲁棒,它只受到小除数的抵消误差的影响。你能把第一个问题的第一个小例子记录下来吗?请看编辑。顺便说一句,当我将示例插入到链接到的“香草”实现中时,它会冻结。但仅每三次或四次冻结一次,这表示严重依赖初始条件,而初始条件在脚本中是随机的。抱歉,我不理解最后一句话:第二部分是半径为R的圆上的随机点,但第一部分是什么?我的意思是,我需要用数字来猜测二次因子,
x^2-R^2
中的
x
是什么?
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