You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从类中获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:56:07