F5-dev-01 — Cobb–Douglas consumer: closed-form demands with numerical validation
Question
A consumer with u(x1,x2) = α ln x1 + (1−α) ln x2 maximises utility subject to p1x1 + p2x2 ≤ m, x ≥ 0. We derive the Marshallian demands, the indirect utility and the budget residual at the optimum, and check them against an independent numerical maximisation.
Data and exclusions
Input: data/parameters.csv (4 rows, n_input_rows; SHA-256 a04798ad…, recorded in validation_details.input_sha256). α = 0.35, p1 = 2.5, p2 = 4.0, m = 120. No missing, duplicated or non-numeric values (data_issues = []). No rows excluded; 4 rows used (n_analysed; see out/exclusions.csv). These are given theoretical parameters, not observed data.
Method
Assumptions for the closed form to be the unique optimum: 0 < α < 1, p1 > 0, p2 > 0, m > 0 (all hold here). Then u is strictly increasing in each good (local non-satiation ⇒ budget binds), strictly concave on R²₊₊, and satisfies ∂u/∂xi → ∞ as xi → 0 with u → −∞ on the boundary, so the optimum is interior. A strictly concave objective on a convex compact-relevant feasible set has at most one maximiser, so the KKT point is the unique global optimum.
Derivation. Lagrangian L = α ln x1 + (1−α) ln x2 + λ(m − p1x1 − p2x2). FOCs: α/x1 = λp1, (1−α)/x2 = λp2, budget binding. Dividing, MRS = αx2/((1−α)x1) = p1/p2. Substituting into the budget: p1x1 + p2·(1−α)p1x1/(αp2) = m ⇒ p1x1/α = m ⇒ λ = 1/m and x1* = αm/p1, x2* = (1−α)m/p2, v(p,m) = α ln(αm/p1) + (1−α) ln((1−α)m/p2).
Numerical validation (does not use the closed form). At the single parameter point in the file only: (i) bounded Brent maximisation of u(x1, (m−p1x1)/p2) over x1 ∈ (0, m/p1) — this is the reported indirect_utility_numerical; (ii) a 999,999-point interior grid on the budget line; (iii) 2-D SLSQP on u with the inequality budget constraint and non-negativity bounds (does not impose that the budget binds). No randomness is used (random_seed = null). Code: out/analysis.py.
Results
- x1* = 16.8 units of good 1 (
x1_demand); x2* = 19.5 units of good 2 (x2_demand). - v = 2.9182520128635305 utils (
indirect_utility). - Budget residual = 0.0 currency units (
budget_identity_residual). - MRS at optimum = 0.625 = p1/p2 = 0.625 (
mrs_at_optimum,price_ratio). - Expenditure share of good 1 = 0.35 = α (
expenditure_share_good1). - Numerical maximum utility = 2.9182520128635305 (
indirect_utility_numerical), identical to the closed form in double precision (validation_details.abs_diff_utility_closed_vs_brent= 0). Brent maximiser x1 = 16.8000002 (validation_details.brent_x1, |diff| ≈ 2.3e-7,validation_details.abs_diff_x1_closed_vs_brent). Grid and SLSQP agree (validation_details.grid_utility,validation_details.slsqp_utility); SLSQP leaves zero budget slack (validation_details.slsqp_budget_slack), confirming the budget binds. feasibility= "complete".
Uncertainty
This is a deterministic theoretical exercise; there is no sampling uncertainty. The only uncertainty is numerical: optimiser tolerance gives x1 errors of order 1e-7 (validation_details.abs_diff_x1_closed_vs_brent). Utility differences are 0 to machine precision because u is flat (second-order) near the optimum, so utility agreement is a weaker test than the agreement of the maximisers.
Limitations and open issues
- Validation covers only the single parameter point (α=0.35, p1=2.5, p2=4, m=120); the general formula is supported by the analytical derivation, not by a numerical sweep.
- The grid maximiser coincides exactly with 16.8 because 16.8 is a grid node (step 4.8e-5,
validation_details.grid_step_x1); this is a coincidence of the grid, not extra precision. - The closed form does not apply for α ∉ (0,1) or non-positive prices/income; the script would then report null for the closed-form keys.
- Extra diagnostic keys are stored under
validation_detailsin results.json beyond the required keys.