Python 为什么可以';在同一点上,我是否评估已实现的函数的组合?
代码非常简单:Python 为什么可以';在同一点上,我是否评估已实现的函数的组合?,python,sympy,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.000000000000
>>> 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))
这让我快发疯了。为什么表达式没有被评估,我应该如何修复它?我不能直接回答你的问题,我也不知道你的总体目标是什么。但这种方法有用吗
>>> 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
我认为这是症状的一种错误。code>evalf没有递归调用
\u imp
。我已经打开了
关于\u imp
与eval
的对比,实现的功能的文档字符串
:
请注意,这是一种快速解决方法,而不是创建特殊符号函数的一般方法。如果您想创建一个符号函数供Symphy的所有机器使用,那么您应该对function类进行子类化
\u imp\u
的主要目的是在lambdify中使用,将数值实现附加到符号函数
如果您只对符号求值或使用
evalf
求值感兴趣,则应将函数子类化,并分别定义eval
或\u evalf
您可以使用lambdify
:x=sympy.symbols('x')
sympy.lambdify(x,f(g(x))(2)
的计算结果为16。@unutbu:这难道不符合使用实现的函数的意义吗?如果我可以依赖一个通用符号表达式,那么我只需要正常操作它并进行替换,而不是通过implemented\u函数
。您是否尝试过f(g(2).evalf().evalf()
或f(g(2).evalf())
?也许这不是你想要的。@pazitos10:不,不是……我不知道这个方法的含义是什么(我甚至不知道eval
是否存在)。这与使用\u imp\u
或实现的功能
有何不同?这是正常的还是黑客行为?绝对不是黑客行为。正如Meurer在几天前的一次回答中提到的那样。我不知道它和你提到的代码有什么不同。我想这是为Symphy添加任意函数的安排。+1有趣,谢谢。让我想知道如果这样做效果很好,\u imp\u
的意义是什么。。。我们一定要放弃一些东西!如此悲观的人有趣的是,我刚刚在SymPy中发现了另一个bug。尝试将@classmethod
更改为@staticmethod
并删除第一个参数,它会错误地推断出nargs
。+1啊,我没有意识到它明确用于数值计算!这就解释了一些事情。好的,有点相切,但如果我这样做,那么我仍然必须覆盖fdiff
使其可微,对吗?或者它会自动区分我返回的符号表达式吗?(虽然我想我可以这样做,然后看看)如果您从eval
返回一个表达式,那么它将立即进行计算。因此,diff将对返回的表达式求值。如果使其保持未计算状态(从eval
返回None
),则需要定义导数。听起来不错,谢谢!!这实际上让我的生活更轻松,因为我确实有一个表达式要返回。谢谢