fminbnd not working for a single variable optimization problem

조회 수: 5 (최근 30일)
David Hong
David Hong 2022년 4월 3일
댓글: David Hong 2022년 4월 3일
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.

채택된 답변

Torsten
Torsten 2022년 4월 3일
k1=fminbnd(@(k)valfun3(k,k0,z0,a0),kmin,kmax);
instead of
k1=fminbnd(@valfun3,kmin,kmax);

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Symbolic Math Toolbox에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by