fmincon 目标函数与非线性约束(nonlcon)带变参数
一、目标函数
算例:
f = x 1 2 + x 2 2 f = {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处的梯度 |
二、非线性约束
x 1 2 ≤ x 2 x 1 2 + 2 x 1 x 2 ≤ 5 x 1 = x 2 2 \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} x12≤x2x12+2x1x2≤5x1=x22
改写
x 1 2 − x 2 ≤ 0 x 1 2 + 2 x 1 x 2 − 5 ≤ 0 x 1 − x 2 2 = 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} x12−x2≤0x12+2x1x2−5≤0x1−x22=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 = p 1 x 1 2 + p 2 x 2 2 x 1 2 + 2 x 1 x 2 ≤ 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+2x1x2≤5
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)];
end
function [c,ceq] = nonlcon(x,p1,p2)
c = x(1)^2+2*x(1)*x(2)-5;
ceq = [];
end
<mark>对于fmincon没有的项一定要用空格站位</mark>
<mark>options</mark>表示优化器的配置选项,一般可以用 [ ] 代替
如上例:
options = optimoptions('fmincon','Display','iter','Algorithm','sqp')
变量 | 作用 |
---|---|
fmincon | 优化求解函数 |
Display iter: | 显示迭代过程 |
Algorithm sqp: | 求解算法 SQP |
详情见: https://www.mathworks.com/help/optim/ug/fmincon.html
2.目标函数与非线性约束均带参数
f = p 1 x 1 2 + p 2 x 2 2 c 1 x 1 2 + c 2 x 1 x 2 ≤ 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+c2x1x2≤5
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)];
end
function [c,ceq] = nonlcon(x,c1,c2)
c = c1*x(1)^2+c2*x(1)*x(2)-5;
ceq = [];
end
这里"…"是指当前行未完,连接下一行