Embora EDOs escalares sejam responsáveis por descrever uma vasta quantidade de fenômenos naturais, muitas aplicações são melhor descritas através de um sistema de EDOs escalares ou de ordem superior. O tratamento numérico de EDOs de alta ordem baseia-se em uma conversão a sistemas de primeira ordem. Vejamos como escrever a forma geral de um sistema de duas EDOS de primeira ordem:
As funções e definem EDOs e as incógnitas são as funções e . O problema de valor inicial então consiste de resolver o sistema anterior, sujeito às condições iniciais e .
Exemplo: O PVI
tem por solução as funções e .
Exemplo (Modelo de Lotka-Volterra): O sistema de EDOs dado por
com constantes , , , é conhecido como modelo predador-presa. A variável é o tempo, o número de presas no tempo (e.g. coelhos) e o número de predadores (e.g. raposas). Para apenas um tipo de predador e de presa, este modelo é uma aproximação razoável da realidade.
Sistema com EDOs de primeira ordem¶
Um PVI com EDOs escalares é dado por
cuja solução procurada são as funções . Entretanto, a forma anterior não é computacionalmente adequada para se trabalhar. Assim, simplificamo-na para a forma vetorial
onde
com .
Exemplo: O primeiro PVI pode ser reescrito como
com
Métodos numéricos para sistemas¶
Tanto o método de Euler quanto outros métodos numéricos podem ser usados de forma similar para sistemas de EDOs quando aplicados a cada EDO individual. Para isto, lança-se mão da forma matriz/vetor, em que a derivação é essencialmente a mesma feita para o caso individual.
Lembremos que a série de Taylor desenvolvida para o método de Euler é dada por:
para EDOs. Desprezando-se os termos de erro, o método de Euler em forma vetorial é escrito como
Implementação computacional¶
O seguinte código é uma implementação do método de Euler para resolver sistemas de EDOs. O usuário necessita especificar uma função adicional para determinar as EDOs como componentes de um vetor. Isto é feito pela função
def fsys(t,y):
(...)
return Ffrom numpy import *
def euler_sys(t0,tf,y0,h,f):
"""
Resolve o PVI de um sistema de EDOs escalares
y’ = f(t,y), t0 <= t <= b, y(t0)=y0 pelo metodo de Euler com tamanho de passo h.
O usuario deve fornecer um vetor f contendo as funcoes a serem avaliadas como
membro direito.
Entrada:
t0 - tempo inicial
tf - tempo final
y0 - condicao inicial
h - passo
f - vetor de funcoes f(t,y) (anonima)
Saída:
t - vetor contendo os valores nodais t[i], i = 1,2,...,n
Y - matriz de dimensoes n x m, com m sendo o numero de EDOs
(a i-esima linha y[i,:] traz as estimativas de todas
as funcoes y_j no tempo t[i])
"""
m = y0.size
n = round((tf - t0)/h + 1)
t = linspace(t0,t0+(n-1)*h,n)
Y = zeros((n,m))
Y[0,:] = y0
for i in range(1,n):
Y[i,:] = Y[i-1,:] + h*f(t[i-1],Y[i-1,:])
return t,Y
Exercício resolvido: Resolva o PVI abaixo pelo método de Euler:
com
Resolver numericamente pelo método de Euler para e .
# define funcao vetorial f(t,y)
def fsys(t,y):
"""
Função definida pelo usuario para montar vetor das m funcoes fm(t,(y1,...,ym))
Em cada componente prescrevemos a funcao da EDO correspondente no sistema
de m EDOs.
Isto e,
F = [f1(t,y1,...,ym),f2(t,y1,...,ym),...,fm(t,y1,...,ym)]^T
Neste exemplo, o sistema possui 2 EDOs, com:
f1(t,y1,y2) = y1 - 2y2 + 4cos(t) - 2sin(t)
f2(t,y1,y2) = 3y1 - 4y2 + 5cos(t) - 5sin(t)
"""
F = array([y[0]-2*y[1]+4*cos(t)-2*sin(t),3*y[0]-4*y[1]+5*cos(t)-5*sin(t)])
return F
from matplotlib.pyplot import plot,legend
# parâmetros
t0,tf = 0,5
h = 0.05
y0 = array([1,2])
# solução numérica do sistema
t,Y = euler_sys(t0,tf,y0,h,fsys)
y1_num = Y[:,0]
y2_num = Y[:,1]
# solução analítica
y1_an = cos(t) + sin(t)
y2_an = 2*cos(t)
# plotagem
plot(t,y1_num,'r--',label='$y_{1,h}(t)$')
plot(t,y2_num,'b--',label='$y_{2,h}(t)$')
plot(t,y1_an,'r',label='$y_1(t)$')
plot(t,y2_an,'b',label='$y_2(t)$')
# erro absoluto
plot(t,abs(y1_an - y1_num),'r:',label='$EA_1(t)$')
plot(t,abs(y2_an - y2_num),'b:',label='$EA_2(t)$')
legend(loc=3,fontsize=10);

Exercício: Considere o PVI
com
para e convenientemente escolhidos. Verifique que a sua solução analítica é dada por , resolva-o numericamente, plote os gráficos das curvas da solução numérica e do erro relativo para cada uma. Compare os gráficos com aqueles das curvas da solução analítica.
Problemas¶
Problema: considere o modelo de Lotka-Volterra com os parâmetros , , e . Usando o método de Euler, resolva-o para . Use passos de , 0.0005 e 0.00025 e a condição inicial values , . Plote as funções e em função de e, depois, plote o gráfico de versus . Comente os resultados.
Problema: Considere o esquema numérico
Tente adaptá-lo para resolver o PVI do Exercício resolvido.