赞
踩
导读:在工程、科学和金融等领域,非线性规划(Nonlinear Programming,简称NLP)是一个常见而重要的问题。MATLAB提供了强大的非线性规划求解工具,其中最常用的函数之一是fmincon
。本文将介绍fmincon
函数的基本用法以及如何在MATLAB中使用它来解决非线性规划问题。
fmincon
函数fmincon
是MATLAB中用于求解非线性规划问题的函数。它的基本语法如下:
[x, fval, exitflag, output] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon)
fun
:表示要最小化的目标函数。x0
:表示初始解的猜测。A
和b
:表示不等式约束。Aeq
和beq
:表示等式约束。lb
和ub
:表示变量的下界和上界。nonlcon
:表示非线性约束函数(可选)。fmincon
的输出包括最优解x
,最优值fval
,退出标志exitflag
和优化过程的输出信息output
。
公式与函数的对应关系:
{
f
u
n
f
(
x
)
目标函数
l
b
,
u
b
l
b
≤
x
≤
u
b
上下界约束
A
,
b
A
⋅
x
≤
b
线性不等式约束
A
e
q
,
b
e
q
A
e
q
⋅
x
=
b
e
q
线性等式约束
n
o
n
l
c
o
n
c
(
x
)
≤
0
,
c
e
q
(
x
)
=
0
非线性等式约束
,
非线性不等式约束
x
0
初始最优解猜测值
x
返回最优解
o
p
t
i
o
n
s
求解器参数设置
\left\{
算例:
min
x
f
(
x
)
=
x
1
2
+
x
2
2
[
−
2
−
3
]
≤
[
x
1
x
2
]
≤
[
2
3
]
[
−
6
−
7
]
≤
[
3
1
1
2
]
[
x
1
x
2
]
≤
[
5
7
]
x
1
2
+
2
x
1
x
2
≤
5
x
1
=
x
2
2
%初始猜测值
x0 = [-1,2];
%上下界约束
lb = [-2;-3];
ub = [2;3];
%线性不等式约束
A1 = [3 1;
1 2];
A2 = -[3 1;
1 2];
b1 = [5;7];
b2 = -[-6; -7];
A = [A1;A2];
b = [b1;b2];
%线性等式约束
Aeq = [];
beq = [];
%优化求解器选项配置
options = optimoptions('fmincon','Display','iter','Algorithm','sqp') ;%新手可将 options = []
%优化求解器返回最优解
x = fmincon(@fun,x0,A,b,Aeq,beq,lb,ub,...
@nonlcon,options);%返回优化后变量
disp("最优解 ")
x
%目标函数
function [f,gradf] = fun(x)
f = x(1)^2 + x(2)^2;
gradf = [2*x(1);2*x(2)];
end
%非线性约束
function [c,ceq] = nonlcon(x)
c= 1*x(1)^2+2*x(1)*x(2)-5;%非线性不等式约束
ceq = x(1)-x(2)^2;%非线性等式约束;%非线性等式约束
end
a) 目标函数(不带梯度)
function [f] = fun(x)
f = x(1)^2 + x(2)^2;
end
变量 | 作用 |
---|---|
x | 待优化变量 |
f | 返回目标函数在x处的值 |
b) 目标函数(带梯度)
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处的梯度 |
fmincon优化目标函数,梯度可带可不带,但是在(1)(2)情况下,最好带上:
(
1
)
梯度容易求出
(
2
)
加快优化速度
(1)梯度容易求出(2)加快优化速度
(1)梯度容易求出(2)加快优化速度
[
−
2
−
3
]
≤
[
x
1
x
2
]
≤
[
2
3
]
\left[ {
可知
l
b
=
[
−
2
−
3
]
,
u
b
=
[
2
3
]
lb = \left[ {
lb = [-2;-3];
ub = [2;3]
A
⋅
x
≤
b
[
−
6
−
7
]
≤
[
3
1
1
2
]
[
x
1
x
2
]
≤
[
5
7
]
A
e
q
⋅
x
≤
b
e
q
无
可知
A
1
=
[
3
1
1
2
]
,
b
1
=
[
5
7
]
A
2
=
−
[
3
1
1
2
]
,
b
2
=
−
[
−
6
−
7
]
A
e
q
=
[
]
,
b
e
q
=
[
]
A1 = [3 1;
1 2];
A2 = -[3 1;
1 2];
b1 = [5;7];
b2 = -[-6; -7];
A = [A1;A2]
b = [b1;b2];
Aeq = [];
beq = [];
c
(
x
)
≤
0
x
1
2
+
2
x
1
x
2
≤
5
c
e
q
(
x
)
=
0
x
1
=
x
2
2
改写
x
1
2
+
2
x
1
x
2
−
5
≤
0
x
1
−
x
2
2
=
0
function [c,ceq] = nonlcon(x)
c= x(1)^2+2*x1*x2-5;
ceq = x(1)-x(2)^2;
end
变量 | 作用 |
---|---|
x | 待优化变量 |
c: | 返回非线性不等式约束 |
ceq: | 返回非线性等式约束 |
我们往往会遇到待优化函数或者非线性约束中带参数情况,有两种解决变法:
f
=
p
1
x
1
2
+
p
2
x
2
2
x
1
2
+
2
x
1
x
2
≤
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
f
=
p
1
x
1
2
+
p
2
x
2
2
c
1
x
1
2
+
c
2
x
1
x
2
≤
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
对于fmincon没有的项一定要用[]占位
options表示优化器的配置选项,如上例:
options = optimoptions('fmincon','Display','iter','Algorithm','sqp')
变量 | 作用 |
---|---|
fmincon | 优化求解函数 |
Display iter: | 显示迭代过程 |
Algorithm sqp: | 求解算法 SQP |
… \dots … | 当前行未完,连接下一行 |
在MATLAB中,fmincon
函数是一个强大的工具,用于求解非线性规划问题。通过定义目标函数和约束条件,您可以使用这个函数来寻找最优解。在实际应用中,问题的复杂性可能会增加,但fmincon
仍然是一个有力的工具,可用于解决各种非线性规划问题。
希望本文能帮助您了解如何使用MATLAB中的fmincon
函数来处理非线性规划问题。如果您想深入了解该函数的更多高级功能和选项,请查阅MATLAB文档。
详情见: https://www.mathworks.com/help/optim/ug/fmincon.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。