如果首先需要重写方程,如何替换 sympy 中的项

问题描述 投票:0回答:1

我有以下表情:

O = symbols('O', linear=True)
mu = symbols('mu')
zeta = symbols('zeta')
f = IndexedBase('f')
first_cc = Eq(f[0,0,1] - zeta*f[0,0,0], 0)

expression = -O*mu*zeta*f[0, 0, 0] + O*mu *f[0, 0, 1]

如果使用方程

first_cc
,则表达式的计算结果应为 0。但是,如果我这样做

pprint(expression.subs(first_cc.lhs, first_cc.rhs)) 

什么也没有发生,我认为是因为方程没有明确地用 f[0,0,1] - zeta*f[0,0,0]` 来写。在这种特定情况下,我可以通过首先简化来解决这个问题:

pprint(simplify(expression).subs(first_cc.lhs, first_cc.rhs))

如预期给出 0。问题是,简化并不总是用

expression
来写
first_cc.lhs
,所以这不适用于更复杂的表达。我如何强制 sympy 使用来自
first_cc
的信息?

sympy
1个回答
0
投票

尝试用符号替换总和(或者在您的情况下,在表达式中使用关系)是一个经常被问到的问题。除非总和与 subs 中给出的完全一样——而不是用常数乘以每一项——否则替换将会失败。通常的解决方案是求解和中除最终表达式中想要的符号之外的符号之一,例如

>>> from sympy.abc import x,y,z
>>> rep= solve(Eq(x + z, y),exclude=[y],dict=True)[0]
>>> (2*(x + z)).subs(rep)
2*y

就你而言,

O = symbols('O', linear=True)
mu = symbols('mu')
zeta = symbols('zeta')
f = IndexedBase('f')
first_cc = Eq(f[0,0,1] - zeta*f[0,0,0], 0)
expression = -O*mu*zeta*f[0, 0, 0] + O*mu *f[0, 0, 1]

>>> expression.subs(solve(first_cc,dict=True)[0])
0

在这种情况下,无需进一步(或初步)简化。如果在某些情况下需要进行扩展才能将简化结果简化为 0,我不会感到惊讶。

© www.soinside.com 2019 - 2024. All rights reserved.