You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 07:54:56