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

◆ Hybrd_r()

Sub Hybrd_r ( N As  Long,
X() As  Double,
Fvec() As  Double,
XTol As  Double,
Diag() As  Double,
Mode As  Long,
Info As  Long,
XX() As  Double,
YY() As  Double,
IRev 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)
の解をパウエルのハイブリッド法により求める.

IRevに従って関数値をユーザーが与える必要がある. ヤコビ行列はルーチン内で前進差分により計算されるため, ユーザーがヤコビ行列を求める必要はない.
引数
[in]N未知数および方程式の数. (N > 0)
[in,out]X()配列 X(LX - 1) (LX >= N)
[in] 初期近似解.
[out] IRev = 0: 求められた最終近似解.
  IRev = 3: 最新の近似解.
[out]Fvec()配列 Fvec(LFvec - 1) (LFvec >= N)
IRev = 0: 求められた解ベクトルにおける関数値.
IRev = 3: 最新の近似解における関数値.
[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以下になった)
= -1: パラメータ N の誤り. (N <= 0)
= -2: パラメータ X() の誤り.
= -3: パラメータ Fvec() の誤り.
= -4: パラメータ XTol の誤り. (XTol < 0)
= -5: パラメータ Diag() の誤り. (Diag(i) < 0, Mode = 2)
= -8: パラメータ XX() の誤り.
= -9: パラメータ YY() の誤り.
= 1: 関数評価回数(IRev = 1で戻る回数)がMaxfevに達した.
= 2: 解が改善されなくなった. (XTolが小さすぎる)
= 3: 直近5回のヤコビ行列の評価において解が改善されなかった.
= 4: 直近10回の反復において解が改善されなかった.
[out]XX()配列 XX(LXX - 1) (LXX >= N)
IRev = 1 または 2の場合, 関数値を求めるべき点を返す.
[in]YY()配列 YY(LYY - 1) (LYY >= N)
IRev = 1 または 2の場合, 再呼び出し時に関数値fi(XX()) (i = 1〜N)を与えること.
[in,out]IRevリバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の時には下記処理を行ってから再び本ルーチンを呼び出すこと.
= 0: 処理終了. 正常終了かどうかはInfoをチェックすること.
= 1 または 2: XX()における関数値を求めYY()に設定すること. YY()以外の変数を変更してはならない.
= 3: 途中結果(X(), Fvec()など)を出力する(Nprint > 0 の場合). どの変数も変更してはならない.
[in]Maxfev(省略可)
関数評価回数(IRev = 1で戻る回数)の上限値. これを超えると終了する. (省略時 = 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回の反復ごと, 最終反復後に途中結果の出力のために IRev = 3 として戻る.
<= 0: 途中結果の出力のために戻らない.
[out]Nfev(省略可)
関数評価回数 (IRev = 1で戻った回数).
出典
netlib/minpack
使用例
次の非線形連立方程式を解く.
x1^2 - x2 - 1 = 0
(x1 - 2)^2 + (x2 - 0.5)^2 - 1 = 0
初期値は, (x1, x2) = (0, 0) とする.
Sub Ex_Hybrd_r()
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
Dim XX(N - 1) As Double, YY(N - 1) As Double, IRev As Long
X(0) = 0: X(1) = 0
XTol = 0.0000000001 '1.0e-10
Mode = 1
IRev = 0
Do
Call Hybrd_r(N, X(), Fvec(), XTol, Diag(), Mode, Info, XX(), YY(), IRev)
If IRev = 1 Or IRev = 2 Then
YY(0) = XX(0) ^ 2 - XX(1) - 1
YY(1) = (XX(0) - 2) ^ 2 + (XX(1) - 0.5) ^ 2 - 1
End If
Loop While IRev <> 0
Debug.Print "X1, X2 =", X(0), X(1)
Debug.Print "Info =", Info
End Sub
Sub Hybrd_r(N As Long, X() As Double, Fvec() As Double, XTol As Double, Diag() As Double, Mode As Long, Info As Long, XX() As Double, YY() As Double, IRev 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