Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

gradient

数值梯度

说明

示例

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

示例

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

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

示例

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

示例

[___] = gradient(F,hx,hy,...,hN)F 的每个维度上的间距指定 N 个间距参数。

示例

全部折叠

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

x = 1:10
x = 1×10

     1     2     3     4     5     6     7     8     9    10

fx = gradient(x)
fx = 1×10

     1     1     1     1     1     1     1     1     1     1

计算 xe-x2-y2 在网格上的二维梯度。

x = -2:0.2:2;
y = x';
z = x .* exp(-x.^2 - y.^2);
[px,py] = gradient(z);

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

figure
contour(x,y,z)
hold on
quiver(x,y,px,py)
hold off

Figure contains an axes. The axes contains 2 objects of type contour, quiver.

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

函数值的线性逼近方程是

f(x)f(x0)+(f)x0(x-x0).

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

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

y = sin(-1:0.25:0.5);
yp = gradient(y,0.25);

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

y_guess = y(end) + yp(end)*(0.5005 - 0.5)
y_guess = 0.4799

计算实际值进行比较。

y_actual = sin(0.5005)
y_actual = 0.4799

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

以多变量函数 f(x,y)=x2y3 为例。

x = -3:0.2:3;
y = x';
f = x.^2 .* y.^3;
surf(x,y,f)
xlabel('x')
ylabel('y')
zlabel('z')

Figure contains an axes. The axes contains an object of type surface.

计算网格上的梯度。

[fx,fy] = gradient(f,0.2);

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

x0 = 1;
y0 = -2;
t = (x == x0) & (y == y0);
indt = find(t);
f_grad = [fx(indt) fy(indt)]
f_grad = 1×2

  -16.0000   12.0400

f(x,y)=x2y3 在点 (1,-2) 处的确切梯度值为

(f)(1,-2)=2xy3iˆ+3x2y2jˆ=-16iˆ+12jˆ.

输入参数

全部折叠

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

数据类型: single | double
复数支持:

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

示例: [FX,FY] = gradient(F,2)

数据类型: single | double
复数支持:

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

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

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

示例: [FX,FY] = gradient(F,0.1,2)

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

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

数据类型: single | double
复数支持:

输出参数

全部折叠

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

详细信息

全部折叠

数值梯度

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

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

F=Fxi^+Fyj^.

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

F=Fxi^+Fyj^+Fzk^+...+FNn^.

提示

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

算法

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

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

下标 j2N-1 之间变化,其中 N = size(A,2)

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

G(:,1) = A(:,2) - A(:,1);
G(:,N) = A(:,N) - A(:,N-1);

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

扩展功能

C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。

在 R2006a 之前推出