【发布时间】:2019-07-28 06:58:40
【问题描述】:
所以我有一个在域上不规则采样的二维函数,我想计算表面下的体积。数据按照[x,y,z]组织,举个简单的例子:
def f(x,y):
return np.cos(10*x*y) * np.exp(-x**2 - y**2)
datrange1 = np.linspace(-5,5,1000)
datrange2 = np.linspace(-0.5,0.5,1000)
ar = []
for x in datrange1:
for y in datrange2:
ar += [[x,y, f(x,y)]]
for x in xrange2:
for y in yrange2:
ar += [[x,y, f(x,y)]]
val_arr1 = np.array(ar)
data = np.unique(val_arr1)
xlist, ylist, zlist = data.T
其中np.unique 对第一列中的数据进行排序,然后是第二列。数据以这种方式排列,因为我需要在原点周围进行更多采样,因为必须解决一个尖锐的特征。
现在我想知道如何使用scipy.interpolate.interp2d 构造一个二维插值函数,然后使用dblquad 对其进行积分。事实证明,这不仅不优雅而且速度慢,而且还会抛出错误:
RuntimeWarning: No more knots can be added because the number of B-spline
coefficients already exceeds the number of data points m.
有没有更好的方法来整合以这种方式排列的数据或克服这个错误?
【问题讨论】:
-
您似乎正在尝试为不精确的(采样)数据拟合精确的解决方案,而 scipy 正在递归寻找精确的解决方案。老实说,我的第一种方法是使用
interp2d(kind='linear')并使用固定的 dx、dy 重新采样线性网格,然后将其相加,看看是否能获得所需的精度。 -
我认为这可能有问题,因为在我要采样的函数的起源处有一个非常尖锐的特征(几乎是奇异的)。我希望,只要插值函数是用具有足够高分辨率的数据构建的,那么
dblquad就可以有效地对其进行采样。修复网格步骤需要非常小的 dx 和 dy。 -
您是否总是知道尖锐特征的位置以便更彻底地对其进行采样?
-
是的,它应该始终在 (0,0) 左右
-
我的下一个想法是使用 x,y 点生成一个 voronoi 图,以获得
sum(z/area)的每个样本下方的区域,尽管我不太确定如何处理图的边缘scipy.spatial.Voronoi... 正在努力...
标签: python numpy scipy integration