矩阵特征值的计算方法之幂法
import numpy as np
# 定义矩阵 A
A = np.array([[3, 2],
[4, 5]], dtype=float)
# 初始向量 x0
x0 = np.array([1, 1], dtype=float) # 或用 np.random.rand(3)
# 参数
max_iterations = 20
tolerance = 1e-6
# 修改后的幂法(无穷范数 + 最大分量特征值)
def power_method_infinity_norm(A, x0, max_iter, tol):
x = x0.copy()
lambda_prev = 0 # 上一次的特征值估计
for k in range(max_iter):
# 步骤 1: 计算 x = A * x
x_new = A @ x
print(f"迭代 {k + 1}:")
print(f" 步骤 1: 计算 x_new = A * x")
print(f" A = \n{A}")
print(f" x = {x}")
print(f" x_new = {x_new}")
# 步骤 2: 用无穷范数归一化
norm_inf = np.linalg.norm(x_new, ord=np.inf) # 无穷范数
x = x_new / norm_inf
print(f" 步骤 2: 用无穷范数归一化")
print(f" 无穷范数 norm_inf = {norm_inf}")
print(f" 归一化后的 x = {x}")
# 步骤 3: 从 x_new 中选择绝对值最大的分量作为特征值估计
lambda_curr = np.max(np.abs(x_new)) # 在归一化前取最大值,等价于 norm_inf
print(f" 步骤 3: 从 x_new 中选择绝对值最大的分量作为特征值估计")
print(f" x_new 的绝对值 = {np.abs(x_new)}")
print(f" 特征值估计 lambda_curr = {lambda_curr}")
# 输出当前迭代结果
print(f" 当前特征向量 = {x}")
print(f" 当前特征值 = {lambda_curr}")
# 步骤 4: 检查收敛性
if np.abs(lambda_curr - lambda_prev) < tol:
print(f"\n在第 {k + 1} 次迭代后收敛")
return lambda_curr, x
lambda_prev = lambda_curr
print("\n达到最大迭代次数,未完全收敛")
return lambda_curr, x
# 运行幂法
eigenvalue, eigenvector = power_method_infinity_norm(A, x0, max_iterations, tolerance)
# 输出最终结果
print("\n最终结果:")
print(f"主特征值: {eigenvalue}")
print(f"主特征向量: {eigenvector}")
# 验证:用 NumPy 的 linalg.eig 计算所有特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)
print("\n用 NumPy 验证所有特征值:")
print(f"特征值: {eigenvalues}")
print(f"特征向量:\n{eigenvectors}")
posted on 2025-03-10 17:13 Indian_Mysore 阅读(36) 评论(0) 收藏 举报
浙公网安备 33010602011771号