scipy 对于三重积分,nquad给出与tplquad不同的结果

5us2dqdw  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(102)

我试着在scipy中做这个三重积分:

from scipy.integrate import dblquad, tplquad, nquad

def inte(z, y, x): 
    return 2*z

tplquad得到正确的结果:

volume = tplquad(inte, 0, 1, lambda x: x**3, lambda x: x, lambda x, y: 0, lambda x, y: 2*x)
volume[0] 
0.33333333333333337

这就是我使用nquad时发生的情况:

def range_3():
    return [0, 1]

def range_2(x):
    return [x**3, x]

def range_1(x, y):
    return [0, 2*x]

volume, error = nquad(inte, [range_1, range_2, range_3])
volume
0.2

我的nquad呼叫有什么问题?

r8xiu3jd

r8xiu3jd1#

我盯着这个问题看了一会儿,试图弄清楚它,但我终于明白了。当你传递函数作为tplquad的积分限制时,函数参数的顺序是x, y,但对于nquad,它是y, x。这一点可以在查看文档时看到。
tplquad

qfun:* 函数或浮点数 *

z中的下边界曲面。它必须是一个以(x,y)顺序接受两个浮点数并返回一个浮点数或一个表示恒定边界曲面的浮点数的函数。
nquad

范围:* 可迭代对象 *

...如果ranges的元素是可调用的,那么它将被所有可用的集成参数以及任何参数参数调用。例如如果func = f(x0, x1, x2, t0, t1),则ranges[0]可以被定义为(a, b)或者被定义为(a, b) = range0(x1, x2, t0, t1)

from scipy.integrate import tplquad, nquad

def integrand(z, y, x): 
    return 2*z

res_tplquad, _ = tplquad(integrand, 
                         0, 1, 
                         lambda x: x**3, lambda x: x, 
                         0, lambda x, y: 2*x)
print(res_tplquad)      # 0.33333333333333337

def range_3():
    return [0, 1]

def range_2(x):
    return [x**3, x]

def range_1(y, x):
    return [0, 2*x]

res_nquad, _ = nquad(integrand, [range_1, range_2, range_3])
print(res_nquad)        # 0.33333333333333337

相关问题