Every solver of Class 16 solves a nonlinear problem in every state on every iteration, a maximization or a root of the Euler equation. The endogenous gridpoint method of Carroll (2006) turns the problem around: fix the choice, and find the state in which it is optimal. For the consumption-savings model this needs no optimization and no root finding at all.
Running the code for this lecture
The code for this class is in the folder session17-oct22/ of the course code
repository. It reuses the model and the solvers of Class 16, collected in the module
deaton.py in the same folder.
You should have cloned that repository already — if not, the instructions are in the algorithms and complexity lecture.
Update your copy before the class. Editing a file in place makes git pull refuse to
update it, so discard whatever you changed while experimenting:
cd sb-dse-code
git reset --hard HEAD
git pullNothing in this repository is submitted, so experiment freely — but copy anything you want to keep out of it first, or commit that to a branch of your own.
Setting up the Python environment is covered in Python.
Homework kappa_floor: EGM with a consumption floor
Graded homework: task kappa_floor in the class repository. Collect it and work on a
copy in your own repository:
git pull upstream main # collect the task
cp -r tasks/kappa_floor solutions/kappa_floor # work on the copyAdd a government consumption floor to the consumption-savings model with deterministic income, and solve it with value function iterations with discretized choice and with the EGM solver of this class. Compare the two solutions for several levels of the floor, and explain what you find.
The notebook floor.ipynb in the task folder carries the details of the task, step by
step.
Submit it as a pull request, following the git workflow. One of you presents a solution at the start of the next Tuesday class.
The idea on cake eating¶
Take the cake eating problem. The first order condition for and the envelope theorem,
combine into at every , and into the Euler equation
Read it backwards: given what is left for the future, , and the policy for next period, the Euler equation gives today’s consumption in closed form, and the budget gives the cake size at which that consumption is optimal, .
Value function iterations and time iterations fix a grid on the state and search for the optimal at every point. What does the search cost?
Time: an iterative optimizer or root finder runs in every point of the state space, on every iteration
Accuracy: the wealth level where the borrowing constraint starts to bind is almost never a point of the fixed grid, so the kink of the policy is smeared between two grid points
Reliability: a global maximum is hard to guarantee once the problem is not concave
The endogenous gridpoint method (EGM) fixes a grid on the post-decision state instead, computes directly, and lets the grid on the state come out of the computation, endogenously:
There is no maximization and no root finding, only function evaluations. And the Euler equation holds exactly at the endogenous grid points, so the method is as accurate as time iterations at a fraction of the cost.
The endogenous grid points change from one iteration to the next. Is that not a problem?
Which step of the algorithm would need a root finder if the utility function was more complex than ?
Consumption-savings with random returns (Phelps)¶
Cake eating with a return on savings is the model of Phelps (1962). The consumer has no income and invests all savings in an asset with a random return:
is cash on hand, all resources available in period
are the savings at the end of period
is the gross return on savings, random (marked by tilde), independent over time
is the exponent of the utility function, the coefficient of relative risk aversion is , and as
the horizon is finite, and in the last period the consumer eats everything,
The solution is analytical Hakansson, 1970. With periods to go, the policy is linear in wealth:
and the value function is a power of wealth:
In the logarithmic case , so and , with a constant that depends on the primitives.
As the policy tends to , the cake eating solution, whatever the return.
Verification for one period
In period , with , the first order condition for is
so and .
Substituting and into the Bellman equation,
which is the formula with . Induction on repeats the same steps.
Why is the solution so simple?
utility is homothetic, and wealth next period is proportional to savings, so the problem scales: doubling doubles the optimal
the random return multiplies all of next period’s wealth, so it changes the share consumed through , not the shape of the policy
Is this finite or infinite horizon problem?
How does the share of wealth consumed change as the end of the horizon approaches?
With log utility the policy does not depend on the distribution of at all. Why?
EGM for the consumption-savings model (Deaton)¶
Adding income breaks the simple structure: next period wealth is no longer proportional to savings, the borrowing constraint starts to bind for low wealth.
No closed form solution!
See Carroll & Kimball (1996) for the discussion of all special cases.
In the model of Deaton (1991) the Euler equation holds with an expectation over income, and the post-decision state is savings
Savings determine everything on the right-hand side:
next period wealth for every income draw and,
through next period’s policy, the expected marginal utility.
So for a given policy , every value of gives one point of the updated policy as a parameterized curve defined by
Let’s stop here for a moment..
Ok, back to consumption and savings..
Let be a parameter, and consider the parameterized curve
Here is the policy from the previous iteration of the backward induction or VFI, and is ``known’', approximated by interpolation on the previous iteration endogenous grid over .
With the inverse marginal utility is
The expectation can be computed by quadrature, it is then a weighted sum over the income nodes.
The EGM iterations repeat the step, interpolating the points into the policy for the next step, until the policy stops changing.
In a finite horizon model the same step runs backward in time. The last period policy is , and each EGM step returns the policy one period earlier. Starting the infinite horizon iterations from is the same backward induction, so iteration is the policy periods before the end.
The figure below shows the first iterations on a grid of only five points, starting from the policy , defined by two points: the consumer eats everything.
Source
import numpy as np
import matplotlib.pyplot as plt
def lin(x, xp, fp):
'''Linear interpolation, extrapolated linearly beyond the last point'''
slope = (fp[-1] - fp[-2]) / (xp[-1] - xp[-2])
return np.where(x > xp[-1], fp[-1] + slope * (x - xp[-1]), np.interp(x, xp, fp))
def egm_iterations(beta, R, y, K, A=np.linspace(0, 10, 5), origin=False, title=''):
'''Plot the first K iterations of EGM with log utility and deterministic income y'''
M0, c0 = np.array([0., 10.]), np.array([0., 10.]) # initial policy: consume everything
fig, ax = plt.subplots(1, 3, figsize=(14, 4.2))
ax[2].plot(M0, c0, 'o-', ms=4, lw=0.8, label='iteration 0')
for i in range(1, K + 1):
c1 = np.maximum(lin(R * A + y, M0, c0), 1e-10) # next period consumption, kept positive
c = c1 / (beta * R) # inverted Euler equation: 1/c = beta R / c1
M = A + c # endogenous grid points
if origin: # add the origin: the constrained segment
M, c, Ap = np.r_[0, M], np.r_[0, c], np.r_[np.nan, A]
else:
Ap = A
for k, (x, yy) in enumerate(((Ap, c), (Ap, M), (M, c))):
ax[k].plot(x, yy, 'o-', ms=4, lw=0.8, label=f'iteration {i}')
M0, c0 = M, c
for a, (xl, t) in zip(ax, (('savings A', 'consumption c(A)'), ('savings A', 'wealth M(A)'),
('wealth M', 'consumption c(M)'))):
a.set(xlabel=xl, title=t); a.grid(color='0.9')
ax[2].legend(fontsize=8)
fig.suptitle(title)
plt.show()
egm_iterations(beta=0.95, R=1.0, y=0.0, K=4, title='Cake eating, beta = 0.95, R = 1, y = 0')
Each iteration produces five points of the policy, and the points move: the grid on is a product of the iteration, while the grid on stays put.
Corner solutions¶
The EGM step uses the Euler equation, which holds only at interior solutions!
The constraint needs separate care.
The lower bound never binds when , which holds for and for any CRRA utility with , or any other utility under the Inada conditions.
Handy! Don't need to worry about lower bound in most applicationsThe upper bound binds when the consumer would like to borrow, and then .
Handy!! We control the grid on A!
So, to enforce the constraint, we simply ensure that the exogenous grid on satisfies .
What does EGM step return for ?
Many but unfortunately not all application are subject to the following theorem
The EGM step at gives the largest wealth at which saving nothing is optimal,
and for every the consumer must also save nothing: the constraint binds and .
In the code this is one extra point at the origin, : linear interpolation between it and is exactly the 45-degree segment .

The kink of the policy is located exactly, at an endogenous grid point, and not smeared between two points of a fixed grid as with VFI or time iterations.
This greatly benefits the accuracy of EGM for all the cases where the wealth level in the data/simulation is near the kink of the policy function.
Source
egm_iterations(beta=0.95, R=1.05, y=1.0, K=12, origin=True,
title='Consumption-savings with income, beta = 0.95, R = 1.05, y = 1, origin added')
With income, the consumer with little wealth eats all of it and waits for the next paycheck, and the policy has a kink where the constraint stops binding. Without the point at the origin, the interpolated policy below would be an extrapolation of the interior solution, and the consumer would be allowed to borrow.
Why does the grid on savings start at , and what would a grid point mean?
The kink of the policy at moves from one iteration to the next. How do VFI and time iterations on a fixed grid represent such a kink?
Implementation and comparison¶
The EGM solver for the stochastic model is a few lines, fully vectorized: savings along
the first axis, income nodes along the second, and the expectation as a product with
the weights. It uses the model object and the tools of
Class 16, from the module deaton.py.
Source
import sys, time, pathlib, tempfile, urllib.request
CODE = pathlib.Path('../gh-code/session17-oct22') # the code of Class 16, collected in deaton.py
if not CODE.exists(): # otherwise fetch it from the code repository
CODE = pathlib.Path(tempfile.mkdtemp())
urllib.request.urlretrieve('https://raw.githubusercontent.com/fediskhakov/sb-dse-code/main/session17-oct22/deaton.py',
CODE / 'deaton.py')
sys.path.insert(0, str(CODE))
import deaton # model object and solvers of Class 16def solve_egm(m, maxiter=500, tol=1e-4, callback=None):
'''EGM for the consumption-savings model, returns the policy on the state grid m.grid'''
A = np.linspace(0, m.Mbar, m.ngrid) # grid on savings, the post-decision state
M0, c0 = np.array([0., m.Mbar]), np.array([0., m.Mbar]) # initial policy: consume everything
for i in range(maxiter):
M1 = m.next_wealth(A[:, None], 0, m.quadp[None, :]) # next period wealth: savings x income nodes
c1 = np.maximum(deaton.interp(M1, M0, c0), m.eps) # next period consumption, kept positive
rhs = m.beta * m.R * (m.mu(c1) @ m.quadw) # RHS of the Euler equation
c = np.r_[0., m.imu(rhs)] # inverted Euler equation, origin added
M = np.r_[0., A + c[1:]] # endogenous grid points
err = np.max(np.abs(deaton.interp(m.grid, M, c) - deaton.interp(m.grid, M0, c0)))
if callback: callback(iter=i, M=M, c=c, err=err)
if err < tol: break
M0, c0 = M, c
else:
raise RuntimeError('No convergence: maximum number of iterations achieved')
return deaton.interp(m.grid, M, c) # policy on the fixed grid, to compareThe policy is returned on the fixed state grid of the model, so all four solvers can be compared with the same Euler residuals.
The experiments below use the defaults of the model object of Class 16, unless stated otherwise:
| discount factor | |
| gross return | |
| income | log-normal, , |
| utility | |
| state grid | 100 equally spaced points on , |
| choice grid, discretized VFI | 250 shares of wealth on |
| savings grid, EGM | 100 equally spaced points on |
| quadrature | 10 Gauss–Hermite nodes, the default of deaton.py (quad='legendre' gives Gauss–Legendre on the CDF, as in Class 16) |
| tolerance | 10-4 for the convergence plots, 10-12 for the comparisons |
| grid sizes in the comparisons | 6 sizes from 50 to 500 points, equally spaced in logs, on the state grid, and the same number on the savings grid of EGM; the choice grid stays at 250 |
| Phelps test | no income, |
Convergence of the four solvers¶
The figure shows every iteration of the four solvers on the model of Class 16, from consuming everything to convergence at the tolerance 10-4, darker to lighter.
Source
m = deaton.deaton() # beta = 0.9, R = 1.05, sigma = 0.5, 100 points
runs = {'VFI, discretized choice': lambda cb: deaton.solve_vfi(m, deaton.bellman_discretized, callback=cb),
'VFI, continuous choice': lambda cb: deaton.solve_vfi(m, deaton.bellman_continuous, callback=cb),
'time iterations': lambda cb: deaton.solve_timeiter(m, callback=cb),
'EGM': lambda cb: solve_egm(m, callback=cb)}
fig, axes = plt.subplots(2, 2, figsize=(14, 10), sharex=True, sharey=True)
for ax, (name, run) in zip(axes.ravel(), runs.items()):
iters = [] # the callback collects the policy of every iteration
def collect(**kw):
iters.append((m.grid, kw['policy']) if 'policy' in kw else (kw['M'], kw['c'])) # EGM: endogenous grid
run(collect)
for (M, c), col in zip(iters, plt.cm.viridis(np.linspace(0, 1, len(iters)))):
ax.plot(M, c, color=col, lw=0.8)
ax.plot(*iters[-1], 'k-', lw=2, label=f'converged after {len(iters)} iterations')
ax.plot(m.grid, m.grid, 'k:', lw=0.8)
ax.set(title=name, xlim=(0, m.Mbar), ylim=(0, 3.5))
ax.grid(color='0.9'); ax.legend(loc='lower right')
for ax in axes[1]: ax.set(xlabel='wealth M')
for ax in axes[:, 0]: ax.set(ylabel='consumption c')
plt.tight_layout(); plt.show()
All four arrive at the same policy. VFI needs 63 iterations, at the rate of the contraction of the Bellman operator, time iterations and EGM about 26. An EGM iteration is also the cheapest: no optimizer and no root finder, only interpolation and arithmetic.
Accuracy and speed as the grid grows¶
Each solver now runs on 6 grids from 50 to 500 points with the tight tolerance 10-12, so that what we measure is the error of the grid and not of the stopping rule. The figure shows the Euler residuals and the run time on the model with income risk, . A solver that does not reach the tolerance within 2000 iterations would be left out of the plot for that grid.
Source
tol, maxiter = 1e-12, 2000
solvers = {'VFI, discretized choice': lambda m: deaton.solve_vfi(m, deaton.bellman_discretized, tol=tol, maxiter=maxiter),
'VFI, continuous choice': lambda m: deaton.solve_vfi(m, deaton.bellman_continuous, tol=tol, maxiter=maxiter),
'time iterations': lambda m: deaton.solve_timeiter(m, tol=tol, maxiter=maxiter),
'EGM': lambda m: solve_egm(m, tol=tol, maxiter=maxiter)}
grids = np.unique(np.geomspace(50, 500, 6).round().astype(int)) # 6 grid sizes, equally spaced in logs
def attempt(solve, m):
'''Solve the model, or return None if the solver does not converge within maxiter'''
try:
return solve(m)
except RuntimeError:
return None
res = {name: {'euler': [], 'time': []} for name in solvers}
for name, solve in solvers.items():
for n in grids:
m = deaton.deaton(ngrid=n) # income risk, sigma = 0.5
t0 = time.perf_counter()
c = attempt(solve, m)
res[name]['time'].append(np.nan if c is None else time.perf_counter() - t0)
res[name]['euler'].append(np.nan if c is None else deaton.accuracy(m, c))
titles = {'euler': 'Mean |relative Euler residual|, σ = 0.5',
'time': 'Run time in seconds, σ = 0.5'}
fig, axes = plt.subplots(2, 1, figsize=(12, 10))
for ax, (key, title) in zip(axes, titles.items()):
for name in solvers:
ax.plot(grids, res[name][key], 'o-', label=name)
ax.set(xscale='log', yscale='log', xlabel='grid points', title=title)
ax.set_xticks(grids, [str(n) for n in grids]); ax.minorticks_off()
ax.grid(color='0.9'); ax.legend()
plt.tight_layout(); plt.show()
Euler residuals: EGM and time iterations are the most accurate and improve fastest with the grid, to a few times 10-5 on the finest grid. VFI with continuous choice follows, and the discretized solver stalls at a few times 10-3, capped by its choice grid.
Run time: EGM takes from 2 to 15 milliseconds, two to three orders of magnitude less than the other three, whose run time grows linearly with the grid.
EGM is as accurate as time iterations, the most accurate of the earlier solvers, at a tiny fraction of the cost. All of the speed comes from replacing the search in every state by a closed-form inversion of the Euler equation.
How EGM compares to the analytical solution¶
The deterministic Phelps model with log utility, no income and a fixed return has the analytical policy in the infinite horizon. The model object of Class 16 covers it once the income nodes are set to zero. The table reports the largest absolute difference between the EGM policy and the analytical one on the grid.
Source
print(f'{"grid":>5} {"max |c(M) - (1 - beta) M|":>27}')
for n in grids:
m = deaton.deaton(ngrid=n, nquad=2)
m.quadp = np.zeros(2) # no income: the deterministic Phelps model
c = solve_egm(m, tol=tol, maxiter=maxiter)
print(f'{n:>5} {np.max(np.abs(c - (1 - m.beta) * m.grid)):>27.2e}') grid max |c(M) - (1 - beta) M|
50 8.45e-12
79 8.45e-12
126 8.45e-12
199 8.45e-12
315 8.45e-12
500 8.45e-12
EGM reproduces the analytical policy to about 10-11 on every grid, the precision of the stopping rule, not of the grid. The policy is linear in wealth, and linear interpolation reproduces it without error.
The class of models EGM solves¶
EGM in this form solves problems with one continuous state, wealth , one continuous choice, consumption , and possibly exogenous states :
with the following properties:
utility: and , and the inverse marginal utility has an analytical form
post-decision state: next period wealth depends on only through savings , by a differentiable function with ; in the Deaton model , in the Phelps model
exogenous states:
constraint: , that is , possibly binding
horizon: finite or infinite, in discrete time
Under these properties the Euler equation can be inverted at any point of a grid, without root finding:
Additional state variables are fine if they evolve exogenously, or as functions of rather than of or . The class is small, but it includes many workhorse models of micro and macro economics, and within it EGM is by far the best available method.
The general theory of EGM:
White (2015): the invertibility condition for the system of non-linear first order conditions
Druedahl & Jørgensen (2017): a sufficient condition, that a particular mapping is an injection
Iskhakov (2015): analytical invertibility, to avoid root-finding operations altogether
Where it breaks:
Several continuous states and choices. The Euler equations form a system, which in general needs a multidimensional root finder, and the endogenous grid is irregular, so interpolating on it is hard and slow. A class of triangular problems avoids the root finder, see multidimensional EGM below.
Non-convex problems. With a discrete choice on top of consumption, for example retirement, the value function has kinks, the Euler equation is necessary but no longer sufficient, and EGM finds every solution of it, including the suboptimal ones. An upper envelope step removes them Fella, 2014Iskhakov et al., 2017Druedahl & Jørgensen, 2017: this is the DC-EGM of the next class.
Which features of the Rust bus engine model of Class 9 rule out EGM?
A model has wealth and human capital, both continuous. What happens to the endogenous grid?
Bout would it not be great if we could avoid root finding in multidimensional problems too?..
Interpolation on irregular grids¶
Even when the Euler equations can be inverted, a second problem remains, and it is the fundamental one. In one dimension the endogenous grid is just a sorted set of points, and interpolating on it is as easy as on a fixed grid. In several dimensions it is not a grid at all in the usual sense:
a rectangular grid on the post-decision states maps into endogenous points that are not a product of one-dimensional grids: the rows bend, and the points spread unevenly
to find next period’s choices at an arbitrary point we must first locate the cell of the endogenous grid that contains it, which on a rectangular grid is index arithmetic, and here is a search
within the cell we must define the interpolant, but the cell is not a rectangle, so multilinear interpolation does not apply directly
some points fall outside the region covered by the endogenous points

An endogenous grid in a two-dimensional model where the points come from a rectangular grid on the post-decision states.
The literature suggests several remedies:
| Paper | Suggested remedy |
|---|---|
| Barillas & Fernández-Villaverde (2007) | avoid the irregular grid: EGM in one choice, value function iterations in the others |
| Brumm & Grill (2014) | Delaunay triangulation of the endogenous points, linear interpolation within each triangle |
| Ludwig & Schön (2018) | Delaunay interpolation and hybrid methods compared; the cost of the triangulation can offset the speed of EGM |
| White (2015) | use the index structure inherited from the rectangular grid: locate the cell by a visibility walk, map it to the unit square, interpolate multilinearly |
| Druedahl & Jørgensen (2017) | re-interpolate on a regular grid while performing the upper envelope step |
| Lujan (2026) | interpolate in the index coordinates of the endogenous grid, with no triangulation |
Why is locating the cell trivial on a rectangular grid, and what is its cost on an irregular one with points?
Which of the approaches still works if the endogenous points cross each other, so that neighboring cells overlap?
Several continuous choices without rootfinding: multidimensional EGM¶
A model of wealth and health, or of liquid and illiquid assets, has several continuous states and several continuous choices. EGM carries over without root finding when the problem is triangular Iskhakov, 2015Iskhakov, 2017: the Euler equations can be solved one at a time, each by an analytical inversion.
Take a triangular example in :
is the vector of resources at time
is the utilization of resources
are the resources at the end of , the post-decision states
is the intra-temporal evolution
is the inter-temporal evolution, the budget constraint
are idiosyncratic stochastic shocks
is the utility of current resource utilization
The plan: apply the EGM ideas to discover the necessary assumptions on the fundamentals of the problem that make it possible, abstracting away from the budget constraint and other feasibility restrictions.
Post-decision states¶
We have already assumed that
which allows replacing the condition in the expectation in the Bellman equation:
The post-decision states are sufficient statistics for .
The corrigendum Iskhakov, 2017 completes the condition: the partial derivatives of with respect to the choices must depend on the period variables only through the post-decision states, so that the Euler equations below can be evaluated at a point of the grid on .
Bellman optimization, first order and envelope conditions¶
With the inter-temporal evolution written out by component, the Bellman equation is
The first order conditions are
and the envelope conditions are
Combining these with the first order conditions, we have
The system of Euler equations¶
The partial derivatives of the value function are now expressed as linear functions of the marginal utilities , with coefficients given by the partial derivatives of the functions . In period they give the system of Euler equations
is interpolated from the previous iteration of backward induction
the right-hand side is then known, and we need to solve for
Sufficient conditions for EGM to be applicable¶
The proof is constructive: follow the EGM step for a grid imposed over the post-decision state space.
None of the steps searches. What remains costly is what the method does not remove:
the curse of dimensionality: the grid on has points, and the expectation in step 3 is an integral over all shocks
interpolation on an irregular grid in step 2: the endogenous points form a grid that is not rectangular, as the example below shows
Interpolation and other multidimensional generalizations¶
The irregular endogenous grid, and the conditions under which the Euler system can be inverted at all, are what the literature on multidimensional EGM works on:
| Paper | Idea |
|---|---|
| Barillas & Fernández-Villaverde (2007) | EGM in one choice, value function iterations in the rest |
| Hintermaier & Koeniger (2010) | occasionally binding constraints among several endogenous states, via Kuhn–Tucker conditions |
| Brumm & Grill (2014), Ludwig & Schön (2018) | Delaunay triangulation for interpolation on the irregular grid; its cost can offset the speed of EGM |
| White (2015) | general theory, an invertibility condition, and interpolation that uses the order of the endogenous points |
| Iskhakov (2015) | the class of triangular problems solvable without root finding |
| Druedahl & Jørgensen (2017) | non-convexities and constraints, re-interpolating on a regular grid during an upper envelope step |
| Lujan (2026) | a choice in several dimensions as a sequence of one-dimensional choices |
| Hallengreen et al. (2024) | EGM when the inverse marginal utility has no closed form |
Two of these ideas are worth seeing in detail.
Choices in sequence. Split the period into a sequence of choices, each with its own pre-decision state and post-decision state , chained by , with the shocks realized only between periods:
Each post-decision state then depends only on the earlier choices, which is the triangular structure of TRI1, and each step is a one-dimensional EGM Lujan, 2026.
No analytical inverse. Precompute the marginal utility on a fixed grid, interpolate it, and invert the interpolant numerically. The rest of the EGM step is unchanged, and the method stays an order of magnitude faster than the traditional ones Hallengreen et al., 2024.
Which conditions of the definition of a triangular problem does the sequential formulation satisfy by construction?
Which is cheaper in two dimensions: Delaunay triangulation of the endogenous grid, or a root finder in every point of a regular grid?
- Carroll, C. D. (2006). The method of endogenous gridpoints for solving dynamic stochastic optimization problems. Economics Letters, 91(3), 312–320. 10.1016/j.econlet.2005.09.013
- Phelps, E. S. (1962). The accumulation of risky capital: A sequential utility analysis. Econometrica, 30(4), 729–743. 10.2307/1909322
- Hakansson, N. H. (1970). Optimal investment and consumption strategies under risk for a class of utility functions. Econometrica, 38(5), 587–607. 10.2307/1912196
- Carroll, C. D., & Kimball, M. S. (1996). On the concavity of the consumption function. Econometrica, 64(4), 981–992. 10.2307/2171853
- Deaton, A. (1991). Saving and Liquidity Constraints. Econometrica, 59(5), 1221–1248. 10.2307/2938366
- White, M. N. (2015). The method of endogenous gridpoints in theory and practice. Journal of Economic Dynamics and Control, 60, 26–41. 10.1016/j.jedc.2015.08.001
- Druedahl, J., & Jørgensen, T. H. (2017). A general endogenous grid method for multi-dimensional models with non-convexities and constraints. Journal of Economic Dynamics and Control, 74, 87–107. 10.1016/j.jedc.2016.11.005
- Iskhakov, F. (2015). Multidimensional endogenous gridpoint method: Solving triangular dynamic stochastic optimization problems without root-finding operations. Economics Letters, 135, 72–76. 10.1016/j.econlet.2015.07.033
- Fella, G. (2014). A generalized endogenous grid method for non-smooth and non-concave problems. Review of Economic Dynamics, 17(2), 329–344. 10.1016/j.red.2013.07.001
- Iskhakov, F., Jørgensen, T., Rust, J., & Schjerning, B. (2017). The endogenous grid method for discrete-continuous dynamic choice models with (or without) taste shocks. Quantitative Economics, 8(2), 317–365. https://doi.org/10.3982/QE643
- Barillas, F., & Fernández-Villaverde, J. (2007). A generalization of the endogenous grid method. Journal of Economic Dynamics and Control, 31(8), 2698–2712. 10.1016/j.jedc.2006.08.005
- Brumm, J., & Grill, M. (2014). Computing equilibria in dynamic models with occasionally binding constraints. Journal of Economic Dynamics and Control, 38, 142–160. 10.1016/j.jedc.2013.09.007
- Ludwig, A., & Schön, M. (2018). Endogenous Grids in Higher Dimensions: Delaunay Interpolation and Hybrid Methods. Computational Economics, 51(3), 463–492. 10.1007/s10614-016-9611-2
- Lujan, A. (2026). The Sequential Endogenous Grid Method. Journal of Economic Dynamics and Control, 105442. 10.1016/j.jedc.2026.105442
- Iskhakov, F. (2017). Corrigendum to “Multidimensional endogenous gridpoint method: Solving triangular dynamic stochastic optimization problems without root-finding operations” [Econom. Lett. 135 (2015) 72–76]. Economics Letters, 150, 26. 10.1016/j.econlet.2016.11.002