带有梯度的非线性约束
这个例子展示了如何利用导数信息解决非线性约束的非线性问题。
通常,最小化程序使用由有限差分近似计算的数值梯度。该程序系统地扰动每个变量,以计算函数和约束偏导数。或者,您可以提供一个函数来解析地计算偏导数。通常,当你提供衍生信息时,解算器工作得更准确和有效。
目标函数与非线性约束
问题是要解决的
受限于
因为fmincon
求解器期望约束以这种形式编写
,写约束函数返回如下值:
.
带梯度的目标函数
目标函数为
.
计算的梯度 关于变量 而且 .
.
的objfungrad
的辅助函数。本例结束返回两个目标函数
以及它在第二个输出中的梯度gradf
.集@objfungrad
作为目标。
乐趣= @objfungrad;
梯度约束函数
辅助函数confungrad
为非线性约束函数;它出现在本例结束.
不等式约束的导数信息是每一列对应一个约束。也就是说,约束条件的梯度格式如下:
集@confungrad
为非线性约束函数。
Nonlcon = @confungrad;
将选项设置为使用衍生信息
指示给fmincon
求出目标函数和约束函数提供的导数信息。要做到这一点,使用optimoptions
设置SpecifyObjectiveGradient
而且SpecifyConstraintGradient
选项值为真正的
.
选项= optimoptions(“fmincon”,...“SpecifyObjectiveGradient”,真的,“SpecifyConstraintGradient”,真正的);
解决问题
将初始点设置为[1]
.
X0 = [-1,1];
该问题没有边界或线性约束,因此将这些参数值设置为[]
.
A = [];B = [];Aeq = [];Beq = [];Lb = [];Ub = [];
调用fmincon
解决问题。
[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。
x =1×2-9.5473 - 1.0474
Fval = 0.0236
解决方法与示例中相同非线性不等式约束,在不使用导数信息的情况下解决了问题。使用导数的优点是,在获得鲁棒性的同时,解决问题需要更少的函数计算,尽管这个优点在这个例子中并不明显。使用更多的衍生信息,比如fmincon内点算法与解析Hessian,会带来更多的好处,比如更少的求解器迭代。
辅助函数
此代码创建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)];结束结束
此代码创建confungrad
helper函数。
函数[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 = [];结束结束