我希望为新项目尽可能多地使用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)