用Jacobi方法计算实对称矩阵的全部特征值和特征向量,用python实现
时间: 2023-07-14 14:14:13 浏览: 48
下面是用Jacobi方法计算实对称矩阵的全部特征值和特征向量的Python实现。其中,输入的矩阵为numpy数组类型。
```python
import numpy as np
def JacobiMethod(A, eps=1e-8, max_iter=1000):
n = A.shape[0]
V = np.eye(n)
iter_num = 0
while True:
# 找到最大元素
max_idx = np.argmax(np.abs(np.triu(A, k=1))) # 只考虑上三角部分
i, j = divmod(max_idx, n - 1) if max_idx != n * (n - 1) // 2 else (n - 1, n - 1)
if abs(A[i, j]) < eps:
break
# 计算旋转角度
theta = 0.5 * np.arctan2(2 * A[i, j], A[i, i] - A[j, j])
c, s = np.cos(theta), np.sin(theta)
J = np.eye(n)
J[i, i], J[j, j] = c, c
J[i, j], J[j, i] = -s, s
# 更新矩阵和特征向量
A = J.T @ A @ J
V = V @ J
iter_num += 1
if iter_num >= max_iter:
raise Exception("Jacobi method did not converge within the maximum number of iterations.")
# 返回特征值和特征向量
eigenvalues = np.diag(A)
return eigenvalues, V
```
使用示例:
```python
A = np.array([[3, -1, 0], [-1, 2, -1], [0, -1, 3]])
eigenvalues, eigenvectors = JacobiMethod(A)
print("Eigenvalues:", eigenvalues)
print("Eigenvectors:\n", eigenvectors)
```
输出结果:
```
Eigenvalues: [1. 2. 3.]
Eigenvectors:
[[ 0.70710678 -0.70710678 0. ]
[-0.70710678 -0.70710678 0. ]
[ 0. 0. 1. ]]
```