MATLAB中矩阵的不精确性

时间:2013-06-23 22:28:03

标签: matlab matrix markov-chains markov

当我感到无聊时,我检查了重新定义MARKOV链的转移矩阵的平稳定理。所以我定义了一个简单的例子:

>> T=[0.5 0.5 0; 0.5 0 0.5; 0.2 0.4 0.4];

静止定理说,如果你计算过渡矩阵到一个非常高的幂,那么你将得到静止矩阵,它的主要成分在行。所以试试吧:

>> T^1000
ans =

0.4211    0.3158    0.2632
0.4211    0.3158    0.2632
0.4211    0.3158    0.2632

到目前为止一切都很好。让我们继续:

>> T^1000000000
ans =

0.4211    0.3158    0.2632
0.4211    0.3158    0.2632
0.4211    0.3158    0.2632
好的......好的。我们再多花一点零:

>> T^10000000000

ans =

0.4210    0.3158    0.2632
0.4210    0.3158    0.2632
0.4210    0.3158    0.2632

???有些事情发生了变化......让我们尝试更多:

>> T^10000000000000000

ans =

1.0e-03 *

0.5387    0.4040    0.3367
0.5387    0.4040    0.3367
0.5387    0.4040    0.3367

这里发生了什么,甚至行数总和不再是1

 >> T^10000000000000000000

 ans =

 0     0     0
 0     0     0
 0     0     0

Aaaand已经不见了。

我用R2011a尝试了这个。 我猜在背景中有一些奇特的算法,它近似于矩阵的这种高功率。但这怎么可能发生呢?哪种算法能够在这样的计算中快速执行,并且在这种极端情况下会出现这种错误?

2 个答案:

答案 0 :(得分:1)

可以使用Eigen Decomposition以便可以达到这样的速度

实际计算负荷正在进行这种分解,然后通过计算本征值的功率,可以容易地计算功率。它还说明了为什么将计算分成像2这样的较小权力需要花费更多时间的原因。

答案 1 :(得分:1)

一个人都说过,原因是浮点精度。解决方案?可变精度算术,在符号数学工具箱中,如果有的话。只需使用vpa初始化矩阵,如下所示:

T=vpa([0.5 0.5 0; 0.5 0 0.5; 0.2 0.4 0.4],100);

T^10000000000000000000获得正确的输出:

[0.42105263157894736842099364708441, 0.31578947368421052631574523531331, 0.26315789473684210526312102942776]
[0.42105263157894736842099364708441, 0.31578947368421052631574523531331, 0.26315789473684210526312102942776]
[0.42105263157894736842099364708441, 0.31578947368421052631574523531331, 0.26315789473684210526312102942776]