作者w12389034e (林小緯)
看板MATLAB
標題[問題] 關於非線性問題的最佳化
時間Mon Jan 11 11:08:04 2016
如題
如果有一個非線性問題 變量為x 有八個
而且有邊界的設定:
x(1)+x(5)<=1800
x(2)+x(6)<=1200
x(3)+x(7)<=500
x(4)+x(8)<=1100
目標函數是
F = C1*[x(1)+x(4)]+C2*[x(2)+x(6)]+C3*[x(3)+x(7)]+C4*[x(4)+x(8)]
C1~C4都是常數
先前只有單變數的上下限限制 所以小弟使用lsqnonlin
求解效果還不錯 不過如果想要改成雙變數的上限下的話
lsqnonlin似乎做不到?
嘗試使用fmincon求解 結果跑出錯誤 如下
Error using fmincon (line 708)
User supplied objective function must return a scalar value.
翻了一下說明書 fmincon好像只能用在General smooth的問題?
問題很長 希望各位大大解惑 謝謝m(_ _)m
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.239.222.100
※ 文章網址: https://webptt.com/m.aspx?n=bbs/MATLAB/M.1452481686.A.66D.html
1F:推 tn00364361: 怎麼看起來好像應該是線性規劃的問題? 01/11 13:28
2F:推 sunev: 線性規劃請用 linprog 01/11 14:25
會說是非線性問題的原因是因為
雖然F看起來是線性的
但是因為我還有用懲罰函數的關係
所以整個F應該寫為
F = C1*[x(1)+x(4)]+C2*[x(2)+x(6)]+C3*[x(3)+x(7)]+C4*[x(4)+x(8)] + 懲罰值
不過剛剛去一些論壇看了一下 lsqnonlin似乎沒辦法像是fmincon這樣
讓兩個變數的和在一個限制下求解
※ 編輯: w12389034e (140.116.77.71), 01/11/2016 15:16:15
3F:→ LiamIssac: What is the penalty fun? 01/11 19:15
4F:推 yugi2567: 你怎麼證明這就是最佳的?你有比較嗎? 01/11 19:36
5F:推 tn00364361: 所以penalty是非線性的嗎? 01/12 10:19
會使用懲罰函數法是因為我想要優選的問題含有一些限制條件
然而疊代的過程中有可能會違反限制 因此給予違反限制的情形懲罰
方法是將違反限制大小的平方與目標函數結合
違反越多 則懲罰量會平方增加 因此優選法會朝盡量不違反限制的方向優選
這個是比較簡單的懲罰函數法(外點法)
也因為懲罰函數的存在所以不會是線性的(因為次方不為一次)
另外yugi大大題的最佳是指問題的全域最佳解嗎@@?
如果是的話 lsqnonlin提供的演算法有兩種:TRR法和LM法
這兩種方法都不能保證找到全域最佳解
我嘗試用不同的起始值計算得到的答案也不相同
如果嘗試次數夠多 理論上應該可以找到近似最佳解
但是要證明是否是全域最佳好像有點困難QQ
※ 編輯: w12389034e (36.239.204.154), 01/12/2016 11:53:15
6F:→ LiamIssac: 你還是沒講你的penalty是什麼形式 問題應該出在那邊 01/12 15:14