【问题标题】:Finding generalized eigenvectors numerically in Matlab在 Matlab 中以数值方式查找广义特征向量
【发布时间】:2013-09-03 20:57:06
【问题描述】:

我有一个像这个例子这样的矩阵(我的实际矩阵可能要大得多)

A = [-1 -2   -0.5;
      0  0.5  0;
      0  0   -1];

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

注意:“广义特征向量”是指一个非零向量,可用于增强所谓的defective matrix 的不完全基。我并不是指与使用eigqz 求解generalized eigenvalue problem 获得的特征值相对应的特征向量(尽管后一种用法很常见,但我认为最好避免使用)。除非有人能纠正我,否则我不相信两者是相同的。


更新 1 - 五个月后:

请参阅my answer here,了解如何以符号方式为大于 82×82 的矩阵获取广义特征向量(此问题中我的测试矩阵的限制)。

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

更新 2 - 2015 年 2 月:以上所有内容在 R2014b 中测试仍然正确。

【问题讨论】:

  • @natan:那么我建议你将此问题标记为重复。
  • @natan:是的,我看到了那个问题/答案。它不是重复的。它基本上是一个手动程序,可以复制许多教科书和维基百科中显示的内容。我自己知道如何获得广义特征值 - 我正在寻找更独立的东西,并且使用内置例程来小心数字问题。你知道什么或任何算法吗?此外,仅供参考,eigensys 在 R2013a 中不再存在,eig(sym(A)) 必须使用。
  • @DavidHeffernan:对于特定的测试矩阵,错误恰好出现在 83×83 处。
  • @DavidHeffernan:就我感兴趣的最终尺寸而言,这些矩阵代表了动态神经网络节点的行为,因此系统可以轻松拥有 100 多个维度。这些矩阵,雅可比矩阵,非常稀疏,所以最好有一种可以利用它的方法。
  • @reverse_engineer:是的,据我所知,Jordan 形式没有数值稳定的算法。但是,我对 Jordan 形式本身并不感兴趣,它只是一种直接获得广义特征值的稳定方法,这样我就可以形成一个完整的基础——或者这两者是否有着千丝万缕的联系?

标签: matlab matrix eigenvector


【解决方案1】:

如我的 cmets 中所述,如果您的矩阵有缺陷,但您知道在给定容差的情况下您想将哪个特征向量/特征值对视为相同,您可以按照以下示例继续:

% 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)

这应该输出:

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

我们看到前三个特征向量与工作精度几乎相同,最后两个特征向量也是如此。在这里,您必须知道问题的结构并确定相同特征值的相同特征向量。在这里,特征值是完全相同的,所以我们知道要考虑哪些,我们将假设对应的向量 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);

应该给:

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

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

jordanJ = [vecs(:,1) genvec21 genvec22 vecs(:,4) genvec1];
jordanJ^-1*A*jordanJ

我们得到:

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

这是我们的 Jordan 范式(存在工作精度误差)。

【讨论】:

  • 我不确定这在数值上如何稳定?它看起来是寻找广义特征值的基本方法的一种形式。对于具有许多重复特征值的任何相当大的矩阵,可以有效地将pinv(A - vals(1,1)*eye(size(A))) 与自身相乘很多次。
  • 我确实喜欢以某种方式利用结构的想法——至少在某些情况下是这样,但这似乎不像你在这里所做的那样。似乎可以为my example here 设计类似的东西,它只有两个唯一的特征值,一个被重复 N-1 次。在某些情况下,置换/移动特征向量值可能会起作用吗?
  • @horchler 嗯,是的,如果一个特征值重复很多次,这种乘法可能会不稳定,但我怀疑这在实践中很少见,不?...我认为您只需要一种计算广义特征向量的非符号方式,这确实是直接的方式。但是我现在读的越多(可能没有你读的那么多),越明显地避免了这个问题,而是使用了像 Schur 这样的替代方案。互联网上关于这方面的信息很少……祝你的研究好运!
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多