看完这个和那个,它发生,我认为这两个"四"和"正交"应该是互换*,至少语法明智的.奇怪的是,似乎他们不是:
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中的注释行),即使文档说它应该是一个元组.这似乎是口译员所抱怨的......(对吧?)
这是有意的吗?或者我做错了什么?最后,我希望能够选择集成方法,而不必更改其余的代码.
*其实我真的不知道如何在两者之间做出选择.我确实理解高斯正交和自适应正交之间的区别,但我不知道"自适应高斯求积"应该是什么意思 - 是节点的数量适应,如果是这样的话!
问题出在线路上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)
| 归档时间: |
|
| 查看次数: |
3029 次 |
| 最近记录: |