阅读完这篇文章和那篇文章后,我认为“quad”和“quadrature”两个词至少在语法上应该是可以互换的。但奇怪的是似乎它们并不是可互换的:
我必须将args元组切换为列表(参见integr2中的注释行),即使文档说它应该是一个元组。看起来这就是解释器抱怨的原因... (对吧?)
这是有意为之吗?还是我做错了什么?最终,我希望能够在不太改变其余代码的情况下选择积分方法。
*实际上,我不太明白如何在两者之间进行选择。我确实了解高斯积分和自适应积分之间的区别,但我不知道“自适应高斯积分”应该是什么意思 - 如果是节点数量适应,那么如何适应呢?
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
我必须将args元组切换为列表(参见integr2中的注释行),即使文档说它应该是一个元组。看起来这就是解释器抱怨的原因... (对吧?)
这是有意为之吗?还是我做错了什么?最终,我希望能够在不太改变其余代码的情况下选择积分方法。
*实际上,我不太明白如何在两者之间进行选择。我确实了解高斯积分和自适应积分之间的区别,但我不知道“自适应高斯积分”应该是什么意思 - 如果是节点数量适应,那么如何适应呢?
quad
接受一个标量参数的函数,而quadrature
则接受一个接受矢量参数(函数同时进行多个不同的求值)的函数。自适应意味着它会采取更多的样本(高效地),直到边际误差降低到某个容限以下。 - Andrew Mao