我想把一个离散函数与scipy.integrate.trapz在非均匀二维网格上。在
例如,在5*5网格上,我有以下10个点坐标和值:
coord = np.array([(0,0),(2,1),(0,2),(2,3),(3,4),(4,0),(1,3),(4,2),(3,0),(1,4)])
values = np.array([1,5,1,4,6,3,2,0,5,2])
在网格上是这样的:
^{pr2}$我有以下代码,它似乎不起作用,而且效率不高,也不容易扩展到具有更多点的三维网格:
from scipy import integrate
import numpy as np
coord = coord.swapaxes(0,1)
nx = np.unique(coord[1]).size
ny = np.unique(coord[0]).size
intg_x = np.zeros(nx)
for x in range(nx):
indices = np.where(coord[1] == x)[0]
v = values[indices]
c = coord[0][indices]
intg_x[x] = integrate.trapz(v,c)
intg = integrate.trapz(intg_x,np.unique(coord[0]).sort())
print(intg)
Out[1]: -3.0
结果显然是错误的,因为只有正的值需要整合。用梯形规则手工积分,得到:积分_x=[13,0,2,3,8],积分=15,5。问题似乎来自于对x的积分,但我不知道迭代有什么问题。在
有没有更简洁的方法来编写它,这样我就可以将代码扩展到具有更多点的三维网格中?
编辑:
所以我设法修复了代码并得到了正确的结果!问题是c没有被排序,所以trapz会给出负值,因为它会回溯。我现在使用以下行:
for x in range(nx):
inds = np.where(coord[1] == x)[0]
c = coord[0][inds]
inds = [x for _,x in sorted(zip(c,inds))]
c = coord[0][inds]
v = values[inds]
intg_x[x] = integrate.trapz(v,c)
这确实给出了正确的结果:
In [0]: print(intg_x,intg)
Out[0]: [ 13. 0. 2. 3. 8.] 15.5
我仍然在寻找一个解决方案,使代码更简单,因为它很难转换到三维网格,因为它根本没有效率。提前谢谢你能给我的任何帮助!在
目前没有回答
相关问题 更多 >
编程相关推荐