如何根据其值计算矢量场的梯度?

How can I calculate the gradient of a vector field from its values?

我需要一些有关 numpy 和数组的帮助。我想计算矢量场的梯度。

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

然后如果我有一个坐标数组 POS = [[x1,y1,z1],[x2,y2,z2],[x3,y3,z3],etc] 我可以生成一个向量数组pos 的原点和 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)

您可以通过以下方式使用 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。计算了导数。