简化表达式中的术语

时间:2018-02-12 13:35:26

标签: sympy simplify

Sympy可以简化这一点:

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

但并未简化:

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

如何要求简化表达式的子部分?如果可能的话,我想避免使用方程式比例简化,例如:找到一个共同的分母并将其分解为所有术语。

1 个答案:

答案 0 :(得分:0)

可以说,这种简化根本不应该发生,因为它并不总是正确的:例如,asinh(sinh(2*I))不是2*Isimplify的当前实现有一个"取消"的条款。一个函数及其逆函数,仅当整个表达式是该函数时才适用,并且不关注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

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

相关问题