如何使用 Python 计算向量场的散度?

发散是物理、数学和生物学等许多领域中使用的最关键的术语。发散这个词代表从一个点的分离或移动。分歧也可以是两条或多条线相互远离的点。

在向量微积分中,散度是一个术语,用于表示分量或场如何彼此靠近或远离。或者它也可以测量物体之间的距离。

散度通常被视为返回标量场作为输出的向量场。矢量场是一个具有与之相关的数量和方向的场,而标量只有一个数量。日常差异的一个例子是水龙头的水流。

理解散度背后的概念取决于每个分量的偏导数,然后对导数求和。

有一个名为“sympy”的模块可用于处理微积分。

了解如何使用 sympy 处理微积分。

我们可以使用 Python 计算向量场的散度。我们可以使用“scipy”库,它有一个专门用于发散的方法。我们还可以使用 Numpy 库手动计算散度。

您可以在此处了解有关 scipy 模块的更多信息。

让我们浏览 Numpy 库并学习如何使用 Numpy 计算散度。

Numpy 库

Numpy 代表数值Python。它主要与数组一起工作,流行的pandas库也是基于这个库构建的。它的开发主要是为了将 C 和 Fortran 等语言的计算能力引入 Python。

它有许多内置方法可用于线性代数、傅里叶变换、值分解等等。

请参阅本教程以学习使用爱因斯坦求和。

向量场与 np.gradient 的散度

Numpy库的梯度法用于计算数组的二阶导数。该方法的语法如下。

numpy.gradient(f, *varargs, axis=None, edge_order=1)

让我们看看该方法的参数。

f此参数采用数组或类似数组的对象作为输入。

varags是一个参数,用于包含确定输入数组中每个维度的间距的变量参数。

axis:我们可以指定要计算梯度的轴。

edge_order:使用边界处的 N 阶精确差来计算梯度。默认值为 1。

让我们看看计算散度的代码。我们将计算典型矢量场的散度 – (2y^2+x-4)i+cos(x)j该场的散度是常数,为1。我们可以通过对向量进行偏导来求出散度。

散度计算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np
def F_x(x, y):
    return 2 * y**2 + x - 4
def F_y(x, y):
    return np.cos(x)
x = np.linspace(-1, 1, 5)
y = np.linspace(-1, 1, 5)
X, Y = np.meshgrid(x, y)
F_X = F_x(X, Y)
F_Y = F_y(X, Y)
dFX = np.gradient(F_X, x, axis=1)
dFY = np.gradient(F_Y, y, axis=0)
div = dFX+dFY
print(div)

在第一行中,我们将 numpy 库导入为 np.

我们正在创建两个函数F_xsnd F_y,其中 F 是我们决定的向量场。F_x存储字段的第一个分量 – (2y^2+x-4),`F_y 存储另一个分量 cos(x)。

linspace我们正在使用检查字段散度的方法创建一个包含 -1 到 1 之间 5 个值的网格。并且不建议按原样计算矢量场的散度。

我们正在使用该函数计算各个分量的梯度np.gradient结果分别存储在dFX和中dFY

这些分量相加在一起,结果存储在一个名为 div 的变量中,这就是域的散度。

使用梯度计算场的散度

有一种更简单的方法可以使用相同的方法完成相同的事情。我们可以直接计算梯度,而不是划分场的分量。

import numpy as np
def compute_div(F, x, y):
    par_x = np.gradient(F[0], x, axis=0)
    par_y = np.gradient(F[1], y, axis=1)
    div = par_x + par_y
    return div
x = np.linspace(-10, 10,5)
y = np.linspace(-10, 10,5)
X, Y = np.meshgrid(x, y, indexing='ij')
F = [ 2 * Y**2 + X - 4,
    np.cos(X)]
divg= compute_div(F, x, y)
print("Divergence of the vector field:\n", divg)

我们正在创建一个名为 的函数compute_div,它将向量场(F)和轴(x 和 y)作为参数。

我们通过指定分量的索引来直接计算字段的偏导数。例如,分量 2 * y**2 + x – 4 取为 F[0[,另一部分 cos(x) 取为 F[1],用梯度来计算导数。

这些值存储在par_x和 等变量中par_y这些分量的总和存储在名为 div 的变量中。

我们还创建了一个网格来填充场的分歧。F 存储我们使用的向量场。使用相应的值调用该函数compute_div,并将结果存储在 divg 中。

差异打印在下一行中。

使用梯度的散度

结论

我们讨论了向量场的散度以及使用 Numpy 库求向量场散度的方法。

发散用于表示与点的分离或移动。分歧也可以是两条或多条线相互远离的点。分歧的一个例子是从水龙头流出的水或路上离你较远的人。

矢量场具有方向和值,而标量具有数量。Divergence 采用向量场并返回标量。

我们使用 Numpy 库的梯度方法来计算 2D 矢量场的散度。您可以使用相同的方法并使用您自己的向量场来计算散度。如果您使用 3D 矢量场(也有 k 个分量),您只需添加另一个变量来计算该分量的偏导数,然后将所有三个相加。

参考

您可以在此处找到有关梯度方法的更多信息。

堆栈溢出。