【问题标题】:Simplify terms within an expression简化表达式中的项
【发布时间】:2018-02-12 13:35:25
【问题描述】:

Sympy 可以简化这个:

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

但没有简化:

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

如何要求简化表达式的子部分?如果可能的话,我想避免方程尺度的简化,例如找到并分解出所有术语的共同点。

【问题讨论】:

    标签: sympy simplify


    【解决方案1】:

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

    但基于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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-10
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      相关资源
      最近更新 更多