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

Julia : eigs() function returning different values after every evaluation

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

有什么办法可以 return 每次都得到相同的结果吗?输出有时带有“+”号或“-”号。

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 开始编号。在 julia 中,它们从 1 开始编号。我不知道这是否有很大区别。 Julia 和 Python 中的值大致相同,但在 Python 中它们在每次评估后始终相同。 python 中的 return 值是 复数 ,在 Julia 中 real.

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')

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

编辑:

这些是 eigs 四次评估的结果

==========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]
=================================

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

如果你希望每次的结果都一样,可以在eigs中设置v0,例如

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

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

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