Main Content

ベクトルと行列の目的関数の記述

ベクトルと行列の目的関数とは

fsolvelsqcurvefit などいくつかのソルバーは、ベクトルまたは行列の目的関数をもつことができます。これらの種類の目的関数とスカラーの目的関数の使用法に関する主な相違点は、導関数の記述方法です。ベクトル値または行列値関数の 1 次の偏導関数はヤコビアンと呼ばれます。スカラー関数の 1 次の偏導関数は勾配と呼ばれます。

複素数値の目的関数の詳細については、Optimization Toolbox ソルバーの複素数を参照してください。

ベクトル関数のヤコビアン

x が独立変数のベクトルで F(x) がベクトル関数の場合、ヤコビアン J(x) は次のように定義されます。

Jij(x)=Fi(x)xj.

F が m 個の成分をもち、x が k 個の成分をもつ場合、J は m 行 k 列の行列です。

たとえば、

F(x)=[x12+x2x3sin(x1+2x23x3)],

の場合、J(x) は以下になります。

J(x)=[2x1x3x2cos(x1+2x23x3)2cos(x1+2x23x3)3cos(x1+2x23x3)].

この例に関連付けられる関数ファイルは次のようになります。

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=[F11F12F21F22F31F32]

をベクトル f として書き直します。

f=[F11F21F31F12F22F32].

F のヤコビアンは f のヤコビアン単位で定義されます。

Jij=fixj.

F が m 行 n 列の行列であり、x が k 個の成分をもつベクトルの場合、ヤコビアンは mn 行 k 列の行列となります。

たとえば次の場合、

F(x)=[x1x2x13+3x225x2x14x2/x14x22x13x24],

F のヤコビアンは次のようになります。

J(x)=[x2x14x13502x23x126x2x2/x121/x13x124x23].

行列値の独立変数をもつヤコビアン

x が行列の場合は、列ごとに x をベクトルに変更して F(x) のヤコビアンを定義します。たとえば、次の場合、

X=[x11x12x21x22],

勾配は以下のベクトル単位で定義されます。

x=[x11x21x12x22].

F=[F11F12F21F22F31F32],

で、f が F のベクトルの形式で与えられているとき、F(X) のヤコビアンは f(x) のヤコビアンとして定義されます。

Jij=fixj.

したがって、たとえば、次のようになります。

J(3,2)=f(3)x(2)=F31X21, and J(5,4)=f(5)x(4)=F22X22.

F が m 行 n 列の行列であり、x が j 行 k 列の行列の場合、ヤコビアンは mn 行 jk 列の行列になります。

関連するトピック