非线性约束和梯度
这个例子展示了如何解决非线性问题具有非线性约束用导数信息。
通常,极小化例程使用数值梯度计算了有限差分近似。这个过程系统地扰乱每个变量为了计算函数和约束偏导数。或者,您可以提供一个函数来计算偏导数分析。通常,当你提供导数信息,解决更准确、高效地工作。
目标函数和非线性约束
是要解决的问题
受约束
因为fmincon
解算器预计写在形式的约束
,写下你的约束函数返回以下值:
。
目标函数的梯度
目标函数是
。
计算的梯度 关于变量 和 。
。
的objfungrad
辅助函数在这个例子返回两个目标函数
及其梯度在第二输出gradf
。集@objfungrad
作为目标。
有趣= @objfungrad;
约束函数梯度
辅助函数confungrad
非线性约束函数;它出现在这个例子。
的导数信息不平等约束每一列对应一个约束。换句话说,约束的梯度是在以下格式:
集@confungrad
随着非线性约束函数。
nonlcon = @confungrad;
选项设置为使用导数信息
显示的fmincon
解决目标和约束函数提供导数信息。为此,使用optimoptions
设置SpecifyObjectiveGradient
和SpecifyConstraintGradient
选项值真正的
。
选择= 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内点算法,让更多的好处,如减少迭代解算器。
辅助函数
这段代码创建了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 - x (1) * (2) -10;%没有非线性等式约束测查= [];%的梯度约束:如果nargout > 2 DC = [x (2) 1 - x (2);x (1) 1 - x (1)];DCeq = [];结束结束