Main Content

differentiate

cfit または sfit オブジェクトの微分

説明

メモ

cfit オブジェクトに次の構文を使用します。

fx = differentiate(FO, X) は、cfit オブジェクト FO をベクトル X で指定した点で微分し、その結果を fx に返します。

[fx, fxx] = differentiate(FO, X) は、cfit オブジェクト FO をベクトル X で指定した点で微分し、その結果を fx に、2 階微分を fxx に返します。

メモ

sfit オブジェクトに次の構文を使用します。

[fx, fy] = differentiate(FO, X, Y) は、曲面 FOXY で指定した点で微分し、その結果を fxfy に返します。

FO は関数 fit で生成された曲面近似 (sfit) オブジェクトです。

XY は互いに同じサイズと形状の倍精度配列でなければなりません。

すべての戻り引数は X および Y と同じサイズおよび形状です。

FO が曲面 z=f(x,y) を表す場合、FX には x に関する導関数 (つまり dfdx) が、FY には y に関する導関数 (つまり dfdy) が含まれます。

[fx, fy] = differentiate(FO, [X, Y]) (XY は列ベクトル) では評価点を 1 つの引数として指定できます。

[fx, fy, fxx, fxy, fyy] = differentiate(FO, ...) は曲面近似オブジェクト FO の 1 次および 2 次導関数を計算します。

fxx には x に関する 2 次導関数 (つまり、2fx2) が含まれます。

fxy には混合 2 次導関数 (つまり、2fxy) が含まれます。

fyy には y に関する 2 次導関数 (つまり、2fy2) が含まれます。

すべて折りたたむ

ベースラインの正弦波信号を作成します。

xdata = (0:.1:2*pi)';
y0 = sin(xdata);

応答依存ガウス ノイズを信号に付加します。

noise = 2*y0.*randn(size(y0)); 											
ydata = y0 + noise;

ノイズを含むデータにカスタムの正弦波モデルを当てはめます。

f = fittype('a*sin(b*x)');
fit1 = fit(xdata,ydata,f,'StartPoint',[1 1]);

予測子値について近似の微分を求めます。

[d1,d2] = differentiate(fit1,xdata);

データ、近似、微分をプロットします。

subplot(3,1,1)
plot(fit1,xdata,ydata) % cfit plot method
subplot(3,1,2)
plot(xdata,d1,'m') % double plot method
grid on
legend('1st derivative')
subplot(3,1,3)
plot(xdata,d2,'c') % double plot method
grid on
legend('2nd derivative')

また、次のように cfitplot メソッドを使用して微分を直接計算しプロットすることもできます。

figure
plot(fit1,xdata,ydata,{'fit','deriv1','deriv2'})

ただし、plot メソッドは differentiate メソッドとは異なり、微分データを返しません。

differentiate メソッドを使用して近似の勾配を計算し、関数 quiver を使用してこれらの勾配を矢印としてプロットできます。次の例では、等高線図の上に勾配をプロットします。

微分点を作成し、データを近似します。

x = [0.64;0.95;0.21;0.71;0.24;0.12;0.61;0.45;0.46;...
0.66;0.77;0.35;0.66];
y = [0.42;0.84;0.83;0.26;0.61;0.58;0.54;0.87;0.26;...
0.32;0.12;0.94;0.65];
z = [0.49;0.051;0.27;0.59;0.35;0.41;0.3;0.084;0.6;...
0.58;0.37;0.19;0.19];
fo = fit( [x, y], z, 'poly32', 'normalize', 'on' );
[xx, yy] = meshgrid( 0:0.04:1, 0:0.05:1 );

関数 differentiate を使用して近似の勾配を計算します。

[fx, fy] = differentiate( fo, xx, yy );

関数 quiver を使用して勾配をプロットします。

plot( fo, 'Style', 'Contour' );
hold on
h = quiver( xx, yy, fx, fy, 'r', 'LineWidth', 2 );
hold off
colormap( copper )

最適化に導関数を使用する場合は、たとえば以下のように fmincon の目的関数を実装できます。

function [z, g, H] = objectiveWithHessian( xy )

% The input xy represents a single evaluation point

z = f( xy );

if nargout > 1

[fx, fy, fxx, fxy, fyy] = differentiate( f, xy );

g = [fx, fy];

H = [fxx, fxy; fxy, fyy];

end

end

入力引数

すべて折りたたむ

微分の関数。曲線の cfit オブジェクトまたは曲面の sfit オブジェクトとして指定します。

関数を微分する点。ベクトルとして指定します。曲面の場合、この引数は Y と同じサイズで同じ形状でなければなりません。

関数を微分する点。ベクトルとして指定します。曲面の場合、この引数は X と同じサイズで同じ形状でなければなりません。

出力引数

すべて折りたたむ

関数の 1 階微分。X および Y と同じサイズで同じ形状のベクトルとして返されます。

FO が曲面 z=f(x,y) の場合、fx には x に関する微分が含まれます。

関数の 2 階微分。X および Y と同じサイズで同じ形状のベクトルとして返されます。

FO が曲面 z=f(x,y) の場合、fxx には x に関する 2 階微分が含まれます。

関数の 1 階微分。X および Y と同じサイズで同じ形状のベクトルとして返されます。

FO が曲面 z=f(x,y) の場合、fy には y に関する微分が含まれます。

関数の 2 階微分。X および Y と同じサイズで同じ形状のベクトルとして返されます。

FO が曲面 z=f(x,y) の場合、fyy には y に関する 2 階微分が含まれます。

関数の混合 2 階微分。X および Y と同じサイズで同じ形状のベクトルとして返されます。

ヒント

閉じた形式のライブラリ モデルについて、ツールボックスは導関数を解析により計算します。他のすべてのモデルについて、次の中心差分商を使用してツールボックスは 1 次導関数を計算します。

dfdx=f(x+Δx)f(xΔx)2Δx

ここで、x はツールボックスが導関数を計算する値、Δx は小さい数値 (eps の 3 乗根のオーダー)、f(x+Δx)x+Δx で評価された funf(xxΔ)xΔx で評価された fun です。

ツールボックスは次の式を使用して 2 次導関数を計算します。

d2fdx2=f(x+Δx)+f(xΔx)2f(x)(Δx)2

ツールボックスは次の式を使用して曲面の混合導関数を計算します。

2fxy(x,y)=f(x+Δx,y+Δy)f(xΔx,y+Δy)f(x+Δx,yΔy)+f(xΔx,yΔy)4ΔxΔy

バージョン履歴

R2006a より前に導入