Lotka-Volterra modeli

Oyun teorisi her zaman ilgimi çekmiştir. Geçtiğimiz yıllarda evrimsel oyun teorisine bir giriş yaptım fakat kullandığım kitapta birçok şey başlangıç seviyesi için uygun olmadığından çok ileri gidemedim. Geçenlerde başka bir kitap buldum ve şansımı bir de bununla deneyeyim dedim.

İlk pratik konular popülasyon modelleme üzerineydi. Bu modellerden birini bu yazıda anlamaya ve anlatmaya çalışacağım.

Bu modelde iki türden oluşan popülasyonların bir türü ele alınıyor. En basit örnekleri av ve avcılardan şeklindeki türler. Avcıların doğum oranı çevredeki av oranına bağlı. Ne kadar çok avlanabilirlerse o kadar iyi beslenirler ve üremeleri kolaylaşır. Avcıların ölüm miktarı ise normal şartlarda sadece kendi nüfuslarına bağlı. Aynı şekilde avların üreme miktarı sadece kendi nüfuslarına bağlıyken ölüm sayıları tabii ki avcıların sayısına da bağlı. Ortamdaki kaynakların hem av hem de avcı için yeterli olduğunu varsayalım.

Bu düşünceler doğrultusunda şimdi Lotka-Volterra denklemlerini yazayım. x av türünün nüfusu, y de avcı türünün nüfusu olsun.

\(\frac{dx}{dt} = \alpha x – \beta x \cdot y \)

\(\frac{dy}{dt} = \delta x \cdot y – \gamma y \)

Bu modeli biraz açıklamaya çalışayım. \(\frac{dx}{td} \) terimi av türünün nüfusunun zamana göre değişimini göstermekte. Yani bir süre geçince bu nüfusun artışını ya da azalışını, kısaca değişimini gösteriyoruz. Bu değişim o anki nüfus sayılarıyla ve bası sabitlerle orantılı. Aynı şekilde \(\frac{dy}{td} \) terimi de avcı nüfusundaki zamana göre değişimi ifade etmekte.

Denklemlerdeki sabitlere bakalım şimdi: Öncelikle bütün sabitlerin pozitif sayılar olduğunu varsayalım. Bu sayede o sabitlere daha alışık olduğumuz anlamlar yükleyebileceğiz.

\(alpha \) : av türünün doğum oranı. Doğum oranı av türünde sadece av türünün popülasyonunu etkiliyor. Bunu \(\alpha x \) ifadesinden görebiliyoruz. Av türünün çoğalması için çevredeki kaynaklara ve kendi türüne ihtiyacı var ve çevredeki kaynakların yeterli olduğunu varsaymıştık.

\(\beta \): bunu av türündeki ölüm oranı diye yorumlayabiliriz. Genelde iki tür arasındaki etkileşim faktörü olarak kullanılıyor ama bu denklemde ölüm oranı olarak çalıştığını görebiliriz. Öncelikle $\beta x \cdot y $ terimi diğer terimden çıkarılıyor, yani bir azalmayı simgeliyor. Diğer taraftan iki popülasyonun sayısına da etki ediyor. Yani bu sayılar arttıkça etkisi de artıyor. Bunu avcı sayısı arttıkça bu avcıların avlayacağı av sayısının artması şeklinde yorumlayabiliriz. Aynı şekilde av sayısı artarsa da avcılar daha kolay av bulacağından, az avcı olsa bile yine de daha çok av ölecektir.

\(\delta \): Bu sabiti de avcıların doğum oranı olarak düşünebiliriz. Aslında \(\beta \) sabiti gibi iki tür arasındaki bir etkileşim sabiti ama \(\delta x \cdot y \) teriminin pozitif olduğuna bakarsak avcı popülasyonunu artıracak bir etki yaptığını görürüz. Ayrıca iki popülasyona da bağlı bir artış sağlıyor. Eğer avcı sayısı artarsa türün üremesi kolaylaşacak. Eğer av sayısı artarsa avcılar daha iyi beslenebilecek ve yine daha çok üreyebilecekler.

\(\gamma \): Bu sabiti de avcıların ölüm oranı şeklinde düşünebiliriz. \(\gamma y \) teriminin diğer terimden çıkarılması popülasyonda azaltıcı bir etki yapacaktır ve bu da ölümü çağrıştırabilir. Av türü avcılar için tehdit olmadığında bu sabit av nüfusundan bağımsız bir etki yapmakta.

Şimdi bu denklemleri python programlarıyla deneyerek popülasyonların nasıl değiştiğinin grafiklerini elde etmeye çalışacağım.

import numpy as np
import matplotlib.pyplot as plt

x = 10
y = 10
alpha = 0.1
beta = 0.04
gamma = 0.04
delta = 0.01

populations = np.empty((0, 2), int)
populations = np.append(populations, np.array(
    [[x, y]]), axis=0)

for i in range(1, 1000):
    x = x + alpha*x - beta*x*y
    if x < 0:
        x = 0
    y = y + delta*x*y - gamma*y
    if y < 0:
        y = 0
    populations = np.append(populations, np.array(
        [[x, y]]), axis=0)

f, (ax1, ax2) = plt.subplots(2)

line1, = ax1.plot(populations[:, 0], color="b")
line2, = ax2.plot(populations[:, 1], color="r")

ax1.set_ylabel("Av")
ax2.set_ylabel("Avcı")
ax2.set_xlabel("zaman")
plt.show()

Av sayısı artışından hemen sonra bol besin bulan avcıların sayısı da hızla yükselmiş. Avcı sayısının yükselmesiyle av nüfusunda aşırı avlanma nedeniyle hızlı bir düşüş görülüyor. Grafikten ayrıca bu davranışların sürekli tekrarlandığını görüyoruz. Bu grafiğe bakıp her zaman bu tür bir nüfus değişimi gözlemleneceği düşünülmemeli ama. Sabit sayılara ve ilk durumdaki nüfus değerlerine göre çok farklı bir davranış da görülebilir. Şimdi buna bir örnek vereyim.


import numpy as np
import matplotlib.pyplot as plt

x = 10
y = 10
alpha = 0.1
beta = 0.1092
gamma = 0.04
delta = 0.01

populations = np.empty((0, 2), int)
populations = np.append(populations, np.array(
    [[x, y]]), axis=0)

for i in range(1, 5000):
    x = x + alpha*x - beta*x*y
    if x < 0:
        x = 0
    y = y + delta*x*y - gamma*y
    if y < 0:
        y = 0
    populations = np.append(populations, np.array(
        [[x, y]]), axis=0)

f, (ax1, ax2) = plt.subplots(2)

av, = ax1.plot(populations[:, 0], color="b")
avci, = ax2.plot(populations[:, 1], color="r")

ax1.set_ylabel("Av")
ax2.set_ylabel("Avcı")
ax2.set_xlabel("zaman")
plt.show()

Bu programda sadece \(\beta \) sabitini yükselttim, yani avcıların avlanma oranını artırdım. Bir noktadan sonra aşırı avlanmadan sonra av türünün nüfusu tamamen tükeniyor. Bu noktadan sonra avcılar da yok olmaya başlıyor.

Zamanı bu grafikte daha da ileriye götürdüm ki türlerin bir daha dirilmediği daha iyi görülebilsin. Demek ki seçilen sabitlere göre iki türün de ortadan kalkması mümkün.

Peki av türü ilk azalmadan sonra nasıl yeniden çoğalmayı başardı? Bunu görebilmek için grafiği çok büyütmek lazım.

Bu grafikte sadece av nüfusunu 3. ile 9. iterasyon arasında büyüttüm. Avcı grafiğine dokunmadım. Burada görüyoruz ki av nüfusu sıfıra çok yaklaşmış (\(5\cdot 10^{-11}\) ). Evet bu sayı gerçek hayatta çok anlamsız ama modeli tanımlayan diferansiyel denklemler için geçerli ve yeterli sayılar.

Bir de bu iki türün popülasyonlarını zamana göre değil de birbirlerine göre gösterebiliriz. Buna faz uzayı deniyor sanırım, ingilizcesi phase-space plot. Programı bir de bu gösterim için düzenledim.


from random import betavariate
import numpy as np
import matplotlib.pyplot as plt

x = 10
y = 10
alpha = 0.1
beta = 0.04
gamma = 0.04
delta = 0.01

populations = np.empty((0, 2), int)
populations = np.append(populations, np.array(
    [[x, y]]), axis=0)

for i in range(1, 1000):
    x = x + alpha*x - beta*x*y
    if x < 0:
        x = 0
    y = y + delta*x*y - gamma*y
    if y < 0:
        y = 0
    populations = np.append(populations, np.array(
        [[x, y]]), axis=0)

plt.plot(populations[:, 0], populations[:, 1])
plt.ylabel("avcı")
plt.xlabel("av")
plt.show()

Bu da programı çalıştırınca çıkan grafik:

Bu model çevremizdeki türleri çok iyi modellemese de uzun süre ekonomi alanında kullanılmış.