このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
多変数関数の極値およびその近似の計算
この例では、多変数関数の極値、およびその極値点に近い近似を求める方法を示します。この例では、シンボリック行列変数を使用して多変数関数およびその導関数を表します。シンボリック行列変数は R2021a から使用できます。
多変数関数 を検討します。ここで、 は 2 行 1 列のベクトルであり、 は 2 行 2 列の行列です。この関数の局所的極値を求めるには、 の導関数の根を計算します。つまり、導関数 の解を求めます。
関数の作成とその導関数の計算
ベクトル および行列 をシンボリック行列変数として作成します。関数 を定義します。
syms x [2 1] matrix syms A [2 2] matrix f = sin(x.'*A*x)
f =
ベクトル について関数 の導関数 D
を計算します。導関数 D
は、 および に関するコンパクトな行列表記で表示されます。
D = diff(f,x)
D =
symmatrix
オブジェクトの sym
オブジェクトへの変換
シンボリック行列変数 x
、A
、f
、および D
はsymmatrix
オブジェクトです。これらのオブジェクトは、行列、ベクトル、およびスカラーをコンパクトな行列表記で表します。これらの変数の成分を表示するには、symmatrix2sym
を使用して symmatrix
オブジェクトを sym
オブジェクトに変換します。
xsym = symmatrix2sym(x)
xsym =
Asym = symmatrix2sym(A)
Asym =
fsym = symmatrix2sym(f)
fsym =
Dsym = symmatrix2sym(D)
Dsym =
数値の代入と最小値の計算
の値が [2 -1; 0 3]
であるケースを対象にするとします。この値を関数 fsym
に代入します。
fsym = subs(fsym,Asym,[2 -1; 0 3])
fsym =
の値を導関数 Dsym
に代入します。
Dsym = subs(Dsym,Asym,[2 -1; 0 3])
Dsym =
次に、シンボリック関数solve
を適用して導関数の根を得ます。
[xmin,ymin] = solve(Dsym,xsym,'PrincipalValue',true);
x0 = [xmin; ymin]
x0 =
関数 を極値解 と共にプロットします。fsurf
の 2 番目の引数として、プロット区間を および に設定します。fplot3
を使用して極値解の座標をプロットします。
fsurf(fsym,[-1 1 -1 1]) hold on fplot3(xmin,ymin,subs(fsym,xsym,x0),'ro') view([-68 13])
最小値に近い関数の近似
テイラー展開を使用して、多項の点 付近の多変数関数を近似できます。
ここで、項 は勾配ベクトルであり、 は で計算された多変数関数 のヘッセ行列です。
ヘッセ行列を求め、その結果をシンボリック行列変数として返します。
H = diff(f,x,x.')
H =
ヘッセ行列 を、成分形式で行列を表す sym
データ型に変換します。subs
を使用し、 = [2 -1; 0 3]
のヘッセ行列を最小点 で評価します。
Hsym = symmatrix2sym(H); Hsym = subs(Hsym,Asym,[2 -1; 0 3]); H0 = subs(Hsym,xsym,x0)
H0 =
勾配ベクトル を で評価します。
D0 = subs(Dsym,xsym,x0)
D0 =
最小値に近い関数に対するテイラー近似を計算します。
fapprox = subs(fsym,xsym,x0) + D0*(xsym-x0) + 1/2*(xsym-x0).'*H0*(xsym-x0)
fapprox =
および を示す同じグラフに関数近似をプロットします。
hold on
fsurf(fapprox,[-1 1 -1 1])
zlim([-1 3])