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

M.P*_*Puk 4 eigenvalue eigenvector julia

我注意到在多次运行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)
Run Code Online (Sandbox Code Playgroud)

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

Python代码:

MT的内容:

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')
Run Code Online (Sandbox Code Playgroud)

知道为什么会发生这种行为吗?

编辑:

这些是对四次评估的结果

==========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]
=================================
Run Code Online (Sandbox Code Playgroud)

And*_*ack 5

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

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

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

只要v0不改变你就应该得到确定性的结果.

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