如何让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
使用符号显示公式。
这里有两个符号 x
和 y
。 z
不是符号。这是一个 Add
对象。
>>> type(x)
<class 'sympy.core.symbol.Symbol'>
>>> type(z)
<class 'sympy.core.add.Add'>
您必须创建另一个符号 z
,当您尝试对 z
执行某些操作时,比方说求值、差异等,您可以指定 z
是 x+y
subs 函数总是可以很好地替换符号;在您的情况下,您正在尝试替换一个总和,除非该总和实际上在字面上作为参数出现在表达式树中,否则它不会很好地工作,例如exp(x + y).subs(x + y, z) -> exp(z)
。所以有两种做法:
- 对于像 x + y -> z 这样的简单关系,求解其中一个变量并进行替换 x -> z - y
- 整理你的表达式树以显示总和,
例如
>>> factor_terms(F).subs(x + y, z), F.subs(x, z - y)
(Matrix([[2*z, 2*z]]), Matrix([[2*z, 2*z]]))
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
使用符号显示公式。
这里有两个符号 x
和 y
。 z
不是符号。这是一个 Add
对象。
>>> type(x)
<class 'sympy.core.symbol.Symbol'>
>>> type(z)
<class 'sympy.core.add.Add'>
您必须创建另一个符号 z
,当您尝试对 z
执行某些操作时,比方说求值、差异等,您可以指定 z
是 x+y
subs 函数总是可以很好地替换符号;在您的情况下,您正在尝试替换一个总和,除非该总和实际上在字面上作为参数出现在表达式树中,否则它不会很好地工作,例如exp(x + y).subs(x + y, z) -> exp(z)
。所以有两种做法:
- 对于像 x + y -> z 这样的简单关系,求解其中一个变量并进行替换 x -> z - y
- 整理你的表达式树以显示总和,
例如
>>> factor_terms(F).subs(x + y, z), F.subs(x, z - y)
(Matrix([[2*z, 2*z]]), Matrix([[2*z, 2*z]]))