在Matlab中以数字方式寻找广义特征向量

hor*_*ler 10 matlab matrix eigenvector

我有一个矩阵,例如这个例子(我的实际矩阵可以大得多)

A = [-1 -2   -0.5;
      0  0.5  0;
      0  0   -1];
Run Code Online (Sandbox Code Playgroud)

只有两个线性无关的特征值(重复特征值-1).我想用广义特征向量获得完整的基础.我知道如何做到这一点的一种方法是使用Matlab jordan在Symbolic Math工具箱中的功能,但我更喜欢为数字输入设计的东西(实际上,有两个输出,jordan大型矩阵失败:"MuPAD命令出错:相似矩阵太大").我不需要Jordan规范形式,这在数字上下文中是非常不稳定的,只是一个广义特征向量的矩阵.是否有函数或函数组合以数字稳定的方式自动执行此操作,或者必须使用通用的手动方法(这样的过程有多稳定)?

注意:通过"广义特征向量",我指的是一个非零向量,可用于增加所谓的有缺陷矩阵的不完全基础.我并不是指使用或通过解决广义特征值问题而得到的特征值的特征向量(尽管后一种用法很常见,但我认为最好避免使用).除非有人能纠正我,否则我不相信这两者是一样的.eigqz


更新1 - 五个月后:

请参阅我的答案,了解如何为大于82乘82的矩阵(本问题中的测试矩阵的极限)符号化地获取广义特征向量.

我仍然对数字方案感兴趣(或者如果这些方案都与计算Jordan形式有关,那么这些方案可能会如何不稳定).我不希望盲目地实现已被标记为此问题的副本的线性代数101方法,因为它不是数值算法,而是用于评估学生的铅笔和纸张方法(我认为它可以实现但象征性地).如果有人能指出我对该方案的实施或对其进行数值分析,我会对此感兴趣.

更新2 - 2015年2月:在R2014b中测试的所有上述内容仍然是正确的.

rev*_*eer 1

正如我在评论中提到的,如果您的矩阵有缺陷,但您知道在给定容差的情况下您希望将哪些特征向量/特征值对视为相同,则可以按照下面的示例继续操作:

% example matrix A:
A = [1 0 0 0 0; 
     3 1 0 0 0; 
     6 3 2 0 0; 
     10 6 3 2 0;
     15 10 6 3 2]
% Produce eigenvalues and eigenvectors (not generalized ones)
[vecs,vals] = eig(A)
Run Code Online (Sandbox Code Playgroud)

这应该输出:

vecs =

     0         0         0         0    0.0000
     0         0         0    0.2236   -0.2236
     0         0    0.0000   -0.6708    0.6708
     0    0.0000   -0.0000    0.6708   -0.6708
1.0000   -1.0000    1.0000   -0.2236    0.2236


vals =

 2     0     0     0     0
 0     2     0     0     0
 0     0     2     0     0
 0     0     0     1     0
 0     0     0     0     1
Run Code Online (Sandbox Code Playgroud)

我们看到前三个特征向量与工作精度几乎相同,最后两个特征向量也是如此。在这里,您必须了解问题的结构并识别相同特征值的相同特征向量。在这里,特征值完全相同,因此我们知道要考虑哪些特征值,并且我们假设对应的向量 1-2-3 和向量 4-5 是相同的。(实际上,您可能会检查特征向量差异的范数并将其与您的容差进行比较)

现在我们继续计算广义特征向量,但是用 matlab 的 简单求解是病态的\,因为显然(A - lambda*I)不是满秩的。所以我们使用伪逆:

genvec21 = pinv(A - vals(1,1)*eye(size(A)))*vecs(:,1);
genvec22 = pinv(A - vals(1,1)*eye(size(A)))*genvec21;
genvec1 = pinv(A - vals(4,4)*eye(size(A)))*vecs(:,4);
Run Code Online (Sandbox Code Playgroud)

这应该给出:

genvec21 =

   -0.0000
    0.0000
   -0.0000
    0.3333
         0

genvec22 =

    0.0000
   -0.0000
    0.1111
   -0.2222
         0

genvec1 =

    0.0745
   -0.8832
    1.5317
    0.6298
   -3.5889
Run Code Online (Sandbox Code Playgroud)

这是我们的其他广义特征向量。如果我们现在检查这些以获得乔丹范式,如下所示:

jordanJ = [vecs(:,1) genvec21 genvec22 vecs(:,4) genvec1];
jordanJ^-1*A*jordanJ
Run Code Online (Sandbox Code Playgroud)

我们获得:

ans =

2.0000    1.0000    0.0000   -0.0000   -0.0000
     0    2.0000    1.0000   -0.0000   -0.0000
     0    0.0000    2.0000    0.0000   -0.0000
     0    0.0000    0.0000    1.0000    1.0000
     0    0.0000    0.0000   -0.0000    1.0000
Run Code Online (Sandbox Code Playgroud)

这是我们的乔丹范式(有工作精度误差)。