|
|
◆ Mnf_r()
| Sub Mnf_r |
( |
N As |
Long, |
|
|
X() As |
Double, |
|
|
Info As |
Long, |
|
|
YY As |
Double, |
|
|
IRev As |
Long, |
|
|
Optional Iout As |
Long = 0, |
|
|
Optional Info2 As |
Long, |
|
|
Optional NFcall As |
Long, |
|
|
Optional NGcall As |
Long, |
|
|
Optional Niter As |
Long, |
|
|
Optional Fval As |
Double, |
|
|
Optional Rtol As |
Double = -1, |
|
|
Optional Atol As |
Double = -1, |
|
|
Optional MaxFcall As |
Long = 0, |
|
|
Optional MaxIter As |
Long = 0, |
|
|
Optional Tuner1 As |
Double = -1, |
|
|
Optional Xctol As |
Double = -1, |
|
|
Optional Xftol As |
Double = -1, |
|
|
Optional Lmax0 As |
Double = -1, |
|
|
Optional Lmaxs As |
Double = -1, |
|
|
Optional Sctol As |
Double = -1, |
|
|
Optional Bias As |
Double = -1, |
|
|
Optional Eta0 As |
Double = -1 |
|
) |
| |
多変数非線形関数の最小点 (信頼領域法) (微分係数不要) (リバースコミュニケーション版)
- 目的
- 本ルーチンは非線形関数 f(x1, x2, ..., xn) (2階連続的微分可能な実数関数) の局所的最小点 (xs1, xs2, ..., xsn) を求める.
目的関数の微分係数は有限差分近似により求められる. ユーザーが解析的に計算した微分係数値を与える必要はない. ヘッセ行列はセカント法(BFGS法)により求められる. 探索アルゴリズムはダブルドッグレッグ信頼領域法を使用する.
Mnf_rはMnfのリバースコミュニケーション版である.
- 引数
-
| [in] | N | 問題の次数(パラメータ数). (N > 0) |
| [in,out] | X() | 配列 X(LX - 1) (LX >= N)
[in] 解ベクトルの初期推定値.
[out] IRev = 0: 求められた解ベクトル.
IRev = 1: 関数値を求める点.
IRev = 3: 最新の近似解. |
| [out] | Info | = 0: 正常終了. (サブコードをInfo2に返す)
= -1: パラメータ N の誤り. (N < 1)
= -2: パラメータ X() の誤り.
= 7: 特異収束. (近傍のヘッセ行列が特異になった)
= 8: 誤収束. (誤った点での収束と思われる. 目標精度が小さすぎる可能性がある)
= 9: 関数評価回数の最大値を超えた.
= 10: 反復回数の最大値を超えた.
= 63: X()の初期点においてF(X)を求めることができない.
= 65: X()において微分係数を求めることができない. |
| [in,out] | YY | [in] IRev = 1の場合, 再呼び出し時にX()における関数値を与えること.
[out] IRev = 3の場合, 中間結果の出力のため現在のX()における関数値を返す. |
| [in,out] | IRev | リバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の時には下記処理を行ってから再び本ルーチンを呼び出すこと.
= 0: 処理終了. 正常終了かどうかはInfoをチェックすること.
= 1: X()における関数値を求め YYに設定すること. YY以外の変数を変更してはならない.
= 3: Iout = 1であれば反復ごとにIRev = 3で戻る. 途中結果(X(), NFcall, NGcall, Niter, Fvalなど)を出力する. どの変数も変更してはならない. |
| [in] | Iout | (省略可)
計算の途中結果を出力するかどうか指定する. (省略時 = 0)
= 0: 出力しない (IRev = 3では戻らない).
= 1: 反復ごとにIRev = 3で戻り, 途中結果を出力する.
(上記以外の値であればIout = 0とみなす) |
| [out] | Info2 | (省略可)
Info = 0 のときのサブコード.
= 1: X値の収束条件を満たした.
= 2: 関数値相対収束条件を満たした.
= 3: X値および関数値相対収束条件の両方を満たした.
= 4: 関数値絶対収束条件を満たした. |
| [out] | NFcall | (省略可)
関数評価回数(IRev = 1で戻った回数). (微分係数計算のための評価を除く) |
| [out] | NGcall | (省略可)
関数評価回数(IRev = 1で戻った回数). (微分係数計算のための評価回数) |
| [out] | Niter | (省略可)
反復回数. |
| [out] | Fval | (省略可)
求められた解ベクトルX()における関数値. |
| [in] | Rtol | (省略可)
関数値の目標相対精度. (Eps <= Rtol <= 0.1) (省略時 = 1e-10) (Epsはマシンイプシロン)
(Rtol < Eps または Rtol > 0.1 であれば省略時の既定値とみなす) |
| [in] | Atol | (省略可)
関数値の目標絶対精度. (省略時 = 1e-20)
(Atol < 0 であれば省略時の既定値とみなす) |
| [in] | MaxFcall | (省略可)
関数Fの呼び出し回数の最大値. (省略時 = 200)
(MaxFcall <= 0 であれば省略時の既定値とみなす) |
| [in] | MaxIter | (省略可)
反復回数の最大値. (省略時 = 150)
(MaxIter <= 0 であれば省略時の既定値とみなす) |
| [in] | Tuner1 | (省略可)
誤収束の判定パラメータ. (0 <= Tuner1 <= 0.5) (省略時 = 0.1)
(Tuner1 < 0 または Tuner1 > 0.5 であれば省略時の既定値とみなす) |
| [in] | Xctol | (省略可)
X値の収束判定しきい値. (0 <= Xctol <= 1) (省略時 = Eps^(1/2))
(Xctol < 0 または Xctol > 1 であれば省略時の既定値とみなす) |
| [in] | Xftol | (省略可)
誤収束の判定しきい値. (0 <= Xftol <= 1) (省略時 = 100*Eps)
(Xftol < 0 または Xftol > 1 であれば省略時の既定値とみなす) |
| [in] | Lmax0 | (省略可)
スケーリングされた一番始めのステップ長の最大幅. (Lmax0 > 0) (省略時 = 1)
(Lmax0 <= 0 であれば省略時の既定値とみなす) |
| [in] | Lmaxs | (省略可)
|
| [in] | Sctol | (省略可)
LmaxsおよびSctolは特異収束の判定パラメータである. (Lmaxs > 0) (0 <= Sctol <= 1) (省略時: Lmaxs = 1, Sctol = 1e-10)
ステップ長Lmaxsを上限とするステップにおいて予測される関数値の減少が最大でSctol*abs(f)かどうかテストする (fは現在の反復の出発点における関数値).
(Lmaxs <= 0 であれば省略時の既定値とみなす)
(Sctol < 0 であれば省略時の既定値とみなす) |
| [in] | Bias | (省略可)
ドッグレッグ信頼領域法で使用するパラメータ. (0 <= Bias <= 1) (省略時 = 0.8)
(Bias < 0 または Bias > 1 であれば省略時の既定値とみなす) |
| [in] | Eta0 | (省略可)
Fの推定計算精度. (真値 = 計算値*(1 + E)とすると Abs(E) <= Eta0)
(Eps <= Eta0 <= 1) (省略時 = 1000*Eps) (Epsはマシンイプシロン)
(Eta0 < Eps または Eta0 > 1 であれば省略時の既定値とみなす) |
- 出典
- netlib/port
- 使用例
- 次の関数の最小点を求める(ローゼンブロック関数).
f(x1, x2) = 100(x2 - x1^2)^2 + (1 - x1)^2
初期値は, (x1, x2) = (-1.2, 1) とする. Sub Ex_Mnf_r()
Const N = 2
Dim X(N - 1) As Double, Info As Long
Dim YY As Double, IRev As Long
X(0) = -1.2: X(1) = 1
IRev = 0
Do
Call Mnf_r(N, X(), Info, YY, IRev)
If IRev = 1 Then
YY = 100 * (X(1) - X(0) ^ 2) ^ 2 + (1 - X(0)) ^ 2
End If
Loop While IRev <> 0
Debug.Print "X1, X2 =", X(0), X(1)
Debug.Print "Info =", Info
End Sub
Sub Mnf_r(N As Long, X() As Double, Info As Long, YY As Double, IRev As Long, Optional Iout As Long=0, Optional Info2 As Long, Optional NFcall As Long, Optional NGcall As Long, Optional Niter As Long, Optional Fval As Double, Optional Rtol As Double=-1, Optional Atol As Double=-1, Optional MaxFcall As Long=0, Optional MaxIter As Long=0, Optional Tuner1 As Double=-1, Optional Xctol As Double=-1, Optional Xftol As Double=-1, Optional Lmax0 As Double=-1, Optional Lmaxs As Double=-1, Optional Sctol As Double=-1, Optional Bias As Double=-1, Optional Eta0 As Double=-1) 多変数非線形関数の最小点 (信頼領域法) (微分係数不要) (リバースコミュニケーション版)
- 実行結果
X1, X2 = 0.999999999844105 0.99999999969041
Info = 0
|