【问题标题】:How can I calculate the gradient of a vector field from its values?如何根据其值计算矢量场的梯度?
【发布时间】:2020-07-03 11:40:37
【问题描述】:

我想要一些关于 numpy 和数组的帮助。我想计算一个向量场的梯度。

假设我有一个函数 foo,它接受一个坐标元组 (x,y,z) 并返回一个向量 (u,v,w)。

如果我有一个坐标数组 POS = [[x1,y1,z1],[x2,y2,z2],[x3,y3,z3],etc] 我可以生成一个向量数组,其原点位于DIR 中的位置和方向 = [[u1,v1,w1],[u2,v2,w2],[u3,v3,w3],etc]。

现在我如何计算这个向量场在 POS 的每个点的梯度?我最终需要的是另一个数组 GRAD = [grad1, grad2, grad3, etc],其中每个 grad 将是 POS 中相应点中向量场的偏导数的 3x3 数组。

PS:我知道我可以手动推导函数 foo,然后在 python 中实现导数,但在我的情况下,函数 foo 真的很复杂,我想以这种方式进行导数:)

EDIT1:现在我正在以这种方式提出 POS:

parts = 100
limit = 10
xs = linspace(-limit, limit, parts)
ys = linspace(-limit, limit, parts)
zs = linspace(-limit, limit, parts)

POS = array([(x, y, z) for z in zs for y in ys for x in xs])
DIR = array([foo(pos) for pos in POS])

如果需要,我可以这样做:

POS = POS.reshape(parts,parts,parts,3)
DIR = DIR.reshape(parts,parts,parts,3)

【问题讨论】:

  • 如果我的回答回答了这个问题,请考虑接受它。谢谢:)

标签: python-3.x numpy vector gradient derivative


【解决方案1】:

您可以通过以下方式使用numpy.gradient

import numpy as np

N = 100
limit = .1

def vec(x,y,z): # Example vector field
    return np.array([x,x,z])

x = np.arange(-limit, limit, 2*limit/N) # np.arange takes the spacing as 3. arg
y = np.arange(-limit, limit, 2*limit/N)
z = np.arange(-limit, limit, 2*limit/N)

# Create 3D grid from 1D arrays, indexing is important!
X,Y,Z = np.meshgrid(x,y,z,indexing='ij') 
V = vec(X,Y,Z) # Get vector field, shape: (3,N,N,N)

D = np.gradient(V, x, y, z, axis=(1,2,3)) # Get gradient, this is a list!
D = np.array(D).transpose((1,0,2,3,4)) # Make it an array and flip first axes.

结果数组的形状为(3,3,N,N,N),其中第一个轴索引向量场的分量,第二个轴索引坐标方向w.r.t。导数是计算出来的。

【讨论】:

  • 这很有帮助,非常感谢!只是为了确保我得到了形状,最后 D[i, j, :, :, :] 会从网格每个点的雅可比矩阵返回 dij 吗?就像 D[0,0,:,:,:] 将返回所有 dU/dx 和 D[1,1,:,:,:] 所有 dV/dy。
  • 是的,可以肯定的是:D[0,1,:,:,:] 给出所有 dU/dy。
  • @DavidWierichs 如果网格是任意/不规则的怎么办?
  • 这就是我们将位置传递给np.gradient 的原因(请注意,它们是每个坐标x, y, z 的一维数组,而不是网格坐标X, Y, Z)。它们只需要在形状上匹配,但可以任意间隔。 (对于上面的应用程序,实际上最好指定一个间距值2 *limit/N,然后将其用于所有 3 个方向和每个方向的所有间距。)
猜你喜欢
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 2017-08-13
  • 2019-01-23
  • 2015-01-12
  • 2018-05-16
  • 2020-04-04
相关资源
最近更新 更多