ベクトルと行列の目的関数の記述
ベクトルと行列の目的関数とは
fsolve
や lsqcurvefit
などいくつかのソルバーは、ベクトルまたは行列の目的関数をもつことができます。これらの種類の目的関数とスカラーの目的関数の使用法に関する主な相違点は、導関数の記述方法です。ベクトル値または行列値関数の 1 次の偏導関数はヤコビアンと呼ばれます。スカラー関数の 1 次の偏導関数は勾配と呼ばれます。
複素数値の目的関数の詳細については、Optimization Toolbox ソルバーの複素数を参照してください。
ベクトル関数のヤコビアン
x が独立変数のベクトルで F(x) がベクトル関数の場合、ヤコビアン J(x) は次のように定義されます。
F が m 個の成分をもち、x が k 個の成分をもつ場合、J は m 行 k 列の行列です。
たとえば、
の場合、J(x) は以下になります。
この例に関連付けられる関数ファイルは次のようになります。
function [F jacF] = vectorObjective(x) F = [x(1)^2 + x(2)*x(3); sin(x(1) + 2*x(2) - 3*x(3))]; if nargout > 1 % need Jacobian jacF = [2*x(1),x(3),x(2); cos(x(1)+2*x(2)-3*x(3)),2*cos(x(1)+2*x(2)-3*x(3)), ... -3*cos(x(1)+2*x(2)-3*x(3))]; end
目的関数にヤコビアンが含まれていることをソルバーに示すには、SpecifyObjectiveGradient
オプションを true
に設定します。以下に例を示します。
options = optimoptions('lsqnonlin','SpecifyObjectiveGradient',true);
行列関数のヤコビアン
行列 F(x) のヤコビアンを定義するには、列ごとに行列をベクトルに変更します。たとえば、行列
をベクトル f として書き直します。
F のヤコビアンは f のヤコビアン単位で定義されます。
F が m 行 n 列の行列であり、x が k 個の成分をもつベクトルの場合、ヤコビアンは mn 行 k 列の行列となります。
たとえば次の場合、
F のヤコビアンは次のようになります。
行列値の独立変数をもつヤコビアン
x が行列の場合は、列ごとに x をベクトルに変更して F(x) のヤコビアンを定義します。たとえば、次の場合、
勾配は以下のベクトル単位で定義されます。
で、f が F のベクトルの形式で与えられているとき、F(X) のヤコビアンは f(x) のヤコビアンとして定義されます。
したがって、たとえば、次のようになります。
F が m 行 n 列の行列であり、x が j 行 k 列の行列の場合、ヤコビアンは mn 行 jk 列の行列になります。