SymPy:反函数的简化

SymPy: simplifying of inverse function

我定义了 2 个 sympy 函数 fg、s.t。 gf 的倒数:

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?

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