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

Nic*_*ens 7 python syntax

看完这个那个,它发生,我认为这两个"四"和"正交"应该是互换*,至少语法明智的.奇怪的是,似乎他们不是:

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)
Run Code Online (Sandbox Code Playgroud)

...这个例子对于"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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ros*_*ews 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'>
Run Code Online (Sandbox Code Playgroud)