如何使用其导数应始终大于0的约束来最小化函数

时间:2017-09-28 16:40:39

标签: matlab constraints nonlinear-optimization

我试图在Matlab的fmincon的帮助下,用1500个变量(瞬时相位)优化非线性函数。对最优变量的约束是获得的最优变量中的连续元素之间的差异应该大于0.我如何在成本函数中实现这一点?我使用了非线性约束:

function [c,ceq] = insta_freq(phase)
f=diff(phase);
c=-1*double(min(f));
ceq = [];

优化由以下人员执行:

nonlcon=@insta_freq;
[variable_opt,fval,exitflag,output] = fmincon(fun,ph0,[],[],[],[],[],[],nonlcon,options);

优化应该是约束nonlcon<=0,但在使用fmincon进行优化时,不满足这些约束。那么,还有其他方法可以确保最优变量向量的差异总是大于0吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试减少constraint tolerance。同样在问题中,你似乎指的是目标函数的导数,而在问题本身中,你似乎希望每个单词都比前一个更大,如x1&lt; = x2&lt; = x3&lt; = ......&lt; = xn。我建议对后一个问题提出一个可能的解决方案(第一个问题甚至不能定义局部最优,所以我假设报告的条件是你想要的)。

您可以在矩阵中重写条件,如下所示 A = [1 -1 0 ... 0; 0 1 -1 0 ... 0; .... 1 -1]所以你的约束是不等式线性约束,简单写成Aineq x&lt; = b其中b = [0; ...; 0];

然后你打电话

[variable_opt,fval,exitflag,output] = fmincon(fun,ph0,A,b,[],[],[],[],nonlcon,options);

其中A和b是上面定义的。