Aqui você vê as diferenças entre duas revisões dessa página.
| Ambos lados da revisão anteriorRevisão anteriorPróxima revisão | Revisão anterior | ||
| exercicios:calc1 [2012/05/11 02:53] – [Equação Diferencial Ordinária] shalom | exercicios:calc1 [2024/01/09 18:18] (atual) – edição externa 127.0.0.1 | ||
|---|---|---|---|
| Linha 49: | Linha 49: | ||
| plot2d(10*exp(0.2*t), | plot2d(10*exp(0.2*t), | ||
| + | |||
| + | ===== Outra função simples ===== | ||
| + | {{: | ||
| + | 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)) $$ | ||
| + | |||
| + | < | ||
| + | ' | ||
| + | ode2(%, | ||
| + | </ | ||
| + | |||
| + | 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 | + | Essas primeiras equações diferencial |
| - | O processo básico é bem simples, muito parecido com o que fizemos para resolver as derivadas, mas tem muitas técnicas | + | O processo básico é bem simples, muito parecido com o que fizemos para resolver as derivadas, mas existem |
| ===== Método de Euler ===== | ===== Método de Euler ===== | ||
| Linha 68: | Linha 82: | ||
| Podemos usar um intervalo de tempo arbitrário, | Podemos usar um intervalo de tempo arbitrário, | ||
| - | * $\frac{N_{t + 0.1} - N_t}{0.1}= 2N$ | + | * $\frac{N_{t + 0.1} - N_t}{0.1}\approx |
| - | 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_t= 2N * 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 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, | ||
| + | Podemos repetir isso para os próximos intervalos de tempo no {{: | ||
| < | < | ||
| - | # 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, | N <- N + f(N, | ||
| 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), | + | plot(x, 20*exp(2*x), |
| # Vamos comparar com a solucao numerica | # Vamos comparar com a solucao numerica | ||
| - | points(x, numerica, col=' | + | points(x, numerica, col=' |
| </ | </ | ||
| - | 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 o procedimento anterior para fazer a integração numérica no {{: | |
| - | Vamos pensar em outro caso, onde a taxa de variação instantânea é positiva e tende a zero quando | + | Vamos integrar numericamente algumas equações usando o pacote |
| - | + | ||
| - | $$ f(x)=f(x)* (1-f(x)) $$ | + | |
| - | + | ||
| - | < | + | |
| - | ' | + | |
| - | ode2(%, | + | |
| - | </ | + | |
| - | + | ||
| - | Talvez não reconheça essa função, faça exponenciação de ambos os lados que ela parecerá | + | |
| - | + | ||
| - | ====== 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 | + | * a situação inicial da variável |
| * os parâmetros da equação diferencial | * os parâmetros da equação diferencial | ||
| < | < | ||
| Linha 167: | Linha 182: | ||
| plot(res.fy1[, | plot(res.fy1[, | ||
| </ | </ | ||
| + | |||
| + | 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)= | + | * sendo: $f(t)= |
| * M=15 | * M=15 | ||
| *2. $\frac{dn}{dt} = r(t)*n $ | *2. $\frac{dn}{dt} = r(t)*n $ | ||
| - | * sendo: $r(t)= | + | * sendo: $r(t)= 0.1 - 100 sin(2 \pi t)$ |
| - | Uma solução: | ||
| - | < | ||
| - | ### primeiro caso | ||
| - | fy3 <- function(time, | ||
| - | { | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | } | ||
| - | y0 = 10 | ||
| - | prmt=c(M=1) | ||
| - | st=seq(0.1, | ||
| - | res.fy3= ode(y=y0, | ||
| - | plot(res.fy3[, | ||
| - | |||
| - | ### segundo caso | ||
| - | |||
| - | fy4 <- function(time, | ||
| - | { | ||
| - | | ||
| - | rt= 0.1-100*(sin(2*pi*time)) | ||
| - | | ||
| - | | ||
| - | } | ||
| - | y0 = c(.1) | ||
| - | # | ||
| - | st=seq(0.1, | ||
| - | res.fy4= ode(y=y0, | ||
| - | plot(res.fy4[, | ||
| - | |||
| - | </ | ||