我有一个由Python代码计算的NxN对称的三对角矩阵,我想将它对角化。在
在具体的例子中,我处理的是N = 6000,但是矩阵可以变大。因为它是稀疏的,所以我假设最好的对角化方法是使用算法scipy.sparse.linalg.eigsh(),它在处理其他稀疏和对称矩阵(但不是三对角矩阵)时表现非常好。特别是,由于我只需要频谱的低端部分,所以我在函数中指定了k=2和{}。在
但是,在这种情况下,该算法似乎不起作用,因为经过大约20分钟的计算,我得到以下错误:ArpackNoConvergence: ARPACK error -1: No convergence (60001 iterations, 0/2 eigenvectors converged)
为什么会这样?这是一个与三对角矩阵的一些性质有关的问题吗?哪个Python(请,只有Python!)我能用一个有效的方法使矩阵对角化吗?在
以下是重现我的错误所需的最少代码:import scipy.sparse.linalg as sl
import numpy as np
dim = 6000
a = np.empty( dim - 1 )
a.fill( 1. )
diag_up = np.diag( a, 1 )
diag_bot = np.diag( a, -1 )
b = np.empty( dim )
b.fill( 1. )
mat = np.diag( b ) + diag_up + diag_bot
v, w = sl.eigsh(mat, 2, which = 'SM')
在我的个人电脑上,矩阵的构造需要364ms,而对角化得到报告的误差。在