Buscar

Incrementos Adaptativos (Fehlberg)

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 8 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 8 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Me´todos Computacionais da F´ısica
Trabalho 2
Fabio Rasera Figueiredo
244430
8 de abril de 2016
1 Introduc¸a˜o ao problema
Neste trabalho se analisa o controle de erro e incrementos adaptativos nos
me´todos de Runge-Kutta. Aqui buscaremos avaliar a precisa˜o dos me´todos
quando na˜o se possui uma soluc¸a˜o exata para comparac¸a˜o. No entanto,
utilizaremos uma equac¸a˜o diferencial com soluc¸a˜o exata conhecida para que
possamos verificar graficamente que as ta´ticas utilizadas sa˜o eficientes. A
equac¸a˜o diferencial a ser resolvida sera´:
x′ = x− t2 + 1 (1)
Em que a soluc¸a˜o exata e´:
x(t) = (t+ 1)2 − 0.5et (2)
2 Controle de erro e incrementos adaptativos
Um me´todo simples de controle consiste em estimar o erro corrente ao avaliar
a diferenc¸a entre a soluc¸a˜o calculada com um passo h e a soluc¸a˜o calculada
com 2 passos h/2. Se o erro calculado encontra-se acima do erro ma´ximo
tolera´vel que fora estipulado, o valor do incremento h e´ modificado para um
menor. Assim se prossegue ate´ que a soluc¸a˜o esteja conforme o erro aceita´vel
pelo usua´rio.
Pode-se, tambe´m, aumentar o incremento quando o erro esta´ abaixo
do limite aceita´vel, assim o programa calcula a soluc¸a˜o em passos maiores
quando poss´ıvel e pode vir a poupar tempo de processamento. Para tal
se utiliza o mesmo processo descrito anteriormente, mas, ale´m da opc¸a˜o de
diminuir o passo ao calcular-se um erro acima do aceita´vel se acrescenta
a opc¸a˜o de aumentar o passo ao detectar-se que o erro esta´ menor que o
aceita´vel. Desta forma o incremento se autoregula, adaptando-se a` necessi-
dade corrente.
1
O incremento novo sera´ calculado pela seguinte expressa˜o:
hnovo = hS
(
�
�c
) 1
m
(3)
Onde m = n+1, sendo n a ordem do me´todo utilizado, � e´ o erro ma´ximo
permitido pelo usua´rio, �c e´ o erro corrente e S sera´ um paraˆmetro para
definir o tamanho do aumento ou diminuic¸a˜o de h. Aqui utilizo S1 = 0.9
para que a diminuic¸a˜o do incremento seja um pouco menor do que a exigida
para que o passo esteja dentro da precisa˜o requerida e S2 = 2.0 para que o
incremento aumente o dobro do exigido.
Esta estrate´gia foi implementada na resoluc¸a˜o da Equac¸a˜o 1 utilizando
os me´todos RK2 e RK4. O co´digo segue abaixo.
//AUTOR: Fabio Rasera
#include <stdio.h>
#include <math.h>
double RK4(double tn, double hn, double xn);
double RK2(double tm, double hm, double xm);
double f(double t, double x);
double sol(double t);
int main(){
double ERRO, ERRO1, x0_rk2, x0_rk4, x0, h, x, x_rk2, x_rk4, x1_rk2, x1_rk4, t ,k1, k2, k3, k4, e;
//Arquivos de saı´da
FILE* pt;
pt=fopen("RK2.txt","w");
FILE* pt1;
pt1=fopen("RK4.txt","w");
e=pow(10,-6); //Para^metro de tolera^ncia para o erro corrente
//Dados iniciais
x0=sol(0); x0_rk2=x0;
t=0.0;
h=0.1;
//---RK2---//
do{
//passo h
x_rk2=RK2(t,h,x0_rk2);//RK2
//passo h/2
x1_rk2=RK2(t,(h/2.0),x0_rk2);
x1_rk2=RK2((t+(h/2.0)), (h/2.0), x1_rk2);
ERRO=fabs(x1_rk2-x_rk2);
if(ERRO>=e) //Testa se o erro e´ inaceita´vel
{
h=h*0.9*pow(e/ERRO , 1.0/3.0);
}
else //Caso o erro seja aceita´vel, utiliza o valor calculado e segue para o pro´ximo ponto
{
x0_rk2=x_rk2;
t+=h;
fprintf(pt, "%12e %12e %12e %.12e %.12e\n",t,x_rk2,h,ERRO,(fabs(sol(t)-x_rk2)) / fabs(sol(t)) );
h=h*2*pow(e/ERRO , 1.0/3.0); //Aumento de incremento
}
}while(t<=10);
fclose(pt);
//Dados iniciais
x0_rk4=x0;
2
h=0.1;
t=0.0;
//---RK4---//
do{
//Passo h
x_rk4=RK4(t,h,x0_rk4);
//Passo h/2
x1_rk4=RK4(t,(h/2.0),x0_rk4);
x1_rk4=RK4((t+(h/2.0)), (h/2.0), x1_rk4);
ERRO1=fabs(x1_rk4-x_rk4);
if(ERRO1>=e)//Testa se o erro e´ inaceita´vel
{
h=h*0.9*fabs(pow(e/ERRO1 , 1.0/5.0));
}
else //Caso o erro seja aceita´vel, utiliza o valor calculado e segue para o pro´ximo ponto
{
x0_rk4=x_rk4;
t+=h;
fprintf(pt1,"%12e %12e %12e %.12e %.12e\n",t,x_rk4,h,ERRO1,(fabs(sol(t)-x_rk4)) / fabs(sol(t)) );
h=h*2*fabs(pow(e/ERRO1 , 1.0/5.0)); //Aumento de incremento
}
}while(t<=10);
fclose(pt1);
return(0);
}
//Func¸~ao derivada
double f(double t, double x){
return(x-(t*t)+1);
}
//Soluc¸~ao analı´tica
double sol(double t){
return((t+1)*(t+1)-0.5*exp(t));
}
//Me´todo RK2
double RK2(double tm, double hm, double xm){
double k1=f(tm,xm);
double k2=f(tm+0.5*hm, xm+0.5*hm*k1);
double xy= xm+k2*hm;
return(xy);
}
//Me´todo RK4
double RK4(double tn, double hn, double xn){
double k1=f(tn,xn);
double k2=f(tn+0.5*hn, xn+0.5*k1*hn);
double k3=f(tn+0.5*hn, xn+0.5*k2*hn);
double k4=f(tn+hn, xn+k3*hn);
double xf=xn+(k1 + 2*k2 + 2*k3 + k4)*hn/6.0;
return(xf);
}
A seguir encontram-se os gra´ficos dos pontos calculados para cada me´todo
plotados sobre a soluc¸a˜o anal´ıtica.
3
 0
 1
 2
 3
 4
 5
 6
 7
 0 0.5 1 1.5 2 2.5 3
x
(t
)
t
RK2
Condições iniciais: x(0)=0.5, h0=0.1, Erro máx=10
−6
RK2 num. c/ inc. adapt.
RK2 num s/ inc. adapt.
Exato
Figura 1: Soluc¸a˜o atrave´s do meto´do RK2 utilizando incremento adaptativo.
 0
 1
 2
 3
 4
 5
 6
 7
 0 0.5 1 1.5 2 2.5 3
x
(t
)
t
RK4
Condições iniciais: x(0)=0.5, h0=0.1, Erro máx=10
−6
RK4 num. c/ inc. adapt.
RK4 num s/ inc. adapt.
Exato
Figura 2: Soluc¸a˜o atrave´s do me´todo RK4 utilizando incremento adaptativo.
Ao analisarmos as Figuras 1 e 2, nota-se que com um incremento adap-
4
tativo aparecem mais pontos calculados em regio˜es curvas, enquanto que
nas regio˜es em que a func¸a˜o mais se aproxima de uma reta o incremento
aumenta, permitindo passos maiores entre um ponto e outro. Tambe´m e´
vis´ıvel que a quantidade de pontos necessa´rios para andar sobre a curva e´
bastante menor para o me´todo RK4 em relac¸a˜o ao RK2, o que significa que
o RK4 na˜o necessitou adaptar o incremento tantas vezes quanto o RK2,
indicando que o me´todo RK4 tem maior precisa˜o.
Ao fazermos uma interpolac¸a˜o com os pontos calculados utlizando incre-
mentos adaptativos espera-se uma curva muito pro´xima da soluc¸a˜o exata.
Caso deseje-se um nu´mero maior de pontos calculados, e´ poss´ıvel evitar
o aumento do incremento, diminuindo-o e mantendo-o constante ate´ que
seja necessa´rio diminu´ı-lo novamente. No entanto, se a func¸a˜o calculada e´
bastante varia´vel, apresentando curvatura em algumas regio˜es enquanto em
outras na˜o, uma quantidade considera´vel de processamento pode ser evitada
ao aumentarmos o incremento quando poss´ıvel.
Para analisarmos o impacto do erro permitido pelo usua´rio, variou-se
este paraˆmetro e foram plotados os resultados. Abaixo seguem os gra´ficos.
 0
 1
 2
 3
 4
 5
 6
 7
 0 0.5 1 1.5 2 2.5 3
x
(t
)
t
RK2
Condições iniciais: x(0)=0.5, h0=0.1
Erro máx=10−6
Erro máx=10−3
Erro máx=10−1
Exato
Figura 3: RK2 com diferentes erros ma´ximos permitidos.
5
 0
 1
 2
 3
 4
 5
 6
 7
 0 0.5 1 1.5 2 2.5 3
x
(t
)
t
RK4
Condições iniciais: x(0)=0.5, h0=0.1
Erro máx=10−6
Erro máx=10−3
Erro máx=10−1
Exato
Figura 4: RK4 com diferentes erros ma´ximos permitidos.
Veˆ-se nitidamente nas Figuras 3 e 4 que quando o erro ma´ximo permitido
aumenta, os resultados obtidos fogem da soluc¸a˜o exata. Com o erro ma´ximo
da ordem de 10−1 a diferenc¸a entre a soluc¸a˜o exata e a calculada e´ gritante
e o nu´mero de pontos calculados no intervalo e´ muito pequeno, pois o limite
definido permite saltos enormes entre um ponto e outro sem que o incremento
precise ser ajustado.
2.1 Me´todo de Fehlberg
Outro modo de estimar o erro do me´todo nume´rico de Runge-Kutta e´ uti-
lizar um me´todo de ordem m para avaliar um de ordem n < m. Como os
me´todos de maior ordem possuem maior precisa˜o devido ao truncamento em
termos de ordem mais elevada,podemos utilizar o me´todo RK2 para avaliar
a precisa˜o do RK1, ou o RK4 para avaliar a precisa˜o de ambos os anterio-
res, e assim por diante. Enta˜o, para avaliarmos o me´todo Runge-Kutta de
ordem 4, precisaremos de um me´todo de ordem maior. Para os me´todos
de Runge-Kutta em que a ordem e´ m > 4 o valor da func¸a˜o ao final do
intervalo precisa de um nu´mero de pontos maior do que o nu´mero da ordem
do me´todo, levando a uma inconvenieˆncia ao buscarmos me´todos de ordens
maiores. Fehlberg, no entanto, descobriu um me´todo de quinta ordem que
necessita do ca´lculo de 6 posic¸o˜es da func¸a˜o dentro do intervalo h e cuja
combinac¸a˜o destes mesmos 6 pontos pode ser feita de modo a resultar no
me´todo de Runge-Kutta de ordem 4. Assim, em apenas 6 posic¸o˜es dentro
6
do intervalo h obteˆm-se o RK4 e o RK5. Utilizando o me´todo de Fehlberg
podemos aplicar um controle de erro no RK4. O co´digo que implementa
esta te´cnica adjunta do incremento adaptativo discutido anteriormente se-
gue abaixo:
//AUTOR: Fabio Rasera
#include <stdio.h>
#include <math.h>
double f(double t, double x);
int main(void){
int i, k;
double t,e,Ec,x0,x,h,xm;
double m1, m2, m3, m4, k1, k2, k3, k4, k5, k6, a1, a2, a3, a4, a5, a6, b21, b31, b32, b41, b42, b43, b51, b52, b53, b54, b61, b62, b63, b64, b65, b6, c1, c2, c3, c4, c5, c6, cm1, cm2, cm3, cm4, cm5, cm6;
//Coeficientes de Cash e Karp
a2=1.0/5.0; a3=3.0/10.0; a4=3.0/5.0; a5=1.0; a6=7.0/8.0;
b21=1.0/5.0; b31=3.0/40.0; b41=3.0/10.0; b51=-11.0/54.0; b61=1631.0/55296.0;
b32=9.0/40.0; b42=-9.0/10.0; b52=5.0/2.0; b62=175.0/512.0;
b43=6.0/5.0; b53=-70.0/27.0; b63=575.0/13824.0;
b54=35.0/27.0; b64=44275.0/110592.0;
b65=253.0/4096.0;
c1=37.0/378.0; c2=0.0; c3=250.0/621.0; c4=125.0/594.0; c5=0.0; c6=512.0/1771.0;
cm1=2825.0/27648.0; cm2=0.0; cm3=18575.0/48384.0; cm4=13525.0/55296.0; cm5=277.0/14336.0; cm6=1.0/4.0;
FILE *p;
p = fopen("fehlberg.txt","w");
//Condic¸~oes iniciais
x0=0.5;
x=x0;
t=0.0;
h=0.5;
e=pow(10,-8); //Erro ma´ximo permitido
i=1;
//RK4 e RK5 pelo me´todo de Fehlberg
do{
k1=h*f(t,x0);
k2=h*f(t+a2*h, x0+b21*k1);
k3=h*f(t+a3*h, x0+b31*k1 + b32*k2);
k4=h*f(t+a4*h, x0+b41*k1 + b42*k2 + b43*k3);
k5=h*f(t+a5*h, x0+b51*k1 + b52*k2 + b53*k3 + b54*k4);
k6=h*f(t+a6*h, x0+b61*k1 + b62*k2 + b63*k3 + b64*k4 + b65*k5);
x= x0 + cm1*k1 + cm2*k2 + cm3*k3 + cm4*k4 + cm5*k5 + cm6*k6; //RK4
xm= x0 + c1*k1 + c2*k2 + c3*k3 + c4*k4 + c5*k5 + c6*k6; //RK5
Ec=fabs(x-xm); //Erro corrente
if(Ec>=e) //Testa se o erro corrente e´ maior que o permitido
{
h=0.9*h*(fabs(pow(e/Ec,0.2))); //Diminui o incremento
}
else //Caso o erro corrente seja menor que o permitido, segue o programa
{
fprintf(p,"%.12e %.12e\n",t,x0);
x0=x;
t+=h;
h=2*h*(fabs(pow(e/Ec,0.2))); //Aumenta o incremento
}
}while(t<10);
fclose(p);
return 0;
}
double f(double t, double x){
return(x-(t*t)+1);
}
Em seguida um gra´fico ilustra a soluc¸a˜o calculada atrave´s do me´todo de
7
Fehlberg com incrementos adaptativos em comparac¸a˜o com o RK4 de passo
fixo e a soluc¸a˜o exata.
 0
 1
 2
 3
 4
 5
 6
 7
 0 0.5 1 1.5 2 2.5 3
x
(t
)
t
Fehlberg
Condições iniciais: x(0)=0.5, h0=0.5, Erro máx=10
−8
RK4 num s/ inc. adapt.
RK4 num. c/ inc. adapt (Fehlberg).
Exato
Figura 5: Me´todo de Fehlberg com incremento adaptativo.
8
	Introdução ao problema
	Controle de erro e incrementos adaptativos
	Método de Fehlberg

Outros materiais