Crie um algoritmo computacional para obter a solução do problema de valor inicial (PVI) a seguir, utilizando o Método de Euler Melhorado.
Como resposta desse exercício:
a) anexe um bloco de notas com o código desenvolvido na atividade do Classroom. No início do código, insira um comentário com seu nome, RA e qual linguagem de programação está usando (recomenda-se a utilização da linguagem
por haver material sobre essa linguagem no Classroom, mas pode ser utilizada qualquer linguagem de sua preferência);
b) considerando que a solução analítica do PVI é
, apresente uma tabela com as soluções exatas (utilizando
), as soluções numéricas obtidas por Euler Melhorado e os erros absolutos, para todos os pontos da malha (veja Exemplo 2 nos slides 34-36). Complete acrescentando um gráfico do Geogebra, contendo a função
e os valores numéricos obtidos para os pontos da malha (veja slide 37). Apresente a solução deste item no arquivo PDF, juntamente com a solução do Exercício 1.
a) anexe um bloco de notas com o código desenvolvido na atividade do Classroom. No início do código, insira um comentário com seu nome, RA e qual linguagem de programação está usando (recomenda-se a utilização da linguagem
b) considerando que a solução analítica do PVI é
Passo 1
Resumo do que o enunciado dá e pede (vou listar TUDO com clareza):
- Equação diferencial ordinária (PVI):
- Condição inicial:
- Intervalo:
- Passo:
- Também é dada a solução analítica (para comparação):
O que você precisa (resumo das entregas):
a) fornecer o código (arquivo de texto) com comentário inicial contendo seu nome e RA (vou deixar placeholders que você substitui);
b) calcular para cada ponto da malha : a solução exata
, a solução numérica pelo Método de Euler Melhorado e o erro absoluto; apresentar esses valores em tabela e gerar pontos que podem ser plotados no GeoGebra.
a) fornecer o código (arquivo de texto) com comentário inicial contendo seu nome e RA (vou deixar placeholders que você substitui);
b) calcular para cada ponto da malha
Passo 2
O Método de Euler Melhorado (também chamado de método de Heun / predictor-corrector simples) — explicação didática e fórmula:
- Ideia: em vez de usar só a inclinação em
(como no Euler explícito), fazemos um “previsor” e depois corrigimos usando a média das inclinações em e em . - Notação:
é o ponto atual, é a aproximação para . O passo é . A função do lado direito é . - Predictor (Euler explícito):
- Corrector (média das inclinações):
Explicando cada símbolo:
-
: taxa de variação (derivada) avaliada no ponto atual; -
: previsão do próximo valor usando Euler simples; -
: taxa de variação no próximo ponto usando a previsão; -
: valor corrigido (média das inclinações * passo + ).
Esse método costuma ser bem melhor que o Euler explícito e ainda é simples de implementar (sem sistemas implícitos).
Passo 3
Código (bloco de notas) em linguagem R — coloque esse texto num arquivo de texto simples (por ex. “euler_melhorado_R.txt”) e substitua os placeholders de nome/RA. O código calcula tabela e grava um CSV pronto para abrir no GeoGebra; também imprime a tabela na tela.
# Nome: SEU_NOME_AQUI
# RA: SEU_RA_AQUI
# Linguagem: R
# Método: Euler Melhorado (Heun) para y' = 1/(1+x^2) - 2 y^2
# Como usar: copie este arquivo para um .R ou .txt, edite o nome/RA e rode em R.
f <- function(x,y) {
1/(1 + x^2) - 2*y^2
}
# malha
x0 <- 1.0
xf <- 1.6
h <- 0.1
xs <- seq(x0, xf, by = h)
# condição inicial
y0 <- 0.5
# vetor para armazenar
yn <- numeric(length(xs))
yn[1] <- y0
# iteração do Euler melhorado
for (i in 1:(length(xs)-1)) {
xi <- xs[i]
yi <- yn[i]
fi <- f(xi, yi)
y_pred <- yi + h * fi # preditor
fi_next <- f(xs[i+1], y_pred) # f(x_{n+1}, y_pred)
yn[i+1] <- yi + (h/2) * (fi + fi_next) # corretor
}
# solução exata
y_exact <- function(x) { x/(1 + x^2) }
ys_exact <- sapply(xs, y_exact)
# erros absolutos
errors <- abs(ys_exact - yn)
# tabela
res <- data.frame(x = xs, y_exata = ys_exact, y_euler_melhorado = yn, erro_abs = errors)
print(res, digits = 10)
# salva CSV para abrir no GeoGebra (substitua o nome se quiser)
write.csv(res, file = "tabela_euler_melhorado.csv", row.names = FALSE)
# salva também os pontos no formato que o GeoGebra aceita (duas colunas)
write.table(res[, c("x","y_euler_melhorado")], file = "pontos_geogebra.txt", row.names = FALSE, col.names = FALSE)
Observação prática: o arquivo “tabela_euler_melhorado.csv” fica pronto para abrir no GeoGebra ou Excel; o arquivo “pontos_geogebra.txt” contém pares
que o GeoGebra lê como pontos.
Passo 4
Vamos aplicar o método passo a passo — explicando e calculando com calma cada operação (vou mostrar cálculos numéricos aproximados, cada valor com várias casas para você conferir na prova). Começamos no ponto inicial:
-
, . - Calcule
. - Predictor:
. - Avalie
com : - Corrector:
Comparação com a solução exata:
. Erro absoluto:
.
Passo 5
Do passo
para
:
- Dados:
, . - Calcule
. - Primeiro
(detalhe: calculei por expansão). - Então
.
- Primeiro
- Predictor:
. - Avalie
com : -
. -
então . -
.
-
- Corrector:
Exata:
. Erro:
.
Passo 6
Do passo
para
:
-
, . -
. Então . - Predictor:
. - Avalie
: . então . Assim . - Corrector:
Exata:
. Erro:
.
Passo 7
Do passo
para
:
-
. . -
. - Predictor:
. - Avalie em
: . -
e . -
.
-
- Corrector:
Exata:
. Erro:
.
Passo 8
Do passo
para
:
-
. . -
. - Predictor:
. - Avalie em
: . -
então . -
(aprox).
-
- Corrector:
Exata:
. Erro:
.
Passo 9
Do passo
para
(último ponto):
-
. . -
. - Predictor:
. - Avalie em
: . -
então . -
.
-
- Corrector:
Exata:
. Erro:
.
Passo 10
Tabela final (valores arredondados para apresentação — os valores completos estão no código que dei; aqui apresento 10 casas decimais e separador decimal com vírgula conforme solicitado):
- Para cada linha:
.
Instrução rápida para o GeoGebra (o que fazer com os arquivos gerados pelo código):
- Abra o GeoGebra, importe o CSV “tabela_euler_melhorado.csv” (ou cole os pares do arquivo “pontos_geogebra.txt”) para obter os pontos da aproximação, e trace a função
para comparar graficamente.
Resposta
(a) Código (arquivo .txt) — conteúdo para copiar (ver Passo 3).
(b) Tabela de ,
,
pelo Euler Melhorado e erro absoluto:
(b) Tabela de