我有一个矩阵,例如这个例子(我的实际矩阵可以大得多)
A = [-1 -2 -0.5;
0 0.5 0;
0 0 -1];
只有两个线性无关的特征值(重复特征值-1)。我希望通过generalized eigenvectors获得完整的基础。我知道如何做到这一点的一种方法是使用符号数学工具箱中的Matlab jordan
函数,但我更喜欢为数字输入设计的东西(实际上,有两个输出,{{1} }对于大型矩阵失败:" MuPAD命令出错:相似性矩阵太大。")。我不需要Jordan规范形式,这在数值上下文中是非常不稳定的,只是一个广义特征向量的矩阵。是否有函数或函数组合以数字稳定的方式自动执行此操作,或者必须使用the generic manual method(这样的过程有多稳定)?
注意:通过"广义特征向量,"我的意思是非零向量,可用于增加所谓的defective matrix的不完整基础。我并不是指使用jordan
或eig
解决generalized eigenvalue problem得到的特征值所对应的特征向量(虽然后一种用法很常见,但我会说#&} 39;最好避免)。除非有人能纠正我,否则我不相信这两者是一样的。
更新1 - 五个月后:
参见my answer here,了解如何为大于82×82的矩阵(本问题中我的测试矩阵的极限)符号化地获得广义特征向量。
我仍然对数字方案感兴趣(或者如果这些方案与计算Jordan形式有关,那么这些方案可能会如何不稳定)。我不希望盲目地实施已被标记为此问题的副本的线性代数101方法,因为它不是数值算法,而是用于评估学生的铅笔和纸张方法(I假设它可以象征性地实现但是)。如果有人能指出我对该方案的实施或对其进行数值分析,我对此感兴趣。
更新2 - 2015年2月:在R2014b测试中,所有上述内容仍然如此。
答案 0 :(得分:0)
正如我的评论中所提到的,如果您的矩阵存在缺陷,但您知道哪个特征向量/特征值对在考虑到容差时要考虑相同,则可以按照以下示例进行操作:
% 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)
不是满秩。所以我们使用pseudoinverses:
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
这是我们的其他广义特征向量。如果我们现在检查这些以获得这样的jordan normal形式:
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正常形式(有工作精度误差)。