主要内容

带有梯度的非线性约束

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

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

目标函数与非线性约束

问题是要解决的

最小值 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设置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,会带来更多的好处,比如更少的求解器迭代。

辅助函数

此代码创建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(1) * x(2)-10;无非线性等式约束测查= [];约束条件的%梯度:如果nargout > 2 DC= [x(2)-1, -x(2);x (1) 1 - x (1)];DCeq = [];结束结束

相关的话题

Baidu
map