Function or constraints have too few arguments on the right to satisfy the left

1 次查看(过去 30 天)
I'm trying to optimize this equation:
f=@(x) 0.25*7850*pi^2*x(1).^2.*x(2).*x(3)
with this set of constraints:
g=@(x) [8*75./x(5)-7; 3.5-2*pi*sqrt(75^2/(4*75.*x(4)-x(5).^2)); 100*exp(-pi.*x(5)./sqrt(4*75.*x(4)-x(5).^2))-15; x(2)-0.75; 75*9.81.*(1.566.*x(1).^2-0.9295.*x(1).*x(2)-2.546.*x(2).^2)./(x(1).^3.*(x(1)-x(2)))-517.1*10^6; 78*10^9.*x(1).^4./(8.*x(2).^3.*x(3))-x(4)];
I'm using the fmincon function in the Optimization toolbox, but no matter what algorithm I select, I see the error "The right hand side of this assignment has too few values to satisfy the left hand side" with no further details. I have been trying to figure out the cause of this error, but I'm having difficulty figuring out what, specifically, the error is referring to.
  2 个评论
Richard Brown
Richard Brown 2012-4-26
could you provide the full call to fmincon, with any other constraints that you are passing in
Scott Bacvinskas
Scott Bacvinskas 2012-4-26
I was literally entering those two functions into the Optimization toolbox, but otherwise I use:
>> f=@(x) 0.25*7850*pi^2*x(1).^2.*x(2).*x(3);
>> g=@(x) [8*75./x(5)-7; 3.5-2*pi*sqrt(75^2/(4*75.*x(4)-x(5).^2)); 100*exp(-pi.*x(5)./sqrt(4*75.*x(4)-x(5).^2))-15; x(2)-0.75; 75*9.81.*(1.566.*x(1).^2-0.9295.*x(1).*x(2)-2.546.*x(2).^2)./(x(1).^3.*(x(1)-x(2)))-517.1*10^6; 78*10^9.*x(1).^4./(8.*x(2).^3.*x(3))-x(4)];;
>> x0=[1;1;1;1;1];
>> [X,FVAL,EXITFLAG,OUTPUT,LAMBDA] = fmincon(f,x0,[],[],[],[],[],[],g)
It highlights some kind of issue with my constraint function (g), but I cannot see what the issue is.

请先登录,再进行评论。

采纳的回答

Richard Brown
Richard Brown 2012-4-26
Your nonlinear constraints need to be in a function of the form
function [c, ceq] = g(x)
c = [8*75./x(5) .......
ceq = [];
end
MATLAB was complaining because there was no equality constraint information being passed out (even there are no equality constraints).
  7 个评论
Teja Muppirala
Teja Muppirala 2012-4-26
There's a neat trick you can do with anonymous functions to make them return more than one value.
F = @(x) deal( x(1) + x(2), x(1) - x(2) )
[a,b] = F([5 2])
I sometimes use this when trying simple things out in scripts and I don't want to have to save a file.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Nonlinear Optimization 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by