SPB Git

spb/wp29_uqo

Public
5.2 KB · 63 lines markdown
1# F5-conf-04 — VFI vs closed-form policy, optimal growth with log utility23## Question4A planner maximises Σ β^t ln c_t subject to y_{t+1} = (y_t − c_t)^α. This report compares the closed-form optimal consumption policy and value function with the ones obtained by value-function iteration (VFI) on the prescribed grid. The parameter point is α = 0.36, β = 0.95.56## Data and exclusions7- The only input is `data/model.csv`: 10 parameter rows (`n_input_rows`). Its SHA-256 matches the bundle.8- No rows were excluded (`out/exclusions.csv`).9- Grid: 400 points equally spaced in ln y on [0.05, 5] (`grid_points_used`, `n_analysed`). VFI stopping tolerance: 1e-8 in the sup norm.10- Design notes, recorded in `data_issues`:11  1. The evaluation points 0.5, 1.0 and 2.0 are not grid nodes. VFI policy and value are therefore interpolated linearly in ln y between neighbouring nodes.12  2. The control (next-period output y′) is restricted to the same grid. This is standard discrete VFI, with no off-grid optimisation.13- No random numbers are used (`random_seed` = null).1415## Method16**Closed form (guess and verify).** Assumptions: log utility, Cobb–Douglas technology y′ = k^α with productivity 1, full depreciation, 0 < α < 1, 0 < β < 1, and an interior solution 0 < c < y.17- Guess V(y) = A + B ln y. The Bellman right-hand side becomes ln c + β(A + Bα ln(y − c)).18- The first-order condition 1/c = αβB/(y − c) gives c = y/(1 + αβB).19- Matching the coefficients on ln y gives B = 1 + αβB, so B = 1/(1 − αβ).20- Policy: **c(y) = (1 − αβ) y**. Savings rate: **(y − c)/y = αβ**.21- Constant: **A = [ln(1 − αβ) + (αβ/(1 − αβ)) ln(αβ)] / (1 − β)**.22- I also checked numerically that this V satisfies the Bellman equation, by brute-force continuous maximisation at y ∈ {0.1, 0.5, 1, 2, 4} (`out/state/checks.md`).2324**Contraction.** The Bellman operator T is monotone (v ≤ w implies Tv ≤ Tw) and discounts (T(v + a) = Tv + βa). By Blackwell's sufficient conditions it is a contraction in the sup norm with modulus β.25- This argument applies on the bounded grid problem: the state space is compact, and at every node there is a feasible choice with c bounded away from 0, so the return is bounded. The infinite-domain log-utility problem has unbounded returns, so there the argument needs a weighted-norm extension or the closed-form verification instead.26- As a check, the optimal y′ = (αβy)^α maps [0.05, 5] into roughly [0.23, 1.21]. The grid truncation therefore never binds (VFI choice indices stay between 133 and 276 of 0–399; `diagnostics.choice_index_min_max`).2728**VFI.**29- Start from V₀ = 0 and iterate V_{n+1}(y_i) = max_j { ln(y_i − y_j^{1/α}) + β V_n(y_j) } over feasible j, until the sup change is below 1e-8.30- Read the policy off the argmax: c = y_i − y_j^{1/α}.31- Implementation: `out/analysis.py`, vectorised.3233## Results34| quantity | closed form | VFI |35|---|---|---|36| c(0.5) | 0.329 (`c_closed_y05`) | 0.32882 (`c_num_y05`) |37| c(1.0) | 0.658 (`c_closed_y1`) | 0.65899 (`c_num_y1`) |38| c(2.0) | 1.316 (`c_closed_y2`) | 1.30963 (`c_num_y2`) |39| V(1) | −19.52441 (`value_closed_y1`) | −19.52476 (`value_num_y1`) |4041- Maximum absolute policy error over the three points: 0.00637 (`max_abs_error_policy`). It occurs at y = 2, about 0.5% of consumption.42- Savings rate implied by the closed form: αβ = 0.342 (`savings_rate_closed_form`, also stored as `baseline_savings_rate`).43- Contraction modulus: 0.95 (`contraction_modulus`).44- VFI converged in 361 iterations (`n_iterations`), with a final sup change of 9.997e-9 (`final_sup_change`).45- Diagnostics:46  - Largest policy error at any grid node: 0.0251 (`diagnostics.max_abs_error_policy_on_grid`), at high y.47  - Largest value error at any grid node: 4.8e-4 (`diagnostics.max_abs_error_value_on_grid`).4849## Uncertainty50The model is deterministic, so there is no sampling uncertainty. The numerical error has two sources:511. **Iteration truncation.** It is bounded by β/(1 − β) × final sup change ≈ 1.9e-7 utils (`diagnostics.vfi_error_bound_beta_over_1mbeta_times_sup`). This is negligible.522. **Discretisation.** This is the dominant source.53   - The chosen y′ can be off by up to half a log step (Δ ln y = 0.0115, `diagnostics.grid_log_step`).54   - Because k = y′^{1/α}, a small error in y′ becomes an error of roughly (k/α)·Δ ln y′ in consumption. That error grows with y, which is why the policy error is largest at y = 2 and at the top of the grid.55   - The policy error is first order in grid spacing. The value error is much smaller (second order, by the envelope theorem).56   - Interpolating the policy between nodes adds a little more error.5758## Limitations and open issues59- The validation covers one parameter point (α = 0.36, β = 0.95), one grid (400 log-spaced points on [0.05, 5]) and one tolerance (1e-8). I have not shown how the error shrinks as the grid is refined.60- The discrete-choice VFI policy is a step function. A finer grid, or continuous optimisation of the control, would reduce the policy error. I did not do either, because the task prescribes this grid.61- The contraction argument as stated applies to the bounded (truncated-grid) problem.62- All required outputs were produced (`feasibility` = "complete").63
Files · main
Menu

Theme