Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

多変数関数の極値およびその近似の計算

この例では、多変数関数の極値、およびその極値点に近い近似を求める方法を示します。この例では、シンボリック行列変数を使用して多変数関数およびその導関数を表します。シンボリック行列変数は R2021a から使用できます。

多変数関数 f(x)=sin(xTAx) を検討します。ここで、x は 2 行 1 列のベクトルであり、A は 2 行 2 列の行列です。この関数の局所的極値を求めるには、f(x) の導関数の根を計算します。つまり、導関数 f(x0)=0 の解を求めます。

関数の作成とその導関数の計算

ベクトル x および行列 A をシンボリック行列変数として作成します。関数 f(x)=sin(xTAx) を定義します。

syms x [2 1] matrix
syms A [2 2] matrix
f = sin(x.'*A*x)
f = sin(xTAx)sin(transpose(symmatrix('x', [2 1]))*symmatrix('A', [2 2])*symmatrix('x', [2 1]))

ベクトル x について関数 f(x) の導関数 D を計算します。導関数 D は、x および A に関するコンパクトな行列表記で表示されます。

D = diff(f,x)
D = cos(xTAx)xTA+xTATcos(transpose(symmatrix('x', [2 1]))*symmatrix('A', [2 2])*symmatrix('x', [2 1]))*(transpose(symmatrix('x', [2 1]))*symmatrix('A', [2 2]) + transpose(symmatrix('x', [2 1]))*transpose(symmatrix('A', [2 2])))

symmatrix オブジェクトの sym オブジェクトへの変換

シンボリック行列変数 xAf、および Dsymmatrixオブジェクトです。これらのオブジェクトは、行列、ベクトル、およびスカラーをコンパクトな行列表記で表します。これらの変数の成分を表示するには、symmatrix2symを使用して symmatrix オブジェクトを sym オブジェクトに変換します。

xsym = symmatrix2sym(x)
xsym = 

(x1x2)[x1; x2]

Asym = symmatrix2sym(A)
Asym = 

(A1,1A1,2A2,1A2,2)[A1_1, A1_2; A2_1, A2_2]

fsym = symmatrix2sym(f)
fsym = (sin(x1A1,1x1+A1,2x2+x2A2,1x1+A2,2x2))[sin(x1*(A1_1*x1 + A1_2*x2) + x2*(A2_1*x1 + A2_2*x2))]
Dsym = symmatrix2sym(D)
Dsym = (cos(x1A1,1x1+A1,2x2+x2A2,1x1+A2,2x2)2A1,1x1+A1,2x2+A2,1x2cos(x1A1,1x1+A1,2x2+x2A2,1x1+A2,2x2)A1,2x1+A2,1x1+2A2,2x2)[cos(x1*(A1_1*x1 + A1_2*x2) + x2*(A2_1*x1 + A2_2*x2))*(2*A1_1*x1 + A1_2*x2 + A2_1*x2), cos(x1*(A1_1*x1 + A1_2*x2) + x2*(A2_1*x1 + A2_2*x2))*(A1_2*x1 + A2_1*x1 + 2*A2_2*x2)]

数値の代入と最小値の計算

A の値が [2 -1; 0 3] であるケースを対象にするとします。この値を関数 fsym に代入します。

fsym = subs(fsym,Asym,[2 -1; 0 3])
fsym = sin(3x22+x12x1-x2)sin(3*x2^2 + x1*(2*x1 - x2))

A の値を導関数 Dsym に代入します。

Dsym = subs(Dsym,Asym,[2 -1; 0 3])
Dsym = (cos(3x22+x12x1-x2)4x1-x2-cos(3x22+x12x1-x2)x1-6x2)[cos(3*x2^2 + x1*(2*x1 - x2))*(4*x1 - x2), -cos(3*x2^2 + x1*(2*x1 - x2))*(x1 - 6*x2)]

次に、シンボリック関数solveを適用して導関数の根を得ます。

[xmin,ymin] = solve(Dsym,xsym,'PrincipalValue',true);
x0 = [xmin; ymin]
x0 = 

(00)[sym(0); sym(0)]

関数 f(x) を極値解 x0 と共にプロットします。fsurf の 2 番目の引数として、プロット区間を -1<x1<1 および -1<x2<1 に設定します。fplot3 を使用して極値解の座標をプロットします。

fsurf(fsym,[-1 1 -1 1])
hold on
fplot3(xmin,ymin,subs(fsym,xsym,x0),'ro')
view([-68 13])

Figure contains an axes. The axes contains 2 objects of type functionsurface, parameterizedfunctionline.

最小値に近い関数の近似

テイラー展開を使用して、多項の点 x0 付近の多変数関数を近似できます。

f(x)f(x0)+f(x0)(x-x0)+12(x-x0)TH(f(x0))(x-x0)

ここで、項 f(x0) は勾配ベクトルであり、H(f(x0))x0 で計算された多変数関数 f(x) のヘッセ行列です。

ヘッセ行列を求め、その結果をシンボリック行列変数として返します。

H = diff(f,x,x.')
H = -sin(xTAx)ATx+AxxTA+xTAT+cos(xTAx)AT+A- sin(transpose(symmatrix('x', [2 1]))*symmatrix('A', [2 2])*symmatrix('x', [2 1]))*(transpose(symmatrix('A', [2 2]))*symmatrix('x', [2 1]) + symmatrix('A', [2 2])*symmatrix('x', [2 1]))*(transpose(symmatrix('x', [2 1]))*symmatrix('A', [2 2]) + transpose(symmatrix('x', [2 1]))*transpose(symmatrix('A', [2 2]))) + cos(transpose(symmatrix('x', [2 1]))*symmatrix('A', [2 2])*symmatrix('x', [2 1]))*(transpose(symmatrix('A', [2 2])) + symmatrix('A', [2 2]))

ヘッセ行列 H(f(x0)) を、成分形式で行列を表す sym データ型に変換します。subs を使用し、A = [2 -1; 0 3] のヘッセ行列を最小点 x0 で評価します。

Hsym = symmatrix2sym(H);
Hsym = subs(Hsym,Asym,[2 -1; 0 3]);
H0 = subs(Hsym,xsym,x0)
H0 = 

(4-1-16)[sym(4), -sym(1); -sym(1), sym(6)]

勾配ベクトル f(x0)x0 で評価します。

D0 = subs(Dsym,xsym,x0)
D0 = (00)[sym(0), sym(0)]

最小値に近い関数に対するテイラー近似を計算します。

fapprox = subs(fsym,xsym,x0) + D0*(xsym-x0) + 1/2*(xsym-x0).'*H0*(xsym-x0)
fapprox = 

x12x1-x22-x2x12-3x2x1*(2*x1 - x2/2) - x2*(x1/2 - 3*x2)

f(x) および x0 を示す同じグラフに関数近似をプロットします。

hold on
fsurf(fapprox,[-1 1 -1 1])
zlim([-1 3])

Figure contains an axes. The axes contains 3 objects of type functionsurface, parameterizedfunctionline.