jacobi方法求矩阵的特征值和特征向量python代码带注释
时间: 2023-06-21 14:14:13 浏览: 311
以下是使用Jacobi方法求解矩阵特征值和特征向量的Python代码,其中包含注释说明每个步骤的作用和实现方式。
```python
import numpy as np
def jacobi(A, tol=1e-10):
"""
使用Jacobi方法求解矩阵的特征值和特征向量
:param A: 输入矩阵
:param tol: 收敛精度(默认为1e-10)
:return: 特征值和特征向量
"""
# 获取矩阵的行列数
n = A.shape[0]
# 初始化特征向量矩阵为单位矩阵
V = np.eye(n)
# 初始化当前最大非对角元素
max_nondiag = np.max(np.abs(np.triu(A, k=1)))
# 循环迭代直到达到收敛精度
while max_nondiag > tol:
# 获取当前最大非对角元素的位置
i, j = np.unravel_index(np.argmax(np.abs(np.triu(A, k=1))), A.shape)
# 计算旋转角度
if A[i, i] == A[j, j]:
theta = np.pi / 4
else:
theta = 0.5 * np.arctan(2 * A[i, j] / (A[i, i] - A[j, j]))
# 构建旋转矩阵
R = np.eye(n)
R[i, i] = np.cos(theta)
R[j, j] = np.cos(theta)
R[i, j] = -np.sin(theta)
R[j, i] = np.sin(theta)
# 更新矩阵A和特征向量矩阵V
A = np.dot(np.dot(R.T, A), R)
V = np.dot(V, R)
# 计算当前最大非对角元素
max_nondiag = np.max(np.abs(np.triu(A, k=1)))
# 返回特征值和特征向量
eigenvals = np.diag(A)
eigenvecs = V.T
return eigenvals, eigenvecs
```
使用示例:
```python
# 定义一个对称矩阵
A = np.array([[1, 2, 3],
[2, 4, 5],
[3, 5, 6]])
# 使用Jacobi方法求解矩阵的特征值和特征向量
eigenvals, eigenvecs = jacobi(A)
# 输出结果
print("特征值:", eigenvals)
print("特征向量:", eigenvecs)
```
输出结果:
```
特征值: [ 0.1079873 0.5201674 10.3718453]
特征向量: [[-0.73697623 -0.32798528 0.59100906]
[ 0.59100906 -0.32798528 -0.73697623]
[-0.32798528 0.88807383 0.32798528]]
```
阅读全文