当前位置:   article > 正文

MATLAB非线性规划入门fmincon函数及传额外传参数

fmincon


导读:在工程、科学和金融等领域,非线性规划(Nonlinear Programming,简称NLP)是一个常见而重要的问题。MATLAB提供了强大的非线性规划求解工具,其中最常用的函数之一是fmincon。本文将介绍fmincon函数的基本用法以及如何在MATLAB中使用它来解决非线性规划问题。


一、标准型

1. 非线性规划标准型

2. MATLAB中的fmincon函数

fmincon是MATLAB中用于求解非线性规划问题的函数。它的基本语法如下:

[x, fval, exitflag, output] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon)
  • 1
  • fun:表示要最小化的目标函数。
  • x0:表示初始解的猜测。
  • Ab:表示不等式约束。
  • Aeqbeq:表示等式约束。
  • lbub:表示变量的下界和上界。
  • 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\{

funf(x)lb,ublbxubA,bAxb线Aeq,beqAeqx=beq线nonlconc(x)0,ceq(x)=0线,线x0xoptions
\right. funlb,ubA,bAeq,beqnonlconx0xoptionsf(x)lbxubAxbAeqx=beqc(x)0,ceq(x)=0初始最优解猜测值返回最优解求解器参数设置目标函数上下界约束线性不等式约束线性等式约束非线性等式约束,非线性不等式约束

二、算例

      算例:
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

minxf(x)=x12+x22[23][x1x2][23][67][3112][x1x2][57]x12+2x1x25x1=x22
xminf(x)=x12+x22[23][x1x2][23][67][3112][x1x2][57]x12+2x1x25x1=x22

1、完整MATLAB代码

%初始猜测值
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

2、目标函数

a) 目标函数(不带梯度)

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

b) 目标函数(带梯度)

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

fmincon优化目标函数,梯度可带可不带,但是在(1)(2)情况下,最好带上:
( 1 ) 梯度容易求出 ( 2 ) 加快优化速度 (1)梯度容易求出(2)加快优化速度 (1)梯度容易求出(2)加快优化速度

3、上下界约束

[ − 2 − 3 ] ≤ [ x 1 x 2 ] ≤ [ 2 3 ] \left[ {

23
} \right] \le \left[ {
x1x2
} \right] \le \left[ {
23
} \right] [23][x1x2][23]
可知
l b = [ − 2 − 3 ] , u b = [ 2 3 ] lb = \left[ {
23
} \right],ub =\left[ {
23
} \right]
lb=[23],ub=[23]

lb = [-2;-3];
ub = [2;3]
  • 1
  • 2

4、线性约束

A ⋅ x ≤ b [ − 6 − 7 ] ≤ [ 3 1 1 2 ] [ x 1 x 2 ] ≤ [ 5 7 ] A e q ⋅ x ≤ b e q 无

\begin{array}{ll}A\cdot x\le b &\left[\begin{array}{c}-6\\-7\end{array}
\right]\leq\left[
3112
\right]\left[
x1x2
\right]\leq\left[
57
\right]\\ Aeq \cdot x\le beq &无\end{array} AxbAeqxbeq[67][3112][x1x2][57]
可知
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=[3112],b1=[57]A2=[3112],b2=[67]Aeq=[],beq=[]
A1=[3112],b1=[57]A2=[3112],b2=[67]Aeq=[],beq=[]

A1 = [3 1;
      1 2];
A2 = -[3 1;
      1 2];
b1 = [5;7];
b2 = -[-6; -7];
A = [A1;A2]
b = [b1;b2];
Aeq = [];
beq = [];
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

5、非线性约束

c ( x ) ≤ 0 x 1 2 + 2 x 1 x 2 ≤ 5 c e q ( x ) = 0 x 1 = x 2 2

c(x)0x12+2x1x25ceq(x)=0x1=x22
c(x)0ceq(x)=0x12+2x1x25x1=x22
改写
x 1 2 + 2 x 1 x 2 − 5 ≤ 0 x 1 − x 2 2 = 0
x12+2x1x250x1x22=0
x12+2x1x250x1x22=0

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

三、目标函数与非线性约束 传参

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

1. 仅目标函数–传参

f = p 1 x 1 2 + p 2 x 2 2 x 1 2 + 2 x 1 x 2 ≤ 5

f=p1x12+p2x22x12+2x1x25
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)];
end

function [c,ceq] = nonlcon(x,p1,p2)
c = x(1)^2+2*x(1)*x(2)-5;
ceq = [];
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

2.目标函数与非线性约束–传参

f = p 1 x 1 2 + p 2 x 2 2 c 1 x 1 2 + c 2 x 1 x 2 ≤ 5

f=p1x12+p2x22c1x12+c2x1x25
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)];
end

function [c,ceq] = nonlcon(x,c1,c2)
c = c1*x(1)^2+c2*x(1)*x(2)-5;
ceq = [];
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

对于fmincon没有的项一定要用[]占位
options表示优化器的配置选项,如上例:

options = optimoptions('fmincon','Display','iter','Algorithm','sqp')
  • 1
变量作用
fmincon优化求解函数
Display iter:显示迭代过程
Algorithm sqp:求解算法 SQP
… \dots 当前行未完,连接下一行

四. 结论

在MATLAB中,fmincon函数是一个强大的工具,用于求解非线性规划问题。通过定义目标函数和约束条件,您可以使用这个函数来寻找最优解。在实际应用中,问题的复杂性可能会增加,但fmincon仍然是一个有力的工具,可用于解决各种非线性规划问题。

希望本文能帮助您了解如何使用MATLAB中的fmincon函数来处理非线性规划问题。如果您想深入了解该函数的更多高级功能和选项,请查阅MATLAB文档。
详情见: https://www.mathworks.com/help/optim/ug/fmincon.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/350626
推荐阅读
相关标签
  

闽ICP备14008679号