主要内容

非线性约束和梯度

这个例子展示了如何解决非线性问题具有非线性约束用导数信息。

通常,极小化例程使用数值梯度计算了有限差分近似。这个过程系统地扰乱每个变量为了计算函数和约束偏导数。或者,您可以提供一个函数来计算偏导数分析。通常,当你提供导数信息,解决更准确、高效地工作。

目标函数和非线性约束

是要解决的问题

最小值 x f ( x ) = e x 1 ( 4 x 1 2 + 2 x 2 2 + 4 x 1 x 2 + 2 x 2 + 1 ) ,

受约束

x 1 x 2 - - - - - - x 1 - - - - - - x 2 - - - - - - 1 5 x 1 x 2 - - - - - - 1 0

因为fmincon解算器预计写在形式的约束 c ( x ) 0 ,写下你的约束函数返回以下值:

c ( x ) = ( x 1 x 2 - - - - - - x 1 - - - - - - x 2 + 1 5 - - - - - - 10 - - - - - - x 1 x 2 ]

目标函数的梯度

目标函数是

f ( x ) = e x 1 ( 4 x 1 2 + 2 x 2 2 + 4 x 1 x 2 + 2 x 2 + 1 )

计算的梯度 f ( x ) 关于变量 x 1 x 2

f ( x ) = ( f ( x ) + 经验值 ( x 1 ) ( 8 x 1 + 4 x 2 ) 经验值 ( x 1 ) ( 4 x 1 + 4 x 2 + 2 ) ]

objfungrad辅助函数在这个例子返回两个目标函数 f ( x ) 及其梯度在第二输出gradf。集@objfungrad作为目标。

有趣= @objfungrad;

约束函数梯度

辅助函数confungrad非线性约束函数;它出现在这个例子

的导数信息不平等约束每一列对应一个约束。换句话说,约束的梯度是在以下格式:

( c 1 x 1 c 2 x 1 c 1 x 2 c 2 x 2 ] = ( x 2 - - - - - - 1 - - - - - - x 2 x 1 - - - - - - 1 - - - - - - x 1 ]

@confungrad随着非线性约束函数。

nonlcon = @confungrad;

选项设置为使用导数信息

显示的fmincon解决目标和约束函数提供导数信息。为此,使用optimoptions设置SpecifyObjectiveGradientSpecifyConstraintGradient选项值真正的

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

解决问题

设置初始点[1]

x0 = [1];

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

一个= [];b = [];Aeq = [];说真的= [];磅= [];乌兰巴托= [];

调用fmincon来解决这个问题。

[x, fval] = fmincon (Aeq有趣,x0, A, b,说真的,磅,乌兰巴托,nonlcon,选项)
局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。
x =1×2-9.5473 - 1.0474
fval = 0.0236

解决方案示例中是一样的非线性不等式约束不使用导数信息,解决问题。使用衍生品的优势是,解决这个问题需要更少的功能评估获得鲁棒性,尽管这在本例中优势并不明显。使用更多的导数信息,如与分析黑森fmincon内点算法,让更多的好处,如减少迭代解算器。

辅助函数

这段代码创建了objfungradhelper函数。

函数[f, gradf] = objfungrad f (x) = exp (x (1)) * (4 * x (1) ^ 2 + 2 * x (2) ^ 2 + 4 * x (1) * (2) + 2 * x (2) + 1);%的目标函数的梯度:如果nargout > 1 gradf = [f + exp (x (1)) * (8 * x (1) + 4 * x (2)), exp (x (1)) * (4 * x (1) + 4 * x (2) + 2)];结束结束

这段代码创建了confungradhelper函数。

函数[c,测查特区DCeq] = confungrad (x) c (1) = 1.5 + x (1) * (2) - x (1) - (2);%不等式约束c (2) = x - x (1) * (2) -10;%没有非线性等式约束测查= [];%的梯度约束:如果nargout > 2 DC = [x (2) 1 - x (2);x (1) 1 - x (1)];DCeq = [];结束结束

相关的话题