【数值分析】乘幂法,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+1∣∣∞uk+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=∣∣u0∣∣∞u0=[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=∣∣u1∣∣∞u1=[0.73331.0000]

乘幂法matlab实现

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
相关推荐
jk_1016 分钟前
MATLAB中decomposition函数用法
开发语言·算法·matlab
weixin_464078077 分钟前
C#串口温度读取
开发语言·c#
无敌の星仔9 分钟前
一个月学会Java 第2天 认识类与对象
java·开发语言
豆豆32 分钟前
为什么用PageAdmin CMS建设网站?
服务器·开发语言·前端·php·软件构建
落落落sss1 小时前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
简单.is.good1 小时前
【测试】接口测试与接口自动化
开发语言·python
Yvemil72 小时前
MQ 架构设计原理与消息中间件详解(二)
开发语言·后端·ruby
程序员是干活的2 小时前
私家车开车回家过节会发生什么事情
java·开发语言·软件构建·1024程序员节
我是陈泽2 小时前
一行 Python 代码能实现什么丧心病狂的功能?圣诞树源代码
开发语言·python·程序员·编程·python教程·python学习·python教学
优雅的小武先生2 小时前
QT中的按钮控件和comboBox控件和spinBox控件无法点击的bug
开发语言·qt·bug