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
exercicios:calc1 [2012/05/11 02:53] – [Equação Diferencial Ordinária] shalomexercicios:calc1 [2024/01/09 18:18] (atual) – edição externa 127.0.0.1
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 duas funções diferenciais 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... +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.01, temos que:+Ou seja, sendo que $N(0)=20$, no tempo 0.1, temos que:
  
-  * $N_{t + 0.1} = 20 * 0.1 + 20 $  +  * $N_{t + 0.1} - N_t2N * 0.1$ 
-  * $ N(0.1) = 22 $+  * $N_{t + 0.1} = 2N_t*0.1 + N_t$ 
 +  * $N_{t + 0.1} = 40 * 0.1 + 20 $  
 +  * $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 101: 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çõa 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 145: 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 167: 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 201: 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.1336704834.txt.gz · Última modificação: 2024/01/09 18:17 (edição externa)
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