如何在同情中进行“反向”替换?

时间:2017-05-20 07:24:49

标签: python sympy

我需要找到并用符号替换子表达式,对其进行“反向”替换。

这是直接替换示例:
simplifycollect已添加,以使生成的表达式具有我需要使用的格式)

In [1]: from sympy.abc import a, b, x, y, z
   ...: expr = (1 + b) * z + (1 + b) * y
   ...: z_expr = a / (1 + b) + x
   ...: subs_expr = expr.subs(z, z_expr).simplify().collect(1+b)
   ...: print(expr)
   ...: print(z_expr)
   ...: print(subs_expr)

y*(b + 1) + z*(b + 1)
a/(b + 1) + x
a + (b + 1)*(x + y)

现在我想回去,subs没有做任何事情:

In [2]: orig_expr = subs_expr.subs(z_expr, z)
   ...: print(orig_expr)

a + (b + 1)*(x + y)

如何返回y*(b + 1) + z*(b + 1)

1 个答案:

答案 0 :(得分:0)

替换尝试失败,因为subs_expr实际上并不在其表达式树中包含z_expr。 “替换不存在的表达”并不是一个明确定义的目标。明确定义的目标是“消除使用关系z = z_expr”。这可以按如下方式完成:

var('orig_expr')
orig_expr = solve([orig_expr - subs_expr, z - z_expr], [orig_expr, a])[orig_expr]

现在orig_expr等于b*y + b*z + y + z