5

我想对函数进行羔羊化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
4

3 回答 3

7

lambdify没有scipy.integrate.quad直接支持,但是添加合适的定义并不难。只需要告诉如何打印:lambdifyIntegral

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,它将 SymPyIntegral转换为scipy.integrate.quad调用,递归地对被积函数进行羔羊化(如果您有更复杂或符号化的积分限制,您也需要递归地对它们进行羔羊化)。

于 2016-05-26T19:36:12.067 回答
1

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

所以我可以调用 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

有用。

于 2016-05-22T20:54:46.483 回答
0

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

import scipy.integrate

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

f(2)

2.83387674525

于 2016-05-22T20:33:25.960 回答