Python中Lambda函数与Scipy integrate.quad配合使用报错求助
问题描述
我编写了如下代码:
import numpy as np from scipy import integrate t = np.linspace(0, .85, 5) s = np.ones_like(t) f = lambda t, s: t - s Int = integrate.quad(f, 1, 2) Int
无论修改s的值还是integrate.quad(f, 1, 2)中的积分上下限,都会触发如下错误:
TypeError Traceback (most recent call last) <ipython-input-6-087d4b0d784a> in <module> 4 s = np.ones_like(t) 5 f = lambda t, s: t - s ----> 6 Int = integrate.quad(f, 1, 2) 7 Int 1 frames /usr/local/lib/python3.8/dist-packages/scipy/integrate/quadpack.py in _quad(func, a, b, args, full_output, epsabs, epsrel, limit, points) 461 if points is None: 462 if infbounds == 0: --> 463 return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit) 464 else: 465 return _quadpack._qagie(func,bound,infbounds,args,full_output,epsabs,epsrel,limit) TypeError: <lambda>() missing 1 required positional argument: 's'
我查阅了Scipy和Lambda的相关文档,依然找不到解决办法。
补充说明:我实际要实现的是一个积分计算(积分变量为t,被积函数包含与s相关的项,积分区间为0到某一数值),上述代码是简化后的版本。
解决方法
问题根源在于scipy.integrate.quad的参数传递逻辑:quad默认仅将第一个参数视为积分变量,其余参数需要通过args参数传递给被积函数。你的lambda函数需要t和s两个参数,但调用quad(f,1,2)时仅传入了积分变量t,未提供s,因此报错。
有两种常用解决方式:
方式一:通过args传递额外参数
修改quad的调用,将s作为额外参数传入(注意args需为元组形式):
import numpy as np from scipy import integrate t = np.linspace(0, .85, 5) s = np.ones_like(t) f = lambda t, s: t - s Int = integrate.quad(f, 1, 2, args=(s,)) print(Int)
方式二:用闭包绑定s的值
如果s是固定值,可以让lambda函数直接捕获当前的s,仅保留积分变量t作为参数:
import numpy as np from scipy import integrate t = np.linspace(0, .85, 5) s = np.ones_like(t) f = lambda t: t - s Int = integrate.quad(f, 1, 2) print(Int)
若你实际要计算的积分是针对每个s元素分别计算,可结合np.vectorize或循环遍历s的每个元素处理。
内容的提问来源于stack exchange,提问作者Nurdan
相关产品推荐
相关产品推荐

