fminbnd not working for a single variable optimization problem
2 views (last 30 days)
Show older comments
Hello,
I'm attempting to solve a single variable optimization problem however the function is quite complicated that requires 2 steps of optimizations for a given target variable. My issue is my specified function is stating I have too little inputs.
clear all;
global beta delta alpha kmat zmat t_matrix V_0 gamma
alpha = 0.2;
beta = 0.9;
delta = 0.1;
gamma = 2;
rho = 0.6;
mu=0;
sigma_z=0.6;
delta=0.05
%Steady State Computation
syms kstar cstar hstar x
eqns = [alpha*kstar^(alpha - 1)*hstar^(1-alpha) - (1/beta-1+delta)==0,
cstar^(-gamma)*(1-alpha)*kstar^alpha*hstar^(-alpha) == 1/(1-hstar),
cstar+delta*kstar == kstar^alpha*hstar^(1-alpha)];
sol = vpasolve(eqns, [kstar cstar hstar],[0.1 0.1 0.1]);
kstar = double(sol.kstar)
cstar = double(sol.cstar)
hstar = double(sol.hstar)
%Discretization
kmin=[0.1*kstar 0.01];
kmin=max(kmin);
kmax=[1.75*kstar 1];
kmax=min(kmax);
kgrid=30;
zgrid=10;
dev=1;
kmat = linspace(kmin,kmax,kgrid);
[zmat, t_matrix] = tauchen(zgrid,mu,rho,sigma_z,dev); %Discretization of AR 1 Process
s = meshgrid(kmat,kmat,zmat);
size(s)
V_0 = meshgrid(zmat,kmat);
for i = 1:size(s,1)
for m = 1:size(s,3)
V_0(i,m) = (((exp(zmat(m))*kmat(i)^alpha*hstar^(1-alpha) -delta*kmat(i))^alpha...
*(1-hstar)^(1-alpha))^(1-gamma)/(1-gamma))/(1-beta);
end
end
V_0 = real(V_0);
maxits = 1000;
eps = 1e-7;
dif=eps+1000;
its=0;
%Finding the maximum and iterating
while dif>eps && its<maxits
for j=1:zgrid
for i=1:kgrid
k0=kmat(1,i);
z0=zmat(j,1);
a0=t_matrix(j,:);
k1=fminbnd(@valfun3,kmin,kmax);
v1(i,j)=-valfun3(k1,k0,z0,a0);
k11(i,j)=k1;;
end
end
dif=norm(v1-v0)
v0=v1;
its=its+1
end
function val=valfun3(k,k0,z0,a0)
global beta delta alpha kmat zmat V_0 gamma
g = interp2(zmat,kmat,V_0,zmat',k,'linear');
C = exp(z0)*k0^(alpha)*labor(k,k0,z0)^(1-alpha) + (1-delta)*k0-k;
if C<=0
val=-888888888888888-8000*abs(C);
else
val=(exp(z0)*k0^(alpha)*labor(k,k0,z0)^(1-alpha) + (1-delta)*k0-k)^(1-gamma)/(1-gamma) + log(1-labor(k,k0,z0))+beta*(g*a0');
end
val=-val;
end
function h=labor(k,k0,z0)
global delta alpha gamma
syms y
f = 1/(1-y)*(exp(z0)*k0^alpha*y^(1-alpha)+(1-delta)*k0 - k)^gamma-(1-alpha)*exp(z0)*k0^alpha*y^(-alpha)==0;
h=double(vpasolve(f,y,[0 1]));
end
Thanks for any guidance ahead of time.
0 Comments
Accepted Answer
Torsten
on 3 Apr 2022
k1=fminbnd(@(k)valfun3(k,k0,z0,a0),kmin,kmax);
instead of
k1=fminbnd(@valfun3,kmin,kmax);
More Answers (0)
See Also
Categories
Find more on Symbolic Math 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!