如何让sympy显示浓缩表达

How to get sympy to display condensed expression

x+我正在使用 sympy 来计算一个相当复杂的表达式的雅可比行列式,结果表达式都是根据我定义的最低级别的符号。但是,如果能以一些更高级别的表达方式使用它,那将是非常好的。例如,考虑下面的基本代码段。

>>> from sympy import *
>>> x, y = symbols('x, y')
>>> z = x + y
>>> f = z**2
>>> pprint(f)
       2
(x + y) 

在这里,f显示为(x + y)^2,但我希望它显示为z^2。有没有办法在 sympy 中做到这一点?

编辑

将 z 声明为一个符号,然后在事后代入 x+y 允许我根据 z 获得雅可比行列式,但我的代入无法处理项被分解的情况。例如:

>>> from sympy import *
>>> x, y, z = symbols('x, y, z')
>>> f = z**2
>>> F = Matrix([f.subs(z, x+y)]).jacobian(Matrix([x, y]))
>>> F
Matrix([[2*x + 2*y, 2*x + 2*y]])
>>> F.subs(x+y, z)
Matrix([[2*x + 2*y, 2*x + 2*y]])
>>> F.subs(2*x+2*y, 2*z)
Matrix([[2*z, 2*z]])

在这里,用 x+y 代替 z 不起作用,因为表达式已扩展为 2x + 2y。是否可以根据 x+y 重写 F 以使替换工作,无论它是如何因式分解的?

sympy 使用符号显示公式。

这里有两个符号 xyz 不是符号。这是一个 Add 对象。

>>> type(x)
<class 'sympy.core.symbol.Symbol'>
>>> type(z)
<class 'sympy.core.add.Add'>

您必须创建另一个符号 z,当您尝试对 z 执行某些操作时,比方说求值、差异等,您可以指定 zx+y

subs 函数总是可以很好地替换符号;在您的情况下,您正在尝试替换一个总和,除非该总和实际上在字面上作为参数出现在表达式树中,否则它不会很好地工作,例如exp(x + y).subs(x + y, z) -> exp(z)。所以有两种做法:

  1. 对于像 x + y -> z 这样的简单关系,求解其中一个变量并进行替换 x -> z - y
  2. 整理你的表达式树以显示总和,

例如

>>> factor_terms(F).subs(x + y, z), F.subs(x, z - y)
(Matrix([[2*z, 2*z]]), Matrix([[2*z, 2*z]]))