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

Python调用linalg.eigh求解广义厄米特特征值报B非正定错误咨询

报错根因

scipy.linalg.eigh 针对广义厄米特征值问题 A x = λ B x 做了专门优化,默认采用Cholesky分解将广义问题转换为普通厄米特征值问题求解,因此要求右矩阵B必须为正定厄米矩阵:所有特征值严格大于0,且满足共轭转置等于自身(B = B^H)。你收到的报错明确说明B矩阵的12阶顺序主子式非正定,Cholesky分解无法完成,因此终止计算。

linalg.eig 能正常运行的原因是它面向通用非对称特征值场景设计,不需要矩阵满足厄米、正定的前置要求,但其精度和性能弱于专门针对厄米矩阵优化的eigh。

问题排查方向

  • 验证矩阵厄米性:你给出的S矩阵代码中,第916行前8列全为0,但对应位置的第18行9~16列为自定义的b类变量,除非这些变量全为0,否则S不满足厄米要求,会直接导致正定性判定失败。可执行 np.allclose(S, S.conj().T) 验证,返回False的话先修正矩阵元素保证共轭对称。
  • 验证S的正定性:运行 s_eigvals = np.linalg.eigvalsh(S) 输出S的所有特征值,只要存在小于等于0的特征值(数值场景下可设1e-10为阈值过滤浮点误差),就说明S确实不符合eigh的默认输入要求。

解决方法

  1. 正则化适配半正定场景
    如果确认S为半正定矩阵(特征值全非负,仅存在零值或数值误差带来的微小负特征值),可以给S添加极小的单位矩阵正则项,人为使其满足正定要求:
# 正则系数需远小于问题特征值的量级,避免影响最终结果
S_reg = S + 1e-8 * np.eye(S.shape[0])
lamda, x = lg.eigh(H, S_reg, lower=False, eigvals_only=False)
  1. 更换求解驱动跳过正定要求
    scipy的eigh支持指定不同的底层LAPACK驱动,当B矩阵不定时,可以选用不需要正定前置条件的gvd/gv驱动,直接调用广义对称特征值求解算法,既保留eigh的精度性能优势,又无需修改原始矩阵,优先推荐该方案:
lamda, x = lg.eigh(H, S, lower=False, eigvals_only=False, driver='gvd')
  1. 匹配lower参数与矩阵填充逻辑
    你设置了lower=False,此时eigh会仅读取矩阵的上三角部分构造厄米矩阵,如果你的矩阵元素仅填充了下三角,会生成错误的输入矩阵,进而影响正定性判定,需确认参数配置与你的矩阵填充逻辑一致。

内容的提问来源于stack exchange,提问作者Rohin Kc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:54:02