代码非常明显:
>>> 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))
这让我疯了。为什么表达式没有被评估,我该如何修复呢?
答案 0 :(得分:2)
我认为这是SymPy中的一个错误。 evalf
并非以递归方式调用_imp_
。我已经开了an issue。
关于_imp_
与eval
,implemented_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