【科研小技巧】——多自變量目標(biāo)函數(shù)求最小值,matlab非線性規(guī)劃函數(shù)fmincon使用方法
最近搞科研遇到了一個(gè)問(wèn)題,描述如下:
對(duì)于自變量x1,x2,已知x1∈(0,1),x2∈(0,x1),且有f=f(x1,x2),如何求解f(x1,x2)對(duì)應(yīng)的最小值?
最早我用的辦法就是遍歷的方法,利用兩個(gè)for循環(huán)嵌套的方式,求解該函數(shù)的最小值,但這種方法計(jì)算速度很慢,效率低下。
那么如何快速求解上述問(wèn)題呢?在與辦公室大佬的交流中,我得知了fmincon函數(shù),這也令我如獲至寶。
fmincon這個(gè)函數(shù)的使用方法百度有很多教程有教學(xué),我也簡(jiǎn)單記錄一下。
非線性規(guī)劃函數(shù)fmincon調(diào)用形式如下:
[x,fval] = fmincon(fun ,x0 ,A ,b ,Aeq ,Beq ,LB ,UB ,nonicon)
其中:
(1)x為求解函數(shù)的最小值,fun為目標(biāo)函數(shù)
fun函數(shù)寫(xiě)成句柄的函數(shù)形式
例如:fun=@(x)?x(1)^2+x(2)^2+8;
(2)x0為自變量初始估值
如有兩個(gè)自變量估值x1,x2應(yīng)寫(xiě)成[x1; x2],注意這里是用分號(hào)隔開(kāi)
(2)A,b為線性不等式約束
如果不等式約束有:
x1+x2<1
x1+2*x2<10
則這里的A為自變量系數(shù),即為[1,1; 1,2],不同的不等式約束之間用分號(hào)連接
b為小于號(hào)右邊數(shù),即為[1;10]
(3)Aeq,beq為線性等式約束
如果等式約束有:
x1 + x2 =?5
x1 + 2*x2 = 15
則這里的Aeq為自變量系數(shù),即為[1,1; 1,2],不同的不等式約束之間用分號(hào)連接
beq為等于號(hào)右邊數(shù),即為[5;15]
(4)LB,UB分別為自變量x1,x2上下限
如果x1和x2分別滿足
0<x1,x2<1
則這里L(fēng)B = [0,0],UB=[1,1]
(5)nonlincon是非線性約束
這里需要單獨(dú)將其寫(xiě)成一個(gè)函數(shù)形式,比如非線性約束有:

那么這里可以單獨(dú)寫(xiě)一個(gè)非線性約束的函數(shù)
例如
function [c,ceq] = nonlincon(x)
c = -x(1)^2 +?x(2)????????%一定要保持c ≤ 0 這種形式
ceq = -x(1) - x(2)^2 + 2;
利用fmincon函數(shù),將前述問(wèn)題具體化,可寫(xiě)為:
[x,eval] =?fmincon(fun?,x0?,A?,b?,Aeq?,Beq?,LB?,UB?,nonicon)
fun = @(x) f(x);? ? ? ?%具體函數(shù)形式根據(jù)求解問(wèn)題確定
x0 = [0.5,0.4];
A = [-1,1];
b = 0;
Aeq = [];
Beq = [];
LB = [0,0];
UB = [1,1];
這樣即可求解出目標(biāo)函數(shù)的最小值fval,以及對(duì)應(yīng)的自變量x