我一直在尝试计算由36个36矩阵组成的约旦正规形式,该矩阵仅由三个不同的条目1
,1/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形式的计算对扰动非常敏感。但是,我认为我的计算不是问题,因为矩阵的所有条目都是整数或整数比。
我的问题如下:
答案 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}测试矩阵J
和V
,但我的MacBook Pro上花了大约一分钟。这仍然是一种象征性的方法,对于许多符号操作来说,任何超过100乘100的东西都可能被认为是非常大的。旧版本的Symbolic Math工具箱效率更低。
顺便说一句,如果你实际上不需要相似变换V
,那么你仍然可以使用J = jordan(A);
而不会出错。