非線性規划
在matlab非線性規划數學模型可以寫成一下形式:
\[minf(x)\\ s.t.\begin{cases} Ax \le B \\ Aeq·x = Beq\\ C(x) \le 0\\ Ceq(x) = 0 \end{cases} \]
f(x)為目標函數,A,B,Aeq,Beq為線性約束對應的矩陣和向量,C(x),Ceq(x)為非線性約束。
Matlab求解命令為:
fun為目標函數,x0為初值,A,B,Aeq,Beq為線性約束對應的矩陣和向量,LB,UB分別為x的下限和上限,NONLCON為非線性約束(需要寫自定義函數),OPTIONS為優化參數。
【例】求下列非線性規划問題
\[minf(x) = x^2_1+x^2_2+8\\ s.t.\begin{cases} x_1^2-x_2 \ge 0\\ -x_1-x_2^2+2=0\\ x_1,x_2 \ge 0 \end{cases} \]
編寫函數文件:fun1.m,fun2.m
function f = fun1(x)
f = x(1)^2 + x(2)^2 + 8;
end
function [g,h] = fun2(x)
g = -x(1)^2 + x(2);
%g代表不等式約束,即代表約束條件-x(1)^2 + x(2) <= 0。matlab默認g<=0,所以題目中的條件被改成了相反數。
%如果有多個不等式約束,寫成g(1) = 關於x的函數; g(2) = 關於x的函數;······
h = -x(1) - x(2)^2 + 2;
%h代表等式約束,即代表約束條件 -x(1) - x(2)^2 + 2 = 0。
%如果有多個等式約束,寫成h(1) = 關於x的函數; h(2) = 關於x的函數;······
end
注:在寫fun2時,可以把線性和非線性約束的等式和不等式約束都按照這種格式寫到這個函數里面,這樣的話fun2就包含了所有約束條件,在后面運行fmincon()時不需要再寫A,B,Aeq,Beq,
直接用[]略過。
options = optimset;
[x, y] = fmincon('fun1', rand(2,1), [], [], [], [], zeros(2,1), [], 'fun2', options)
%‘fun1’代表目標函數,rand(2,1)隨機給了x初值,zeros(2,1)代表下限為0,即x1,x2>=0, 'fun2'即剛才寫的約束條件。
x為最優解,y為最優值。
轉化為無約束極值問題
利用問題中的約束函數做出適當的罰函數,將非線性規划問題轉化為無約束非線性規划問題。
\[minf(x)\\ s.t.\begin{cases} g_i(x) \le 0 & i=1,2,...,r\\ h_i(x) \ge 0 & i=1,2,...,s\\ k_i(x) = 0 & i=1,2,...,t \end{cases} \]
取一個充分大的M,構造函數
\[P(x,M)=f(x)+M\sum_{i=1}^{r}max(g_i(x),0)-M\sum_{i=1}^{s}min(h_i(x),0)+M\sum_{i=1}^{t}|k_i(x)|\\ 其中g代表\le 的不等式約束,h代表\ge 的不等式約束,k代表等式約束。\\ 則非線性規划問題轉化為無約束最小化P(x,M)。 \]
【例】將上面的例題轉化為無約束極值問題:
編寫test.m
funtion g = test(x)
M = 50000;
f = x(1)^2 + x(2)^2 +8;
g = f - M*min(x(1),0) - M*min(x(2),0) - M*min(x(1)^2-x(2),0) + M*abs(-x(1)-x(2)^2+2);
命令窗口
[x,y] = fminunc('test', rand(2,1))
參考書籍:Matlab在數學建模中的應用(第二版)卓金武