|
|
◆ optif0()
| function optif0 |
( |
n::Integer |
, |
|
|
x::Array{Float64} |
, |
|
|
f::Function |
, |
|
|
xpls::Array{Float64} |
|
|
) |
| |
多変数非線形関数の最小点 (準ニュートン法) (シンプルドライバ)
- 目的
- optif0は非線形関数 f(x1, x2, ..., xn) (2階連続的微分可能な実数関数) の局所的最小点 (xs1, xs2, ..., xsn) を求める.
必要な微分係数は有限差分近似で求められる. また, ヘッセ行列はセカント法(BFGS法)で求められる. 探索アルゴリズムとして直線探索が使われる.
optif0は標準パラメータを設定してoptif9を呼び出すのに相当し, 準ニュートン法(BFGS法)のルーチンとして動作する.
- 戻り値
- (fpls, info)
fpls (Float64):
xplsにおける関数値.
info (Int32):
= 0: 正常終了
= -1: 入力パラメータ n の誤り (n <= 1)
= -2: 入力パラメータ x の誤り
= -3: 入力パラメータ f の誤り
= -4: 入力パラメータ xpls の誤り
= 1: 最後の更新において目的関数値が減少しなかった(局所的最小点にあるか, 非線形性が強すぎるか, steptlが大きすぎる)
= 2: 最大反復回数(200)を超えた
= 3: ステップサイズが続けて5回stepmxを超えた(関数形が際限なく傾斜しているか, stepmxが小さすぎる)
- 引数
-
| [in] | n | 問題の次数(パラメータ数). (n > 1) |
| [in] | x | 1次元配列 (Float64, n)
解ベクトルの初期推定値. |
| [in] | f | 目的関数 f(x1, x2, ..., xn) を求めるユーザー定義関数で, 次のように定義すること. _CODE function f(n, x) f(x[0], x[1], ..., x[n-1]) の関数値を返す. end _ENDCODE |
| [out] | xpls | 1次元配列 (Float64, n)
求められた解ベクトル(局所的最小点). |
- 出典
- CMLIB
- 使用例
- 次の関数(ローゼンブロック関数)の最小点を求める.
f(x1, x2) = 100(x2 - x1^2)^2 + (1 - x1)^2
初期値は, (x1, x2) = (-1.2, 1) とする. function TestOptif0()
f(n, x) = 100*(x[2] - x[1]^2)^2 + (1 - x[1])^2
n = 2
x = [ -1.2, 1.0 ]
xpls = Vector{Cdouble}(undef, n)
fpls, info = optif0(n, x, f, xpls)
println(xpls)
println(fpls)
println(info)
end
function optif0(n::Integer, x::Array{Float64}, f::Function, xpls::Array{Float64}) 多変数非線形関数の最小点 (準ニュートン法) (シンプルドライバ)
- 実行結果
> TestOptif0()
[0.9999905564752336, 0.9999811146442698]
8.91804174948292e-11
0
|