使用Python进行渐变计算
使用Python进行渐变计算
我想了解一下numpy.gradient
是如何工作的。我使用梯度来尝试计算群速度(波包的群速度是频率相对于波数的导数,而不是速度的群)。我将一个3列数组输入给它,其中第一列和第二列是x和y坐标,第三列是该点(x,y)的频率。我需要计算梯度,我期望得到一个二维向量,梯度定义如下:
df/dx*i+df/dy*j+df/dz*k
而我的函数只是x和y的函数,所以我期望得到类似于
df/dx*i+df/dy*j
但是我得到了两个每个有3列的数组,也就是两个三维向量;一开始我以为将这两个数组相加就能得到我要找的向量,但是z分量没有消失。希望我在解释中已经足够清楚了。我想了解一下numpy.gradient
是如何工作的,以及它是否适合我的问题。否则,我想知道是否有其他可以使用的Python函数。
我的意思是:我想计算一个值数组的梯度:
data=[[x1,x2,x3]...[x1,x2,x3]]
其中x1、x2是均匀网格上的点坐标(我在布里渊区的点),x3是该点的频率值。我还输入了两个方向的导数步长:
stepx=abs(max(unique(data[:,0])-min(unique(data[:,0]))/(len(unique(data[:,0]))-1)
y方向同理。
我没有在网格上构建我的数据,我已经有了一个网格,这就是为什么这里给出的例子对我没有帮助的原因。
一个更合适的例子应该有一个点和值的网格,就像我现在有的那样:
data=[] for i in range(10): for j in range(10): data.append([i,j,i**2+j**2]) data=array(data,dtype=float) gx,gy=gradient(data)
还有一件事我可以补充的是,我的网格不是一个正方形的,而是一个二维晶体的布里渊区的形状。
我已经理解了numpy.gradient
只能在一个值的正方形网格上正常工作,而不是我要找的那种情况。即使我将我的数据作为一个网格,网格之外会有很多零值,这会给我的梯度添加非常大的向量,从而影响(负面地)计算的精度。对我来说,这个模块更像是一个玩具而不是一个工具,它有严重的限制。在Python中是否有更强大的东西,或者我最好从头开始编写其他东西,也许切换到Fortran?