【问题标题】:Most efficient way to numerically integrate a multivariate trig function with scipy?将多元三角函数与 scipy 进行数值集成的最有效方法?
【发布时间】: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() 更好的方法来执行这种集成?或者如果没有,如何添加进度检查,这样我至少不知道如何深入我的集成,也许是通过在每次完成对其中一个变量的集成时打印一个时间戳?

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

【问题讨论】:

    标签: python scipy


    【解决方案1】:

    看起来像是蒙特卡罗集成的案例。

    【讨论】:

    • 接受你的回答,因为它为我指明了正确的方向,我很快找到了this question,我自己的可能算作重复。
    猜你喜欢
    • 2015-07-02
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 2020-05-18
    相关资源
    最近更新 更多