Sympy
可以简化这一点:
In [26]: (asinh(sinh(x))).simplify()
Out[26]: x
但并未简化:
In [28]: (asinh(sinh(x))+1).simplify()
Out[28]: asinh(sinh(x)) + 1
如何要求简化表达式的子部分?如果可能的话,我想避免使用方程式比例简化,例如:找到一个共同的分母并将其分解为所有术语。
答案 0 :(得分:0)
可以说,这种简化根本不应该发生,因为它并不总是正确的:例如,asinh(sinh(2*I))
不是2*I
。 simplify
的当前实现有一个"取消"的条款。一个函数及其逆函数,仅当整个表达式是该函数时才适用,并且不关注asin(sin(pi))
0
而不是pi
之类的东西。逆转是棘手的。
但是,基于replace
的以下方法将取代所有已知的"函数反转"对:
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
。
如上所述,并不能保证这种"简化"的结果。在数学上等同于原始表达式。