SPB Git

spb/wp29_uqo

Public

# F5-conf-04 — VFI vs closed-form policy, optimal growth with log utility

# Question

A planner maximises Σ β^t ln c_t subject to y_{t+1} = (y_t − c_t)^α (Cobb–Douglas, full depreciation, productivity 1). We compare the closed-form solution of V(y) = max_{0<c<y} {ln c + β V((y−c)^α)} with value-function iteration (VFI) on the prescribed grid, at y = 0.5, 1, 2, and at V(1).

# Data and exclusions

Only data/model.csv (10 parameter rows, n_input_rows) is used: α = 0.36, β = 0.95, a grid of 400 points equally spaced in ln y on [0.05, 5] (grid_points_used, n_analysed), VFI tolerance 1e-8, evaluation points 0.5, 1.0, 2.0. Nothing was excluded (out/exclusions.csv, 10 → 10). The SHA-256 matches the bundle manifest (out/state/data_audit.md). None of the evaluation points is a grid node; see data_issues.

# Method

Closed form (guess and verify). Guess V(y) = A + B ln y. The right-hand side is ln c + β(A + Bα ln(y−c)). The first-order condition 1/c = αβB/(y−c) gives c = y/(1+αβB). Matching the ln y coefficients gives B = 1 + αβB, so B = 1/(1−αβ). Then c(y) = (1−αβ) y and the savings rate is (y−c)/y = αβ. Matching the constants gives A = [ln(1−αβ) + (αβ/(1−αβ)) ln(αβ)]/(1−β). With these parameters, B = 1.5198 (diag_closed_form_B) and A = −19.5244 (diag_closed_form_A). This rests on four assumptions: log utility; Cobb–Douglas technology y' = k^α with 0<α<1; full depreciation, with productivity normalised to 1; and an interior solution (0 < c < y, guaranteed because ln c → −∞ at c→0 and ln(y−c) → −∞ at c→y). Both functions are concave, so the first-order condition is sufficient. As a numerical check, brute-force maximisation of the Bellman right-hand side at y = 1 recovers V(1) and c = 0.658 to about 1e-13 (out/state/checks.md, item 2).

Contraction. The Bellman operator T is monotone, and it discounts: T(V + a) = TV + βa. By Blackwell's sufficient conditions it is therefore a contraction in the sup norm with modulus β = 0.95 (contraction_modulus). One caveat: ln is unbounded, so on all of (0, ∞) the argument needs a weighted norm. On the compact grid used here, every per-period utility is finite and the bounded-function argument applies directly.

VFI. We use discrete-choice VFI on the prescribed grid. For each grid point y_i, the choice is next-period output y'j on the same grid, with consumption c_ij = y_i − (y'j)^{1/α}. Infeasible pairs (c ≤ 0) get −∞. Iteration starts at V_0 = 0 and stops when ‖V{n+1} − V_n‖∞ < 1e-8. The closed form is never used inside the VFI. The policy c(y_i) comes from the argmax. Values at the off-grid evaluation points are linear interpolations in ln y between neighbouring nodes. No randomness is involved (random_seed = null).

# Results

y closed form c VFI c
0.5 0.329 (c_closed_y05) 0.32882 (c_num_y05)
1.0 0.658 (c_closed_y1) 0.65899 (c_num_y1)
2.0 1.316 (c_closed_y2) 1.30963 (c_num_y2)
  • The largest absolute policy discrepancy across the three points is 0.00637 (max_abs_error_policy), at y = 2. That is about 0.5% of consumption.
  • V(1) is −19.52441 from the closed form (value_closed_y1) and −19.52476 from VFI (value_num_y1), a gap of −3.4e-4 utils (diag_value_error_y1).
  • The closed-form savings rate is αβ = 0.342 (savings_rate_closed_form). This is the baseline.
  • VFI met the stopping rule after 361 iterations (n_iterations), with a final sup change of 9.997e-9 (final_sup_change). Status is feasibility = "complete".

# Uncertainty

The model is deterministic, so there is no sampling uncertainty. The numerical error has two parts.

  1. Iteration error. It is bounded by β/(1−β)·‖V_n − V_{n−1}‖ = 1.9e-7 utils (diag_vfi_error_bound_beta_over_1mbeta_times_final_change). This is negligible.
  2. Discretisation and interpolation error. This part dominates. It depends on the log grid step of 0.01154 (diag_grid_log_step). Because y' is restricted to grid nodes, the implied capital k = y'^{1/α} moves in relative steps of about 0.0115/α ≈ 3.2%. The policy is therefore a step function, and its error is of the order of the grid spacing. Over all 400 nodes, the maximum policy error is 0.0251 (diag_max_abs_policy_error_on_grid), largest at high y, where absolute steps are bigger. The maximum value error is 4.8e-4 utils (diag_max_abs_value_error_on_grid).

The value function converges much more tightly than the policy. This is expected, because the objective is flat near its optimum.

# Limitations and open issues

  • Scope. The validation covers a single parameter point (α = 0.36, β = 0.95), one grid (400 log-spaced points on [0.05, 5]) and one tolerance. It does not show accuracy for other parameters, grids, or for models without a closed form, such as partial depreciation or CRRA utility other than log.
  • Grid truncation. The bounds were checked: the optimal y' never hits a grid bound (diag_policy_hits_lower_bound = diag_policy_hits_upper_bound = 0).
  • Off-grid evaluation. The evaluation points 0.5, 1, 2 are not grid nodes, so the VFI numbers include interpolation error on top of the discrete-choice error (recorded in data_issues). A continuous-choice VFI would reduce the policy error. We did not use one, to stay within the prescribed design.
  • The discrete-choice formulation is a modelling choice made within the prescribed design, not a change to it. It is documented in data_issues.
Files · main
Menu

Theme