我有一个数组Q
,表示在2D网格上定义的模拟结果,其笛卡尔网格点在两个数组X
和Y
上可用(这些都是2D数组相同的形状)。我还有一个函数Qexact
,它定义了模拟的精确解。这是两个参数x
和y
的函数,它返回给定位置的精确解的值。该函数可以在标量和numpy数组上工作。
由于我正在使用不同的网格间距测试模拟,因此我使用公共网格X_common
和Y_common
,并在此网格上双线性插入我的解Q
。我使用函数scipy.interpolate.interpn
这样做。我从这里减去确切的解,我取结果的绝对值,得到在这个常见的笛卡尔网格上定义的绝对误差。
我想将此结果现在整合到我的域中。我计划使用scipy.integrate.dblquad
。问题是我的集成函数应返回的值是使用插值计算的。
换句话说,我的集成功能可以实现如下:
def func(y, x):
'''Returns the absolute error at the position (x, y)'''
# Interpolate the global array `Q` at position (x, y)
# The list `points` is a global variable holding the
# values of the grid on which `Q` is defined
xy = np.array([[x, y]])
Qval = scipy.interpolation.interpn(points, Q, xy)
# Compute reference value of Q at the requested position
# By using the exact solution
Qref = Qexact(x, y)
# Return absolute error
# (Remark: I could have to extract the only value
# out of the ndarray)
return abs(Qref - Qval)
这个问题是我必须为scipy.integration.dblquad
使用的每个点调用一次插值函数。我怀疑这可能非常昂贵,而不是只用一个大数组xy
调用它来一次性获取所有需要的值。
问题是:上面显示的原型方法是否会比理想方法慢得多,其中插值所需的所有点都是一次计算的?
相关问题是:实施此集成的最有效方法是什么?