Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Ambos lados da revisão anteriorRevisão anterior
Próxima revisão
Revisão anterior
Última revisãoAmbos lados da revisão seguinte
exercicios:calc1 [2012/05/11 03:01] – [Integração Numérica no R] shalomexercicios:calc1 [2013/05/06 18:57] – [Agora é realmente com vc.] adalardo
Linha 49: Linha 49:
  
   plot2d(10*exp(0.2*t),[t,0,20]);   plot2d(10*exp(0.2*t),[t,0,20]);
 +
 +===== Outra função simples =====
 +{{:exercicios:maximalogo.png?50  |}}
 +Vamos pensar em outro caso, onde a taxa de variação instantânea é positiva e tende a zero quando o valor da nossa variável aproxima a um. Em outras aumenta muito quando o valor e pequeno e muito pouco quando o valor aproxima-se a um.
 +
 +$$ f(x)=f(x)* (1-f(x)) $$
 +
 +<code>
 +'diff(f(t),t)=f(t)*(1-f(t));
 +ode2(%,f(t),t);
 +</code>
 +
 +Talvez não reconheça essa função, faça exponenciação de ambos os lados que ela parecerá mais simpática. Ela é a solução do exemplo anterior multiplicada por uma expressão que funciona como um freio que aperta mais forte conforme chega perto de um. Elá é a base dos modelos logísticos populacionais.
 +
      
 ====== Soluções Numéricas ====== ====== Soluções Numéricas ======
  
-Essa primeira equação diferencial foi fácil de resolver no Maxima {{:exercicios:maximalogo.png?30|Maxima}}. Mas não se acostume, nem sempre é assim. Muitas equações não tem soluções algébricas((outras tem mais de uma solução)) e precisam ser resolvidas com métodos chamados de "força bruta". São geralmente computacionalmente intensos, mas com um computador pessoal podemos fazer maravilhas... +Essas primeiras equações diferencial foram fáceis de resolver no Maxima {{:exercicios:maximalogo.png?30|Maxima}}. Mas não se acostume, nem sempre é assim. Muitas equações não tem soluções algébricas((outras tem mais de uma solução)) e precisam ser resolvidas com métodos chamados de "força bruta". São geralmente computacionalmente intensos, mas com um computador pessoal podemos fazer maravilhas... 
-O processo básico é bem simples, muito parecido com o que fizemos para resolver as derivadas, mas tem muitas técnicas envolvidas.+O processo básico é bem simples, muito parecido com o que fizemos para resolver as derivadas, mas existem muitas outras técnicas mais robustas.
  
 ===== Método de Euler ===== ===== Método de Euler =====
Linha 68: Linha 82:
 Podemos usar um intervalo de tempo arbitrário, por exemplo 0.1, o que nós dá : Podemos usar um intervalo de tempo arbitrário, por exemplo 0.1, o que nós dá :
  
-  * $\frac{N_{t + 0.1} - N_t}{0.1}2N$+  * $\frac{N_{t + 0.1} - N_t}{0.1}\approx 2N$
  
 Ou seja, sendo que $N(0)=20$, no tempo 0.1, temos que: Ou seja, sendo que $N(0)=20$, no tempo 0.1, temos que:
  
   * $N_{t + 0.1} - N_t= 2N * 0.1$   * $N_{t + 0.1} - N_t= 2N * 0.1$
-  * $N_{t + 0.1} = 2N*0.1 + N_t$+  * $N_{t + 0.1} = 2N_t*0.1 + N_t$
   * $N_{t + 0.1} = 40 * 0.1 + 20 $    * $N_{t + 0.1} = 40 * 0.1 + 20 $ 
   * $N(0.1) = 24 $   * $N(0.1) = 24 $
  
-Podemos repetir isso para os próximos intervalos de tempo. Vamos ver como funciona no {{:exercicios:rlogo.png?30|}}. +No tempo 0.2, temos que: 
 + 
 +  * $N_{0.1 + 0.1} - N_0.1 = 2N_0.1 * 0.1$ 
 +  * $N_{0.1 + 0.1} = 2 * 24 *0.1 + 24$ 
 +  * $N_{0.1 + 0.1} = 48 * 0.1 + 24 $  
 +  * $N(0.2) = 28.4 $ 
 + 
 +E assim por diante .... 
 +$\lim\limits_{x \to \infty} f(x)$ 
 +Note que quanto menor o intervalo de tempo que usamos melhor é a precisão da nossa aproximação, lembrando que $\Delta t -> 0 $    
 +Podemos repetir isso para os próximos intervalos de tempo no {{:exercicios:rlogo.png?30|}}. 
  
 <code> <code>
-# Lembre que dy/dt = f(y, t) no caso geral +f <- function (N, t)  
-# Vamos criar essa f: +
-f <- function (N, t) { +        return (2*N)
-        return (2*N);+
 } }
 # No tempo inicial, N vale 20: # No tempo inicial, N vale 20:
-N0 <- 20+N0 <- 20 
 # O passo de tempo eh dt. Vamos rodar ateh tmax # O passo de tempo eh dt. Vamos rodar ateh tmax
 dt <- 0.1  dt <- 0.1 
-tmax <- 2;+tmax <- 2
  
-euler <- function (f, N0, dt, tmax) {+euler <- function (f, N0, dt, tmax)  
 +{
         # res vai retornar o vetor com todos os Ns         # res vai retornar o vetor com todos os Ns
-        res <- NULL; +        res <- NULL 
-        N <- N0 +        N <- N0 
-        for (tempo in seq(0, tmax, dt)) {+        for (tempo in seq(0, tmax, dt))  
 +        {
                 N <- N + f(N,tempo)*dt                 N <- N + f(N,tempo)*dt
                 res <- rbind(res, N)                 res <- rbind(res, N)
Linha 103: Linha 128:
  
 # Examine a solucao numerica: # Examine a solucao numerica:
-numerica <- euler(f, N0, dt, tmax);+numerica <- euler(f, N0, dt, tmax)
  
 x<- seq(0, tmax, dt)  x<- seq(0, tmax, dt) 
 # A solucao correta da EDO: # A solucao correta da EDO:
-plot(x, 20*exp(2*x), typ='l', col='green');+plot(x, 20*exp(2*x), typ='l', col='green')
 # Vamos comparar com a solucao numerica # Vamos comparar com a solucao numerica
-points(x, numerica, col='red', pch=4, ce=0.2);+points(x, numerica, col='red', pch=4, ce=0.2)
 </code> </code>
  
-A aproximação foi boa? Tente repetir o mesmo código com dt = 0.01 e compare. +A aproximação foi boa? Tente repetir o mesmo código com dt = 0.01 e 0.001 e compare. 
-===== Outra função simples ===== +====== Integração Numérica no R ====== 
- +Não precisamos fazer todo procedimento anterior para fazer integração numérica no {{:exercicios:rlogo.jpg?20  |}}existem soluções implementadas previamente que são muito mais eficientes e robusta que a nossa
-Vamos pensar em outro caso, onde a taxa de variação instantânea é positiva e tende a zero quando valor da nossa variável aproxima umEm outras aumenta muito quando o valor e pequeno e muito pouco quando o valor aproxima-se a um. +Vamos integrar numericamente algumas equações usando o pacote //deSolve// e a função //ode//.
- +
-$$ f(x)=f(x)* (1-f(x)) $$ +
- +
-<code> +
-'diff(f(t),t)=f(t)*(1-f(t)); +
-ode2(%,f(t),t); +
-</code> +
- +
-Talvez não reconheça essa função, faça exponenciação de ambos os lados que ela parecerá mais simpática. Ela é a solução do exemplo anterior multiplicada por uma expressão que funciona como um freio que aperta mais forte conforme chega perto de um. Elá é base dos modelos logísticos populacionais. +
- +
-====== Integração Numérica no R ======   +
-Vamos integrar numericamente algumas equações usando o pacote deSolve e a função //ode//.+
 Antes de tudo precisa instalar e carregar o pacote. Para instalar você pode usar o menu do RGui ou pela linha de comando, digite: Antes de tudo precisa instalar e carregar o pacote. Para instalar você pode usar o menu do RGui ou pela linha de comando, digite:
  
Linha 147: Linha 160:
   *1. Primeiro criamos a função, com os seguintes parâmetros na função R:   *1. Primeiro criamos a função, com os seguintes parâmetros na função R:
      * o tempo, que depois definiremos com uma sequência numérica      * o tempo, que depois definiremos com uma sequência numérica
-     * a situação inicial da variável indepente+     * a situação inicial da variável independente
      * os parâmetros da equação diferencial      * os parâmetros da equação diferencial
 <code> <code>
Linha 169: Linha 182:
   plot(res.fy1[,1], res.fy1[,2], type="l", col="red",lwd=2, xlab="tempo", ylab="y")   plot(res.fy1[,1], res.fy1[,2], type="l", col="red",lwd=2, xlab="tempo", ylab="y")
 </code>   </code>  
 +
 +Será que a função //ode// fez mágica? Ela apenas usa um método parecido com o de Euler, que vimos acima, para achar a solução numérica de uma ode.
 ===== Uma outra função simples ===== ===== Uma outra função simples =====
 Agora nossa equação é: Agora nossa equação é:
Linha 203: Linha 218:
  
   *1. $ \frac{dy}{dt} = y-y^2*f(t)$   *1. $ \frac{dy}{dt} = y-y^2*f(t)$
-    * sendo: $f(t)= + 0.sin(2\pi Mt)$;+    * sendo: $f(t)= 0.01 + 0.01 sin(2\pi Mt)$;
     * M=15     * M=15
   *2. $\frac{dn}{dt} = r(t)*n $    *2. $\frac{dn}{dt} = r(t)*n $ 
-    * sendo: $r(t)= 0 + 0.1 sin(2 \pi t)$+    * sendo: $r(t)= 0.1 - 100 sin(2 \pi t)$
  
-Uma solução:  
  
-<code> 
-### primeiro caso 
-fy3 <- function(time,y, parms) 
-  { 
-   n=y[1] 
-   M=parms[1] 
-   r=0.01+ 0.01*sin(2*pi* M *time) 
-   dy.dt=n-n^2 * r 
-   return(list(c(dy.dt)))  
-  }  
-y0 = 10 
-prmt=c(M=1) 
-st=seq(0.1,20,by=0.01) 
-res.fy3= ode(y=y0,times=st, func=fy3,parms=prmt) 
-plot(res.fy3[,1], res.fy3[,2], type="l", col="red",lwd=2, xlab="tempo", ylab="y") 
- 
-### segundo caso 
- 
-fy4 <- function(time,y, parms) 
-  { 
-   n=y[1] 
-   rt= 0.1-100*(sin(2*pi*time)) 
-   dy.dt=rt*n 
-   return(list(c(dy.dt)))  
-  }  
-y0 = c(.1) 
-#prmt=c(M=1) 
-st=seq(0.1,20,by=0.0001) 
-res.fy4= ode(y=y0,times=st, func=fy4) 
-plot(res.fy4[,1], res.fy4[,2], type="l", col="red",lwd=2, xlab="tempo", ylab="y") 
- 
-</code> 
exercicios/calc1.txt · Última modificação: 2024/01/09 18:18 por 127.0.0.1
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0