我定义了2个症状函数 f , g ,s。 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)),则不会简化此事:
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 ?
答案 0 :(得分: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()
。