Skip to content

Population and pollution

The pollution model of Bala, Arshad, and Noh, a population that degrades its environment.

  • Name: population_pollution
  • Field: physics/climate
  • Formalism: ordinary differential equations
  • References: Bala et al. 2017

Select this system

from skcomplex.systems import create_simulation, create_system, describe

system = create_system('population_pollution')
entry = describe('population_pollution')
trajectory = create_simulation('population_pollution').prepare().run().trajectory_

Factory

@register_system(
    field='physics/climate',
    tags=('pollution', 'population', 'stocks and flows', 'system dynamics', 'lookup tables', 'ode'),
    references=('Bala et al. 2017',),
    defaults={'until': 50.0, 'dt': 0.25},
    observables=lambda system: [
        ObservableSpec('food_per_capita', PollutedRegionElement._food_per_capita, element='region'),
        ObservableSpec('quality_of_life', PollutedRegionElement._quality_of_life, element='region'),
    ],
)
def population_pollution(
    population: float = 1e8,
    pollution: float = 1e7,
    *,
    pollution_normal: float = 0.25,
    pollution_standard: float = 1.5e7,
    birth_normal: float = 0.04,
    death_normal: float = 0.028,
) -> System:
    """Return the pollution model of Bala, Arshad, and Noh, a population that degrades its environment.

    The population generates pollution at `pollution_normal` per person per year, and the environment absorbs the
    pollution over a time that lengthens from 0.6 to 20 years as the pollution ratio, pollution over its standard,
    rises from 0 to 60. This makes the absorption saturate, so a growing population can drive the pollution up
    steeply. Pollution lowers births, food, and the quality of life, and raises deaths, through table multipliers,
    while food per capita over the subsistence food raises births and lowers deaths. The cropping intensity rises
    from 1.75 to 2.5 crops per year over 50 years. The model follows Section 4.11.9 of Bala et al. (2017), with its
    tables and parameters, and time in years.

    Args:
        population:
            The initial population.

        pollution:
            The initial pollution.

        pollution_normal:
            The pollution one person generates per year.

        pollution_standard:
            The pollution that the pollution ratio divides by.

        birth_normal:
            The normal birth rate per year.

        death_normal:
            The normal death rate per year.

    Returns:
        system:
            The system, with the stocks `region.population` and `region.pollution`, and the observables
            `region.food_per_capita` and `region.quality_of_life`.

    Examples:
        >>> from skcomplex.systems.physics.climate import population_pollution
        >>> population_pollution(pollution_normal=0.5).elements[0].pollution_normal
        0.5
    """
    region = PollutedRegionElement(
        'region',
        population=population,
        pollution=pollution,
        pollution_normal=pollution_normal,
        pollution_standard=pollution_standard,
        birth_normal=birth_normal,
        death_normal=death_normal,
    )
    return System(elements=[region])

Components

Elements:

  • PollutedRegionElement, from Element
class PollutedRegionElement(Element):
    """Population of a region and the pollution it generates, which the environment absorbs ever more slowly.

    The pollution grows by `pollution_normal` per person and is absorbed over a time that a table lengthens with the
    pollution ratio, the pollution over its standard. The births and the deaths are the normal rates times table
    multipliers of the food ratio, the food per capita over the subsistence food, and of the pollution ratio. The food
    is the cultivated land times the yield, a cropping intensity that a table raises over time, and a table
    multiplier of the pollution ratio.

    Args:
        label:
            The label of the region.

        visual:
            How the region is drawn, or `None` for `default_visual_`.

        population:
            The initial population.

        pollution:
            The initial pollution.

        pollution_normal:
            The pollution one person generates per year.

        pollution_standard:
            The pollution that the pollution ratio divides by.

        birth_normal:
            The normal birth rate per year.

        death_normal:
            The normal death rate per year.

        subsistence_food:
            The food per capita that the food ratio divides by.

        cultivated_land:
            The cultivated land.

        crop_yield:
            The yield of the land per crop.

    Attributes:
        default_visual_:
            The visual of the region when it sets none.

    Examples:
        >>> from skcomplex.systems.physics.climate import PollutedRegionElement
        >>> PollutedRegionElement('region').birth_normal
        0.04
    """

    def __init__(
        self,
        label: str,
        visual: VisualSpec | None = None,
        *,
        population: Annotated[float, StateSpec(domain=RealSet.closed_open(0, oo))] = 1e8,
        pollution: Annotated[float, StateSpec(domain=RealSet.closed_open(0, oo))] = 1e7,
        pollution_normal: Annotated[float, ParameterSpec(domain=RealSet.closed_open(0, oo))] = 0.25,
        pollution_standard: Annotated[float, ParameterSpec(domain=RealSet.open(0, oo))] = 1.5e7,
        birth_normal: Annotated[float, ParameterSpec(domain=RealSet.closed_open(0, oo))] = 0.04,
        death_normal: Annotated[float, ParameterSpec(domain=RealSet.closed_open(0, oo))] = 0.028,
        subsistence_food: Annotated[float, ParameterSpec(domain=RealSet.open(0, oo))] = 180.0,
        cultivated_land: Annotated[float, ParameterSpec(domain=RealSet.closed_open(0, oo))] = 7.4e6,
        crop_yield: Annotated[float, ParameterSpec(domain=RealSet.closed_open(0, oo))] = 2200.0,
    ) -> None:
        super().__init__(label, visual=visual)
        self.population = population
        self.pollution = pollution
        self.pollution_normal = pollution_normal
        self.pollution_standard = pollution_standard
        self.birth_normal = birth_normal
        self.death_normal = death_normal
        self.subsistence_food = subsistence_food
        self.cultivated_land = cultivated_land
        self.crop_yield = crop_yield

    @staticmethod
    def _pollution_ratio(s: SimpleNamespace) -> Expression:
        """Return the pollution ratio, the pollution over its standard."""
        return s.pollution / s.pollution_standard

    @staticmethod
    def _food_per_capita(s: SimpleNamespace) -> Expression:
        """Return the food per capita, from the land, the yield, the cropping intensity, and the pollution."""
        ratio = PollutedRegionElement._pollution_ratio(s)
        intensity = lookup(s.t, CROPPING_INTENSITY)
        food = s.cultivated_land * s.crop_yield * intensity * lookup(ratio, FOOD_FROM_POLLUTION)
        return food / s.population

    @staticmethod
    def _quality_of_life(s: SimpleNamespace) -> Expression:
        """Return the quality of life, the product of the table multipliers of the food and the pollution ratios."""
        food_ratio = PollutedRegionElement._food_per_capita(s) / s.subsistence_food
        ratio = PollutedRegionElement._pollution_ratio(s)
        return lookup(food_ratio, LIFE_FROM_FOOD) * lookup(ratio, LIFE_FROM_POLLUTION)

    def _get_laws(self, s: SimpleNamespace) -> list[BaseLaw]:
        """Return the flows of the population and the pollution.

        Args:
            s:
                The namespace of the symbols the laws can use.

        Returns:
            laws:
                The rate laws of the two stocks.
        """
        ratio = self._pollution_ratio(s)
        food_ratio = self._food_per_capita(s) / s.subsistence_food
        births = s.birth_normal * lookup(food_ratio, BIRTHS_FROM_FOOD) * lookup(ratio, BIRTHS_FROM_POLLUTION)
        deaths = s.death_normal * lookup(food_ratio, DEATHS_FROM_FOOD) * lookup(ratio, DEATHS_FROM_POLLUTION)
        absorption = s.pollution / lookup(ratio, ABSORPTION_TIME)
        return [
            RateLaw(s.population, s.population * (births - deaths)),
            RateLaw(s.pollution, s.pollution_normal * s.population - absorption),
        ]

Equations

region.population: diff(population_region(t), t) == -(death_normal_region*where(pollution_region(t)/pollution_standard_region < 0.0, 0.92, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, 0.038000000000000006*pollution_region(t)/pollution_standard_region + 0.92, where(pollution_region(t)/pollution_standard_region < 20.0, 0.19999999999999998*pollution_region(t)/pollution_standard_region - 0.6999999999999997, 0.15000000000000002*pollution_region(t)/pollution_standard_region + 0.2999999999999998)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, 0.2*pollution_region(t)/pollution_standard_region - 1.2000000000000002, 0.23999999999999996*pollution_region(t)/pollution_standard_region - 2.799999999999998), where(pollution_region(t)/pollution_standard_region < 60.0, 0.030000000000000072*pollution_region(t)/pollution_standard_region + 7.699999999999996, 9.5))))*where(crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) < 0.0, 30.0, where(crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) < 1.0, where(crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) < 0.5, where(crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) < 0.25, -108.0*crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) + 30.0, -4.0*crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) + 4.0), where(crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) < 0.75, -2.4000000000000004*crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) + 3.2, -1.5999999999999996*crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) + 2.5999999999999996)), where(crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) < 1.5, where(crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) < 1.25, -1.2000000000000002*crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) + 2.2, -0.3999999999999999*crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) + 1.1999999999999997), where(crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) < 1.75, -0.3999999999999999*crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) + 1.1999999999999997, 0.5)))) - birth_normal_region*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.020000000000000007*pollution_region(t)/pollution_standard_region + 1.1, -0.029999999999999995*pollution_region(t)/pollution_standard_region + 1.2999999999999998)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.015000000000000003*pollution_region(t)/pollution_standard_region + 0.8500000000000001, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.65), where(pollution_region(t)/pollution_standard_region < 60.0, -0.004999999999999999*pollution_region(t)/pollution_standard_region + 0.39999999999999997, 0.1))))*where(crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) < 0.0, 0.0, where(crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) < 2.0, where(crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) < 1.0, 1.0*crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)), 0.6000000000000001*crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) + 0.3999999999999999), where(crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) < 3.0, 0.2999999999999998*crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) + 1.0000000000000004, where(crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) < 4.0, 0.10000000000000009*crop_yield_region*cultivated_land_region*where(t < 0.0, 1.75, where(t < 30.0, where(t < 10.0, 0.0050000000000000044*t + 1.75, where(t < 20.0, 0.009999999999999988*t + 1.7000000000000002, 0.010000000000000009*t + 1.6999999999999997)), where(t < 40.0, 0.029999999999999985*t + 1.1000000000000005, where(t < 50.0, 0.020000000000000018*t + 1.4999999999999991, 2.5))))*where(pollution_region(t)/pollution_standard_region < 0.0, 1.02, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, -0.012*pollution_region(t)/pollution_standard_region + 1.02, where(pollution_region(t)/pollution_standard_region < 20.0, -0.025*pollution_region(t)/pollution_standard_region + 1.15, -0.030000000000000006*pollution_region(t)/pollution_standard_region + 1.25)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, -0.014999999999999998*pollution_region(t)/pollution_standard_region + 0.7999999999999999, -0.010000000000000002*pollution_region(t)/pollution_standard_region + 0.6000000000000001), where(pollution_region(t)/pollution_standard_region < 60.0, -0.005000000000000001*pollution_region(t)/pollution_standard_region + 0.35, 0.05))))/(subsistence_food_region*population_region(t)) + 1.5999999999999996, 2.0)))))*population_region(t)
region.pollution: diff(pollution_region(t), t) == pollution_normal_region*population_region(t) - pollution_region(t)/where(pollution_region(t)/pollution_standard_region < 0.0, 0.6, where(pollution_region(t)/pollution_standard_region < 30.0, where(pollution_region(t)/pollution_standard_region < 10.0, 0.19*pollution_region(t)/pollution_standard_region + 0.6, where(pollution_region(t)/pollution_standard_region < 20.0, 0.25*pollution_region(t)/pollution_standard_region, 0.30000000000000004*pollution_region(t)/pollution_standard_region - 1.0)), where(pollution_region(t)/pollution_standard_region < 50.0, where(pollution_region(t)/pollution_standard_region < 40.0, 0.35000000000000003*pollution_region(t)/pollution_standard_region - 2.5, 0.4*pollution_region(t)/pollution_standard_region - 4.5), where(pollution_region(t)/pollution_standard_region < 60.0, 0.45*pollution_region(t)/pollution_standard_region - 7.0, 20.0))))