Failure in initial user-supplied nonlinear constraint function evaluation. FMINCON cannot continue.
14 views (last 30 days)
Show older comments
Hi,
I have been having trouble with this problem for quite some time. I want to minimize a function depending on a two matrices of variables (S and V as initial values). The code I use is:
global Foodprice Nutrients S V ZSum WSum SOnes VOnes X0 x
Foodprice=xlsread('MaxEntropySansCarbs.xlsx','Sheet1','C2:C22');
Nutrients=xlsread('MaxEntropySansCarbs.xlsx','Sheet1','D2:U22');
S=xlsread('MaxEntropySansCarbs.xlsx','Z','Q2:Z19');
V=xlsread('MaxEntropySansCarbs.xlsx','W','R2:AA22');
ZSum=xlsread('MaxEntropySansCarbs.xlsx','Z','O2:O19');
WSum=xlsread('MaxEntropySansCarbs.xlsx','W','P2:P22');
SOnes=ones(18,1);
VOnes=ones(21,1);
X0=vertcat(S,V);
for j=1:18,1:10;
for k=19:39,1:10;
objfun{j}{k}=@(x)sum(sum(x(j)))*log(x(j))'+sum(sum(x(k)))*log(x(k))';
ceq1=@(x)Foodprice-(sum(Nutrients')'*sum(ZSum)*sum(sum(x(j))))-WSum*sum(x(k));
ceq2=@(x)sum(x(j))'-SOnes';
ceq3=@(x)sum(x(k))'-VOnes';
ceq=@(x)[ceq1;ceq2;ceq3];
options=optimset('Algorithm','interior-point');
fmincon('objfun',X0,[],[],[],[],[],[],'ceq');
end
end
I get these warnings and errors:
Warning: The default trust-region-reflective algorithm does not solve problems with the
constraints you have specified. FMINCON will use the active-set algorithm instead. For
information on applicable algorithms, see Choosing the Algorithm in the documentation.
> In fmincon at 486
Error using feval
Undefined function 'ceq' for input arguments of type 'double'.
Error in fmincon (line 681)
[ctmp,ceqtmp] = feval(confcn{3},X,varargin{:});
Caused by:
Failure in initial user-supplied nonlinear constraint function evaluation. FMINCON
cannot continue.
I'm not sure if I'm coding the choice variables from the matrix wrong or what. Any help would be extremely appreciated.
0 Comments
Answers (3)
Alan Weiss
on 14 Nov 2012
You have a few problems. A nonlinear constraint function must return both the inequality constraints and the equality constraints. See the documentation. Write a function file, say cfunction.m, that outputs both c and ceq.
Also, you do not pass your options, even though you created them. You have to pass options as the last argument:
[x,fval] = fmincon('objfun',X0,[],[],[],[],[],[],@cfunction,options);
I am not 100% sure I understand your loop, why do you give a different objfun at every step in the loop? There might be an error there, too.
Good luck,
Alan Weiss
MATLAB mathematical toolbox documentation
0 Comments
Walter Roberson
on 14 Nov 2012
Change
fmincon('objfun',X0,[],[],[],[],[],[],'ceq');
to
fmincon('objfun',X0,[],[],[],[],[],[],ceq);
You can only pass a function by name if the function has its own .m file on the MATLAB path.
0 Comments
Nazam Ali
on 16 Oct 2020
Hello, I am trying to optimize operator_profit with x as a variable in the following code. I am new to coding and trying to solve for quite a sometime, but I am getting following error:
Error in
Main_code3>@(x)confun(x,demand,theta,passenger_flow,alpha,car_probability,beta,a0,distance_travelled,bus_fare,bus_fuel_cost,car_travelling_cost_const)
Error in fmincon (line 633)
[ctmp,ceqtmp] = feval(confcn{3},X,varargin{:});
Error in Main_code3 (line 50)
[x,fval,exitflag] = fmincon(operator_profit,x0,A,b,Aeq,beq,lb,ub,confunxval);
Caused by:
Failure in initial nonlinear constraint function evaluation. FMINCON cannot continue.
While, my main code is:
clear
clc
% -----------------------------------------------------------------------%
% Parameters Setting
theta = 0.1;
demand = 5000;
alpha = 500;
beta = 400;
bus_fare = 100;
bus_fuel_cost = 200;
car_travelling_cost_const = 1000;
distance_travelled = 10;
a0 = 4000;
x = [];
% Calculation of Mathematical Expressions
% -----------------------------------------------------------------------%
bus_probability = exp(-theta * ((1./x) * alpha + beta + bus_fare))...
/(exp(-theta * ((1./x) * alpha + beta + bus_fare)) + exp(-theta * car_travelling_cost_const));
car_probability = exp(-theta * car_travelling_cost_const)./(exp(-theta * car_travelling_cost_const)...
+ exp(-theta * ((1./x) * alpha + beta + bus_fare)));
passenger_flow = demand * bus_probability;
bus_operation_cost = a0 + distance_travelled * bus_fuel_cost;
% Objective Function to Maximize the Bus Operator Profit
% -----------------------------------------------------------------------%
operator_profit = @(x)...
(demand .*...
(exp(-theta * ((1./x) * alpha + beta + bus_fare))...
/(exp(-theta * ((1./x) * alpha + beta + bus_fare)) + exp(-theta * car_travelling_cost_const)))...
* (distance_travelled * bus_fare)...
- ((a0 + distance_travelled * bus_fuel_cost) *x));
real(operator_profit(20))
A = [];
b = [];
Aeq = [];
beq = [];
lb = 1;
ub = 200;
x0 = 4;
confunxval = @(x) confun(x,demand,theta,passenger_flow,alpha,car_probability,beta,a0,distance_travelled, bus_fare,bus_fuel_cost, car_travelling_cost_const);
[x,fval,exitflag] = fmincon(operator_profit,x0,A,b,Aeq,beq,lb,ub,confunxval);
Kind help will be much appreciated. Thank you!
2 Comments
Alan Weiss
on 16 Oct 2020
I suggest that you start a new question instead oof asking a new question inside an old answer.
Alan Weiss
MATLAB mathematical toolbox documentation
See Also
Categories
Find more on Get Started with Optimization Toolbox in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!