标题:关于积分
只看楼主
lxping08
Rank: 2
等 级:论坛游民
帖 子:47
专家分:21
注 册:2023-3-7
结帖率:14.29%
已结贴  问题点数:20 回复次数:11 
关于积分
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()函数的误差控制问题?
搜索更多相关主题的帖子: 函数 return def 积分 结果 
2023-04-19 11:31
东海ECS
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:Python
等 级:版主
威 望:19
帖 子:376
专家分:1454
注 册:2023-1-24
得分:10 
是的,这个问题可能与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))


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

此外,这个问题还可能与积分边界的数量级有关。在这里的例子中,我们的积分边界最大值比较小,可能导致数值计算误差。因此,我们可以尝试缩小边界,并调整绝对误差容许值和相对误差容许值以提高计算精度。

会当凌绝顶,一览众山小.
2023-04-19 19:22
lxping08
Rank: 2
等 级:论坛游民
帖 子:47
专家分:21
注 册:2023-3-7
得分:0 
回复 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)
2023-04-19 19:56
lxping08
Rank: 2
等 级:论坛游民
帖 子:47
专家分:21
注 册:2023-3-7
得分:0 
听说,是用Fortran来写的,那玩意儿远古时代的事了
2023-04-19 19:57
lxping08
Rank: 2
等 级:论坛游民
帖 子:47
专家分:21
注 册:2023-3-7
得分:0 
回复 2楼 东海ECS
TypeError: nquad() got an unexpected keyword argument 'epsabs'
当我重新设置这epsabs=1.49e-10, epsrel=1.49e-10时,tpl()不报错,而nquad()则报上面的错.
不过即使三重积分将误差控制参数调小级别也相差不大
2023-04-19 20:53
lxping08
Rank: 2
等 级:论坛游民
帖 子:47
专家分:21
注 册:2023-3-7
得分:0 
再来吐槽下哈,输出的元组第二项说误差上限都e-14级别,跟真值比较一正一负,怎么可能误差这么小!刚用MATLAB求了下,就是1/48准确得很。看来,是nquad()这个函数写得不正确估计
2023-04-20 09:51
sheeboard
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:6
帖 子:42
专家分:179
注 册:2023-2-16
得分:10 
def f(x,y,z):
    return x
这句只是求 x dx?

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

2023-04-20 10:33
lxping08
Rank: 2
等 级:论坛游民
帖 子:47
专家分:21
注 册:2023-3-7
得分:0 
以下是引用sheeboard在2023-4-20 10:33:15的发言:

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

f(x,y,z)=x,还有啥不知道,去看看官方文档
2023-04-20 10:39
sheeboard
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:6
帖 子:42
专家分:179
注 册:2023-2-16
得分:0 
我做的结果

scipy精度应该是没问题的
2023-04-20 11:21
lxping08
Rank: 2
等 级:论坛游民
帖 子:47
专家分:21
注 册:2023-3-7
得分:0 
回复 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()。跑完再看,后者是准确的,仔细看我发帖内容再说!
2023-04-20 11:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-511967-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.099872 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved