【数值分析】反幂法,matlab实现

反幂法20231226

一种求实矩阵 A {A} A按模最小的特征值,及其对应的特征向量 x i {x_i} xi 的方法,只能求一个
要保证矩阵最小特征值只有一个,有 n {n} n 个线性无关的特征向量,矩阵可逆
可以通过求矩阵 A − 1 {A^{-1}} A1 的按模最大特征值和对应特征向量来求矩阵 A {A} A 的按模最小特征值。
每次乘完之后要规范化,防止上溢或下溢。规范化可以用各种范数。
一般会使用结合原点平移的方法来求最靠近某个数的特征值和特征向量。
步骤:
1. 求 B 矩阵     B = A − p I 2. 求初始向量 u 0 模最大元素的编号 i d    ,    初始特征值 β 0 = u 0 ( i d )    ,    求归一化后的初始向量 y 0 3. 迭代    ,    k = 0 , 1 , ⋯ u k + 1 = B − 1 y k β k + 1 = u k + 1 ( i d k ) ⋅ sign ( y k ( i d k ) )     这里要乘模最大元素的符号 y k + 1 = u k + 1 ∣ ∣ u k + 1 ∣ ∣ ∞ i d k + 1 = u k + 1 模最大元素的编号 4. 判断是否满足     β k + 1 − β k < eps    ,    特征值 = p + 1 β k + 1 \begin{align*}1. & 求B矩阵 \,\,\, B=A-pI \\ \\ 2. &求初始向量u_0模最大元素的编号 id \,\,,\,\, 初始特征值 \beta_0=u_0(id) \,\,,\,\, 求归一化后的初始向量y_0 \\ \\ 3.& 迭代 \,\,,\,\, k=0,1, \cdots \\ \\ & u_{k+1}= B^{-1}y_k \\ \\ & \beta_{k+1}=u_{k+1}(id_k) \cdot \text{sign}(y_k(id_k)) \,\,\, 这里要乘模最大元素的符号 \\ \\ & y_{k+1}= \frac{u_{k+1}}{||u_{k+1}||_\infty}\\ \\ & id_{k+1}=u_{k+1}模最大元素的编号 \\ \\ 4.& 判断是否满足 \,\,\, \beta_{k+1}- \beta_k< \text{eps} \,\,,\,\, 特征值=p+ \frac{1}{\beta_{k+1}} \end{align*} 1.2.3.4.B矩阵B=ApI求初始向量u0模最大元素的编号id,初始特征值β0=u0(id),求归一化后的初始向量y0迭代,k=0,1,uk+1=B1ykβk+1=uk+1(idk)sign(yk(idk))这里要乘模最大元素的符号yk+1=∣∣uk+1uk+1idk+1=uk+1模最大元素的编号判断是否满足βk+1βk<eps,特征值=p+βk+11

[!example]-
A = [ 3 2 1 0 ]    ,    u 0 = [ 0.95 0.25 ] A = \begin{bmatrix} 3 & 2 \\ 1 & 0 \end{bmatrix} \,\,,\,\, u_0= \begin{bmatrix} 0.95\\0.25 \end{bmatrix} A=[3120],u0=[0.950.25]
求靠近 3.5 {3.5} 3.5 的特征值及特征向量,两次迭代。特征真值 ( 3 + 17 ) / 2 { (3+ \sqrt{17})/2} (3+17 )/2
解:
A − 3.5 I = [ − 0.5 2 1 − 3.5 ] A-3.5I= \begin{bmatrix} -0.5 & 2 \\ 1 & -3.5 \end{bmatrix} A3.5I=[0.5123.5]
y 0 = u 0 ∣ ∣ u 0 ∣ ∣ ∞ = [ 1.0000 0.2632 ] y_0= \frac{u_0}{||u_0||_\infty}= \begin{bmatrix} 1.0000\\0.2632 \end{bmatrix} y0=∣∣u0u0=[1.00000.2632]
( A − 3.5 I ) u 1 = y 0 → u 1 = [ 16.1053 4.5263 ] (A-3.5I)u_1= y_0 \to u_1= \begin{bmatrix} 16.1053\\ 4.5263 \end{bmatrix} (A3.5I)u1=y0u1=[16.10534.5263]
u 1 {u_1} u1 y 0 {y_0} y0 1 {1} 1 在上面, β 1 { \beta_1} β1 第一个值为 u 1 {u_1} u1 第一个值,符号与 y 0 {y_0} y0 中的 1 {1} 1 相同。
β 1 = 16.1053 \beta_1= 16.1053 β1=16.1053
y 1 = u 1 ∣ ∣ u 1 ∣ ∣ ∞ = [ 1.0000 0.2810 ] y_1= \frac{u_1}{||u_1||_\infty}= \begin{bmatrix} 1.0000\\0.2810 \end{bmatrix} y1=∣∣u1u1=[1.00000.2810]
( A − 3.5 I ) u 2 = y 1 → u 2 = [ 16.2484 4.5621 ] (A-3.5I)u_2=y_1\to u_2= \begin{bmatrix} 16.2484\\4.5621 \end{bmatrix} (A3.5I)u2=y1u2=[16.24844.5621]
β 2 = 16.2484 \beta_2=16.2484 β2=16.2484
y 2 = u 2 ∣ ∣ u 2 ∣ ∣ ∞ = [ 1.0000 0.2808 ] y_2= \frac{u_2}{||u_2||_\infty}= \begin{bmatrix} 1.0000\\0.2808 \end{bmatrix} y2=∣∣u2u2=[1.00000.2808]
特征值
λ = 3.5 + 1 β 2 = 3.5615447 \lambda=3.5 + \frac{1}{\beta_2}=3.5615447 λ=3.5+β21=3.5615447
对应的特征向量为 y 1 {y_1} y1 或者 y 2 {y_2} y2

反幂法matlab实现

%% 反幂法例子
A = [-12 3 3; 3 1 -2; 3 -2 7];
u0 = [1.0, 1.0, 1.0]';
% A = [3 2 ;1 0]; 
% u0 = [0.95 ; 0.25004];
% format long
[beta1, v, i] = inversePowerMethod(A, u0, -13, 1e-6, 100)

%% 反幂法求模最小特征值和特征向量
% 输入矩阵、初始迭代向量、某个特征值最靠近的数、精度、最大迭代次数
% 输出特征值、无穷范数归一化后的特征向量、迭代次数
function [lbd, y1, i] = inversePowerMethod(A, u0, p, eps, max_iter)
    B = A-p*eye(size(A)); % B矩阵
    [u0norm, id] = max(abs(u0)); % 取无穷范数和其所在行
    beta0 = u0(id);
    y0 = u0/ u0norm;
    for i = 1:max_iter
        u1 = B^(-1)*y0; % 反幂法逻辑
        beta1 = u1(id)*sign(y0(id)); % !!
        [u1norm, id] = max(abs(u1));
        y1 = u1/u1norm;
        if abs(beta1 - beta0)<eps
            lbd = p+1/beta1;
            break;
        end
        y0 = y1;
        beta0 = beta1;
    end
end

你可能感兴趣的:(数值分析,matlab,机器学习,算法,数值分析,反幂法,特征值,特征向量)