Dealing with Error "Not enough Input Arguments" when using NONLCON for fmincon

Hello,
I'm trying to solve a basic non linear programming problem. It involves several non linear inequality constraints. I keep getting the error "Not enough input arguments" in the function fun3 whenever I try to run my full script. I'm new to matlab, so I know it is probably something very simple but I am stumped. Also, I probably misused the terminology in this post and I apologize.
Here is my code:
%%main function
clc
clear
tic
Budget=(1000:1000:5000);
SI=(100:100:1000);
ST=(10:10:100);
SA=(10:10:100);
Elapsed_Time=zeros(5,10,10,10);
for b=1:5
TBudget=Budget(b);
for i=1:10
si=SI(i);
for j=1:10
st=ST(j);
for k=1:10
sa=SA(k);
stime=zeros(st,sa);
x=zeros(st,sa);
y=zeros(2*st,2*sa);
target_recovery=0.3;
beta_l1=0.4;
beta_l2=0;
beta_l3=0.5;
alpha_r1=0.05;
alpha_r2=0.5;
alpha_r3=0.05;
alpha_r4=0.3;
delta_scost=0.3;
beta_cost=5;
lower_scost=6;
delta_ptime=5;
u=0.7;
upper_ptime=8;
lower_bound=0;
upper_bound=1;
p=0;
q=0.003;
for l=1:st
for m=1:sa
lb=zeros(2*st,sa);
ub=ones(2*st,sa);
for n=1:si
[cost(l,m),recovery_function(l,m),loss_function(l,m),ptime(l,m),ctime(l,m),quality_response_function(l,n,m)]=fun2(stime(l,m),x(l,m),delta_scost,beta_cost,lower_scost,alpha_r1,alpha_r2,alpha_r3,alpha_r4,beta_l1,beta_l2,beta_l3,upper_ptime,delta_ptime,u,p,q);
y(l,m)=stime(l,m);
y(st+l,m)=x(l,m);
end
end
rtim=min(ctime(l,:));
end
dec1(:,1)=sum((recovery_function-loss_function),2);
dec1(:,2)=sum(cost,2);
dec1(:,3:2+si)=sum(quality_response_function,3);
%optimal solution
y=fmincon(@fun1,rand(st,sa),[],[],[],[],lb,ub, fun3);
end
end
end
end
toc
%%fun1
function f=fun1(rtim)
obj=sum(rtim,2);
f=obj(1);
%%fun2
function [cost,recovery_function,loss_function,ptime,ctime,quality_response_function]=fun2(stime,x,delta_scost,beta_cost,lower_scost,alpha_r1,alpha_r2,alpha_r3,alpha_r4,beta_l1,beta_l2,beta_l3,upper_ptime,delta_ptime,u,p,q)
cost= delta_scost*exp(-beta_cost*x)+lower_scost + x;
recovery_function=alpha_r1*(1-alpha_r2*stime)+alpha_r3*(1-exp(-alpha_r4*x));
loss_function=beta_l1*(1+beta_l2*stime)*exp(-beta_l3*x);
ptime=upper_ptime-delta_ptime*(1-exp(-u*x));
ctime=stime+ptime;
quality_response_function= p*stime + q*x;
%%fun3
function [c,ceq]=fun3(dec1,TBudget,st,si)
c=[-dec1(:,1)+0.3*ones(st,1);
dec1(:,2)-TBudget*ones(st,1);
-dec1(:,3:(si+2));
dec1(:,3:(si+2))-ones(st,si)];
ceq=[];
Thank you!

回答(2 个)

In addition to what Matt J said, your nonlinear constraint function needs to be a function of one input variable. Either take the function as a function of dec1 alone:
@(dec1)fun3(dec1,TBudget,st,si)
or, if you have all four variables in the problem, bundle them into a new variable x as follows:
function [c,ceq]=fun3(x)
dec1 = x(1);
TBudget = x(2);
st = x(3);
si = x(4);
...
Alan Weiss
MATLAB mathematical toolbox documentation
You need to pass '@fun3' instead of just 'fun3':
y=fmincon(@fun1,rand(st,sa),[],[],[],[],lb,ub, @fun3);

2 个评论

I 've noticed that but it's not the most important reason the coding doesn't work. I've already finished it and thank you all the same!
It is the answer to your question, however. The error message that you posted "Not enough input arguments..." and which was the basis for your posted question was due to that.

请先登录,再进行评论。

类别

帮助中心File Exchange 中查找有关 Optimization 的更多信息

提问:

2014-12-6

评论:

2014-12-9

Community Treasure Hunt

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

Start Hunting!

Translated by