【发布时间】:2020-08-02 04:44:50
【问题描述】:
编辑:这个问题与this one 基本相同,我鼓励观众去那里了解更多信息。补充一下这个答案:因为我的函数缺乏狭窄的颠簸、奇点等;具有有限的集成界限;并且已知有一个小整数解(我只需要 1-2 个 sigfigs),它是蒙特卡洛算法的近乎理想的选择。最终1e6点就足够解决了。
我有一个非常复杂的由五个变量组成的三角函数x1, x2, x3, y1, z1 我正在尝试对 (-pi,pi) 进行积分(每个变量一次)。我知道解决方案是一个整数,所以我在与scipy.integrate.nquad() 进行数值积分时只要求一位数的精度;但它仍然在我的笔记本电脑上运行了 74.5 小时,在我停止之前没有任何结果。那时我也不知道我的进步是什么。
我的实际代码(和函数):
low_lim = -np.pi
hi_lim = np.pi
fn = lambda x1,y1,z1,x2,x3: (
(
cos((x1+y1+z1)/2) * cos((-x1+y1+z1)/2) *
cos((x1-y1+z1)/2) * cos((x1+y1-z1)/2)
) *
(
cos((x2+y1+z1)/2) * cos((-x2+y1+z1)/2) *
cos((x2-y1+z1)/2) * cos((x2+y1-z1)/2)
) *
(
cos((x3+y1+z1)/2) * cos((-x3+y1+z1)/2) *
cos((x3-y1+z1)/2) * cos((x3+y1-z1)/2)
) *
(sin((x1-x2)/2)**2 * sin((x1+x2)/2)**2 ) *
(sin((x2-x3)/2)**2 * sin((x2+x3)/2)**2 ) *
(sin((x1-x3)/2)**2 * sin((x1+x3)/2)**2 )
)
result = nquad(fn,[[low_lim,hi_lim],[low_lim,hi_lim],[low_lim,hi_lim],
[low_lim,hi_lim],[low_lim,hi_lim]],opts={'epsabs':1e0})
(为了不必要的精确,一旦我用一个已知的前置因子对其进行归一化,这个积分将是整数值。)
我想知道,有没有比 nquad() 更好的方法来执行这种集成?或者如果没有,如何添加进度检查,这样我至少不知道如何深入我的集成,也许是通过在每次完成对其中一个变量的集成时打印一个时间戳?
(编辑:对错误复制代码的小修复)
【问题讨论】: