SciPy与MATLAB的eigs函数收敛至不同特征值的差异原因咨询
广义特征值问题求解:Scipy与MATLAB/Julia的结果差异问题
我正将MATLAB脚本转换为Python代码以求解广义特征值问题,其中矩阵A、B均非半正定。推测MATLAB中的ARPACK库会在此场景下fallback至其他解法,但scipy.sparse.linalg.eigs函数却因此失效。我尝试使用shift-invert方法,但仅能找到接近sigma=160的特征值;而原MATLAB代码及测试用Julia代码均能稳定找到具有实际物理意义的特征值。以下为测试脚本及输出:
Python 实现及输出
import scipy import numpy as np from pathlib import Path A = scipy.io.loadmat(Path(r"A.mat"))["M2"] B = scipy.io.loadmat(Path(r"B.mat"))["K2"] for i in range(3): w, x = scipy.sparse.linalg.eigs(A, 10, B, sigma=160) print(np.sort(w)[::-1])
输出:
[161.26979005+4.26415422j 161.26979005-4.26415422j 158.92858951+4.22317058j 158.92858951-4.22317058j 157.64003545+3.74576228j 157.64003545-3.74576228j 156.63206377+0.j 156.62334177+3.04331942j 156.23526634+1.58239628j 156.23526634-1.58239628j] [161.37373507+2.80500328j 161.37373507-2.80500328j 161.1500351 +3.96154771j 161.1500351 -3.96154771j 160.38498788+3.72012148j 160.38498788-3.72012148j 156.69885362+2.27484038j 156.69885362-2.27484038j 156.63206377+0.j 156.137915 +3.13749122j] [160.03961408+0.02637497j 160.03961408-0.02637497j 160.03777484+0.01952793j 160.03777484-0.01952793j 160.03374392+0.03162003j 160.03374392-0.03162003j 160.02344395+0.04010082j 160.02344395-0.04010082j 160.00118188+0.04575844j 160.00118188-0.04575844j]
Julia 实现及输出
using MAT using LinearAlgebra using Arpack using DelimitedFiles A = matread(joinpath(@__DIR__, "A.mat"))["M2"] B = matread(joinpath(@__DIR__, "B.mat"))["K2"] for i in 1:3 λ, V = eigs(-A, B; nev=10, ncv=50, sigma=160, check=1) println("Eigenvalues: ", round.(real.(-λ), digits=3)) end
输出:
Eigenvalues: [156.632, 3.764, 1.557, 0.952, 0.676, 0.554, 0.47, 0.412, 0.371, 0.335, 0.335] Eigenvalues: [156.632, 3.764, 1.557, 0.952, 0.676, 0.554, 0.47, 0.412, 0.371, 0.335, 0.335] Eigenvalues: [156.632, 3.764, 1.557, 0.952, 0.676, 0.554, 0.47, 0.412, 0.371, 0.335, 0.335]
MATLAB 实现及输出
A = load("A.mat", "M2").M2; B = load("B.mat", "K2").K2; opts.disp = true; for i = 1:3 [x w] = eigs(A, B, 10, 160, opts); disp(sort(diag(w))); end
输出:
0.4121 0.4699 0.5538 0.6755 0.9524 1.5569 3.7636 156.6321 NaN NaN
我查阅了各库的eigs函数文档,仍未找到导致方法差异的细节,恳请各位提供相关建议。
内容的提问来源于stack exchange,提问作者PBrownie
相关产品推荐
相关产品推荐

