此示例显示了如何使用衍生信息解决非线性约束的非线性问题。
通常,最小化程序使用有限差分近似计算的数值梯度。该方法对每个变量进行系统扰动,以计算函数和约束偏导数。或者,您可以提供一个函数来解析地计算偏导数。通常,当您提供派生信息时,求解器工作得更准确、更有效。
问题是解决
受约束
因为fmincon
求解器希望约束被写成这种形式
,编写约束函数返回以下值:
.
目标函数为
.
计算渐变 关于变量 和 .
.
的objfungrad.
的辅助函数此示例的结尾返回两个目标函数
它的梯度在第二个输出中gradf
.集@objfungrad.
作为目标。
有趣= @objfungrad;
辅助函数confungrad
为非线性约束函数;它出现在此示例的结尾.
不等式约束的导数信息,每一列对应一个约束。换句话说,约束的梯度是以下格式:
集@confungrad
作为非线性约束函数。
nonlcon = @confungrad;
向这方面表明fmincon
求解器的目标和约束函数提供导数信息。要做到这一点,使用optimoptions
设置SpecifyObjectiveGradient
和SpecifyConstraintGradient
选项值真的
.
选项= 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)];结束结束
此代码创建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 = [];结束结束