我注意到在多次运行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]
=================================
答案 0 :(得分:5)
eigs
的结果取决于Lanczos迭代的初始向量。未指定时,它是随机的,因此即使返回的所有向量都是正确的,相位也不能保证在不同的迭代中相同。
如果您希望每次结果都相同,可以在eigs中设置v0
,例如
eigs(M, nev=1, which=:LR, v0 = ones(3))
只要v0
没有改变,你就应该得到确定性结果。
请注意,如果您需要用于测试目的的确定性结果,您可能需要考虑允许相移的测试方案,因为相位可以以最小的扰动移动。例如。如果您链接不同的BLAS或更改线程数,结果可能会再次更改。