对于平稳函数的积分,Python的nquad的速度非常慢?

时间:2019-02-26 12:04:12

标签: python numpy scipy scientific-computing

我希望为新项目尽可能多地使用Python功能,但是我遇到了一个严重的计算效率问题,我希望它可以解决,所以我现在不必开始链接到C ++早期。

我有以下代码与两个三角形的积分有关,这两个三角形有一个共同的顶点,因此一个被积物可能变成奇数。

这是无关紧要的,但是下面的代码是“正则化的”,因此没有奇异的行为,并且集成现在在域(0,1)^ 4上进行。由于被积物是光滑的,因此我希望nquad能够非常有效地进行集成,但是在Jupyter笔记本(i7-8700K,3.70GHz×6、32 GB RAM)中,在我的机器上花费大约7秒钟。

对于平滑功能的集成,这似乎非常慢。我只使用Python 2个月了,所以从性能的角度来看我的代码编写不佳吗?

是否有任何方法可以加快此集成速度,还是必须诉诸C ++才能实现快速集成?

import numpy as np
import numpy.linalg as LA
from scipy.integrate import nquad
import time

##################################################
# Triangle vertices
##################################################
v_a_1 = np.array([[4,0,0]]).T
v_a_2 = np.array([[5,1,0]]).T
v_a_3 = np.array([[4,2,0]]).T

v_b_1 = np.array([[4,0,0]]).T
v_b_2 = np.array([[5,-1,0]]).T
v_b_3 = np.array([[4,-2,0]]).T

##################################################
# g_tau
##################################################
def g_tau():
    J_tau = v_a_2-v_a_1
    J_tau = np.append(J_tau, v_a_3-v_a_2,axis=1)
    G = np.dot(J_tau.T,J_tau)
    return np.sqrt(LA.det(G))

##################################################
# g_t
##################################################
def g_t():
    J_t = v_b_2-v_b_1
    J_t = np.append(J_t, v_b_3-v_b_2,axis=1)
    G = np.dot(J_t.T,J_t)
    return np.sqrt(LA.det(G))

##################################################
# chi_tau
##################################################
def chi_tau(x):
    return v_a_1 + (v_a_2-v_a_1)*x[0] + (v_a_3-v_a_2)*x[1]

##################################################
# chi_t
##################################################
def chi_t(y):
    return v_b_1 + (v_b_2-v_b_1)*y[0] + (v_b_3-v_b_2)*y[1]

##################################################
# k_
##################################################
def k_(x,y):
    return LA.norm(x+y)

##################################################
# k
##################################################
def k(x,y):
    return k_(chi_tau(x),chi_t(y))*g_tau()*g_t()

##################################################
# func
##################################################
def func(z, y, x, w):
    a_1_1 = z;
    a_1_2 = z * w;
    a_2_1 = z * x;
    a_2_2 = z * x * y;

    a_1 = np.array([a_1_1,a_1_2]).T
    a_2 = np.array([a_2_1,a_2_2]).T
    res = k(a_1,a_2)

    return res

start=time.time()
[I_app_b_3_b_3, err] = nquad(func, [[0,1], [0,1], [0,1], [0,1]])
end=time.time()

print(end-start)

0 个答案:

没有答案