XLPack 7.0
XLPack 数値計算ライブラリ (C API) リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ optif9()

void optif9 ( int  n,
double  x[],
void(*)(int, double *, double *)  fcn,
void(*)(int, double *, double *)  d1fcn,
void(*)(int, double *, int, double *)  d2fcn,
double  typsiz[],
double  fscale,
int  method,
int  iexp,
int  ndigit,
int  maxiter,
int  iagflg,
int  iahflg,
double  dlt,
double  gradtl,
double  stepmx,
double  steptl,
void(*)(int, double *, double, double *, int, double *, double *, int, int)  result,
int  iresult,
double  xpls[],
double *  fpls,
double  gpls[],
int *  iter,
double  work[],
int  lwork,
int *  info 
)

多変数非線形関数の最小点 (準ニュートン法, 信頼領域法)

目的
optif9は非線形関数 f(x1, x2, ..., xn) (2階連続的微分可能な実数関数) の局所的最小点 (xs1, xs2, ..., xsn) を求める.

微分係数およびヘッセ行列の計算には, これを解析的に求めるユーザー定義サブルーチンを使うことができる. ユーザー定義サブルーチンが与えられなかった場合, 微分係数は有限差分近似で求められる. また, ヘッセ行列はセカント法(BFGS法)あるいは2次有限差分近似で求められる.

探索アルゴリズムは, 直線探索, Dogleg信頼領域法およびHookstep信頼領域法の3種類を使うことができる.

ヘッセ行列のユーザー定義サブルーチンを与えず, デフォルトパラメータを使用した場合, 準ニュートン法 (BFGS法)のルーチンとして動作する.
引数
[in]n問題の次数(パラメータ数). (n > 1)
[in]x[]配列 x[lx] (lx >= n)
解ベクトルの初期推定値.
[in]fcn目的関数 f(x1, x2, ..., xn) を求めるユーザー定義サブルーチンで, 次のように定義すること.
void fcn(int n, double x[], double *fval)
{
*fval = 与えられたnおよびx[]から求めた関数値
}
fval以外の変数を変更してはならない.
[in]d1fcn目的関数 f(x1, x2, ..., xn) の微分係数を求めるユーザー定義サブルーチンで, 次のように定義すること.
void d1fcn(int n, double x[], double g[])
{
g[i] = 与えられたnおよびx[]から求めた微分係数値 df/dxi (i = 0〜n-1).
}
g[]以外の変数を変更してはならない.
[in]d2fcn目的関数 f(x1, x2, ..., xn) のヘッセ行列を求めるユーザー定義サブルーチンで, 次のように定義すること.
void d2fcn(int n, double x[], int ldh, double h[][ldh])
{
h[j][i] = 与えられたnおよびx[]から求めたヘッセ行列 d2f/dxidxj (i = 0 〜 n-1, j = 0 〜 n-1). ldhは二次元配列の整合寸法である.
}
h[][]以外の変数を変更してはならない.
[in]typsiz[]配列 typsiz[ltypsiz] (ltypsiz >= n) x[]の各要素のおおよその大きさ. この値はスケーリングに使用される. 例えば, x[0] = -0.001 であれば typsiz[0] = 0.001 とする.
(ただし, 0であれば1を, 負の値であれば絶対値を使う)
[in]fscale目的関数値の最小点での推定値. 例えば, f(xpls) = 0.0001 であれば fscale = 0.0001を与える.
(ただし, 0であれば1を, 負の値であれば絶対値を使う)
[in]method探索アルゴリズムの選択.
= 1: 直線探索.
= 2: Dogleg信頼領域法.
= 3: More-Hebdonのhookstep信頼領域法.
(他の値であれば1とみなす)
[in]iexpfcnの実行時間.
= 0: 普通.
= 1: 時間がかかる.
(他の値であれば1とみなす)
ヘッセ行列の更新はd2fcnが与えられていればそれを使う. そうでなければ iexp = 1の場合, セカント法(BFGS法)により行い, iexp = 0の場合, 2次有限差分により行う.
[in]ndigitfcnの計算精度(十進桁数). (ndigit > 0)
(ndigit <= 0 の場合, 最大精度とみなす)
[in]maxiter最大反復回数. (maxiter > 0)
(maxiter <= 0 の場合, 200とみなす)
[in]iagflg微分係数計算ルーチンの指定.
= 0: 微分係数計算ルーチン d1fcn を使わない.
= 1: 微分係数計算ルーチン d1fcn を使う.
= 2: 微分係数計算ルーチン d1fcn を使う(d1fcn のチェックを行わない).
(他の値であれば0とみなす)
[in]iahflgヘッセ行列計算ルーチンの指定.
= 0: ヘッセ行列計算ルーチン d2fcn を使わない.
= 1: ヘッセ行列計算ルーチン d2fcn を使う.
= 2: ヘッセ行列計算ルーチン d2fcn を使う(d2fcn のチェックを行わない).
(他の値であれば0とみなす)
[in]dlt信頼領域法を使う場合の信頼領域半径の初期値. -1が与えられた場合にはスケーリングされた勾配の長さを使う.
(dlt <= 0 の場合, -1 とみなす. dlt > stepmxの場合, stepmx とみなす)
[in]gradtl勾配の収束判定値. (gradtl >= 0)
(gradtl < 0 の場合, 1.0e-5とみなす)
[in]stepmxステップサイズの最大値. (省略時 = max(||X||2*1000, 1000))
(stepmx <= 0 の場合, max(||X||2*1000, 1000)とみなす)
[in]steptlステップサイズの収束判定値(連続する反復における相対値). 通常, 1.0e-3〜1.0e-7とする. (steptl >= 0)
(steptl < 0 の場合, 1.0e-5とみなす)
[in]result反復ごとの中間結果および最終結果を出力するためのユーザー定義サブルーチンで, 次のように定義すること.
void result(int n, double x[], double f, double g[], int ldh, double h[][ldh], double p[], int itncnt, int iflg)
{
必要な情報を出力する
nr: a[]の整合寸法(ヘッセ行列の行数)
n: 変数の数
x[n]: 変数の現在値
f: x[]における関数値
g[n]: x[]における微分値
h[n][ldh]: x[]におけるヘッセ行列の値
p[n]: 最新のステップ値
itncnt: 反復回数
iflag: 制御情報
= 1: 初期値を出力するための初回呼び出し
= 2: 反復中の呼び出し
= 3: 最終結果を出力するための最終呼び出し
}
すべての引数は入力用で, 変更してはならない.
[in]iresultresultの呼び出しを制御する.
= 0: resultの呼び出しを行わない.
= 1: resultを反復ごとに呼び出す.
(他の値であれば0とみなす)
[out]xpls[]配列 xpls[lxpls] (lxpls >= n)
求められた解ベクトル(局所的最小点).
[out]fplsxplsにおける関数値.
[out]gpls[]配列 gpls[lgpls] (lgpls >= n)
xplsにおける微分係数値.
[out]iter収束までに要した反復回数.
[out]work[]配列 work[lwork]
作業領域.
info = 0の場合, サブコードをwork[0]に返す.
= 1: 傾きの収束判定条件を満たした.
= 2: ステップサイズの収束判定値を満たした.
[in]lwork配列 work[]のサイズ. (lwork >= n*(n + 11))
[out]info= 0: 正常終了 (work[0]のサブコードを参照せよ)
= -1: 入力パラメータ n の誤り (n <= 1)
= -25: 入力パラメータ lwork の誤り (lwork < n*(n + 11))
= 1: 最後の更新において目的関数値が減少しなかった(局所的最小点にあるか, 非線形性が強すぎるか, steptlが大きすぎる)
= 2: 最大反復回数を超えた
= 3: ステップサイズが続けて5回stepmxを超えた(関数形が際限なく傾斜しているか, stepmxが小さすぎる)
= 4: 微分係数計算ルーチン d1fcn の結果が正しくない可能性がある
= 5: ヘッセ行列計算ルーチン d2fcn の結果が正しくない可能性がある
出典
CMLIB