Modelo de Lotka-Volterra amortecido

De Física Computacional
Ir para navegação Ir para pesquisar


Anterior: Modelo de Lotka-Volterra | Índice: Ecologia | Próximo: Modelo de Levins aprimorado para 2 espécies I

Uma versão do modelo de Lotka-Volterra aprimorada inclui um termo de saturação na população de presas, isto é, um termo logístico (que inibe o aumento exponencial) visando representar a finitude dos recursos disponíveis para uma espécie. Este modelo é chamado de modelo de Lotka-Volterra amortecido.

  • dxdt=x(aαy)kx2
  • dydt=y(c+γx)

Onde k é uma constante positiva. Agora temos três pontos de equilíbrio, novamente temos (0,0). Mas temos outro ponto quando apenas y=0:

aαykx=akx=0x=ak

Então (ak,0) ou seja um ponto de equilíbrio com apenas a sobrevivência da presa. E ainda temos também um ponto de coexistência entre ambas as espécies:

aαykx=0c+γx=0

Isolando então x na segunda equação x=cγ e substituindo na primeira:

aαykcγ=0Então:y=aαkcαγ=γakcαγ

Então nosso outro ponto de equilíbrio é dado por(cγ,γakcαγ). Infelizmente as equações não são separáveis como no caso anterior, portanto vamos analisar se a equação é semi-linear nas proximidades dos pontos de equilíbrio. Para (0,0):

lim(x,y)(0,0)αxykx2xa=lim(x,y)(0,0)αykxa=0lim(x,y)(0,0)γxycy=lim(x,y)(0,0)γcx=0

Para (ak,0) e fazendo a mudança de variáveis u=xak, e v=y, temos:

dudt=((u+ak)ak(u+ak)2)(α(u+ak)v)dudt=(ua+a2k(u2k+a2k+2ua))(αuv+αakv)dudt=(ua+αakv)(αuv+u2k)

E:

dvdt=(vc)+(γv(u+ak))=v(γakc)+(γvu)

Então:

lim(u,v)(0,0)(αuv+u2kua+αakv)=lim(u,v)(0,0)(αuv+u2ku(a+αakvu))=lim(u,v)(0,0)(αv+uk(a+αakvu))

Podemos fazer uma substituição de variável novamente usando coordenadas polares[1] r2=u2+v2 e u=rcosθ, v=rsinθ, então:

limr0(αrsinθ+krcosθ(a+αakrsinθrcosθ))=limr0(αkrsinθ+k2rcosθ(ka+αatanθ))=0

E o limite:

lim(u,v)(0,0)γvuv(γakc)=lim(u,v)(0,0)γu(γakc)=0

E por fim, vamos estudar os pontos de estabilidade em torno de (cγ,γakcαγ), tendo agora u=xcγ e v=γakcαγy, então, manipulando novamente, primeiro trabalhando com x˙:

dxdt=(xakx2)(αxy)dudt=((cγ+u)ak(cγ+u)2)(α(cγ+u)(v+γakcαγ))dudt=(caγ+aukc2γ2ku22ckγu)(cαγv+γackc2γ2+αuv+[γakcγ]u)dudt=((caγkc2γ2γackc2γ2)+(a2ckγ[γakcγ]ku)ucαγv)(αuv)dudt=((kcγku)ucαγv)(αuv)dudt=(kcγu+cαγv)(αuv+ku2)

E com y˙:

dydt=(yc)+(γyx)dvdt=((v+γakcαγ)c)+(γ(v+γakcαγ)(cγ+u))dvdt=(vcacα+kc2αγ)+(vc+γackc2αγ+γuv+[γakcα]u)dvdt=γuv+[γakcα]u

Calculando então os limites, relacionado a u:

lim(u,v)(0,0)(αuv+ku2kcγu+cαγv)=lim(u,v)(0,0)(αuv+ku2u(kcγ+cαγvu))=lim(u,v)(0,0)(αv+kukcγ+cαγvu)

E novamente fazendo a substituição r2=u2+v2 e u=rcosθ, v=rsinθ, então:

limr0(αrsinθ+krcosθkcγ+cαγrsinθrcosθ)=limr0(rαγsinθ+rkγcosθkc+cαtanθ)=0

E a v:

lim(u,v)(0,0)γuv[γakcα]u=lim(u,v)(0,0)γv[γakcα]=0

Então os três pontos são semi-lineares. A partir disto, podemos analisar os tipos de estabilidades. Para (0,0):

(x˙y˙)=(a00c)(xy)

Então:

(aλ)(c+λ)=0 Novamente temos duas raízes reais de sinais opostos, então temos um ponto de sela, uma instabilidade. Para o segundo ponto:

(u˙v˙)=(aαak0γakc)(uv)

Então:

(aλ)((γakc)λ)=0(a+λ)((γakc)λ)=0

Temos duas raízes reais uma é negativa λ1=a. Porém a classificação do ponto depende dos parâmetros escolhidos. Se (γakc)>0 ou seja γa>ck, temos uma instabilidade, uma sela, mas se γa<ck, então temos um nó hiperbólico, ou seja, estabilidade. E por último:

(u˙v˙)=(kcγcαγγakcα0)(uv)

Então:

(kcγ+λ)λ+cαγ(γakcα)=0γλ2+kcλ+c(γakc)=0

Então:

λ=(kc2γ)±(kc)24γc(γakc)2γλ=(kc2γ)±[(kc)2+4γc2k]4cγ2a2γ

Então o comportamento do sistema vai depender da escolha de parâmetros, porém como todas constantes são positivas (kc2γ) vai ser sempre negativo, e a única forma de ser instável é se (kc)2+4γc2k>4cγ2a, para garantir que o número seja real, e ainda (kc)2+4γc2k4cγ2a2γ>kc2γ para que o autovalor seja positivo. Analisando então essa última desigualdade:

(kc)2+4γc2kc4cγ2a2γ>kc2γ(kc)2+4γc2k4cγ2a>kc

Elevando ao quadrado:

(kc)2+4γc2k4cγ2a>(kc)24γc2k4cγ2a>0

Dividindo por 4cγ

ckγa>0ck>γa

Então essa é a condição para que o autovalor seja positivo. E olhando pra primeira desigualdade:

(kc)2+4γc2k>4cγ2ak2c4γ+ck>γa

Para garantir que o número seja real. Então temos duas desigualdades para satisfazer para que seja instável:

  • ck>γa
  • k2c4γ+ck>γa

Como (k2c4γ) é necessariamente um termo positivo:

γa<ck<k2c4γ+ck

Ou seja, podemos restringir a condição de instabilidade para ck>γa pois ck<k2c4γ+ck é uma desigualdade válida para qualquer escolha de parâmetros válidos. Mas lembrando que para o outro ponto é estável se ck>γa , então sempre temos um ponto de equilíbrio estável e outro instável (além do a instabilidade na origem). Ou seja, por exemplo para valores mais baixos de de c (termo de crescimento dos predadores) ou k (termo de amortecimento da presa) temos coexistência de ambas as espécies, se aumentar estes parâmetros, somente a presa sobrevive. Além disso, quando temos k=0:

λ=±4cγ2a2γ=±ica

Ou seja, temos apenas a parte imaginária, e retornamos à estabilidade do centro. Dessa forma k=0 ou k0 determina se o sistema atinge equilíbrio ou permanece oscilatório, e depois o conjunto de parâmetros, caso atinja estabilidade, determina se ela é atingida com ou sem predadores.

Exemplo

Para estudarmos melhor uma situação, vamos escolher os parâmetros: a=1, α=0.5, k=0.5, c=0.75,γ=0.5. Então os pontos de equilíbrio são:

  • (0,0)λ={1,0.75}, uma sela, instável;
  • (2,0)λ={1,0.25}, outro ponto instável, outra sela;
  • (1.5,0.5)λ={0.375+0.22i,0.3750.22i}, agora temos um nó assintoticamente estável, pois as parte reais são negativas e as imaginárias são os conjugados.

E fazendo um rascunho do plano de fases, próximo de (0,0), desprezando então os termos não-lineares:

(x˙y˙)=(a00c)(xy)=(1000.75)(xy)(x˙y˙)=(x0.75y)

Próximo a (ak,0)=(2,0):

(u˙v˙)=(aαakγakc)(uv)(u˙v˙)=(110.25)(uv)=(110.25)(x2y)=(x˙y˙)(x˙y˙)=((2x)y0.25y)

De (cγ,γakcαγ)=(1.5,0.5):

(u˙v˙)=(kcγcαγγakcα0)(uv)(u˙v˙)=(0.750.750.250)(uv)=(0.750.750.250)(x1.5y0.5)=(x˙y˙)(x˙y˙)=(0.75[(1.5x)+(0.5y)]0.25(x1.5))

Plotando temos então:

A esquerda o rascunho do diagrama de fases, e a direita a evolução do sistema para as condições iniciais (x0,y0)=(2,0.05).


Por curiosidade, se fazemos k=0: Para (0,0):

(x˙y˙)=(a00c)(xy)=(1000.75)(xy)

E para (cγ,aα)=(1.5,2.0):

(u˙v˙)=(0αcγγaα0)(uv)(x˙y˙)=(00.7510)(x1.5y2)=(0.75(y2)x1.5)Plotando o resultado:

A direita o rascunho do diagrama de fase, e a esquerda a evolução para as condições iniciais (x0,y0)=(1,0.5).
Códigos

Os seguintes códigos escritos em Python foram utilizados para obter a solução numérica e plotar o rascunho do diagrama de fases próximo aos pontos de equilíbrio.

import matplotlib.pyplot as plt
import numpy as np

# LOTKA-VOLTERRA: Solução numérica
# Jhordan Silveira de Borba
# sbjhordan@gmail.com

def sol_lot():
    x=[]
    y=[]
    x.append(1)      # População inicial de presas
    y.append(0.5)    # População inicial de predadores
    N=400000         # Quantidade de passos
    d=0.0001         # Tamanhodos passos
    a=0              # 1: Amortecido, 0: Sem amortecimento
    
    for i in range(N-1):
        x.append(x[i]+d*(x[i]*(1-0.5*y[i])-0.5*x[i]*x[i]*a))
        y.append(y[i]+d*(y[i]*(-0.75+0.5*x[i])))
    #Plotamos a evolução temporal das frações de população
    X=np.arange(len(x)) #Eixo x
    plt.plot(X,x,'b-')
    plt.plot(X,y,'k-')
    plt.xlabel('Passo')
    plt.ylim(0,6)
    plt.show()

A função abaixo tem como finalidade plotar um rascunho do plano de fase próximo ao pontos de equilíbrio do sistema:

import matplotlib.pyplot as plt
import numpy as np

# LOTKA-VOLTERRA: Plano de fase
# Jhordan Silveira de Borba
# sbjhordan@gmail.com

def phase_lot():
    X = np.arange(0, 4, 0.2)  # Eixo x
    Y = np.arange(0, 4, 0.2)  # Eixo Y
    U,V=np.meshgrid(X,Y)
    
    p1=[0.,0.]           # Ponto de equilíbrio 1
    p2=[1.5,2.0]         # Ponto de equilíbrio 2
    p3=[1.5*100,0.5*100] # Ponto de equilíbrio 3
    
    c=0
    for x in X:
        l=0
        for y in Y:
            #Distâncias
            d1=np.sqrt((x-p1[0])*(x-p1[0])+(y-p1[1])*(y-p1[1]))
            d2=np.sqrt((x-p2[0])*(x-p2[0])+(y-p2[1])*(y-p2[1]))
            d3=np.sqrt((x-p3[0])*(x-p3[0])+(y-p3[1])*(y-p3[1]))
            
            #encontrar o ponto de equilíbrio mais próximo
            p=1
            if(d2<d1):
                p=2
                if(d3<d2):
                    p=3
            elif(d3<d1):
                p=3
                
            # Calculamos o vetor de variação do estado baseado no ponto mais próximo:
            # [dx/dt,dy/dt]=[a,b]
            if(p==1):
                a=x  
                b=-0.75*y
            elif(p==2):
                a=-0.75*(y-2)
                b=x-1.5
            elif(p==3):
                a=0.75*((1.5-x)+(0.5-y))
                b=0.25*(x-1.5)
            else:
                print("Algo deu errado")
            m=np.sqrt(a*a+b*b) # Módulo do vetor para normalizar
            if(m==0):
                m=1
            U[l,c]=a/m
            V[l,c]=b/m
            l=l+1
        c=c+1
    
    # Plotamos o resultado
    fig, ax = plt.subplots()
    ax.quiver(X, Y, U, V)      # Os vetores
    plt.plot(p1[0],p1[1],'ro') # O ponto de equilíbrio 1
    plt.plot(p2[0],p2[1],'go') # O ponto de equilíbrio 2
    plt.plot(p3[0],p3[1],'go') # O ponto de equilíbrio 3
    plt.show()
Principais materiais utilizados
  1. Numerical Methods (Instituto de Tecnologia de Massachusetts)
  2. Numerical Solution of Ordinary Differential Equations (R. Sureshkumar,Instituto de Tecnologia de Massachusetts)
  3. A estes materiais, somam-se os vistos em Modelo de Lotka-Volterra
Citações
  1. Limits and Continuity (Rebecca Noonan-Heale ,Universidade de Utah)


Anterior: Modelo de Lotka-Volterra | Índice: Ecologia | Próximo: Modelo de Levins aprimorado para 2 espécies I