与Python/SciPy中的"quad"和"quadrature"集成

8 投票
1 回答
4353 浏览
提问于 2025-04-17 02:12

在看了这个那个之后,我发现“quad”和“quadrature”这两个东西在语法上应该是可以互换的。但奇怪的是,它们似乎并不是这样:

from scipy.integrate import quad as q
#from scipy.integrate import quadrature as q

def myfunc(x):
    return x

def integr():
    return q(myfunc, 0, 1)[0]

print integr()


def myfunc2(x, y):
    return x + y

def integr2(y):
    return q(myfunc2, 0, 1, args=(y))[0]
    #return q(myfunc2, 0, 1, args=[y])[0] 

print integr2(10)

... 用“quad”的例子运行得很好,但用“quadrature”就不行了 - 我最后得到了:

Traceback (most recent call last):
  File "./test.py", line 38, in <module>
    print integr2(10)
  File "./test.py", line 36, in integr2
    return q(myfunc2, 0, 1, args=(y))[0]
  File "/usr/lib/python2.6/dist-packages/scipy/integrate/quadrature.py", line 136, in quadrature
    newval = fixed_quad(vfunc, a, b, (), n)[0]
  File "/usr/lib/python2.6/dist-packages/scipy/integrate/quadrature.py", line 48, in fixed_quad
    return (b-a)/2.0*sum(w*func(y,*args),0), None
  File "/usr/lib/python2.6/dist-packages/scipy/integrate/quadrature.py", line 77, in vfunc
    return func(x, *args)
TypeError: myfunc2() argument after * must be a sequence, not int

我必须把参数的元组改成列表(参考integr2中的注释行),尽管文档上说应该是元组。看起来这就是解释器抱怨的地方……(对吧?)

这是故意这样设计的吗?还是我做错了什么?最后我希望能在不改变太多其他代码的情况下选择不同的积分方法。

*其实我不太明白该怎么在这两者之间选择。我知道高斯求积法和自适应求积法之间的区别,但我不知道“自适应高斯求积法”到底是什么意思 - 节点的数量是怎么调整的,如果是的话,怎么调整呢!?

1 个回答

5

问题出在这一行 return q(myfunc2, 0, 1, args=(y))[0],特别是在 args=(y) 这一部分。你想要的是 args=(y,)(注意 y 后面有个逗号)或者 args=[y]

问题在于,在Python中,元组是通过逗号来创建的,而不是通过括号。看看这个:

>>> a = (1,)
>>> b = (1)
>>> print a, type(a)
(1,) <type 'tuple'>
>>> print b, type(b)
1 <type 'int'>

撰写回答