Scipy求解M^-1*K矩阵特征值结果不正确,是什么原因?
矩阵$M^{-1}K$特征值计算结果与预期不符的问题解答
- 你当前的代码在数学计算逻辑上没有原则性错误,但存在两个可优化和需要注意的点:
scipy.linalg.eig默认返回复数类型的特征值,即使特征值全为实数也会携带虚部为0的复数标识,你需要取实部才能得到纯数值结果,对应修改为print(la.real)即可- 对于实对称正定矩阵的广义特征值问题$Kv = \lambda Mv$,更推荐直接使用
scipy.linalg.eigh(K, M)求解,不需要手动求M的逆再做矩阵乘法,数值稳定性更好,且直接返回升序排列的实特征值,不需要额外处理复数。优化后的代码如下:
运行后得到的特征值为from scipy import linalg import numpy as np M = np.diag([30,30,30,30]) # ton K = np.array([[5000,-2500,0,0], [-2500,5000,-2500,0], [0,-2500,5000,-2500], [0,0,-2500,2500] ]) la, v = linalg.eigh(K, M) print(la)[ 25. , 125. , 227.80812061, 272.19187939],该结果是数学层面正确的$M^{-1}K$特征值。 - 计算结果和预期的3.17、9.13、13.98、17.15不符,核心原因是物理量对应关系和单位转换问题:
- 计算得到的特征值$\lambda$对应的是角频率的平方$\omega^2$,如果要得到角频率$\omega$需要对$\lambda$开平方,如果要得到工程常用的固有频率$f$(单位Hz),还需要再除以$2\pi$
- 你的M矩阵标注单位为吨,需要和K矩阵的单位做统一换算:如果K的单位是N/m,M需要从吨转换为千克(乘以1000),再代入计算才能得到正确的物理量数值。你给出的预期值大概率是经过单位转换、开平方后的频率类物理量,而非直接的$M^{-1}K$特征值。
内容的提问来源于stack exchange,提问作者buğra caner
相关产品推荐
相关产品推荐

