Você está na página 1de 16

DELC - Departamento de Eletrnica e Computao

ELC 1021 Estudo de Casos em Engenharia Eltrica















Soluo de Equaes Diferenciais
Ordinrias Usando Mtodos
Numricos

Verso 0.1

Giovani Baratto













Fevereiro de 2007


ndice








1 Mtodo de Euler......................................................................................... 1
1.1 Derivao da Frmula de Euler ......................................................... 1
1.2 Exemplo Usando o Mtodo de Euler.................................................. 2
2 Mtodo de Runge-Kutta............................................................................. 5
2.1 Exemplo Usando o Mtodo de Runge-Kutta...................................... 7
3 Equaes Ordinrias de Ordem de 2 Ordem........................................... 8
3.1 Soluo Usando o Mtodo de Euler.................................................... 9
3.2 Soluo Usando o Mtodo de Runge-Kutta ..................................... 11

1
Neste texto ser apresentado o mtodo de Euler e o mtodo de Runge-Kutta
para a soluo de equaes diferenciais ordinrias.

1 Mtodo de Euler

O mtodo de Euler, tambm conhecido como mtodo da reta secante, um
dos mtodos mais antigos que se conhece para a soluo de equaes
diferenciais ordinrias. Problemas prticos no devem ser resolvidos com o
mtodo de Euler. Existem outros mtodos que proporcionam resultados com
uma melhor preciso e estabilidade se comparados ao mtodo de Euler para
o mesmo passo.

1.1 Derivao da Frmula de Euler

Seja uma funo ( ) ,
dy
f x y
dx
= com a condio de contorno
n
y y = quando
n
x x = . Da Figura 1, observa-se que o valor de
1 n
y
+
, em
1 n
x x
+
= , dado por:


1 n n
y y y
+
= + (1.1)

Do clculo, pode-se escrever que:

dy
dy dx
dx
= (1.2)

Da equao (1.2), encontra-se uma aproximao para y :


dy
y x
dx
(1.3)

Das equaes (1.1) e (1.3), encontra-se:

( ) ( )
1 1
,
n n n n n n
y y x x f x y
+ +
= + (1.4)
Na Figura 1, observa-se que quanto menor o valor da diferena entre
1 n
x
+
e
n
x (desprezando os erros causados pela representao finita dos nmeros
pelos computadores), menor o erro da estimativa para
1 n
y
+
. Todavia, o
nmero de computaes para um intervalo aumenta medida que a
diferena entre
1 n
x
+
e
n
x reduzida. Define-se o passo h como sendo igual a:


1 n n
h x x
+
= (1.5)
Usando a equao (1.5) nas equaes (1.5) e (1.4), tem-se:


1 n n
x x h
+
= + (1.6)
e
2

( )
1
,
n n n n
y y h f x y
+
= + (1.7)

A equao (1.7) conhecida como frmula de Euler. A soluo de uma
equao diferencial pelo mtodo de Euler realizada pelo uso recursivo das
equaes (1.6) e (1.7), usando as condies de contorno
0
x e
0
y . O erro no
mtodo de Euler da ordem de
( )
2
O h .



x
f(x)
x
n
x
n+1
x = h
y
n
y
n+1
Valores
iniciais
Estimativa
Erro

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.

Você também pode gostar