主要内容

带有梯度的非线性约束

此示例显示了如何使用衍生信息解决非线性约束的非线性问题。

通常,最小化程序使用有限差分近似计算的数值梯度。该方法对每个变量进行系统扰动,以计算函数和约束偏导数。或者,您可以提供一个函数来解析地计算偏导数。通常,当您提供派生信息时,求解器工作得更准确、更有效。

目标函数与非线性约束

问题是解决

最小值 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('粉丝'...“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.

解决方案与示例中相同非线性不等式约束,它在不使用导数信息的情况下解决了问题。使用导数的优点是,解决问题需要更少的函数计算,同时获得了健壮性,尽管这个优点在本例中并不明显。使用更多的衍生信息,比如基于解析Hessian的fmincon内点算法,提供更多的好处,例如较少的求解器迭代。

辅助函数

此代码创建objfungrad.helper函数。

功能[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(1)* x(2)-10;%无非线性等式约束测查= [];%梯度约束:如果Nargout> 2 DC = [x(2)-1,-x(2);x(1)-1,-x(1)];dceq = [];结束结束

相关话题