I'm trying to optimize a nested objective function. The main script is as follows:
c = 1;cd data;formatSpec = 'c_p_%d.csv';filename = sprintf(formatSpec,c);data = readtable(filename, 'ReadVariableNames', true);cd ..alphaGuess = 0.01;rhoGuess = 0.01;beta_bGuess = 0.5;beta_sGuess = 0.5;beta_nGuess = 0.5;A = [0 0 -1 1 0; 0 0 0 -1 1];b = [0; 0];Aeq = [];beq = [];lb = [0 0 0 0 0];ub = [1 1 1 1 1];x0 = [alphaGuess rhoGuess beta_bGuess beta_sGuess beta_nGuess];x = fmincon(L_c,x0,A,b,Aeq,beq,lb,ub);alpha = x(1);rho = x(2);beta_b = x(3);beta_s = x(4);beta_n = x(5);
The objective function L_c is defined in the following file:
function L = L_c(alpha,rho,beta_b,beta_s,beta_n) data = readtable('data'); N = length(data.id); P_vector = zeros(N,1); for i = 1:N k = string(data.k(i)); theta_b = data.b_prod(i); theta_s = data.s_prod(i); P_vector(i) = log(P_i(alpha,rho,theta_b,theta_s,beta_b, beta_s,beta_n,k)); end P_vector(isnan(P_vector))=0; L = - sum(P_vector);end
P_i, the function in L_c, is defined in another file:
function P = P_i(alpha,rho,theta_b,theta_s,beta_b,beta_s,beta_n,k) beta = beta_b; Psi_b = Psi_i_k(alpha,rho,theta_b,theta_s,beta); beta=beta_s; Psi_s = Psi_i_k(alpha,rho,theta_b,theta_s,beta); beta=beta_n; Psi_n = Psi_i_k(alpha,rho,theta_b,theta_s,beta); if string(k) == 'b' P = exp(Psi_b)/(exp(Psi_b)+exp(Psi_s)+exp(Psi_n)); elseif string(k) == 's' P = exp(Psi_s)/(exp(Psi_b)+exp(Psi_s)+exp(Psi_n)); else P = exp(Psi_n)/(exp(Psi_b)+exp(Psi_s)+exp(Psi_n)); endend
Psi_i_k, the function inside P_i, is defined in another file:
function Psi = Psi_i_k(alpha,rho,theta_b,theta_s,beta) Alpha = alpha.^(alpha/(1-alpha)); Buyer = (theta_b*beta).^(rho/(1-rho)); Seller = (theta_s*(1-beta)).^(rho/(1-rho)); Numerator = (1-alpha*beta)*Buyer + (1-alpha*(1-beta))*Seller; Denominator = (Buyer+Seller).^((rho-alpha)/(rho*(1-alpha))); Psi=Alpha*Numerator/Denominator;end
When I run the main script without fmincon, Matlab returns a valid value. But when I run the fmincon function, Matlab returns the following error message:
I have attached a replication file to this post. Could someone please help me figure out what is wrong? Thanks!
Best Answer