Você está na página 1de 11

Problemas de Valor Inicial

Paulo J. S. Silva
12 de setembro de 2017

1 Equações diferenciais - problemas de valor inicial


Equações diferenciais são expressões que nos dão informações sobre o comportamento da derivada de uma
função. O nosso objetivo é então encontrar uma função cujas derivadas obedeçam a equação. Vejamos
alguns exemplos:
• y′ (t) = 2t. Nesse caso é fácil ver que y(t) = t2 + c é uma possível solução para qualquer constante c
real escolhida.
• u′ = u. Note que aqui deixamos de colocar explicitamente a varíavel da função, isso deixa a notação
mais próxima da notação de equações numéricas usuais e pode ser feito sempre que essa omissão
não causar dúvidas. Nesse caso também é possível obter soluções lembrando de uma das derivadas
fundamentais: u(t) = cet . Note mais uma vez que é possível escolher qualquer constante c ∈ R.
• v′′ + v = 0. Nesse caso é obtenção de uma solução não é tão simples. Note também que a equação
diferencial envolve a derivada segunda. Possíveis soluções tem a forma v(t) = α cos(t) + β sin(t)
para quaisquer constantes αβ ∈ R.
• y′′ y + (y′ )2 = 1 + 2t. De novo uma equação difícil, agora envolvendo y, y′ e y′′ . Possíveis soluções
têm a forma y(t) = ln |c1 + c2 t = t2 /2 + t3 /3|, com constantes reais c1 , c2 ∈ R.
Uma primeira observação sobre as equações acima é que elas não definem completamente a resposta.
Veja que em todos os casos há um parâmetro, ou mais, que pode ser escolhido. Isso está ligado ao teorema
fundamental do cálculo em que sabemos que a primitiva de uma função não está completamente deter-
minada já que sempre podemos somar uma constante na resposta. Para conseguir definir completamente
a resposta é necessário dar mais informação além da equação. Muitas vezes essa informação extra nos
informa qual o valor da função em um ponto, que chamamos de ponto inicial.

1.1 Problema de valor inicial


Um problema de valor inicial é composto por uma equação diferencial junto com o estabelecimento do
valor das funções desejadas em um ponto que denotamos abaixo por t0 . Formalmente um problema de
valor incial (PVI) é definido pelas equações

y′ (t) = f (t, y(t)), t > t0


y ( t0 ) = y0 ,
em que y : R → R, f : R × R → R e t0 , y0 são constantes reais.
Nesse caso além da equação diferecial definimos o valor da função desejada em um tempo (argumento)
inicial. Daí o nome desse tipo de equação. Vejamos o que ocorre se definirmos valores iniciais nos dois
primeiros exemplos acima.
• y′ (t) = 2t, y(0) = 5. Nesse caso se partimos da forma que já conhecemos para a solução teríamos
y(t) = t2 + c para alsum c ∈ R. Mas usando a condição inicial temos 5 = y(0) = 02 + c = c. Assim a
solução fica completamente determinada. y(t) = t2 + 5.

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.

Teorema (existência e unicidade de soluções para PVI). Considere o PVI e um "retângulo"no R2 , R =


[ a, b] × [c, d] tais que * f é contínua em R. * f é Lipschtiz contínua com respeito à sua segunda variável em
R, isto é
∃ L, |( f (t, y1 ) − f (t, y2 )| ≤ L|y1 − y2 |, ∀y1 , y2 ∈ [c, d].
* (t0 , y0 ) ∈ ( a, b) × (c, d).
Então existe δ > 0 tal que o PVI tem solução única para t ∈ [t0 − δ, t0 + δ].
Esse teorema garante, por examplo que as soluções encontradas acima para os exemplos de problemas
de valor inicial são únicas.
Já um PVI baseado na equação diferencial

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.

1.2 Estendendo para para além de R


Nossa definição do PVI considerou que a função que desejamos y : R → R. Mas isso não é realmente
necessário. Ela também pode ser uma função vetorial, isto é podemos pensar em um problema de valor
inicial que procura uma função y : R → Rn , por exemplo descrevendo uma trajetória no espaço para o qual
o n = 3. De uma forma geral vamos considerar o problema de valor inicial PVI

y′ (t) = f (t, y(t)), t > t0


y ( t0 ) = y0 ,

em que y : R → Rn , f : R × Rn → Rn e t0 , y0 ∈ Rn são valores pré-definidos.

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)).

Exercício Reformule o PVI abaixo como um sistema de primeira ordem



 ′′
u + u = 6 cos(t)
u (0) = 2

 ′
u (0) = 3.

1.3 Solução numérica


Agora vamos pensar um pouco o que representa resolver um PVI. Idealmente desejamos encontrar a ex-
pressão da função y, mas isso nem sempre é possível. Mas ainda, é bastante comum que isso não seja
possível.
Vamos então nos contentar a calcular uma aproximação numérica de y. Se desejamos conhecer y em um
intervalo [t0 , t + δ] o que fazemos é subdividir esse intervalo em N partes usando t0 < t1 < t2 < . . . < t N =
t0 + δ, tipicamente as larguras de todos subintervalos ti − ti−1 serão chamadas de hi e são conhecidas como
tamanho de passo. Nosso objetivo será achar aproximações yi que aproximam o valor da solução do PVI em
ti , ou seja vamos tentar calcular
yi ≈ y(ti ), i = 1, . . . , N.
Mas como fazer isso? Lembremos que a condição inicial nos dá o y0 = y(t0 ). Devemos usar essa
informação, e o resto do PVI, para tentar obter os outros valoes. De uma forma geral vamos usar que
conhecemos a sequência de aproximações y0 , y1 , . . . , yi − 1 e tentar encontrar o próximo valor yi . Uma
ferramenta fundamental é a expansão de Taylor

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

# Teste com equação boba y'= y, y(0) = 1 em [0, 2].


f(t, y) = y
N = 1000

# Resolve primeiro com o método de Euler


y = Euler(0, 2, f, 1, N)
@show exp(2)
@show y[end]
@show abs(y[end] - exp(2))/exp(2)

exp(2) = 7.38905609893065

Out[1]: 0.0019953439760972626

y[end] = 7.374312390354604
abs(y[end] - exp(2)) / exp(2) = 0.0019953439760972626

1.4 Métodos de ordem mais alta


Retomando o raciocínio que nos levou ao método de Euler. Lembramos que a ideia fundamenta foi a
observação da expansão de Taylor da solução.

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

y(ti+1 ) ≈ y(ti ) + hy′ (ti ).

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

y′ (t) = f (t, y(t)).

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

Podemos simplificar um pouco a expressão acima adotando a notação

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.

1.5 Método do ponto médio


Um dos problemas do método de Euler é que ele considera constante a derivada de y ao ir do ponto yi para
yi+1 . Isso por exemplo implica que o método irá sempre errar por baixo se a derivada for crescente ou por
cima se a derivada for decrescente. O ideal seria conhecer qual é a derivada média entre [ti , ti+1 ] e usar
esse valor mas isso não é possível não conhecemos y nesse intervalo. Uma tentativa de aproximar isso é
tentar calcular a derivada no ponto médio do intervalo e usá-la como aproximação da derivada média. Se
as derivadas forem contínuas, o que é uma hipótese razoável que estamos fazendo, essa derivada no ponto
médio deve tanto receber influência das derivadas em ti quanto em ti+1 . Mas de novo recaímos no mesmo
problema, ou seja não conhecemos y(ti + h/2).
A ideia do método do ponto médio é usar o Euler para aproximar y(ti + h/2) e depois calcular a deri-
vada nesse ponto usando a definição da equação diferencial. Por fim usamos essa derivada "média aproxi-
mada"para dar um passo parecido com Euler de ti para ti+1 . Obtemos o método do ponto médio:

yi+1/2 = yi + h/2 f (ti , yi ),


yi+1 = yi + h f (ti+1/2 , yi+1/2 ).

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

y(ti+1 ) − y(ti ) = f (ti+1/2 , y(ti+1/2 ))h + O(h3 ).

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

y(ti+1 ) − y(ti ) = f (ti+1/2 , yi+1/2 + O(h2 ))h + O(h3 ).

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

# Resolve primeiro com o método de Euler


y = Euler(0, 2, f, 1, n)
@show exp(2)
@show y[end]
@show abs(y[end] - exp(2))/exp(2)

# 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

1.6 Métodos baseados em fórmulas de integração


Uma ideia bastante natural é derivar métodos de solução de problemas de valor inicial usando fórmulas de
integração. Para isso basta partir da definição de um PVI

y′ (t) = f (t, y(t))


y ( a ) = y0 .

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

Substituindo na fórmula acima temos o método do trapézio

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 ).

1.7 Métodos do tipo Runge-Kutta


Uma forma alternativa de se deduzir o Método de Heun é tentar analisar as expansões de Taylor de modo
a obter um método que obtenha um erro de truncamento o menor possível. Para atingir isso podemos
imaginar que vamos calcular um ponto intermediário

ỹi+α = yi + αh f (ti , yi ).

Para em seguida obter o próximo ponto através de

yi+1 = yi + βh f (ti , yi ) + γh f (ti + αh, ỹi+α ).

O objetivo é escolher os parâmetros α, β e γ de modo a garantir um erro de truncamento local o menor


possível.

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 ).

f (ti + αh, ỹi+α ) = f (ti + αh, yi + αh f (ti , yi ).) =


α2 h2
f + αh( f t + f f y ) + ( f tt + 2 f f ty + f 2 f yy ) + O(h3 ). (1)
2
Todas as aparições de f e suas derivadas estão sendo avaliadas em (ti , yi ).
Substituindo de volta na fórmula de yi+1

α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)

# Resolve primeiro com o método de Euler


println("Euler")
ye = Euler(2, 3, f, 2, n)
@show ye[end]
@show abs(ye[end] - ys(3))/ys(3)

println("Ponto médio de segunda ordem")


ypm = PontoMedio(2, 3, f, 2, n)
@show ypm[end]
@show abs(ypm[end] - ys(3))/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

Você também pode gostar