如何使用tplquad?

问题描述 投票:0回答:1

我尝试整合这个:

积分(积分(积分(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)

错误是:

块引用 文件“”,第 3 行,位于 文件“/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py”,第 526 行,位于 tplquad 返回 dblquad(_infunc2,a,b,gfun,hfun,(func,qfun,rfun,args),epsabs=epsabs,epsrel=epsrel) 文件“/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py”,第 461 行,位于 dblquad 中 返回四边形(_infunc,a,b,(func,gfun,hfun,args),epsabs = epsabs,epsrel = epsrel) 文件“/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py”,第 281 行,四元组 retval = _quad(func,a,b,args,full_output,epsabs,epsrel,限制,点) 文件“/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py”,第 345 行,在 _quad 中 返回 _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,限制) 文件“/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py”,第 406 行,在 _infunc 中 a = gfun(x)

您知道错误可能来自哪里吗?

python scipy numerical-integration
1个回答
1
投票

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)

© www.soinside.com 2019 - 2024. All rights reserved.