为何Matlab与Python计算的广义特征向量结果不匹配?
问题原因与解决方法
核心差异原因
- 特征向量本身没有唯一固定值,广义特征向量可以乘以任意非零常数,仍然满足特征值方程
- Matlab与scipy默认的特征向量归一化规则不同:scipy.linalg.eig默认返回2范数为1的特征向量,Matlab的
eig(A,B)不会做2范数归一 - 你的Python代码存在输入笔误:Matlab中m1矩阵第三行第二列为
3.33333333,你写为了83.33333333,这是导致你验证等式不成立的直接原因
复现Matlab结果的步骤
- 先修正矩阵输入错误
- 计算广义特征值后,对特征值和对应特征向量按升序排序,对齐Matlab的输出顺序
- 调整特征向量的缩放系数,匹配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
相关产品推荐
相关产品推荐

