在涉及int()的函数上使用sympy.integrate

在涉及int()的函数上使用sympy.integrate,sympy,Sympy,我正在尝试用Python集成函数。scipy.integrate.quad似乎工作正常;但请确保我想对照其他集成代码检查结果。有人建议我试试sympy.integrate。现在,我要集成的函数的代码包含int(),我使用它将浮点转换为int。这对于quad是可以的,但对于sympy.integrate则不行 下面是一个简单的示例,再现了错误: import sympy def f(x): return sympy.exp(int(x)) sympy.symbols('x') prin

我正在尝试用Python集成函数。scipy.integrate.quad似乎工作正常;但请确保我想对照其他集成代码检查结果。有人建议我试试sympy.integrate。现在,我要集成的函数的代码包含int(),我使用它将浮点转换为int。这对于quad是可以的,但对于sympy.integrate则不行

下面是一个简单的示例,再现了错误:

import sympy

def f(x):
    return sympy.exp(int(x))

sympy.symbols('x')
print(sympy.integrate(f(x),(x,0,2)))
这会产生错误:
TypeError:无法将符号转换为int

那么,有没有一种方法可以将涉及int()的函数与scipy.integrate进行集成


感谢使用
integrate
f
必须是一个SymPy符号函数,不允许您使用
int
int(x)
其中
x
符号
将始终产生类型错误,但是您可以使用
floor
功能以符号方式表示:

def f(x):
    return sympy.exp(sympy.floor(x))
但是,首先使用
floor
可能会挫败使用Symphy的某些目的,因为它可能会阻止发现分析解决方案,如下面的python会话所示:

>>> from sympy import *
>>> x = symbols("x")
>>> integrate(exp(floor(x)), (x, 0, 2))  # use of floor prevents evaluated result
Integral(exp(floor(x)), (x, 0, 2))
尽管您可以使用
evalf
方法计算数值结果(最终由mpmath执行):

(也许这个结果表明Symphy可以更好地处理这个积分?Wolfram Alpha将其计算为
1+e=3.71828…
,所以我想这里也至少有一个浮点精度错误-请参见注释re
天花

在任何情况下,我不知道你是否认为适当的结果考虑了<代码> f <代码>没有<代码>楼层< /代码>:

>>> integrate(exp(x), (x, 0, 2))
-1 + exp(2)
>>> _.evalf()
6.38905609893065

奇怪的是,
integrate(exp(天花板(x)),(x,0,2)).evalf(100)
似乎在Symphy的浮点计算中至少导致了一个精度错误(它打印为
1.e+1
),实际上只是一个分段常数函数的定积分,因此Symphy应该能够计算出一个精确的结果-看起来有一些未解决的问题
>>> integrate(exp(x), (x, 0, 2))
-1 + exp(2)
>>> _.evalf()
6.38905609893065