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

◆ Hybrj1()

Sub Hybrj1 ( F As  LongPtr,
N As  Long,
X() As  Double,
Fvec() As  Double,
XTol As  Double,
Info As  Long 
)

非線形連立方程式 (ハイブリッド法) (シンプルドライバ)

目的
本ルーチンはn本のn変数非線形方程式よりなる連立方程式
fi(x1, x2, ..., xn) = 0 (i = 1 〜 n)
の解をパウエルのハイブリッド法により求める.

関数値およびヤコビ行列を計算するユーザールーチンが必要である.

Hybrj1は標準的な使用のためのシンプルドライバで, デフォルトパラメータを用いてHybrjを呼び出す.
引数
[in]F関数fi(x)の値およびヤコビ行列を求めるユーザーサブルーチンで, 次のように定義すること.
Sub F(N As Long, X() As Double, Fvec() As Double, Fjac() As Double, IFlag As Long)
IFlag = 1 の場合:
与えられたX()から関数値fi(x)を求めFvec(i)に設定する(i = 0 〜 n-1). それ以外の変数を変更してはならない.
IFlag = 2 の場合:
与えられたX()からヤコビ行列(∂fi/∂xj)を求めFvec(i)に設定する(i = 0 〜 n-1, j = 0 〜 n-1). それ以外の変数を変更してはならない.
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)
[out]Info= 0: 正常終了. (連続した反復間の相対誤差がXTol以下になった)
= -2: パラメータ N の誤り. (N <= 0)
= -3: パラメータ X() の誤り.
= -4: パラメータ Fvec() の誤り.
= -5: パラメータ XTol の誤り. (XTol < 0)
= 1: 関数呼び出し(IFlag = 1)回数が上限(100*(N + 1))に達した.
= 2: XTolが小さすぎる. 解Xを改善することができなくなった.
= 3: 直近5回のヤコビ行列の評価において解が改善されなかった.
= 4: 直近10回の反復において解が改善されなかった.
= 5: ユーザーによる強制終了 (IFlag < 0でFから戻った).
出典
netlib/minpack
使用例
次の非線形連立方程式を解く.
x1^2 - x2 - 1 = 0
(x1 - 2)^2 + (x2 - 0.5)^2 - 1 = 0
初期値は, (x1, x2) = (0, 0) とする.
Sub FHybrj(N As Long, X() As Double, Fvec() As Double, Fjac() As Double, IFlag As Long)
If IFlag = 1 Then
Fvec(0) = X(0) ^ 2 - X(1) - 1
Fvec(1) = (X(0) - 2) ^ 2 + (X(1) - 0.5) ^ 2 - 1
ElseIf IFlag = 2 Then
Fjac(0, 0) = 2 * X(0)
Fjac(1, 0) = 2 * X(0) - 4
Fjac(0, 1) = -1
Fjac(1, 1) = 2 * X(1) - 1
End If
End Sub
Sub Ex_Hybrj1()
Const N = 2
Dim X(N - 1) As Double, Fvec(N - 1) As Double, XTol As Double, Info As Long
X(0) = 0: X(1) = 0
XTol = 0.0000000001 '1.0e-10
Call Hybrj1(AddressOf FHybrj, N, X(), Fvec(), XTol, Info)
Debug.Print "X1, X2 =", X(0), X(1)
Debug.Print "Info =", Info
End Sub
Sub Hybrj1(F As LongPtr, N As Long, X() As Double, Fvec() As Double, XTol As Double, Info As Long)
非線形連立方程式 (ハイブリッド法) (シンプルドライバ)
実行結果
X1, X2 = 1.06734608580669 0.139227666886861
Info = 0