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

Python 用lambdify将硬积分转换为lambda函数,python,function,sympy,integral,lambdify,Python,Function,Sympy,Integral,Lambdify,我想lambdify函数积分(t**t,(t,0,x))。它可以工作,但我的新函数(由lambdify返回)不返回数字,只返回sympy.integrals.integrals.Integral类。但我不希望这样,我希望它返回一个浮点数 这是我的密码: 将sympy作为sp导入 将numpy作为np导入 f=sp.lambdify(x,sp.integrate(t**t,(t,0,x))) 打印(f(2))#返回积分(t**t,(t,0,2)) #但我要2.83387674524687 Symp

我想lambdify函数
积分(t**t,(t,0,x))
。它可以工作,但我的新函数(由
lambdify
返回)不返回数字,只返回
sympy.integrals.integrals.Integral
类。但我不希望这样,我希望它返回一个浮点数

这是我的密码:

将sympy作为sp导入
将numpy作为np导入
f=sp.lambdify(x,sp.integrate(t**t,(t,0,x)))
打印(f(2))#返回积分(t**t,(t,0,2))
#但我要2.83387674524687

Symphy找不到此积分的闭合形式解析解,因此它返回一个未计算的Symphy积分对象。由于您似乎对数值解很在行,因此可以使用scipy的
quad
函数实现此目的

import scipy.integrate

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

f(2)
2.833874525


最后,我找到了下一个解决方案。 我环顾四周,发现返回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

它起作用了

lambdify
不直接支持
scipy.integrate.quad
,但添加适当的定义并不困难。只需告诉
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\u定义为\u quad
,它将SymPy
integral
转换为
scipy.integrate.quad
调用,递归地lambdizing被积函数(如果您有更复杂或符号化的积分限制,您还需要递归地lambdizing它们)

是的,非常感谢您提供的解决方案,但我希望将Symphy和scipy结合在一起。从sympy函数切换到scipy函数再切换回来。
evalf
使用mpmath计算积分,这可能比scipy.integrate.quad更精确,但也更慢。可能先创建reimann和?f=sp.lambdify(x,sp.Integral(t**t,(t,0,x))。作为(n=100)和