Método de Runge-Kutta 2ª e 4ª ordem: mudanças entre as edições

De Física Computacional
Ir para navegação Ir para pesquisar
Sem resumo de edição
Sem resumo de edição
Linha 77: Linha 77:


==Exemplo ==
==Exemplo ==
Aplicando o algoritmo para o sistema massa-mola visto no [[Método de Euler-Cromer | método de Euler-Cromer]]:
<math display="block"> \frac{d^{2}x}{dt^{2}}=-\frac{k}{m}x=-\omega^{2}x </math>
Podemos ressaltar ainda que <math>a =-\omega^{2}x </math>  e <math>  \frac{dv}{dt}=\frac{d^{2}x}{dt^{2}}</math>.


<pre>
<pre>
Linha 97: Linha 103:
#Método Range-Kutta de segunda ordem, no método do ponto médio
#Método Range-Kutta de segunda ordem, no método do ponto médio
for it  in range(Np):
for it  in range(Np):
   #Posição
   #Primeira etapa
   k1 = fx(v[it])*dt
   k1x = fx(v[it])*dt
   k2 = fx(v[it]+k1/2)*dt
   k1v = fv(x[it],w2)*dt
   x.append(x[it]+k2)
   #Segunda etapa
   #Velocidade
  k2x = fx(v[it]+k1v/2)*dt
  k1 = fv(x[it],w2)*dt
   k2v = fv(x[it]+k1x/2,w2)*dt
   k2 = fv(x[it]+k1/2,w2)*dt
   #Solução
   v.append(v[it]+k2)
  x.append(x[it]+k2x)
   v.append(v[it]+k2v)
   #Energia
   #Energia
   E.append(k*x[it+1]**2/2+m*v[it+1]**2/2)
   E.append(k*x[it+1]**2/2+m*v[it+1]**2/2)
Linha 110: Linha 117:
   t.append(dt+it*dt)
   t.append(dt+it*dt)


plt.plot(t,x)
#plt.plot(t,x)
plt.plot(t,v)
#plt.plot(t,v)
plt.plot(t,E)
#plt.plot(t,E)
#plt.plot(x,v)
plt.plot(x,v)
</pre>
</pre>


Linha 148: Linha 155:
m=1  ; k= 1.; w2= k/m
m=1  ; k= 1.; w2= k/m
#Parâmetros
#Parâmetros
dt  = 0.00001 ; tau = 2*np.pi; tf=4*tau ; Np= int(tf/dt)
dt  = 0.01 ; tau = 2*np.pi; tf=4*tau ; Np= int(tf/dt)
#Valores iniciais
#Valores iniciais
x=[1]; v=[0]; t=[0]; E=[k*x[0]**2/2+m*v[0]**2/2]
x=[1]; v=[0]; t=[0]; E=[k*x[0]**2/2+m*v[0]**2/2]
Linha 154: Linha 161:
#Método Range-Kutta de quarta ordem
#Método Range-Kutta de quarta ordem
for it  in range(Np):
for it  in range(Np):
   #Posição
   #Primeira etapa
   k1 = fx(v[it])*dt
   k1x = fx(v[it])*dt
   k2 = fx(v[it]+k1/2)*dt
   k1v = fv(x[it]     ,w2)*dt
   k3 = fx(v[it]+k2/2)*dt
   #Segunda etapa
   k4 = fx(v[it]+k3)*dt
  k2x = fx(v[it]+k1v/2)*dt
   x.append(x[it]+(k1+2*k2+2*k3+k4)/6)
   k2v = fv(x[it]+k1x/2,w2)*dt
   #Velocidade
   #Terceira etapa
  k1 = fv(x[it]     ,w2)*dt
  k3x = fx(v[it]+k2v/2)*dt
   k2 = fv(x[it]+k1/2,w2)*dt
   k3v = fv(x[it]+k2x/2,w2)*dt
   k3 = fv(x[it]+k2/2,w2)*dt
   #Quarta etapa
   k4 = fv(x[it]+k3  ,w2)*dt
  k4x = fx(v[it]+k3v)*dt
   v.append(v[it]+(k1+2*k2+2*k3+k4)/6)
   k4v = fv(x[it]+k3x,w2)*dt
   #Solução:
  x.append(x[it]+(k1x+2*k2x+2*k3x+k4x)/6)
   v.append(v[it]+(k1v+2*k2v+2*k3v+k4v)/6)
   #Energia
   #Energia
   E.append(k*x[it+1]**2/2+m*v[it+1]**2/2)
   E.append(k*x[it+1]**2/2+m*v[it+1]**2/2)
Linha 176: Linha 186:
#plt.plot(x,v)
#plt.plot(x,v)
</pre>
</pre>
Ainda podemos chamar a atenção para o fato de que devemos intercalar os coeficientes <math>k_i</math> em ambos os métodos, uma vez que coeficientes seguintes dependem dos valores anteriores.


= Principais materiais utilizados =
= Principais materiais utilizados =

Edição das 17h51min de 21 de março de 2022

Runge-Kutta 2ª ordem

No método explícito de euler tínhamos:

Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \begin{align} y_{n+1} & =y_{n}+f\left(t_{n},y_{n}\right)\Delta t\end{align}}

Sendo Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle \frac{dy}{dt}=f\left(t,y\right)} . Podemos reescrever como:

Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \begin{align} y_{n+1} & =y_{n}+ak_{1}\end{align}}

Onde Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle a=1} e Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle k_{1}=f\left(t_{n},y_{n}\right)\Delta t} . Agor se supormos uma solução:

Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \begin{align} y_{n+1} & =y_{n}+ak_{1}+bk_{2}\qquad\left(1\right)\end{align}} Com o termo adicional dependendo de uma posição genérica Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle y_{n}+cf\left(t_{n},y_{n}\right)\Delta t} em um tempo genérico Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle t+d\Delta t} , isto é Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle k_{2}=f\left(t_{n}+d\Delta t,y_{n}+cf\left(t_{n},y_{n}\right)\Delta t\right)\Delta t} . Usando o fato de que Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle k_{1}=f\left(t_{n},y_{n}\right)\Delta t} , podemos escrever então que:

  • Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle k_{1}=f\left(t_{n},y_{n}\right)\Delta t}
  • Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle k_{2}=f\left(t_{n}+d\Delta t,y_{n}+ck_{1}\right)\Delta t}

Agora lembrando a expansão em série de taylor que também vimos no método explícito e Euler:

Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle y\left(t+\Delta t\right)=y\left(t\right)+y'\left(t\right)\Delta t+y''\left(t\right)\frac{\Delta t^{2}}{2}+\sum_{n=3}^{\infty}y^{\left(n\right)}\left(t\right)\frac{\Delta t^{n}}{n!}}

Abrindo a segunda derivada, temos:

Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \begin{align} y''\left(t\right)=\frac{d^{2}}{dt^{2}}y\left(t\right) & =\frac{d}{dt}f\left(t,y\right)=\frac{\partial f}{\partial t}+\frac{\partial f}{\partial y}\frac{dy}{dt}=\frac{\partial f}{\partial t}+f\left(t,y\right)\frac{\partial f}{\partial y}\end{align}}

Substituindo então, e escrevendo apenas Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle \mathcal{O}\left(\Delta^{3}\right)=\sum_{n=3}^{\infty}y^{\left(n\right)}\left(t\right)\frac{\Delta t^{n}}{n!}} , temos a seguinte expansão em série de Taylor:

Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle y\left(t+\Delta t\right)=y\left(t\right)+y'\left(t\right)\Delta t+\left(\frac{\partial f}{\partial t}+f\left(t,y\right)\frac{\partial f}{\partial y}\right)\frac{\Delta t^{2}}{2}+\mathcal{O}\left(\Delta^{3}\right)\qquad\left(2\right)}

Vamos expandir Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle k_{2}} . Uma expansão de Taylor de primeira ordem para uma função de 2 variáveis em torno de Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle \left(a,b\right)} é dado por [1]:

Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle f\left(x,y\right)\approx f\left(a,b\right)+f_{x}\left(a,b\right)\left(x-a\right)+f_{y}\left(a,b\right)\left(y-b\right)}

Onde Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle f_{a}} denota a derivada da função Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle f} na variável Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle a} . Para o nosso caso, temos então para uma expansão em torno de Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle \left(x,y\right)} :

Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle f\left(x+\Delta x,y+\Delta y\right)\approx f\left(x,y\right)+f_{x}\left(x,y\right)\Delta x+f_{y}\left(x,y\right)\Delta y}

Expandindo então Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle k_{2}} em torno de Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle \left(t_{n},y_{n}\right)} temos:

Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle k_{2}\approx\left[f\left(t_{n},y_{n}\right)+d\Delta t\frac{\partial}{\partial t}f\left(t_{n},y_{n}\right)+ck_{1}\frac{\partial}{\partial y}f\left(t_{n},y_{n}\right)\right]\Delta t}

Aqui podemos notar que Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle \Delta t} multiplica a expansão da função, então quando desprezamos os termos de segunda ordem da expansão de Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle f\left(x+\Delta x,y+\Delta y\right)} , deprezamos os termos de terceira ordem de Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle k_{2}} . Substituindo então o Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle k_{2}} aproximado e Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle k_{1}} na equação 1, temos:

Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle y_{n+1}=y_{n}+af\left(t_{n},y_{n}\right)\Delta t+b\left[f\left(t_{n},y_{n}\right)+d\Delta t\frac{\partial}{\partial t}f\left(t_{n},y_{n}\right)+cf\left(t_{n},y_{n}\right)\Delta t\frac{\partial}{\partial y}f\left(t_{n},y_{n}\right)\right]\Delta t}

Manipulando:

Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle y_{n+1}=y_{n}+\left(a+b\right)f\left(t_{n},y_{n}\right)\Delta t+\left[2bd\frac{\partial}{\partial t}f\left(t_{n},y_{n}\right)+2bcf\left(t_{n},y_{n}\right)\frac{\partial}{\partial y}f\left(t_{n},y_{n}\right)\right]\frac{\Delta t^{2}}{2}\qquad\left(3\right)}

Comparando a aproximação 3 com a expansão 2 temos a seguinte relação:

Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \begin{align} a+b & =1\\ bd & =\frac{1}{2}\\ bc & =\frac{1}{2}\end{align}} Diferentes conjuntos de valore satisfazem este sistema. O método do ponto médio é obtido se ecolhermos: Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle d=c=\frac{1}{2}} , Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle b=1} e Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle a=-1} :

  • Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle k_{2}=f\left(t_{n}+\frac{\Delta t}{2},y_{n}+\frac{k_{1}}{2}\right)\Delta t}

Então:

Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \begin{align} y_{n+1} & =y_{n}+f\left(t_{n}+\frac{\Delta t}{2},y_{n}+f\left(t_{n},y_{n}\right)\frac{\Delta t}{2}\right)\Delta t\end{align}}

O método de Heun é obtido se for escolhido Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle a=b=\frac{1}{2}} e Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle c=d=1} :

  • Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle k_{1}=f\left(t_{n},y_{n}\right)\Delta t}
  • Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\textstyle k_{2}=f\left(t_{n}+\Delta t,y_{n}+k_{1}\Delta t\right)\Delta t}

Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \begin{align} y_{n+1} & =y_{n}+\left(k_{1}+k_{2}\right)\frac{1}{2}\end{align}}

Uma observação, é que o erro global no algoritmo de Runge-Kutta de segunda ordem é Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \mathcal{O}\left(\Delta^{2}\right) } e o local é Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \mathcal{O}\left(\Delta^{3}\right) } .

Exemplo

Aplicando o algoritmo para o sistema massa-mola visto no método de Euler-Cromer: Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \frac{d^{2}x}{dt^{2}}=-\frac{k}{m}x=-\omega^{2}x }

Podemos ressaltar ainda que Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle a =-\omega^{2}x } e Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \frac{dv}{dt}=\frac{d^{2}x}{dt^{2}}} .


import matplotlib.pyplot as plt            #Biblioteca para plotar gráficos
import numpy as np                         #Biblitoeca de cálculos científicos

#Taxas de variação
def fv(x,w2):      #Velocidade
  return (-w2*x)
def fx(v):
  return (v)       #Posição

#Constantes
m=1  ; k= 1.; w2= k/m
#Parâmetros
dt  = 0.0001 ; tau = 2*np.pi; tf=4*tau ; Np= int(tf/dt)
#Valores iniciais
x=[1]; v=[0]; t=[0]; E=[k*x[0]**2/2+m*v[0]**2/2]

#Método Range-Kutta de segunda ordem, no método do ponto médio
for it  in range(Np):
  #Primeira etapa
  k1x = fx(v[it])*dt
  k1v = fv(x[it],w2)*dt
  #Segunda etapa
  k2x = fx(v[it]+k1v/2)*dt
  k2v = fv(x[it]+k1x/2,w2)*dt
  #Solução
  x.append(x[it]+k2x)
  v.append(v[it]+k2v)
  #Energia
  E.append(k*x[it+1]**2/2+m*v[it+1]**2/2)
  #Tempo
  t.append(dt+it*dt)

#plt.plot(t,x)
#plt.plot(t,v)
#plt.plot(t,E)
plt.plot(x,v)

Runge-Kutta 4ª ordem

O método de Runge-Kutta de quarta ordem segue uma ideia similar e pode ser obtido utilizando a mesma técnica. Porém agora vamos ignorar termos de ordem ou superior, então será necessário lidar com uma enorme quantidade de termos, o que torna a tarefa exaustiva e repetitiva. Logo não será feito esta demonstração aqui, mas o algoritmo de Runge-Kutta de quarta ordem pode ser dado por:


E por fim, temos então que o novo valor será dado por:

Exemplo

Vamos resolver o mesmo exemplo anterior, porém agora utilizando o Range-Kutta de quarta ordem.

import matplotlib.pyplot as plt            #Biblioteca para plotar gráficos
import numpy as np                         #Biblitoeca de cálculos científicos

#Taxas de variação
def fv(x,w2):      #Velocidade
  return (-w2*x)
def fx(v):
  return (v)       #Posição

#Constantes
m=1  ; k= 1.; w2= k/m
#Parâmetros
dt  = 0.01 ; tau = 2*np.pi; tf=4*tau ; Np= int(tf/dt)
#Valores iniciais
x=[1]; v=[0]; t=[0]; E=[k*x[0]**2/2+m*v[0]**2/2]

#Método Range-Kutta de quarta ordem
for it  in range(Np):
  #Primeira etapa
  k1x = fx(v[it])*dt
  k1v = fv(x[it]     ,w2)*dt
  #Segunda etapa
  k2x = fx(v[it]+k1v/2)*dt
  k2v = fv(x[it]+k1x/2,w2)*dt
  #Terceira etapa
  k3x = fx(v[it]+k2v/2)*dt
  k3v = fv(x[it]+k2x/2,w2)*dt
  #Quarta etapa
  k4x = fx(v[it]+k3v)*dt
  k4v = fv(x[it]+k3x,w2)*dt
  #Solução:
  x.append(x[it]+(k1x+2*k2x+2*k3x+k4x)/6)
  v.append(v[it]+(k1v+2*k2v+2*k3v+k4v)/6)
  #Energia
  E.append(k*x[it+1]**2/2+m*v[it+1]**2/2)
  #Tempo
  t.append(dt+it*dt)

plt.plot(t,x)
plt.plot(t,v)
plt.plot(t,E)
#plt.plot(x,v)

Ainda podemos chamar a atenção para o fato de que devemos intercalar os coeficientes em ambos os métodos, uma vez que coeficientes seguintes dependem dos valores anteriores.

Principais materiais utilizados

  1. Métodos de Runge-Kutta explícitos (REAMAT, UFRGS)
  2. Runge-Kutta Methods (Michael Zeltkevic, Instituto de Tecnologia de Massachusetts)
  3. Second Order Runge-Kutta (Erik Cheever, Swarthmore)

Citações