Sympy中未定义函数的类型

时间:2018-03-03 22:04:37

标签: sympy

假设我有以下内容:

x=Symbol('x')
f=Function('f')(x)
type(f)
f

为什么type(f)=f

为什么不是 UndefinedFunction

如何更一般地识别这种功能?

1 个答案:

答案 0 :(得分:0)

简短回答

它是AppliedUndef的一个实例,因为它已被“应用”(变量x)。在此之前,它是一个UndefinedFunction。

解释

让我们分别考虑两个步骤:创建一个函数并应用它。当它们混合在一起时,我们失去了函数和表达式之间的差异,这是SymPy和数学中常见的混淆源。

未应用的功能

>>> f = Function('f')
>>> type(f)
<class 'sympy.core.function.UndefinedFunction'>

这是一个未定义的函数。值得注意的是,它是一个类而不是一个对象。也许它应该是一个对象(a long-standing issue),但另一方面,这种行为与定义的函数(sinlog)是一致的。您可以测试f是UndefinedFunction:

>>> from sympy.core.function import UndefinedFunction
>>> isinstance(f, UndefinedFunction)
True

应用函数

当您将f应用于x,创建f(x)时,结果是类f的SymPy表达式,就像sin(x)是类sin的表达式一样。我们如何测试这个表达式是否是一个应用于某个东西的未定义函数?让我们看看:

>>> type(f(x)).__mro__
(f, AppliedUndef, Function, Application, <class 'sympy.core.expr.Expr'>, <class 'sympy.core.basic.Basic'>, <class 'sympy.core.evalf.EvalfMixin'>, <class 'object'>)

因此,AppliedUndef是您要在这里查看的课程。

>>> from sympy.core.function import AppliedUndef
>>> isinstance(f(x), AppliedUndef)
True

结论

使用isinstance(..., ...)进行测试,而不是type(...) == ...