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