7. 勾配法のプログラミング (2) 田中雅博 最適化プログラミング、教科書 pp.79–85 多変数関数の極値を数値的に求める代表的な手法その1。多変数の場合。 1 多変数の関数 2 変数関数 f = f (x, y) の最大値を求める問題を考える。1 変数の場合同様、 ∂f ∂f = 0, =0 ∂x ∂y となるような (x, y) を求める問題であるが、解析的に解けないものとしよう。そのため、勾配法で 数値的に求める。 教科書 p.82 の図 3.2 を見よ。k 回目の点 (xk , yk ) から次の (xi+1 , yk+1 ) に進むところを考えよう。 (xk , yk ) で最も勾配の大きな方向は、この点での勾配ベクトル ( ) ∂f ∂x ∇fk = ∂f ∂y x=xk ,y=yk である。 そこで、この方向で関数が極大になる点を探す。これを、直線探索という。探索の幅の作り方は、 1 次元の場合と同じでよい(黄金探索法など、別の探索法もあるが、ここでは使用しない) 。 ( ) x 今後の便宜のために、x = と置こう。なお、以下の議論では、x は 2 次元だけでなく、 y 一般に n 次元としてよい。 直線探索は、 (∇fk はベクトルである) g(t) = f (xk + t∇fk ) とおく。2 次元ベクトルの場合、 g(t) = f (xk + t ∂f ∂f , yk + t ) ∂xk ∂yk となり、最大化は max g(t) t と書ける。 procedure search(f(x),f’(x)) 1. x の初期値を与え、h ← h0 とする。k = 0。 1 2. g(t) = f (xk + t∇fk ) に対して 1 次元探索を行い、g(t) を最大化する t を求める。 3. 得られた t を用いて、 ∆xk = t∇fk , xk+1 = xk + ∆xk とし、k = k+1。Step 2. からここまで、∥∆x∥ < δ となるまで繰り返す。 □ 以下、一次元探索のアルゴリズムを再度示す。前回の 1 次元の問題のアルゴリズムと同じである が、g は t の関数であることに注意する。 procedure linsearch(f(x),f’(x)) 1. t の初期値を与え、h ← h0 とする。 2. 次のように置く。 h ← sgn(g ′ (t))|h|, T ← t, T′ ← t + h 3. もし g(t) < g(T ′ ) であれば、次の計算を行う。 (a) g(t) ≥ g(T ′ ) となるまで次の計算を繰り返す。 h ← 2h, T ← T ′, T′ ← T + h (b) t ← T, h ← h/2 と置く。 4. そうでなければ、次の計算を行う。 (a) g(t) ≤ g(T ′ ) となるまで、次の計算を繰り返す。 h← h , 2 T′ ← T′ − h (b) t ← T ′ , h ← 2h と置く。 5. ステップ2に戻り、これを |g ′ (t)| ≤ ϵ となるまで繰り返す。 6. 得られた t を返す。 ここで、 ∑ ∂f ∂fk dg ∑ ∂f ∂xi = = dt ∂xi dt ∂xi ∂xi i i 例題 f (x, y) = −(x − y)2 − (x − 1)2 の最大値を求める。 g(t) = − (( ) ( ))2 (( ) )2 ∂f ∂f ∂f xk + t − yk + t − xk + t −1 ∂xk ∂yk ∂xk 2 ∑ ∂f ∂fk dg ∑ ∂f ∂xi = = dt ∂xi dt ∂xi ∂xi i i = −2 ((x − y) + (x − 1)) ∂f ∂f + 2(x − y) ∂xk ∂yk これの MATLAB プログラムを示そう。関数 g(t) を g( t,x_k,y_k,fx_k,fy_k )、その導関数 g ′ (t) を gp(t,x_k,y_k,fx_k,fy_k) とする。main 関数を hill_climbing(x_k,y_k)、線形探索 を linsearch(x_k,y_k) とする。 function hill_climbing(x_k,y_k) delta2=1.0e-6; delx=1; dely=1; count=1; fx_k=-2*(x_k-y_k)-2*(x_k-1); fy_k = 2*(x_k-y_k); xs(1)=x_k; ys(1)=y_k; fx_k=-2*(x_k-y_k)-2*(x_k-1); fy_k = 2*(x_k-y_k); while (delx^2 + dely^2) > delta2 count=count+1 t = linsearch(x_k,y_k); delx = t * fx_k; dely = t * fy_k; x_k = x_k + delx; y_k = y_k + dely; fx_k = -2 * (x_k - y_k) - 2 * (x_k -1); fy_k = 2 * (x_k - y_k); disp([x_k y_k]) xs(count)=x_k; ys(count)=y_k; end ’optimal solution’ disp([x_k, y_k]) plot(xs,ys,’o-’) hold on x=-2:0.2:2; y=-2:0.2:2; [xx,yy]=meshgrid(x,y); z=kansu2(xx,yy); contour(xx,yy,z) 3 end 以下、線形探索のプログラムである。 function t = linsearch(x_k,y_k) t=0; fx_k=-2*(x_k-y_k)-2*(x_k-1); fy_k = 2*(x_k-y_k); %pause if gp(0,x_k,y_k,fx_k,fy_k)>0 h0=0.1; else h0=-0.1; end %h0 h=h0; epsilon=1.0e-6; while abs(gp(t,x_k,y_k,fx_k,fy_k)) > epsilon h=sign(gp(t,x_k,y_k,fx_k,fy_k))*abs(h); T = t; Tp = t + h; if g(T,x_k,y_k,fx_k,fy_k)<g(Tp,x_k,y_k,fx_k,fy_k) ’case1’ %pause while g(T,x_k,y_k,fx_k,fy_k) < g(Tp,x_k,y_k,fx_k,fy_k) h=h*2; T=Tp; Tp=T+h; end t=T; h=h/2; else ’case2’ while g(T,x_k,y_k,fx_k,fy_k) > g(Tp,x_k,y_k,fx_k,fy_k) h=h/2; Tp=Tp-h; %pause end t=Tp; h=2*h; 4 end t end 以下、関数 g(t) のプログラム。 function f = g( t,x_k,y_k,fx_k,fy_k ) x = x_k + t * fx_k; y = y_k + t * fy_k; f=-(x-y)^2-(x-1)^2; end 以下は、g’(t) のプログラム。 function dg = gp(t,x_k,y_k,fx_k,fy_k) x = x_k + t * fx_k; y = y_k + t * fy_k; dg = -2*((x-y)+(x-1))*fx_k + 2*(x-y)*fy_k end 以下、もとの関数。 function z = kansu2( x,y ) z=-(x-y).^2 - (x-1).^2; end 実際に試してみよう。 >> hill_climbing(-0.5,0) 0.3293 -0.2073 0.5573 0.7049 0.8021 0.6437 0.8694 0.9129 0.9416 0.8948 0.9614 0.9743 0.9828 0.9690 0.9886 0.9924 5 0.9949 0.9908 0.9966 0.9978 0.9985 0.9973 0.9991 0.9994 0.9996 0.9993 ans = optimal solution 0.9996 0.9993 2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -2 -1.5 -1 -0.5 0 0.5 1 1.5 6 2 11 月 12 日課題 1. 上記で与えられた関数の最大化について、いくつかの点からスタートして、収束するかどう か、試してみよ。 2. 次に、f (x, y) = −(cos x − x)2 − (x − y)4 の最大化を行ってみよ。収束状況について、言及 せよ。 [提出物] Word に、以下の内容を示せ。 • 学籍番号、氏名、課題出題日 • 問1について – MATLAB プログラムリスト – 収束した結果を示し、それについて考察せよ。 • 問2について – MATLAB プログラムリスト – プログラムの中で、問1とは違う部分をわかりやすく示せ(プログラムの中の該当す る部分をマーカーで塗るか、四角で囲むなど) – プログラムをそのように変更した理由、収束結果についての考察 • 感想 7
© Copyright 2024 ExpyDoc