9. 非線形最適化 (1次元)

XLPackによる1次元の非線形最適化問題の解き方, すなわち, 一般の1変数非線形関数の最小点の求め方の例を示します.

例題

次の関数の x=1 付近の最小点を求める.

  
  f(x) = x3 - 2x - 5

 
f(x)の形は次のとおりで, 大域的には最小点はない(-∞に発散する)ものの, x=1 付近に局所的な最小点があるのがわかります.

09-01

VBAプログラムを使用した解き方 (1)

VBA関数Dfminを使ったVBAプログラム例を示します.

Function F(X As Double) As Double
    F = X ^ 3 - 2 * X - 5
End Function

Sub Start()
    Dim Ax As Double, Bx As Double, Tol As Double, X As Double
    '--- Input data
    Ax = 0
    Bx = 1.5
    Tol = 0.000000000000001 '1e-15
    '--- Compute min. point of equation
    Call Dfmin(Ax, Bx, AddressOf F, Tol, X)
    '--- Output min. point
    MsgBox X
End Sub

Dfminは, 与えられた区間 [Ax, Bx] で局所的な最小点が1つ挟まれているものとして, その最小点を求めます. この場合, 最小点は1付近にあるので, Ax=0, Bx=1.5 としました.

このプログラムを実行すると, X = 0.81650 が求められました.

09-02

VBAプログラムを使用した解き方 (2)

リバースコミュニケーション版のVBAサブルーチンDfmin_rを使ったプログラム例を示します.

Sub Start()
    Dim Ax As Double, Bx As Double, Tol As Double, X As Double
    Dim XX As Double, YY As Double, IRev As Long
    '--- Input data
    Ax = 0
    Bx = 1.5
    Tol = 0.000000000000001 '1e-15
    '--- Compute min. point of equation
    IRev = 0
    Do
        Call Dfmin_r(Ax, Bx, Tol, XX, YY, IRev)
        If IRev <> 0 Then YY = XX ^ 3 - 2 * XX - 5
    Loop While IRev <> 0
    X = XX
    '--- Output min. point
    MsgBox X
End Sub

目的関数を外部関数として与えるのではなく, IRev = 1のときにXXの値を使って関数値を計算しYYに入れて再度Dfmin_rを呼び出します. リバースコミュニケーション版の詳細についてはこちらを参照してください.

このプログラムを実行すると上と同じ結果が得られます.