使用lambdify将硬积分转换为lambda函数

时间:2016-05-22 20:25:29

标签: python function sympy integral lambdify

我想对函数Integral(t**t,(t,0,x))进行lambdify。它有效,但我的新函数(由lambdify返回)并不返回一个数字,只返回sympy.integrals.integrals.Integral类。但我不想要那个,我希望它返回一个浮点数。

这是我的代码:

import sympy as sp
import numpy as np
f = sp.lambdify(x,sp.integrate(t**t,(t,0,x)))
print(f(2)) #return Integral(t**t, (t, 0, 2))
#but i want 2.83387674524687

3 个答案:

答案 0 :(得分:4)

lambdify不直接支持scipy.integrate.quad yet,但添加适当的定义并不困难。只需要告诉lambdify如何打印Integral

def integral_as_quad(expr, lims):
    var, a, b = lims
    return scipy.integrate.quad(lambdify(var, expr), a, b)

f = lambdify(x, Integral(t**t,(t,0,x)), modules={"Integral": integral_as_quad})

结果是

In [42]: f(2)
Out[42]: (2.8338767452468625, 2.6601787439517466e-10)

我们在这里做的是定义一个函数integral_as_quad,它将一个SymPy Integral转换为一个scipy.integrate.quad调用,递归地对整数进行简化(如果你有更复杂或符号的集成)限制,你也想要递归lambdify那些)。

答案 1 :(得分:1)

最后,我找到了下一个解决方案。 我环顾四周,发现返回lambda是函数。 当你用数字调用它时它返回对象(Integarl)。

所以我可以给这个对象调用evalf(),它会返回一个数字。 像这样:

import sympy as sp
import numpy as np
x = sp.symbols('x')
f = sp.lambdify(x,sp.integrate(t**t,(t,0,x)))
def return_number(z):
    return f(z).evalf()
return_number(2) #return 2.83387674524687

有效。

答案 2 :(得分:0)

Sympy无法为此积分找到封闭形式的解析解,因此它返回未评估的sympy积分对象。由于您可以使用数字解决方案,因此您可以使用scipy的quad函数来实现此目的

import scipy.integrate

def f(x):
    return scipy.integrate.quad(lambda t: t**t, 0,x)[0]

f(2)
  

2.83387674525