如何在短时间内解决Sage中的离散时间Markov链

时间:2014-05-25 05:21:11

标签: octave sage markov-chains

我是Sage的新手。

我可以使用这个简短的代码解决Octave上的DTMC:

a = 0.2
s = 0.6
P = [
  (1-a)*(1-a), (1-a)*a,     a*(1-a),     a*a;
  (1-a)*s,     (1-a)*(1-s), a*s,         a*(1-s);
  s*(1-a),     s*a,         (1-s)*(1-a), (1-s)*a;
  0,           s*(1-s),     (1-s)*s,     (1-s)*(1-s)+s*s;
  ]

pis = [P' - eye(size(P)); ones(1, length(P))] \ [zeros(length(P), 1); 1]

我希望能够在Sage中做类似的事情。到目前为止,我可以使用以下代码解决它们:

a = 0.2
s = 0.6
P = matrix(RR, 4, [
  [(1-a)*(1-a), (1-a)*a,        a*(1-a),        a*a],
  [(1-a)*s,     (1-a)*(1-s),    a*s,            a*(1-s)],
  [s*(1-a),     s*a,            (1-s)*(1-a),    (1-s)*a],
  [0,           s*(1-s),        (1-s)*s,        (1-s)*(1-s)+s*s]
  ]);
I = matrix(4, 4, 1); # I; I.parent()
s0, s1, s2, s3 = var('s0, s1, s2, s4')
eqs = vector((s0, s1, s2, s3)) * (P-I); eqs[0]; eqs[1]; eqs[2]; eqs[3]
pis = solve([
  eqs[0] == 0,
  eqs[1] == 0,
  eqs[2] == 0,
  eqs[3] == 0,
  s0+s1+s2+s3==1], s0, s1, s2, s3)

不幸的是,代码不能很好地扩展,我必须手动编辑代码以包含等式的条件等于零。

有可能以Octave等方式实现这一目标吗?可以返回实数而不是分数吗?

非常感谢。

1 个答案:

答案 0 :(得分:0)

我认为我们可以使用与Octave中使用的代码类似的代码创建矩阵,但使用Python语法。有快捷方式构造函数,它们只有不同的名称。

a = 0.2
s = 0.6
P = matrix(RR, 4, [
  [(1-a)*(1-a), (1-a)*a,        a*(1-a),        a*a],
  [(1-a)*s,     (1-a)*(1-s),    a*s,            a*(1-s)],
  [s*(1-a),     s*a,            (1-s)*(1-a),    (1-s)*a],
  [0,           s*(1-s),        (1-s)*s,        (1-s)*(1-s)+s*s]
  ]);
M = (P.conjugate_transpose() - identity_matrix(P.ncols())).stack(matrix(1,P.ncols(),[1]*P.ncols()))
V = vector( [0]*P.ncols()+[1])

然而,也许我在翻译中遗漏了一些东西;我对Octave不是很熟悉,只是查看了文档。但是素数似乎是共轭转置,眼睛似乎是身份,而且是全部的,而零是零。

sage: M \ V
ValueError: matrix equation has no solutions

我注意到你的回答here所以我假设你可以从这里开始。也许反斜杠运算符的Sage实现存在转置差异?

关于分数,这是因为Maxima提供了Sage的求解机制,并且它更符合符号 - 所以尽可能使用分数。我们尽可能地尝试keepfloat:true,但并不总是这样。