【问题标题】:Integration with "quad" and "quadrature" from Python/SciPy与 Python/SciPy 中的“quad”和“quadrature”集成
【发布时间】:2011-09-14 19:27:36
【问题描述】:

在阅读了thisthat 之后,我突然想到“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 接受一个接受向量参数的函数(同时对函数进行许多不同的评估)。 自适应只是意味着它需要更多的样本(有效地),直到边际误差下降到某个容差以下。

标签: python syntax


【解决方案1】:

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

【讨论】:

  • 谢谢!这就解释了我做错了什么......知道为什么它适用于“quad”吗?
  • 不,它适用于args=(y)args=(y,),但最终它可能是quad 中的一个“错误”,它接受单个参数作为非元组类型...... args=[y] 只是为了让 quadrature 工作。但这可能是幸运的,因为这不是正确的方法。
  • 请将它报告给 scipy 开发人员,并提及更好的错误消息会很好......
猜你喜欢
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
  • 2015-07-30
  • 2017-05-16
  • 1970-01-01
相关资源
最近更新 更多