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
相关产品推荐
相关产品推荐

