【问题标题】:How to avoid automatic evalf() on new sympy.functions?如何避免在新的 sympy.functions 上自动 evalf()?
【发布时间】:2016-06-15 14:19:33
【问题描述】:

我想创建一个未评估的函数,除非我通过evalf() 明确要求它。我试过这个(按照http://docs.sympy.org/latest/modules/functions/index.html中的例子)

In [1]: import sympy as sy

In [2]: class f(sy.Function):
   ...:     def _eval_evalf(self,prec):
   ...:         print "evalf"
   ...:         return sy.S(1)
   ...:     

In [3]: f(1)
Out[3]: f(1)

In [4]: f(1)+1
Out[4]: evalf
1 + f(1)

可以看出,该函数远离 [3] 中的 _eval_evalf(),但它通过了 [4] 中的 _eval_evalf(),这超出了我最初定义符号函数的目的。我也试过添加这个

 @classmethod
 def _should_evalf(cls, arg):
     return -1

但这并没有解决问题。

有没有一种简单的方法(我对类不是很熟悉)来防止函数 f 通过_eval_evalf()

【问题讨论】:

    标签: python function sympy


    【解决方案1】:

    您的_should_evalf 将阻止函数自动评估。您的1 + f(1) 的结果是1 + f(1),而不是2

    _eval_evalf 在其他地方被调用,当函数需要知道表达式的数值时。您可以引发异常或使用import traceback; traceback.print_stack() 查看_eval_evalf 的调用位置。

    【讨论】:

    • 如果您查看 [4],您会看到打印了“evalf”,即在某个时候调用了 _eval_evalf(),即使最终结果 1+f(1) 表明 _eval_evalf()没有被调用。
    • @andres 是的,正如我在回答中指出的那样,有时会调用 evalf 来处理其他事情。您可以引发异常以查看确切的位置。在这种情况下,我认为它被调用来帮助 Add 对其参数进行排序(恕我直言,这不是应该做的事情,但无论如何,它是)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 2013-07-22
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多