Activity I - Mathematical Models Applied to Ecology

Author

Amanda Beatriz Loureiro

Published

February 20, 2025

About the problem

“The elephant is reckoned the slowest breeder of all known animals, and I have taken some pains to estimate its probable minimum rate of natural increase: (…) it begins breeding at 30 years old, and goes on breeding till 90 years old, bringing forth 3 pairs of young in this interval; if this be so, at the end of the fifth century there would be alive fifteen million elephants, descended from the first pair.” (Chap. III, p. 75)”

Extracted Information

Note
  • Between 30 and 90 years, 3 pairs of individuals, equal to 6 individuals. So, we can say that every 30 years we have a pair, or every 90 years we have 3 pairs. The pair that reproduced dies every 90 years.
  • In 500 years, it is supposed to have 15 million individuals, resulting from the first pair.
  • It only makes sense if it’s *discrete*.

Discrete Malthus’ model exponential growth

First attempt

(Considering the offspring as all females, without deaths and starting with the first pair. The change in time occurs every 90 years, the final time of reproduction)

Code
b=6 # birth rate
d=0 # death rate
r=b-d # growth rate
n=2 # initial population size

time=seq(0,500,90)

dataMalthusA=data.frame(time=as.numeric(), population=as.numeric())

for(t in time){
  n1=n+r*n
  dataMalthusA[nrow(dataMalthusA)+1,]=c(t, n)
  n=n1
}

dataMalthusA
  time population
1    0          2
2   90         14
3  180         98
4  270        686
5  360       4802
6  450      33614

At time 540, we still have 235,298 individuals.

Second attempt

(Considering the offspring as all pairs, without deaths and starting with the first pair. The change in time also occurs every 90 years)

Code
b=6/2 # birth rate (pairs)
d=0 # death rate
r=b-d # growth rate
n=2 # initial population size

time=seq(0,500,90)

dataMalthusB=data.frame(time=as.numeric(), population=as.numeric())

for(t in time){
  n1=n+r*n
  dataMalthusB[nrow(dataMalthusB)+1,]=c(t, n)
  n=n1
}

dataMalthusB
  time population
1    0          2
2   90          8
3  180         32
4  270        128
5  360        512
6  450       2048

At time 540, we still have 8,192 individuals.

Third attempt

(Considering the offspring as all pairs, without deaths and starting with the first pair. The change in time occurs every 60 years, an average of the reproduction time.)

Code
b=6/2 # birth rate (pairs)
d=0 # death rate
r=b-d # growth rate
n=2 # initial population size

time=seq(0,500,60)

dataMalthusC=data.frame(time=as.numeric(), population=as.numeric())

for(t in time){
  n1=n+r*n
  dataMalthusC[nrow(dataMalthusC)+1,]=c(t, n)
  n=n1
}

dataMalthusC
  time population
1    0          2
2   60          8
3  120         32
4  180        128
5  240        512
6  300       2048
7  360       8192
8  420      32768
9  480     131072

At time 480, we still have 131,072 individuals.

Fourth attempt

(Considering the offspring as all females, without deaths and starting with the first pair. The change in time also occurs every 60 years)

Code
b=6 # birth rate
d=0 # death rate
r=b-d # growth rate
n=2 # initial population size

time=seq(0,500,60)

dataMalthusD=data.frame(time=as.numeric(), population=as.numeric())

for(t in time){
  n1=n+r*n
  dataMalthusD[nrow(dataMalthusD)+1,]=c(t, n)
  n=n1
}

dataMalthusD
  time population
1    0          2
2   60         14
3  120         98
4  180        686
5  240       4802
6  300      33614
7  360     235298
8  420    1647086
9  480   11529602

At time 480, we still have 11,529,602 individuals, the closest number to 15 million.

Fifth attempt

(Considering the offspring as all females, with two deaths per time and starting with the first pair. The change in time occurs every 30 years (The birth of a pair every 30 years.))

Code
b=6 # birth rate
d=2 # death rate
r=b-d # growth rate
n=2 # initial population size

time=seq(0,500,30)

dataMalthusE=data.frame(time=as.numeric(), population=as.numeric())

for(t in time){
  n1=n+r*n
  dataMalthusE[nrow(dataMalthusE)+1,]=c(t, n)
  n=n1
}

dataMalthusE
   time   population
1     0            2
2    30           10
3    60           50
4    90          250
5   120         1250
6   150         6250
7   180        31250
8   210       156250
9   240       781250
10  270      3906250
11  300     19531250
12  330     97656250
13  360    488281250
14  390   2441406250
15  420  12207031250
16  450  61035156250
17  480 305175781250

At time 480, we already have 305,175,781,250 individuals.

Sixth attempt

(Considering the offspring as all pairs, with two deaths per time and starting with the first pair. The change in time also occurs every 30 years)

Code
b=6/2 # birth rate
d=2 # death rate
r=b-d # growth rate
n=2 # initial population size

time=seq(0,500,30)

dataMalthusF=data.frame(time=as.numeric(), population=as.numeric())

for(t in time){
  n1=n+r*n
  dataMalthusF[nrow(dataMalthusF)+1,]=c(t, n)
  n=n1
}

dataMalthusF
   time population
1     0          2
2    30          4
3    60          8
4    90         16
5   120         32
6   150         64
7   180        128
8   210        256
9   240        512
10  270       1024
11  300       2048
12  330       4096
13  360       8192
14  390      16384
15  420      32768
16  450      65536
17  480     131072

At time 480, we still have 131,072 individuals.

Seventh attempt

(Considering the offspring as all pairs, without deaths and starting with the first pair. The change in time also occurs every 30 years)

Code
b=6/2 # birth rate
d=0 # death rate
r=b-d # growth rate
n=2 # initial population size

time=seq(0,500,30)

dataMalthusG=data.frame(time=as.numeric(), population=as.numeric())

for(t in time){
  n1=n+r*n
  dataMalthusG[nrow(dataMalthusG)+1,]=c(t, n)
  n=n1
}

dataMalthusG
   time population
1     0          2
2    30          8
3    60         32
4    90        128
5   120        512
6   150       2048
7   180       8192
8   210      32768
9   240     131072
10  270     524288
11  300    2097152
12  330    8388608
13  360   33554432
14  390  134217728
15  420  536870912
16  450 2147483648
17  480 8589934592

At time 480, we already have 8,589,934,592 individuals.

Eighth (and last) attempt

(Considering the offspring as all females, without deaths and starting with the first pair. The change in time also occurs every 30 years)

Code
b=6 # birth rate
d=0 # death rate
r=b-d # growth rate
n=2 # initial population size

time=seq(0,500,30)

dataMalthusH=data.frame(time=as.numeric(), population=as.numeric())

for(t in time){
  n1=n+r*n
  dataMalthusH[nrow(dataMalthusH)+1,]=c(t, n)
  n=n1
}

dataMalthusH
   time   population
1     0 2.000000e+00
2    30 1.400000e+01
3    60 9.800000e+01
4    90 6.860000e+02
5   120 4.802000e+03
6   150 3.361400e+04
7   180 2.352980e+05
8   210 1.647086e+06
9   240 1.152960e+07
10  270 8.070721e+07
11  300 5.649505e+08
12  330 3.954653e+09
13  360 2.768257e+10
14  390 1.937780e+11
15  420 1.356446e+12
16  450 9.495123e+12
17  480 6.646586e+13

At time 480, we will have 66,465,860,000,000 individuals, an exorbitant number.

Conclusions

The time of death (90 years) and the time of birth (30 years) of individuals are different, requiring an unfolding of the equations. Otherwise, the results will be overestimated or underestimated.

Even though we know that every ninety years the ancestral pair of elephants dies, sometimes the death is not considered, just in an attempt to reach the result of 15 million.

The end.