昆仑山:眼中无形心中有穴之穴人合一

夫君子之行,静以修身,俭以养德;非澹泊无以明志,非宁静无以致远。夫学须静也,才须学也;非学无以广才,非志无以成学。怠慢则不能励精,险躁则不能冶性。年与时驰,意与岁去,遂成枯落,多不接世。悲守穷庐,将复何及!

 

矩阵特征值的计算方法之幂法


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)    收藏  举报

导航