幂法求矩阵的最大特征值和对应特征向量
来源:互联网 发布:卫星影像数据 编辑:程序博客网 时间:2024/04/29 05:49
【算法原理】
幂法是通过求矩阵特征向量来求出特征值的一种迭代法.其基本思想是:若我们求某个n阶方阵A的特征值和特征向量,先任取一个初始向量X(0) (注:x(0)可以用A的特征向量线性表示),构造如下序列:
X(0) ,X(1) =AX(0) ,X(2) =AX(1) ,…, X(K) =AX(K+1) ,… ⑴
当k增大时,序列的收敛情况与绝对值最大的特征值有密切关系,分析这一序列的极限,即可求出按模最大的特征值和特征向量.
假定矩阵A有n个线性无关的特征向量.n个特征值按模由大到小排列:
│λ1│>=│λ2│>=…>=│λn│ ⑵
其相应的特征向量为:
V1 ,V2 , …,Vn ⑶
它们构成n维空间的一组基.任取的初始向量X(0)由它们的线性组合给出
X(0)=a1V1+a2V2+…+anVn ⑷
由此知,构造的向量序列有
X(k) =AX(k-1) = A2X(k-2) =…=AkX(0) = a1λ1kV1+a2 λ2kV2+…+anλnkVn ⑸
下面按模最大特征值λ1是单根的情况讨论:
由此公式(5)可写成
X(k) = λ1k (a1V1+a2 (λ2/λ1)kV2+…+an(λn/λ1)kVn ) ⑹
若a1≠0,由于|λi/λ1 |<1 (i≥2),故k充分大时,
X(k) = λ1k (a1V1+εk)
其中εk为一可以忽略的小量,这说明X(k)与特征向量V1相差一个常数因子,即使a1=0,由于计算过程的舍入误差,必将引入在方向上的微小分量,这一分量随着迭代过程的进展而逐渐成为主导,其收敛情况最终也将与相同。
特征值按下属方法求得:
λ1 ≈Xj(k+1)/ Xj(k) ⑺
其中Xj(k+1), Xj(k)分别为X(k+1),X(k)的第j各分量。
实际计算时,为了避免计算过程中出现绝对值过大或过小的数参加运算,通常在每步迭代时,将向量“归一化”即用的按模最大的分量 max |Xj(k)| 1≤j≤n
去除X(k)的各个分量,得到归一化的向量Y(k),并令X(k+1) = AY(k)
由此得到下列选代公式 :
Y(k) = X(k)/║ X(k)║∞
X(k+1) = AY(k) k=0,1,2,… ⑻
当k充分大时,或当║ X(k)- X(k+1)║<ε时,
Y(k)≈V1
max |Xj(k)| ≈ λ1 ⑼
1≤j≤n
由于CSDN博客的编辑器不太好用,所以关于幂法求特征值的详细解释请参考《数值分析》(第三版) 北航出版的教材的相关内容。下面给出本书P50例题的源代码:
#include <iostream>#include <math.h>using namespace std;#define N (3)/************************************************************************//*求向量按模最大值(相当于向量的无穷范数)*//************************************************************************/double GetMax(double *Array){double max=0;for (int i=0;i<N;++i){if (max < fabs(*(Array+i))){max = fabs(*(Array+i));}}return max;}/************************************************************************//*矩阵相乘函数*//************************************************************************/void matrixMulti(double array[3][3],double *a0){int i ,j; double *result = new double[3];memset(result,0,3*sizeof(double));for (i=0;i<N;++i){for (j =0;j<N;++j){result[i]+=array[i][j]*a0[j];}cout<<"a0["<<i<<"]=" <<result[i]<<endl;}for (i=0;i<N;++i){*(a0+i)=result[i];}delete [] result;}int main(){double array[N][N] = {{6,-12,6},{-21,-3,24},{-12,-12,51} };//矩阵Adouble a0[N]={1,0,0};//初始向量int count=0;//迭代次数double maxElemt1,maxElemt2;do{++count; maxElemt1=GetMax(a0);for (int j=0 ;j<N;++j){*(a0+j)=*(a0+j)/maxElemt1;//列向量归一化}matrixMulti(array,a0);maxElemt2 = GetMax(a0);cout<<"maxElemt2 = "<<maxElemt2<<endl<<endl;}while(fabs((maxElemt2-maxElemt1)/maxElemt1 )> 0.00000001);cout<<"迭代次数n = "<<count<<endl;;cout<<"特征值="<<maxElemt2<<endl;return 0;}
最终结果如下图所示:
- 幂法求矩阵的最大特征值和对应特征向量
- 幂法求矩阵的主特征值和特征向量
- 矩阵的特征值和特征向量
- 矩阵的特征值和特征向量
- 矩阵的特征值和特征向量
- 矩阵的特征值和特征向量
- 矩阵的特征值和特征向量
- 数值分析 幂法求矩阵A按模最大的特征值和相应的特征向量
- 矩阵特征值和特征向量
- 矩阵的特征值及相关矩阵特征值和特征向量公式
- 幂法求矩阵特征向量和特征值的C语言程序
- 幂法求矩阵特征向量和特征值的C语言程序
- 稠密矩阵特征值和特征向量的计算
- OpenCV求矩阵的特征值和特征向量
- 矩阵特征值和特征向量的理解
- 矩阵特征值和特征向量的深层次理解
- 矩阵的特征值和特征向量【转】
- 求hession矩阵的特征值和特征向量
- 1月15号
- 活动选择问题 贪心
- openGL es2.0 创建可移动的纹理平面
- Javamelody下载地址、使用&一步解决Javamelody中文乱码(英文表示)
- 最长上升子序列nlogn算法(poj 2533 && SDUT 1299)
- 幂法求矩阵的最大特征值和对应特征向量
- 基数排序与通排序
- 架构
- mysql性能优化
- 外观模式(Facade Patter)
- FOJ 1036 四塔问题
- Linux epoll 多路复用机制
- [FFMPEG-3]移植到安卓
- 区间覆盖问题 贪心