# gradient


数值梯度

函数库: TyMath

# 语法

FX = gradient(F)
FX, FY = gradient(F)
FX, FY, ..., FN = gradient(F)
_ = gradient(F, h)
_ = gradient(F, hx, hy,..., hN)

# 说明

FX = gradient(F) 返回向量 F 的一维数值梯度。输出 FX 对应于 ,即 (水平)方向上的差分。点之间的间距假定为 1。示例


FX, FY = gradient(F) 返回矩阵 F 的二维数值梯度的 x 和 y 分量。附加输出 FY 对应于 ,即 (垂直)方向上的差分。每个方向上的点之间的间距假定为 1。示例


FX, FY, FZ,...,FN = gradient(F) 返回 F 的数值梯度的 N 个分量,其中 F 是一个 N 维数组。


_ = gradient(F, h) 使用 h 作为每个方向上的点之间的均匀间距。您可以指定上述语法中的任何输出参数。示例


_ = gradient(F, hx, hy,..., hN) 为 F 的每个维度上的间距指定 N 个间距参数。示例

# 示例

向量的梯度

计算单调递增向量的梯度。

using TyMath
x = 1:10
x = 1:10
fx = TyMath.gradient(x)
fx = 10-element Vector{Float64}:

  1.0
  1.0
  1.0
  1.0
  1.0
  1.0
  1.0
  1.0
  1.0
  1.0
向量场的等高线图

计算 在网格上的二维梯度。

using TyMath
using TyBase
using TyPlot
x, y = meshgrid2(-2:0.2:2, -2:0.2:2)
z = @. x*exp(-x^2-y^2)
px, py = TyMath.gradient(z)

在相同图窗中绘制等高线和向量。

figure()
contour(x,y,z)
hold("on")
quiver(x,y,px,py,length=1)
hold("off")
线性函数逼近

使用特定点处的梯度线性逼近附近点处的函数值,并将其与实际值进行比较。

函数值的线性逼近方程是:

也就是说,如果知道函数 的值和导数 在特定点 的斜率,则可以根据此信息近似求出该函数在附近点 的值。

计算正弦函数在 -1 和 0.5 之间的一些值,然后计算梯度。

using TyMath
y = sin.(-1:0.25:0.5)
yp = TyMath.gradient(y, 0.25)

根据 x = 0.5 处的函数值和导数来预测 sin(0.5005) 的值。

y_guess = y[end] + yp[end]*(0.5005-0.5)
y_guess = 0.4798895817629023

计算实际值进行比较。

y_actual = sin(0.5005)
y_actual = 0.4798642699386741
计算指定点处的梯度

求多变量函数在指定点处的梯度值。

以多变量函数 为例。

using TyMath
using TyBase
using TyPlot
x, y = meshgrid2(-3:0.2:3, -3:0.2:3)
f = @. x^2 * y^3
surf(x,y,f)
xlabel("x")
ylabel("y")
zlabel("z")

计算网格上的梯度。

fx, fy = TyMath.gradient(f,0.2)

提取点 (1,-2) 处的梯度值。为此,首先获取要使用的点的索引。然后,使用索引从 fx 和 fy 中提取相应的梯度值。

x0 = 1
y0 = -2
t = @. (x == x0 && y == y0)
indt = find(t)
f_grad = [fx[indt] fy[indt]]
f_grad = 1×2 Matrix{Float64}:
 
 -16.0  12.04

在点 (1,-2) 处的确切梯度值为:

# 输入参数

F - 输入数组
向量 | 矩阵 | 多维数组

输入数组,指定为向量、矩阵或多维数组。

数据类型: Int | Float

复数支持:

h - 点之间的均匀间距
1(默认) | 标量

所有方向上的点之间的均匀间距,指定为标量。

示例: FX, FY = TyMath.gradient(F, 2)

数据类型: Int | Float

复数支持:

hx, hy, hN - 点之间的间距(作为单独的输入)
1(默认) | 标量 | 向量

每个方向上的点之间的间距,指定为单独的标量或向量输入。输入的数目必须与 F 的数组维度匹配。每个输入可以是标量,也可以是向量:

  • 标量指定该维度的常量间距;

  • 向量指定沿 F 的对应维度的值的坐标。在这种情况下,向量的长度必须与对应维度的大小匹配。

示例: FX, FY = TyMath.gradient(F,0.1,2)

示例: FX, FY = TyMath.gradient(F,[0.1 0.3 0.5],2)

示例: FX, FY = TyMath.gradient(F,[0.1 0.3 0.5],[2 3 5])

数据类型: Int | Float

复数支持:

# 输出参数

FX, FY, FZ, FN - 数值梯度
数组

数值梯度,以大小与 F 相同的数组形式返回。第一个输出 FX 始终是穿过列的沿 F 的第 2 个维度的梯度。第二个输出 FY 始终是穿过行的沿 F 的第 1 个维度的梯度。对于第三个输出 FZ 和随后的输出,第 N 个输出是沿 F 的第 N 个维度的梯度。

# 详细信息

数值梯度

函数的数值梯度是根据函数在某些点的已知值预测每个维度上的篇导数值的一种方式。

对于有两个变量的函数 F(x,y),梯度为

可将梯度视为指向 F 的值递增方向的向量集合。在 Syslab 中,您可以计算有任意多个变量的函数的数值梯度。对于有 N 个变量的函数 F(x,y,z,...) 梯度为

# 提示

使用 diff 或自定义算法计算多个数值导数,而不是多次调用 gradient。

# 算法

gradient 计算内部数据点的中心差分。例如,考虑一个包含单位间距数据的矩阵 A,它具有水平梯度 G = gradient(A)。内部梯度值 G[:,j] 为:

G[:,j] = 0.5*(A[:,j+1] - A[:,j-1])

下标 j 在 2 和 N-1 之间变化,其中 N = size(A,2)。

gradient 使用单侧差分计算沿矩阵边的值:

G[:,1] = A[:,2] - A[:,1]

G[:,N] = A[:,N] - A[:,N-1]

如果您指定了点间距,gradient 会对差分进行相应的缩放。如果您指定了两个或更多个输出,该函数还可以按类似方式计算沿其他维度的差分。与 diff 函数不同,gradient 返回与输入具有相同数量元素的数组。

# 另请参阅

diff | del2