Julia:eigs()函数在每次评估后返回不同的值

时间:2016-03-22 21:55:26

标签: julia eigenvalue eigenvector

我注意到在多次运行eigs()函数后,每次都会给出不同但近似的结果。

每次相同的结果都有办法退货吗?输出有时是" +"签署或" - "登录。

M 的内容:

[2, 1]  =  1.0
[3, 1]  =  0.5
[1, 2]  =  1.0
[3, 2]  =  2.5
[1, 3]  =  0.5
[2, 3]  =  2.5

M = M+M'
(d, v) = eigs(M, nev=1, which=:LR)

我尝试在Python中的相同稀疏矩阵上运行相同的函数,尽管矩阵看起来有点不同,我认为它是相同的。左边的值从0开始编号。在朱莉亚,它们从1开始编号。我不知道这是否有很大差异。 Julia和Python中的值大致相同,但在Python中,每次评估后它们总是相同的。在Julia 真实中,python中的返回值为复数

Python代码:

M.T 的内容:

from scipy.sparse import linalg

(1, 0)  1.0
(2, 0)  0.5
(0, 1)  1.0
(2, 1)  2.5
(0, 2)  0.5
(1, 2)  2.5

eigenvalue, eigenvector = linalg.eigs(M.T, k=1, which='LR')

知道为什么会出现这种行为吗?

修改:

这是对四次评估的结果

==========eigvalues==============
[2.8921298144977587]
===========eigvector=============
[-0.34667468634025667
-0.679134250677923
-0.6469878912367839]
=================================

==========eigvalues==============
[2.8921298144977596]
===========eigvector=============
[0.34667468634025655
0.6791342506779232
0.646987891236784]
=================================

==========eigvalues==============
[2.8921298144977596]
===========eigvector=============
[0.34667468634025655
0.6791342506779233
0.6469878912367841]
=================================

==========eigvalues==============
[2.8921298144977583]
===========eigvector=============
[0.3466746863402567
0.679134250677923
0.646987891236784]
=================================

1 个答案:

答案 0 :(得分:5)

eigs的结果取决于Lanczos迭代的初始向量。未指定时,它是随机的,因此即使返回的所有向量都是正确的,相位也不能保证在不同的迭代中相同。

如果您希望每次结果都相同,可以在eigs中设置v0,例如

eigs(M, nev=1, which=:LR, v0 = ones(3))

只要v0没有改变,你就应该得到确定性结果。

请注意,如果您需要用于测试目的的确定性结果,您可能需要考虑允许相移的测试方案,因为相位可以以最小的扰动移动。例如。如果您链接不同的BLAS或更改线程数,结果可能会再次更改。