注册 登录
编程论坛 Python论坛

关于积分

lxping08 发布于 2023-04-19 11:31, 225 次点击
from scipy import integrate
def f(x,y,z):
    return x
def bounds_x():
    return [0,1]
def bounds_y(x):
    return [0,(1-x)/2]
def bounds_z(x,y):
    return [0,(1-x-2*y)]
v,err=integrate.nquad(f,[bounds_z,bounds_y,bounds_x])
print("f函数的三重积分是:{:.4}".format(v))
输出结果是0.02604
实际结果是0.02083
   这是出了什么问题,难道是nquad()函数的误差控制问题?
11 回复
#2
东海ECS2023-04-19 19:22
是的,这个问题可能与nquad中的误差控制有关。nquad函数默认使用adaptive quadrature方法计算多重积分,其中包括一个绝对误差控制,以确保计算结果的准确性。但是,这个控制的精度是由绝对误差容许值atol和相对误差容许值rtol来控制的,默认值为1.49e-08。

为了提高计算精度,可以尝试调整atol和rtol的值。例如,将它们都设置为1e-12:

v, err = integrate.nquad(f, [bounds_z, bounds_y, bounds_x], atol=1e-12, rtol=1e-12) print("f函数的三重积分是:{:.4}".format(v))


这将会得到更准确的积分结果。

此外,这个问题还可能与积分边界的数量级有关。在这里的例子中,我们的积分边界最大值比较小,可能导致数值计算误差。因此,我们可以尝试缩小边界,并调整绝对误差容许值和相对误差容许值以提高计算精度。
#3
lxping082023-04-19 19:56
回复 2楼 东海ECS
  晚上回来再倒腾下!其实,我看官方文档也注意了相关的变量顺序,但相差更大了。
i=integrate.nquad(lambda z,y,x:x,[lambda x,y:[0,1-x-2*y],lambda x:[0,(1-x)/2],[0,1]])
如果说函数f(z,y,x)的变量顺便必须对应积分上下限,那相差就更大了
i的三重积分是:(-0.010416666666666668, 1.1042013680736411e-14)
#4
lxping082023-04-19 19:57
听说,是用Fortran来写的,那玩意儿远古时代的事了
#5
lxping082023-04-19 20:53
回复 2楼 东海ECS
TypeError: nquad() got an unexpected keyword argument 'epsabs'
当我重新设置这epsabs=1.49e-10, epsrel=1.49e-10时,tpl()不报错,而nquad()则报上面的错.
不过即使三重积分将误差控制参数调小级别也相差不大
#6
lxping082023-04-20 09:51
再来吐槽下哈,输出的元组第二项说误差上限都e-14级别,跟真值比较一正一负,怎么可能误差这么小!刚用MATLAB求了下,就是1/48准确得很。看来,是nquad()这个函数写得不正确估计
#7
sheeboard2023-04-20 10:33
def f(x,y,z):
    return x
这句只是求 x dx?

[此贴子已经被作者于2023-4-20 10:40编辑过]

#8
lxping082023-04-20 10:39
以下是引用sheeboard在2023-4-20 10:33:15的发言:

def f(x,y,z):
    return x
这句只是求 x dx,为什么要加y,z参数,或是加了不用?

f(x,y,z)=x,还有啥不知道,去看看官方文档
#9
sheeboard2023-04-20 11:21
我做的结果
只有本站会员才能查看附件,请 登录

scipy精度应该是没问题的
#10
lxping082023-04-20 11:45
回复 9楼 sheeboard
i=integrate.nquad(lambda z,y,x:x,[lambda x,y:[0,1-x-2*y],lambda x:[0,(1-x)/2],[0,1]])
你用nquad()跑,不要用tplquad()。跑完再看,后者是准确的,仔细看我发帖内容再说!
#11
lxping082023-04-20 11:46
回复 9楼 sheeboard
还有你说准确,要把代码贴上来,看看就知道你调用哪个函数算的。
#12
东海ECS2023-04-21 21:41
😵‍💫😵‍💫😵‍💫

[此贴子已经被作者于2023-4-21 21:43编辑过]

1