def _cFuncLinear(aXtraGrid, mNrmMinNow, mNrmNow, cNrmNow, MPCminNow, hNrmNow): mNrmGrid = mNrmMinNow + aXtraGrid mNrmCnst = np.array([mNrmMinNow, mNrmMinNow + 1]) cNrmCnst = np.array([0.0, 1.0]) cFuncNowCnst = linear_interp_fast(mNrmGrid.flatten(), mNrmCnst, cNrmCnst) cFuncNowUnc = linear_interp_fast(mNrmGrid.flatten(), mNrmNow, cNrmNow, MPCminNow * hNrmNow, MPCminNow) cNrmNow = np.where(cFuncNowCnst <= cFuncNowUnc, cFuncNowCnst, cFuncNowUnc) return cNrmNow, mNrmGrid
def _solveConsIndShockLinearNumba( mNrmMinNext, mNrmNext, CRRA, mNrmUnc, cNrmUnc, DiscFacEff, Rfree, PermGroFac, PermShkVals_temp, ShkPrbs_temp, aNrmNow, BoroCnstNat, cFuncInterceptNext, cFuncSlopeNext, ): """ Calculate end-of-period marginal value of assets at each point in aNrmNow. Does so by taking a weighted sum of next period marginal values across income shocks (in a preconstructed grid self.mNrmNext). """ mNrmCnst = np.array([mNrmMinNext, mNrmMinNext + 1]) cNrmCnst = np.array([0.0, 1.0]) cFuncNextCnst = linear_interp_fast(mNrmNext.flatten(), mNrmCnst, cNrmCnst) cFuncNextUnc = linear_interp_fast( mNrmNext.flatten(), mNrmUnc, cNrmUnc, cFuncInterceptNext, cFuncSlopeNext ) cFuncNext = np.minimum(cFuncNextCnst, cFuncNextUnc) vPfuncNext = utilityP(cFuncNext, CRRA).reshape(mNrmNext.shape) EndOfPrdvP = ( DiscFacEff * Rfree * PermGroFac ** (-CRRA) * np.sum(PermShkVals_temp ** (-CRRA) * vPfuncNext * ShkPrbs_temp, axis=0) ) # Finds interpolation points (c,m) for the consumption function. cNrmNow = utilityP_inv(EndOfPrdvP, CRRA) mNrmNow = cNrmNow + aNrmNow # Limiting consumption is zero as m approaches mNrmMin cNrm = _np_insert(cNrmNow, 0, 0.0, axis=-1) mNrm = _np_insert(mNrmNow, 0, BoroCnstNat, axis=-1) return (cNrm, mNrm, EndOfPrdvP)
def _find_mNrmStELinear( m, PermGroFac, Rfree, Ex_IncNext, mNrmMin, mNrm, cNrm, MPC, MPCmin, hNrm ): # Make a linear function of all combinations of c and m that yield mNext = mNow mZeroChange = (1.0 - PermGroFac / Rfree) * m + (PermGroFac / Rfree) * Ex_IncNext mNrmCnst = np.array([mNrmMin, mNrmMin + 1]) cNrmCnst = np.array([0.0, 1.0]) cFuncNowCnst = linear_interp_fast(np.array([m]), mNrmCnst, cNrmCnst) cFuncNowUnc = linear_interp_fast(np.array([m]), mNrm, cNrm, MPCmin * hNrm, MPCmin) cNrmNow = np.where(cFuncNowCnst <= cFuncNowUnc, cFuncNowCnst, cFuncNowUnc) # Find the steady state level of market resources res = cNrmNow[0] - mZeroChange # A zero of this is SS market resources return res