Euler explícito
A grande maioria das equações diferenciais de primeira ordem não podem ser resolvidas analiticamente. Para o comportamento a longo prazo de uma solução podemos tentar esboçar um campo de direções, mas se precisamos conhecer mais especificamente como uma solução se comporta, precisamos de outra ferramenta. Os métodos numéricos nos permitem obter soluções aproximadas para as equações diferenciais.
Começando com uma problema genérico de valor inicial:
![{\displaystyle {\frac {dy}{dt}}=f\left(t,y\right)\qquad y\left(t_{0}\right)=y_{0}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/86a3500f756924f55e292cbe4c0b17cab0908d0c)
Considerando que conhecemos a função
e os valores na condição inicial, assumimos que é tudo contínuo de forma que sabemos que uma solução de fato vai existir. Temos então para
:
![{\displaystyle \left.{\frac {dy}{dt}}\right|_{t=t_{0}}=f\left(t_{0},y_{0}\right)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5ee5188b6b2898bf3bfb59afe820fd6dc7f45586)
Dessa forma podemos escrever uma reta tangente à curva
no ponto
usando a inclinação
:
![{\displaystyle y=y_{0}+f\left(t_{0},y_{0}\right)\left(t-t_{0}\right)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a494dab487dd909ea441c043518242ccb3cb914c)
Para visualizar melhor esta equação, podemos fazer
, ficmos então com
. Desta forma, fica ainda mais evidente que esta é uma equação de reta com inclinação
, e quando
temos
, ou seja, uma reta que passa pelo ponto
. Para
temos apenas um deslocamento no eixo.
Então se
é perto o suficiente de
, a equação da reta vai estar perto do valor atual da solução em
. Então podemos escrever:
![{\displaystyle y_{1}=y_{0}+f\left(t_{0},y_{0}\right)\left(t_{1}-t_{0}\right)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8dee7511011b3721e688bf314bd5efdd2e1de44d)
Podemos repetir o processo, usando agora
como valor inicial, então:
![{\displaystyle y_{2}=y_{1}+f\left(t_{1},y_{1}\right)\left(t_{2}-t_{1}\right)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/77818100b1d85ccec4a5fb517df5661b532d225a)
Ou de maneira genérica:
![{\displaystyle y_{n+1}=y_{n}+f\left(t_{n},y_{n}\right)\left(t_{n+1}-t_{n}\right)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5e0a16bed4da9e0d2620ff879f61070b20a10968)
Podemos ainda reescrever o passo como
, de forma que ficamos com:
![{\displaystyle y_{n+1}=y_{n}+f\left(t_{n},y_{n}\right)\Delta t}](https://wikimedia.org/api/rest_v1/media/math/render/svg/d38c7be133d0469e3fdab86577c674f2e7ba8788)
Outra forma de visualizar o resultado, é considerar a reta:
![{\displaystyle y=y_{n}+f\left(t_{n},y_{n}\right)\left(t-t_{n}\right)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/57486002b811e1ed607f82c44dbc55005ba0bf3c)
Como a solução aproximada para o intervalo
. Então com um conjunto de retas podemos ter uma aproximação para a solução como um todo.
Exemplo
O primeiro exemplo de aplicação é o decaimento radiativo, cuja equação diferencial é:
![{\displaystyle {\frac {dN}{dt}}=-\lambda N}](https://wikimedia.org/api/rest_v1/media/math/render/svg/9184da62ad79c17560de1ba690de749238d57e86)
Onde
é a quantidade de partículas que sofrem o decaimento e
a taxa no qual o decaimento ocorre.
- Notem que a mesma equação pode descrever a diminuição de uma população estéril (
sendo a quantidade de indivíduos vivos e
a taxa de mortalidade) ou a descarga de um circuito RC.
- A aplicação do método a este exemplo de primeira ordem nos leva a seguinte relação de recorrência
![{\displaystyle {\begin{aligned}N_{n+1}&=N_{n}+f\left(t_{n},N_{n}\right)\Delta t\\N_{n+1}&=N_{n}-\lambda N_{n}\Delta t\\N_{n+1}&=N_{n}\left(1-\lambda \Delta t\right)\end{aligned}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/987cb1f2d231e441871a46d1ac00d2927c0602cb)
Ou mais explicitamente:
![{\displaystyle {\begin{aligned}N\left(t_{n+1}\right)&=\left[1-\lambda \Delta t\right]N\left(t_{n}\right)\\N\left(t_{n}+\Delta t\right)&=\left[1-\lambda \Delta t\right]N\left(t_{n}\right)\end{aligned}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a372b4ec161ad9bddb1c5183cf5f3779e8cca4ec)
Implementando:
import matplotlib.pyplot as plt #Biblioteca para plotar gráficos
N =[10**6];Np=100;lam=0.1;dt=0.1 #Parâmetros
fac = 1-lam*dt #Função calculada
for i in range(Np): #Vamo calcular Np passos
N.append(fac*N[i]) #Salvamos o novo valor
print(i*dt,N[i]) #printamos o resultado
plt.plot(N) #Construimos o gráfico
plt.show() #Plotamos
Euler implícito
A equação da reta obtida no euler explícito pode ser obtida a partir da definição da derivada:
![{\displaystyle {\frac {dy}{dt}}=f\left(t,y\right)\approx {\frac {y\left(t+\Delta t\right)-y\left(t\right)}{\Delta t}}\longrightarrow y\left(t+\Delta t\right)\approx y\left(t\right)+f\left(t,y\right)\Delta t}](https://wikimedia.org/api/rest_v1/media/math/render/svg/6b0d9f8171f978fb6ab605a15310b6f8dca16429)
Mas também podemos escrever a derivada como:
![{\displaystyle {\frac {dy}{dt}}=f\left(t,y\right)\approx {\frac {y\left(t\right)-y\left(t-\Delta t\right)}{\Delta t}}\longrightarrow y\left(t\right)\approx y\left(t-\Delta t\right)+f\left(t,y\right)\Delta t}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a05555f40391674ba804d04b0f74a06385997dbc)
Mantendo a notação:
![{\displaystyle y_{n+1}=y_{n}+f\left(t_{n+1},y_{n+1}\right)\Delta t}](https://wikimedia.org/api/rest_v1/media/math/render/svg/018b0e85323f81d476e84d114500574f873815e8)
O termo
não é conhecido, por isso temos uma equação implícita para
. Métodos implícitos podem ser usados quando temos restrições muito rigorosas no método explícito devido a condições de estabilidade.
Exemplo
Trabalhando novamente com o decaimento radioativo:
![{\displaystyle {\frac {dN}{dt}}=-\lambda N}](https://wikimedia.org/api/rest_v1/media/math/render/svg/9184da62ad79c17560de1ba690de749238d57e86)
Vamo ter então:
![{\displaystyle {\begin{aligned}N_{n+1}&=N_{n}+f\left(t_{n+1},N_{n+1}\right)\Delta t\\N_{n+1}&=N_{n}-\lambda N_{n+1}\Delta t\\N_{n+1}\left(1+\lambda \Delta t\right)&=N_{n}\\N_{n+1}&={\frac {N_{n}}{1+\lambda \Delta t}}\end{aligned}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ecceb9a45b622b14c1465469a334072d92eb8033)
Ou mais explicitamente:
![{\displaystyle {\begin{aligned}N\left(t_{n}+\Delta t\right)&={\frac {N\left(t\right)}{1+\lambda \Delta t}}\end{aligned}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/434d208f92fcd94175dc625f0c44b28021481460)
Uma comparação entre os dois métodos de Euler para o caso do decaimento é simples. Lembando da fórmula recursiva de ambos os casos:
![{\displaystyle N\left(t_{n}+\Delta t\right)=N\left(t\right)\left[1-\lambda \Delta t\right]\qquad e\qquad N\left(t_{n}+\Delta t\right)=N\left(t\right)\left[{\frac {1}{1+\lambda \Delta t}}\right]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2f225a21a5867b836e403f11ee9ba80f2c9269d9)
E fazendo uma expansão em série de Taylor em torno de
, escrevendo
, temos:
![{\displaystyle {\frac {1}{1+x}}=\sum _{n=0}^{\infty }{\frac {f^{\left(n\right)}\left(a\right)\left(x-a\right)^{n}}{n!}}=\left(1-x\right)+\sum _{n=2}^{\infty }{\frac {f^{\left(n\right)}\left(a\right)\left(x-a\right)^{n}}{n!}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/83f3f96706d997c8e69a0e037e86aa27da6cd81b)
Então os termos são iguais até a primeira ordem, sendo assim uma boa aproximação.
Implementando o método de euler implícito, temos:
import matplotlib.pyplot as plt #Biblioteca para plotar gráficos
N =[10**6];Np=100;lam=0.1;dt=0.1 #Parâmetros
fac = 1+lam*dt #Função calculada
for i in range(Np): #Vamo calcular Np passos
N.append(N[i]/fac) #Salvamos o novo valor
print(i*dt,N[i]) #printamos o resultado
plt.plot(N) #Construimos o gráfico
plt.show() #Plotamos
Principais materiais utilizados
- Forward and Backward Euler Methods (Michael Zeltkevic, Instituto de Tecnologia de Massachusetts)
- Euler's Method (Paul Dawkins, Universidade Lamar)
- Método de Euler (REAMAT, UFRGS)