Equações Diferenciais e RMarkdown
May 19, 2017
Este trabalho tem como objetivo a aplicação de comandos para o RMarkdown. Assim, vamos resolver algumas equações diferenciais ordinárias utilizando o R. As referências utilizadas aqui são [1] e [2]
Modelo de Lorenz
Vamos considerar o modelo de Lorenz, que é um sistema de equações diferenciais dado por
Segue abaixo a solução da equação diferencial acima para os parâmetros
library(deSolve)
a <- -8/3 ; b <- -10 ; c <- 28
yini <- c(X = 1, Y = 1, Z = 1)
Lorenz <- function (t, y, parms) {
with(as.list(y), {
dX <- a*X + Y*Z
dY <- b*(Y-Z)
dZ <- -X*Y + c*Y - Z
list(c(dX,dY,dZ))
})
}
times <- seq(from=0, to=100, by=0.01)
out <- ode(y = yini, times = times, func = Lorenz, parms = NULL)
Após a modelagem da equação diferencial acima, vamos plotar a solução.
plot(out[,"Y"], out[,"X"], type = "l", xlab = "Y",
ylab = "X", main = "Solução Borboleta", col="blue")
O modelo de Lorenz também é conhecido como Atrator de Lorenz, devido ao comportamento das soluções. Vamos plotar mais algumas soluções para a, b e c distintos.
a <- -10 ; b <- -8/3 ; c <- 21
Lorenz <- function (t, y, parms) {
with(as.list(y), {
dX <- a*X + Y*Z
dY <- b*(Y-Z)
dZ <- -X*Y + c*Y - Z
list(c(dX,dY,dZ))
})
}
times <- seq(from=0, to=1000, by=0.01)
out <- ode(y = yini, times = times, func = Lorenz, parms = NULL)
Sendo o seu gráfico dado abaixo.
plot(out[,"X"], out[,"Z"], type = "l", xlab = "X",
ylab = "Z", main = "Solução Fibonacci", col="red")
E para outros parâmetros a, b e c, temos que
a <- -1 ; b <- -8/3 ; c <- 20
Lorenz <- function (t, y, parms) {
with(as.list(y), {
dX <- a*X + Y*Z
dY <- b*(Y-Z)
dZ <- -X*Y + c*Y - Z
list(c(dX,dY,dZ))
})
}
times <- seq(from=0, to=100, by=0.01)
out <- ode(y = yini, times = times, func = Lorenz, parms = NULL)
plot(out[,"X"], out[,"Y"], type = "l", xlab = "X",
ylab = "Y", main = "Solução Redemoinho", col="cyan4")
Vamos agora gerar um gif para o último atrator de Lorenz.
frames = 20
for(i in 1:frames){
a <- -1 ; b <- -8/3 ; c <- 20
Lorenz <- function (t, y, parms) {
with(as.list(y), {
dX <- a*X + Y*Z
dY <- b*(Y-Z)
dZ <- -X*Y + c*Y - Z
list(c(dX,dY,dZ))
})
}
times <- seq(from=0, to=i, by=0.01)
out <- ode(y = yini, times = times, func = Lorenz, parms = NULL)
name = paste('0',i,"plot.png",sep='')
png(name)
plot(out[,"X"], out[,"Y"], type = "l", xlab = "X",
ylab = "Y", main = "Solução Redemoinho", col="cyan4")
dev.off()
}
Acima geramos as imagens para criar um gif. Para juntar as imagens, temos que usar o terminal. Para tanto, basta entrar no diretório onde as imagens estão salvas e rodar o seguinte código
convert *.png -delay 3 -loop 10000000 redomoinho.gif
Assim, temos o seguinte gif.
Com isso, encerramos a primeira Atividade do curso de RMarkdown.