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 ответ:
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()
.