矩阵计算(二) 广义特征值问题

广义特征值问题可化简为狭义特征值问题

方一
在有限元分析结构振动时,会求解该方程: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直接求出来的是正确的,只不过与书上的特征向量成倍数关系。

发布了53 篇原创文章 · 获赞 23 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37083038/article/details/104121414