我是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等方式实现这一目标吗?可以返回实数而不是分数吗?
非常感谢。
答案 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
,但并不总是这样。