|
|
◆ hybrd1()
| def hybrd1 |
( |
f |
, |
|
|
n |
, |
|
|
x |
, |
|
|
fvec |
, |
|
|
xtol |
= 1.0e-10 |
|
) |
| |
非線形連立方程式 (ハイブリッド法) (ヤコビ行列計算不要) (シンプルドライバ)
- 目的
- hybrd1はn本のn変数非線形方程式よりなる連立方程式
fi(x1, x2, ..., xn) = 0 (i = 1 〜 n)
の解をパウエルのハイブリッド法により求める.
関数値を計算するユーザールーチンが必要である. ヤコビ行列はルーチン内で前進差分により計算されるため, ユーザーがヤコビ行列を求める必要はない.
hybrd1は標準的な使用のためのシンプルドライバで, デフォルトパラメータを用いてhybrdを呼び出す.
- 戻り値
- info (int)
= 0: 正常終了 (連続した反復間の相対誤差がxtol以下になった)
= -1: 入力パラメータ f の誤り
= -2: 入力パラメータ n の誤り (n < 1)
= -3: 入力パラメータ x の誤り
= -4: 入力パラメータ fvec の誤り
= -5: 入力パラメータ xtol の誤り (xtol < 0)
= 1: iflag = 1または2によるfcnの呼び出し回数が上限(200*(n + 1))に達した
= 2: xtolが小さすぎる. 解xを改善することができなくなった
= 3: 直近5回のヤコビ行列の評価において解が改善されなかった
= 4: 直近10回の反復において解が改善されなかった
- 引数
-
| [in] | f | 関数fi(x)の値を求めるユーザーサブルーチンで, 次のように定義すること. _CODE def f(n, x, fvec, iflag): if iflag == 1 or iflag == 2: fvec[0] = 関数値 f1(x[0], x[1], ..., x[n-1]) fvec[1] = 関数値 f2(x[0], x[1], ..., x[n-1]) ... fvec[n-1] = 関数値 fn(x[0], x[1], ..., x[n-1]) _ENDCODE iflag = 1あるいは2のときに関数値fi(x)を計算してfvecに設定する. |
| [in] | n | 未知数および方程式の数. (n > 0) |
| [in,out] | x | Numpy ndarray (1次元配列, float, 長さn)
[in] 初期近似解.
[out] 求められた解ベクトル. |
| [out] | fvec | Numpy ndarray (1次元配列, float, 長さn)
求められた解ベクトルxにおける関数値. |
| [in] | xtol | (省略可)
目標精度. 続く2回の反復間の相対誤差がxtolより小さくなったら終了する. (xtol >= 0) (省略時 = 1.0e-10) |
- 出典
- netlib/minpack
- 使用例
- 次の非線形連立方程式を解く.
x1^2 - x2 - 1 = 0
(x1 - 2)^2 + (x2 - 0.5)^2 - 1 = 0
初期値は, (x1, x2) = (0, 0) とする. def f(n, x, fvec, iflag):
if iflag == 1 or iflag == 2:
fvec[0] = x[0]**2 - x[1] - 1
fvec[1] = (x[0] - 2)**2 + (x[1] - 0.5)**2 - 1
def TestHybrd1():
n = 2
x = np.array([0.0, 0.0])
fvec = np.empty(n)
print(x)
print(fvec)
print(info)
def hybrd1(f, n, x, fvec, xtol=1.0e-10) 非線形連立方程式 (ハイブリッド法) (ヤコビ行列計算不要) (シンプルドライバ)
- 実行結果
>>> TestHybrd1()
[1.06734609 0.13922767]
[-1.11022302e-16 0.00000000e+00]
0
|