python的scipy重积分存在较大误差?

最近做到一个题,求重积分

化极坐标之后手算得到336pi/5=211.11502632

因为没有标准答案可以参考,遂用几种方法验算。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import math
from scipy import integrate

f = lambda x, y, z : (x+y-z)**2
g = lambda x : -pow(4-x**2,1/2)
h = lambda x : pow(4-x**2,1/2)
q = lambda x, y : min(pow((x**2+y**2)/3,1/2),-pow(4-x**2-y**2,1/2)+2)
r = lambda x, y : pow(4-x**2-y**2,1/2)+2
v, err = integrate.tplquad(f, -2, 2, g, h, q, r)
print(f"直接计算原题:{v}")
print("")
fv=lambda t,p,r:pow(r,4)*math.sin(p)
v,err=integrate.tplquad(fv,0,2*math.pi,0,math.pi/3,0,lambda p,t:4*math.cos(p))
print(f"化为极坐标,做三重积分:{v}")
fs=lambda p,r:pow(r,4)*math.sin(p)
s,err=integrate.dblquad(fs,0,math.pi/3,0,lambda p:4*math.cos(p))
print(f"化为极坐标,先二重积分再乘2pi:{s*2*math.pi}")

输出的结果为

IntegrationWarning: The occurrence of roundoff error is detected, which prevents 
  the requested tolerance from being achieved.  The error may be 
  underestimated.
  quad_r = quad(f, low, high, args=args, full_output=self.full_output,
直接计算原题:218.82909084385494

化为极坐标,做三重积分:1682.8088127945682
化为极坐标,先二重积分再乘2pi:2.7726236252582788

与此同时作为对照组的matlab效果如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
ff=@(x,y,z) (x+y-z).^2;
zmin=@(x,y) max(((x.^2+y.^2)./3).^1/2,2-(4-x.^2-y.^2).^(1/2));
zmax=@(x,y) 2+(4-x.^2-y.^2).^(1/2);
ymin=@(x)-(4-x.^2).^(1/2);
ymax= @(x)(4-x.^2).^(1/2);
integral3(ff,-2,2,ymin,ymax,zmin,zmax)
直接计算原题,输出:ans = 214.4661

f=@(p,r,t) r.^4.*sin(p);
rmax=@(p) 4.*cos(p);
integral3(f,0,pi/3,0,rmax,0,2*pi)
化为极坐标,做三重积分,输出:ans = 211.1150

fs=@(p,r)r.^4.*sin(p);
rmax=@(p) 4.*cos(p);
integral2(fs,0,pi/3,0,rmax)*2*pi
化为极坐标,先二重积分再乘2pi,输出:ans= 211.1150

怎么回事呢?

再测试了一些别的积分,似乎python又算得挺准。

难道这是一个奇妙的反例吗?

应该是我的问题罢(悲)