Main Content

gradient

説明

FX = gradient(F) は、ベクトル F の 1 次元数値勾配を返します。出力 FX は ∂F/∂x に対応します。これは x (水平) 方向の差分です。点の間隔を 1 と仮定します。

[FX,FY] = gradient(F) は、行列 F の 2 次元数値勾配の x 成分および y 成分を返します。追加の出力 FY は ∂F/∂y に対応します。これは y (垂直) 方向の差分です。各方向の点の間隔を 1 と仮定します。

[FX,FY,FZ,...,FN] = gradient(F) は、F数値勾配N 個の成分を返します。ここで FN 次元の配列です。

[___] = 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 の 2 次元勾配を計算します。

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

同じ Figure に等高線とベクトルをプロットします。

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

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

特定の点での勾配を使用して、近傍点における関数値を線形近似し、その値を実際の値と比較します。

関数値を線形近似する式は、次のとおりです。

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

すなわち、特定の点 x0 における関数値 f(x0) と導関数 (f)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 object. The axes object with xlabel x, ylabel y 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

点 (1,-2) における f(x,y)=x2y3 の勾配の厳密な値は次のとおりです。

(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 番目の次元に沿った勾配であり、列を横切ります。2 番目の出力 FY は常に、F の最初の次元に沿った勾配であり、行を横切ります。3 番目の出力 FZ および後続の N 番目の出力は、FN 番目の次元に沿った勾配です。

詳細

すべて折りたたむ

数値勾配

関数の "数値勾配" は、特定の点での既知の関数値を使用して各次元における偏導関数の値を推定する方法です。

2 変数の関数 F(x,y) の場合、勾配は次の式で表されます。

F=Fxi^+Fyj^.

この勾配は、F の値が増加する方向を示すベクトルの集合として考えることができます。MATLAB® では、任意の数の変数をもつ関数の数値勾配を計算できます。N 変数の関数 F(x,y,z, ...) の場合、勾配は次の式で表されます。

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

ヒント

  • 複数の数値微分を計算するには、gradient を複数回呼び出す代わりに、diff またはカスタム アルゴリズムを使用します。

アルゴリズム

gradient は内部データ点間の "中心差分" を計算します。たとえば、単位間隔のデータをもち、水平方向の勾配が G = gradient(A) である行列 A を考えます。内部勾配値 G(:,j) は次の式で表されます。

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

添字 j2 から N-1 まで変化し、N = size(A,2) です。

gradient は、行列の端の値を次のように "片側差分" を使用して計算します。

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

点の間隔を指定した場合、gradient は差分を適切にスケーリングします。2 つ以上の出力を指定した場合、この関数は他の次元に沿った差分も同様に計算します。関数 diff とは異なり、gradient 入力と同じ数の要素を含む配列を返します。

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

バージョン履歴

R2006a より前に導入