粉刺

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

描述

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

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

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)可以是非线性函数。

xLB.,和UB.可以作为向量或矩阵传递;看到矩阵论据

例子

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

请注意

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

例子

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

例子

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

请注意

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

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

例子

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

例子

x= fmincon (乐趣X0.一个bAeq说真的LB.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 = beq通过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 MathWorks,Inc。函数[c,ceq] = circlecon(x)c =(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”);

在设备磁盘上找到最少的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;一个= [];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”'specifyobjectivegrient',真正的);

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

有趣= @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输出以及解决方案。

fun = @(x)1 + x(1)./(1 + x(2)) -  3 * x(1)。* x(2)+ x(2)。*(1 + x(1));磅= (0,0);乌兰巴托= [1,2];一个= [];b = [];Aeq = [];说真的= [];X0 = (lb + ub)/2;[x,fval] = fmincon(乐趣,x0,a,b,aeq,beq,lb,Ub)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。
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输出输出。

在单位圆盘上建立最小化罗森布罗克函数的问题,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: '…'
  • exitflag价值1表示解是局部最小值。

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

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

设置最小化单位磁盘上的Rosenbrock功能的问题。首先创建一个代表非线性约束的函数。将其保存为命名的文件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: '…'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。这可以节省内存。看到Hessian乘法功能

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

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

初始点,指定为真实的矢量或真实数组。求解器使用元素数量和大小的数量X0.来确定变量的数量和大小乐趣接受。

  • '内点'算法—如果冬青选择是真实(默认),粉刺重置X0.在边界上或边界外的组件LB.或者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 = beq

在哪里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 = beq

在哪里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.等于元素的个数LB.,然后LB.指定

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

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

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

如果元素较少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)c = ...%计算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这些值是“上”或者'off'.看到当前和遗留选项名称表

ConstraintTolerance

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

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

诊断

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

diffmaxchange.

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

DiffMinChange

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

展示

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

  • 'off'或者“没有”显示没有输出。

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

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

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

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

  • '最终'(default)只显示最终输出,并给出默认的退出消息。

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

FiniteDifferenceStepSize

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

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

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

delta = v。* max(abs(x),典型值);

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

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

FiniteDifferenceType

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

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

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

FunValCheck

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

MaxFunctionEvaluations

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

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

MaxIterations

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

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

OptimalityTolerance

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

优化集,名字是塔尔芬.看到当前和遗留选项名称表

outputfcn.

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

PlotFcn

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

  • “optimplotx”绘制当前点

  • 'OptimplotFunccount'绘制函数计数

  • “optimplotfval”绘制函数值

  • “optimplotfvalconstr”将找到的最佳可行目标函数值绘制成线图。该图以红色表示不可行点,以蓝色表示可行点,使用的可行性公差为1E-6

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

  • 'OptimplotStepsize'绘制阶梯尺寸

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

自定义绘图函数使用与输出函数相同的语法。看到输出函数输出函数的语法

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

SpecifyConstraintGradient

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

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

SpecifyObjectiveGradient

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

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

StepTolerance

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

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

TypicalX

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

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

UseParallel

什么时候真实粉刺平行估计梯度。通过设置为默认值来禁用,trust-region-reflective需要梯度,所以UseParallel不适用。看到并行计算

Trust-Region-Reflective算法
FunctionTolerance

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

优化集,名字是塔尔芬.看到当前和遗留选项名称表

赫索斯·福克

如果[](默认),粉刺使用有限差分近似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选项,赫索斯·福克必须设置为[],和子项产算法必须是“重心”(默认)。

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

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

HessPattern

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

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

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

MaxPCGIter

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

precondbandwidth.

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

子项产算法

确定如何计算迭代步骤。默认的,“重心”,比。要快但不准确的一步“分解”.看到Fmincon Trust Region反光算法

TolPCG

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

主动集算法
FunctionTolerance

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

优化集,名字是塔尔芬.看到当前和遗留选项名称表

MaxSQPIter

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

RelLineSrchBnd

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

RelLineSrchBndDuration

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

Tolconsqp.

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

内部点算法
HessianApproximation

选择这个方法粉刺计算Hessian(参见Hessian作为输入).的选择是:

  • 'bfgs'(默认)

  • 有限差分的

  • “lbfgs”

  • {“lbfgs”,正整数}

请注意

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

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

赫索斯·福克

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

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

HessianMultiplyFcn

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

请注意

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

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

冬青

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

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

InitBarrierParam

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

InitTrustRegionRadius

信任区域的初始半径,一个正标量。在严格缩放的问题上,它可能有助于选择小于默认值的值 n ,在那里n是变量的数量。

MaxProjCGIter

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

ObjectiveLimit

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

ScaleProblem

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

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

子项产算法

确定如何计算迭代步骤。默认的,“分解”,通常比“重心”不过,(共轭梯度)“重心”对于稠密的黑森树可能更快。看到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

线性等式约束的矩阵

说真的

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

nonlcon

非线性约束函数

解算器

“fmincon”

选项

选择创建optimoptions

你必须至少提供目标是X0.解算器,和选项田野在问题结构。

得到a的最简单的方法问题结构是从优化应用程序导出问题。

数据类型:结构体

输出参数

全部折叠

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

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

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

所有的算法:

1

一阶的最优性措施小于选项。OptimalityTolerance,最大约束违背小于选项.ConstraintTolerance.

0

超过迭代次数options.maxIterations.或超过函数求值次数options.maxfunctionevaluations.

-1

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

-2

没有找到可行点。

所有算法除了有效集

2

的变化x还不到选择最大限度的约束违规小于选项.ConstraintTolerance.

trust-region-reflective算法只:

3.

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

有效集算法只:

4

搜索方向的大小小于2*选择最大限度的约束违规小于选项.ConstraintTolerance.

5

搜索方向方向导数值小于2*选项。OptimalityTolerance最大限度的约束违规小于选项.ConstraintTolerance.

内点sqp-legacy,和SQP.算法:

-3

下面是当前迭代的目标函数选项。ObjectiveLimit最大限度的约束违规小于选项.ConstraintTolerance.

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

迭代

迭代次数

funcCount

函数计算次数

lssteplength

线路搜索步骤的大小相对于搜索方向(有效集SQP.算法只)

constrviolation

约束函数的最大值

步骤化

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

算法

优化算法使用

cgiteration.

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

firstorderopt

一阶最优性的度量

消息

退出消息

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

较低的

下界对应于LB.

较高的

上限对应UB.

ineqlin

线性不等式对应于一个b

eqlin

线性平等对应Aeq说真的

ineqnonlin

对应的非线性不等式cnonlcon

eqnonlin

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

解决方案的梯度,作为真正的矢量返回。研究生给出梯度乐趣在点x (:)

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

限制

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

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

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

    信任区域反光算法中不允许等于上限和下限。改为使用内部点或SQP算法。
  • 传递一个Hessian有两种不同的语法,传递一个也有两种不同的语法HessianMultiplyFcn功能;一个for.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乘积。你必须提供目标函数的梯度,以及非线性约束的梯度(如果存在的话)。设置'specifyobjectivegrient'选项真实如果适用的话“SpecifyConstraintGradient”选项真实.你必须设置“SubproblemAlgorithm”到目前为止“重心”

Hessian乘法功能

内点trust-region-reflective算法允许你提供一个Hessian乘法函数。此功能给出了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 Trust Region反光算法

参考文献

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

Byrd, r.h., Mary E. Hribar和Jorge Nocedal。“大规模非线性规划的内点算法”。暹罗期刊优化,第9卷,第4,199,999页,第877-900页。

[3] Coleman,T. F.和Y. Li。“内部,信任区域方法,用于非线性最小化受限。”暹罗期刊优化, 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之前介绍