我试图在Python中计算一个简单的doble定积分:函数Max(0,(4-12x)+(6-12y))在平方[0,1] x [0,1]中。
我们可以使用Mathematica做到这一点,并获得准确的结果:
Integrate[Max[0, 4-12*u1 + 6-12*u2], {u1, 0, 1}, {u2, 0,1}] = 125/108.
通过简单的蒙特卡洛模拟,我可以确认此结果。但是,使用scipy.integrate.dblquad
得到的值为0.0005772072907971,错误为0.0000000000031299
from scipy.integrate import dblquad
def integ(u1, u2):
return max(0, (4 - 12*u1) + (6 - 12*u2))
sol_int, err = dblquad(integ, 0, 1, lambda _:0, lambda _:1, epsabs=1E-12, epsrel=1E-12)
print("dblquad: %0.16f. Error: %0.16f" % (sol_int, err) )
同意该函数不是可派生的,但是它是连续的,我认为这个特殊积分没有问题的原因。
我以为dblquad
可能有一个'options'参数,可以在其中尝试不同的数值方法,但我什么都没发现。
那么,我在做什么错了?
答案 0 :(得分:1)
尝试不同的数值方法
考虑到quad
在Windows上遇到的麻烦,这就是我的建议。将其更改为明确的两步过程后,可以用另一种方法替换quad
中的一个,romberg
似乎是我的最佳选择。
from scipy.integrate import quad, romberg
def integ(u1, u2):
return max(0, (4 - 12*u1) + (6 - 12*u2))
sol_int = romberg(lambda u1: quad(lambda u2: integ(u1, u2), 0, 1)[0], 0, 1)
print("romberg-quad: %0.16f " % sol_int)
这将在我的计算机上打印1.1574073959987758,希望您能得到相同的结果。