Diclaimer: Bloggerin matematiikkatyökalu on järjettömän buginen ja epäluotettava. Siksi olenkin tekstissäni pyrkinyt mahdollisuuksien mukaan välttämään ylimääräisten symbolien käyttöä.
Eräänä päivänä joskus ensimmäisen maailmansodan melskeiden jälkeisinä vuosina italialainen matemaatikko Vito Volterra sai tyttärensä ystävän vaikutuksesta tehtäväkseen selittää kalakantojen mystistä vaihtelua. Sodan vuoksi kalastaminen oli jäänyt maassa pitkäksi aikaa vähemmälle, ja Italian vesissä kaiken järjen mukaan eli enemmän saaliskalaa kuin aikoihin. Käytännössä kuitenkin huomattiin kalastajien haaveihin tarttuvan enemmän petoja kuin ravintoketjun pohjilla olevaa saalista. Volterra julkaisi tuloksensa vuonna 1926. Tämän tietämättä samaiseen tulokseen oli kuitenkin tullut Alfred J. Lotka soveltaessaan kemiallisiin reaktioihin kehittämiään funktioita biologisiin kohteisiin. Näin mallin nimeksi siis vakiintui Lotka-Volterran peto-saalis -malli. Kyseessä on yksi biologisen matematiikan perustuloksista.
Lotka-Volterra -peto-saalis-malli
Lotka-Volterran peto-saalis-malliksi kutsutaan seuraavaa yhtälöparia:
\begin{equation}
\frac{dx}{dt} = \alpha x - \beta xy \end{equation}
\begin{equation} \frac{dy}{dt} = \delta xy - \gamma y, \end{equation}
missä x on saaliseläinten esiintymistiheys, y saalistajien esiintymistiheys, alfa saaliseläimen maksimitiheys, beta saalistajan vaikutus saalistettavan lisääntymisnopeuteen, delta saaliseläimen vaikutus saalistajan lisääntymisnopeuteen sekä gamma saalistajan kuolemisnopeuteen.
Otetaan seuraavaksi esimerkki, jossa alfa on 1.1, beta 0.4, delta 0.1 ja gamma 0.4. Tällöin saadaan seuraavat ajasta riippuvat kuvaajat:
Kuvassa ylempänä saaliseläimen, tässä tapauksessa kalan, dynamiikka suhteutettuna saalistajan, eli karhun, vastaavaan suhteessa aikaan. Kuvasta huomataan petoeläimen nopean kasvun johtavan saaliseläimen ja pienellä viiveellä myös saalistajan itsensä kannan romahtamiseen. Saaliseläinten kannan kasvaessa seuraa saalistajan kanta perässä.
Esimerkki ja sen visualisointiin käytetty python-koodi löytyvät Mike Saint Antoinen Youtube-kanavalta, josta löytyy enemmänkin ekologiseen mallintamiseen paneutuvaa materiaalia käyttökelpoisine ja selkeine koodeineen. Näitä tullaan soveltamaan enemmänkin jatkossa sikäli kuin mahdollista.
Jatketaan kuitenkin mallimme ominaisuuksien tutkimista. Haetaan ensin Lotka-Volterran tasapainopisteet, eli kun derivaatta on nolla, kirjoitetaan
\begin{equation} 0 = \alpha x - \beta xy \end{equation}
\begin{equation} 0 = \delta xy - \gamma y, \end{equation}
\begin{bmatrix}\alpha-\beta y & -\beta x \\ \delta y & \delta x - \gamma \end{bmatrix}
huomataan, että pisteessä (0,0) matriisin ominaisarvot ovat alfa ja -gamma,
eli funktion nollapiste on satulapiste ja epästabiili, sillä kyseiset vakiot ovat mallissa
oletusarvoisesti nollaa suurempia, eivätkä ominaisarvot siksi voi missään kohtaa olla
samanmerkkiset. Näin siis lajit voivat kutistua kuinka pieneksi tahansa ja kasvaa silti entiseen
kokoonsa. Toisella tasapainopisteellä saadulla Jacobin matriisilla ei ole reaalisia ominaisarvoja.
Kahden lajin logistinen Lotka-Volterra -kilpailumalli
Johdetaan seuraavaksi kahden lajin välinen kilpailumalli yhdistelemällä Lotka-Volterraa ja logistista kasvufunktiota
\begin{equation}
\frac{dN_i}{dt} = r_i N_i (\frac{K_i-N_i}{K_i}) \end{equation}
missä N kuvaa populaation kokoa, K kapasiteettia sekä r kasvunopeutta. Yllä annettu kaava kuvaa lajin sisäisen kilpailun vaikutusta populaation kasvuun. Kun i = 1,2, saadaan kahden eri populaation toisistaan erillinen sisäinen dynamiikka. Yhdistämällä kahden populaation logistiset kasvumallit Lotka-Volterraan saadaan
\begin{equation}
\frac{dN_1}{dt} = r_1 N_1 (\frac{K_1-N_1-\alpha_{12}N_2}{K_1}) \end{equation}
\begin{equation}
\frac{dN_2}{dt} = r_2 N_2 (\frac{K_2-N_2-\alpha_{21}N_1}{K_2}) \end{equation}
Kaavat kuvaavat kahden populaation kilpailullista tilannetta, alfat toisen populaation vaikutusta toisen kasvuun. Edelleen voidaan laskea tasapainoehdot:
\begin{equation} N_1 = K_1 - \alpha_{12}N_2 \end{equation}
\begin{equation} N_2 = K_2 - \alpha_{21}N_1 \end{equation}
mistä huomataan, että kun kun ylemmässä kaavassa N_1 = 0, saadaan N_2 = K_1/alfa_12 sekä alemmassa N_1 = K_2/alfa_21 kun N_2 = 0. Tulosta vastaavat kuvat virtaussuuntineen ja perusteluineen löytyvät täältä. Ottamalla seuraavaksi Jacobin matriisi, jonka diagonaalialkiot ovat muotoa
\begin{equation} J_{ii} = r_i(\frac{K_i-2N_i-\alpha_{ij}N_j}{K_i}) \end{equation}
sekä päätyalkiot muotoa
\begin{equation} J_{ij} = \frac{-r_i N_j \alpha_{ji}}{K_i} \end{equation}
Asettamalla saadut tasapainopisteet (K_1/a_21,0) ja (0,K_2/a_12), huomataan, että päätyalkioista toinen menee aina nollaan, toinen diagonaalialkioista on aina negatiivinen sekä matriisin ominaisarvot ovat samanmerkkisiä vain jos pätee K_1/a_21 > K_2 ja K_2/a_12 > K_1.
Esimerkkinä kahden kilpaleivan lajin vaikutuksesta toisiinsa saa helposti luotua kuvaajat muokkaamalla aiempaa koodia. Satunnaisilla annetuilla arvoilla saadaan susien ja karhujen välisestä kilpailusta seuraavat kuvaajat:
Kuvasta nähdään, että koska kasvuvakio r_1 > r_2, susien lisääntyminen on nopeampaa, mutta karhujen ilmaantuessa kilpailemaan elintilasta näiden populaatioiden koot tasaantuvat sinne 600-650 tietämille kummassakin. Kyseessä on kahden lajin välinen stabiili tasapainotila, sillä annetuilla arvoilla K_(1,2) = 1000 sekä alfa_(1,2) = 0.5 stabiilin tasapainopisteen ehdot täyttyvät.
Kilpailumallissa käytetty Python-koodi, muokattu aiemmasta koodista:
import numpy as np
import matplotlib
matplotlib.use('tkagg')
import matplotlib.pyplot as plt
from scipy.integrate import odeint
y0 = [10,1]
t = np.linspace(0,50,num=1000)
alpha_12 = 0.5
alpha_21 = 0.5
r_1 = 0.8
r_2 = 0.7
K_1 = 1000
K_2 = 1000
params = [alpha_12, alpha_21,r_1,r_2,K_1,K_2]
x = variables[0]
y = variables[1]
alpha_12 = params[0]
alpha_21 = params[1]
r_1 = params[2]
r_2 = params[3]
K_1 = params[4]
K_2 = params[5]
dxdt = r_1 * x * (K_1 - x - alpha_12 * y)/K_1
dydt = r_2 * y * (K_2 - y - alpha_21 * x)/K_2
return([dxdt,dydt])
y = odeint(sim, y0, t, args=(params,))
f,(ax1,ax2) = plt.subplots(2)
line1, = ax1.plot(t,y[:,0], color="b")
line2, = ax2.plot(t,y[:,1], color="r")
ax1.set_ylabel("Wolves (hundreds)")
ax2.set_ylabel("Bears (hundreds)")
ax2.set_xlabel("Time")
plt.show()

