それは可能であり、ドキュメントで説明されています:
fun の勾配も計算でき、GradObj オプションが options = optimset('GradObj','on') で設定されているように 'on' である場合、関数 fun は 2 番目の出力引数で勾配値 g を返さなければなりません。 、ベクトル、x。
カスタムグラデーションを使用した fminunc
たとえば、次の場合f = @(x) x.^2;
はdf/dx = 2*x
、次のように使用できます。
function [f df] = f_and_df(x)
f = x.^2;
if nargout>1
df = 2*x;
end
end
fminunc
次に、その関数を次のように渡すことができます。
options = optimset('GradObj','on');
x0 = 5;
[x,fval] = fminunc(@f_and_df,x0,options);
logx 勾配を使用した fminunc
logx 勾配の場合、これは次のようになります。
function [f df] = f_and_df(x)
f = ...;
if nargout>1
df = x * (dF/logx);
end
end
そしてそのままfminunc
です。
無名関数を使用した fminunc
必要に応じて、無名関数も使用できます。
f_and_df2 = @(x) deal(x(1).^2+x(2).^2,[2*x(1) 2*x(2)]);
[x,fval] = fminunc(f_and_df2,[5, 4],optimset('GradObj','on'))
logx 勾配を使用した fminunc の例
追加の例f = (log(x))^2
function [f df_dlogx] = f_and_df(x)
f = log(x).^2;
df_dx = 2*log(x)./x;
df_dlogx = df_dx.* x;
end
その後:
>>x0=3;
>>[x,fval] = fminunc(@f_and_df,x0,optimset('GradObj','on'))
x =
0.999999990550151
fval =
8.92996430424197e-17
カスタム勾配と複数の変数を使用した fminunc の例
f(x,y) などの複数の変数の場合、変数をベクトルに入れる必要があります。例:
function [f df_dx] = f_and_df(x)
f = x(1).2 + x(2).^2;
df_dx(1) = 2*x(1);
df_dx(2) = 2*x(2);
end
この関数は放物面に対応します。もちろん、初期開始パラメーターにもベクトルを使用する必要があります。この場合、例: x0=[-5 3]