SymPy: упрощение обратной функции


Я определяю 2 функции симпатии f, g , s.t. 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)) sympy не упростит это:

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 2

1 ответ:

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().