为什么我不能在某一点上评估SymPy中的implements_functions的组合?

时间:2017-01-24 02:04:33

标签: python sympy

代码非常明显:

>>> from sympy.utilities.lambdify import implemented_function
>>> f = implemented_function('f', lambda x: x ** 2)
>>> g = implemented_function('g', lambda x: 2 * x)
>>> print(f(  2 ).evalf())
4.00000000000000
>>> print(  g(2) .evalf())
4.00000000000000
>>> print(f(g(2)).evalf())
f(g(2))

这让我疯了。为什么表达式没有被评估,我该如何修复呢?

2 个答案:

答案 0 :(得分:2)

我认为这是SymPy中的一个错误。 evalf并非以递归方式调用_imp_。我已经开了an issue

关于_imp_evalimplemented_function says的文档字符串:

  

请注意,这是一种快速解决方法,而不是创建特殊符号函数的常规方法。如果要创建一个符号函数以供SymPy的所有机制使用,则应该对Function类进行子类化。

_imp_的主要目的是在lambdify中使用,将数值实现附加到符号函数。

如果您只对evalf的符号评估或评估感兴趣,则应该Function子类并分别定义eval_eval_evalf

答案 1 :(得分:1)

我无法直接回答您的问题,我不知道您的总体目标是什么。但这种方法有用吗?

>>> from sympy import *
>>> class square(Function):
...     @classmethod
...     def eval(cls, x):
...         if x.is_integer or x.is_real:
...             return x**2
... 
>>> class double(Function):
...     @classmethod
...     def eval(cls, x):
...         if not x.is_integer or x.is_real:
...             return 2*x
... 
>>> double(square(3))
18
>>> var('x')
x
>>> double(square(x)).subs(x,5)
50