def stochEatCake(beta, N, e_params, W_max=1., plot=False, iid=True): #step 1 if iid: e, gamma = discretenorm(*e_params) else: e, gamma = tauchenhussey(*e_params) #step 2 w = np.linspace(0,W_max,N) #step 3 v = np.zeros((N,K)) p = np.zeros((N,K)) #step 4 actions = np.tile(w, N).reshape((N,N)).T actions = actions - actions.T actions[actions<0] = 0 u = np.sqrt(actions) u_hat = np.repeat(u,K).reshape((N,N,K))*e delta = 2. while delta >= 1e-9: #step 5 if iid: E = (v*gamma).sum(axis=1) else: E = v.dot(gamma.T) #step 6 if iid: c = np.swapaxes(np.swapaxes(u_hat, 1, 2)+beta*E, 1, 2) else: c = u_hat + beta*E c[np.triu_indices(N, k=1)] = -1e10 v_new = np.max(c, axis=1) max_indices = np.argmax(c, axis=1) p = w[max_indices] #step 7 delta = math.sqrt(((v_new - v)**2).sum()) v = v_new #step 8 if plot: x = np.arange(0,N) y = np.arange(0,K) X,Y = np.meshgrid(x,y) fig1 = plt.figure() ax1 = Axes3D(fig1) ax1.plot_surface(w[X], Y, v.T, cmap=cm.coolwarm) plt.show() fig2 = plt.figure() ax2 = Axes3D(fig2) ax2.plot_surface(w[X], Y, p.T, cmap=cm.coolwarm) plt.show() return v, p
def stochEatCake(beta, N, e_params, W_max=1., plot=False, iid=True): #step 1 if iid: e, gamma = discretenorm(*e_params) else: e, gamma = tauchenhussey(*e_params) #step 2 w = np.linspace(0, W_max, N) #step 3 v = np.zeros((N, K)) p = np.zeros((N, K)) #step 4 actions = np.tile(w, N).reshape((N, N)).T actions = actions - actions.T actions[actions < 0] = 0 u = np.sqrt(actions) u_hat = np.repeat(u, K).reshape((N, N, K)) * e delta = 2. while delta >= 1e-9: #step 5 if iid: E = (v * gamma).sum(axis=1) else: E = v.dot(gamma.T) #step 6 if iid: c = np.swapaxes(np.swapaxes(u_hat, 1, 2) + beta * E, 1, 2) else: c = u_hat + beta * E c[np.triu_indices(N, k=1)] = -1e10 v_new = np.max(c, axis=1) max_indices = np.argmax(c, axis=1) p = w[max_indices] #step 7 delta = math.sqrt(((v_new - v)**2).sum()) v = v_new #step 8 if plot: x = np.arange(0, N) y = np.arange(0, K) X, Y = np.meshgrid(x, y) fig1 = plt.figure() ax1 = Axes3D(fig1) ax1.plot_surface(w[X], Y, v.T, cmap=cm.coolwarm) plt.show() fig2 = plt.figure() ax2 = Axes3D(fig2) ax2.plot_surface(w[X], Y, p.T, cmap=cm.coolwarm) plt.show() return v, p
def Problem5Real(): sigma = .5 mu = 4*sigma K = 7 Gamma, eps = discretenorm(K,mu,sigma) N = 100 W = sp.linspace(0,1,N) V = sp.zeros((N,K)) u = lambda c: sp.sqrt(c) beta = 0.99 X,Y= sp.meshgrid(W,W) Wdiff = Y-X index = Wdiff < 0 Wdiff[index] = 0 util_grid = u(Wdiff) util3 = sp.tile(util_grid[:,:,sp.newaxis],(1,1,K)) eps_grid = eps[sp.newaxis,sp.newaxis,:] eps_util = eps_grid*util3 Gamma_grid = Gamma[sp.newaxis,:] delta = 1 Vprime = V z = 0 while (delta > 10**-9): z= z+1 V = Vprime gamV = Gamma_grid*V Expval = sp.sum(gamV,1) Exp_grid = sp.tile(Expval[sp.newaxis,:,sp.newaxis],(N,1,K)) arg = eps_util+beta*Exp_grid arg[index] = -10^10 Vprime = sp.amax(arg,1) psi_ind = sp.argmax(arg,1) psi = W[psi_ind] delta = sp.linalg.norm(Vprime - V) return Vprime,psi
def Problem2Real(): sigma = .5 mu = 4*sigma K = 7 Gamma, eps = discretenorm(K,mu,sigma) N = 100 W = sp.linspace(0,1,N) V = sp.zeros((N,K)) u = lambda c: sp.sqrt(c) beta = 0.99 X,Y= sp.meshgrid(W,W) Wdiff = Y-X index = Wdiff < 0 Wdiff[index] = 0 util_grid = u(Wdiff) util3 = sp.tile(util_grid[:,:,sp.newaxis],(1,1,K)) eps_grid = eps[sp.newaxis,sp.newaxis,:] eps_util = eps_grid*util3 Gamma_grid = Gamma[sp.newaxis,:] delta = 1 Vprime = V z = 0 while (delta > 10**-9): z= z+1 V = Vprime gamV = Gamma_grid*V Expval = sp.sum(gamV,1) Exp_grid = sp.tile(Expval[sp.newaxis,:,sp.newaxis],(N,1,K)) arg = eps_util+beta*Exp_grid arg[index] = -10^10 Vprime = sp.amax(arg,1) psi_ind = sp.argmax(arg,1) psi = W[psi_ind] delta = sp.linalg.norm(Vprime - V) return Vprime,psi
left = lower prob = sp.zeros(K) eps = sp.zeros(K) for k in range(K): prob[k] = st.norm.cdf(left+inc,mu,sigma) - st.norm.cdf(left,mu,sigma) eps[k] = left + .5*inc left = left + inc return prob, eps #Problem 2===================================================================== sigma = .5 mu = 4*sigma K = 7 Gamma, eps = discretenorm(K,mu,sigma) N = 100 W = sp.linspace(0,1,N) V = sp.zeros((N,K)) u = lambda c: sp.sqrt(c) beta = 0.99 X,Y= sp.meshgrid(W,W) Wdiff = Y-X index = Wdiff < 0 Wdiff[index] = 0 util_grid = u(Wdiff)