9. 非線形最適化 (1次元)
注 – 例題ワークシートをダウンロードすることができます. 1. 例題ワークシートの入手と使用方法 をご覧ください.
1 次元の非線形最適化問題の XLPack による解き方, すなわち, 一般の1変数非線形関数の最小点の求め方の例を説明します.
例題
次の関数の x = 1 付近の最小点を求める.
f(x) = x3 - 2x - 5
f(x) の形は次のとおりで, 大域的には最小点はない(-∞に発散する)ものの, x = 1 付近に局所的な最小点があるのがわかります.
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) が入力されています.
ソルバーについては こちら も参照ください.