简化表达式中的术语

Simplify terms within an expression

Sympy 可以简化为:

In [26]: (asinh(sinh(x))).simplify()
Out[26]: x

但并没有简化:

In [28]: (asinh(sinh(x))+1).simplify()
Out[28]: asinh(sinh(x)) + 1

如何要求简化表达式的子部分?如果可能的话,我想避免方程式简化,例如找到一个公分母并分解出所有项。

可以说,这种简化根本不应该发生,因为它并不总是正确的:例如,asinh(sinh(2*I)) 不是 2*Isimplify 的当前实现有一个 "canceling" 函数及其反函数的子句,仅当整个表达式是该函数时才适用,并且不注意 asin(sin(pi))0 而不是 pi。逆向是棘手的。

但是基于 replace 的以下方法将替换所有已知的 "function-inverse" 对:

expr = sqrt(asinh(sinh(x))) + sin(asin(exp(2*x+1)))
expr = expr.replace(lambda f: isinstance(f, Function) and isinstance(f.args[0], f.inverse(argindex=1)), lambda f: f.args[0].args[0])
# expr is now sqrt(x) + exp(2*x + 1)

replace的第一个参数是过滤函数,

lambda f: isinstance(f, Function) and isinstance(f.args[0], f.inverse(argindex=1))

断言 f 是一个函数,其第一个参数是它的反函数。

replace 的第二个参数是对匹配子表达式要执行的操作,

lambda f: f.args[0].args[0]

表示:替换为参数的参数,即asinh(sinh(x)) -> x.

如上所述,不能保证这样 "simplification" 的结果在数学上等同于原始表达式。