表达方式abs(x)**2 + 6*abs(x) + 5
实际上并不包含abs(x) + 1
任何地方,所以没有什么可以替代。
人们可以想象将其更改为abs(x)**2 + 5*(abs(x) + 1) + abs(x)
,替换结果为abs(x)**2 + 5*y + abs(x)
。或者也许将其更改为abs(x)**2 + 6*(abs(x) + 1) - 1
,结果是abs(x)**2 + 6*y - 1
。还有其他选择。结果应该是什么?
此任务没有通用方法,因为它一开始就不是一个明确定义的任务。
相比之下,替代f.subs(abs(x), y-1)
是一个明确的指令,用于将表达式树中所有出现的abs(x)替换为y-1
。它返回6*y + (y - 1)**2 - 1
.
上面的替换为abs(x) + 1
in abs(x)**2 + 6*abs(x) + 5
也是一个明确的指令:查找表达式的确切出现次数abs(x) + 1
在表达式的语法树中abs(x)**2 + 6*abs(x) + 5
,并将这些子树替换为表达式的语法树abs(x) + 1
。有一个关于尽管启发式.
旁:除了subs
SymPy 有一个方法.replace它支持通配符,但我不希望它在这里有帮助。根据我的经验,过于急于替换:
>>> a = Wild('a')
>>> b = Wild('b')
>>> f.replace(a*(abs(x) + 1) + b, a*y + b)
5*y/(Abs(x) + 1) + 6*y*Abs(x*y)/(Abs(x) + 1)**2 + (Abs(x*y)/(Abs(x) + 1))**(2*y/(Abs(x) + 1))
消除变量
SymPy 中没有“消除”。人们可以尝试模仿它solve
通过引入另一个变量,例如,
fn = Symbol('fn')
solve([Eq(fn, f), Eq(abs(x) + 1, y)], [fn, x])
它尝试求解“fn”和“x”,因此“fn”的解是没有 x 的表达式。如果这有效
事实上,它不能与abs()
; SymPy 中未实现求解绝对值内的值。这是一个解决方法。
fn, ax = symbols('fn ax')
solve([Eq(fn, f.subs(abs(x), ax)), Eq(ax + 1, y)], [fn, ax])
这输出[(y*(y + 4), y - 1)]
其中第一项是您想要的;的解决方案fn
.