MATLAB中的优化工具箱具有线性和非线性求解器。“fmincon”是非常常见而又有效的solver。目标函数可以是代数方程,微分方程,连续变量,离散或整数变量等。
但是注意的是:在复杂问题里面,fmincon对initial guess特别敏感。
Step 1: Define非线性约束
function [c,ceq]=nlcon(x)
c = 25 - x(1)*x(2)*x(3)*x(4);
ceq = sum(x.^2) - 40;
Step 2:定义Objective function,initial guess,边界条件,等式约束、不等式约束等。Call “fmincon”函数,可以约束条件内的内的最小值。
objective = @(x) x(1)*x(4)*(x(1)+x(2)+x(3))+x(3);
% initial guess
x0 = [1,5,5,1];
% variable bounds
lb = 1.0 * ones(4);
ub = 5.0 * ones(4);
% show initial objective
disp(['Initial Objective: ' num2str(objective(x0))])
% linear constraints
A = [];
b = [];
Aeq = [];
beq = [];
% nonlinear constraints
nonlincon = @nlcon;
% optimize with fmincon
%[X,FVAL,EXITFLAG,OUTPUT,LAMBDA,GRAD,HESSIAN]
% = fmincon(FUN,X0,A,B,Aeq,Beq,LB,UB,NONLCON,OPTIONS)
x = fmincon(objective,x0,A,b,Aeq,beq,lb,ub,nonlincon);
% show final objective
disp(['Final Objective: ' num2str(objective(x))])
% print solution
disp('Solution')
disp(['x1 = ' num2str(x(1))])
disp(['x2 = ' num2str(x(2))])
disp(['x3 = ' num2str(x(3))])
disp(['x4 = ' num2str(x(4))])
Step 3: run code结果如下
Final Objective: 17.014
Solution
x1 = 1
x2 = 4.743
x3 = 3.8212
x4 = 1.3794