我正在编写一个模型,该模型需要使用fmincon
来最小化 6 个变量:o
、a
、b
、w
、kappa
、gamma
。变量options
定义如下:
optimset(optimset(@fmincon),'Diagnostics','off','Display','off','LargeScale','off','MaxSQPIter',1000,'TolFun',1e-6)
变量已受以下下限/上限的约束:
o
、a
、b
、w
介于0
和Inf
之间;kappa
和gamma
在(2 * options.TolCon)
和Inf
之间严格正;
我需要确保遵守一些约束:
o
、a
、b
、w
的和必须近似于1
;kappa
*gamma
必须近似等于1
;
如果我不必考虑最后两个变量,我可能会使用fmincon
的A
和b
参数,如下所示:
A = [-eye(3); ones(1,3)];
b = [(zeros(3,1) + (2 * options.TolCon)); (1 - (2 * options.TolCon))];
但是使用具有两个不同约束(加法约束和乘法约束)的方法非常奇怪,我真的不知道如何设置A
和b
。
似乎fmincon
的nonlcon
参数可能是我正在寻找的,但我不清楚如何正确制定它。
谢谢!
使用不等式约束和非线性约束是无法解决的。 让我们回顾一下函数调用x_opt = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
假设您的优化向量如下所示x = [o, a, b, w, kappa, gamma]
.
不等式约束:">o
、a
、b
、w
的近似总和必须1
"......我将其翻译为大小为TOL
的公差区域中的某个地方
TOL = 0.01; % your "approximately"
A = [ ones(1,4) 0 0;
-ones(1,4) 0 0];
b = [ 1+TOL
-1+TOL];
现在我很少使用的东西:
非线性约束nonlcon
:kappa
*gamma
必须近似等于1
。这是一个返回布尔标量的函数句柄
nonlcon = @(x) abs(x(5)*x(6)-1) < TOL