此示例显示如何解决包含非线性约束的优化问题。包括编写计算均等和不等式约束值的函数来包括非线性约束。非线性约束函数具有语法
[c,ceq] = nonllinconstr(x)
功能C(x)
代表约束C(x)<= 0
。功能CEQ(x)
代表约束CEQ(x)= 0
。
笔记:您必须具有非线性约束函数返回C(x)
和CEQ(x)
,即使您只有一种类型的非线性约束。如果不存在约束,则具有函数返回[]
对于那个约束。
假设您有非线性平等约束
和非线性不等式约束
。
重写这些约束
这夹具
辅助功能在此示例的结尾以正确的语法实现这些不等式。
解决这个问题
受约束。这objfun.
辅助功能在此示例的结尾实现这个目标函数。
通过致电解决问题粉刺
求解器。该求解器需要初始点;使用点x0 = [-1,-1]
。
x0 = [-1,-1];
问题没有界限或线性约束,因此将这些输入设置为[]
。
a = [];b = [];AEQ = [];beq = [];lb = [];UB = [];
打电话给求解器。
[,fval] = fmincon(@ objfun,x0,a,b,aeq,beq,lb,Ub,@ confuneq)
发现满足约束的本地最小值。优化完成,因为目标函数在可行的方向上不降低,到在最优性公差的值内,并且对约束公差的值满足约束。
X =1×2-0.7529 0.4332
fval = 1.5093.
求解器报告了解决方案满足的约束。检查解决方案的非线性约束。
[C,CEQ] = Confuneq(x)
c = -9.6739.
CEQ = 2.0668E-12
C
根据需要小于0。CEQ.
在默认约束公差范围内等于01E-6
。
以下代码创建了夹具
帮手功能。
功能[C,CEQ] = Confuneq(x)%非线性不等式约束c = -x(1)* x(2) - 10;%非线性平等约束CEQ = x(1)^ 2 + x(2) - 1;结尾
以下代码创建了objfun.
帮手功能。
功能f = objfun(x)f = exp(x(1))*(4 * x(1)^ 2 + 2 * x(2)^ 2 + 4 * x(1)* x(2)+ 2 * x(2)+1);结尾