文章目錄
前面我們學了線性規劃,整數規劃,我們可以把整數規劃了解為是特殊的線性規劃。
在實際生活中,我們更多的認為資料是非線性的,對于線性規劃這畢竟會是一些少量,為此我們引入了非線性規劃。
如果目标函數或限制條件中包含非線性函數,就稱這種規劃問題為非線性規劃問題。
Matlab 中非線性規劃的數學模型寫成以下形式:

跟我們前面學線性規劃一樣,都有一個對應的模型。數學模型會建立了吧?
fmincon函數用于尋找限制非線性多變量函數的最小值。這個函數怎麼用?
這是文法格式:
x = fmincon(fun,x0,A,b) 從 x0 開始,嘗試在滿足線性不等式 A*x ≤ b 的情況下尋找 fun 中所述的函數的最小值點 x。x0 可以是标量、向量或矩陣。
x = fmincon(fun,x0,A,b,Aeq,beq) 在滿足線性等式 Aeq*x = beq 以及不等式 A*x ≤ b 的情況下最小化 fun。如果不存在不等式,則設定 A = [] 和 b = []。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub) 對 x 中的設計變量定義一組下界和上界,使解始終在 lb ≤ x ≤ ub 範圍内。如果不存在等式,請設定 Aeq = [] 和 beq = []。如果 x(i) 無下界,請設定 lb(i) = -Inf,如果 x(i) 無上界,請設定 ub(i) = Inf。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) 使用 options 所指定的優化選項執行最小化。使用 optimoptions 可設定這些選項。如果沒有非線性不等式或等式限制,請設定 nonlcon = []。
參數什麼意思?
b 和 beq 是向量,A 和 Aeq 是矩陣,c(x) 和 ceq(x) 是傳回向量的函數,f(x) 是傳回标量的函數。f(x)、c(x) 和 ceq(x) 可以是非線性函數。
x、lb 和 ub 可以作為向量或矩陣傳遞
行了行了,看看就行,看不懂i沒事,我們結合具體例子來學會他。
目标函數:
fun = (x)100*(x(2)-x(1)^2)^2+(1-x(1))^2
限制條件:從點
[-1,2]
為起點求最小值,限制方程
x(1)+2x(2)≤1
matlab代碼:
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;%匿名函數使用部落格講過
x0 = [-1,2];%起點可以更改,似乎沒影響
A = [1,2];
b = 1;
[x,y] = fmincon(fun,x0,A,b)%套用函數
運作:
求如下:
matlab代碼:(參數前面的文章講過了,就不注釋了,唯一強調的fun函數用到了匿名函數,本專欄有講)
clc
clear all
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
x0 = [1,1];%初始點設定自行不同
A = [1,-2];
b = 1;
Aeq = [2,1];
beq = 1;
[x,y] = fmincon(fun,x0,A,b,Aeq,beq)
min f (x) = x1^2 + x2^2 + x3^2 + 8
限制條件:
x1^2 − x2 + x3 ^2 ≥ 0
x1 + x2^2 + x3 ^3 ≤ 20
− x1 − x2^2 + 2 = 0
x2 + 2x3^2 = 3x1
x1,x2 , x3 ≥ 0
matlab解法:(具體看我注釋)
clc
clear all
%% 主函數
options=optimset('largescale','off');
[x,y] = fmincon(@fun,rand(3,1),[],[],[],[],zeros(3,1),[], @nonlcon, options)
%% 目标函數
function f=fun(x)
f=sum(x.^2)+8;
end
%% 非線性限制條件
function [c,ceq]=nonlcon(x)
c=[-x(1)^2+x(2)-x(3)^2
x(1)+x(2)^2+x(3)^3-20]; %非線性不等式限制
ceq=[-x(1)-x(2)^2+2
x(2)+2*x(3)^2-3]; %非線性等式限制
end
目标函數為最小化函數,fun是一個函數,fun接受向量或數組 x,并傳回實數标量 f,即在 x 處計算的目标函數值。
非線性限制條件,nonlcon是一個函數,接受向量或數組 x,并傳回兩個數組 c(x) 和 ceq(x)。
在邊界限制下求 目标函數在圓内最小的點。目标函數:
fun = (x)100*(x(2)-x(1)^2)^2+(1-x(1))^2
這一步可以匿名函數得到:
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
0 ≤ x (1) ≤ 0.5 0
0.2≤x(2)≤0.8
這一步可以得到:
lb = [0,0.2];
ub = [0.5,0.8];
同時在以 [1/3,1/3] 為圓心、半徑為 1/3 的圓内尋找,可以編寫一個函數代碼如下:
function [c,ceq] = circle(x)
c = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2;
ceq = [];
沒有線性限制是以将這些參數設定為 []
A = [];
b = [];
Aeq = [];
beq = [];
是以全部代碼為:
函數代碼:
function [c,ceq] = circle(x)
c = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2;
ceq = [];
end
主代碼:
clc
clear all
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
lb = [0,0.2];
ub = [0.5,0.8];
A = [];
b = [];
Aeq = [];
beq = [];
x0 = [1/4,1/4];
nonlcon = @circle;
[x,y] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
下一篇我們還要講一些關于非線性規劃的内容,今天就講一半即可,請消化了解。
你需要完成的任務:了解本篇文章的内容,代碼自己敲一遍,寫一篇文章送出,最好你寫的部落格能加上你自己的了解,如果我有講的不對的,你可以在送出任務的評論區指正或着談談你覺得有什麼改進的都可以。