《量化投资:以MATLAB为工具》

MATLAB技术论坛

 找回密码
 注册账号
查看: 8670|回复: 14
收起左侧

[样章] 第十二章 特征值和特征向量

  [复制链接]
发表于 2011-5-15 23:22:45 | 显示全部楼层 |阅读模式
第十二章 特征值和特征向量
工程上很多问题会归结为线性代数中的特征值与特征向量问题,排队论、层次分析法等数学问题也会涉及到特征值与特征向量的计算,很多时候直接通过定义来解高次的特征方程是无法求得的,因此利用数值方法求解是很重要的手段,常用的有幂法及反幂法、Jacobi法和Householder法.
12.1   特征值与特征向量
12.1.1   特征值与特征向量的定义

12.1.2   特征值与特征向量的计算

12.1.3   MATLAB的eig命令
MATLAB自带有eig命令,该命令返回的是矩阵的特征值与特征向量,调用格式是
  1. [P,lambda]=eig(A)
复制代码
其中A是 阶方阵,返回的P是所用的正交变换,其各个列就是A的特征向量,lambda是一个 阶对角阵,其对角线上的元素就是对应于P的A的全部特征值.见下例:
  1. >> A=[-4 -3 -7;2 3 2;4 2 7];
  2. >> [v,lambda]=eig(A)

  3. v =

  4.     0.8165    0.7071    0.4472
  5.    -0.4082    0.0000   -0.8944
  6.    -0.4082   -0.7071   -0.0000


  7. lambda =

  8.     1.0000         0         0
  9.          0    3.0000         0
  10.          0         0    2.0000
复制代码
12.2   幂法与反幂法
工程上有时只需求出绝对值(模)最大的特征值(称为矩阵的主特征值)及相应的特征向量,对于这类问题可以应用幂法.幂法是一种迭代方法,计算简单,对于稀疏矩阵更加合适,但有时收敛较慢.
12.2.1   幂法的原理

12.2.2   幂法的MATLAB实现

  1. function [vec,val]=powereig(A,epsilon)
  2. %%A为要求特征值的矩阵
  3. %%epsilon为用户所输入的精度要求
  4. %%val返回矩阵绝对值最大的特征值
  5. %%vec返回属于该特征值的特征向量
  6. %%输入参数检查
  7.    if nargin==1
  8.         disp('请输入精度要求epsilon')
  9.         return
  10.    end   

  11.     row=size(A,1);
  12.     col=size(A,2);
  13.     if ndims(A)~=2 | col~=row
  14.         disp('请输入一个2维的方阵')
  15.         return
  16.     end
  17.    
  18.    
  19.     error=epsilon*2;
  20.     start=ones(row,1);
  21.     xknext=start;
  22. %%迭代过程
  23.     while error>epsilon
  24.         xk=xknext;
  25.         xknext=A*xk;
  26.         maxabs=max(abs(xknext));
  27.         xknext=xknext/maxabs;
  28.         if min(xknext)==-1
  29.             xknext=xknext*(-1);
  30.             maxabs=maxabs*(-1);
  31.         end
  32.         error=norm(xk-xknext);
  33.     end
  34.     vec=xknext;
  35.     val=maxabs;
复制代码
12.2.3   反幂法
与幂法相反,反幂法用来计算的是非奇异矩阵的模最小的特征值及其对应的特征向量,以及计算对应于一个给定的近似特征值的特征向量.

12.2.3   反幂法的MATLAB实现

12.3   对称矩阵的特征值-Jacobi方法
12.3.1   Jacobi方法的原理
Jacobi方法是用来求实对称矩阵的特征值与特征向量的,而且不同于幂法和反幂法,Jacobi方法可以直接用数值方法求出矩阵的全部特征值与特征向量.


12.3.2   Jacobi方法的MATLAB实现
根据Jacobi方法的思想编写出MATLAB程序,本程序要求用户输入矩阵 及精度要求,程序首先判断输入的矩阵是否为实对称矩阵,然后利用矩阵的乘法来完成整个迭代过程,再进行下一步迭代,输出的 的每一列为特征向量,输出的dia为所要求的特征值,用户可通过[e,v]=Jacobieig(A,epsilon)得到输出结果,程序代码如下:

12.4   Householder方法
12.4.1   初等反射矩阵

12.4.2   用正交相似变换约化矩阵

12.4.3   算法的MATLAB实现
根据12.3.2所给出的算法,编写MATLAB程序,算法首先判断输入是否方阵,返回的是该方阵的上Hessenberg矩阵及所用的正交变换.程序源代码如下

  1. function [Hessen,H]=Hessenberg(A)
  2. %%A为要求特征值的矩阵
  3. %%Hessen返回的是该矩阵的上Hessen矩阵
  4. %%P  返回的是过渡矩阵
  5. %%输入参数检查
  6.     row=size(A,1);
  7.     col=size(A,2);
  8.     if ndims(A)~=2 | col-row~=0
  9.         disp('矩阵的大小有误,不能使用Hessenberg法')
  10.         return
  11.     end

  12.     n=col;
  13.     H0=eye(n);
  14.     for k=1:col-2
  15.         %%构造初等反射矩阵
  16.         u=A(k+1:n,k);
  17.         Norm=norm(u);
  18.         if Norm~=0
  19.             if A(k+1,k)<0
  20.                 sigma=-Norm;
  21.             else
  22.                 sigma=Norm;
  23.             end
  24.             r=sigma*(sigma+u(1));
  25.             u(1)=u(1)+sigma;
  26.             H=eye(n-k)-u*u'/r;
  27.             U=eye(n);
  28.             U(n-k:n,n-k:n)=H;
  29.             H0=H0*U;
  30.             %%变换过程
  31.             A=U'*A*U;           
  32.         end

  33.     end
  34.     H=H0;
  35.     Hessen=A;
复制代码
12.5   QR分解与QR方法
QR方法式一种变换法,是计算一般矩阵全部特征值的一种有效方法,且收敛快,算法稳定.一般情况下是将矩阵利用Householder法化为上Hessenberg矩阵,后再利用QR方法计算全部的特征值,QR方法的基础是矩阵的QR分解.
12.5.1   矩阵的QR分解

12.5.2   计算矩阵特征值的QR方法

12.5.3   QR方法的MATLAB实现


发表于 2017-6-21 05:51:40 来自手机 | 显示全部楼层
值得收藏的好去西,谢谢了。
回复 支持 反对

使用道具 举报

发表于 2017-6-21 05:50:16 来自手机 | 显示全部楼层
谢谢楼主的共享。
回复 支持 反对

使用道具 举报

发表于 2017-6-21 05:37:40 来自手机 | 显示全部楼层
好东西,谢谢楼主。
回复 支持 反对

使用道具 举报

发表于 2011-12-6 20:21:54 | 显示全部楼层
正在学习中,谢谢楼主{:soso_e178:}
发表于 2011-12-11 14:33:30 | 显示全部楼层
蓝色的海 发表于 2011-12-6 20:21
正在学习中,谢谢楼主

欢迎购买该书,并就书中具体内容进行交流讨论。
发表于 2012-3-25 17:04:17 | 显示全部楼层
请问楼主为什么看不到jacobi的程序代码呀?谢谢!
发表于 2012-3-28 13:29:49 | 显示全部楼层
发表于 2012-5-14 16:19:14 | 显示全部楼层
都是非常基础的,可以作为参考书
发表于 2012-7-12 08:41:09 | 显示全部楼层
发表于 2012-7-12 16:46:34 | 显示全部楼层
灰常灰常感谢,学习下
发表于 2012-7-15 22:28:36 | 显示全部楼层
谢谢楼主的指点。{:soso_e142:}
发表于 2012-11-11 09:50:39 | 显示全部楼层
很好呀 的   谢谢
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|MATLAB技术论坛|Simulink仿真论坛 ( 蜀ICP备19014457号 

GMT+8, 2020-2-25 10:33 , Processed in 0.063064 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表