我正在使用fmincon
来解决问题。这个问题有一些线性不等式约束,用矩阵A和B写成。
我可以用2种方式编写这些约束,我应该得到类似的结果。但是,奇怪的是我得到了不同的解决方案。这是为什么?
1)在第一种方式中,我可以将约束提供给“fmincon”'功能如下:
[Xsqp, FUN ,FLAG ,Options] = fmincon(@(X)SQP(X,Dat),X,A,B,[],[],lb,ub,@(X)SQPnolcon(X,Dat,A,B),options);
% I comment the line 'C=A*X'-B;'
in the function 'SQPnolcon' and put C=[] instead, because A and B are defined already in fmincon function
2)作为第二种方式我可以这样写:
[Xsqp, FUN ,FLAG ,Options] = fmincon(@(X)SQP(X,Dat),X,[],[],[],[],lb,ub,@(X)SQPnolcon(X,Dat,A,B),options);
以及约束函数如下:
function [C,Ceq] = SQPnolcon(X,Dat,A,B)
C=A*X'-B;
Ceq = [];
end
答案 0 :(得分:2)
首先,您提供A
和B
作为线性不等式约束和非线性不等式约束,但在第二种情况下,您只将它们作为非线性不等式提供约束
我明白为什么你可能会认为这是等价的,因为无论如何它们都是相同的约束。但线性等式约束应用于与非线性等式约束不同的上下文中,这导致优化算法找到不同的解决方案。
我担心我无法准确解释如何应用两种不同类型的约束,以及算法中的哪些点 - 无论如何,这会有所不同,具体取决于您要求fmincon
使用哪种算法(活动集,信任区域等)。对于这种详细程度,您可能需要询问MathWorks。但基本的答案是,你会得到不同的结果,因为你要求算法做两件不同的事情。