从类中获取scipy.integrate.nquad积分边界触发TypeError求助
问题:类中定义nquad积分边界函数触发TypeError
尝试从类中获取积分边界并传递给scipy.integrate.nquad,但调用返回边界的函数时触发TypeError。
复现代码:
from scipy.integrate import nquad class toy_class(): def gen_bounds(self): def x_bounds(): return [-1 , 1] def y_bounds(): return [-1 , 1] return x_bounds, y_bounds xb, yb = toy_class().gen_bounds() nquad(1, [xb, yb])
报错信息:
TypeError: toy_class.gen_bounds.<locals>.x_bounds() takes 0 positional arguments but 1 was given
希望保留边界函数在类内,让nquad返回4.0。
解决方案
问题原因
nquad在调用边界函数时,会自动将前面已积分变量的取值传递给当前边界函数(即使你的边界是固定常数、不依赖这些变量)。原代码中的边界函数x_bounds、y_bounds没有定义参数,导致接收参数时触发TypeError。另外,nquad的第一个参数必须是可调用的被积函数,直接传数值1也会引发错误。
修改后的代码
from scipy.integrate import nquad class toy_class(): def gen_bounds(self): # 用*args接受任意数量的参数,忽略不用 def x_bounds(*args): return [-1 , 1] def y_bounds(*args): return [-1 , 1] return x_bounds, y_bounds xb, yb = toy_class().gen_bounds() # 被积函数改为lambda表达式,接收x、y参数并返回1 result, error = nquad(lambda x, y: 1, [xb, yb]) print(result) # 输出 4.0
关键修改点
- 给边界函数添加
*args参数:兼容nquad传递的前置变量,避免参数不匹配错误。如果确定变量数量固定,也可以写def x_bounds(_):(单下划线表示忽略该参数),但*args扩展性更好。 - 修正被积函数:将数值1改为
lambda x, y: 1,满足nquad对被积函数必须可调用的要求。
内容的提问来源于stack exchange,提问作者Joseph F. Specht IV
相关产品推荐
相关产品推荐

