-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathIntegracao numerica em R.R
125 lines (90 loc) · 4.02 KB
/
Integracao numerica em R.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
## ----Exemplo_Euler------------------------------------------------------------
# intervalos de tempo: uma sequência de zero a dez em passos de 0,5
time <- seq(0, 10, by = 0.5)
# condição inicial
x0 <- 0.1
## A função a ser integrada (expressão à direita da derivada acima)
f <- function(x){x * (1.-x)}
## Um vetor vazio para armazenar os resultados
x <- c()
## Armazena a condição inicial na primeira posição do vetor
x[1] <- x0
# loop ao longo do tempo: aproxima a função a cada passo de tempo
for (i in 1:(length(time)-1)){
x[i+1] = x[i] + 0.5 * f(x[i])
}
## plotando com ggplot2
library(ggplot2)#carrega cada biblioteca uma vez por sessão R
p <- ggplot(data = data.frame(x = x, t = time), aes(t, x)) + geom_point()
analytic <- stat_function(fun=function(t){0.1 * exp(t)/(1+0.1*(exp(t)-1.))})
print(p+analytic)
## -----------------------------------------------------------------------------
# paramentros: devem estar em um vetor
parameters <- c(r = 1.5, K = 10)
# condições iniciais: também devem estar em um vetor, mesmo que seja um só valor
state <- c(x = 0.1)
## -----------------------------------------------------------------------------
## seqüência de tempo
time <- seq(from=0, to=10, by = 0.01)
## -----------------------------------------------------------------------------
## A ODE logística a ser integrada
logistic <- function(t, state, parameters){
with(
as.list(c(state, parameters)),{
dx <- r*x*(1-x/K)
return(list(dx))
}
)
}
## -----------------------------------------------------------------------------
library(deSolve)# Carrega a biblioteca para integração, basta chamar uma vez por seção do R
## Executa a integração
out <- ode(y = state, times = time, func = logistic, parms = parameters)
## -----------------------------------------------------------------------------
head(out) # primeiras 6 linhas
## -----------------------------------------------------------------------------
#### Para o jupyter notebook apenas
options(jupyter.plot_mimetypes = 'image/png', repr.plot.height=5)
####
plot(out, lwd=6, col="lightblue", main="", ylab="N(t)")
curve(0.1*10*exp(1.5*x)/(10+0.1*(exp(1.5*x)-1)), add=TRUE)
legend("topleft", c("Numerical", "Analytical"), lty=1, col=c("lightblue", "black"), lwd=c(6,1))
## -----------------------------------------------------------------------------
## Plotando com o ggplot2
p <- ggplot(data = as.data.frame(out), aes(time, x)) + geom_point()
analytic <- stat_function(fun=function(t){0.1*10*exp(1.5*t)/(10+0.1*(exp(1.5*t)-1))})
print(p+analytic)
## -----------------------------------------------------------------------------
# Paramêtros: vetor
parameters <- c(r = 2, k = 0.5, e = 0.1, d = 1)
# condições iniciais: vetor
state <- c(V = 1, P = 3)
## -----------------------------------------------------------------------------
# sequência do tempo
time <- seq(0, 50, by = 0.01)
# Paramêtros: vetor
parameters <- c(r = 2, k = 0.5, e = 0.1, d = 1)
# condições iniciais: vetor
state <- c(V = 1, P = 3)
## -----------------------------------------------------------------------------
# Função R para calcular o valor das derivadas a cada valor de tempo
# Use os nomes das variáveis conforme definido nos vetores acima
lotkaVolterra <- function(t, state, parameters){
with(as.list(c(state, parameters)), {
dV = r * V - k * V * P
dP = e * k * V * P - d * P
return(list(c(dV, dP)))
})
}
## -----------------------------------------------------------------------------
## Integração com'ode'
out <- ode(y = state, times = time, func = lotkaVolterra, parms = parameters)
## Plotando
out.df = as.data.frame(out) # exigido pelo ggplot
library(reshape2)
out.m = melt(out.df, id.vars='time') # isso facilita a plotagem colocando todas as variáveis em uma única coluna
p <- ggplot(out.m, aes(time, value, color = variable)) + geom_point()
print(p)
## -----------------------------------------------------------------------------
p2 <- ggplot(data = out.df[1:567,], aes(x = P, V, color = time)) + geom_point()
print(p2)