このページは、nAGライブラリのJupyterノートブックExampleの日本語翻訳版です。オリジナルのノートブックはインタラクティブに操作することができます。
uncon_conjgrd_comp
からhandle_solve_bounds_foas
への移行
このノートブックは、ソルバーuncon_conjgrd_comp
(E04DG
)からnAGライブラリのMark
27で導入されたhandle_solve_bounds_foas
(E04KF
)へのアップグレードに必要な手順を説明しています。
使用の観点から、ソルバー間の主な違いはユーザーコールバックにあります。
uncon_conjgrd_comp
は目的関数と勾配の評価を返すことができる単一のユーザーコールバックを持っていますが、handle_solve_bounds_foas
は2つの別々のユーザーコールバックを持っています。
1つは目的関数用、もう1つは目的関数の勾配用です。
このノートブックでは、2次元のRosenbrock問題を両方のソルバーで解き、handle_solve_bounds_foas
への移行に必要な変更点を示しています。この問題の解は(1,
1)です。
# nAG 著作権 2020年。
from naginterfaces.base import utils
from naginterfaces.library import opt
import numpy as np
# E04DG ユーザーコールバックを定義する
def objfun_e04dg(mode, x, _nstate, _data=None):
= (1. - x[0])**2 + 100.*(x[1] - x[0]**2)**2
objf if mode == 2:
= [
fdx 2.*x[0] - 400.*x[0]*(x[1]-x[0]**2) - 2.,
200.*(x[1]-x[0]**2),
]return objf, fdx
return objf, np.zeros(len(x))
# E04KFのユーザーコールバックを定義する
def objfun_e04kf(x, inform, _data=None):
"""Return the objective function value"""
= (1. - x[0])**2 + 100.*(x[1] - x[0]**2)**2
objf return objf, inform
def objgrd_e04kf(x, fdx, inform, _data=None):
"""The objective's gradient. Note that fdx has to be updated IN-PLACE"""
= [
fdx[:] 2.*x[0] - 400.*x[0]*(x[1]-x[0]**2) - 2.,
200.*(x[1]-x[0]**2),
]return inform
# 初期推定値
= [-1.5, 1.9]
x
# 省略された反復出力のために明示的なI/Oマネージャーを使用する
= utils.FileObjManager(locus_in_output=False) iom
uncon_conjgrd_comp
で問題を解く
= opt.nlp1_init('uncon_conjgrd_comp')
comm = opt.uncon_conjgrd_comp(objfun_e04dg, x, comm, io_manager=iom)
slv print('Solution: \n', slv.x)
<ipython-input-5-a8bdc418615c>:2: NagDeprecatedWarning: (nAG Python関数naginterfaces.library.opt.uncon_conjgrd_comp)
この関数は非推奨です。
代替として以下のアドバイスが提供されています:
代わりにhandle_solve_bounds_foasを使用してください。
詳細は https://www.nag.com/numeric/py/nagdoc_latest/replace.html を参照してください
slv = opt.uncon_conjgrd_comp(objfun_e04dg, x, comm, io_manager=iom)
解: [1.00000676 1.00001354]
次に新しいソルバー
handle_solve_bounds_foas
で解きます
# 問題用の空のハンドルを作成する
= len(x)
nvar = opt.handle_init(nvar)
handle
# ハンドル内で非線形目的関数を定義する
# 長さnvarの勾配ベクトルを設定する
=list(range(1, nvar+1)))
opt.handle_set_nlnobj(handle, idxfd
# アルゴリズムのオプションをいくつか設定する
for option in [
'Print Options = No', # print Options?
'Print Solution = Yes', # print on the screen the solution point X
'Print Level = 1', # print details of each iteration (screen)
]:
opt.handle_opt_set(handle, option)
# 問題を解いて解答を出力する
=objfun_e04kf, objgrd=objgrd_e04kf,
opt.handle_solve_bounds_foas(handle, x, objfun=iom)
io_manager
# ハンドルを破棄し、割り当てられたメモリを解放する
opt.handle_free(handle)
E04KF, First order method for bound-constrained problems
Status: converged, an optimal solution was found
Value of the objective 2.12807E-15
Norm of gradient 3.67342E-08
Primal variables:
idx Lower bound Value Upper bound
1 -inf 1.00000E+00 inf
2 -inf 1.00000E+00 inf