在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求解命令爲:
優化
【例】求下列非線性規劃問題
\[ 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.mspa
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,
直接用[]略過。code
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.mio
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);
命令窗口function
[x,y] = fminunc('test', rand(2,1))
參考書籍:Matlab在數學建模中的應用(第二版)卓金武class