MATLAB 非線性優化函數fmincon


本文由olivewy編寫,原地址:http://www.cnblogs.com/olivewy/p/5148428.html 

 

優化成功或失敗

一、求解失敗

1、在到達迭代次數閾值或目標函數估值次數閾值時,求解器沒有最小化目標到要求的精度,此時求解器停止。接下來,可以嘗試以下方法:

(1)設置‘Display’為‘iter’,查看每步的迭代信息,這些信息包括:目標函數(Fval or f(x) or Resnorm)是否是下降的;檢查約束越界(Max constraint)是否是遞減趨向於0;查看一階優化是否是遞減趨向於0;查看置信域半徑(Trust-region radius)是否下降趨向於一個小的值。若其中至少一種情況為是,就表示結果是不斷改善的。如果結果是不斷改善的,可以采取下邊的措施:設置MaxIter、MaxFunEvals比默認值大的值,默認值可以在優化工具箱或求解器的函數參考頁的優化表中查看;從最后計算出的點開始重新求解。如果結果沒有改善,嘗試以下其他的方法。

(2)放松精度

如果TolX或TolFun太小,當求解器達到一個最小值時可能也不會識別到,這就會導致無限次徒勞的迭代。DiffMaxChange和DiffMinChange選項能影響求解器的改善,它們控制求導估計中有限差分的步長。

(3)從不同的初始點重新開始求解

(4)檢查目標函數和約束函數的定義

舉個例子,可以檢查目標函數和非線性約束函數在某些特定點處返回正確的值。不可行的點不一定導致函數的錯誤。

(5)對問題進行中心化和標准化

當每個坐標軸對目標函數和約束函數有相同的影響時,求解器更能可靠的運行,對每個坐標軸方向乘以合適的量使得每個坐標軸的影響相同,在特定的坐標軸上加上合適的值使得它們長度一致。

(6)提供解析的梯度和雅可比矩陣

如果用戶不提供解析的梯度或雅可比矩陣,求解器會用有限差分來估計這些值,因此提供這些導數可以減少運算時間,提高計算准確度。

對於約束問題,提供梯度還有另一個好處----求解器到達一個點x時能滿足該點是可行的,但有限差分在x點周圍可能會導致不可行的點,在這種情況下,求解器可能會失敗或突然中斷。

(7)提供海塞矩陣

當提供海塞矩陣時,求解器能運行的更可靠,而且運行的次數比較少。

2、無可行點

在TolCon約束精度內,求解器不能找到一個滿足所有約束條件的點,此時,可以嘗試以下方法:

(1)檢查線性約束

通過求解一個線性規划問題來找到一個滿足界約束和線性約束的點。

i)定義一個目標函數是常值0的線性規划問題

f = zeros(size(x0));   % assumes x0 is the initial point

ii)求解這個線性規划問題看是否有一個可行點

xnew = linprog(f,A,b,Aeq,beq,lb,ub);

iii)如果有可行點xnew,用xnew作為初始點去求解原始問題

iv)如果沒有可行點,那說明原始模型建的不好,檢查界約束和線性約束。

(2)檢查非線性約束

在保證界約束和線性約束是可行的之后,檢查非線性約束:

i)設置目標函數為0,然后求解優化問題,如果能找到一個可行點xnew,令x0=xnew返回到原始問題中去

ii)如果用0目標函數不能找到一個可行點,嘗試幾個不同的初始點重新求解,如果找到了一個可行點xnew,令x0=xnew並返回到原始問題中去,如果仍沒找到可行點,試着用下列方法放松約束條件。

a.改變非線性約束函數c為c-Δ,Δ是一個正數,這會使得非線性約束更容易滿足。

b.嘗試用原始的目標函數或0目標函數對新的約束函數尋找一個可行點。如果找到一個可行點,那么減少Δ,並在之前找到的點處開始對新的約束函數重新找一個可行點;如果沒有找到一個可行點,試着增大Δ並重新找。

如果一直沒有找到可行點,那么原始問題可能確實是不可行的,重新檢查約束函數的定義。

3、問題是無界的

求解器到達一個目標函數小於目標閾值界的點,那么

(1)原問題可能確實無界,即存在一系列滿足問題約束的點xi,使得lim f(xi) = –∞。

(2)檢查原問題建模正確,求解器是最小化目標函數,如果想得到最大化,將目標函數乘以-1.

(3)試着標准化或中心化原問題。

(4)放松目標函數界精度,用optimset減少ObjectiveLimit設定的精度值。

二、求解可能成功

1、最后的點等於初始點

初始點可能是局部極小點,因為它的一階導數接近0,如果並不確定初始點確實是一個局部極小點,嘗試下邊的步驟:

(1)從不同的點開始重新求解

(2)檢查目標函數和約束函數定義正確。

(3)改變精度,如TolFun,TolCon,TolX

(4)標准化原問題,使得每個坐標軸有相同的影響。

(5)提供解析的梯度和海塞矩陣。

2、可能的局部最小值(Local Minimum Possible,not ' Local Minimum Found')

求解器可能達到一個局部最小值,但並不確定,因為一階導數不小於TolFun,為了檢查得到的答案是否是可靠的,考慮下邊的建議。

(1)非平滑函數

如果試着最小化一個非平滑的函數,或者有非平滑的約束,那么‘"Local Minimum Possible’是最好的返回標志,因為一階導數條件並不適用於非平滑的點。試着檢查周圍的點來確定結果是否真的可靠。

(2)在最后得到的點處開始重新優化

在最后得到的點處開始重新優化會得到一個在一階導數估量上更好的點,更好的一階導數估量能讓人相信結果是可靠的。

3、嘗試一個不同的算法

4、改變精度

5、重新標准化原問題

6、檢查鄰近點

7、改變有限差分的計算方法

中心有限差分用的時間更多,但更准確,可以設置'FinDiffType' 為'central'。

8、提供解析的梯度或雅可比矩陣

9、提供海塞矩陣

三、求解成功

當求解器返回成功信息時,也可能結果是錯誤的,下邊有幾種方法可以驗證結果。

1、改變初始點

初始點對求解結果有很大影響,如果從不同的初始點得到了相同或較差的結果,說明原來求得的界是正確的。

2、檢查鄰近點

計算f(xfinal±Δ)的值,與f(xfinal)值做比較。

3、檢查目標函數與約束函數

4、局部最優與全局最優

(1)為什么求解器找不到最小的最小值

通常,求解器返回的是一個局部最小值,該值也可能是一個全局最小值,但並不保證是。這部分討論求解器得出這種結果的原因,並給出尋找全局最小值的建議。

一般求解器是在初始點的basin of attraction找到的最優值,但也有些例外:

i)線性規划和正定二次規划是凸的,可行域也是凸的,所以只有一個basin of attraction。在設定某些條件下,linprog會忽略用戶提供的初始點,quadprog也不需要。

ii)全局優化工具箱,如simulannealbnd,試着搜索不止一個basin of attraction。

(2)尋找一個更小的最小值

如果需要一個全局最小值,必須要在全局最小值的basin of attraction內找一個初始點。

設置初始點的建議:

i)用初始點的一個規則網格

ii)如果原始問題在所有的坐標軸上是有界的,那么從均勻分布得到一個隨機初始點,如果有些部分是無界的,那么用正態、指數或其他隨機分布得到初始點。對全局最優值的位置知道的越少,就要選擇越分散的隨機分布。例如,正態分布大部分樣本在均值的三個標准偏差范圍內,但柯西分布(密度函數1/(π(1 + x2)))樣本很分散。

iii)如果有全局優化工具箱的許可,可以應用GlobalSearch或MultiStart,這些求解器能在上下界范圍內自動產生隨機初始化點。

對可能的初始化點知道的越多,搜尋最優值會越集中,成功的幾率會越大。

(3)Basins of Attraction

如果目標函數f(x)是平滑的,那么負梯度方向–∇f(x)是函數值下降最快的方向。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM