解释计算约旦形式的36乘36矩阵的误差

时间:2014-02-14 00:42:20

标签: matlab matrix linear-algebra symbolic-math numerical-stability

我一直在尝试计算由36个36矩阵组成的约旦正规形式,该矩阵仅由三个不同的条目11/20组成。矩阵是一个概率转移矩阵,因此,给定这些条目,矩阵显然是稀疏的。

我遇到的问题如下:每当我尝试计算

[V, J] = jordan(A),

[V, J] = jordan(sym(A)),

我收到以下错误消息:

  

使用mupadmex时出错   MuPAD命令出错:相似度矩阵太大。

     

sym / mupadmexnout出错(第1546行)
  out = mupadmex(fcn,args {:});

     

sym / jordan中的错误(第32行)
  [Vsym,Jsym] = mupadmexnout('symobj :: jordan',A,'All');

我在MATLAB帮助中读到,Jordan形式的计算对扰动非常敏感。但是,我认为我的计算不是问题,因为矩阵的所有条目都是整数或整数比。

我的问题如下:

  1. 如何解释收到的错误输出?
  2. 我收到的错误是否可以解决?
  3. 如果错误无法解决,是否有替代方法(Matlab中的函数)我可以尝试计算Jordan表单?

2 个答案:

答案 0 :(得分:6)

1)如何解释收到的错误输出?

关键是Matlab使用符号计算来评估Jordan形式。这就是它要求你提供有理数的原因。当我们考虑数值编程时,36乘36的矩阵非常小,但是(我不确定)这个大小对于符号编程来说可能很大。

2)为什么matlab没有工具箱来评估Jordan形式的数字?

关键是此评估在数值上不稳定。见the example in Wikipedia。基本上,任何具有多个特征值(共享相同块)的矩阵的扰动都可能导致这些特征值在所需的Jordan形式的分离块中变得明显。

3)如果错误不可寻址,是否有替代方法(Matlab中的函数)我可以尝试计算Jordan形式?

我认为Matlab没有数值函数来解决这个任务。

我不确切知道你正在看什么样的应用程序......话虽如此,一个(非常常见的)选项是评估Schur form(两个转换都在上三角分解中转换矩阵),这在数值上是稳定的。它使用单一相似变换。 Matlab的schur函数实现了这一点。

另请参阅此Math.StackExchange问​​题:What's the difference between Jordan and Schur decomposition?

答案 1 :(得分:2)

我将主要讨论你问题的第三部分:计算约旦形式的替代方法。

根据您要评估的最大矩阵以及可能的Matlab版本,是的,您可以象征性地计算Jordan形式及其相似性变换。

我前一段时间a related question,所以你的问题让我再次对此进行了研究。在我的问题中,我无法使用jordan函数使用Matlab R2013a计算大于82乘82的测试矩阵的广义特征向量(与我现在使用的R2014b相同)。

更新: R2015a +似乎解决了大于82 x 82的矩阵的问题 - 至少对于下面的300 x 300测试矩阵。以下是R2015a之前的解决方法。


诀窍归结为使用不同的(可能更新的)MuPAD函数来计算Jordan形式和相关的相似变换:linalg::jordanForm而不是symobj::jordan。因为你甚至无法计算36乘36的乔丹形式,我想知道你是否使用了更旧的版本。因此,我无法保证这将在您的Matlab版本中有效。这是必要的代码:

% My test matrix
A = -eye(40);
A(1,2:end-1) = -2;
A(1,end) = -1/2;
A(2,2) = 1/2;

% [V,J] = jordan(A); doesn't work for A larger than 82-by-82
P = feval(symengine,'linalg::jordanForm',sym(A),'All');
J = double(P(1));
V = double(P(2));

我能够使用此计算300 {300}测试矩阵JV,但我的MacBook Pro上花了大约一分钟。这仍然是一种象征性的方法,对于许多符号操作来说,任何超过100乘100的东西都可能被认为是非常大的。旧版本的Symbolic Math工具箱效率更低。

顺便说一句,如果你实际上不需要相似变换V,那么你仍然可以使用J = jordan(A);而不会出错。