在Python中集成Lambda列表函数

时间:2018-07-13 09:13:16

标签: python math scipy

在Python中,我正在尝试

from scipy.integrate import quad
time_start = 0
fun = lambda time: [cos(time), sin(time)]
integral = lambda time: quad(fun, time_start, time)

,并希望程序返回integral作为列表,其中元素是fun的元素明智的集成,因此[quad(cos, time_start, time), quad(sin, time_start, time)]

我得到TypeError: must be real number, not list

我该如何解决?

1 个答案:

答案 0 :(得分:1)

请勿在返回两个功能列表的功能上使用quad,而应在两个功能上使用两次,然后将结果组成一个列表。 The documentation for scipy.integrate.quad给出了要集成的函数的可能签名,每个签名都表明该函数必须返回double值(在Python中称为float),而不是列表。

如果您无法更改time_startfun的定义或integral的参数或返回值,则可以使用此代码。

from math import cos, sin
from scipy.integrate import quad

# Global variables and constants used in function `integral`
time_start = 0
fun = lambda time: [cos(time), sin(time)]

# The desired function
def integral(time):
    """Return a list of two items containing the integrals of the two
    components of the `fun` function from `start_time` to `time`.
    """
    def fun0(time):
        return fun(time)[0]
    def fun1(time):
        return fun(time)[1]

    integral0 = quad(fun0, time_start, time)[0]
    integral1 = quad(fun1, time_start, time)[0]
    return [integral0, integral1]

然后是语句的结果

print(integral(0), integral(pi/2), integral(pi))

[0.0, 0.0] [0.9999999999999999, 0.9999999999999999] [3.6775933888827275e-17, 2.0]

这是您想要的,在精度范围内。


顺便说一句,在Python中,使用lambda表达式创建一个函数然后将其分配给一个名称被认为是不好的编程实践。 See here,第五个要点。改用常规的def块:

def fun(time):
    return [cos(time), sin(time)]

def integral(time):
    # as shown above

当然,将time_startfun用作全局变量而不是integral的参数也是不好的做法,但是我坚持使用它们的方式。