与Python / SciPy中的“quad”和“quadrature”集成

时间:2011-09-13 13:18:49

标签: python syntax

在阅读thisthat之后,我发现“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”运行良好,但不适用于“正交” - 我最终得到:

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

我必须将args元组切换到一个列表(参见integr2中的注释行),即使文档说它应该是一个元组。这似乎是翻译抱怨的......(对吧?)

这是打算吗?或者我做错了什么?最后,我希望能够选择集成方法,而不必更改其余的代码。

*其实我真的不知道如何在两者之间做出选择。我确实理解高斯正交和自适应正交之间的区别,但我不知道“自适应高斯正交”应该是什么意思 - 是否适应了节点的数量,如果是这样的话!?

1 个答案:

答案 0 :(得分:4)

问题出在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'>