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

Windows环境下声振有限元非对称稀疏广义特征值问题的Python求解求助

Windows环境下声振有限元非对称稀疏广义特征值问题的Python求解求助

我最近在处理一个声振有限元的广义特征值问题,卡壳好一阵了——我的刚度矩阵(stiff)和质量矩阵(mass)都是非对称的稀疏矩阵,但Scipy里的scipy.sparse.linalg.eigs和eigsh都明确只支持对称/厄米特矩阵的场景,这直接导致我的Python代码跑不起来。

先说说我之前的尝试:我一开始写了这两段代码,想求解最小的20个特征值(nev=20):

import scipy
import numpy as np
import pickle

if __name__ == '__main__':
    with open('../k_full.pickle', 'rb') as f:
        print('loading matrix K')
        k_global = pickle.load(f)
    with open('../m_full.pickle', 'rb') as f:
        print('loading matrix M')
        m_global = pickle.load(f)

    # 第一种尝试:指定求最小模的特征值
    eigvalues, eigvectors = scipy.sparse.linalg.eigs(A=k_global, k=20, M=m_global, which='SM')
    # 第二种尝试:以0为中心搜索特征值
    eigvalues, eigvectors = scipy.sparse.linalg.eigs(A=k_global, k=20, M=m_global, sigma=0)

结果直接报了收敛错误:

scipy.sparse.linalg._eigen.arpack.arpack.ArpackNoConvergence: ARPACK error -1: No convergence (321 iterations, 4/20 eigenvectors converged)

后来查Scipy的文档才搞明白:eigsh本身就只支持实对称或复厄米特矩阵;eigs虽然是通用特征值求解器,但当带M矩阵(广义特征值问题场景)时,也要求M是对称/厄米特矩阵,而我的问题里矩阵显然不满足这个条件。

对比之下,同样的问题我用Matlab是能完美解决的,Matlab代码如下:

k = load('k_global.mat');
m = load('m_global.mat');
[V,D] = eigs(k.array, m.array, 20,0);
D = diag(D)
natural_frequency = sqrt(D)/(2*pi)

返回的结果完全符合声振问题的预期,既有实特征值,也有虚部极小的复特征值:

0.00000000000000 + 0.000356591992067188i
0.000668911454165071 + 0.00000000000000i
0.00000000000000 + 0.000973128785222090i
0.00222975851379527 + 0.00000000000000i
0.00246434216130016 + 0.00000000000000i
0.00000000000000 + 0.00372951940564144i
8.06883871646537 + 0.00000000000000i
64.7482150103242 + 0.00000000000000i
234.453670549319 + 0.00000000000000i
268.154072409059 + 0.00000000000000i
312.537263749716 + 0.00000000000000i
356.103849178590 + 0.00000000000000i
389.038117338274 + 0.00000000000000i
412.048267727649 + 0.00000000000000i
473.729345964820 + 0.00000000000000i
2996.35112385098 + 0.00000000000000i
3240.96766107255 + 0.00000000000000i
4186.42444133727 + 0.00000000000000i
4585.99172192305 + 0.00000000000000i
4794.52737053778 + 0.00000000000000i

补充下我的问题细节:这是典型的声振耦合问题,对应的矩阵是分块形式的耦合结构;我用的是Windows系统,刚度和质量矩阵都是稀疏矩阵,它们的非零元素分布结构也已经整理完成。

现在就想请教下,有没有办法在Windows环境下,用Python处理这种非对称的稀疏广义特征值问题,得到和Matlab一致的结果?

备注:内容来源于stack exchange,提问作者SleepyGary

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:38:08