Escolar Documentos
Profissional Documentos
Cultura Documentos
y
y
Figura 1 Ilustrao do mtodo de Euler.
1.2 Exemplo Usando o Mtodo de Euler
As seguir ser apresentado o mtodo de Euler na soluo de uma equao
diferencial ordinria de 1 ordem. A equao escolhida ser (Boyce, W. E.;
DiPrima, R. C. Equaes Diferenciais Elementares e Problemas de Valor de
Contorno. ed. 7, pp. 420):
1 4
dy
x y
dx
= + (1.8)
Esta equao ser resolvida de 0 x = s a 2 x = s, com a seguinte condio de
contorno:
(0) 1 y = (1.9)
3
A soluo da equao diferencial (1.8) com a condio de contorno (1.9)
conhecida:
( )
4
1 3 19
e
4 16 16
x
y x x
= + (1.10)
A soluo numrica encontrada com a avaliao das equaes (1.6) e (1.7):
1 n n
x x h
+
= + (1.11)
e
( )
( )
1
,
1 4
n n n n
n
y y h f x y
y h x y
+
= +
= + +
(1.12)
Com a condio de contorno da equao (1.9), temos que
0
0 x = e
0
1 y = . Os
prximos valores so calculados com o uso recursivo das equaes (1.11) e
(1.12). O valor do passo escolhido considerando-se o erro desejado. Neste
exemplo, escolhemos 0,001 h = . A seguir apresentada uma tabela com
alguns valores calculados de y pelo mtodo de Euler e usando a soluo
algbrica.
Tabela 1 Resultado da soluo numrica da equao (1.8) usando o mtodo de
Euler.
n
n
x
n
y y
0 0,000 1,000000 1,000000
1 0,001 1.005000 1.005010
2 0,002 1.010019 1.010038
3 0,003 1.015057 1.015086
4 0,004 1.020114 1.020153
5 0,005 1.025191 1.025239
... ... ... ...
500 0,500 8.677069 8.712004
1000 1,000 64.382558 64.897803
1500 1,500 473.559790 479.259192
2000 2,000 3484.160803 3540.200110
4
0,0 0,5 1,0 1,5 2,0
0
500
1000
1500
2000
2500
3000
3500
4000
Numrica
Analtica
y
(
t
)
t
1,90 1,92 1,94 1,96 1,98 2,00
2000
2500
3000
3500
4000
y
(
t
)
t
Figura 2 Grfico apresentando a soluo numrica (mtodo de Euler) e analtica
da equao (1.8).
O mtodo pode ser aplicado com o uso de lpis, papel e calculadora. No
entanto, este processo fastidioso pelo nmero de iteraes. A programao
em computador simples. A programao segue os seguintes passos:
01: Entre com a funo ( ) , f x y .
02: Entre com os valores iniciais
0
x e
0
y .
03: Entre com o passo h .
04: Enquanto
n final
x x < execute:
Escreva n ,
n
x ,
n
y
Avalie
1 n n
x x h
+
= +
Avalie ( )
1
,
n n n n
y y h f x y
+
= +
Faa
1 n n
x x
+
= e
1 n n
y y
+
=
06: Fim.
Um programa escrito em C apresentado a seguir. Este programa foi escrito
para ser didtico, podendo ser melhorado.
5
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
#i ncl ude <mat h. h>
double y( double x) /* a soluo y(t) da equao */
{
return ( 1. 0/ 4. 0) *x- ( 3. 0/ 16. 0) +( 19. 0/ 16. 0) *exp( 4. 0*x) ;
}
double f ( double x, double y) /* a funo f(x,y)*/
{
return 1- x+4*y;
}
int mai n( int ar c, char* ar gv[ ] )
{
double xn, xn1, xmax; /* variveis tn e tn+1 */
double yn, yn1; /* variveis yn e yn+1 */
double y0, x0; /* valores iniciais de y e t */
double h; /* passo */
int n;
x0 = 0. 0; /* valor incial para t */
y0 = 1. 0; /* valor inicial para y */
xmax = 2. 0; /* valor mximo para t */
h = 0. 001; /* o valor do passo */
xn = t 0;
yn = y0;
n = 0; /* numero de iteraes */
while( xn < xmax) {
pr i nt f ( " %i %f %f %f \ n" , n, xn, yn, y( xn) ) ; /*escreva os valores das variveis*/
yn1 = yn + h*f ( xn, yn) ; /* estime yn+1 pelo mtodo de Euler */
xn1 = xn + h;
n = n+1; /* Atribua os valores para a prxima iterao */
yn = yn1;
xn = xn1;
}/* while */
return 0; /* termina a computao */
}/* main */
Ilustrao 1 Exemplo de um programa em C para a soluo da equao (1.8) pelo
mtodo de Euler.
2 Mtodo de Runge-Kutta
O mtodo de Runge-Kutta pode ser entendido como um aperfeioamento do
mtodo de Euler, com uma melhor estimativa da derivada da funo. No
mtodo de Euler a estimativa do valor de
1 n
y
+
realizado com o valor de
n
y e
com a derivada no ponto
n
x . No mtodo de Runge-Kutta, busca-se uma
melhor estimativa da derivada com a avaliao da funo em mais pontos no
intervalo
1
[ , ]
n n
x x
+
. Um mtodo de Runge-Kutta de ordem n possui um erro
da ordem de
( )
1 n
O h
+
. O mtodo de Runge-Kutta de 4 ordem o mais usado
na soluo numrica de problemas com equaes diferenciais ordinrias.
A seguir ser discutido o mtodo de Runge-Kutta de 2 ordem, ilustrado pela
Figura 3. No mtodo de Euler de passo h , a estimativa de
1 n
y
+
realizada
com os valores de
n
x e da derivada de
n
y . No mtodo de Runge-Kutta de 2
ordem, o valor da estimativa de
1 n
y
+
encontrado com o valor de
n
y e com
uma estimativa da derivada em um ponto mais prximo de
1 n
x
+
, em
2
n
h
x + :
6
1 1
2
1
,
2
n n n
n
y y h f x h y
+
+
= + +
(1.13)
Na equao (1.13),
1
2
n
y
+
o valor de y em
1
2
n
x h + . Uma estimativa do valor
de
1
2
n
y
+
encontrado com o auxlio do mtodo de Euler:
( )
1
2
,
2
n n n
n
h
y y f x y
+
= + (1.14)
Denominando:
( )
1
2 1
.
1 1
,
2 2
n n
n n
k h f x y
k h f x h y k
=
= + +
(1.15)
Escreve-se a equao (1.13) como:
1 2 n n
y y k
+
= + (1.16)
No mtodo de Runge-Kutta de 2 ordem, avaliam-se as equaes (1.15) e
(1.16).
2
n
h
x +
1 n
x
+
h
2
h
1 n
y
+
n
x
n
y
1
2
n
y
+
1 n
+
Erro
Euler
Erro
Runge Kutta
Figura 3 Ilustrao do mtodo de Runge-Kutta de 2 ordem.
7
O mtodo de Runge-Kutta de 4 ordem tem as seguintes equaes:
( )
( )
( )
1
2 1
3 2
4 3
1 1 2 3 4
,
1
,
2 2
1
,
2 2
,
1
2 2
6
n n
n n
n n
n n
n n
k h f x y
h
k h f x y k
h
k h f x y k
k h f x h y k
y y k k k k
+
=
= + +
= + +
= + +
= + + + +
(1.17)
e
1 n n
x x h
+
= + (1.18)
2.1 Exemplo Usando o Mtodo de Runge-Kutta
A seguir ser apresentado um exemplo usando o mtodo de Runge-Kutta na
soluo de uma equao diferencial. Ser usada a equao diferencial (1.8)
com as condies iniciais dada por (1.9), a mesma equao que foi usada no
Exemplo usando o mtodo de Euler. O passo neste exemplo ser reduzido
para 0,01 s. A soluo da equao diferencial encontrada pelo uso iterativo
das equaes (1.17) e (1.18). A seguir apresentada uma tabela com os
valores calculados e com o valor analtico da soluo.
Tabela 2 Resultado da soluo numrica da equao (1.8) usando o mtodo de
Runge-Kutta.
n
n
x
n
y y
0 0,000 1,000000 1,000000
1 0,001 1.050963 1.050963
2 0,002 1.103903 1.103903
3 0,003 1.158903 1.158903
4 0,004 1.216044 1.216044
5 0,005 1.275416 1.275416
... ...
50 0,500 8.712004 8.712004
100 1,000 64.897798 64.897803
150 1,500 479.259133 479.259192
200 2,000 3540.199525 3540.200110
Comparando-se os resultados da soluo numrica usando o mtodo de
Euler (Tabela 1) com os resultados da soluo usando o mtodo de Runge-
8
Kutta (Tabela 2), observa-se que neste segundo mtodo a preciso maior,
mesmo com o uso de um passo 10 vezes maior.
A seguir apresentado um programa escrito em C, para a soluo numrica
da equao (1.8).
#i ncl ude <st dl i b. h>
#i ncl ude <st di o. h>
#i ncl ude <mat h. h>
double y( double x) /* a soluo y(x) da equao */
{
return ( 1. 0/ 4. 0) *x- ( 3. 0/ 16. 0) +( 19. 0/ 16. 0) *exp( 4. 0*x) ;
}
double f ( double x, double y) /* a funo f(x,y)*/
{
return 1- x+4*y;
}
int mai n( int ar gc, char* ar gv[ ] )
{
double xn, xn1, xmax; /* variveis tn e tn+1 */
double yn, yn1; /* variveis yn e yn+1 */
double y0, t 0; /* valores iniciais de y e t */
double h; /* passo */
double k1, k2, k3, k4; /* variveis auxiliares */
int n; /* nmero de iteraes */
x0 = 0. 0; /* valor incial para t */
y0 = 1. 0; /* valor inicial para y */
xmax = 2. 0; /* valor mximo para t */
h = 0. 01; /* o valor do passo */
xn = t 0;
yn = y0;
n = 0; /* numero de iteraes */
while( xn < xmax) {
pr i nt f ( " %i %f %f %f \ n" , n, t n, yn, y( t n) ) ; /*escreva os valores das variveis*/
k1 = h*f ( xn, yn) ; /* aplica o mtodo de Runge-Kutta */
k2 = h*f ( xn+h/ 2, yn+k1/ 2. 0) ;
k3 = h*f ( xn+h/ 2, yn+k2/ 2. 0) ;
k4 = h*f ( xn+h, yn+k3) ;
xn1 = xn + h;
yn1 = yn + ( k1+2*k2+2*k3+k4) / 6. 0;
n = n+1; /* atribua os valores para a prxima iterao */
xn = xn1;
yn = yn1;
}/* lao while */
return 0; /* termina a computao */
}/* funo main */
Ilustrao 2 Exemplo de um programa em C para a soluo da equao (1.8) pelo
mtodo de Runge-Kutta.
3 Equaes Ordinrias de Ordem de 2 Ordem
Equaes diferenciais de 2 ordem, ou de ordem superior, podem ser
reduzidas a um conjunto de equaes diferenciais de 1 ordem. Este conjunto
de equaes de 1 ordem pode ser resolvido pelo mtodo de Runge-Kutta ou
outro mtodo numrico. Seja uma equao diferencial de 2 ordem:
9
( ) ( )
2
2
,
d y dy
q x r x y
dx dx
+ = (1.19)
Defini-se uma varivel auxiliar z :
( ) ,
dy
z x y
dx
= (1.20)
A equao (1.19) escrita como um conjunto de duas equaes diferenciais
de 1 ordem, com o auxlio da varivel ( ) , z x y , definida na equao (1.20).
( )
( ) ( ) ( )
,
,
dy
z x y
dx
dz
r x y q x z x
dx
=
=
(1.21)
O conjunto de equaes em (1.21) pode ser escrito como:
( )
( )
, ,
, ,
dy
f x y z
dx
dz
g x y z
dx
=
=
(1.22)
Para a soluo da equao diferencial ordinria de 2 ordem (1.19),
necessrio que as equaes diferenciais ordinrias de primeira ordem,
apresentadas em (1.22) seja resolvidas. A seguir, apresenta-se a soluo
destas equaes, usando o mtodo de Euler e o mtodo de Runge-Kutta.
3.1 Soluo Usando o Mtodo de Euler
As equaes em (1.22) so resolvidas pelo mtodo de Euler, usando
iterativamente as equaes apresentadas a seguir:
( )
( )
1
1
, ,
, ,
n n n n n
n n n n n
y y h f x y z
z z h g x y z
+
+
= +
= +
(1.23)
Exemplo: Resolva a seguinte equao diferencial de 2 ordem, usando o
mtodo de Euler.
2
2
30 200 1000
d y dy
y
dx dx
+ + = (1.24)
Resolva a equao (1.24) com x variando de 0 a 1. Considere as seguintes
condies de contorno:
10
( )
0
0 0
0
t
y
dy
dx
=
=
=
(1.25)
O primeiro passo reduzir esta equao diferencial de 2 ordem para um
conjunto de 2 equaes diferenciais ordinrias de 1 ordem:
1000 30 200
dy
z
dx
dz
z y
dx
=
=
(1.26)
O conjunto de equaes em (1.26) resolvido usando as expresses em (1.23)
. De acordo com as condies iniciais em (1.25), tem-se
0
0 x = e
0
0 y = . O
passo usando neste exemplo ser 0,01 h = s. A seguir apresentada uma
tabela com os valores calculados numericamente e obtidos da soluo
analtica, que para este exemplo igual a:
( )
10 20
5 10 e 5 e
x x
y t
= + (1.27)
Tabela 3 Resultado da soluo numrica da equao (1.24), usando o mtodo de
Euler.
n
n
x
n
y y
0 0,0 0.000000 0.000000
1 0,01 0.000000 0.045280
2 0,02 0.100000 0.164293
3 0,03 0.270000 0.335876
4 0,04 0.487000 0.543444
5 0,05 0.733500 0.774091
... ...
50 0,5 4.948534 4.932848
70 0,7 4.993735 4.990885
90 0,9 4.999238 4.998766
100 1,0 4.999734 4.999546
A seguir apresentado um programa em C que implementa esta soluo.
#i ncl ude <st dl i b. h> /* biblioteca de funes */
#i ncl ude <st di o. h>
#i ncl ude <mat h. h>
double y( double x) /* A soluo analtica de y(x)*/
{
return 5. 0- 10. 0*exp( - 10. 0*x) +5. 0*exp( - 20. 0*x) ;
}
11
double f ( double x, double y, double z) /* a funo f(x,y,z)=dy/dx */
{
return z;
}
double g( double x, double y, double z) /* a funo g(x,y,z)=dz/dx */
{
return 1000. 0- 30. 0*z- 200. 0*y;
}
int mai n( int ar c, char* ar gv[ ] )
{
double xn, xn1, xmax; /* declarao de xn, xn+1 e mximo valor de x na simulao
*/
double yn, yn1; /* declarao de yn e yn+1 */
double zn, zn1; /* declarao de zn e zn+1 */
double h; /* passo */
double x0, y0, z0; /* valores iniciais de x, y e z */
int n; /* nmero de iteraes */
x0 = 0. 0; /* atribuio dos valores de contorno */
y0 = 0. 0;
z0 = 0. 0;
h = 0. 01;
xmax = 1. 0;
n = 0; /* inicializa as variveis com os valores iniciais*/
xn = x0;
yn = y0;
zn = z0;
while( xn<xmax) {
pr i nt f ( " %i %f %f %f \ n" , n, xn, yn, y( xn) ) ; /* escreve os valores das variveis */
xn1 = xn + h; /* realiza uma iterao do mtodo de Runge-Kutta */
yn1 = yn + h * f ( xn, yn, zn) ;
zn1 = zn + h * g( xn, yn, zn) ;
n = n + 1; /* atualiza as variveis para a prxima iterao */
xn = xn1;
yn = yn1;
zn = zn1;
}/* while */
return 0; /* termina a execuo do programa */
}/* main */
Ilustrao 3 Programa em C usando o mtodo de Euler para a soluo da
equao (1.24), uma equao diferencial ordinria de 2 ordem.
3.2 Soluo Usando o Mtodo de Runge-Kutta
As equaes em (1.22) so resolvidas pelo mtodo de Runge-Kutta, usando
iterativamente as equaes apresentadas a seguir:
( )
( )
1 1 2 3 4
1 1 2 3 4
1
2 2
6
1
2 2
6
n n
n n
y y k k k k
z z l l l l
+
+
= + + + +
= + + + +
(1.28)
onde
12
( )
( )
( )
1
1
2 1 1
2 1 1
3 2 2
3 2
4 3 3
4 3
, ,
, ,
1 1 1
, ,
2 2 2
1 1 1
, ,
2 2 2
1 1 1
, ,
2 2 2
1 1 1
, ,
2 2 2
, ,
,
n n n
n n n
n n n
n n n
n n n
n n n
n n n
n n
k h f x y z
l h g x y z
k h f x h y k z l
l h g x h y k z l
k h f x h y k z l
l h g x h y z l
k h f x h y k z l
l h g x h y k
=
=
= + + +
= + + +
= + + +
= + + +
= + + +
= + + ( )
3
,
n
z l +
(1.29)
Exemplo: Resolva a seguinte equao diferencial de 2 ordem, usando o
mtodo de Runge-Kutta.
2
2
30 200 1000
d y dy
y
dx dx
+ + = (1.30)
Resolva a equao (1.24), para x entre 0 a 1. Considere as seguintes
condies de contorno:
( )
0
0 0
0
t
y
dy
dx
=
=
=
(1.31)
O primeiro passo reduzir esta equao diferencial de 2 ordem para um
conjunto de 2 equaes diferenciais ordinrias de 1 ordem:
1000 30 200
dy
z
dx
dz
z y
dx
=
=
(1.32)
O conjunto de equaes em (1.32) resolvido usando as expresses em(1.29).
De acordo com as condies iniciais em (1.31) , tem-se
0
0 x = e
0
0 y = . O
passo usando neste exemplo ser 0,01 h = . A seguir apresentada uma
tabela com os valores calculados numericamente e obtidos da soluo
analtica, que para este exemplo igual a:
( )
10 20
5 10 e 5 e
x x
y t
= + (1.33)
13
Tabela 4 Resultado da soluo numrica da equao(1.30), usando o mtodo de
Runge-Kutta.
n
n
x
n
y y
0 0,0 0.000000 0.000000
1 0,01 0.016667 0.045280
2 0,02 0.123528 0.164293
3 0,03 0.293960 0.335876
4 0,04 0.507390 0.543444
5 0,05 0.748036 0.774091
... ...
50 0,5 4.943575 4.932848
70 0,7 4.992869 4.990885
90 0,9 4.999100 4.998766
100 1,0 4.999680 4.999546
A seguir apresentado um programa em C que implementa esta soluo.
#i ncl ude <st dl i b. h> /* biblioteca de funes */
#i ncl ude <st di o. h>
#i ncl ude <mat h. h>
double y( double x) /* A soluo analtica de y(x)*/
{
return 5. 0- 10. 0*exp( - 10. 0*x) +5. 0*exp( - 20. 0*x) ;
}
double f ( double x, double y, double z) /* a funo f(x,y,z)=dy/dx */
{
return z;
}
double g( double x, double y, double z) /* a funo g(x,y,z)=dz/dx */
{
return 1000. 0- 30. 0*z- 200. 0*y;
}
int mai n( int ar c, char* ar gv[ ] )
{
double xn, xn1, xmax; /* declarao de xn, xn+1 e val mximo de x na simulao */
double yn, yn1; /* declarao de yn e yn+1 */
double zn, zn1; /* declarao de zn e zn+1 */
double h; /* passo */
double x0, y0, z0; /* valores iniciais de x, y e z */
double k1, k2, k3, k4; /* variveis auxiliares do mtodo de Runge-Kutta */
double l 1, l 2, l 3, l 4; /* variveis auxiliares do mtodo de Runge-Kutta */
int n; /* nmero de iteraes */
x0 = 0. 0; /* atribuio dos valores de contorno */
y0 = 0. 0;
z0 = 0. 0;
h = 0. 01;
xmax = 1. 0;
n = 0; /* inicializa as variveis com os valores iniciais*/
xn = x0;
yn = y0;
zn = z0;
while( xn<xmax) {
pr i nt f ( " %i %f %f %f \ n" , n, xn, yn, y( xn) ) ; /* escreve os valores das
variveis */
k1 = h*f ( xn, yn, zn) ; /* realiza uma iterao do mtodo Runge-Kutta */
14
l 1 = h*g( xn, yn, zn) ;
k2 = h*f ( xn+( 1/ 2) *h, yn+( 1/ 2) *k1, zn+( 1/ 2) *l 1) ;
l 2 = h*g( xn+( 1/ 2) *h, yn+( 1/ 2) *k1, zn+( 1/ 2) *l 1) ;
k3 = h*f ( xn+( 1/ 2) *h, yn+( 1/ 2) *k2, zn+( 1/ 2) *l 2) ;
l 3 = h*g( xn+( 1/ 2) *h, yn+( 1/ 2) *k2, zn+( 1/ 2) *l 2) ;
k4 = h*f ( xn+h, yn+k3, zn+l 3) ;
l 4 = h*g( xn+h, yn+k3, zn+l 3) ;
xn1 = xn + h;
yn1 = yn + ( 1/ 6. 0) *( k1 + 2*k2 + 2*k3 + k4) ;
zn1 = zn + ( 1/ 6. 0) *( l 1 + 2*l 2 + 2*l 3 + l 4) ;
n = n + 1; /* atualiza as variveis para a prxima iterao */
xn = xn1;
yn = yn1;
zn = zn1;
}/* while */
return 0; /* termina a execuo do programa */
}/* main */
Ilustrao 4 Programa em C usando o mtodo de Euler para a soluo da
equao (1.30), uma equao diferencial ordinria de 2 ordem.