CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In

Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.

| Download

Public worksheets for UCLA's Mathematics for Life Scientists course

Views: 10255

The Loggerhead Sea Turtle

This model was first studied in a famous paper by Deborah Crouse, Larry Crowder, and Hal Caswell, published in 1987.

It uses seven life stages:

  1. First-year (eggs and hatchlings)

  2. Small juveniles (approx 1–7 years old)

  3. Large juveniles (approx 8–15 years old)

  4. Sub-adults (approx 16–21 years old)

  5. Novice breeders (approx 22 years old)

  6. First-year remigrants (approx 23 years old)

  7. Mature breeders (approx 24 years old and older)

Here's the original matrix they set up:

C = matrix(RDF, [ [0, 0, 0, 0, 127, 4, 80 ], [0.6747, 0.7370, 0, 0, 0, 0, 0 ], [0, 0.0486, 0.6610, 0, 0, 0, 0 ], [0, 0, 0.0147, 0.6907, 0, 0, 0 ], [0, 0, 0, 0.0518, 0, 0, 0 ], [0, 0, 0, 0, 0.8091, 0, 0 ], [0, 0, 0, 0, 0, 0.8091, 0.8089], ]) show("$C = $", C)
C=C = (0.00.00.00.0127.04.080.00.67470.7370.00.00.00.00.00.00.04860.6610.00.00.00.00.00.00.01470.69070.00.00.00.00.00.00.05180.00.00.00.00.00.00.00.80910.00.00.00.00.00.00.00.80910.8089)\displaystyle \left(\begin{array}{rrrrrrr} 0.0 & 0.0 & 0.0 & 0.0 & 127.0 & 4.0 & 80.0 \\ 0.6747 & 0.737 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0486 & 0.661 & 0.0 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0147 & 0.6907 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0 & 0.0518 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0 & 0.0 & 0.8091 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.8091 & 0.8089 \end{array}\right)
for eval in C.eigenvalues(): show(eval)
0.0884454744686+0.119599712287i\displaystyle -0.0884454744686 + 0.119599712287i
0.08844547446860.119599712287i\displaystyle -0.0884454744686 - 0.119599712287i
0.265452810019\displaystyle 0.265452810019
0.371666767651\displaystyle 0.371666767651
0.746170195288+0.213056538519i\displaystyle 0.746170195288 + 0.213056538519i
0.7461701952880.213056538519i\displaystyle 0.746170195288 - 0.213056538519i
0.945030980691\displaystyle 0.945030980691
T = transformation_matrix(C) show("$T = $", T.round(4))
T=T = (0.77680.00.570.4710.01270.29510.29080.62190.09010.81550.86990.93450.00.9430.03840.0120.10020.14610.07350.18380.16140.00070.00030.00350.00670.01060.00780.00930.00.00030.00070.00090.00080.00030.00050.0010.0010.00210.0020.00090.00010.00040.0010.00080.00310.00380.00070.00330.0026)\displaystyle \left(\begin{array}{rrrrrrr} -0.7768 & 0.0 & -0.57 & -0.471 & -0.0127 & -0.2951 & 0.2908 \\ 0.6219 & 0.0901 & 0.8155 & 0.8699 & -0.9345 & 0.0 & 0.943 \\ -0.0384 & -0.012 & -0.1002 & -0.1461 & -0.0735 & 0.1838 & 0.1614 \\ 0.0007 & 0.0003 & 0.0035 & 0.0067 & 0.0106 & 0.0078 & 0.0093 \\ -0.0 & -0.0003 & 0.0007 & 0.0009 & 0.0008 & 0.0003 & 0.0005 \\ -0.001 & 0.001 & 0.0021 & 0.002 & 0.0009 & 0.0001 & 0.0004 \\ 0.001 & -0.0008 & -0.0031 & -0.0038 & -0.0007 & -0.0033 & 0.0026 \end{array}\right)

Here's the diagonalization of C:

D = T.inverse()*C*T show("$D = $", D.round(4))
D=D = (0.08840.11960.00.00.00.00.00.11960.08840.00.00.00.00.00.00.00.26550.00.00.00.00.00.00.00.37170.00.00.00.00.00.00.00.74620.21310.00.00.00.00.00.21310.74620.00.00.00.00.00.00.00.945)\displaystyle \left(\begin{array}{rrrrrrr} -0.0884 & 0.1196 & -0.0 & 0.0 & 0.0 & -0.0 & -0.0 \\ -0.1196 & -0.0884 & -0.0 & -0.0 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.2655 & -0.0 & -0.0 & 0.0 & 0.0 \\ -0.0 & -0.0 & 0.0 & 0.3717 & 0.0 & -0.0 & -0.0 \\ 0.0 & 0.0 & 0.0 & 0.0 & 0.7462 & 0.2131 & -0.0 \\ 0.0 & -0.0 & 0.0 & -0.0 & -0.2131 & 0.7462 & -0.0 \\ -0.0 & 0.0 & -0.0 & 0.0 & -0.0 & -0.0 & 0.945 \end{array}\right)
for eval in C.eigenvalues(): show(abs(eval))
0.148750439102\displaystyle 0.148750439102
0.148750439102\displaystyle 0.148750439102
0.265452810019\displaystyle 0.265452810019
0.371666767651\displaystyle 0.371666767651
0.775991655201\displaystyle 0.775991655201
0.775991655201\displaystyle 0.775991655201
0.945030980691\displaystyle 0.945030980691

As you can see from the absolute values of the eigenvalues (above), the loggerhead sea turtle population (of the 1980s) was in decline, in fact at roughly 5.5% per year.

Below is a simulation of this system, as an interactive, which will show the long-term population decline. As usual, if you want to run this interactive, click the “Open in CoCalc” link at the top right of this worksheet to open this in your own CoCalc account. In this case, however, it's really not too necessary to see it, as the eigenvalues above don't lie!

@interact def seaturtles(n=(0, 100, 1)): state = vector([100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0]) for i in xrange(n+1): print("{:>8.2f} {:>8.2f} {:>8.2f} {:>8.2f} {:>8.2f} {:>8.2f} {:>8.2f}".format( *(float(s) for s in state))) state = C*state
Interact: please open in CoCalc

What happens if we protect nests and eggs?

C2 = matrix(RDF, [ [0, 0, 0, 0, 150, 6, 100 ], [0.6747, 0.7370, 0, 0, 0, 0, 0 ], [0, 0.0486, 0.6610, 0, 0, 0, 0 ], [0, 0, 0.0147, 0.6907, 0, 0, 0 ], [0, 0, 0, 0.0518, 0, 0, 0 ], [0, 0, 0, 0, 0.8091, 0, 0 ], [0, 0, 0, 0, 0, 0.8091, 0.8089], ]) show("$C_2 = $", C2)
C2=C_2 = (0.00.00.00.0150.06.0100.00.67470.7370.00.00.00.00.00.00.04860.6610.00.00.00.00.00.00.01470.69070.00.00.00.00.00.00.05180.00.00.00.00.00.00.00.80910.00.00.00.00.00.00.00.80910.8089)\displaystyle \left(\begin{array}{rrrrrrr} 0.0 & 0.0 & 0.0 & 0.0 & 150.0 & 6.0 & 100.0 \\ 0.6747 & 0.737 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0486 & 0.661 & 0.0 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0147 & 0.6907 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0 & 0.0518 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0 & 0.0 & 0.8091 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.8091 & 0.8089 \end{array}\right)

The matrix below shows the changes between this new matrix C2C_2 and the original matrix CC:

show("$C_2 - C = $", C2 - C)
C2C=C_2 - C = (0.00.00.00.023.02.020.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0)\displaystyle \left(\begin{array}{rrrrrrr} 0.0 & 0.0 & 0.0 & 0.0 & 23.0 & 2.0 & 20.0 \\ 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 \end{array}\right)
for eval in C2.eigenvalues(): show(eval)
0.0949198087649+0.126208222902i\displaystyle -0.0949198087649 + 0.126208222902i
0.09491980876490.126208222902i\displaystyle -0.0949198087649 - 0.126208222902i
0.316495044674+0.0717306262597i\displaystyle 0.316495044674 + 0.0717306262597i
0.3164950446740.0717306262597i\displaystyle 0.316495044674 - 0.0717306262597i
0.749499986831+0.22485415496i\displaystyle 0.749499986831 + 0.22485415496i
0.7494999868310.22485415496i\displaystyle 0.749499986831 - 0.22485415496i
0.955449554519\displaystyle 0.955449554519
T2 = transformation_matrix(C2) D2 = T2.inverse()*C2*T2 show("Diagonalization of $C_2$: ", D2.round(4))
Diagonalization of C2C_2: (0.09490.12620.00.00.00.00.00.12620.09490.00.00.00.00.00.00.00.31650.07170.00.00.00.00.00.07170.31650.00.00.00.00.00.00.00.74950.22490.00.00.00.00.00.22490.74950.00.00.00.00.00.00.00.9554)\displaystyle \left(\begin{array}{rrrrrrr} -0.0949 & 0.1262 & 0.0 & 0.0 & -0.0 & -0.0 & 0.0 \\ -0.1262 & -0.0949 & -0.0 & -0.0 & -0.0 & -0.0 & 0.0 \\ -0.0 & 0.0 & 0.3165 & 0.0717 & -0.0 & 0.0 & 0.0 \\ 0.0 & -0.0 & -0.0717 & 0.3165 & 0.0 & -0.0 & -0.0 \\ -0.0 & -0.0 & 0.0 & 0.0 & 0.7495 & 0.2249 & 0.0 \\ -0.0 & -0.0 & 0.0 & 0.0 & -0.2249 & 0.7495 & -0.0 \\ 0.0 & 0.0 & -0.0 & 0.0 & -0.0 & 0.0 & 0.9554 \end{array}\right)
for eval in C2.eigenvalues(): show(abs(eval))
0.157918604426\displaystyle 0.157918604426
0.157918604426\displaystyle 0.157918604426
0.324521795951\displaystyle 0.324521795951
0.324521795951\displaystyle 0.324521795951
0.782502154159\displaystyle 0.782502154159
0.782502154159\displaystyle 0.782502154159
0.955449554519\displaystyle 0.955449554519

Once again, the absolute values of all the eigenvalues, displayed above, show that even with these measures to protect the nests and eggs, the loggerhead population would still decline (now by 4.5% per year, only a slight improvement).

Again, you can try the interactive below if you want to see the decline for yourself.

@interact def seaturtles(n=(0, 150, 1)): state = vector([100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0]) for i in xrange(n+1): print("{:>8.2f} {:>8.2f} {:>8.2f} {:>8.2f} {:>8.2f} {:>8.2f} {:>8.2f}".format( *(float(s) for s in state))) state = C2*state
Interact: please open in CoCalc

What happens if we instead work on protecting juveniles, and especially older juveniles?

C3 = matrix(RDF, [ [0, 0, 0, 0, 127, 4, 80 ], [0.6747, 0.7470, 0, 0, 0, 0, 0 ], [0, 0.0531, 0.7597, 0, 0, 0, 0 ], [0, 0, 0.0403, 0.7289, 0, 0, 0 ], [0, 0, 0, 0.0710, 0, 0, 0 ], [0, 0, 0, 0, 0.8091, 0, 0 ], [0, 0, 0, 0, 0, 0.8091, 0.8089], ]) show("$C_3 = $", C3)
C3=C_3 = (0.00.00.00.0127.04.080.00.67470.7470.00.00.00.00.00.00.05310.75970.00.00.00.00.00.00.04030.72890.00.00.00.00.00.00.0710.00.00.00.00.00.00.00.80910.00.00.00.00.00.00.00.80910.8089)\displaystyle \left(\begin{array}{rrrrrrr} 0.0 & 0.0 & 0.0 & 0.0 & 127.0 & 4.0 & 80.0 \\ 0.6747 & 0.747 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0531 & 0.7597 & 0.0 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0403 & 0.7289 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0 & 0.071 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0 & 0.0 & 0.8091 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.8091 & 0.8089 \end{array}\right)
show("$C_3 - C = $", C3 - C)
C3C=C_3 - C = (0.00.00.00.00.00.00.00.00.010.00.00.00.00.00.00.00450.09870.00.00.00.00.00.00.02560.03820.00.00.00.00.00.00.01920.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0)\displaystyle \left(\begin{array}{rrrrrrr} 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.01 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0045 & 0.0987 & 0.0 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0256 & 0.0382 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0 & 0.0192 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 \end{array}\right)
for eval in C3.eigenvalues(): show(eval)
0.131007994203+0.169794165929i\displaystyle -0.131007994203 + 0.169794165929i
0.1310079942030.169794165929i\displaystyle -0.131007994203 - 0.169794165929i
1.05704194752\displaystyle 1.05704194752
0.79314828337+0.299401266144i\displaystyle 0.79314828337 + 0.299401266144i
0.793148283370.299401266144i\displaystyle 0.79314828337 - 0.299401266144i
0.33158873707+0.189769049033i\displaystyle 0.33158873707 + 0.189769049033i
0.331588737070.189769049033i\displaystyle 0.33158873707 - 0.189769049033i
T3 = transformation_matrix(C3) D3 = T3.inverse()*C3*T3 show("Diagonalization of $C_3$: ", D3.round(4))
Diagonalization of C3C_3: (0.1310.16980.00.00.00.00.00.16980.1310.00.00.00.00.00.00.01.0570.00.00.00.00.00.00.00.79310.29940.00.00.00.00.00.29940.79310.00.00.00.00.00.00.00.33160.18980.00.00.00.00.00.18980.3316)\displaystyle \left(\begin{array}{rrrrrrr} -0.131 & 0.1698 & 0.0 & 0.0 & -0.0 & -0.0 & -0.0 \\ -0.1698 & -0.131 & -0.0 & -0.0 & -0.0 & 0.0 & 0.0 \\ 0.0 & -0.0 & 1.057 & -0.0 & -0.0 & 0.0 & -0.0 \\ -0.0 & 0.0 & 0.0 & 0.7931 & 0.2994 & 0.0 & 0.0 \\ 0.0 & -0.0 & -0.0 & -0.2994 & 0.7931 & 0.0 & -0.0 \\ -0.0 & 0.0 & -0.0 & 0.0 & 0.0 & 0.3316 & 0.1898 \\ -0.0 & 0.0 & 0.0 & 0.0 & 0.0 & -0.1898 & 0.3316 \end{array}\right)

Now the dominant eigenvalue is larger than 1!!!

With these changes, the sea turtle population will grow healthily, at almost 6% per year!

for eval in C3.eigenvalues(): show(abs(eval))
0.214460143917\displaystyle 0.214460143917
0.214460143917\displaystyle 0.214460143917
1.05704194752\displaystyle 1.05704194752
0.84777669087\displaystyle 0.84777669087
0.84777669087\displaystyle 0.84777669087
0.382051544327\displaystyle 0.382051544327
0.382051544327\displaystyle 0.382051544327
@interact def seaturtles(n=(0, 100, 1)): state = vector([100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0]) for i in xrange(n+1): print("{:>8.2f} {:>8.2f} {:>8.2f} {:>8.2f} {:>8.2f} {:>8.2f} {:>8.2f}".format( *(float(s) for s in state))) state = C3*state
Interact: please open in CoCalc

The happy ending to this story

The conclusion of the Crouse–Crowder–Caswell paper was that it was more effective to focus conservation efforts on protecting the juveniles, and especially the older juveniles. The greatest threat to those life stages of sea turtles is being caught in fishing nets and drowning*. Thus, as a direct result of this research, the U.S. passed a law requiring all fishing nets used by U.S. companies to be fitted with a “turtle excluder device”. Not long after, an international treaty was agreed upon whereby most other countries in the world also now require fishing trawlers to use such devices.

Here is a Youtube video showing how one of these turtle excluder devices works, and another video showing one in action, including a medium-sized juvenile sea turtle escaping from a net equipped with a T.E.D.

Today, decades later, this effort has been successful enough that the loggerhead sea turtle is now classified as a species of “least concern” by the IUCN.

* Remember that turtles don't have gills; they need to swim to the surface regularly to breath.