如何在Python中求解含对角矩阵的特征方程的特征值
求解|A - λD|=0的特征值(D为对角矩阵)
嘿,这个问题其实可以通过数学转化或者符号计算来解决,不用自己从零实现复杂的行列式求解和多项式根计算。我分两种常见情况给你讲清楚:
情况1:对角矩阵D可逆(对角元素无0)
当D可逆时,我们可以把原方程转化为常规的特征值问题:
|A - λD| = 0
两边同时左乘D⁻¹,得到 |D⁻¹A - λI| = 0
这就意味着原方程的特征值就是矩阵D⁻¹A的特征值,直接用numpy的线性代数工具就能搞定。
Python代码示例(numpy)
import numpy as np # 定义矩阵A和对角矩阵D A = np.array([[2, 1], [1, 2]]) D = np.array([[3, 0], [0, 4]]) # 可逆对角矩阵,对角元素无0 # 计算D的逆(对角矩阵的逆就是对角元素取倒数) D_inv = np.diag(1 / np.diag(D)) # 计算D^{-1}A M = D_inv @ A # 求解特征值 eigenvalues = np.linalg.eigvals(M) print("特征值:", eigenvalues)
情况2:对角矩阵D不可逆(对角元素含0)
如果D有0元素,没法直接求逆,这时候可以用符号计算工具sympy来构造特征多项式,然后求根。
Python代码示例(sympy)
import sympy as sp # 定义符号λ lambda_sym = sp.symbols('λ') # 定义矩阵A和对角矩阵D(这里D有一个0元素) A = sp.Matrix([[2, 1], [1, 2]]) D = sp.Matrix([[3, 0], [0, 0]]) # 构造矩阵A - λ*D matrix = A - lambda_sym * D # 计算行列式(特征多项式) char_poly = matrix.det() # 求解特征方程char_poly = 0 eigenvalues = sp.solve(char_poly, lambda_sym) print("特征值:", eigenvalues)
补充说明
- 如果你的矩阵是数值型且规模较大,优先用numpy的方法(情况1),效率更高;
- 如果需要精确的符号解或者D不可逆,用sympy的符号计算更合适;
- 要是D是稀疏对角矩阵,也可以用scipy的稀疏矩阵工具来优化计算,避免不必要的内存开销。
内容的提问来源于stack exchange,提问作者Juan Manuel J
相关产品推荐
相关产品推荐

