2016-01-28 84 views
2

我定義了2個sympy函數f,g,s.t. ˚F逆: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 

但是,如果我試圖評估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? 

問題:如何說sympy,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()