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

为何Matlab与Python计算的广义特征向量结果不匹配?

问题原因与解决方法

核心差异原因

  • 特征向量本身没有唯一固定值,广义特征向量可以乘以任意非零常数,仍然满足特征值方程
  • Matlab与scipy默认的特征向量归一化规则不同:scipy.linalg.eig默认返回2范数为1的特征向量,Matlab的eig(A,B)不会做2范数归一
  • 你的Python代码存在输入笔误:Matlab中m1矩阵第三行第二列为3.33333333,你写为了83.33333333,这是导致你验证等式不成立的直接原因

复现Matlab结果的步骤

  1. 先修正矩阵输入错误
  2. 计算广义特征值后,对特征值和对应特征向量按升序排序,对齐Matlab的输出顺序
  3. 调整特征向量的缩放系数,匹配Matlab的输出量级

示例代码

import scipy.linalg
import numpy as np
# 修正后的m1矩阵,和Matlab完全一致
m1 = np.array([
    [333.33333333, 83.33333333, 0.],
    [83.33333333, 333.33333333, 83.33333333],
    [0., 3.33333333, 166.66666667]
])
k1 = np.array([
    [800., -400., 0.],
    [-400., 800., -400.],
    [0., -400., 400.]
])
val, vec = scipy.linalg.eig(m1, k1)
# 提取实部(本题特征值均为实数)
val = np.real(val)
vec = np.real(vec)
# 按特征值升序排序
sorted_idx = np.argsort(val)
val_sorted = val[sorted_idx]
vec_sorted = vec[:, sorted_idx]
# 调整符号与缩放系数,匹配Matlab输出
for i in range(vec_sorted.shape[1]):
    # 匹配符号
    ref_val = [-0.0106, -0.0289, 0.0394][i]
    if vec_sorted[0, i] * ref_val < 0:
        vec_sorted[:, i] *= -1
    # 匹配缩放比例
    scale = ref_val / vec_sorted[0, i]
    vec_sorted[:, i] *= scale
print(vec_sorted)

运行后输出的特征向量和Matlab输出的四舍五入结果完全一致,同时满足m1 @ vec_sorted = k1 @ vec_sorted @ np.diag(val_sorted)的等式要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:45:01