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

乘幂法

一种求实矩阵 A {A} A按模最大的特征值,及其对应的特征向量 x i {x_i} xi 的方法,只能求一个。特别适合于大型稀疏矩阵。
一个矩阵的特征值和特征向量可以通过矩阵不断乘以一个初始向量得到。
每次乘完之后要规范化,防止上溢或下溢。规范化可以用各种范数。
要保证矩阵最大特征值只有一个,有 n {n} n 个线性无关的特征向量。
有多个相同特征值时,求得的特征向量可以近似看成排第一个的最大特征值的特征向量。
步骤:
1. 求初始向量 u 0 模最大元素的编号 i d    ,    初始特征值 β 0 = u 0 ( i d )    ,    求归一化后的初始向量 y 0 2. 迭代    ,    k = 0 , 1 , ⋯ u k + 1 = A y k β k + 1 = u k + 1 ( i d k ) y k + 1 = u k + 1 ∣ ∣ u k + 1 ∣ ∣ ∞ i d k + 1 = u k + 1 模最大元素的编号 3. 判断是否满足     β k + 1 − β k < eps    ,    特征值 = β k + 1 \begin{align*}1. &求初始向量u_0模最大元素的编号 id \,\,,\,\, 初始特征值 \beta_0=u_0(id) \,\,,\,\, 求归一化后的初始向量y_0 \\ \\ 2.& 迭代 \,\,,\,\, k=0,1, \cdots \\ \\ & u_{k+1}=Ay_k \\ \\ & \beta_{k+1}=u_{k+1}(id_k) \\ \\ & y_{k+1}= \frac{u_{k+1}}{||u_{k+1}||_\infty} \\ \\ & id_{k+1}=u_{k+1}模最大元素的编号 \\ \\ 3.& 判断是否满足 \,\,\, \beta_{k+1}- \beta_k< \text{eps} \,\,,\,\, 特征值= \beta_{k+1} \end{align*} 1.2.3.求初始向量u0模最大元素的编号id,初始特征值β0=u0(id),求归一化后的初始向量y0迭代,k=0,1,uk+1=Aykβk+1=uk+1(idk)yk+1=∣∣uk+1uk+1idk+1=uk+1模最大元素的编号判断是否满足βk+1βk<eps,特征值=βk+1

[!example]-
A = [ 1 2 1 3 ]    ,    u 0 = [ 0.6 0.8 ] A= \begin{bmatrix} 1 & 2 \\ 1 & 3 \end{bmatrix} \,\,,\,\, u_0= \begin{bmatrix} 0.6\\0.8 \end{bmatrix} A=[1123],u0=[0.60.8]
解:
y 0 = u 0 ∣ ∣ u 0 ∣ ∣ ∞ = [ 0.75 1.00 ] y_0= \frac{u_0}{||u_0||_\infty}= \begin{bmatrix} 0.75\\ 1.00 \end{bmatrix} y0=∣∣u0u0=[0.751.00]
u 1 = A y 0 = [ 2.75 3.75 ] u_1=Ay_0 = \begin{bmatrix} 2.75\\3.75 \end{bmatrix} u1=Ay0=[2.753.75]
y 0 {y_0} y0 1 {1} 1 在下面,所以近似最大特征值
β 1 = 3.75 \beta_1= 3.75 β1=3.75
特征向量
y 1 = u 1 ∣ ∣ u 1 ∣ ∣ ∞ = [ 0.7333 1.0000 ] y_1= \frac{u_1}{||u_1||_\infty}= \begin{bmatrix} 0.7333\\ 1.0000 \end{bmatrix} y1=∣∣u1u1=[0.73331.0000]

乘幂法matlab实现

%% 乘幂法例子
A = [12 6 -6; 6 16 2; -6 2 16];
u0 = [1.0, 0.5, -0.5]';
format long
[beta1, i] = powerMethod(A, u0, 1e-6, 10)

%% 乘幂法求模最大特征值和特征向量
% 输入矩阵、初始迭代向量、精度、最大迭代次数
% 输出特征值、无穷范数归一化后的特征向量、迭代次数
function [lbd, y1, i] = powerMethod(A, u0, eps, max_iter)
    [u0norm, id] = max(abs(u0)); % 取无穷范数和其所在行
    beta0 = u0(id);
    y0 = u0/ u0norm;
    for i = 1:max_iter
        u1 = A*y0;
        beta1 = u1(id);
        [u1norm, id] = max(abs(u1));
        y1 = u1/u1norm;
        if abs(beta1 - beta0)<eps
            lbd = beta1;
            break;
        end
        y0 = y1; % 当前变成过去
        beta0 = beta1;
    end
end

相关推荐

  1. 数值分析乘幂matlab实现

    2023-12-28 12:18:06       50 阅读
  2. 数值分析】追赶解三对角方程组,matlab实现

    2023-12-28 12:18:06       40 阅读
  3. 层次分析matlab代码实现

    2023-12-28 12:18:06       25 阅读
  4. 数值分析】choleskey分解matlab实现

    2023-12-28 12:18:06       62 阅读
  5. matlab实现四种数值积分运算

    2023-12-28 12:18:06       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-28 12:18:06       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-28 12:18:06       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-28 12:18:06       87 阅读
  4. Python语言-面向对象

    2023-12-28 12:18:06       96 阅读

热门阅读

  1. ES6新增的 Symbol

    2023-12-28 12:18:06       66 阅读
  2. 【算法题】24. 两两交换链表中的节点

    2023-12-28 12:18:06       58 阅读
  3. ansible加密

    2023-12-28 12:18:06       42 阅读
  4. MySQL 5.7服务器系统变量参考

    2023-12-28 12:18:06       54 阅读
  5. SpringMVC之获取请求参数和域对象共享数据

    2023-12-28 12:18:06       50 阅读
  6. 模型评估指标

    2023-12-28 12:18:06       54 阅读
  7. 郝斌老师 sql 语句笔记

    2023-12-28 12:18:06       44 阅读