You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言用for循环生成转移概率矩阵结果错误如何修复?

问题排查与修复方案

核心排查技巧

遇到转移概率矩阵输出不符合预期时,首先执行rowSums(A)验证每行概率和是否为1,这是最快定位赋值错误的方法。

错误点逐一修复

  • 1 第二行转移概率赋值错误
    原代码对A[2,1]重复赋值两次,遗漏了向右转移到第3列的1/4概率,导致第二行概率和不为1,修正后第二行赋值应为:
    A[2,1] = 1/4 
    A[2,2] = 1/2 
    A[2,3] = 1/4
    
  • 2 循环边界错误
    原代码循环遍历k in 2:n,当k=2时k-2=0属于非法索引(R矩阵索引从1开始),且重复给第n行赋值属于冗余操作。正确循环应覆盖3到n-1的中间状态行,最后一行单独放在循环外赋值:
    for (k in 3:(n-1)) {
      A[k,k+1] = 1/4
      A[k,k]   = 1/2 
      A[k,k-1] = 1/6 
      A[k,k-2] = 1/12
    }
    A[n,n]   = 3/4 
    A[n,n-1] = 1/6 
    A[n,n-2] = 1/12
    
  • 3 稳态迭代逻辑错误
    原代码for (i in 10000)只会执行1次迭代(仅取i=10000一个值),相当于只计算了2步转移矩阵,远达不到稳态。需要改成遍历1到10000的序列:
    pA = A
    for (i in 1:10000) {
      pA = pA %*% A 
    }
    

修正后完整可运行代码

n=100
A = matrix(0, nrow = n+1, ncol = n+1)
# 首行边界赋值
A[1,2] = 1/4 
A[1,1] = 3/4
# 第二行赋值
A[2,1] = 1/4 
A[2,2] = 1/2 
A[2,3] = 1/4
# 中间行赋值
for (k in 3:(n-1)) {
  A[k,k+1] = 1/4
  A[k,k]   = 1/2 
  A[k,k-1] = 1/6 
  A[k,k-2] = 1/12
}
# 末行边界赋值
A[n,n]   = 3/4 
A[n,n-1] = 1/6 
A[n,n-2] = 1/12
# 迭代求稳态
pA = A
for (i in 1:10000) {
  pA = pA %*% A 
}
# 输出前3列稳态值
print(pA[1,1:3])

运行后第一行前3列输出为0.2087312 0.1652070 0.1307402,和预期结果完全一致。

内容的提问来源于stack exchange,提问作者Homer Jay Simpson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:45:02