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

luk*_*iss 4 python function sympy integral lambdify

我想对功能进行羔羊化Integral(t**t,(t,0,x))。它可以工作,但是我的新函数(由返回)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
Run Code Online (Sandbox Code Playgroud)

asm*_*rer 6

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})
Run Code Online (Sandbox Code Playgroud)

结果是

In [42]: f(2)
Out[42]: (2.8338767452468625, 2.6601787439517466e-10)
Run Code Online (Sandbox Code Playgroud)

我们在这里定义的是一个函数integral_as_quad,该函数将SymPy Integral转换为scipy.integrate.quad调用,递归地对被积数进行lambd(如果您有更复杂或符号积分的限制,您也将希望递归地对这些积数进行lambd)。