将多元trig函数与scipy进行数值积分的最有效方法?

2024-03-28 22:38:43 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑:这个问题基本上与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()更好的集成方法?或者,如果没有,如何添加进度检查,以便我至少能感觉到我在集成过程中走了多远,可能是在每次完成对其中一个变量的集成时打印一个时间戳

(编辑:对错误复制的代码进行小修复)


Tags: 函数编辑pi整数sincoshilow