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, fromElement
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))))