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} x12≤x2x12+2x1x2≤5x1=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} 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=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+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)];
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+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)];
endfunction [c,ceq] = nonlcon(x,c1,c2)
c = c1*x(1)^2+c2*x(1)*x(2)-5;
ceq = [];
end
这里"…"是指当前行未完,连接下一行