# F5-conf-04 — VFI vs closed-form policy (optimal growth, log utility) ## Question A planner maximises Σ β^t ln c_t subject to y_{t+1} = (y_t − c_t)^α (Cobb–Douglas, productivity 1, full depreciation). We derive the closed-form policy and value function, solve the Bellman equation numerically by value-function iteration (VFI) on the prescribed grid, and compare the two at y = 0.5, 1, 2 (policy) and y = 1 (value). ## Data and exclusions The only input is `data/model.csv` (10 rows; `n_input_rows`): α = 0.36, β = 0.95, grid of 400 points (`grid_points_used`) log-spaced on [0.05, 5], VFI tolerance 1e-8 (sup norm), evaluation points 0.5, 1.0, 2.0. These are model parameters, not observations. Nothing was excluded (`out/exclusions.csv`); all 400 grid points are analysed (`n_analysed`). No deviation from the prescribed design was needed (`data_issues` = []). The evaluation points are not grid nodes (`diag_eval_points_on_grid` all false; log step `diag_grid_log_step` ≈ 0.01154), so the VFI policy and value are linearly interpolated in ln y between the neighbouring nodes, as the task allows. No randomness is used (`random_seed` = null). ## Method **Closed form (guess and verify).** Guess V(y) = A + B ln y. The first-order condition of max_c {ln c + βA + βBα ln(y − c)} gives 1/c = αβB/(y − c), so c = y/(1 + αβB). Matching the coefficient on ln y gives B = 1 + αβB ⇒ B = 1/(1 − αβ), hence **c(y) = (1 − αβ) y** and the savings rate is (y − c)/y = **αβ**. Matching constants gives **A = [ln(1 − αβ) + (αβ/(1 − αβ)) ln(αβ)] / (1 − β)**. Assumptions: log utility, Cobb–Douglas technology y' = k^α with 0 < α < 1 and unit productivity, full depreciation, deterministic environment, 0 < β < 1, and an interior solution (0 < c < y, which holds since 0 < αβ < 1). I checked independently that this V is a fixed point of the Bellman operator at y = 0.5, 1, 2 by numerical maximisation (see `out/state/checks.md`, check 3). **VFI.** State: y on the 400-point log grid. Choice: next-period output y'_j on the same grid, which requires capital k = (y'_j)^{1/α} and leaves c = y_i − (y'_j)^{1/α}; choices with c ≤ 0 are infeasible (utility −∞). Starting from V₀ = 0, iterate V_{n+1}(y_i) = max_j {ln c_ij + β V_n(y'_j)} until sup|V_{n+1} − V_n| < 1e-8. The policy is c at the argmax. The numerical policy never uses the closed form. No optimal choice lies at either grid bound (`diag_choice_at_lower_bound` = 0, `diag_choice_at_upper_bound` = 0), so the grid does not truncate the solution. **Contraction.** The Bellman operator T satisfies Blackwell's sufficient conditions on bounded functions: monotonicity (V ≤ W ⇒ TV ≤ TW) and discounting (T(V + a) = TV + βa). Hence ‖TV − TW‖∞ ≤ β‖V − W‖∞, modulus **β = 0.95** (`contraction_modulus`). (Log utility is unbounded on (0, ∞); on the compact discretised grid all values are bounded, so the argument applies exactly to the discrete operator that is iterated.) ## Results | quantity | closed form | VFI | |---|---|---| | c(0.5) | 0.329 (`c_closed_y05`) | 0.328818 (`c_num_y05`) | | c(1.0) | 0.658 (`c_closed_y1`) | 0.658994 (`c_num_y1`) | | c(2.0) | 1.316 (`c_closed_y2`) | 1.309625 (`c_num_y2`) | | V(1) | −19.524412 (`value_closed_y1`) | −19.524756 (`value_num_y1`) | - Maximum absolute policy discrepancy over the three points: 0.006375 (`max_abs_error_policy`), attained at y = 2 (≈ 0.5 % of c); relative errors at y = 0.5 and 1 are below 0.2 %. - Value at y = 1 differs by 3.4e-4 utils (`diag_value_abs_error_y1`). - Closed-form savings rate αβ = 0.342 (`savings_rate_closed_form`), i.e. c = 0.658 y. - Contraction modulus 0.95 (`contraction_modulus`). VFI met the stopping rule after 361 iterations (`n_iterations`) with final sup change 9.997e-9 (`final_sup_change`). - Over the whole grid, max policy error is 0.0251 (`diag_policy_max_abs_error_on_grid`) and max value error 4.8e-4 (`diag_value_max_abs_error_on_grid`). ## Uncertainty The problem is deterministic; there is no sampling uncertainty. The numerical error has two sources: (i) **iteration error**: by the contraction property, ‖V_n − V*‖∞ ≤ β/(1 − β)·‖V_n − V_{n−1}‖∞ ≤ 1.9e-7 (`diag_value_tolerance_bound`), negligible; (ii) **discretisation error**: the choice y' is restricted to grid nodes and results at off-grid points are linearly interpolated. This dominates: the 3.4e-4 value gap at y = 1 is far larger than the 1.9e-7 iteration bound. The policy error is roughly proportional to the change in capital between adjacent choice nodes, Δk ≈ (k/α)·Δln y', which grows with y; this explains why the error is largest at y = 2 and at the top of the grid. ## Limitations and open issues - The validation holds only for the single parameter point (α = 0.36, β = 0.95) and the single grid (400 log-spaced points on [0.05, 5], tolerance 1e-8). Discretisation error depends on the grid density (log step ≈ 0.0115), on α (through k = y'^{1/α}), on the level of y, and on the interpolation rule for off-grid evaluation points. A finer grid or a continuous choice of c would reduce it; these were not run because the task prescribes the grid. - The VFI policy is a step function between nodes, so pointwise errors at individual nodes can be as large as `diag_policy_max_abs_error_on_grid`, which is larger than the error at the three evaluation points. - The closed form needs log utility, Cobb–Douglas technology, full depreciation and an interior solution; it does not extend to partial depreciation or CRRA utility with σ ≠ 1. - Feasibility: complete (`feasibility`); no part of the task was left undone.