XLPack 6.1
Julia API リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ hybrd1()

function hybrd1 ( f::Function  ,
n::Integer  ,
x::Array{Float64}  ,
fvec::Array{Float64}  ,
xtol::Real  = 1.0e-10 
)

非線形連立方程式 (ハイブリッド法) (ヤコビ行列計算不要) (シンプルドライバ)

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

関数値を計算するユーザールーチンが必要である. ヤコビ行列はルーチン内で前進差分により計算されるため, ユーザーがヤコビ行列を求める必要はない.

hybrd1は標準的な使用のためのシンプルドライバで, デフォルトパラメータを用いてhybrdを呼び出す.
戻り値
info (Int32)
= 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 function 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]) end end _ENDCODE iflag = 1あるいは2のときに関数値fi(x)を計算してfvecに設定する.
[in]n未知数および方程式の数. (n > 0)
[in,out]x1次元配列 (Float64, n)
[in] 初期近似解.
[out] 求められた解ベクトル.
[out]fvec1次元配列 (Float64, 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) とする.
function fhybrd1(n, x, fvec, iflag)
fvec[1] = x[1]^2 - x[2] - 1
fvec[2] = (x[1] - 2)^2 + (x[2] - 0.5)^2 - 1
end
function TestHybrd1()
n = 2
x = [ 0.0, 0.0 ]
fvec = Vector{Cdouble}(undef, n)
info = hybrd1(fhybrd1, n, x, fvec)
println(x)
println(fvec)
println(info)
end
function hybrd1(f::Function, n::Integer, x::Array{Float64}, fvec::Array{Float64}, xtol::Real=1.0e-10)
非線形連立方程式 (ハイブリッド法) (ヤコビ行列計算不要) (シンプルドライバ)
実行結果
> TestHybrd1()
[1.0673460858066897, 0.13922766688686142]
[-1.1102230246251565e-16, 0.0]
0