求解非线性问题:
min z = f(x)
s.t. c(x)≤0,
ceqx=0,
Ax≤b,
Aeqx=beq,
lb≤x≤ub.
【fmincon函数】
[x, fval, exitflag, output, lambda, grad, hessian] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options, P1, P2, …)
其中,x, b, beq, lb,和ub为线性不等式约束的上、下界向量, A 和 Aeq 为线性不等式约束和等式约束的系数矩阵矩阵,fun为目标函数,nonlcon为非线性约束函数。
函数f的定义:
function[c,ceq] = mycon(x)
c= … % 计算x处的非线性不等式。
ceq= … % 计算x处的非线性等式。
非线性约束条件的定义:
function[c,ceq,GC,GCeq] = mycon(x)
c = … % 解x处的非线性不等式。
ceq = … % 解x处的非线性等式。
if nargout > 2 % 被调用的nonlcon函数,要求有4个输出变量。
GC = … % 不等式的梯度。
GCeq = … % 等式的梯度。
【例题】
min f = -x1 - 2x2 + 0.5x12 + 0.5x22
s.t. 2x1 + 3x2 ≤ 6,
x1 + 4x2 ≤ 5,
2x1 + 3x22 ≤ 6,
0 ≤ x1,x2.
【代码】
function Example()
A = [2 3; 1 4];
b = [6; 5];
vlb = [0; 0];
x0 = [0; 0];
[x,fval,exitflag,output,lambda,grad,hessian] = fmincon('myfun',x0,A,b,[],[],vlb,[],'nonlia');
end
function f = myfun(x)
f = -x(1) - 2 * x(2) + 0.5 * (x(1).^2 + x(2).^2);
end
function [c, ceq] = nonlia(x)
c = 2 * x(1) + 3 * x(2).^2 - 6;
ceq = [];
end