Lotka-Volterra modelinin kararlılığı

Evrimsel oyun teorisi kitabında şimdi de sistemlerde kararlılıklar konusuna giriş kısmına geldim. Nüfus konusunda kararlılıktan kastedilen şöyle bir şey. Sistemdeki nüfuslar kararlı bir durumdaysa, bu nüfuslarda yapılan ufak değişiklikler sonunda sistem yine bu kararlı olduğu durumdaki nüfuslara yakın sayılarda kalacak. Anladığım kadarıyla kararlı durumdaki sayılara dönmek zorunda değil. Bu farklı kararlılıkların da değişik isimleri var. Örneğin nüfuslar bir zaman sonra (çok uzun zaman da olsa) baştaki kararlı durumdaki sayılara dönüyorsa asimptotik kararlılık deniyor. Eğer baştaki sayılara dönmüyorlar ama her zaman yakınlarda kalıyorlarsa da Lyapunov kararlı deniyormuş.

Geçenlerde bir yazıda Lotka-Volterra modelini anlamaya çalışmıştım. Modelin denklemleri aşağıdaki gibiydi:

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

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

\(x \) ve \(y \) av ve avcı türlerinin nüfuslarıdır. \(\frac{dx}{dt}\) ve \(\frac{dy}{dt}\) değerleri de bu nüfusların her adımda ne kadar değiştiğini gösteriyor. Eğer kararlı bir durumdaysak bu değişimlerin 0 olmasını bekleriz, yani nüfusların sabit kaldığı noktalardayızdır. Nüfusların sabit kalacağı noktaların biri iki nüfusun da sıfır olduğu yerdir. İki tür de yok olduğundan yeni bireylerin oluşma şansı yoktur (normal şartlarda). Bu çok ilginç bir durum değil ama. Bunun yerine bu iki türün aynı anda kararlı bir şekilde varlığını sürdürebildiği bir çözüme bakmak istiyorum. Bunun için değişim terimlerinin sıfır olduğu diğer çözümlere bakacağım.

Önce x nüfusundaki değişikliğin sıfır olması için y nüfusunun kaç olması gerektiğini bulayım.

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

\(\alpha x = \beta x \cdot y \)

\(\frac{\alpha}{\beta} \frac {x}{x} = y \)

\(y = \frac {\alpha}{\beta} \)

Şimdi aynı şekilde y nüfusundaki değişikliğin sıfır olması için x nüfusunun ne olması gerektiğine bakayım.

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

\(\delta x \cdot y = \gamma y \)

\(x = \frac {\gamma}{\delta} \frac {y}{y} \)

\(x = \frac {\gamma}{\delta} \)

Bu eşitlikleri aşağıdaki programla denediğim zaman nüfusların gerçekten de sabir kaldığını gördüm.

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

alpha = 0.1
beta = 0.04
gamma = 0.04
delta = 0.01

x = gamma/delta
y = alpha/beta


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()

Peki bu kararlı nüfusları azıcık değiştirirsem ne olur diye düşündüm.

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

alpha = 0.1
beta = 0.04
gamma = 0.04
delta = 0.01

x = gamma/delta + 0.01
y = alpha/beta - 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()

Bu programda başlangıç nüfuslarını çok az değiştirdim ve sonuçta aşağıdaki nüfus değişim grafiğini elde ettim.

Burada da görüldüğü gibi nüfuslar kararlı nüfusların yakınlarında kalıyor ama kararlı nüfuslara dönmüyor. Demek ki bu sistemde asimptotik kararlılık değil de Lyapunov kararlılığı var. Bunu böyle pat diye söyledim ama dayanağım ne? Şimdiye kadar sadece tek bir deneme yaptım ve bu denemeyi sonsuza kadar bile götürmedim. Demek ki biraz da matematik yapmak gerekecek ama o da başka bir yazıda artık.

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ış.