【发布时间】:2017-05-11 21:23:52
【问题描述】:
我目前正在计算 Python 中的数值积分,它实际上是四个嵌套的数值积分。每个积分都是不同变量的函数,但我遇到的问题是限制取决于其嵌套在其中的积分(最外面的积分具有适当的浮点范围)。
例如,假设我有一个函数 f(a,b,c,d),其限制为 amin、amax、bmin、bmax、cmin、cmax、dmin、dmax。 amin 和 amax 是浮动的。 bmin 和 max 是 a 的函数,cmin 和 cmax 是 b 的函数,dmin 和 dmax 是 c 的函数。如果 scipy.integrate.quad() 只是一个 for 循环,那么对于每一步,都可以将 a(或 b、c 或 d)的值传递到限制中,使它们变为浮点数。
有没有办法用 scipy.integrate.quad 做到这一点?到目前为止,我已经尝试过简单的嵌套:
def int4(func,min1,max1,min2,max2,min3,max3,min4,max4):
finalfunc = scint.quad(scint.quad(scint.quad(scint.quad(func,min1,max1),min2,max2),min3,max3),min4,max4)
return finalfunc
在这种情况下,我仍然遇到我在 ValueError: Invalid limits given 之前遇到的相同错误,这似乎是因为我有未集成的符号。我也尝试过使用 nquad,但遇到了同样的错误。
这是我目前尝试向外迭代集成的过程,只在最后做数字:
def int4(func,var1,var2,var3,min1,max1,min2,max2,min3,max3,min4,max4):
func2 = sym.integrate(func,(var1,min1,max1)
func3 = sym.integrate(func2,(var2,min2,max2))
func4 = sym.integrate(func3,(var3,min3,max3))
finalfunc = scint.quad(func4,min4,max4)
return finalfunc
困难在于 min1、max1 是 var2 的函数,而我实际使用的函数似乎没有解析解。
如果我改为从最外向内而不是从最内向外集成,是否也有帮助?
感谢 Kazemakase,他的回答有助于解决我的问题!我使用对他编写的内容稍作修改的代码解决了这个问题,因此我将其包含在此处,以供将来遇到类似问题的任何其他人参考。
import numpy as np
import scipy.integrate as si
def func(x1, x2, x3, x4):
return x1**2 - x2**3+x3*x2 - x4*x3**3
def int1():
"""integrates `int2` over x1"""
a1, b1 = -1, 3
def int2(x1):
"""integrates `func` over x2 at given x1."""
#partial_func1 = lambda x2: func(x1, x2)
b2 = 1 - np.abs(x1)
a2 = -np.abs(x1**3)
def int3(x2):
a3 = x2
b3 = -a3
def int4(x3):
partial_func = lambda x4: func(x1, x2, x3, x4)
a4 = 1+np.abs(x3)
b4 = - a4
return si.quad(partial_func,a4,b4)[0]
return si.quad(int4, a3, b3)[0]
return si.quad(int3, a2, b2)[0]
return si.quad(int2, a1, b1)[0]
result = int1() # -22576720.048151683
【问题讨论】:
-
@Gerry 非常感谢 cmets,我已经尝试解决这个问题。如果需要更多信息,请告诉我!
标签: python loops scipy nested numerical-integration