大型矩阵的特征值问题,以及如何寻找某一参考值附近的特征值
(2015-09-18 21:06:13)
标签:
杂谈 |
分类: 菜B学MATLAB |
1.引言
矩阵的特征值求解,是线性代数中一个很基础的话题,也是在科学计算中广泛应用的一个工具。我们知道,描述很多物理模型的工具是ODE或者是PDE,而对其进行数值求解通常会将问题转化为一个大型矩阵的特征值问题。当然,特征值求解的应用远不止于此,还有图形处理、数据去重等等笔者所不知道的。
大型矩阵的特征值问题是计算数学领域里一个比较热门的话题,计算方法多种多样,针对矩阵的性质(如对称,三对角,稀疏等等)也有不同的算法。至于计算软件包,不得不提的是ARPACK和LAPACK,两者都是Fortran的库,笔者没有接触过,这里不涉及。作为一个菜鸟,所幸Matlab的两个函数也挺好用。特别是eigs函数。其实这个函数调用的库函数就是ARPACK。
然而,线性代数告诉我们,对于一个N阶的方阵其特征值也必然是有N个!(n重根算n个)。那么对于大型矩阵,比如我所用到的5000*5000矩阵,其特征值就有5000个之多。但实际上,我们感兴趣的只有那么几个而已。那么问题来了,如何寻找我们感兴趣范围的某一些特征值呢?
2.eig和eigs的比较
求矩阵特征值,matlab只提供了这两个函数
[V D]=eig()
这个函数是求出矩阵所有的特征值,D为特征值矩阵(对角线上为特征值),V为特征向量矩阵(特征向量为列向量与D中特征值相对应)。前面提到了,对于大型矩阵的话,5000*5000就要求出5000个特征值,不仅费时,而且还不利于筛选有用的特征值。所以,本函数不适用。
[V D]=eigs()
这个函数专门用来计算大型矩阵的特征值问题,并且可以针对不同类型的矩阵做出算法优化,最强大的是,可以设定求解出最大或最小的k个特征值,之所以如此强大因为它调用的是ARPACK的库(本菜帮助文档看到这里的时候才了解到ARPACK的强大!)。
3.重点讲解eigs()
寻找某一参考值附近的特征值的语法是
eigs(A,k,sigma)
A是矩阵,k是特征值个数,sigma是个可选参量,sigma不同取值决定了eigs寻找特征值的方式,主要有如下几种:
1.sigma为标量:找出最靠近sigma的k个特征值
2.sigma为字符变量
|
|
|
求模值最大的k个特征值 |
|
|
|
求值最小的k个特征值 |
|
求最大和最小的k个特征值 |
|
|
|
|
|
虚部最大的k个 |
|
虚部最小的k个 |
如果使用sigma字符变量的同时想确定某一参考值,笔者的做法是:
将特征值方程做一下改动 : Ax=lx →
(A-bI)x=(l-b)x
然后使用sigma的字符指令,就可以在b附近寻找特征值