Método de Runge-Kutta 2ª e 4ª ordem: mudanças entre as edições
(Criou página com '= Runge-Kutta 2ª ordem = No método explícito de euler tínhamos: <math display="block">\begin{align} y_{n+1} & =y_{n}+f\left(t_{n},y_{n}\right)\Delta t\end{align}</math>...') |
Sem resumo de edição |
||
(4 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 32: | Linha 32: | ||
<math display="block">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)</math> | <math display="block">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)</math> | ||
Vamos expandir <math display="inline">k_{2}</math>. Uma expansão de Taylor de primeira ordem para uma função de 2 variáveis em torno de <math display="inline">\left(a,b\right)</math> é dado por<ref>[https://math.libretexts.org/Bookshelves/Calculus/Supplemental_Modules_(Calculus)/Multivariable_Calculus/3%3A_Topics_in_Partial_Derivatives/Taylor__Polynomials_of_Functions_of_Two_Variables | Vamos expandir <math display="inline">k_{2}</math>. Uma expansão de Taylor de primeira ordem para uma função de 2 variáveis em torno de <math display="inline">\left(a,b\right)</math> é dado por <ref> [https://math.libretexts.org/Bookshelves/Calculus/Supplemental_Modules_(Calculus)/Multivariable_Calculus/3%3A_Topics_in_Partial_Derivatives/Taylor__Polynomials_of_Functions_of_Two_Variables Taylor Polynomials of Functions of Two Variables] ( Paul Seeburger, LibreTexts)</ref>: | ||
<math display="block">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)</math> | <math display="block">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)</math> | ||
Linha 58: | Linha 57: | ||
a+b & =1\\ | a+b & =1\\ | ||
bd & =\frac{1}{2}\\ | bd & =\frac{1}{2}\\ | ||
bc & =\frac{1}{2}\end{align}</math> Diferentes conjuntos de valore satisfazem este sistema. O método do ponto médio é obtido se ecolhermos: <math display="inline">d=c=\frac{1}{2}</math>, <math display="inline">b=1</math> e <math display="inline">a= | bc & =\frac{1}{2}\end{align}</math> Diferentes conjuntos de valore satisfazem este sistema. O método do ponto médio é obtido se ecolhermos: <math display="inline">d=c=\frac{1}{2}</math>, <math display="inline">b=1</math> e <math display="inline">a=0</math>: | ||
* <math display="inline">k_{2}=f\left(t_{n}+\frac{\Delta t}{2},y_{n}+\frac{k_{1}}{2}\right)\Delta t</math> | * <math display="inline">k_{2}=f\left(t_{n}+\frac{\Delta t}{2},y_{n}+\frac{k_{1}}{2}\right)\Delta t</math> | ||
Linha 75: | Linha 74: | ||
y_{n+1} & =y_{n}+\left(k_{1}+k_{2}\right)\frac{1}{2}\end{align}</math> | y_{n+1} & =y_{n}+\left(k_{1}+k_{2}\right)\frac{1}{2}\end{align}</math> | ||
Uma observação, é que o erro global no algoritmo de Runge-Kutta de segunda ordem é <math> \mathcal{O}\left(\Delta^{2}\right) </math | Uma observação, é que o erro global no algoritmo de Runge-Kutta de segunda ordem é <math> \mathcal{O}\left(\Delta^{2}\right) </math> e o local é <math>\mathcal{O}\left(\Delta^{3}\right) </math>. | ||
==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> | ||
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) | |||
</pre> | </pre> | ||
= Runge-Kutta 4ª ordem = | = 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 <math display="inline">\Delta t^{5}</math> 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: | |||
* <math display="inline"> k_{1}=f\left(y_{n},t_{n}\right)\Delta t </math> | |||
* <math display="inline"> k_{2}=f\left(y_{n}+\frac{k_{1}}{2},t_{n}+\frac{\Delta t}{2}\right)\Delta t </math> | |||
* <math display="inline"> k_{3}=f\left(y_{n}+\frac{k_{2}}{2},t_{n}+\frac{\Delta t}{2}\right)\Delta t </math> | |||
* <math display="inline"> k_{4}=f\left(y_{n}+k_{3},t_{n}+\Delta t\right)\Delta t </math> | |||
E por fim, temos então que o novo valor será dado por: | |||
<math display="block"> | |||
y_{n+1}=y_{n}+\frac{1}{6}\left(k_{1}+2k_{2}+2k_{3}+k_{4}\right) | |||
</math> | |||
==Exemplo == | ==Exemplo == | ||
Vamos resolver o mesmo exemplo anterior, porém agora utilizando o Range-Kutta de quarta ordem. | |||
<pre> | |||
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) | |||
</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 = | ||
#[https://www.ufrgs.br/reamat/CalculoNumerico/livro-py/pdvi-metodos_de_runge-kutta_explicitos.html Métodos de Runge-Kutta explícitos ] (REAMAT, UFRGS) | |||
#[https://web.mit.edu/10.001/Web/Course_Notes/Differential_Equations_Notes/node5.html Runge-Kutta Methods ] (Michael Zeltkevic, Instituto de Tecnologia de Massachusetts) | #[https://web.mit.edu/10.001/Web/Course_Notes/Differential_Equations_Notes/node5.html Runge-Kutta Methods ] (Michael Zeltkevic, Instituto de Tecnologia de Massachusetts) | ||
#[https://lpsa.swarthmore.edu/NumInt/NumIntSecond.html##section13 Second Order Runge-Kutta ] (Erik Cheever, Swarthmore) | #[https://lpsa.swarthmore.edu/NumInt/NumIntSecond.html##section13 Second Order Runge-Kutta ] (Erik Cheever, Swarthmore) |
Edição atual tal como às 18h10min de 25 de março de 2022
Runge-Kutta 2ª ordem
No método explícito de euler tínhamos:
Sendo . Podemos reescrever como:
Onde e . Agor se supormos uma solução:
Agora lembrando a expansão em série de taylor que também vimos no método explícito e Euler:
Abrindo a segunda derivada, temos:
Substituindo então, e escrevendo apenas , temos a seguinte expansão em série de Taylor:
Vamos expandir . Uma expansão de Taylor de primeira ordem para uma função de 2 variáveis em torno de é dado por [1]:
Onde denota a derivada da função na variável . Para o nosso caso, temos então para uma expansão em torno de :
Expandindo então em torno de temos:
Aqui podemos notar que multiplica a expansão da função, então quando desprezamos os termos de segunda ordem da expansão de , deprezamos os termos de terceira ordem de . Substituindo então o aproximado e na equação 1, temos:
Manipulando:
Comparando a aproximação 3 com a expansão 2 temos a seguinte relação:
Então:
O método de Heun é obtido se for escolhido e :
Uma observação, é que o erro global no algoritmo de Runge-Kutta de segunda ordem é e o local é .
Exemplo
Aplicando o algoritmo para o sistema massa-mola visto no método de Euler-Cromer:
Podemos ressaltar ainda que e .
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
- Métodos de Runge-Kutta explícitos (REAMAT, UFRGS)
- Runge-Kutta Methods (Michael Zeltkevic, Instituto de Tecnologia de Massachusetts)
- Second Order Runge-Kutta (Erik Cheever, Swarthmore)
Citações
- ↑ Taylor Polynomials of Functions of Two Variables ( Paul Seeburger, LibreTexts)