美好的一天, 我试图模拟以下情况。
有一个系统,可以处于三种状态。状态M1,M2和M3。 从状态M1,它可以以概率p1进入状态2。 从状态M2,它可以以概率p2进入状态1,并以概率p3进入状态3。 从状态M3,它可以以概率p4进入状态2。
现在我第一次尝试解决这个问题的方法是使用三个耦合微分方程系统
但这似乎并没有起作用,因为当我尝试绘制解决方案时,我并没有真正看到预期的动态。
所以我想尝试以离散的方式解决它,但老实说我不知道从哪里开始。我的猜测是,这样做的一个更简单的方法是使用matlab?
至于边界条件,我想考虑从M1开始。
现在我知道我真的没有给你太多,但老实说,我不知道从哪里开始。所以我的问题基本上归结为我应该如何开始解决这个问题,是否有任何密切相关的问题我可以查看,看看他们是如何处理的?
亲切的问候
编辑:可能有用的是要注意我这样做是为了找出系统在每个州平均花费多长时间。我想最终将其与数据相匹配,以便找到概率。
答案 0 :(得分:0)
如评论中所述,这看起来很像Markov chain。在您的情况下,转换矩阵M
由
M = [1-p1, p2, 0
p1, 1-p2-p3, p4
0, p3, 1-p4];
请注意,所有列必须总和为1.当前概率由状态向量给出,状态向量是一个列向量,也必须总和为1.假设您从状态1开始:state = [1; 0; 0]
,然后n
转换后的状态向量为M^n * state
。参见例如数学here。
但是,正如你所说,你想知道如何对这样一个过程进行具体的模拟,而不是知道概率如何随时间变化。这可以这样做(未经测试):
state = 1; % start state
while not_stopped()
do_stuff(state);
transition_prob = M(:, state); % get the appropriate column
state = weighted_randi(transition_prob)
end
将do_stuff
替换为您要为该状态执行的任何操作,例如,将某个向量中的当前状态记录下来以便以后绘图。函数weighted_randi
可以这样定义(受this answer启发):
function R = weighted_randi(weights)
% returns an integer from the range 1:length(weights) with probability
% given by the weights
[~, R] = histc(rand(), cumsum([0; weights(:) ./ sum(weights)]));
答案 1 :(得分:0)
我尝试使用上面概述的Bas方法进行解决,虽然我确实得到了某个地方,但我还是无法完全实现它。但是,根据我收到的所有评论,我能够使搜索更准确,我发现了post
使用这个,我能够用主要海报给出的代码做我想要的。我知道编写自己的代码而不是复制别人的代码要好得多,但我已经确保理解那里的每一步,为了我的目的,我对此感到满意。我想再次感谢你的帮助!