更清洁的集成方式西皮·特拉普兹在2D中

2024-04-26 09:16:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把一个离散函数与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

我仍然在寻找一个解决方案,使代码更简单,因为它很难转换到三维网格,因为它根本没有效率。提前谢谢你能给我的任何帮助!在


Tags: 代码in网格fornpscipyuniquevalues