SymPy:简化反函数

时间:2016-01-28 11:21:55

标签: python-2.7 sympy

我定义了2个症状函数 f g ,s。 g f 相反:

import sympy as sy

g = sy.Function('g')

class f(sy.Function):
    def inverse(self, argindex=1):
        return g

x, y = sy.symbols('x y')
print sy.solve(y - f(x), x) # [g(y)] - correct

但如果我尝试评估 f(g(x)),则不会简化此事:

print f(g(x))               # f(g(x))
print f(g(x)).doit()        # f(g(x)) - why not x?
print f(g(x)).simplify()    # f(g(x)) - why not x?

问题:如何认为 f(g(x))只是 x

1 个答案:

答案 0 :(得分:2)

inverse没有实现这样做。我为它打开了https://github.com/sympy/sympy/issues/10487。理想情况下,我在下面写的内容应该默认工作。

您可以通过定义_eval_simplify轻松使其工作,例如

class f(sy.Function):
    def inverse(self, argindex=1):
        return g

    def _eval_simplify(self, ratio, measure):
        if isinstance(self.args[0], self.inverse()):
            return self.args[0].args[0]
        return self

如果你有很多课程,你可以把它放在一个超类中。

In [30]: f(g(x))
Out[30]: f(g(x))

In [31]: f(g(x)).simplify()
Out[31]: x

或者,如果您希望doit()执行此操作,则可以定义doit()