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を呼び出します。リバースコミュニケーション版の詳細についてはこちらを参照してください。

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

Top