我试着在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
呼叫有什么问题?
1条答案
按热度按时间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)
。