从零开始的数值分析--矩阵特征分解

# 导入numpy库,用于进行科学计算
import numpy as np

# 导入matplotlib库,用于数据可视化
import matplotlib.pyplot as plt

# 导入scipy库,用于科学计算和工程计算
import scipy as sp

# 导入sympy库,用于符号数学计算
import sympy as sym
## 约定内容

decimalNumber = 6  ##小数位数

!!!观前提醒,本章对于线性代数功底有一定要求,如果有可能还可以适当了解一下高等代数中的线性空间,若尔当标准型等内容。因本文并不涉及复矩阵与复特征值的处理,因此酉空间及其相关知识可以先放一放

对于求解方程组而言,我们的讨论已经足以解决一大部分数值解的问题,而当我们将目光放到系数矩阵的计算时,发现问题变得比较复杂.
Definition特征值与特征向量:
A ∈ R n × n A \in \mathbb{R}^{n \times n} ARn×n, λ ∈ C \lambda \in \mathbb{C} λC和非零向量 x ∈ R n x \in \mathbb{R}^n xRn满足 A x = λ x Ax = \lambda x Ax=λx,则 λ \lambda λ称为 A A A的特征值,而 x x x称为 A A A的特征向量.
因此,求解特征值就意味着求解等价问题:
( A − λ I ) x = 0 (A - \lambda I)x = 0 (AλI)x=0
在结束了特征值和特征向量定义后,我们再来补充一些特征值的性质:
Method1线性运算性:
λ \lambda λ A ∈ R n × n A \in \mathbb{R}^{n \times n} ARn×n的特征值,则有:

  1. c λ \lambda λ 为c A A A 的特征值
  2. λ − μ \lambda - \mu λμ ( A − μ I ) (A - \mu I) (AμI)的特征值
  3. λ k \lambda^k λk A k A^k Ak的特征值

Method2充要条件:

  1. 矩阵 A A A可相似对角化的充要条件是 A A A有n个线性无关的特征向量.
  2. 矩阵 A A A的不同特征值构成的特征子空间正交,即不同特征值对应的特征向量正交.

Method3Rayleigh商估计:

  1. λ 1 ≤ λ 2 ≤ . . . ≤ λ n \lambda_1 \leq \lambda_2 \leq ... \leq \lambda_n λ1λ2...λn,则 λ 1 ≤ ( A x , x ) ( x , x ) ≤ λ n \lambda_1 \leq \frac{(Ax,x)}{(x,x)} \leq \lambda_n λ1(x,x)(Ax,x)λn
  2. λ 1 = min ⁡ x ∈ R n , x ≠ 0 ( A x , x ) ( x , x ) \lambda_1 = \min_{x \in \mathbb{R^n} , x \neq 0} \frac{(Ax,x)}{(x,x)} λ1=minxRn,x=0(x,x)(Ax,x), λ n = max ⁡ x ∈ R n , x ≠ 0 ( A x , x ) ( x , x ) \lambda_n = \max_{x \in \mathbb{R^n} , x \neq 0} \frac{(Ax,x)}{(x,x)} λn=maxxRn,x=0(x,x)(Ax,x)
def Rayleigh(A,x):
    """
    瑞利商定义

    Args:
        A (Matrix): 要求对称的系数矩阵
        x (vector): 特征向量

    Returns:
        float:瑞利商的值
    """
    
    b = np.dot(A,x)
    
    return np.dot(x,b)/np.dot(x,x)
A = np.array([
    [2,5,0],
    [5,3,7],
    [0,7,6]
])

lam,x = np.linalg.eig(A)

print(Rayleigh(A,x[2]))
-3.7754908865633916

矩阵幂法求特征值简介

矩阵幂法是一种迭代算法,主要用于求解特定类型矩阵(如幂等矩阵、对称正定矩阵等)的主特征值及其对应的特征向量。该方法尤其适用于当矩阵具有特殊性质时,能够简化计算过程并提高效率。下面简要介绍矩阵幂法的基本原理及步骤。

基本原理

矩阵幂法基于以下观察:若矩阵 A A A 的最大特征值为 λ 1 \lambda_1 λ1,对应的特征向量为 v 1 \mathbf{v}_1 v1,那么对于任意非零初始向量 x 0 \mathbf{x}_0 x0,通过重复乘以矩阵 A A A(即计算 A n x 0 A^n\mathbf{x}_0 Anx0),得到的序列往往会趋近于 λ 1 n v 1 \lambda_1^n\mathbf{v}_1 λ1nv1 的方向。这是因为主特征值对应的特征向量在迭代过程中会被逐渐放大,而其他特征值对应的分量会相对减小。

步骤概述

  • 选择初始向量:选取一个非零的初始向量 x 0 \mathbf{x}_0 x0

  • 迭代计算:对于迭代次数 (n=1,2,…),执行以下操作:

  • 计算 x n = A x n − 1 \mathbf{x}_n = A\mathbf{x}_{n-1} xn=Axn1

  • 归一化:为了防止数值溢出,每次迭代后通常需要将 x n \mathbf{x}_n xn 归一化,即 x n : = x n ∣ ∣ x n ∣ ∣ \mathbf{x}_n := \frac{\mathbf{x}_n}{||\mathbf{x}_n||} xn:=∣∣xn∣∣xn

  • 终止条件:设定一个收敛准则,比如当两次迭代间的向量变化小于某个阈值时,停止迭代。

  • 估计特征值:最后得到的向量近似为最大特征值对应的特征向量,可以通过 x n T A x n / ( x n T x n ) \mathbf{x}_n^T A \mathbf{x}_n / (\mathbf{x}_n^T \mathbf{x}_n) xnTAxn/(xnTxn) 来估算主特征值 λ 1 \lambda_1 λ1

注意事项

  • 矩阵幂法对初值敏感,不同的初始向量可能收敛到不同的特征值。
  • 对于非幂等或非对称矩阵,此方法可能不会直接给出所有特征值,特别是对于复数特征值或接近的特征值情况。
  • 为了提高收敛速度和稳定性,可以采用预处理技术,如对矩阵进行对角化近似或使用加速技术(如幂迭代的改进版,如反幂迭代、共轭梯度法等)。
def PowerMethod(A,v0 = None,isRayleigh = False,tol = 1e-6,max_iter = 150,output_key = False):
    """幂法求解矩阵特征值

    Args:
        A (Matrix): 系数矩阵
        v0 (vector, optional): 迭代初始变量, Defaults to None. If None,随机初始化.
        isRayleigh (bool, optional): 采用瑞利商计算最大值. Defaults to False.
        tol (float, optional): 精度限. Defaults to 1e-6.
        max_iter (int, optional): 最大迭代上限. Defaults to 150.
        putout_key (bool, optional): 输出迭代信息. Defaults to False.
    """
    
    A = A.copy()
    
    if v0 is None:
        v0 = np.random.rand(A.shape[0])
    else:
        v0 = v0.copy()
        
        
    u0 = v0
    
    oldmu = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值