如何使用 tplquad?
How to use tplquad?
我尝试整合这个:
积分(积分(积分(2*sin(z)*cos(atan((2*cos(y)-0.5+x)/(2*sin(y)))),y,0, pi/2),x,0,1),z,0,pi/2);
Wolfram 找到了解决方案,但我想控制精度。我尝试使用 tplquad 但出现了一些错误。
def f(x,y,z):
return 2*sin(z)*cos(atan((2*cos(y)-0.5+x)/(2*sin(y))))
tplquad(f,0,1,0,pi/2,0,pi/2)
错误是:
Blockquote
File "", line 3, in
File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py", line 526, in tplquad
return dblquad(_infunc2,a,b,gfun,hfun,(func,qfun,rfun,args),epsabs=epsabs,epsrel=epsrel)
File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py", line 461, in dblquad
return quad(_infunc,a,b,(func,gfun,hfun,args),epsabs=epsabs,epsrel=epsrel)
File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py", line 281, in quad
retval = _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points)
File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py", line 345, in _quad
return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py", line 406, in _infunc
a = gfun(x)
您知道错误可能来自哪里吗?
tplquad
的文档指出,内部积分的积分限制应作为外部积分变量的函数提供(即使它们恰好是您的情况下的常量)。
tplquad
在您的案例中的正确用法如下所示。请注意,f
定义中参数的顺序应对应于积分的顺序。 f
的第一个(最后一个)参数是最后一个(第一个)要集成的参数。在这种情况下,由于固定的集成限制,排序无关紧要。
import numpy as np
from scipy.integrate import tplquad
def f(y,x,z):
return 2*np.sin(z)*np.cos(np.arctan((2*np.cos(y)-0.5+x)/(2*np.sin(y))))
tplquad(f,0,np.pi/2, lambda z: 0, lambda z:1, lambda z, x: 0, lambda z, x: np.pi/2)
(1.9999999999999998, 2.492629060475153e-14)
我尝试整合这个:
积分(积分(积分(2*sin(z)*cos(atan((2*cos(y)-0.5+x)/(2*sin(y)))),y,0, pi/2),x,0,1),z,0,pi/2);
Wolfram 找到了解决方案,但我想控制精度。我尝试使用 tplquad 但出现了一些错误。
def f(x,y,z):
return 2*sin(z)*cos(atan((2*cos(y)-0.5+x)/(2*sin(y))))
tplquad(f,0,1,0,pi/2,0,pi/2)
错误是:
Blockquote File "", line 3, in File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py", line 526, in tplquad return dblquad(_infunc2,a,b,gfun,hfun,(func,qfun,rfun,args),epsabs=epsabs,epsrel=epsrel) File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py", line 461, in dblquad return quad(_infunc,a,b,(func,gfun,hfun,args),epsabs=epsabs,epsrel=epsrel) File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py", line 281, in quad retval = _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points) File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py", line 345, in _quad return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit) File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py", line 406, in _infunc a = gfun(x)
您知道错误可能来自哪里吗?
tplquad
的文档指出,内部积分的积分限制应作为外部积分变量的函数提供(即使它们恰好是您的情况下的常量)。
tplquad
在您的案例中的正确用法如下所示。请注意,f
定义中参数的顺序应对应于积分的顺序。 f
的第一个(最后一个)参数是最后一个(第一个)要集成的参数。在这种情况下,由于固定的集成限制,排序无关紧要。
import numpy as np
from scipy.integrate import tplquad
def f(y,x,z):
return 2*np.sin(z)*np.cos(np.arctan((2*np.cos(y)-0.5+x)/(2*np.sin(y))))
tplquad(f,0,np.pi/2, lambda z: 0, lambda z:1, lambda z, x: 0, lambda z, x: np.pi/2)
(1.9999999999999998, 2.492629060475153e-14)