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

注 – 例題ワークシートをダウンロードすることができます. 1. 例題ワークシートの入手と使用方法 をご覧ください.


1 次元の非線形最適化問題の XLPack による解き方, すなわち, 一般の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 が求められます.

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

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

ソルバーを使用した解き方

XLPackソルバーアドインの「1変数非線形最適化」を使って解くこともできます. B7セルに数式 (=B6^3-2*B6-5) が入力されています.

ソルバーについては こちら も参照ください.