SciPy:加速复杂积分的方法

SciPy: way to speed up a complicated integral

我要计算一个非常复杂的积分:

from __future__ import division
from scipy.integrate import quad, nquad
import numpy as np

alpha = np.array([0.298073, 1.242567, 5.782948, 38.474970])
trial = np.array([0.08704173, 0.52509737, 0.51920929, 0.31233737])


class EigenvalueProblem:

    def __init__(self, a, t):
        self.alpha = a
        self.trial = t

    # Hamiltonian, interaction part
    def hartree_integrand(self, coeff):
        def hartree_potential(rr2):
            return np.array([coeff[ii] * coeff[jj] *
                             np.exp(-(self.alpha[ii] +
                                      self.alpha[jj]) * rr2 ** 2)
                             for ii in range(0, 4) for jj in range(0, 4)]).sum()

        def length(theta, rr1, rr2):
            return 1 / np.sqrt(rr1 ** 2 + rr2 ** 2 -
                               2 * rr1 * rr2 * np.cos(theta))

        def tmp(theta, rr1, rr2):
            return 8 * np.pi ** 2 * rr1 ** 2 * rr2 ** 2 * \
                np.sin(theta) * hartree_potential(rr2) * \
                length(theta, rr1, rr2)

        def integrand(ii, jj, theta, rr1, rr2):
            return np.exp(-(self.alpha[ii] + self.alpha[jj]) * rr1 ** 2) * tmp(theta, rr1, rr2)

        return [
            nquad(lambda theta, rr1, rr2: integrand(i, j, theta, rr1, rr2),
                  [[0, np.pi], [0, np.inf], [0, np.inf]]) for i in range(0, 4) for j in range(0, 4)]


hat = EigenvalueProblem(alpha, trial)
print hat.hartree_integrand(trial)

数学上我想计算的是 this (which is the integrand function), with paremeters here。然而,计算这个积分需要几个小时以上。我想知道有什么方法可以加快速度吗?非常感谢!

您应该首先将 r1 和 r2 的积分限制从 -Infinity 扩展到 +Infinity - 扩展限制, 乘以 1/2*1/2, 等等

其次,改用Gauss-Hermite quadrature,正好适合与e-x2内核集成功能。

适当的代码在 NumPy 中,请参阅其中的参考资料