MATLAB 提供了數個指令來進行數學函數的最佳化,本節將介紹:
- 單變數函數的最小化
- 多變數函數的最小化
- 設定最佳化的選項
本節所討論的最佳化方法是比較基本的方法,若讀者有興趣使用較複雜的方法,可以使用「最佳化工具箱」(Optimization Toolbox)。
首先我們介紹單變函數的最小化。如果您要尋求 humps 在 [0.3, 1] 中的最小值,可用 fminbnd 指令來找出最小值的發生點,例如:
由上例可知,MATLAB 求得的最小值發生在 x = 0.637,且最小值為 11.2528。若要知道尋求最小值的中間過程,可使用 optimset 指令來設定顯示選項,再將 optimset 傳回的結構變數送入 fminbnd,例如:
上表列出 x 值的變化及相對應的函數值 f(x),最後一欄位列出求極小值的方法,通常是黃金分割搜尋(Golden Section Search)或是拋物線內插法(Parabolic Interpolation)。由列出的文字訊息可以知道,所算出的 x 值的誤差小於 10 的 -4 次方。
若要放鬆誤差管制,使 fminbnd 提早傳回計算結果,亦可由 optimset 來達成。下例將 x 的誤差範圍提高為 0.1:
以上範例均是對單變函數求及值,若要求取多變數函數的極值,可由 fminsearch 指令求得,但您必須指定一個起始點,以讓 fminsearch 據以求出在起始點附近的局部最小值(Local Minima)。假設您的目標函數是:
$$f(x_1, x_2, x_3)=(x_1-1)^2+5(x_2-2)^2+(x_3-3)^2$$
首先您必須產生一個 MATLAB 的函數 objective.m,其內容可顯示如下:
function y = objective(x)
y = (x(1)-1).^2 + 5*(x(2)-2).^2 + (x(3)-3).^2;
若起始點為 $(x_1, x_2, x_3)=(0, 0, 0)$,則我們可以輸入如下以求取最小值的發生位置:
fminsearch 使用的方法是下坡式 Simplex 搜尋(Downhill Simplex Search),詳細參考資料可見 筆者的另一本英文著作:「Neuro – Fuzzy and Soft Computing」, Prentice Hall, 1997。
MATLAB 最佳化的方法有許多不同的選項,這些選項是經由另一個輸入引數(Input Argument)來進入 fminbnd 或 fminsearch,其使用語法為:
x = fminbnd(@function, x1, x2, options)
或
x = fminsearch(@function, x0, options )
其中 options 是一個結構變數,包含六十多個欄位,代表各種最佳化的選項(或參數)。欲設定這些最佳化選項,可用 optimset 指令,其使用語法為:
options = optimset(prop1, value1, prop2, value2, …)
其中 prop1、prop2 等是欄位名稱,value1、value2 等是對應的欄位值。例如,如前所述,若要使 MATLAB 印出每一個最佳化步驟的中間結果,並放鬆誤差範圍,則可設定如下:
由上例可知,options 共有六十多個欄位,以滿足眾多最佳化指令的需求。(其它最佳化指令可見「最佳化工具箱(Optimization Toolbox)」)雖然 options 欄位眾多,但事實上,並不是每一個欄位值都會被用到,如果欄位值顯示是空矩陣,代表 MATLAB 會使用此欄位的預設值來進行運算。另,optimset 會根據輸入的最佳化函數名稱而回傳不同的結果,例如我們可以檢視與 fminbnd 相關的最佳化選項:
在上數範例中,我們特別將欄位值為空字串的欄位進行刪除,以節省顯示空間。
若要檢視與 fminsearch 相關的最佳化選項,可以輸入如下
與 fminbnd 和 fminsearch 相關的重要最佳化選項可以說明如下:
- Display 若為 0 (預設值),則不顯示中間運算結果。反之,若不為 0,則顯示運算過程的中間結果。
- MaxFunEvals 是函數求值運算(Function Evaluation)的最高次數,對 fminbnd 的預設值是 500,對 fminsearch 的預設值是 200 乘上 x0 的長度。
- MaxIter 是最大疊代次數,對 fminbnd 的預設值是 500,對 fminsearch 的預設值是 200 乘上 x0 的長度。
- TolFun 是決定終止搜尋的函數值容忍度,預設為 $10^{-4}$(此選項只被 fminsearch 用到,fminbnd 並不使用)。
- TolX 是決定終止搜尋的自變數值容忍度,預設為 $10^{-4}$。
MATLAB程式設計:進階篇