我有一个具有线性约束和非线性目标函数的模型,我试图使用" fmincon" MATLAB的工具箱来解决它。实际上,Aineq是一个24 * 13矩阵,Aeq也是一个24 * 13矩阵。但是当我插入这个命令时:
>> [x , lambda] = fmincon(@MP_ObjF,Aineq,bineq,Aeq,beq);
我遇到这个错误:
Warning: Trust-region-reflective method does not currently solve this type of
problem, using active-set (line search) instead.
在fmincon at 439 ???使用==>时出错fmincon在692 Aeq必须有312列。
它可能有什么问题?为什么Aeq有312列?!?我将不胜感激任何帮助。感谢。
答案 0 :(得分:0)
如果查看fmincon(doc fmincon)的文档,您将看到一个名为opt的输入。在此,您可以设置matlab使用的算法来解决最小化问题。如果你跑 选择= optimset(' fmincon&#39);
然后您可以使用修改算法选项 Opt.algorithm ="有效集&#34 ;;
只需发送选择fmincon然后matlab就不再有这个问题了。看一下Opt,你会发现很多选项可以改变以修改优化程序。
列数。如果您正在使用线性约束,则输入MPobjF的参数必须是具有n行和1列的列向量。然后A必须是m X n。其中M是约束的数量,n是变量的数量。这样就可以很好地定义矩阵乘法。
如果我的第一个回答含糊不清,我很抱歉。也许如果我做一个例子会有所帮助,因为我在你的评论中看到了几个可疑的东西。假设我们想要最小化x ^ 2 + y ^ 2 +(z-1)^ 2受x + y + z = 1,2x + 3y - 4z <= 5,x,y,z> = - 5 。解决方案显然是(0,0,1)...
我们首先必须制定目标函数,
fun = @(vec) vec[1]^2 + vec[2]^2 + (vec[3]-1)^2;
要使fmincon正常工作,该函数只能有一个输入,但该输入可以是一个向量。所以这里x = vec [1]等等...我认为你的评论表明你的目标函数有多个输入。如果您需要传递一些未经优化的参数,则可在Matlab网站上找到相关文档(http://www.mathworks.com/help/optim/ug/passing-extra-parameters.html)
然后我们可以设置优化设置
opt = optimset('fmincon');
opt.algorithm = 'active-set';
您可能还需要修改算法警告的大规模设置才能消失,我无法记住......
然后我们可以设置
Aeq = [1,1,1]; % equality constraint, if you had another eq constraint, it would be another row to Aeq
beq = 1; % equality constraint
A = [2,3,-4]; % inequality
b = 5; % inequality
lb = [-5;-5;-5]; % lower bound
x0 = [0.5;0.5;0]; % initial feasible guess, needs to be a column vector
[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,[],[],opt);
然后希望找到x = [0; 0; 1]