我需要找到并用符号替换子表达式,对其进行“反向”替换。
这是直接替换示例:
(simplify
和collect
已添加,以使生成的表达式具有我需要使用的格式)
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)
?
答案 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