Paulo J. S. Silva
12 de setembro de 2017
1
• u′ = u, u(1) = 2. De novo temos da forma geral da solução u(t) = cet que 2 = u(1) = ce2 . Portanto
c = 2/e2 e a solução será u(t) = 2et−2 .
É possível provar que problemas de valor inicial possuem solução única sob hipóteses bastantes gerais.
y′ = 2t + ln(y),
não satisfaz as hipóteses do teorema para qualquer retângulo que contenha o zero na segunda coordenda,
pois nesse caso a função f (t, y) = 2t + ln(y) não é Lipschitz contínua.
Exemplo ( )( )
′ y1′ (t) 3y1 − t2 y2
y (t) ≡ ≡ f (t, y),
y2′ (t) (1 − t )2 y2
em que ( )
−1
y (1) = .
2
Uma grande vantagem desse tipo de generalização é que podemos transformar equações diferenciais que
envolvem derivadas além da primeira em equações diferenciais, reduzindo o estudo a equações diferenciais
de primeira ordem. Para isso basta criar variáveis auxiliáres cujas derivadas são usadas para representar as
derivadas de ordem maior do que 1. Vejamos um exemplo com uma equação geral de segunda ordem.
′′ ′
x + p(t) x + q(t) x = g(t)
x (0) = α
′
x (0) = β.
Se definirmos
y1 = x, y2 = y1′ = x ′
2
a equação fica
′
y1 = y2
y′ = g(t) − p(t)y + q(t)y
2 2 1
y ( 0 ) = α
1
y2 (0) = β.
Note que ela envolve apenas as derivadas primeiras das funções desconhecidas que formam y(t) =
(y1 (t), y2 (t)).
h2i ′′
y(ti ) = y(ti−1 ) + hi y′ (ti − 1) + y ( τ ), τ ∈ ( t i −1 , t i ).
2
Agora lembramos que y′ (ti−1 ) = f (ti−1 , y(ti−1 )) ≈ f (ti−1 , yi−1 ) que é conhecido. Assim, se hi for pequeno
(em relação a y′′ ), podemos escrever:
y ( t i ) ≈ y ( t i −1 ) + h i f ( t i −1 , y i −1 ), i = 1, . . . , N.
Com isso conseguimos as aproximações desejadas. Esse método é conhecido como método de Euler. Veja-
mos uma implementação simples dele.
In [1]: # Método de Euler para PVI y' = f(t, y), y(a) = y0, usando n pontos.
function Euler(a, b, f, y0, N)
N = Int(N)
h = (b - a) / N
y = Array(Float64, N + 1)
y[1] = y0
t = a
for i = 2:N + 1
y[i] = y[i - 1] + h*f(t, y[i - 1])
t += h
end
return y
3
end
exp(2) = 7.38905609893065
Out[1]: 0.0019953439760972626
y[end] = 7.374312390354604
abs(y[end] - exp(2)) / exp(2) = 0.0019953439760972626
h2 ′′ hk
y(ti+1 ) = y(ti ) + hy′ (ti ) + y ( t i ) + . . . + y ( k ) ( t i ) + O ( h k +1 ).
2 k!
Apesar da expansão de Taylor ir até um grau qualquer de derivação, olhamos apenas a primeira derivada
e obtivemos
y(ti+1 ) = y(ti ) + hy′ (ti ) + O(h2 ).
O proximo passo é ignorar o erro e escrever
Por fim relembramos que a equação diferencial fornece o valor de y′ (ti ), ele é simplesmente f (ti , y(ti )) que
é conhecido aproximadamente pois conhecemos f e supomos que já conhecemos uma boa aproximação de
y(ti ), resultando em
y ( t i +1 ) ≈ y ( t i ) + h f ( t i , y i ).
Substituindo pelos valores calculados pelo algorimto, que combina todas as aproximações, temos a expres-
são final do método de Euler
y i +1 = y i + h f ( t i , y i ).
Agora porque parar no primeiro termo da expansão de Taylor? Por que não continuar? Vamos ver o
que podemos fazer se usarmos até o segundo termo. Ou seja se partirmos da expressão
h2 ′′
y(ti+1 ) = y(ti ) + hy′ (ti ) + y ( t i ) + O ( h3 ).
2
Nesse caso precisamos não apenas conhecer uma boa aproximação de y′ (ti ) que já sabemos ser f (ti , yi ),
precisamos também aproximar a segunda derivada.
Isso pde ser feito partindo da equação diferencial que diz que
4
Derivando os dois lados da igualdade
d
y′′ (t) = f (t, y(t))
dt
d d
= f (t, y(t)) + f (t, y(t))y′ (t)
dt dy
d d
= f (t, y(t)) + f (t, y(t)) f (t, y(t)).
dt dy
d d
f = ft, f = fy.
dt dy
Temos então
y′′ (t) = f t (t, y(t)) + f y (t, y(t)) f (t, y(t)).
Portanto
y′′ (ti ) ≈ f t (ti , yi ) + f y (ti , yi ) f (ti , yi ).
Relembre que o que é obtido é apenas uma aproximação já que yi é apenas uma aproximação de y(ti ).
Substituindo a fórmula acima na expasão de Taylor até a segunda ordem e ignorando o erro obtemos:
h2
y ( t i +1 ) ≈ y i +1 = y i + h f ( t i , y i ) + ( f t (ti , yi ) + f y (ti , yi ) f (ti , yi )).
2
Esse método é interessante porque ele é capaz de usar a informação da segunda derivada de y e obtendo
assim mais precisão. Uma das formas de entender isso é definir a ideia de erro de truncamento local.
Definição. Erro de truncamento local é o erro com o qual a solução real deixa de obedecer à equação que
define o método quando o lado esquerdo é re-escrito de maneira a aproximar a derivada y′ .
Vamos usar essa definição para calcular o erro de truncamento local dos métodos de Euler e do método
de segunda ordem apresentado acima.
Para o método de Euler temos a equação
y i +1 − y i
= f ( t i , y i ).
h
Se no lugar da aproximação yk usarmos a solução real y(tk ), não valerá mais a igualdade. Na verdade
podemos usar diretamente Taylor e ver que
y ( t i +1 ) − y ( t i ) h
= f (ti , y(ti )) + y′′ (ξ i ).
h 2
Ou seja, a solução real obedece à equação que define o método de Euler a menos de erro que é da ordem de
h. Por isso dizemos que o método de Euler é de primeira ordem.
Já no caso do método de segunda ordem, mais uma vez usando Taylor, teremos
y ( t i +1 ) − y ( t i ) h h2
= f (ti , y(ti )) + y′′ (ti ) + y′′′ (ξ i ).
h 2 3!
Retomando a expressão de y′′ obtida anteriormente obtemos
y ( t i +1 ) − y ( t i ) h h2
= f (ti , y(ti )) + [ f t (ti , y(ti )) + f y (ti , y(ti )) f (ti , y(ti ))] + y′′′ (ξ i ).
h 2 3!
E vemos que solução real obedece ao método de segunda ordem com erro da ordem de h2 , o que é poteci-
almente bem menor do que h para h pequeno.
5
Nesse sentido o método de segunda ordem é melhor do que o método de Euler. Além disso deve ficar
claro que podemos obter métodos de ordem mais alta aproveitando mais termos da expasão de Taylor.
Para isso é necessário que saibamos calcular as derivadas de ordem mais alta de y. Isso é sempre possível
partindo da equação diferencial e fazendo aplicações repetidas da regra da cadeia. Por exemplo
y′′′ = f tt + 2 f ty f + f y f 2 + f y2 f .
A única dificuldade encontrada nesse caso é que teremos que calcular as derivadas de f o que pode ser
trabalhoso ou impossível se não conhecermos uma expressão explícita para f. Surge então uma pergunta
natural que é se é possível obter metodos de ordem maior que 1 usando apenas os valores de f evitando
suas derivadas explícitas.
Observe que esse método necessita de duas avaliações de f , mas de nenhuma derivada de f . Ele será
vantajoso somente se ele conseguir a mesma precisão que Euler com um passo duas vezes maior ou, melhor
ainda, mais longo. Para justificar que esse método é interessante vamos analisar o seu erro de truncamento
local.
Começamos expandindo y(ti ) e y(ti+1 ) em torno de ti+1/2 .
y′′ (ti+1/2 )
y(ti+1 ) = y(ti+1/2 ) + y′ (ti+1/2 )(h/2) + (h/2)2 + O(h3 ),
2
y′′ (ti+1/2 )
y(ti ) = y(ti+1/2 ) − y′ (ti+1/2 )(h/2) + (h/2)2 + O(h3 ),
2
Subtraindo essas duas expressões obtemos
Para chegar à equação que define o método precisamos trocar y(ti+1/2 ) por yi+1/2 . Para isso vamos expan-
dir y(ti+1/2 ) por Taylor.
y(ti+1/2 ) = y(ti ) + h/2 f (ti , yi ) + O(h2 ).
Agora se olharmos para a primeira equação que define o método do ponto médio obtemos: $$ y(t_{i + 1/2})
= y_{i + 1/2} + O(hˆ2).
Substituindo na equação anterior temos
6
Relembrando que f é Lipschitz na segunda variável,
y(ti+1 ) − y(ti ) = f (ti+1/2 , yi+1/2 )h + O(h3 ).
Agora dividindo por h dos dois lados para achar a aproximação de y′ temos
y ( t i +1 ) − y ( t i )
= f (ti+1/2 , yi+1/2 ) + O(h2 ).
h
Vemos que o erro de truncamento de f no método do ponto médio é da ordem de h2 , melhor que Euler e
sem envolver derivadas de f . Essa diferença de ordem pode fazer com que o método do ponto médio possa
atingir às vezes uma precisão boa com passos muito maiores. Vamos ver isso acontecendo na prática.
In [4]: # Teste com equação boba y'= y, y(0) = 1 em [0, 2].
f(t, y) = y
n = 1000
# Método de Ponto médio para PVI y' = f(t, y), y(a) = y0, usando n pontos.
function PontoMedio(a, b, f, y0, n)
n = round(Int, n)
h = (b - a) / n
y = Array(Float64, n + 1)
y[1] = y0
t = a
for i = 2:n+1
y05 = y[i - 1] + (h/2)*f(t, y[i - 1])
t += h/2
y[i] = y[i - 1] + h*f(t, y05)
t += h/2
end
return y
end
y = PontoMedio(0, 2, f, 1, n / 10)
@show y[end]
@show abs(y[end] - exp(2))/exp(2);
exp(2) = 7.38905609893065
y[end] = 7.374312390354604
abs(y[end] - exp(2)) / exp(2) = 0.0019953439760972626
y[end] = 7.388085615092282
abs(y[end] - exp(2)) / exp(2) = 0.00013134070514211196
7
Integrando essa fórmula obtemos
∫ t ∫ t
y ( t ) − y0 = y′ (t)dt = f (t, y(t))dt.
a a
Assim, se queremos estimar y(ti+1 ), ou seja calcular yi+1 , e temos uma boa estimativa de y(ti ), que
chamamos de yi , podemos calcular
∫ t ∫ t
i +1 i +1
y ( t i +1 ) = y ( t i ) + f (t, y(t))dt ≈ yi + f (t, y(t))dt.
ti ti
∫t
Assim, para achar uma boa estimativa de y(ti+1 ) basta achar uma boa estimativa de t i+1 f (t, y(t))dt.
i
Para isso podemos usar qualquer uma das fórmulas de integração que vimos anteriormente. Por, exemplo
usando a fórmula do trapézio temos
∫ t
i +1 h( ) h( )
f (t, y(t))dt ≈ f (ti , y(ti )) + f (ti+1 , y(ti+1 ) ≈ f ( t i , y i ) + f ( t i +1 , y i +1 ) .
ti 2 2
h( )
y i +1 = y i + f ( t i , y i ) + f ( t i +1 , y i +1 ) .
2
Esse método pode ser implementado e tem um bom comportamento. Infelizmente a sua implementação
é um pouco mais complicada do que parece inicialmente. Isso porque o valor desconhecido yi+1 aparece
dos dois lados da equação e do segundo lado de forma não linear. Ele não pode ser isolado facilmente e
cada iteração do método envolverá a resolução de uma equação não-linear em yi+1 , por exemplo usando
o método de Newton. Esse tipo de método é conhecido como implícito. Note que como o método do
trapézio tem erro da ordem O(h3 ) então o erro de truncamento local do método do trapézio para PVI é
1/hO(h3 ) = O(h2 ).
Podemos contonar a dificuldade de um método implícito e ainda conseguir um método mais interes-
sante do que Euler. Por exemplo podemos primeiro estimar yi+1 por Euler e depois substituir essa apro-
ximação no lado direito da equação que define o método dos trapézios. Com isso obtemos o método de
Heun:
ŷi+1 = yi + h f (ti , yi )
h( )
y i +1 = y i + f (ti , yi ) + f (ti+1 , ŷi+1 ) .
2
Uma forma geométrica de entender esse método é que ele segue uma linha que tem como inclinação a
média de inclinação em (ti , yi ) e em (ti+1 , ŷi+1 ).
ỹi+α = yi + αh f (ti , yi ).
8
Vamos começar analisando o que podemos obter pela escolha do ponto intermediário ỹi+α . Vamos então
expandir f (ti + αh, ỹi+α ) em torno do ponto original (ti , yi ).
α2 h2
yi+1 = yi + βh f + γh( f + αh( f t + f f y ) + ( f tt + 2 f f ty + f 2 f yy ) + O(h3 ))
2
α2 γh3
= yi + ( β + γ)h f + αγh2 ( f t + f f y ) + ( f tt + 2 f f ty + f 2 f yy ) + O(h4 ).
2
Já a expansão de Taylor da solução real y(ti+1 ) em torno de ti é
h2 ′′ h3
y(ti+1 ) = y(ti ) + hy′ (ti )h + y (ti ) + y′′′ (ti ) + O(h4 )
2 6
h2 h3
= y(ti ) + h f + ( f t + f f y ) + ( f tt + 2 f f ty + f t f y + f 2 f yy + f f y2 ) + O(h4 ).
2 6
Analisando as duas últimas expressões vemos que conseguimos forçar y(ti+1 ) a obedecer a equação do
método até o termo que multiplica h2 , já o termo O(h3 ) não pode ser exatamente iguais por que o conjunto
de derivadas que o multiplica ser diferente. Para isso precisamos que
1
β + γ = 1, αγ = .
2
Essas esquações têm múltiplas soluções. Por exemplo podemos tomar β = γ = 1/2, α = 1 e recuperamos
o método de Heun. Ou ainda tomarmos α = 1/2, γ = 1 e β = 0 e então temos o método do ponto médio.
Métodos que oebedecem a esse tipo de equações, usando pontos intermediários para anular termos
de ordem mais alta nas séries de Taylor são conhecidos como métodos de Runge-Kutta. Os dois métodos
acima tem erro de truncamento local da ordem de O(h2 ). Porém, introduzindo mais pontos intermediários
e parâmetros é possível obter métodos de quarta ordem, ou seja com erro de truncamento O(h4 ). A dedução
é porém muito complicada e vamos apenas apresentar as fórmulas envolvidas
q1 = f ( t i , y i ),
q2 = f (ti + h/2, yi + (h/2)q1 )
q3 = f (ti + h/2, yi + (h/2)q2 )
q4 = f (ti + h, yi + hq3 )
h
yi+1 = yi + (q1 + 2q2 + 2q3 + q4 ).
6
Ese método é conhecido como méto de Runge-Kurra de quarta ordem clássico. Uma forma interessante
de derivá-lo é ver que se f não depende de y então esse método corresponde a a fórmula de integração de
Simpson que é dada por
∫ t+h
h
y(t + h) − y(t) = f (s)ds ≈ ( f (t) + 4 f (t + h/2) + f (t + h)) .
t 6
Está na hora de testar esses métodos.
9
In [6]: # Teste com y'= f, [2, 3], y(2) = 2.
f(t, y) = 1 - y / t
ys(t) = t/2 + 2/t
n = 2
# Imprime solução
@show ys(3)
# Método de Runge-Kutta de quarta ordem para PVI y' = f(t, y), y(a) = y0, usando n pontos.
function RK4(a, b, f, y0, n)
n = round(Int, n)
h = (b - a) / n
y = Array(Float64, n + 1)
y[1] = y0
t = a
for i = 2:n+1
q1 = f(t, y[i - 1])
q2 = f(t + h/2, y[i - 1] + (h/2)*q1)
q3 = f(t + h/2, y[i - 1] + (h/2)*q2)
q4 = f(t + h, y[i - 1] + h*q3)
y[i] = y[i - 1] + (h / 6)*(q1 + 2*q2 + 2*q3 + q4)
t += h
end
return y
end
println("Runge-Kutta de quarta ordem")
yrk4 = RK4(2, 3, f, 2, n)
@show yrk4[end]
@show abs(yrk4[end] - ys(3))/ys(3)
# Método de Runge-Kutta de segunda ordem para PVI y' = f(t, y), y(a) = y0, usando n pontos.
function RK2(a, b, f, y0, n)
n = int(n)
h = (b - a) / n
y = Array(Float64, n + 1)
y[1] = y0
t = a
for i = 2:n+1
ty = y[i - 1] + h*f(t, y[i - 1])
y[i] = y[i - 1] + (h / 2)*(f(t, y[i - 1]) + f(t + h, ty))
t += h
end
return y
10
end;
ys(3) = 2.1666666666666665
Euler
ye[end] = 2.1
abs(ye[end] - ys(3)) / ys(3) = 0.030769230769230663
Ponto médio de segunda ordem
ypm[end] = 2.1737373737373735
abs(ypm[end] - ys(3)) / ys(3) = 0.0032634032634032335
Runge-Kutta de quarta ordem
yrk4[end] = 2.1666666666666665
abs(yrk4[end] - ys(3)) / ys(3) = 0.0
11