fmincon 目标函数与非线性约束(nonlcon)带变参数

  • 一、目标函数
    • 1.首先建立简单的目标函数(不带梯度)
    • 2.建立标准目标函数(带梯度)
  • 二、非线性约束
  • 三、目标函数与非线性约束带参数(变参数)
    • 1.参数仅在目标函数中:
    • 2.目标函数与非线性约束均带参数

一、目标函数

      算例:
f=x12+x22f = {x_1}^2 + {x_2}^2 f=x12+x22
      fmincon优化目标函数,梯度可带可不带,但是在(1)(2)情况下,最好带上:
            (1)梯度容易求出(2)加快优化速度(1)梯度容易求出(2)加快优化速度(1)(2)

1.首先建立简单的目标函数(不带梯度)

      1)简单函数形式

fun = @(x)x(1)^2 + x(2)^2;

      2)函数形式

function [f] = fun(x)
f = x(1)^2 + x(2)^2;
end
变量 作用
x 待优化变量
f: 返回目标函数在x处的值

2.建立标准目标函数(带梯度)

function [f,gradf] = fun(x)
f = x(1)^2 + x(2)^2;
gradf = [2*x(1);2*x(2)];
end
变量 作用
x 待优化变量
f: 返回目标函数在x处的值
gradf: 返回目标函数在x处的梯度

二、非线性约束

x12≤x2x12+2x1x2≤5×1=x22\begin{array}{l} {x_1}^2 \le {x_2}\\ {x_1}^2 + 2{x_1}{x_2} \le 5\\ {x_1}={x_2}^2 \end{array} x12x2x12+2x1x25x1=x22
改写
x12−x2≤0x12+2x1x2−5≤0x1−x22=0\begin{array}{l} {x_1}^2-{x_2} \le0 \\ {x_1}^2 + 2{x_1}{x_2} -5\le 0\\ {x_1}-{x_2}^2=0 \end{array} x12x20x12+2x1x250x1x22=0

function [c,ceq] = nonlcon(x)
c(1) = x(1)^2-x2;
c(2) = x(1)^2+2*x1*x2-5;
ceq = x(1)-x(2)^2;
end
变量 作用
x 待优化变量
c: 返回非线性不等式约束
ceq: 返回非线性等式约束

三、目标函数与非线性约束带参数(变参数)

      我们往往会遇到待优化函数或者非线性约束中带参数情况,有两种解决变法:

1.参数仅在目标函数中:

f=p1x12+p2x22x12+2x1x2≤5\begin{array}{l} f = {p_1}{x_1}^2 + {p_2}{x_2}^2\\ {x_1}^2 + 2{x_1}{x_2} \le 5 \end{array} f=p1x12+p2x22x12+2x1x25

x0 = [-1,2];
p1 = 2; p2 =2;%优化求解器选项配置
options = optimoptions('fmincon','Display','iter','Algorithm','sqp') 
%新手可将 options  = []%优化求解器返回最优解
x = fmincon(@fun,x0,[],[],[],[],[],[],@nonlcon,options,p1,p2)%返回优化后变量function [f,gradf] = fun(x,p1,p2)
f = p1*x(1)^2 + p2*x(2)^2;
gradf = [2*p1*x(1);2*p2*x(2)];
endfunction [c,ceq] = nonlcon(x,p1,p2)
c = x(1)^2+2*x(1)*x(2)-5;
ceq = [];
end

对于fmincon没有的项一定要用空格站位
options表示优化器的配置选项,一般可以用 [ ] 代替
如上例:

options = optimoptions('fmincon','Display','iter','Algorithm','sqp')
变量 作用
fmincon 优化求解函数
Display iter: 显示迭代过程
Algorithm sqp: 求解算法 SQP

详情见: https://www.mathworks.com/help/optim/ug/fmincon.html

2.目标函数与非线性约束均带参数

f=p1x12+p2x22c1x12+c2x1x2≤5\begin{array}{l} f = {p_1}{x_1}^2 + {p_2}{x_2}^2\\ {c_1}{x_1}^2 + {c_2}{x_1}{x_2} \le 5 \end{array} f=p1x12+p2x22c1x12+c2x1x25

x0 = [-1,2];
p1 = 2;p2 =2;
c1 = 2;c2 =2;%优化求解器选项配置
options = optimoptions('fmincon','Display','iter','Algorithm','sqp') 
%新手可将 options  = []%优化求解器返回最优解
x = fmincon(@(x)fun(x,p1,p2),x0,[],[],[],[],[],[],...@(x)nonlcon(x,c1,c2),options)%返回优化后变量function [f,gradf] = fun(x,p1,p2)
f = p1*x(1)^2 + p2*x(2)^2;
gradf = [2*p1*x(1);2*p2*x(2)];
endfunction [c,ceq] = nonlcon(x,c1,c2)
c = c1*x(1)^2+c2*x(1)*x(2)-5;
ceq = [];
end

这里"…"是指当前行未完,连接下一行