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

SageMath中prob_k函数变量替换失效问题求助

问题:SageMath中变量替换未生效的原因及解决办法

我尝试在SageMath中实现如下函数prob_k:

def prob_k(p_uv_list, tw):
    probs = []
    w, k = var('w, k')
    # compute probability of generating k entanglements, k=1..w
    for tk in range(tw):
        pk = binomial(w, k)*(p_uv_list[tk]**k)*(1-p_uv_list[tk])**(w-k).subs({x:tw,k:tk})
        probs += [pk]
    return probs

函数输入为概率列表和整数,我期望输出通过公式计算得到的概率列表,但实际得到的结果为:

[0.500000000000000^k*0.500000000000000^w*binomial(w, k),
 0.500000000000000^k*0.500000000000000^(w - 1)*binomial(w, k),
 0.500000000000000^k*0.500000000000000^(w - 2)*binomial(w, k)]

为何变量w和k未被替换为tw和tk?


原因分析

  • 替换范围太窄:你只给(1-p_uv_list[tk])**(w-k)这一部分加了.subs(),前面的binomial(w, k)和p_uv_list[tk]**k完全没被处理,自然保留了符号变量w和k。
  • 替换变量名写错:替换字典里的x是不存在的符号,你要替换的是w,所以应该写成w:tw而不是x:tw。

修正后的代码

def prob_k(p_uv_list, tw):
    probs = []
    w, k = var('w, k')
    # compute probability of generating k entanglements, k=1..w
    for tk in range(1, tw+1):  # 原range(tw)生成0到tw-1,不符合k=1..w的需求,调整范围
        pk = binomial(w, k)*(p_uv_list[tk-1]**k)*(1-p_uv_list[tk-1])**(w-k)
        pk = pk.subs({w: tw, k: tk})  # 对整个表达式执行替换
        probs.append(pk)
    return probs

额外说明:

  • 原代码的range(tw)会遍历0到tw-1的tk值,但注释标注的是k=1..w,所以要把循环范围改成range(1, tw+1),同时列表索引对应改成tk-1,避免出现索引越界问题。
  • 替换时要确保所有需要替换的符号变量都在字典里,{w: tw, k: tk}才是正确的映射关系。

内容的提问来源于stack exchange,提问作者Qubix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 02:23:11