广义特征值问题可化简为狭义特征值问题
方一
在有限元分析结构振动时,会求解该方程:K*U = w^2*M*U
可通过变换将方程转化为A*y=λ*y
1.将M进行cholesky分解
M = L*L^T
得到下三角阵L
2.B=L^(-1)*K
3.A=L^(-1)*B^T
此时求解w与U的问题(K*x = w^2*M*x) 转化为求解 λ与y的问题(A*y=λ*y)
4.求解得到A的特征值与特征向量
λ=w^2 则w=λ^(1/2)
x=L^(-1)*y
方二
scipy中求解特征值问题的函数广义与狭义都可以求+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
下面给出两种解法的代码:import numpy as np
import scipy.linalg as sp_linalg
K = np.array([[4,1,2,1],
[1,3,1,2],
[2,1,4,2],
[1,2,2,4]])M = np.array([[1,1,1,2],
[1,2,1,2],
[1,1,2,2],
[2,2,2,5]])# M进行cholesky分解 M=L*L^T
L = np.linalg.cholesky(M)
L_inv = np.linalg.inv(L)
# B=L^-1*K
B = np.dot(L_inv,K)
A = np.dot(L_inv,B.T)# 此时 K*U = w^2*M*U 转化为 A*y=λ*y L*x=y
eig = np.linalg.eig(A)
λ = eig[0]
y = eig[1]
x = np.dot(L_inv,y)
eig1 = sp_linalg.eig(K,M)
λ1 = eig1[0]
x1 = eig1[1]
对比可知λ与λ1的结果是一样的
但是特征向量不同,有待讨论.......................................————————经过考虑后———————————————————————————
用cholesky分解将广义特征问题化为狭义特征问题,求解的特征向量应该是不准确的。
而我用scipy直接求出来的是正确的,只不过与书上的特征向量成倍数关系。