密集病态矩阵的对角化


10

我正在尝试将一些稠密,病态的矩阵对角化。在机器精度方面,结果不准确(返回负特征值,特征向量不具有预期的对称性)。我切换到Mathematica的Eigensystem []函数以利用任意精度,但是计算速度非常慢。我愿意接受许多解决方案。是否有非常适合病态问题的软件包/算法?我不是预处理方面的专家,所以我不确定这有多大帮助。否则,我所能想到的就是并行化的任意精度特征值求解器,但是我对Mathematica,MATLAB和C ++并不熟悉。

为了提供一些有关此问题的背景,矩阵很大,但不是很大(最多4096x4096至32768x32768)。它们是实数,是对称的,特征值在0到1(不包括)之间,许多特征值非常接近0,没有一个接近1。矩阵本质上是卷积算符。我不需要对所有矩阵进行对角线化,但是我可以走的越大越好。我可以访问具有许多处理器和分布式计算功能的计算集群。

谢谢


2
您使用什么例程对角化实对称矩阵?在什么意义上特征值分解是不正确的?
杰克·普尔森

这是与Arnold答案有关的一个想法:对SPD矩阵执行Cholesky分解,然后找到刚获得的Cholesky三角形的奇异值,可能使用dqd类型算法来保持精度。
JM 2012年

1
@JM:用通常的方法在数值上奇异的正定矩阵上形成Cholesky分解在数值上是不稳定的,因为一个人可能会遇到负点。(例如,Matlab的chol(A)通常会失败。)必须将它们设置为零,并消除相应的因子行。这样做可以可靠地获取数字空空间。
阿诺德·诺伊迈耶

@Arnold,如果有记忆的话,Cholesky的改编版在矩阵为正半定数(或接近半定数)的情况下使用对称旋转。也许可以使用...
JM 2012年

@JM:不需要旋转即可解决半定情况;我给的食谱就足够了 我只想指出,一个人不能使用标准的固定程序,而必须自行修改。
阿诺德·纳伊迈尔

Answers:


7

计算SVD代替频谱分解。结果与精确算术相同,因为矩阵是对称正定的,但是在有限精度算术中,您将获得更小的特征值。

编辑:参见Demmel&Kahan,《双对角矩阵的精确奇异值》,SIAM J. Sci。统计 计算 11(1990),873-912。
ftp://netlib2.cs.utk.edu/lapack/lawnspdf/lawn03.pdf

编辑2; 请注意,没有一种方法能够解析小于特征值约两倍于所使用机器精度的特征值,因为将单个条目更改一个ulp可能已经改变了一个很小的特征值。因此,以零个特征值代替非常小的特征值是适当的,并且没有任何方法(除非以更高的精度工作)会解开相应的特征向量,而只是返回公共数字零空间的基础。


[0Ť;0]

2
@JackPoulson:关键是,双角形状更好地确定了小奇异值。关联的对称三对角线形式在对角线上具有零,这是通过将对角线缩小为对角线而保留的,而不是通过应用于三对角线的QR保留的。
阿诺德·诺伊迈耶

1
参考?众所周知,雅可比的方法非常精确(尽管很慢)。
Jack Poulson

@JackPoulson:尝试看看。Demmel&Kahan,双对角矩阵的精确奇异值,202.38.126.65
Arnold

[0Ť;0]

1

谢谢你的建议。我尝试了Mathematica的SVD命令,但没有得到明显的改善(仍然缺少适当的对称性,“特征值”错误地归零,而之前错误地归零)。也许我需要实现您上面描述的一种算法,而不是内置函数?我可能希望避免麻烦使用这样的特定方法,除非我事先确定它将提供显着的改进。

@JackPoulson,我浏览了您引用的Jacobi方法的论文,看起来很有希望。您或任何人都可以推荐一种很好的方法来实现Jacobi的寻找本征系统的方法吗?我猜想如果我自己编写代码(在MATLAB中),那将非常慢。


我还没有测试过,但是这里有一个MATLAB实现:groups.google.com/forum/?fromgroups#!msg/sci.math.num
Jack Poulson,

请注意,没有一种方法能够解析出比使用的机器精度大约标准值小的标准特征值,因为将单个条目更改一个ulp可能已经改变了一个很小的特征值。因此,以零个特征值代替非常小的特征值是适当的,并且没有任何方法(除非以更高的精度工作)会解开相应的特征向量,而只是返回公共数字零空间的基础。您需要什么特征值?
阿诺德·诺伊迈耶

@ArnoldNeumaier:我在MATLAB中进行了一些特征值在[0,1]范围内的测试,其中一个特征值手动设置为6.3e-16等值,并使用Octave的SVD例程(基于dgesvd,该模型使用对角线和然后QR)确实比Octave的eig准确得多。链接的Jacobi代码似乎使用起来太慢,即使在中等大小的矩阵上也是如此。
Jack Poulson

@JackPoulson:是的。但是Leigh似乎抱怨多个非常小的特征值,无论使用哪种方法,它们的特征向量很少是设计出来的,而是可以自由混合的。当然,非常小的正值(小于1e-16)也为零。
阿诺德·纳伊迈尔

@ArnoldNeumaier是对的,因为我正在发现多个非常小的特征值,我猜想这会使问题恶化。我没有意识到(尽管回想起来很明显)浮点数小于1e-16的特征值将为零。我想虽然可以存储数字,但是将其添加到更大的数字时会发生舍入错误。特征向量告诉我某个问题是否可以解决。本征向量允许将问题分解为可解决的部分和不可解决的部分。如果我从根本上受到精度的限制,那么您可以推荐任何软件包以实现更快的解决方案吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.