MATLAB 非線性規划


MATLAB求解非線性規划可以使用 fmincon 函數,其數學模型可以寫成如下形式:

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

其中,fun是目標函數,x0是初始值,A,b 規定線性不等式約束條件,Aeq,beq 規定線性等式約束條件,lb 規定可行解的數值下限,ub規定可行解的數值上限。nonlcon是包含非線性約束條件(C(x),Ceq(x))的函數。使用options所指定的優化選項執行最小化。

例如,使用MATLAB計算如下非線性規划。

x0 = [0.5,0];
A = [1,-2];
b = 1;
Aeq = [2,1];
beq = 1;
x = fmincon(fun,x0,A,b,Aeq,beq)

帶有邊界約束的,例如:

fun = @(x)1+x(1)/(1+x(2)) - 3*x(1)*x(2) + x(2)*(1+x(1));
lb = [0,0];
ub = [1,2];
% 沒有線性約束,因此將這些參數設置為 []。
A = [];
b = [];
Aeq = [];
beq = [];
% 嘗試使用一個位於區域中部的初始點。
x0 = (lb + ub)/2; 
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)

帶有非線性約束的,例如:

%% 主函數
options=optimset('largescale','off'); 
x = 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 和 nonlcon 不能更改已有輸入和輸出的用途或含義,也不能增加額外的輸入和輸出。當目標函數或非線性約束條件較為復雜時,可以通過定義和使用全局變量(global)傳遞參數,例如:

%% 主函數
global region;
global speces;
region=rand(10,10);
speces=unifrnd(20,2);
options=optimset('largescale','off'); 
x = fmincon(@fun,rand(3,1),[],[],[],[],zeros(3,1),[], @nonlcon, options);

%% 目標函數
function f=fun(x)
global region;
f=sum(x.^2)+sum(sum(region));
end

%% 非線性約束條件
function [c,ceq]=nonlcon(x)
global speces;
c=[-x(1)^2+x(2)-x(3)^2 
    x(1)+x(2)^2+x(3)^3-sum(speces(:,1))];  %非線性不等式約束 
ceq=[-x(1)-x(2)^2+2 
   x(2)+2*x(3)^2--sum(speces(:,2))]; %非線性等式約束 
end

  

特別感謝:

任雪樵 

 

參考資料:

https://ww2.mathworks.cn/help/optim/ug/fmincon.html

https://blog.csdn.net/qq_29831163/article/details/89483975

https://blog.csdn.net/qq_29831163/article/details/89485908

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM