简化表达式中的术语
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*I
。 simplify
的当前实现有一个 "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" 的结果在数学上等同于原始表达式。
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*I
。 simplify
的当前实现有一个 "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" 的结果在数学上等同于原始表达式。