编辑:这个问题基本上与this one相同,我鼓励观众去那里了解更多信息。再加上这个答案:因为我的函数缺少狭窄的凸起、奇点等;具有有限的积分边界;并且已知有一个小的整数解(我只需要1-2个sigfigs),这是蒙特卡罗算法的一个近乎理想的选择。最终,1e6分足以解决问题
我有一个由五个变量组成的非常复杂的trig函数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})
(为了不必要地精确,一旦我使用已知的预因子对其进行规范化,该积分将是整数值。)
我想知道,是否有比nqad()更好的集成方法?或者,如果没有,如何添加进度检查,以便我至少能感觉到我在集成过程中走了多远,可能是在每次完成对其中一个变量的集成时打印一个时间戳
(编辑:对错误复制的代码进行小修复)
看起来像是蒙特卡罗积分的例子
相关问题 更多 >
编程相关推荐