|
|
◆ Hybrd()
| Sub Hybrd |
( |
F As |
LongPtr, |
|
|
N As |
Long, |
|
|
X() As |
Double, |
|
|
Fvec() As |
Double, |
|
|
XTol As |
Double, |
|
|
Diag() As |
Double, |
|
|
Mode As |
Long, |
|
|
Info As |
Long, |
|
|
Optional Maxfev As |
Long = 0, |
|
|
Optional Ml As |
Long = -1, |
|
|
Optional Mu As |
Long = -1, |
|
|
Optional Epsfcn As |
Double = 0, |
|
|
Optional Factor As |
Double = 0, |
|
|
Optional Nprint As |
Long = 0, |
|
|
Optional Nfev As |
Long |
|
) |
| |
非線形連立方程式 (ハイブリッド法) (ヤコビ行列計算不要)
- 目的
- 本ルーチンはn本のn変数非線形方程式よりなる連立方程式
fi(x1, x2, ..., xn) = 0 (i = 1〜n)
の解をパウエルのハイブリッド法により求める.
関数値を計算するユーザールーチンが必要である. ヤコビ行列はルーチン内で前進差分により計算されるため, ユーザーがヤコビ行列を求める必要はない.
- 引数
-
| [in] | F | 関数fi(x)の値を求めるユーザーサブルーチンで, 次のように定義すること. Sub F(N As Long, X() As Double, Fvec() As Double, IFlag As Long)
IFlag = 1 あるいは IFlag = 2 の場合:
与えられたX()から関数値fi(x)を求めFvec(i)に設定する(i = 0〜n-1). それ以外の変数を変更してはならない.
IFlag = 0の場合:
Nprintを正の値に設定した場合, 途中結果の出力のためNprint回の反復ごとに呼び出される. 引数に渡された X(), Fvec() などの中間結果を適宜出力する. 渡された変数を変更してはならない.
End Sub
Iflagの値は実行を強制終了させたい場合以外は変更してはならない. 実行を終了させたい場合には負の値に設定して戻る. |
| [in] | N | 未知数および方程式の数. (N > 0) |
| [in,out] | X() | 配列 X(LX - 1) (LX >= N)
[in] 初期近似解.
[out] 求められた解ベクトル. |
| [out] | Fvec() | 配列 Fvec(LFvec - 1) (LFvec >= N)
求められた解ベクトルにおける関数値. |
| [in] | XTol | 目標精度. 続く2回の反復間の相対誤差がXTolより小さくなったら終了する. (XTol >= 0) |
| [in,out] | Diag() | 配列 Diag(LDiag - 1) (LDiag >= N)
[in] Mode = 2 の場合にスケーリング因子を入力する. (Diag(i) > 0)
[out] Mode = 1 の場合に自動的に設定される. |
| [in] | Mode | = 1: 変数のスケーリングを自動的に行う.
= 2: ユーザーがDiag()に設定した値を使って変数のスケーリングを行う.
(他の値であれば Mode = 1 とみなす.) |
| [out] | Info | = 0: 正常終了. (連続した反復間の相対誤差がXTol以下になった)
= -2: パラメータ N の誤り. (N <= 0)
= -3: パラメータ X() の誤り.
= -4: パラメータ Fvec() の誤り.
= -5: パラメータ XTol の誤り. (XTol < 0)
= -6: パラメータ Diag() の誤り.
= 1: 関数呼び出し(IFlag = 1または2)回数がMaxfevに達した.
= 2: 解が改善されなくなった. (XTolが小さすぎる)
= 3: 直近5回のヤコビ行列の評価において解が改善されなかった.
= 4: 直近10回の反復において解が改善されなかった.
= 5: ユーザーによる強制終了 (IFlag < 0でFから戻った). |
| [in] | Maxfev | (省略可)
関数FのIFlag = 1または2とした呼び出し回数の上限値. これを超えると終了する. (省略時 = 200*(N + 1)) (Maxfev <= 0 であれば省略時の既定値とみなす) |
| [in] | Ml | (省略可)
ヤコビ行列が帯行列の場合, 下帯幅を設定する(Ml >= 0). 帯行列でない場合, N - 1 以上を設定する. (省略時 = N - 1) (Ml < 0 であれば省略時の既定値とみなす) |
| [in] | Mu | (省略可)
ヤコビ行列が帯行列の場合, 上帯幅を設定する(Mu >= 0). 帯行列でない場合, N - 1 以上を設定する. (省略時 = N - 1) (Mu < 0 であれば省略時の既定値とみなす) |
| [in] | Epsfcn | (省略可)
前進差分近似のステップ幅を決めるパラメータで, 目的関数計算の相対誤差程度に設定する. マシンイプシロンより小さい値が設定された場合, マシンイプシロン値とみなされる. (省略時 = 0) |
| [in] | Factor | (省略可)
初期ステップの最大値を決める定数. ||Diag×X||2×Factorが0でない場合これを最大値とする. 0の場合Factor自身の値を最大値とする. 通常, 0.1〜100の範囲で, 一般的には100とすればよい. (省略時 = 100) (Factor <= 0 であれば省略時の既定値とみなす) |
| [in] | Nprint | (省略可)
途中結果の出力間隔. (省略時 = 0)
> 0: 最初の反復, Nprint回の反復ごと, 最終反復後に途中結果の出力のために IFlag = 0としてFを呼び出す.
<= 0: 途中結果の出力のための呼び出しを行わない. |
| [out] | Nfev | (省略可)
関数評価回数 (IFlag = 1 または 2としたFの呼び出し回数). |
- 出典
- netlib/minpack
- 使用例
- 次の非線形連立方程式を解く.
x1^2 - x2 - 1 = 0
(x1 - 2)^2 + (x2 - 0.5)^2 - 1 = 0
初期値は, (x1, x2) = (0, 0) とする. Sub FHybrd(N As Long, X() As Double, Fvec() As Double, IFlag As Long)
If IFlag = 1 Or IFlag = 2 Then
Fvec(0) = X(0) ^ 2 - X(1) - 1
Fvec(1) = (X(0) - 2) ^ 2 + (X(1) - 0.5) ^ 2 - 1
End If
End Sub
Sub Ex_Hybrd()
Const N = 2
Dim X(N - 1) As Double, Fvec(N - 1) As Double, XTol As Double
Dim Diag(N - 1) As Double, Mode As Long, Info As Long
X(0) = 0: X(1) = 0
XTol = 0.0000000001 '1.0e-10
Mode = 1
Call Hybrd(AddressOf FHybrd, N, X(), Fvec(), XTol, Diag(), Mode, Info)
Debug.Print "X1, X2 =", X(0), X(1)
Debug.Print "Info =", Info
End Sub
Sub Hybrd(F As LongPtr, N As Long, X() As Double, Fvec() As Double, XTol As Double, Diag() As Double, Mode As Long, Info As Long, Optional Maxfev As Long=0, Optional Ml As Long=-1, Optional Mu As Long=-1, Optional Epsfcn As Double=0, Optional Factor As Double=0, Optional Nprint As Long=0, Optional Nfev As Long) 非線形連立方程式 (ハイブリッド法) (ヤコビ行列計算不要)
- 実行結果
X1, X2 = 1.06734608580669 0.139227666886862
Info = 0
|