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

◆ mng_r()

void mng_r ( int  n,
double  x[],
double  d[],
double  v[],
int  lv,
int  iv[],
int  liv,
int *  info,
double *  yy,
double  yyp[],
int *  irev 
)

多変数非線形関数の最小点 (信頼領域法) (リバースコミュニケーション版)

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

ユーザーが解析的に計算した目的関数の微分係数が使われる. ヘッセ行列はセカント法(BFGS法)により求められる. 探索アルゴリズムはダブルドッグレッグ信頼領域法を使用する.

配列v[]およびiv[]はパラメータおよび作業用領域である. mng_rがiv[0] = 0として呼ばれた場合, これらの配列は計算開始前にデフォルト値に初期化される. 下のiv[0]に関する説明を参照のこと.
引数
[in]n問題の次数(パラメータ数). (n > 0)
[in,out]x[]配列 x[lx] (lx >= n)
[in] 解ベクトルの初期推定値.
[out] irev = 0: 求められた解ベクトル.
  irev = 1, 30: 関数値または微分係数を求める点.
  irev = 50: 最新の近似解.
[in]d[]配列 d[ld] (ld >= n)
スケール係数. すべてのiについてd[i]*x[i]が同程度の大きさになるように設定する. (d[i] > 0)
[in,out]v[]配列 v[lv]
浮動小数パラメータおよび作業領域のための配列.
[in]
  v[25] (tuner1): 誤収束の判定パラメータ. (0 <= tuner1 <= 0.5) (デフォルト = 0.1)
  v[30] (atol): 関数値の目標絶対精度. (0 <= atol) (デフォルト = max(1e-20, eps^2), ただし, epsは計算機イプシロン)
  v[31] (rtol): 関数値の目標相対精度. (eps <= rtol <= 0.1) (デフォルト = max(1e-10, eps^(2/3))
  v[32] (xctol): x値の収束判定しきい値. (0 <= xctol <= 1) (デフォルト = eps^(1/2))
  v[33] (xftol): 誤収束の判定しきい値. (0 <= xftol <= 1) (デフォルト = 100*eps)
  v[34] (lmax0): スケーリングされた一番始めのステップ長の最大幅. (0 < lmax0) (デフォルト = 1)
  v[35] (lmaxs), v[36] (sctol): 特異収束の判定パラメータ. (0 < lmaxs, 0 <= sctol <= 1)
    ステップ長lmaxsにおいてsctol*abs(f)よりも関数値が減少しなくなった. (fは現在の反復の出発点における関数値)
  v[37] (dinit): 非負の値を設定しておくとそれによりd[]の全要素を初期化する. (-10 <= dinit) (デフォルト = -1)
  v[42] (bias): ダブルドッグレッグ法で使用するパラメータ. (0 <= bias <= 1) (デフォルト = 0.8)
[out]
  v[0] (dgnorm): diag(d)^(-1)*g の2ノルム. (g は勾配の最新値)
  v[1] (dstnrm): diag(d)^(-1)*s の2ノルム. (s は現在のステップ長)
  v[9] (f): 現在の関数値.
  v[12] (f0): 現在の反復の出発点における関数値.
[in]lv配列 v[]のサイズ. (lv >= 71 + n*(n + 13)/2)
[in,out]iv[]配列 iv[liv]
整数パラメータおよび作業領域のための配列.
[in]
  iv[0]: 0に設定して呼び出すと, 実行開始前にiv[]およびv[]の全てのパラメータをデフォルト値に初期化する.
    12に設定して呼び出すと, iv[]およびv[]はユーザーにより設定済であると見なし初期化を行わない. サブルーチンivsetはiv[0]=12に設定するため, 最初にivsetを呼び出してiv[]およびv[]をデフォルト値に設定し, 次に必要なパラメータを非デフォルト値に変更し, それを使用して実行を開始することができる.
  iv[16] (mxfcal): 関数評価回数の最大値. (デフォルト値 = 200)
  iv[17] (mxiter): 反復回数の最大値. (デフォルト値 = 150)
  iv[18] (outlev): 中間情報の出力を指定する. (デフォルト値 = 0)
    != 1: irev = 50 で戻らない.
    = 1: 中間情報の出力のために反復ごとに irev = 50 で戻る.
[out]
  iv[0]: リターンコード.
    = 3: x値の収束条件を満たした.
    = 4: 関数値相対収束条件を満たした.
    = 5: x値および関数値相対収束条件の両方を満たした.
    = 6: 関数値絶対収束条件を満たした.
    = 7: 特異収束. (近傍のヘッセ行列が特異になった)
    = 8: 誤収束. (誤った点での収束と思われる. 目標精度が小さすぎる可能性がある)
    = 9: 関数評価回数の最大値を超えた.
    = 10: 反復回数の最大値を超えた.
    = 11: stopxがtrueを返した. (外;部割込み)
    = 17: nを変更してリスタートが試みられた.
    = 18: dが負の要素を持ちiv[dtype] < 0である.
    = 19...43: v[iv[0]]が範囲外.
    = 63: x[]の初期点においてf(x)を求めることができない.
    = 64: assessに不正なパラメータが渡された.
    = 65: x[]において微分係数を求めることができない.
    = 67: ivsetの最初の引数が誤っている.
    = 80: iv[0]の値が範囲外.
    = 81: n <= 0.
  iv[5] (nfcall): 関数評価回数(irev=1で戻った回数).
  iv[27] (g): v[]の中で現在の微分ベクトルが格納されている場所の開始点のインデックス(+ 1).
  iv[29] (ngcall): 微分係数計算のための関数評価回数(irev=30で戻った回数).
  iv[30] (niter): 反復回数.
  iv[43] (lastiv): livの最小値.
  iv[44] (lastv): lvの最小値.
[in]liv配列 iv[]のサイズ. (liv >= 60)
[out]info= 0: 正常終了 (iv[0] = 3〜6)
= -1: 入力パラメータ n の誤り (n < 1) (iv[0] = 81)
= -3: 入力パラメータ d の誤り (iv[15] = 0で d[]に負の要素がある) (iv[0] = 18)
= -4: 入力パラメータ v[18]〜v[42] の誤り (範囲外の値) (iv[0] = 19〜43)
= -5: 入力パラメータ lv の誤り (lvが小さすぎる) (iv[0] = 81)
= -6: 入力パラメータ iv[0] の誤り (範囲外の値) (iv[0] = 80)
= -7: 入力パラメータ liv の誤り (livが小さすぎる) (iv[0] = 15)
= 7: 特異収束 (近傍のヘッセ行列が特異になった)
= 8: 誤収束 (誤った点での収束と思われる. 目標精度が小さすぎる可能性がある)
= 9: 関数評価回数の最大値を超えた
= 10: 反復回数の最大値を超えた
= 14: iv[]およびv[]の領域の割り付けを行った (iv[0]=13の呼び出し後に正常終了した)
= 17: nを変更して再スタートを行った
= 63: x[]の初期点において関数値を求めることができない
= 65: x[]において微分係数を求めることができない
[in,out]yy[in] irev = 1の場合, 再呼び出し時に関数値 f(x[])を与えること.
[out] irev = 50の場合, 中間結果の出力のため現在のx[]における関数値を返す.
[in,out]yyp[]Array yyp[lyyp] (lyyp >= n)
[in] irev = 30の場合, 再呼び出し時にx[]における微分係数値を与えること.
[out] irev = 50の場合, 中間結果の出力のため現在のx[]における微分係数値を返す.
[in,out]irevリバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の時には下記処理を行ってから再び本ルーチンを呼び出すこと.
= 0: 処理終了. 正常終了かどうかはinfoをチェックすること
= 1: x[]における関数値を求め yyに設定すること. yy以外の変数を変更してはならない.
= 30: x[]における微分係数値を求め yyp[]に設定すること. yyp[]以外の変数を変更してはならない.
= 50: 途中結果(x[], yy, yyp[], iv[5], iv[29], iv[30])を適宜出力する(iv[18] = 1 の場合). どの変数も変更してはならない.
出典
netlib/port