@fanxy
2020-11-23T09:47:45.000000Z
字数 2610
阅读 2862
樊潇彦 复旦大学经济学院 数量经济学
setwd("D:\\...") # 设定工作目录rm(list=ls()) # 清内存# "Ctrl"+"L" 清除命令窗口
T=10;k0=kT=0w=1beta=0.95R=1/beta+c(0.1,0,-0.1) # 比较三种beta*R的情况,利率 R=1+rdim1=c("c","k") # 把结果存为3维数组x,行为变量名 c,kdim2=c(1:T) # 列为时间 1,2...Tdim3=paste("beta*R=",round(beta*R,2)) # 高为 beta*R 的三种情况x=array(rep(NaN,2*T*length(R)),c(2,T,length(R)),dimnames=list(dim1,dim2,dim3))tol=0.00001; # 循环的参数设置maxloop=100;par(mfrow=c(length(R),1)) # 做图窗口,3张图for (case in 1:length(R)){ # 分情况搜索的循环Phi = matrix(c(beta*R[case],-1,0,R[case]),2,2)c_max=w/(1/beta-1) # 猜测区间。c_max > w 允许负债 k<0c_min=0.01 # c_min > 0error=2*tol; loop=0while (error>tol & loop<maxloop){c_guess=(c_min+c_max)/2 # c 的初始猜测c=rep(c_guess,T) # 初始化路径k=rep(k0,T)x[,,case]=rbind(c,k)for (t in 2:T){ # 更新路径x[,t,case]=Phi %*% matrix(x[,t-1,case]) +c(0,w)}if (x[2,T,case]<kT){ # 判断初始猜测是否过高c_max=c_guess # 调低上限} else{c_min=c_guess # 调高下限}error= abs(x[2,T,case]-kT) # 用于决断是否收敛loop=loop+1}matplot(t(x[,,case]),col=c("red","blue"),type="l", ylim=range(-2,2), main=dim3[case], ylab="")}

T=20beta=0.95; gamma=1z=5; alpha=0.4; delta=1kstar=(alpha*z/(1/beta+delta-1))^(1/(1-alpha)) # 稳态cstar=((1/beta+delta-1)/alpha-delta)*kstarcasetype=c(0.5,1.5)k0vector=kstar*casetype # 两种初始k0tol=0.0001; # 循环的参数设置maxloop=100;datax=data.frame() # 准备存放数据
for (case in 1:length(k0vector)){k0=k0vector[case]c_max=z*k0^alpha+(1-delta)*k0-0.01 # 生产函数要求 k_t+1 > 0,构成c的上限c_min=0.01 # c > 0error=2*tol; loop=0while (error>tol & loop<maxloop){c_guess=(c_min+c_max)/2 # c 的初始猜测c=rep(c_guess,T) # 初始化路径k=rep(k0,T)for (t in 2:T){ # 更新路径c[t]=c[t-1]*(beta*(alpha*z*k[t-1]^(alpha-1)+1-delta))^(1/gamma)k[t]=z*k[t-1]^alpha+(1-delta)*k[t-1]-c[t]if (c[t]>c[t-1]& k[t]<k[t-1]){ # 判断初始猜测是否过高c_max=c_guess # 落入左上区域,调低上限break} # 中止循环else if (c[t]<c[t-1] & k[t]>k[t-1]){c_min=c_guess # 落入右下区域,调高下限break # 中止循环}}if (t==T & k[T]<kstar){ # 判断初始猜测是否过高c_max=c_guess # 调低上限error= abs(k[T]-kstar) # 用于决断是否收敛} else if (t==T & k[T]>kstar){c_min=c_guess # 调高下限error= abs(k[T]-kstar) # 用于决断是否收敛} # end of for()loop=loop+1} # end of while() for shootingx=data.frame(c,k,rep(cstar,T),rep(kstar,T))datax=rbind(datax,x)matplot(as.matrix(x), type="l",col=c("red","blue","pink","green"),main=paste("c_t and k_t with k0=",casetype[case],"*kstar"))legend("bottomright",c("c_t","k_t","cstar","kstar"),col=c("red","blue","pink","green"),lty=1)} # end of grid of k0vector

datax$kss=z*datax$k^alpha-delta*datax$klibrary(ggplot2)ggplot(data=datax,legend=TRUE) +geom_vline(xintercept=kstar,colour="red") +geom_line(aes(x=k,y=kss),colour="blue") +geom_line(aes(x=k,y=c),colour="black") +ylab("c_t") + xlab("k_t") + xlim(k0vector) +theme(panel.background=element_rect(fill='transparent', color='gray'))
