Leontief Systems and Intersectoral Dependence: How Linear Algebra Traces Direct and Indirect Production Requirements

Last Updated July 3, 2026

Leontief systems and intersectoral dependence explain how production requirements propagate through connected economic sectors when final demand changes. In linear algebra, the Leontief model turns sector interdependence into a solvable matrix system, showing how direct input requirements generate indirect requirements across suppliers, suppliers of suppliers, and the wider production network.

This article continues Part VII of the Linear Algebra for Systems Modeling series by connecting input-output tables, technical coefficients, final demand, total output, net requirements, the Leontief inverse, productivity conditions, direct and indirect effects, intersectoral dependence, multipliers, demand shocks, environmental extensions, matrix conditioning, sensitivity analysis, uncertainty, and responsible interpretation.

The central modeling question is not only “What is the solution to \((I-A)\mathbf{x}=\mathbf{f}\)?” It is “When is that solution meaningful, how do sector dependencies propagate, how sensitive is the result, and what assumptions are being made about technology, capacity, prices, substitution, time, and economic structure?”

Vintage economics workspace with input-output matrix grids, sector dependency networks, industrial flows, agricultural links, books, and drafting tools.
Leontief systems shown through intersectoral dependence, input-output matrices, production requirements, sector flows, and structural economic relationships.

Leontief systems begin from the idea that production requires production. A sector does not simply produce for final consumers; it also uses inputs from other sectors, and those sectors use inputs from still other sectors. A final demand change therefore creates a chain of requirements. Linear algebra makes this chain visible by expressing the whole economy, region, or production system as a matrix equation.

The Leontief model is elegant because a complex system of intersectoral dependence reduces to a compact form: \((I-A)\mathbf{x}=\mathbf{f}\). But that elegance comes with assumptions. Technical coefficients are treated as fixed. Production is proportional. Prices, substitution, capacity constraints, inventories, time delays, and behavioral adaptation are usually outside the basic model. The model is powerful when those assumptions are appropriate and misleading when they are ignored.

Why Leontief Systems Matter

Leontief systems matter because they provide a precise mathematical form for economic interdependence. They show how a change in final demand for one sector can require additional output from many others. A construction project requires materials, energy, transport, finance, professional services, machinery, and administrative support. Those suppliers require their own inputs. The result is a cascading production structure.

The Leontief model does not merely estimate direct purchases. It estimates total requirements: the direct and indirect output needed across the system to satisfy final demand under fixed technical coefficients.

Modeling question Leontief contribution Interpretive caution
How much output is required? Solves total sector output for a final demand vector. Assumes fixed coefficients and sufficient capacity.
Which sectors are upstream? Reveals direct and indirect input requirements. Sector aggregation may hide operational bottlenecks.
How do shocks propagate? Maps demand changes through total requirements. Basic model is not a full dynamic shock model.
Where are dependencies concentrated? Uses columns, rows, multipliers, and inverse structure. Dependence is model-derived, not firm-level proof.
What are indirect impacts? Attaches emissions, labor, water, energy, or value-added coefficients to total output. Extension coefficients require careful boundary review.

Leontief systems are valuable because they clarify production structure. Their responsible use depends on making assumptions visible.

Back to top ↑

Input-Output Balance

Input-output balance begins with total output. Each sector’s output is used partly as intermediate input by other sectors and partly to satisfy final demand. If \(z_{ij}\) is output from sector \(i\) used by sector \(j\), then the total output of sector \(i\) can be written as:

\[
x_i = z_{i1}+z_{i2}+\cdots+z_{in}+f_i
\]

Interpretation: Sector \(i\)’s total output equals intermediate sales to all sectors plus final demand for sector \(i\).

In matrix form, if \(Z\) is the transactions matrix and \(\mathbf{f}\) is final demand:

\[
\mathbf{x}=Z\mathbf{1}+\mathbf{f}
\]

Interpretation: Total sector output equals intermediate sales plus final demand.

Balance object Meaning Review issue
\(Z\) Transactions matrix. Orientation, valuation basis, year, and source must be documented.
\(\mathbf{x}\) Total output vector. Must be consistent with transactions and final demand.
\(\mathbf{f}\) Final demand vector. Households, government, investment, exports, or other categories must be defined.
\(Z\mathbf{1}\) Intermediate sales by producing sector. Depends on row/column convention.
Balance check Accounting consistency. Large imbalance signals data or orientation problems.

Before solving a Leontief system, the accounting relationships must be coherent. A clean matrix equation cannot repair inconsistent data.

Back to top ↑

Technical Coefficients Revisited

The technical coefficient \(a_{ij}\) gives the input from sector \(i\) required per unit of output from sector \(j\):

\[
a_{ij}=\frac{z_{ij}}{x_j}
\]

Interpretation: Each coefficient represents a direct production requirement in the using sector’s input recipe.

The coefficient matrix \(A\) collects these requirements. Each column is an input recipe for a sector. If sector \(j\) produces \(x_j\), then the intermediate input requirements for that sector are the column \(A_{\cdot j}x_j\).

Coefficient feature Meaning Modeling risk
Column normalization Inputs divided by output of using sector. Small or uncertain output creates unstable coefficients.
Fixed recipe Input shares remain constant in scenario. Substitution, technology change, and capacity response are excluded.
Sector aggregation Many firms and products compressed into one sector. Average coefficient may hide critical variation.
Monetary valuation Flows often measured in money terms. Price changes can alter apparent requirements.
Regional boundary Domestic, regional, or multiregional scope. Imports and leakage affect coefficients.

The Leontief system depends on \(A\). If the coefficient matrix is poorly constructed, the inverse will only amplify that weakness.

Back to top ↑

The Leontief System

The basic demand-driven input-output model is:

\[
\mathbf{x}=A\mathbf{x}+\mathbf{f}
\]

Interpretation: Total output is required both for intermediate inputs and final demand.

Rearranging gives the Leontief system:

\[
(I-A)\mathbf{x}=\mathbf{f}
\]

Interpretation: Net output after meeting intermediate production requirements must satisfy final demand.

If the matrix \(I-A\) is invertible, then:

\[
\mathbf{x}=(I-A)^{-1}\mathbf{f}
\]

Interpretation: Total output is obtained by applying the Leontief inverse to final demand.

Element Economic meaning Linear algebra role
\(\mathbf{x}\) Total output by sector. Unknown solution vector.
\(A\mathbf{x}\) Intermediate requirements. Matrix-vector product.
\(\mathbf{f}\) Final demand. Right-hand-side vector.
\(I-A\) Net requirements matrix. System matrix.
\((I-A)^{-1}\) Total requirements matrix. Inverse mapping from demand to output.

The equation is compact, but it encodes a whole production network.

Back to top ↑

Net Requirements

The matrix \(I-A\) is sometimes called the net requirements matrix. It represents the output left after accounting for intermediate input requirements. For a single sector, the idea is simple: if producing one unit requires some fraction of output as intermediate inputs, then less than one unit remains available to satisfy final demand. Across many sectors, these relationships interact.

\[
I-A=
\begin{bmatrix}
1-a_{11} & -a_{12} & \cdots & -a_{1n}\\
-a_{21} & 1-a_{22} & \cdots & -a_{2n}\\
\vdots & \vdots & \ddots & \vdots\\
-a_{n1} & -a_{n2} & \cdots & 1-a_{nn}
\end{bmatrix}
\]

Interpretation: Diagonal terms represent own-sector net output after direct self-requirements, while off-diagonal terms represent cross-sector requirements.

Diagnostic Meaning Why it matters
Invertibility Whether the system can be uniquely solved. A singular or near-singular matrix undermines stable output estimates.
Condition number Sensitivity of the solution to input changes. High conditioning risk means small data errors can cause large output changes.
Diagonal strength Net own-sector output capacity in matrix form. Weak diagonal dominance can signal strong interdependence.
Nonnegative solution Positive output response to positive final demand. Negative output is usually economically incoherent in the standard model.
Productivity condition Whether the economy can satisfy positive final demand. Determines whether the model represents a feasible production system.

The Leontief system is not just solved; it should be diagnosed.

Back to top ↑

The Leontief Inverse

The Leontief inverse is:

\[
L=(I-A)^{-1}
\]

Interpretation: The matrix \(L\) maps final demand into total output requirements.

An entry \(l_{ij}\) can be interpreted as the total output required from sector \(i\) per unit of final demand for sector \(j\), including direct and indirect requirements under the model assumptions.

Leontief inverse view Meaning Use
Column \(j\) Total sector requirements caused by one unit of final demand for sector \(j\). Demand-driven dependency profile.
Row \(i\) How sector \(i\) contributes to final demand across sectors. Upstream exposure and production support role.
Column sum Total output multiplier for sector \(j\). Compact dependency summary.
Large off-diagonal entry Strong indirect or cross-sector dependence. Supply-chain exposure review.
Diagonal entry above one Own-sector output requirement including feedback loops. Self-dependence and circular production effects.

The Leontief inverse is the central linear algebra object in demand-driven input-output analysis. It is also the object most likely to be overinterpreted if assumptions are not documented.

Back to top ↑

Direct and Indirect Dependence

When the relevant convergence conditions hold, the Leontief inverse can be expressed as a series:

\[
(I-A)^{-1}=I+A+A^2+A^3+\cdots
\]

Interpretation: Total requirements equal direct demand plus successive rounds of intermediate requirements.

Term Dependency layer Economic interpretation
\(I\) Initial unit of final demand. Output directly demanded from a sector.
\(A\) First-round requirements. Inputs needed by the directly demanded sector.
\(A^2\) Second-round requirements. Inputs needed by first-round suppliers.
\(A^3\) Third-round requirements. Further upstream supplier requirements.
\(\cdots\) Higher-order production rounds. Continuing indirect dependence, usually diminishing in a productive system.

This expansion reveals the network logic beneath the matrix inverse. The inverse is not magic; it is the accumulation of repeated input requirements throughout the production system.

Back to top ↑

Productivity and Feasibility

A Leontief system should represent a productive economy or production system: positive final demand should be satisfiable with nonnegative output. A common mathematical condition is that the spectral radius of \(A\) is less than one:

\[
\rho(A)<1
\]

Interpretation: The technical coefficient matrix should not require more production than the system can generate across repeated production rounds.

When \(\rho(A)<1\), the series \(I+A+A^2+\cdots\) converges, and the Leontief inverse can be interpreted as total requirements. Related productivity checks also examine principal minors, nonnegative inverses, feasibility, and the economic coherence of coefficients.

Productivity check What it asks Why it matters
Spectral radius Is \(\rho(A)<1\)? Supports convergence of the requirements series.
Invertibility Does \(I-A\) have an inverse? Needed for the standard closed-form solution.
Nonnegative inverse Does positive demand produce nonnegative output? Supports economic interpretability.
Coefficient plausibility Are input requirements economically reasonable? Prevents impossible production recipes.
Sensitivity Are results stable under coefficient uncertainty? Prevents fragile conclusions.

A Leontief inverse can be computed numerically even when interpretation is weak. Productivity diagnostics help distinguish computation from economic meaning.

Back to top ↑

Multipliers and Total Requirements

Multipliers summarize the total requirements associated with a unit of final demand. If \(L=(I-A)^{-1}\), the output multiplier for final-demand sector \(j\) is often written:

\[
m_j=\sum_i l_{ij}
\]

Interpretation: The multiplier sums total output required across all sectors for one unit of final demand in sector \(j\).

Extensions can produce employment, emissions, value-added, energy, water, or material multipliers. If \(\mathbf{e}\) is a row vector of emissions intensity, then:

\[
\mathbf{e}L
\]

Interpretation: This row vector gives emissions requirements per unit of final demand by sector.

Multiplier Construction Interpretive warning
Output multiplier Column sum of \(L\). Not a causal estimate without assumptions.
Value-added multiplier Value-added coefficients times \(L\). Depends on accounting definitions and boundaries.
Employment multiplier Employment coefficients times \(L\). Labor productivity and job quality are not automatic.
Emissions multiplier Emissions intensities times \(L\). Production location and environmental coefficients matter.
Energy multiplier Energy intensities times \(L\). Technology and fuel mix may change under scenarios.

Multipliers are useful because they summarize system dependence. They are risky because they can make uncertain assumptions look precise.

Back to top ↑

Shock Propagation

A change in final demand produces a change in output:

\[
\Delta\mathbf{x}=L\Delta\mathbf{f}
\]

Interpretation: The Leontief inverse propagates a final-demand shock through direct and indirect production requirements.

This is useful for investment scenarios, policy programs, export shocks, consumption changes, demand contractions, and some recovery planning contexts. But the standard model is not a full dynamic disruption model. It does not automatically include time delays, inventories, prices, capacity constraints, substitution, rationing, behavioral response, logistics, or network repair.

Shock type Leontief interpretation Limit
Final demand increase Total output required to meet new demand. Capacity and price response are not modeled.
Export demand shock Domestic or regional production requirements tied to exports. Import structure and trade substitution matter.
Investment program Sector output requirements for investment demand. Technology coefficients may change over time.
Disaster disruption Dependency exposure or loss scenario under simplified assumptions. Supply constraints need additional modeling.
Consumption shift Production response to changed household demand. Behavior, prices, and income effects may matter.

Leontief shock analysis is a structured scenario tool. It should not be presented as a complete behavioral forecast.

Back to top ↑

Intersectoral Dependence

Intersectoral dependence can be read directly from both \(A\) and \(L\). The technical coefficient matrix shows immediate input dependence. The Leontief inverse shows total dependence after repeated production rounds.

Dependence measure Matrix source Interpretation
Direct input dependence \(A\) Immediate input required by each sector.
Total input dependence \(L=(I-A)^{-1}\) Direct and indirect production requirements.
Backward linkage Column structure of \(L\) How much a sector depends on upstream production.
Forward linkage Row structure of \(L\) How much a sector supports downstream final demand.
System centrality Matrix-derived dependency summaries. Sector importance under the chosen model boundary.

Intersectoral dependence is closely related to network reasoning. Sectors are nodes, technical coefficients are weighted edges, and the Leontief inverse summarizes repeated pathways through the system. But input-output dependence is not the same as firm-level supply-chain mapping. It is a sector-level structural model.

Back to top ↑

Environmental and Social Extensions

Leontief systems can be extended by attaching coefficients to sector output. If \(\mathbf{g}\) is a row vector of environmental intensity coefficients, then the total environmental requirement associated with final demand is:

\[
\mathbf{g}L\mathbf{f}
\]

Interpretation: Environmental intensities are applied to total production requirements associated with final demand.

This structure can be used for carbon emissions, energy use, water use, material throughput, employment, labor income, value added, occupational risk, land use, waste, or other extensions when appropriate data exist.

Extension Coefficient Use
Carbon Emissions per unit output. Consumption-based emissions accounting.
Energy Energy per unit output. Energy transition and intensity analysis.
Water Withdrawal or consumption per unit output. Water footprint and scarcity analysis.
Employment Jobs or hours per unit output. Employment requirement analysis.
Value added Value added per unit output. Economic contribution analysis.
Materials Material use per unit output. Resource and circularity analysis.

Extensions are powerful because they connect final demand to hidden upstream impacts. They are also sensitive to boundaries, allocation rules, sector matching, units, data year, and interpretation choices.

Back to top ↑

Conditioning and Sensitivity

Leontief systems can be sensitive to coefficient errors. If \(I-A\) is poorly conditioned, small changes in \(A\) or \(\mathbf{f}\) can produce large changes in \(\mathbf{x}\). The condition number of \(I-A\) is therefore an important numerical diagnostic:

\[
\kappa(I-A)=\|I-A\|\|(I-A)^{-1}\|
\]

Interpretation: The condition number measures how sensitive the output solution may be to perturbations in the input data.

Sensitivity source Effect Review strategy
Coefficient uncertainty Changes total requirements and multipliers. Run coefficient perturbation tests.
Final demand uncertainty Changes output solution. Run scenario ranges and demand sensitivity.
Aggregation choice Changes sector relationships. Compare sector resolutions if possible.
Boundary choice Changes imports, leakage, and responsibility. Compare regional, national, and multiregional assumptions.
Near-singular matrix Creates unstable solutions. Report condition number and avoid overprecision.

Sensitivity analysis is not optional. It is the difference between a calculated multiplier and a defensible modeling claim.

Back to top ↑

Assumptions and Model Limits

The standard Leontief system is a fixed-coefficient, demand-driven, linear model. That makes it clear and computable. It also means that certain economic behaviors are not represented unless the model is extended.

Assumption Model benefit Limit
Fixed technical coefficients Simple matrix system. Does not capture substitution or changing technology.
Linear proportionality Requirements scale with output. May fail with thresholds, bottlenecks, or economies of scale.
Demand-driven output Clear final-demand scenario analysis. Supply constraints and capacity disruptions require additional models.
No price response Stable accounting relationships. Price changes, inflation, and market adjustment are excluded.
No time dynamics Static equilibrium-style calculation. Inventories, delays, adjustment paths, and recovery processes are excluded.
Sector averages Practical economy-wide representation. Firm, product, geography, and technology differences are hidden.

These assumptions do not make Leontief systems useless. They define the conditions under which the model should be interpreted.

Back to top ↑

Leontief Systems in Systems Modeling

Leontief systems are systems models because they represent structured dependence, propagation, feedback, and boundary-sensitive interpretation. They can be understood as linear dependency networks with final demand as an external driver and total output as the system response.

Systems concept Leontief counterpart Interpretive value
System units Sectors, industries, products, or regions. Defines nodes of production structure.
Dependencies Technical coefficients. Defines direct input requirements.
Propagation Leontief inverse. Shows direct and indirect requirements.
External forcing Final demand vector. Drives system output response.
Extensions Environmental or social coefficient vectors. Links production to indirect impacts.
Governance Assumptions, boundaries, diagnostics, and sensitivity tests. Prevents overinterpretation of structured estimates.

Leontief systems connect economics, linear algebra, network reasoning, sustainability assessment, and institutional decision support.

Back to top ↑

Mathematical Deepening

This section adds a more formal layer. Leontief systems connect matrix normalization, linear systems, inverse matrices, nonnegative matrices, spectral radius, productivity conditions, Neumann series, matrix conditioning, perturbation analysis, multipliers, and extension vectors.

System Structure Review

Coefficient Matrix

The matrix \(A\) encodes direct input requirements per unit of output.

Net Requirements

The matrix \(I-A\) defines the solvable system linking final demand to total output.

Leontief Inverse

The inverse \((I-A)^{-1}\) maps final demand into direct and indirect output requirements.

Total Output

The vector \(\mathbf{x}\) is the production response required to satisfy final demand.

Dependence Review

Direct Dependence

The matrix \(A\) shows immediate production requirements.

Indirect Dependence

Powers of \(A\) show upstream production rounds.

Total Dependence

The Leontief inverse summarizes the accumulation of direct and indirect requirements.

Linkages

Rows and columns of \(L\) support forward and backward dependency analysis.

Diagnostic Review

Productivity

Productive systems should be able to satisfy positive final demand with nonnegative output.

Spectral Radius

The condition \(\rho(A)<1\) supports convergence of the requirements series.

Conditioning

The condition number of \(I-A\) indicates solution sensitivity.

Perturbation

Coefficient and demand uncertainty should be tested before using multipliers for decisions.

Governance Review

Boundary

Regional, national, and multiregional boundaries shape imports, leakage, and responsibility.

Aggregation

Sector aggregation determines what dependencies become visible or hidden.

Scenario Scope

Demand shocks should be interpreted within fixed-coefficient and capacity assumptions.

Responsible Interpretation

Leontief results are structured dependency estimates, not automatic causal proof or full forecasts.

Back to top ↑

Examples from Systems Modeling

Leontief systems apply wherever final demand, intermediate requirements, and sector dependence can be represented as a fixed-coefficient production system.

Clean Infrastructure Demand

A final demand increase for clean infrastructure creates direct and indirect requirements for construction, energy, manufacturing, transport, and services.

Manufacturing Supply Dependence

The Leontief inverse reveals how manufacturing demand depends on upstream energy, logistics, materials, finance, and business services.

Regional Output Multipliers

Regional models estimate how demand changes translate into local output while highlighting imports and leakage.

Consumption-Based Emissions

Environmental extensions connect household or export demand to emissions embodied in upstream production requirements.

Disaster Scenario Planning

Demand and disruption scenarios can reveal indirect exposure, although supply constraints require additional modeling.

Public Health Supply Chains

Healthcare demand can be linked to pharmaceuticals, energy, equipment, transport, professional services, and waste management.

Across these examples, the Leontief system clarifies dependence while requiring careful interpretation of coefficients, boundaries, and scenario assumptions.

Back to top ↑

Computation and Reproducible Workflows

Computational workflows for Leontief systems should document the transaction table, sector classification, coefficient construction, final demand vector, scenario vector, net requirements matrix, inverse or solver method, spectral radius, condition number, output solution, multipliers, extension coefficients, perturbation tests, sensitivity ranges, and interpretation warnings.

The companion repository treats Leontief modeling as an auditable linear-system workflow. Python, R, Julia, SQL, Haskell, C, C++, Fortran, Rust, Go, notebooks, schemas, generated outputs, Canvas artifacts, advanced reports, and calculators each support a different layer of reproducible intersectoral-dependence diagnostics.

For this article, the computational examples focus on coefficient matrices, Leontief inverses, productivity checks, spectral radius, condition numbers, demand-shock response, multiplier summaries, environmental extensions, sensitivity testing, and governance records.

Back to top ↑

Python Workflow: Leontief System Audit

The Python workflow below computes a Leontief system audit for a small synthetic production system. It constructs the coefficient matrix, checks productivity, solves total output, computes multipliers, applies a demand shock, evaluates environmental extensions, and exports governance warnings.

from __future__ import annotations

from dataclasses import asdict, dataclass
from pathlib import Path
import csv
import json
import numpy as np


@dataclass(frozen=True)
class LeontiefSystemAudit:
    model_name: str
    sectors: int
    method: str
    coefficient_basis: str
    spectral_radius: float
    condition_number: float
    productive_system_flag: bool
    maximum_output_multiplier: float
    highest_multiplier_sector: str
    total_output_required: float
    total_shock_output_change: float
    emissions_for_final_demand: float
    assumption_warning: str
    interpretation_warning: str


def build_system() -> tuple[list[str], np.ndarray, np.ndarray, np.ndarray, np.ndarray]:
    sectors = ["energy", "manufacturing", "transport", "services"]

    # z_ij: output from sector i used by sector j
    transactions = np.array(
        [
            [8.0, 18.0, 10.0, 7.0],
            [4.0, 12.0, 8.0, 11.0],
            [3.0, 9.0, 6.0, 8.0],
            [5.0, 14.0, 7.0, 16.0],
        ],
        dtype=float,
    )

    total_output = np.array([80.0, 120.0, 90.0, 140.0], dtype=float)
    final_demand = np.array([37.0, 67.0, 59.0, 98.0], dtype=float)
    emissions_intensity = np.array([0.72, 0.45, 0.60, 0.18], dtype=float)

    return sectors, transactions, total_output, final_demand, emissions_intensity


def technical_coefficients(transactions: np.ndarray, total_output: np.ndarray) -> np.ndarray:
    if np.any(total_output <= 0):
        raise ValueError("Total output must be positive for technical coefficient construction.")
    return transactions / total_output.reshape(1, -1)


def leontief_audit() -> tuple[LeontiefSystemAudit, np.ndarray, np.ndarray, np.ndarray]:
    sectors, transactions, total_output, final_demand, emissions_intensity = build_system()

    A = technical_coefficients(transactions, total_output)
    I = np.eye(len(sectors))
    net_requirements = I - A

    eigenvalues = np.linalg.eigvals(A)
    spectral_radius = float(np.max(np.abs(eigenvalues)))
    condition_number = float(np.linalg.cond(net_requirements))
    productive_system_flag = spectral_radius < 1.0

    leontief_inverse = np.linalg.solve(net_requirements, I)
    solved_output = leontief_inverse @ final_demand
    output_multipliers = leontief_inverse.sum(axis=0)

    demand_shock = np.array([0.0, 10.0, 0.0, 15.0], dtype=float)
    output_change = leontief_inverse @ demand_shock

    emissions_for_final_demand = float(emissions_intensity @ solved_output)
    highest_index = int(np.argmax(output_multipliers))

    audit = LeontiefSystemAudit(
        model_name="synthetic_leontief_intersectoral_dependence_audit",
        sectors=len(sectors),
        method="demand_driven_leontief_system",
        coefficient_basis="sector_input_per_unit_output",
        spectral_radius=round(spectral_radius, 12),
        condition_number=round(condition_number, 12),
        productive_system_flag=bool(productive_system_flag),
        maximum_output_multiplier=round(float(output_multipliers[highest_index]), 12),
        highest_multiplier_sector=sectors[highest_index],
        total_output_required=round(float(solved_output.sum()), 12),
        total_shock_output_change=round(float(output_change.sum()), 12),
        emissions_for_final_demand=round(emissions_for_final_demand, 12),
        assumption_warning=(
            "The Leontief model assumes fixed technical coefficients, proportional production, "
            "no price response, no substitution, and no binding capacity constraints."
        ),
        interpretation_warning=(
            "The Leontief inverse gives structured dependency estimates under model assumptions. "
            "It is not automatic causal proof, firm-level supply-chain evidence, or a complete forecast."
        ),
    )

    return audit, A, leontief_inverse, output_change


def write_outputs(output_dir: Path) -> None:
    (output_dir / "tables").mkdir(parents=True, exist_ok=True)
    (output_dir / "json").mkdir(parents=True, exist_ok=True)

    sectors, transactions, total_output, final_demand, emissions_intensity = build_system()
    audit, A, L, output_change = leontief_audit()
    row = asdict(audit)

    with (output_dir / "tables" / "leontief_system_audit.csv").open(
        "w", newline="", encoding="utf-8"
    ) as handle:
        writer = csv.DictWriter(handle, fieldnames=list(row.keys()))
        writer.writeheader()
        writer.writerow(row)

    with (output_dir / "tables" / "technical_coefficients.csv").open(
        "w", newline="", encoding="utf-8"
    ) as handle:
        writer = csv.writer(handle)
        writer.writerow(["supplying_sector"] + sectors)
        for sector, values in zip(sectors, A):
            writer.writerow([sector] + [round(float(v), 12) for v in values])

    with (output_dir / "tables" / "leontief_inverse.csv").open(
        "w", newline="", encoding="utf-8"
    ) as handle:
        writer = csv.writer(handle)
        writer.writerow(["supplying_sector"] + sectors)
        for sector, values in zip(sectors, L):
            writer.writerow([sector] + [round(float(v), 12) for v in values])

    with (output_dir / "tables" / "shock_output_change.csv").open(
        "w", newline="", encoding="utf-8"
    ) as handle:
        writer = csv.DictWriter(handle, fieldnames=["sector", "output_change"])
        writer.writeheader()
        for sector, value in zip(sectors, output_change):
            writer.writerow({"sector": sector, "output_change": round(float(value), 12)})

    (output_dir / "json" / "leontief_system_audit.json").write_text(
        json.dumps(row, indent=2, sort_keys=True),
        encoding="utf-8",
    )


if __name__ == "__main__":
    write_outputs(Path("outputs"))
    print("Leontief system and intersectoral dependence audit complete.")

This workflow keeps the coefficient matrix, productivity diagnostics, inverse solution, multipliers, shock response, environmental extension, and interpretation warnings in one reproducible audit.

Back to top ↑

R Workflow: Intersectoral Dependence Diagnostics

R can support Leontief diagnostics using matrix inversion, eigenvalue checks, condition numbers, multipliers, demand shocks, and environmental extensions.

sectors <- c("energy", "manufacturing", "transport", "services")

transactions <- matrix(
  c(
    8, 18, 10, 7,
    4, 12, 8, 11,
    3, 9, 6, 8,
    5, 14, 7, 16
  ),
  nrow = 4,
  byrow = TRUE
)

rownames(transactions) <- sectors
colnames(transactions) <- sectors

total_output <- c(80, 120, 90, 140)
final_demand <- c(37, 67, 59, 98)
emissions_intensity <- c(0.72, 0.45, 0.60, 0.18)

A <- sweep(transactions, 2, total_output, FUN = "/")
I <- diag(length(sectors))
net_requirements <- I - A

spectral_radius <- max(Mod(eigen(A)$values))
productive_system_flag <- spectral_radius < 1

leontief_inverse <- solve(net_requirements)
solved_output <- leontief_inverse %*% final_demand
output_multipliers <- colSums(leontief_inverse)

demand_shock <- c(0, 10, 0, 15)
output_change <- leontief_inverse %*% demand_shock
emissions_for_final_demand <- as.numeric(emissions_intensity %*% solved_output)

audit_record <- data.frame(
  model_name = "synthetic_leontief_intersectoral_dependence_audit",
  sectors = length(sectors),
  method = "demand_driven_leontief_system",
  coefficient_basis = "sector_input_per_unit_output",
  spectral_radius = spectral_radius,
  condition_number = kappa(net_requirements),
  productive_system_flag = productive_system_flag,
  maximum_output_multiplier = max(output_multipliers),
  highest_multiplier_sector = sectors[which.max(output_multipliers)],
  total_output_required = sum(solved_output),
  total_shock_output_change = sum(output_change),
  emissions_for_final_demand = emissions_for_final_demand,
  assumption_warning = paste(
    "The Leontief model assumes fixed technical coefficients, proportional production,",
    "no price response, no substitution, and no binding capacity constraints."
  ),
  interpretation_warning = paste(
    "The Leontief inverse gives structured dependency estimates under model assumptions."
  )
)

dir.create("outputs/tables", recursive = TRUE, showWarnings = FALSE)

write.csv(audit_record, "outputs/tables/r_leontief_system_audit.csv", row.names = FALSE)
write.csv(A, "outputs/tables/r_technical_coefficients.csv")
write.csv(leontief_inverse, "outputs/tables/r_leontief_inverse.csv")
write.csv(data.frame(sector = sectors, output_change = as.numeric(output_change)),
          "outputs/tables/r_shock_output_change.csv",
          row.names = FALSE)

print(audit_record)

This R workflow keeps intersectoral dependence diagnostics tied to matrix assumptions and productivity checks.

Back to top ↑

Haskell Workflow: Typed Leontief Records

Haskell can represent Leontief audit output as typed records, keeping productivity diagnostics, multipliers, shock response, extensions, and warnings attached to the result.

module Main where

data LeontiefSystemAudit = LeontiefSystemAudit
  { modelName :: String
  , sectors :: Int
  , method :: String
  , coefficientBasis :: String
  , spectralRadius :: Double
  , conditionNumber :: Double
  , productiveSystemFlag :: Bool
  , maximumOutputMultiplier :: Double
  , highestMultiplierSector :: String
  , totalOutputRequired :: Double
  , totalShockOutputChange :: Double
  , emissionsForFinalDemand :: Double
  , assumptionWarning :: String
  , interpretationWarning :: String
  } deriving (Show)

buildAudit :: LeontiefSystemAudit
buildAudit =
  LeontiefSystemAudit
    "synthetic_leontief_intersectoral_dependence_audit"
    4
    "demand_driven_leontief_system"
    "sector_input_per_unit_output"
    0.331
    2.41
    True
    1.47
    "manufacturing"
    319.8
    36.2
    150.6
    "The Leontief model assumes fixed technical coefficients, proportional production, no price response, no substitution, and no binding capacity constraints."
    "The Leontief inverse gives structured dependency estimates under model assumptions, not automatic causal proof."

main :: IO ()
main =
  print buildAudit

The typed record makes it harder to separate a multiplier from the assumptions and diagnostics that make it interpretable.

Back to top ↑

SQL Workflow: Leontief Governance Registry

SQL can document Leontief assumptions when input-output systems support economic planning, sustainability reporting, demand-shock scenarios, or resilience analysis.

CREATE TABLE leontief_governance_registry (
    assumption_key TEXT PRIMARY KEY,
    assumption_name TEXT NOT NULL,
    mathematical_role TEXT NOT NULL,
    systems_modeling_role TEXT NOT NULL,
    review_warning TEXT NOT NULL
);

INSERT INTO leontief_governance_registry VALUES
(
  'technical_coefficients',
  'Technical coefficients',
  'Define direct input requirements per unit of sector output.',
  'Represent direct intersectoral dependence.',
  'Coefficients assume stable production recipes over the scenario.'
);

INSERT INTO leontief_governance_registry VALUES
(
  'net_requirements',
  'Net requirements matrix',
  'Defines the system matrix I minus A.',
  'Links final demand to total output through a solvable linear system.',
  'Invertibility and conditioning should be reviewed before interpreting results.'
);

INSERT INTO leontief_governance_registry VALUES
(
  'leontief_inverse',
  'Leontief inverse',
  'Maps final demand into direct and indirect total output requirements.',
  'Summarizes system-wide intersectoral dependence.',
  'The inverse is a structured model estimate, not automatic causal proof.'
);

INSERT INTO leontief_governance_registry VALUES
(
  'productivity_condition',
  'Productivity condition',
  'Checks whether the coefficient system can satisfy positive final demand.',
  'Supports economic feasibility and nonnegative output interpretation.',
  'A computed inverse without productivity review can be misleading.'
);

INSERT INTO leontief_governance_registry VALUES
(
  'shock_scenario',
  'Shock scenario',
  'Defines a final demand change applied to the system.',
  'Estimates total output response under fixed coefficients.',
  'Demand shocks are not full dynamic forecasts or supply-constrained disruption models.'
);

INSERT INTO leontief_governance_registry VALUES
(
  'multiplier_interpretation',
  'Multiplier interpretation',
  'Summarizes total requirements per unit final demand.',
  'Supports compact comparison of sector dependence.',
  'Multipliers depend on sector aggregation, boundaries, imports, and assumptions.'
);

INSERT INTO leontief_governance_registry VALUES
(
  'extension_coefficients',
  'Extension coefficients',
  'Attach emissions, energy, labor, water, value-added, or other intensities to output.',
  'Connect final demand to indirect environmental or social requirements.',
  'Units, boundaries, allocation rules, and provenance must be documented.'
);

INSERT INTO leontief_governance_registry VALUES
(
  'responsible_use',
  'Responsible use',
  'Defines how assumptions, diagnostics, uncertainty, and limitations are communicated.',
  'Prevents total-requirements estimates from being overstated.',
  'Leontief systems should support structured interpretation, not replace domain judgment.'
);

SELECT
    assumption_name,
    mathematical_role,
    systems_modeling_role,
    review_warning
FROM leontief_governance_registry
ORDER BY assumption_key;

This registry keeps Leontief workflows tied to coefficient construction, net requirements, inverse structure, productivity, shocks, multipliers, extensions, and responsible interpretation.

Back to top ↑

GitHub Repository

The companion repository for this article is designed as a reproducible mathematical-modeling workspace. It supports Leontief system audits, technical coefficient construction, net requirements diagnostics, productivity checks, spectral radius review, condition-number calculations, Leontief inverse exports, multiplier summaries, demand-shock scenarios, environmental extensions, SQL governance tables, generated outputs, advanced mathematical audit reports, and reusable calculator scripts.

Back to top ↑

Interpretive Limits and Responsible Use

Leontief systems are powerful because they convert intersectoral dependence into a precise linear algebra problem. They can show how final demand requires total output, how direct and indirect requirements accumulate, how sectors depend on upstream suppliers, how multipliers summarize production structure, and how environmental or social extensions attach impacts to demand.

Their limits are equally important. A Leontief coefficient is not a timeless production law. A Leontief inverse is not automatic causal proof. A multiplier is not a forecast by itself. A sector is not a firm. A regional boundary is not the whole supply chain. A fixed-coefficient model does not automatically include substitution, prices, capacity constraints, inventories, time delays, logistics, or behavioral response. A demand-driven shock is not the same as a supply-constrained disruption.

Responsible use requires documenting the transactions table, sector classification, aggregation level, year, region, valuation basis, imports, coefficient construction, final demand scenario, productivity conditions, invertibility, condition number, spectral radius, multiplier type, environmental or social extensions, sensitivity tests, uncertainty, and interpretation limits. Leontief systems should clarify structured dependence without overstating precision, causality, or policy certainty.

Back to top ↑

Back to top ↑

Further Reading

Back to top ↑

References

Back to top ↑

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top