主要内容

fmincon

求约束非线性多变量函数的最小值

描述

非线性规划求解器。

查找指定的问题的最小值

最小值 x f x 这样 { c x 0 c e x 0 一个 x b 一个 e x b e l b x u b

b而且说真的是向量,一个而且Aeq矩阵,cx),量表信x)是返回向量的函数,和fx)是一个返回标量的函数。fx),cx),量表信x)可以是非线性函数。

x,乌兰巴托可以作为向量或矩阵传递;看到矩阵的参数

例子

x= fmincon (有趣的x0一个b起价x0并试图找到一个最小化x中描述的函数的有趣的受制于线性不等式A*x≤bx0可以是标量、向量或矩阵。

请注意

传递额外参数解释如何在必要时将额外参数传递给目标函数和非线性约束函数。

例子

x= fmincon (有趣的x0一个bAeq说真的最小化有趣的服从线性等式Aeq*x = beq而且A*x≤b.如果不存在不等式,则设置A = []而且B = []

例子

x= fmincon (有趣的x0一个bAeq说真的乌兰巴托中定义设计变量的一组下界和上界x,使解总是在值域内x乌兰巴托.如果不存在等式,则设置Aeq = []而且Beq = [].如果x(我)下面是无界的吗lb(i) = -无穷大,如果x(我)上面是无界的吗ub(i) =无穷大

请注意

如果问题的指定输入边界不一致,fmincon抛出错误。在本例中,是输出xx0而且fval[]

对于默认“内点”算法,fmincon设置x0违反了边界Lb≤x≤ub,或等于一个定界,到定界区域的内部。为“trust-region-reflective”算法,fmincon将违规组件设置为绑定区域的内部。对于其他算法,fmincon将违例组件设置为最近的边界。尊重边界的组件不会被改变。看到迭代可能会违反约束

例子

x= fmincon (有趣的x0一个bAeq说真的乌兰巴托nonlcon使最小化服从非线性不等式c (x)或平等量表(x)中定义的nonlconfmincon优化如下C (x)≤0而且Ceq (x) = 0.如果不存在边界,请设置Lb = []和/或Ub = []

例子

x= fmincon (有趣的x0一个bAeq说真的乌兰巴托nonlcon选项中指定的优化选项使之最小化选项.使用optimoptions设置这些选项。如果没有非线性不等式或等式约束,则设置Nonlcon = []

例子

x= fmincon (问题求最小值问题中描述的结构问题

例子

xfval= fmincon(___,对于任何语法,返回目标函数的值有趣的在解决方案中x

例子

xfvalexitflag输出= fmincon(___另外返回一个值exitflag的退出条件fmincon,和结构输出有关优化过程的信息。

例子

xfvalexitflag输出λ研究生黑森= fmincon(___另外的回报:

  • λ-结构,在解处包含拉格朗日乘法器的字段x

  • 研究生-梯度有趣的在解决方案中x

  • 黑森-黑森有趣的在解决方案中x.看到fmincon黑森

例子

全部折叠

求存在线性不等式约束时Rosenbrock函数的最小值。

设定目标函数有趣的是Rosenbrock的职责众所周知,Rosenbrock的作用是难以最小化的。它在点(1,1)处的最小目标值为0。有关更多信息,请参见求解一个约束非线性问题,基于求解器

趣味= @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;

从该点开始求最小值[1,2],受限于 x 1 + 2 x 2 1 .在表单中表达这个约束Ax <= b通过A = [1,2]而且B = 1.注意,这个约束意味着解不会在无约束解(1,1)处,因为在那一点 x 1 + 2 x 2 3. > 1

X0 = [-1,2];A = [1,2];B = 1;x = fmincon(fun,x0,A,b)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。
x =1×20.5022 - 0.2489

求同时存在线性不等式约束和线性等式约束时Rosenbrock函数的最小值。

设定目标函数有趣的是Rosenbrock的职责

趣味= @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;

从该点开始求最小值(0.5, 0),受限于 x 1 + 2 x 2 1 而且 2 x 1 + x 2 1

  • 将线性不等式约束用式表示A*x <= b通过A = [1,2]而且B = 1

  • 将线性等式约束表示为Aeq*x = beq通过Aeq = [2,1]而且Beq = 1

X0 = [0.5,0];A = [1,2];B = 1;Aeq = [2,1];Beq = 1;x = fmincon(fun,x0,A,b,Aeq,beq)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。
x =1×20.4149 - 0.1701

求存在约束条件下目标函数的最小值。

目标函数是一个简单的二元代数函数。

有趣= @ (x) 1 + x (1) / (1 + x (2)) - 3 * x (1) * (2) + x (2) * (1 + x (1));

看看这个地区 x 有正的值, x 1 1 , x 2 2

Lb = [0,0];Ub = [1,2];

这个问题没有线性约束,所以把这些参数设为[]

A = [];B = [];Aeq = [];Beq = [];

试着在区域的中间找一个起始点。

X0 = (lb + ub)/2;

解决问题。

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。
x =1×21.0000 - 2.0000

不同的初始点会导致不同的解决方案。

X0 = X0 /5;x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。
x =1×2106× 0.4000 0.4000

要确定哪种解决方案更好,请参见获得目标函数值

求受非线性约束的函数的最小值

找到一个圆内Rosenbrock函数最小的点,同样受约束。

趣味= @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;

在区域内观察$0 \le x(1) \le 0.5$$0.2 \le x(2) \le 0.8$

Lb = [0,0.2];Ub = [0.5,0.8];

再看看圆心为[1/3,1/3],半径为1/3的圆。将以下代码复制到MATLAB®路径上名为circlecon.m

版权所有The MathWorks, Inc.函数测查[c] = circlecon c (x) = (x (1) 1/3) ^ 2 + (x (2) 1/3) ^ 2 - (1/3) ^ 2;Ceq = [];

这里没有线性约束,所以把这些参数设为[]

A = [];B = [];Aeq = [];Beq = [];

选择一个满足所有约束条件的初始点。

X0 = [1/4,1/4];

解决问题。

Nonlcon = @circlecon;x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。X = 0.5000 0.2500

设置选项,以便在迭代发生时查看迭代,并使用不同的算法。

观察fmincon解决过程中,设置显示选项“通路”.另外,试试“sqp”算法,有时比默认值更快或更准确“内点”算法。

选项= optimoptions(“fmincon”“显示”“通路”“算法”“sqp”);

求单位圆盘上Rosenbrock函数的最小值,$||x||^2 \le 1$.首先创建一个表示非线性约束的函数。保存为一个名为unitdisk.m在MATLAB®路径上。

函数[c,ceq] = unitdisk(x) c = x(1)^2 + x(2)^2 - 1;Ceq = [];

创建剩下的问题规范。然后运行fmincon

趣味= @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;A = [];B = [];Aeq = [];Beq = [];Lb = [];Ub = [];Nonlcon = @unitdisk;X0 = [0,0];x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
Iter Func-count Fval可行性步长规范一阶步长优化03 1.000000e+00 0.000e+00 1.000e+00 1.000e+00 0.000e+00 1.353e -01 1.107e+01 2 22 8.047847e-01 0.000e+00 8.235e-02 1.900e-01 1.330e+ 00 3 28 4.197517e-01 0.000e+00 3.430e-01 1.172e +00 4 31 2.733703e-01 0.000e+00 1.000e+00 5.254e-02 5.705e-01 5 34 2.397111e-01 0.000e+00 1.000e+00 5.498e -02 3.164e+00 6 37 2.036002e-01 0.000e+00 1.000e+00 5.960e-02 3.106e+00 7 401.164353e-01 0.000e+00 1.000e+00 1.459e-01 1.059e+00 1.754e-01 7.383e+00 1.383e - 00 9 46 4.533081e-02 0.000e+00 1.898e +00 1.5393e -02 1.278e -01 10 49 4.533081e-02 2.898e-03 1.000e+00 1.492e-03 1.679e-03 12 55 4.567481e-02 1.000e+00 2.095e-06 1.501e-05 13 58 4.567481e-02 0.000e+00 1.000e+00 2.212e-12 1.406e-05本地最小可能值。约束满足。Fmincon停止,因为当前步长的大小小于步长公差的值,并且约束被满足到约束公差的值之内。X = 0.7864 0.6177

在目标函数中包含梯度评估,以便更快或更可靠的计算。

将梯度计算作为条件化输出包含在目标函数文件中。详细信息请参见包括梯度和黑森.目标函数是Rosenbrock函数,

$ $ f (x) = 100{\离开({{x_2} - x_1 ^ 2} \右)^ 2}+ & # xA; {(1 - {x_1}) ^ 2}, $ $

它有梯度

$ $ \微分算符左f (x) = \[{\开始{数组}{* {20}{c}} & # xA;{- 400 \离开({{x_2} - x_1 ^ 2} \右){x_1} - 2 \离开({1 - {x_1}} \右)}\ \ & # xA; {200 \ ({{x_2} - x_1 ^ 2} \右)}& # xA;结束\{数组}}\右]。$ $

函数[f,g] = rosenbrockwithgrad(x)计算目标fF = 100*(x(2) -x(1)²)²+ (1-x(1))²;如果Nargout > 1所需梯度百分比G = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1));200 * (x (2) - x (1) ^ 2)];结束

将此代码保存为一个名为rosenbrockwithgrad.m在MATLAB®路径上。

创建使用目标函数梯度的选项。

选项= optimoptions(“fmincon”“SpecifyObjectiveGradient”,真正的);

为问题创建其他输入。然后调用fmincon

乐趣= @rosenbrockwithgrad;X0 = [-1,2];A = [];B = [];Aeq = [];Beq = [];Lb = [- 2,2];Ub = [2,2];Nonlcon = [];x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。X = 1.0000 1.0000

解决同样的问题默认的选项使用问题结构而不是单独的论点。

创建选项和问题结构。看到问题字段名和必填字段。

选项= optimoptions(“fmincon”“显示”“通路”“算法”“sqp”);问题。选项=选项;问题。解算器=“fmincon”;问题。目标= @ (x) 100 * (x (2) - x (1) ^ 2) ^ 2 + (1 - x (1)) ^ 2;问题。x0=[0,0];

非线性约束函数unitdisk出现在本例结束.中包含非线性约束函数问题

问题。nonlcon=@unitdisk;

解决问题。

X = fmincon(问题)
Iter Func-count Fval可行性步长规范一阶步长优化03 1.000000e+00 0.000e+00 1.000e+00 1.000e+00 0.000e+00 1.353e -01 1.107e+01 2 22 8.047847e-01 0.000e+00 8.235e-02 1.900e-01 1.330e+ 00 3 28 4.197517e-01 0.000e+00 3.430e-01 1.172e +00 4 31 2.733703e-01 0.000e+00 1.000e+00 5.254e-02 5.705e-01 5 34 2.397111e-01 0.000e+00 1.000e+00 5.498e -02 3.164e+00 6 37 2.036002e-01 0.000e+00 1.000e+00 5.960e-02 3.106e+00 7 401.164353e-01 0.000e+00 1.000e+00 1.459e-01 1.059e+00 1.754e-01 7.383e+00 1.383e - 00 9 46 4.533081e-02 0.000e+00 1.898e +00 1.5393e -02 1.278e -01 10 49 4.533081e-02 2.898e-03 1.000e+00 1.492e-03 1.679e-03 12 55 4.567481e-02 1.000e+00 2.095e-06 1.501e-05 13 58 4.567481e-02 0.000e+00 1.000e+00 2.212e-12 1.406e-05本地最小可能值。约束满足。Fmincon停止,因为当前步长的大小小于步长公差的值,并且约束被满足到约束公差的值之内。
x =1×20.7864 - 0.6177

迭代显示和解与中相同默认的选项

下面的代码创建unitdisk函数。

函数[c,ceq] = unitdisk(x) c = x(1)^2 + x(2)^2 - 1;Ceq = [];结束

调用fminconfval输出以获得目标函数在解处的值。

使用约束最小化示例显示了两种解决方案。金宝搏官方网站哪个更好?方法运行请求的示例fval输出以及解决方案。

有趣= @ (x) 1 + x (1) / (1 + x (2)) - 3 * x(1)。* x (2) + (2) * (1 + x (1));Lb = [0,0];Ub = [1,2];A = [];B = [];Aeq = [];Beq = [];X0 = (lb + ub)/2;[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。
x =1×21.0000 - 2.0000
Fval = -0.6667

使用不同的起点运行问题x0

X0 = X0 /5;[x2,fval2] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。
x2 =1×2106× 0.4000 0.4000
Fval2 = 1.0000

这个解有一个目标函数值fval2= 1,比第一个值高fval= -0.6667。第一个解决方案x具有较低的局部最小目标函数值。

要方便地检查溶液的质量,请使用exitflag而且输出输出。

在单位圆盘上建立最小化Rosenbrock函数的问题,$||x||^2 \le 1$.首先创建一个表示非线性约束的函数。保存为一个名为unitdisk.m在MATLAB®路径上。

函数[c,ceq] = unitdisk(x) c = x(1)^2 + x(2)^2 - 1;Ceq = [];

创建剩下的问题规范。

趣味= @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;Nonlcon = @unitdisk;A = [];B = [];Aeq = [];Beq = [];Lb = [];Ub = [];X0 = [0,0];

调用fmincon使用fvalexitflag,输出输出。

[x,fval,exitflag,output] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。x = 0.7864 0.6177 fval = 0.0457 exitflag = 1 output = struct with fields: iterations: 24 funcCount: 84 constrviolation: 0 stepsize: 6.9162e-06 algorithm: ' internal -point' firstorderopt: 2.4373e-08 cgiterations: 4 message: '…' bestviable: [1x1 struct]
  • exitflag价值1表示该解为局部最小值。

  • 输出结构报告关于解决方案过程的若干统计信息。特别地,它给出了迭代的次数output.iterations中函数求值的个数output.funcCount的可行性output.constrviolation

fmincon可选地返回几个输出,可用于分析报告的解决方案。

在单位圆盘上建立Rosenbrock函数的最小化问题。首先创建一个表示非线性约束的函数。保存为一个名为unitdisk.m在MATLAB®路径上。

函数[c,ceq] = unitdisk(x) c = x(1)^2 + x(2)^2 - 1;Ceq = [];

创建剩下的问题规范。

趣味= @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;Nonlcon = @unitdisk;A = [];B = [];Aeq = [];Beq = [];Lb = [];Ub = [];X0 = [0,0];

要求所有的fmincon输出。

[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。x = 0.7864 0.6177 fval = 0.0457 exitflag = 1 output = struct with fields: iterations: 24 funcCount: 84 constrviolation: 0 stepsize: 6.9162e-06 algorithm: ' internal -point' firstorderopt: 2.4373e-08 cgiterations: 4 message: '…' bestviable: [1x1 struct]λ=结构体与f我elds: eqlin: [0x1 double] eqnonlin: [0x1 double] ineqlin: [0x1 double] lower: [2x1 double] upper: [2x1 double] ineqnonlin: 0.1215 grad = -0.1911 -0.1501 hessian = 497.2903 -314.5589 -314.5589 200.2392
  • lambda.ineqnonlin输出表明非线性约束在解处是活跃的,并给出了相关的拉格朗日乘子的值。

  • 研究生输出给出了目标函数在解处的梯度值x

  • 黑森输出描述在fmincon黑森

输入参数

全部折叠

函数来最小化,指定为函数句柄或函数名。有趣的函数接受向量或数组吗x并返回一个实标量f的目标函数x

fmincon通过x你的目标函数和任何非线性约束函数的形状x0论点。例如,如果x0是一个5乘3的数组吗fmincon通过x有趣的作为一个5 × 3的数组。然而,fmincon乘以线性约束矩阵一个Aeqx转换后x对列向量x (:)

指定有趣的作为文件的函数句柄:

x = fmincon(@myfun,x0,A,b)

在哪里myfun是一个MATLAB®函数如

函数F = myfun(x) F =...计算x处的函数值

你也可以指定有趣的作为匿名函数的函数句柄:

x = fmincon(@(x)norm(x)^2,x0,A,b);

如果你能计算的梯度有趣的而且SpecifyObjectiveGradient选项设置为真正的,由

选项= optimoptions(“fmincon”“SpecifyObjectiveGradient”,真正的)
然后有趣的必须返回梯度向量g (x)在第二个输出参数中。

如果你也能计算黑森矩阵而且HessianFcn选项设置为“目标”通过optimoptions而且算法选择是“trust-region-reflective”有趣的必须返回黑森值H (x),一个对称矩阵,在第三个输出参数中。有趣的可以给稀疏黑森。看到Hessian for fminunc信任区域或fmincon信任区域反射算法获取详细信息。

如果你也能计算黑森矩阵和算法选项设置为“内点”,有一种不同的方式来传递黑森fmincon.有关更多信息,请参见Hessian for fmincon内点算法.有关使用符号数学工具箱™计算梯度和黑森的示例,请参见计算梯度和黑森使用符号数学工具箱™

内点而且trust-region-reflective算法允许你提供一个黑森乘法函数。这个函数给出了一个Hessian-乘向量乘积的结果,而不直接计算Hessian。这可以节省内存。看到黑森乘法函数

例子:趣味= @(x)sin(x(1))*cos(x(2))

数据类型:字符|function_handle|字符串

初始点,指定为实向量或实数组。求解器使用元素的数量和大小,x0确定变量的数量和大小即有趣的接受。

  • “内点”算法-如果HonorBounds选择是真正的(默认),fmincon重置x0在边界上或边界外的组件乌兰巴托到严格在边界之间的值。

  • “trust-region-reflective”算法,fmincon重置不可行x0分量对于边界或线性等式是可行的。

  • “sqp”“sqp-legacy”,或“激活集”算法,fmincon重置x0在相应边界值之外的组件。

例子:X0 = [1,2,3,4]

数据类型:

线性不等式约束,指定为实矩阵。一个是一个——- - - - - -N矩阵,不等式的数量,和N变量的数量(元素的数量x0).对于大问题,可以通过一个作为一个稀疏矩阵。

一个编码线性不等式

A*x <= b

在哪里x列向量是N变量x (:),b列向量是元素。

例如,考虑以下不等式:

x1+ 2x2≤10
3.x1+ 4x2≤20
5x1+ 6x2≤30日

通过输入以下约束来指定不等式。

A = [1,2;3,4;5,6];B = [10;20;30];

例子:要指定x分量的和为1或更小,请使用A = ones(1,N)而且B = 1

数据类型:

线性不等式约束,指定为实向量。b是一个元素的相关向量一个矩阵。如果你通过了b作为行向量,解算器内部转换b对列向量b (:).对于大问题,可以通过b作为一个稀疏向量。

b编码线性不等式

A*x <= b

在哪里x列向量是N变量x (:),一个矩阵的大小——- - - - - -N

例如,考虑以下不等式:

x1+ 2x2≤10
3.x1+ 4x2≤20
5x1+ 6x2≤30。

通过输入以下约束来指定不等式。

A = [1,2;3,4;5,6];B = [10;20;30];

例子:要指定x分量的和为1或更小,请使用A = ones(1,N)而且B = 1

数据类型:

线性等式约束,指定为实矩阵。Aeq是一个——- - - - - -N矩阵,等式的个数,和N变量的数量(元素的数量x0).对于大问题,可以通过Aeq作为一个稀疏矩阵。

Aeq编码线性等式

Aeq*x = beq

在哪里x列向量是N变量x (:),说真的列向量是元素。

例如,考虑以下不等式:

x1+ 2x2+ 3x3.= 10
2x1+ 4x2+x3.= 20,

通过输入以下约束来指定不等式。

Aeq = [1,2,3;2,4,1];Beq = [10;20];

例子:要指定x分量的和为1,使用Aeq = ones(1,N)而且Beq = 1

数据类型:

线性等式约束,指定为实向量。说真的是一个元素的相关向量Aeq矩阵。如果你通过了说真的作为行向量,解算器内部转换说真的对列向量说真的(:).对于大问题,可以通过说真的作为一个稀疏向量。

说真的编码线性等式

Aeq*x = beq

在哪里x列向量是N变量x (:),Aeq矩阵的大小——- - - - - -N

例如,考虑以下等式:

x1+ 2x2+ 3x3.= 10
2x1+ 4x2+x3.= 20。

通过输入以下约束来指定等式。

Aeq = [1,2,3;2,4,1];Beq = [10;20];

例子:要指定x分量的和为1,使用Aeq = ones(1,N)而且Beq = 1

数据类型:

下界,指定为实向量或实数组。如果元素的个数x0等于里面元素的个数,然后指定

X (i) >= lb(i)对所有

如果数值(lb) <数值(x0),然后指定

X (i) >= lb(i)1 <= I <= number (lb)

如果元素少于x0,解算器发出警告。

例子:要指定所有x分量都是正的,使用Lb = 0 (size(x0))

数据类型:

上界,指定为实向量或实数组。如果元素的个数x0等于里面元素的个数乌兰巴托,然后乌兰巴托指定

X (i) <= ub(i)对所有

如果Numel (ub) < Numel (x0),然后乌兰巴托指定

X (i) <= ub(i)1 <= I <= numel(ub)

如果乌兰巴托元素少于x0,解算器发出警告。

例子:要指定所有x分量都小于1,使用Ub = ones(size(x0))

数据类型:

非线性约束,指定为函数句柄或函数名。nonlcon函数接受向量或数组吗x并返回两个数组,c (x)而且量表(x)

  • c (x)非线性不等式的约束数组是在xfmincon试图满足

    C (x) <= 0对于所有c

  • 量表(x)非线性等式约束的数组是在xfmincon试图满足

    Ceq (x) = 0对于所有量表信

例如,

x = fmincon(@myfun,x0,A,b,Aeq,beq,lb,ub,@mycon)

在哪里mycon是一个MATLAB函数,如

函数[c,ceq] = mycon(x) c =…计算x上的非线性不等式ceq =…计算x处的非线性等式。
如果约束的梯度也可以计算而且SpecifyConstraintGradient选择是真正的,由
options = optimoptions('fmincon',' specyconstraintgradient ',true)
然后nonlcon还必须在第三和第四个输出参数中返回,GC,的梯度c (x),GCeq,的梯度量表(x)GC而且GCeq可以是稀疏的也可以是密集的。如果GCGCeq较大,具有相对较少的非零项,节省运行时间和内存在内点通过将它们表示为稀疏矩阵的算法。有关更多信息,请参见非线性约束

数据类型:字符|function_handle|字符串

的优化选项,指定为的输出optimoptions或者一个结构,比如optimset的回报。

一些选项适用于所有算法,而其他选项则与特定算法相关。看到优化选项参考有关详细信息。

中缺少一些选项optimoptions显示。这些选项在下表中以斜体字显示。详细信息请参见视图选项

所有的算法
算法

选择优化算法:

  • “内点”(默认)

  • “trust-region-reflective”

  • “sqp”

  • “sqp-legacy”optimoptions唯一的)

  • “激活集”

有关选择算法的信息,请参见算法选择

trust-region-reflective算法需要:

  • 目标函数中提供的梯度

  • SpecifyObjectiveGradient设置为真正的

  • 要么是约束约束,要么是线性等式约束,但不是两者都有

如果您选择“trust-region-reflective”算法和这些条件都不满足,fmincon抛出错误。

“激活集”“sqp-legacy”,“sqp”算法不是大规模的。看到大规模和中等规模算法

CheckGradients

比较用户提供的导数(目标或约束的梯度)与有限差分导数。的选择是(默认)或真正的

optimset,名字是DerivativeCheck这些值是“上”“关闭”.看到当前和遗留选项名称

ConstraintTolerance

约束违反的容差,一个正标量。默认为1 e-6.看到公差和停止标准

optimset,名字是TolCon.看到当前和遗留选项名称

诊断

显示有关要最小化或解决的功能的诊断信息。的选择是“关闭”(默认)或“上”

DiffMaxChange

有限差梯度(正标量)变量的最大变化。默认为

DiffMinChange

有限差分梯度(正标量)的最小变量变化。默认为0

显示

显示水平(见迭代显示):

  • “关闭”“没有”不显示输出。

  • “通路”显示每次迭代的输出,并给出默认的退出消息。

  • “iter-detailed”显示每次迭代的输出,并给出技术退出消息。

  • “通知”仅在函数不收敛时显示输出,并给出默认的退出消息。

  • “notify-detailed”仅在函数不收敛时显示输出,并给出技术退出消息。

  • “最后一次”(default)只显示最终输出,并给出默认的退出消息。

  • 最后详细的只显示最终输出,并给出技术退出消息。

FiniteDifferenceStepSize

有限差分的标量或矢量步长因子。当你设置FiniteDifferenceStepSize到一个向量v,正向有限差分δ

delta = v *符号' (x).*max(abs(x),TypicalX);

在哪里符号' (x) =符号(x)除了符号' (0)= 1.中心有限差分为

delta = v.*max(abs(x),TypicalX);

标量FiniteDifferenceStepSize展开成一个向量。默认为sqrt (eps)对于正向有限差分,和eps ^ (1/3)对于中心有限差分。

optimset,名字是FinDiffRelStep.看到当前和遗留选项名称

FiniteDifferenceType

有限差分,用来估计梯度,是“前进”(默认),或“中央”(中心)。“中央”需要两倍的函数计算,但应该更准确。信赖域反射算法使用FiniteDifferenceType只有当CheckGradients设置为真正的

fmincon在估计这两种类型的有限差分时,注意遵守边界。例如,它可以取一个后向差分,而不是前向差分,来避免在边界外求值。然而,对于内点算法,“中央”差异在计算过程中可能违反边界,如果HonorBounds选项设置为

optimset,名字是FinDiffType.看到当前和遗留选项名称

FunValCheck

检查目标函数值是否有效。默认设置,“关闭”,不执行检查。的“上”当目标函数返回值为时,设置将显示错误复杂的,或

MaxFunctionEvaluations

允许的最大函数求值数,一个正整数。所有算法的默认值,除了内点100 * numberOfVariables;为内点算法的默认值为3000.看到公差和停止标准而且迭代和功能计数

optimset,名字是MaxFunEvals.看到当前和遗留选项名称

MaxIterations

允许的最大迭代次数,一个正整数。所有算法的默认值,除了内点400;为内点算法的默认值为1000.看到公差和停止标准而且迭代和功能计数

optimset,名字是麦克斯特.看到当前和遗留选项名称

OptimalityTolerance

一阶最优性(正标量)上的终止容差。默认为1 e-6.看到一阶最优测度

optimset,名字是TolFun.看到当前和遗留选项名称

OutputFcn

指定优化函数在每次迭代时调用的一个或多个用户定义函数。传递一个函数句柄或函数句柄的单元格数组。默认值为none ([]).看到输出函数和图函数语法

PlotFcn

在算法执行时绘制各种进度度量;从预定义的情节中选择或编写自己的。传递内置绘图函数名、函数句柄或内置绘图函数名或函数句柄的单元格数组。对于自定义绘图函数,传递函数句柄。默认值为none ([]):

  • “optimplotx”绘制当前点

  • “optimplotfunccount”绘制函数计数图

  • “optimplotfval”绘制函数值

  • “optimplotfvalconstr”以折线图的形式绘制出最佳可行目标函数值。的可行性容差,该图将不可行点表示为红色,可行点表示为蓝色1 e-6

  • “optimplotconstrviolation”绘制最大违反约束的情况

  • “optimplotstepsize”绘制步长

  • “optimplotfirstorderopt”绘制一阶最优测度

自定义绘图函数使用与输出函数相同的语法。看到优化工具箱的输出函数而且输出函数和图函数语法

optimset,名字是PlotFcns.看到当前和遗留选项名称

SpecifyConstraintGradient

用户定义的非线性约束函数的梯度。当设置为默认值时,fmincon利用有限差分估计非线性约束的梯度。当设置为真正的fmincon期望约束函数具有四个输出,如中所述nonlcon.的trust-region-reflective算法不接受非线性约束。

optimset,名字是GradConstr这些值是“上”“关闭”.看到当前和遗留选项名称

SpecifyObjectiveGradient

由用户定义的目标函数的梯度。参见有趣的来看看如何定义渐变有趣的.默认的,,使fmincon用有限差分估计梯度。设置为真正的fmincon使用用户定义的目标函数梯度。使用“trust-region-reflective”算法中,必须提供梯度,并设置SpecifyObjectiveGradient真正的

optimset,名字是GradObj这些值是“上”“关闭”.看到当前和遗留选项名称

StepTolerance

终止公差x,为正标量。所有算法的默认值,除了“内点”1 e-6;为“内点”算法,默认为1平台以及.看到公差和停止标准

optimset,名字是TolX.看到当前和遗留选项名称

TypicalX

典型的x值。元素的数量TypicalX等于里面元素的个数x0这是起点。默认值为的(numberofvariables, 1)fmincon使用TypicalX缩放有限差分进行梯度估计。

“trust-region-reflective”算法使用TypicalX只适用于CheckGradients选择。

UseParallel

真正的fmincon并行估计梯度。通过设置为默认值禁用,trust-region-reflective需要一个渐变的目标,所以UseParallel不适用。看到并行计算

Trust-Region-Reflective算法
FunctionTolerance

函数值上的终止公差为正标量。默认为1 e-6.看到公差和停止标准

optimset,名字是TolFun.看到当前和遗留选项名称

HessianFcn

如果[](默认),fmincon使用有限差分近似海森,或使用海森乘法函数(有选项)HessianMultiplyFcn).如果“目标”fmincon使用用户定义的黑森(定义在有趣的).看到黑森作为输入

optimset,名字是HessFcn.看到当前和遗留选项名称

HessianMultiplyFcn

黑森乘法函数,指定为函数句柄。对于大规模的结构化问题,这个函数计算黑森矩阵乘积H * Y没有形成H.函数的形式

W = hmfun(Hinfo,Y)

在哪里Hinfo包含用于计算的矩阵H * Y

第一个参数与目标函数返回的第三个参数相同有趣的例如,

[f,g,Hinfo] = fun(x)

Y是一个矩阵,它的行数与问题中的维数相同。矩阵W = h * y,虽然H没有显式地形成。fmincon使用Hinfo计算预条件。有关如何为任何附加参数提供值的信息hmfun需要,请参阅传递额外参数

请注意

使用HessianMultiplyFcn选项,HessianFcn必须设置为[],SubproblemAlgorithm必须“重心”(默认)。

看到黑森乘法函数.看到密结构黑森最小化,线性等式举个例子。

optimset,名字是HessMult.看到当前和遗留选项名称

HessPattern

有限差分Hessian的稀疏模式。集hespattern (i,j) = 1当你有∂2有趣的/∂x(我)x (j)≠0。否则,设置hespattern (i,j) = 0

使用HessPattern当计算黑森矩阵不方便时H有趣的,但你可以确定(例如,通过检查)当的梯度的第Th分量有趣的取决于x (j)fmincon可以近似H通过稀疏有限差分(梯度)如果你提供稀疏结构H作为的值HessPattern.换句话说,提供非零的位置。

当结构未知时,不要设置HessPattern.默认行为是ifHessPattern是1的密集矩阵。然后fmincon在每次迭代中计算一个完整的有限差分近似。对于大型问题,这种计算可能非常昂贵,因此通常更好的方法是确定稀疏性结构。

MaxPCGIter

预条件共轭梯度(PCG)迭代的最大次数,一个正标量。默认为马克斯(1楼(numberOfVariables / 2))对于绑定-约束问题,和numberOfVariables对于等式约束问题。有关更多信息,请参见预条件共轭梯度法

PrecondBandWidth

PCG预调节器的上带宽,非负整数。缺省情况下,使用对角预处理(上带宽为0)。对于某些问题,增加带宽可以减少PCG迭代次数。设置PrecondBandWidth使用直接因式分解(Cholesky)而不是共轭梯度(CG)。直接因式分解在计算上比CG更昂贵,但产生了更好的解决方案。

SubproblemAlgorithm

确定如何计算迭代步骤。默认的,“重心”,采取了更快但更不准确的步骤“分解”.看到fmincon信任域反射算法

TolPCG

PCG迭代上的终止公差为正标量。默认为0.1

有效集算法
FunctionTolerance

函数值上的终止公差为正标量。默认为1 e-6.看到公差和停止标准

optimset,名字是TolFun.看到当前和遗留选项名称

MaxSQPIter

允许的最大SQP迭代数,一个正整数。默认为10*max(numberOfVariables, numberOfInequalities + numberOfBounds)

RelLineSrchBnd

直线搜索步长上的相对界(一个实非负标量值)。总位移x满足x|≤relLineSrchBnd·max(| .x) | |typicalx) |).这个选项提供了对位移大小的控制x对于求解器采取的步骤被认为太大的情况。默认为无边界([]).

RelLineSrchBndDuration

中指定的边界的迭代次数RelLineSrchBnd应该是活动的(默认是1).

TolConSQP

内部迭代SQP约束违反的终止容差,一个正标量。默认为1 e-6

内点算法
BarrierParamUpdate

指定如何fmincon更新屏障参数(参见fmincon内点算法).选项是:

  • “单调”(默认)

  • 预估的

这个选项会影响解算器的速度和收敛性,但效果不容易预测。

EnableFeasibilityMode

真正的fmincon使用不同的算法来实现可行性。这个设置可以有所帮助fmincon在某些情况下找到可行的解决方案。默认值为

可行性模式通常在SubproblemAlgorithm“重心”.详细信息请参见可行性模式.有关示例,请参见采用可行性模式获取解决方案

HessianApproximation

指定如何fmincon计算黑森(见黑森作为输入).选项是:

  • “蓄热”(默认)

  • 有限差分的

  • “lbfgs”

  • {“lbfgs”,正整数}

请注意

使用HessianApproximation,两个HessianFcn而且HessianMultiplyFcn必须为空条目([]).

optimset,名字是黑森这些值是用户提供的“蓄热”“lbfgs”“fin-diff-grads”“上”,或“关闭”.看到当前和遗留选项名称

HessianFcn

如果[](默认),fmincon中指定的方法近似于黑森HessianApproximation,或使用一个供应的HessianMultiplyFcn.如果一个函数句柄,fmincon使用HessianFcn来计算黑森。看到黑森作为输入

optimset,名字是HessFcn.看到当前和遗留选项名称

HessianMultiplyFcn

用户提供的函数,给出一个黑森-时间向量积(见黑森乘法函数).传递一个函数句柄。

请注意

使用HessianMultiplyFcn选项,HessianFcn必须设置为[],SubproblemAlgorithm必须“重心”

optimset,名字是HessMult.看到当前和遗留选项名称

HonorBounds

默认的真正的确保在每次迭代中都满足绑定的约束。通过设置为禁用

optimset,名字是AlwaysHonorConstraints这些值是“界限”“没有”.看到当前和遗留选项名称

InitBarrierParam

初始势垒值为正标量。有时,尝试一个高于默认值的值可能会有所帮助0.1,特别是当目标函数或约束函数很大时。

InitTrustRegionRadius

信任区域的初始半径,一个正的标量。对于规模不好的问题,选择一个比默认值更小的值可能会有所帮助 n ,在那里n是变量的数量。

MaxProjCGIter

投影共轭梯度迭代次数的公差(停止准则);这是一个内部迭代,而不是算法的迭代次数。此正整数的默认值为2*(numberOfVariables - numberofetraits)

ObjectiveLimit

一个标量的公差(停止标准)。如果目标函数值低于ObjectiveLimit迭代是可行的,迭代停止,因为这个问题假设是无界的。默认值为1 e20

ScaleProblem

真正的使算法归一化所有约束和目标函数。通过设置为默认值禁用

optimset,值为“obj-and-constr”“没有”.看到当前和遗留选项名称

SubproblemAlgorithm

确定如何计算迭代步骤。默认的,“分解”,通常比“重心”(共轭梯度)“重心”可能会更快地解决高密度黑森的大问题。看到fmincon内点算法

TolProjCG

投影共轭梯度算法的相对容差(停止判据)这是针对内部迭代,而不是算法迭代。这个正标量的默认值是0.01

TolProjCGAbs

投影共轭梯度算法的绝对容差(停止判据)这是针对内部迭代,而不是算法迭代。这个正标量的默认值是1平台以及

SQP和SQP遗留算法
ObjectiveLimit

一个标量的公差(停止标准)。如果目标函数值低于ObjectiveLimit迭代是可行的,迭代停止,因为这个问题假设是无界的。默认值为1 e20

ScaleProblem

真正的使算法归一化所有约束和目标函数。通过设置为默认值禁用

optimset,值为“obj-and-constr”“没有”.看到当前和遗留选项名称

例子:options = optimoptions('fmincon',' specyobjectivegradient ',true,' specyconstraintgradient ',true)

问题结构,指定为具有以下字段的结构:

字段名 条目

客观的

目标函数

x0

起始点x

Aineq

线性不等式约束的矩阵

bineq

线性不等式约束的向量

Aeq

矩阵的线性等式约束

说真的

线性等式约束的向量
下界向量
乌兰巴托 上界向量

nonlcon

非线性约束函数

解算器

“fmincon”

选项

创建的选项optimoptions

你必须提供至少客观的x0解算器,选项字段问题结构。

数据类型:结构体

输出参数

全部折叠

解,作为实向量或实数组返回。的大小x和的尺寸一样吗x0.通常情况下,x什么时候局部解决问题exitflag是正的。有关解决方案质量的信息,请参见当求解器成功时

目标函数在解处的值,作为实数返回。一般来说,fval有趣的(x)

原因fmincon停止,以整数形式返回。

所有的算法:

1

一阶最优测度小于选项。OptimalityTolerance,最大约束违反小于选项。ConstraintTolerance

0

超过迭代次数选项。麦克斯特ations或者超出了函数求值的数量选项。米axFunctionEvaluations

-1

被输出函数或绘图函数停止。

-2

没有找到可行点。

除了所有算法有效集

2

的变化x小于选项。StepTolerance最大约束违反小于选项。ConstraintTolerance

trust-region-reflective算法只:

3.

目标函数值的变化小于选项。FunctionTolerance最大约束违反小于选项。ConstraintTolerance

有效集算法只:

4

搜索方向的幅度小于2*选项。StepTolerance最大约束违反小于选项。ConstraintTolerance

5

搜索方向方向导数的大小小于2*选项。OptimalityTolerance最大约束违反小于选项。ConstraintTolerance

内点sqp-legacy,sqp算法:

3

当前迭代的目标函数如下选项。ObjectiveLimit最大约束违反小于选项。ConstraintTolerance

关于优化过程的信息,作为一个带字段的结构返回:

迭代

迭代次数

funcCount

函数求值的数量

lssteplength

直线搜索步长相对于搜索方向的大小(有效集而且sqp算法只)

constrviolation

约束函数的最大值

stepsize

最后位移长度x(不是有效集算法)

算法

所使用的优化算法

cgiterations

PCG的总迭代次数(trust-region-reflective而且内点算法)

firstorderopt

一阶最优性的度量

bestfeasible

遇到的最佳(最低目标函数)可行点。一个包含这些字段的结构:

  • x

  • fval

  • firstorderopt

  • constrviolation

如果找不到可行点,则采用bestfeasible字段为空。为此,当约束函数的最大值不超过时,一个点是可行的选项。ConstraintTolerance

bestfeasible点可以与返回的解点不同x有很多原因。有关示例,请参见获得最佳可行点

消息

退出消息

解处的拉格朗日乘子,返回为带字段的结构:

较低的

对应的下界

对应的上界乌兰巴托

ineqlin

线性不等式对应于一个而且b

eqlin

线性等式对应于Aeq而且说真的

ineqnonlin

对应的非线性不等式cnonlcon

eqnonlin

对应于量表信nonlcon

解处的梯度,作为实向量返回。研究生给出的梯度有趣的在这一点上x (:)

近似黑森矩阵,返回实矩阵。因为黑森,请参阅黑森输出

限制

  • fmincon是一种基于梯度的方法,设计用于解决目标函数和约束函数都是连续的并且具有连续一阶导数的问题。

  • “trust-region-reflective”算法中,必须提供梯度有趣的并设置“SpecifyObjectiveGradient”选项真正的

  • “trust-region-reflective”算法不允许上下界相等。例如,如果磅(2)= =乌兰巴托(2)fmincon给出这个错误:

    信任区域反射算法不允许上下界相等。可以使用内点算法或SQP算法。
  • 传递黑森语有两种不同的语法,传递a也有两种不同的语法HessianMultiplyFcn函数;一个用于trust-region-reflective,另一个是内点.看到包括麻布

    • trust-region-reflective,拉格朗日函数的黑森函数与目标函数的黑森函数是相同的。你把这个黑森函数作为目标函数的第三个输出。

    • 内点,拉格朗日函数的黑森函数涉及非线性约束函数的拉格朗日乘子和黑森函数。你传递黑森作为一个单独的函数,考虑到当前点x以及拉格朗日乘子结构λ

  • 当问题不可行时,fmincon试图最小化最大约束值。

更多关于

全部折叠

黑森作为输入

fmincon使用黑森作为可选的输入。这个黑森矩阵是拉格朗日矩阵的二阶导数矩阵(见方程1),即

x x 2 l x λ 2 f x + λ 2 c x + λ 2 c e x (1)

有关如何提供黑森的细节trust-region-reflective内点算法,看到包括麻布

有效集而且sqp算法不接受输入黑森。他们计算了拉格朗日黑森量的准牛顿近似。

内点算法有几个选择“HessianApproximation”选择;看到选择输入黑森近似内点fmincon

  • “蓄热”- - - - - -fmincon用密集准牛顿近似计算黑森。这是默认的黑森近似。

  • “lbfgs”- - - - - -fmincon通过有限内存,大规模准牛顿近似计算黑森。使用默认内存,即10次迭代。

  • {“lbfgs”,正整数}- - - - - -fmincon通过有限内存,大规模准牛顿近似计算黑森。正整数指定应该记住多少个过去的迭代。

  • 有限差分的- - - - - -fmincon通过梯度(s)的有限差分计算hessian -乘向量积。你必须提供目标函数的梯度,以及非线性约束的梯度(如果它们存在的话)。设置“SpecifyObjectiveGradient”选项真正的以及,如果适用的话“SpecifyConstraintGradient”选项真正的.您必须设置“SubproblemAlgorithm”“重心”

黑森乘法函数

内点而且trust-region-reflective算法允许你提供一个黑森乘法函数。这个函数给出了一个Hessian-乘以向量乘积的结果,而不直接计算Hessian。这可以节省内存。详细信息请参见黑森乘法函数

算法

全部折叠

算法选择

有关选择算法的帮助,请参见fmincon算法.若要设置算法,请使用optimoptions创建选项,并使用“算法”名称-值对。

本节的其余部分给出了关于每种算法的简要摘要或指示。

内点优化

该算法在fmincon内点算法.中有更广泛的描述[1][41],[9]

SQP和SQP-遗留优化

fmincon“sqp”而且“sqp-legacy”算法类似于“激活集”算法描述于激活集优化fmincon SQP算法描述主要的区别。总的来说,这些差异是:

激活集优化

fmincon使用一个序列二次规划(SQP)方法。在这种方法中,函数求解一个二次规划(QP)子问题。fmincon在每次迭代中使用BFGS公式更新拉格朗日的黑森估计(见fminunc和引用[7]而且[8]).

fmincon使用类似于由所提出的优点函数执行直线搜索[6][7],[8].QP子问题是用一种活动集策略来解决的[5]fmincon活动集算法详细描述了该算法。

另请参阅SQP实现有关所使用的算法的详细信息。

Trust-Region-Reflective优化

“trust-region-reflective”算法是一种子空间信赖域方法,基于中所述的内反射牛顿方法[3]而且[4].每次迭代都涉及使用预处理共轭梯度(PCG)方法求解大型线性系统的近似解。参见中可信域和预处理共轭梯度方法的描述fmincon信任域反射算法

选择功能

应用程序

优化活动编辑器任务提供了一个可视化界面fmincon

参考文献

伯德,R. H., J. C.吉尔伯特,J.诺西德尔。非线性规划中基于内点技术的信赖域方法。数学规划,第89卷第1期,2000年,第149-185页。

[2]伯德,R. H.,玛丽E.赫里巴尔,豪尔赫·诺西德尔。大规模非线性规划的内点算法SIAM优化期刊, 1999年第9卷第4期,第877-900页。

[3] Coleman, t.f., Li Y.。有边界的非线性极小化的内部信赖域方法。SIAM优化期刊, Vol. 6, 1996, pp. 418-445。

[4] Coleman, t.f., Li Y.。大尺度非线性有界极小化问题的反射牛顿方法的收敛性数学规划,第67卷第2期,1994年,第189-224页。

[5]吉尔,p.e., W.默里和M. H.赖特。实用的优化伦敦,学术出版社,1981年。

[6] Han s.p.,“非线性规划的一种全局收敛方法”。优化理论与应用杂志,卷22,1977,第297页。

[7] Powell m.j. D. <非线性约束优化计算的快速算法>。数值分析, ed. G. A. Watson,数学课堂讲稿,施普林格出版社,1978年,第630卷。

[8] Powell, m.j. D. <非线性约束优化计算的变度量方法的收敛性>。非线性规划3(O. L.曼加萨里安、R. R.迈耶和S. M.罗宾逊主编),学术出版社,1978年。

华尔兹,R. A., J. L.莫拉莱斯,J.诺西德尔和D.欧尔班。一种结合了直线搜索和信赖域步骤的非线性优化内部算法。数学规划, 2006年第3期,第391-408页。

扩展功能

R2006a之前介绍