2016-01-28 5 views
2

Я определяю 2 симплексные функции f, g, s.t. г является обратным е:SymPy: упрощение обратной функции

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 

Но если попытаться оценить п (г (х)) 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?

ответ

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

Смежные вопросы