【发布时间】:2011-09-14 19:27:36
【问题描述】:
在阅读了this 和that 之后,我突然想到“quad”和“quadature”应该可以互换*,至少在语法上是这样。奇怪的是,它们似乎不是:
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”,但不适用于“quadature” - 我最终得到:
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 中的注释行)。看来这就是口译员所抱怨的……(对吧?)
这是故意的吗?还是我做错了什么?最后,我希望能够在之后选择集成方法,而不必对其余代码进行太多更改。
*实际上我真的不知道如何在两者之间进行选择。我确实了解高斯正交和自适应正交之间的区别,但我不知道“自适应高斯正交”应该是什么意思 - 是适应的节点数量,如果是这样的话!?
【问题讨论】:
-
quad接受一个带有标量参数的函数,而quadrature接受一个接受向量参数的函数(同时对函数进行许多不同的评估)。 自适应只是意味着它需要更多的样本(有效地),直到边际误差下降到某个容差以下。