主要内容

粉刺

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

描述

非线性规划求解器进行求解。

查找最低问题所指定的问题

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, 和UB.可以作为向量或矩阵传递;看到矩阵论据

例子

x= fmincon (乐趣x0一个b起价x0并试图找到最小值x中所描述的函数乐趣服从线性不等式* x≤bx0可以是标量、向量或矩阵。

请注意

传递额外的参数说明如何在必要时向目标函数和非线性约束函数传递额外参数。

例子

x= fmincon (乐趣x0一个bAeq说真的最小化乐趣服从线性等式Aeq * x =说真的* x≤b.如果不存在不等式,集合a = []b = []

例子

x= fmincon (乐趣x0一个bAeq说真的UB.中的设计变量定义一组上下限x,所以解总是在这个范围内xUB..如果不存在等式,则设置Aeq = []说真的= [].如果x(我)下面是无界的吗磅(i) =负无穷, 而如果x(我)上面是无界的,集合乌兰巴托(i) =正无穷

请注意

如果问题的指定输入界限不一致,粉刺抛出一个错误。在这种情况下,输出xx0fval[]

为默认“内点”算法,粉刺集的组成部分x0这就违反了界限Lb≤x≤ub,或等于一个界限,到界限区域的内部。为“trust-region-reflective”算法,粉刺将违反组件设置到绑定区域内部。为其他算法,粉刺将违反组件设置为最近的绑定。遵守边界的组件不会改变。看到迭代会违反约束

例子

x= fmincon (乐趣x0一个bAeq说真的UB.nonlcon将最小化为非线性不等式C(x)或平等量表(x)定义nonlcon粉刺优化,c (x)≤0量表(x) = 0.如果不存在边界,则设置磅= []和/或乌兰巴托= []

例子

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

例子

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

例子

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

例子

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

例子

xfvalexitflag输出lambda.研究生黑森西) = fmincon (___另外的回报:

  • lambda.- 具有在解决方案中包含拉格朗日乘数的字段的结构x

  • 研究生——梯度乐趣在解决方案x

  • 黑森西——黑森乐趣在解决方案x.看到fmincon黑森

例子

全部折叠

求有线性不等式约束时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通过一个= [1,2]b = 1.注意这个约束意味着解不在无约束解(1,1)处,因为在那一点 x 1 + 2 x 2 3. > 1

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

求既有线性不等式约束又有线性等式约束的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 < =通过一个= [1,2]b = 1

  • 用形式表示线性等式约束Aeq * x =说真的通过Aeq = (2, 1)说真的= 1

x0 = (0.5, 0);一个= [1,2];b = 1;Aeq = (2, 1);说真的= 1;x = fmincon(有趣,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

磅= (0,0);乌兰巴托= [1,2];

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

一个= [];b = [];Aeq = [];说真的= [];

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

X0 = (lb + ub)/2;

解决这个问题。

x = fmincon (Aeq有趣,x0, A, b,说真的,磅,乌兰巴托)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。
X =1×21.0000 - 2.0000

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

x0 = x0/5;x = fmincon (Aeq有趣,x0, A, b,说真的,磅,乌兰巴托)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。
X =1×210.-6×0.4000 - 0.4000

确定哪种解决方案更好,看到获得目标函数值

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

找出罗森布罗克函数在一个圆内最小的点,也受约束。

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

看看区域内部$0 \ lex (1) \ le0.5 $$0.2 \le x(2) \le 0.8$

磅= [0,0.2];乌兰巴托= [0.5,0.8];

也可以在半径为1/3的圆心[1/3,1/3]内观察。复制以下代码到你的MATLAB®路径上的一个文件circlecon.m

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

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

一个= [];b = [];Aeq = [];说真的= [];

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

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

解决这个问题。

nonlcon = @circlecon;x = fmincon (Aeq有趣,x0, A, b,说真的,磅,乌兰巴托,nonlcon)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。X = 0.5000 0.2500

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

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

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

求罗森布罗克函数在单位圆盘上的最小值,x $ | | | | ^ 2 \勒1美元.首先创建一个表示非线性约束的函数。将其保存为一个名为unitdisk.m在您的Matlab®路径上。

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

创建剩余的问题规范。然后运行粉刺

@(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;一个= [];b = [];Aeq = [];说真的= [];磅= [];乌兰巴托= [];nonlcon = @unitdisk;x0 = (0,0);x = fmincon (Aeq有趣,x0, A, b,说真的,磅,乌兰巴托,nonlcon,选项)
ITER Func-Count FVAL可行性步长规范一阶步骤最优值0 3 1.000000E + 00 0.000E + 00 1.000E + 00 0.000E + 00 2.000E + 00 1112 8.913011E-01 0.000E + 00 1.176E-01 2.353E-01 1.107E + 01 2 22 8.047847E-01 0.000E + 00 8.235E-02 1.900E-01 1.330E + 01 3 28 4.197517E-01 0.000E + 00 3.430E-01 1.217E-01 6.172E + 00 4 31 2.733703E-01 0.000E + 00 1.000E + 00 5.254E-02 5.705E-01 5 34 2.397111C-01 0.000E + 00 1.000E + 00 7.498E-02 3.164E + 00 6 37 2.036002E-01 0.000E + 00 1.000E + 00 5.960E-02 3.106E + 00 7 40 1.164353E-01 0.000E + 00 1.000E + 00 1.459E-01 1.059E + 00 8 43 1.161753E-01 0.000E +001。000e+001。754e-01 7.383e+00 9 46 5.901601e-02 0.000e+00 1.000e+00 1.547e-02 7.278e-01 10 49 4.533081e-02 2.898e-03 1.000e+00 5.393e-02 1.252e-01 11 52 4.567454e-02 2.225e-06 1.000e+00 1.492e-03 1.679e-03 12 55 4.567481e-02 4.406e-12 1.000e+00 2.095e-06 1.501e-05 13 58 4.567481e-02 0.000e+00 1.000e+00 2.159e-09 1.511e-05 Local minimum possible. Constraints satisfied. fmincon stopped because the size of the current step is less than the value of the step size tolerance and constraints are satisfied to within the value of the constraint tolerance. x = 0.7864 0.6177

包括目标函数中的梯度评估,以实现更快或更可靠的计算。

将梯度求值作为条件化输出包含在目标函数文件中。有关详细信息,请参见包括梯度和Hessians.目标函数是罗森布罗克函数,

$ $ 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) ^2)^2 + (1-x(1))^2如果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”,真正的);

创建问题的其他输入。然后调用粉刺

有趣= @rosenbrockwithgrad;x0 = [1, 2];一个= [];b = [];Aeq = [];说真的= [];磅= (2,2);乌兰巴托= (2,2);nonlcon = [];x = fmincon (Aeq有趣,x0, A, b,说真的,磅,乌兰巴托,nonlcon,选项)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。X = 1.0000

解决相同的问题默认的选项使用问题结构而不是单独的参数。

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

选择= optimoptions (“fmincon”“显示”“通路”“算法”“sqp”);问题.Options =选项;问题.Solver =.“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可行性步长规范一阶步骤最优值0 3 1.000000E + 00 0.000E + 00 1.000E + 00 0.000E + 00 2.000E + 00 1112 8.913011E-01 0.000E + 00 1.176E-01 2.353E-01 1.107E + 01 2 22 8.047847E-01 0.000E + 00 8.235E-02 1.900E-01 1.330E + 01 3 28 4.197517E-01 0.000E + 00 3.430E-01 1.217E-01 6.172E + 00 4 31 2.733703E-01 0.000E + 00 1.000E + 00 5.254E-02 5.705E-01 5 34 2.397111C-01 0.000E + 00 1.000E + 00 7.498E-02 3.164E + 00 6 37 2.036002E-01 0.000E + 00 1.000E + 00 5.960E-02 3.106E + 00 7 40 1.164353E-01 0.000E + 00 1.000E + 00 1.459E-01 1.059E + 00 8 43 1.161753E-01 0.000E +001。000e+001。754e-01 7.383e+00 9 46 5.901601e-02 0.000e+00 1.000e+00 1.547e-02 7.278e-01 10 49 4.533081e-02 2.898e-03 1.000e+00 5.393e-02 1.252e-01 11 52 4.567454e-02 2.225e-06 1.000e+00 1.492e-03 1.679e-03 12 55 4.567481e-02 4.406e-12 1.000e+00 2.095e-06 1.501e-05 13 58 4.567481e-02 0.000e+00 1.000e+00 2.159e-09 1.511e-05 Local minimum possible. Constraints satisfied. fmincon stopped because the size of the current step is less than the value of the step size tolerance and constraints are satisfied to within the value of the constraint tolerance.
X =1×20.7864 - 0.6177

迭代的显示和求解方法与默认的选项

下面的代码创建unitdisk函数。

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

称呼粉刺与之fval输出,以获得目标函数在解处的值。

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

有趣= @ (x) 1 + x (1) / (1 + x (2)) - 3 * x(1)。* x (2) + (2) * (1 + x (1));磅= (0,0);乌兰巴托= [1,2];一个= [];b = [];Aeq = [];说真的= [];X0 = (lb + ub)/2;[x, fval] = fmincon (Aeq有趣,x0, A, b,说真的,磅,乌兰巴托)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。
X =1×21.0000 - 2.0000
fval = -0.6667

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

x0 = x0/5;(x2, fval2) = fmincon (Aeq有趣,x0, A, b,说真的,磅,乌兰巴托)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。
x2 =1×210.-6×0.4000 - 0.4000
fval2 = 1.0000

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

为了方便地检查解决方案的质量,要求exitflag输出输出。

设置最小化Rosenbrock在单元磁盘上的功能的问题,x $ | | | | ^ 2 \勒1美元.首先创建一个表示非线性约束的函数。将其保存为一个名为unitdisk.m在您的Matlab®路径上。

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

创建剩余的问题规范。

@(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;nonlcon = @unitdisk;一个= [];b = [];Aeq = [];说真的= [];磅= [];乌兰巴托= [];x0 = (0,0);

称呼粉刺使用fvalexitflag, 和输出输出。

[x,fval,出口,输出] = fmincon(乐趣,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 constructor: 0 stepsize: 6.9162 -06 algorithm: ' internal -point' firstderopt: 2.4373e-08 cgiterations: 4 message: '…'最佳可行:[1x1 struct]
  • exitflag价值1表示解是局部最小值。

  • 输出结构报告有关解决方案过程的几个统计数据。特别是,它给出了迭代的数量output.iterations,功能评估数量output.funcCount的可行性output.constrviolation

粉刺可选地返回几个输出,您可以使用这些输出来分析报告的解决方案。

在单位圆盘上建立最小化罗森布罗克函数的问题。首先创建一个表示非线性约束的函数。将其保存为一个名为unitdisk.m在您的Matlab®路径上。

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

创建剩余的问题规范。

@(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;nonlcon = @unitdisk;一个= [];b = [];Aeq = [];说真的= [];磅= [];乌兰巴托= [];x0 = (0,0);

要求所有的粉刺输出。

[x, fval exitflag、输出λ,校友,黑森]= fmincon (Aeq有趣,x0, A, b,说真的,磅,乌兰巴托,nonlcon)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。x = 0.7864 0.6177 fval = 0.0457 exitflag = 1 output = struct with fields: iterations: 24 funcCount: 84 constructor: 0 stepsize: 6.9162 -06 algorithm: ' internal -point' firstderopt: 2.4373e-08 cgiterations: 4 message: '…'最佳可行:[1x1 struct]lambda.=结构体with fields: 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

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

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

在哪里myfun.MATLAB是一种®等功能

函数f = myfun(x)f = ...%compute函数值x

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

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

如果你能计算出梯度乐趣SpecifyObjectiveGradient选项设置为真的按规定

选项= Optimoptions('fmincon','specifyobjectivegradient',true)
然后乐趣必须返回梯度向量g (x)在第二个输出参数中。

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

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

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

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

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

初始点,指定为实向量或实数组。的元素个数和大小,x0来确定变量的数量和大小乐趣接受。

  • “内点”算法—如果冬青选择是真的(默认),粉刺重置x0在边界上或边界外的组件或者UB.到边界之间的值。

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

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

例子:x0 =(1、2、3、4)

数据类型:

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

一个编码线性不等式

A * x < =

在哪里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或更小,请使用一个= 1 (1,N)b = 1

数据类型:

线性不等式约束,指定为实向量。b是一个- 与...相关的矢量一个矩阵。如果你通过b作为行向量,求解器内部转换b到列向量b (:).对于大问题,不予考虑b作为稀疏的矢量。

b编码线性不等式

A * x < =

在哪里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或更小,请使用一个= 1 (1,N)b = 1

数据类型:

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

Aeq编码线性等式

Aeq * x =说真的

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

例如,指定

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

输入这些约束:

Aeq =[1、2、3、2、4、1];说真的=(10、20);

例子:要指定x分量的和为1,使用Aeq = 1 (1, N)说真的= 1

数据类型:

线性等式约束,指定为实向量。说真的是一个- 与...相关的矢量Aeq矩阵。如果你通过说真的作为行向量,求解器内部转换说真的到列向量说真的(:).对于大问题,不予考虑说真的作为稀疏的矢量。

说真的编码线性等式

Aeq * x =说真的

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

例如,考虑以下等式:

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

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

Aeq =[1、2、3、2、4、1];说真的=(10、20);

例子:要指定x分量的和为1,使用Aeq = 1 (1, N)说真的= 1

数据类型:

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

x(我)> =磅(我)对所有

如果元素个数(磅)<元素个数(x0),然后指定

x(我)> =磅(我)1 <= I <= numel(lb)

如果元素较少比在x0,解决方案发出警告。

例子:要指定所有x分量都是正数,请使用磅= 0(大小(x0))

数据类型:

上界,指定为实向量或实数组。如果元素的数量x0等于元素的个数UB.,然后UB.指定

x (i) < =乌兰巴托(我)对所有

如果元素个数(乌兰巴托)<元素个数(x0),然后UB.指定

x (i) < =乌兰巴托(我)1 <= I <= numel(ub)

如果元素较少UB.比在x0,解决方案发出警告。

例子:要指定所有x分量都小于1,使用乌兰巴托= 1(大小(x0))

数据类型:

非线性约束,指定为函数句柄或函数名。nonlcon是接受向量还是数组的函数x返回两个数组,C(x)量表(x)

  • C(x)非线性不等式约束数组在x粉刺试图满足

    c (x) < = 0对于所有参赛作品c

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

    量表(x) = 0对于所有参赛作品量表信

例如,

x = fmincon(@ myfun,x0,a,b,aeq,beq,lb,Ub,@ mycon)

在哪里mycon是MATLAB函数之类的

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

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

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

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

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

所有的算法
算法

选择优化算法:

  • “内点”(默认)

  • “trust-region-reflective”

  • “sqp”

  • “sqp-legacy”optimoptions唯一的)

  • “激活集”

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

trust-region-reflective算法需要:

  • 在目标函数中提供的梯度

  • SpecifyObjectiveGradient设置为真的

  • 有界约束或线性等式约束,但不能两者都有

如果你选择“trust-region-reflective”并且这些条件都不满足,粉刺抛出一个错误。

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

CheckGradients

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

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

ConstraintTolerance

对约束违规的容忍度,一个正标量。默认值是1 e-6.看到公差和停止标准

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

诊断

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

DiffMaxChange

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

DiffMinChange

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

展示

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

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

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

  • “iter-detailed”在每次迭代时显示输出,并提供技术退出消息。

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

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

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

  • 最后详细的仅显示最终输出,并提供技术退出消息。

FiniteDifferenceStepSize

有限差分的标量或向量步长因子。当您设置FiniteDifferenceStepSize一个向量v,正有限差分三角洲

δ= v *标志的(x) *马克斯(abs (x)、TypicalX);

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

δ= v *马克斯(abs (x)、TypicalX);

标量FiniteDifferenceStepSize扩展到向量。默认值是sqrt (eps)用于前进有限差异,和eps ^ (1/3)对于中心有限差分。

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

FiniteDifferenceType

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

粉刺在估计两种类型的有限差分时,小心地遵守界限。例如,它可以取一个向后的,而不是向前的,差异,以避免在边界外的点计算。但是,对于内点算法,“中央”如果冬青选项设置为

优化集,名字是findifftype..看到当前和遗留选项名称

FunValCheck

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

MaxFunctionEvaluations

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

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

MaxIterations

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

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

OptimalityTolerance

一阶最优性的终止容限(正标量)。默认值是1 e-6.看到一阶最优性测量

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

OutputFcn

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

PlotFcn

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

  • “optimplotx”绘制当前点

  • “optimplotfunccount”绘制函数计数

  • “optimplotfval”绘制函数值

  • “optimplotfvalconstr”绘制作为线绘图的最佳可行目标函数值。使用可行性公差,该曲线表现为红色,可行点和可行点。使用可行性公差1 e-6

  • “optimplotconstrviolation”绘制最大约束违规

  • “optimplotstepsize”绘制步长

  • “optimplotfirstorderopt”绘制一阶的最优性措施

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

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

SpecifyConstraintGradient

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

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

SpecifyObjectiveGradient

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

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

StepTolerance

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

优化集,名字是托克斯.看到当前和遗留选项名称

典型的

典型的x价值观。元素的数量典型的等于元素的个数x0,起点。默认值为的(numberofvariables, 1)粉刺使用典型的为梯度估计缩放有限差分。

“trust-region-reflective”算法使用典型的只是为了CheckGradients选择。

UseParallel

真的粉刺估计并行梯度。通过设置禁用默认值,trust-region-reflective需要梯度,所以UseParallel不适用。看到并行计算

Trust-Region-Reflective算法
FunctionTolerance

函数值的终止容限,一个正标量。默认值是1 e-6.看到公差和停止标准

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

赫索斯·福克

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

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

HessianMultiplyFcn

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

W = hmfun (Hinfo, Y)

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

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

[f, g, Hinfo] =乐趣(x)

Y矩阵的行数与问题的维数相同。矩阵W = H * Y,虽然H不是明确形成的。粉刺使用Hinfo计算前提者。有关如何为任何其他参数提供值的信息hmfun需要,请参阅传递额外的参数

请注意

使用HessianMultiplyFcn选项,赫索斯·福克必须设置为[], 和SubproblemAlgorithm必须是“重心”(默认)。

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

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

HessPattern

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

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

当结构未知时,不要设置HessPattern.默认的行为是HessPattern是1的密集矩阵。然后粉刺在每次迭代中计算完全有限差分近似。这种计算对于大问题来说是非常昂贵的,所以通常最好确定稀疏性结构。

MaxPCGIter

最大预条件共轭梯度(PCG)迭代数,一个正标量。默认值是马克斯(1楼(numberOfVariables / 2))对于束缚的问题,并且是numberofvariables.约束问题。有关更多信息,请参见预处理的共轭梯度法

precondbandwidth.

PCG预调制器的上带宽,非负整数。默认情况下,使用对角预处理(上限带宽为0)。对于某些问题,增加带宽可以减少PCG迭代次数。设置precondbandwidth.使用直接因子分解(Cholesky)而不是共轭梯度(CG)。直接因式分解在计算上比CG更昂贵,但在求解过程中产生了更好的质量。

SubproblemAlgorithm

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

TolPCG

PCG迭代的终止公差,正标量。默认值是0.1

有效集算法
FunctionTolerance

函数值的终止容限,一个正标量。默认值是1 e-6.看到公差和停止标准

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

MaxSQPIter

允许的最大SQP迭代次数,一个正整数。默认值是10 * max(Numberofvariables,numberofinequalities + numberofbounds)

RelLineSrchBnd

直线搜索步长上的相对界限(实非负标量值)。总排水量x满足x)|≤relLineSrchBnd·max(| . b0x) | |典型的) |).该选项提供了对位移大小的控制x对于求解器采取的案例,措施被认为太大的步骤。默认值没有界限([]).

RelLineSrchBndDuration

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

TolConSQP

内迭代SQP约束违背的终止容忍,一个正标量。默认值是1 e-6

内点算法
BarrierParamUpdate

选择如何粉刺更新势垒参数(见fmincon内点算法).的选择是:

  • “单调”(默认)

  • 预估的

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

HessianApproximation

选择如何粉刺计算Hessian(参见Hessian作为输入).的选择是:

  • 'bfgs'(默认)

  • 有限差分的

  • “lbfgs”

  • {“lbfgs”,正整数}

请注意

使用HessianApproximation,两个赫索斯·福克HessianMultiplyFcn必须为空项([]).

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

赫索斯·福克

如果[](默认),粉刺用中指定的方法近似HessianHessianApproximation,或使用供应的HessianMultiplyFcn.如果一个函数句柄,粉刺使用赫索斯·福克来计算黑森。看到Hessian作为输入

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

HessianMultiplyFcn

用户提供的函数,提供Hessian-idse矢量产品(参见黑森乘法函数).传递一个函数句柄。

请注意

使用HessianMultiplyFcn选项,赫索斯·福克必须设置为[], 和SubproblemAlgorithm必须是“重心”

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

冬青

默认的真的确保在每次迭代时满足约束约束。通过设置禁用

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

InitBarrierParam

初始屏障值,正标量。有时它可能有助于尝试高于默认值的值0.1,特别是如果目标或约束函数很大。

InitTrustRegionRadius

信任区域的初始半径,一个正标量。在规模严重的问题上,选择一个比默认值小的值可能会有帮助 n ,在那里n为变量的个数。

MaxProjCGIter

对预定的共轭梯度迭代的数量的宽容(停止标准);这是一个内部迭代,而不是算法的迭代次数。此正整数具有默认值2 * (numberOfVariables - numberOfEqualities)

ObjectiveLimit

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

ScaleProblem

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

优化集,值是“obj-and-constr”或者“没有”.看到当前和遗留选项名称

SubproblemAlgorithm

确定如何计算迭代步骤。默认的,“分解”,通常比“重心”不过,(共轭梯度)“重心”对于稠密的黑森树可能更快。看到fmincon内点算法

TolProjCG

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

tolprojcgabs.

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

SQP和SQP遗留算法
ObjectiveLimit

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

ScaleProblem

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

优化集,值是“obj-and-constr”或者“没有”.看到当前和遗留选项名称

例子:选择= optimoptions(‘fmincon’,‘SpecifyObjectiveGradient’,真的,SpecifyConstraintGradient,真的)

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

字段名 条目

客观的

目标函数

x0

初始点x

Aineq

线性不等式约束的矩阵

Bineq.

线性不等式约束的矢量

Aeq

线性等式约束的矩阵

说真的

线性等式约束的向量
下界向量
UB. 上界向量

nonlcon

非线性约束函数

解算器

“fmincon”

选项

选择创建optimoptions

你必须至少提供客观的x0解算器, 和选项田野在问题结构。

数据类型:结构体

输出参数

全部折叠

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

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

原因粉刺已停止,返回为整数。

所有的算法:

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

约束函数的最大值

一步的大小

最后排水量的长度x(不是有效集算法)

算法

优化算法使用

cgiteration.

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

firstorderopt

一阶最优性的度量

bestfeasible

遇到的最佳(最低目标函数)可行点。包含以下字段的结构:

  • x

  • fval

  • firstorderopt

  • constrviolation

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

bestfeasible点可以与返回的解决方案点不同x出于各种原因。例如,请参见获得最佳可行点

消息

退出消息

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

较低的

下界对应于

上限对应UB.

ineqlin

线性不等式对应于一个b

eqlin

对应的线性等式Aeq说真的

ineqnonlin

对应的非线性不等式cnonlcon

eqnonlin

对应的非线性等式量表信nonlcon

解的梯度,返回实向量。研究生给出梯度乐趣在点x (:)

近似的黑森函数,返回实矩阵。为了…的意义黑森西,请参阅黑森输出

限制

  • 粉刺是一种基于梯度的方法,用于处理目标函数和约束函数都是连续的且具有连续一阶导数的问题。

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

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

    信任区域反光算法中不允许等于上限和下限。改为使用内部点或SQP算法。
  • 传递一个Hessian有两种不同的语法,传递一个也有两种不同的语法HessianMultiplyFcn函数;一个用于trust-region-reflective,另一个用于内点.看到包括麻布

    • trust-region-reflective,拉格朗日函数的Hessian与目标函数的Hessian相同。你传递那个Hessian作为目标函数的第三个输出。

    • 内点,拉格朗日的Hessian包括拉格朗日乘数和非线性约束函数的Hessian。您将Hessian作为一个单独的函数传递,该函数将考虑当前点x以及拉格朗日乘子结构lambda.

  • 当问题不可行时,粉刺尝试最小化最大约束值。

更多关于

全部折叠

Hessian作为输入

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

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

详细了解如何供应Hessian到trust-region-reflective或者内点算法,看到包括麻布

有效集SQP.算法不接受一个输入黑森州。他们将Quasi-Newton近似于拉格朗日的黑森州。

内点算法有几种选择“HessianApproximation”选择;看到选择输入Hessian近似用于内部点Fmincon

  • 'bfgs'- - - - - -粉刺用稠密的拟牛顿近似计算Hessian。这是默认的Hessian近似。

  • “lbfgs”- - - - - -粉刺通过有限内存的大规模准牛顿近似计算Hessian。使用默认内存,10次迭代。

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

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

黑森乘法函数

内点trust-region-reflective算法允许你提供一个Hessian乘法函数。此功能给出了Hessian时代矢量产品的结果,而不直接计算Hessian。这可以节省内存。有关详细信息,请参见黑森乘法函数

算法

全部折叠

选择算法

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

本节的其余部分给出了关于每种算法信息的简要总结或指针。

内点优化

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

SQP和SQP遗留优化

粉刺“sqp”“sqp-legacy”算法类似于“激活集”算法中描述激活集优化fmincon SQP算法描述主要的区别。综上所述,这些差异是:

激活集优化

粉刺使用一个序列二次规划(SQP)方法。在这种方法中,函数求解a每次迭代的二次编程(QP)子问题。粉刺使用BFGS公式在每次迭代时更新拉格朗日的Hessian估计(见fminunc和参考文献[7][8]).

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

另请参阅SQP实现有关所使用算法的更多细节。

Trust-Region-Reflective优化

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

选择功能

应用程序

优化活动编辑器任务为粉刺

参考文献

Byrd, R. H., J. C. Gilbert和J. Nocedal。“基于内点技术的非线性规划信赖域方法”。数学规划,第89卷,第1期,2000年,149-185页。

Byrd, r.h., Mary E. Hribar和Jorge Nocedal。“大规模非线性规划的内点算法”。SIAM优化学报, 1999年第9卷第4期,第877-900页。

[3] Coleman, t.f.和Y. Li。有界非线性极小化的内部信赖域方法SIAM优化学报, 1996年第6卷,418-445页。

[4]科尔曼,T. F.和Y. Li。“关于对界限大规模非线性最小化的反光牛顿方法的收敛性。”数学规划,第67卷,第2期,1994年,189-224页。

吉尔,P. E., W.默里和M. H.赖特。实用的优化,伦敦,学术出版社,1981年。

[6] Han, S. P. <非线性规划的全局收敛方法>。优化理论与应用学报, 1977年第22卷,第297页。

[7] Powell, M. J. D. <非线性约束优化计算的快速算法>。数值分析,爱德华·g·a·沃森,数学讲义,斯普林克 - Verlag,Vol。630,1978。

[8] Powell, M. J. D. <非线性约束优化计算的变度量方法的收敛性>。非线性编程3.(o.l. Mangasarian、r.r. Meyer和s.m. Robinson主编),学术出版社,1978年。

[9]华尔兹,r.A.,J.L. Morales,J. Nocedal和D. Orban。“结合线搜索和信任区域步骤的非线性优化的内部算法。”数学规划, Vol 107, No. 3, 2006, pp. 391-408。

扩展功能

在R2006A之前介绍