高次多项式的根:LinAlgError:特征值未收敛

计算科学 本征系统 麻木的 多项式
2021-11-29 19:43:23

我写了一个简单的脚本来生成高度的随机多项式并找到它们的根。有关随机多项式的更多讨论,请参见此处f(z)=k=0Nakzkk!

N = 500

a = np.random.normal(0,1,N)

n = np.arange(N-1)+1
n = np.insert(n,0,1)
n = np.sqrt(n)
n = np.cumproduct(n)

z = np.roots(a/n[::-1])/np.sqrt(N)

plt.xlim([-1,1])
plt.ylim([-1,1])
plt.plot(z.real, z.imag, '.')

对于 (这里N=150) 的较小值,我们确实得到了一个用零填充的单位圆盘的图片:

在此处输入图像描述

对于较大的值,N会出现错误消息。我确信 NumPy 可以计算比这更大的矩阵的特征值。正确的?

LinAlgError: Eigenvalues did not converge
1个回答

使用反演操作可以规避系数的一些指数增长问题:

将系数倒写n[::1]而不是n[::-1]我们得到根的倒数。

N = 500

a = np.random.normal(0,1,N)

n = (1.0 + np.arange(N-1))/N
n = np.insert(n,0,1)

n = np.sqrt(n)
n = 1.0/n
n = np.cumproduct(n)

z = np.roots(a*n[::1])
z = 1/z
L = 1.5
plt.xlim([-L,L])
plt.ylim([-L,L])
plt.plot(z.real, z.imag, '.')

t = np.arange(0,1,0.01)
z = 1*np.exp(2j*np.pi*t)
plt.plot(z.real, z.imag, '-')

在此处输入图像描述

然后使用函数我们可以将根翻转回来。一旦度数太大,这个技巧就不再起作用了。z1zN

在此处输入图像描述