7

我一直在尝试计算 36×36 矩阵的约旦范式,该矩阵仅由三个不同的条目11/2和组成0。该矩阵是一个概率转移矩阵,因此,鉴于这些条目,该矩阵显然是稀疏的。

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

[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 形式?
4

2 回答 2

6

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

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

2) 为什么 matlab 没有工具箱来对 Jordan 形式进行数值评估?

关键是这个评估在数值上是不稳定的。请参阅Wikipedia 中的示例。基本上,具有多个特征值(共享同一块)的矩阵的任何扰动都可能导致这些特征值在所需约旦形式的分离块中变得不同。

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

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

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

另请参阅此 Math.StackExchange 问题:Jordan 和 Schur 分解之间有什么区别?

于 2014-02-14T02:10:49.627 回答
2

我将主要解决您问题的第三部分:计算乔丹形式的替代方法。

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

不久前我有一个相关的问题,所以你的问题让我再次研究这个问题。在我的问题中,我无法使用该jordan函数使用 Matlab R2013a(与我现在使用的 R2014b 相同)计算大于 82×82 的测试矩阵的广义特征向量。

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


诀窍归结为使用不同的(可能是更新的)MuPAD函数来计算 Jordan 形式和相关的相似度变换:linalg::jordanForm而不是symobj::jordan. 因为您甚至无法计算 36×36 的 Jordan 形式,所以我想知道您是否使用的是更旧的版本。所以我不能保证这将适用于你的 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));

我能够使用它计算J300 V×300 的测试矩阵,尽管在我的 MacBook Pro 上确实需要大约一分钟。这仍然是一种符号方法,对于许多符号操作来说,任何超过 100×100 的东西都可能被认为是相当大的。旧版本的符号数学工具箱效率更低。

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

于 2014-02-14T16:14:54.627 回答