我想知道
我的函数只是x和y的函数,我确实期望得到类似的东西
但是我有两个每个有3列的数组,即2个3D向量;起初我以为这两个向量的和会给我所寻找的向量,但是z分量并没有消失。希望我在解释上已经足够清楚了。我想知道
我的意思是:我想计算一个值数组的梯度。
在一个均匀网格上,x1和x2是点的坐标(我在布里渊区域上的点),x3是该点频率的值。我还输入了两个方向的导数步骤。
在y方向上相同。 我没有在网格上构建我的数据,我已经有一个网格,这就是为什么这里给出的示例对我没有帮助。 一个更合适的例子应该有一个像我现在拥有的点和值的网格。
另外一件我可以补充的是,我的网格不是一个正方形,而是具有多边形形状,即二维晶体的布里渊区。
我明白了,
numpy.gradient
是如何工作的。
我使用梯度来尝试计算群速度(波包的群速度是频率对波数的导数,而不是一组速度)。我将一个三列数组输入给它,前两列是x和y坐标,第三列是该点(x,y)的频率。我需要计算梯度,并且我期望得到一个二维向量,因为梯度的定义如此。df/dx*i+df/dy*j+df/dz*k
我的函数只是x和y的函数,我确实期望得到类似的东西
df/dx*i+df/dy*j
但是我有两个每个有3列的数组,即2个3D向量;起初我以为这两个向量的和会给我所寻找的向量,但是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?
x1,x2
或最后一个示例中的i,j
。它只想要一个i ** 2 + j ** 2
值的矩阵。您的i ** 2 + j ** 2
值的矩阵隐含地对应于xy
平面,并且gradient
的可选标量参数考虑了步长假设,即如果您的x
点之间不是相距1
,您的y
点也是如此。我今天要出城,但我晚上回来后会更新我的答案。 - seth