capítulo 1. introdução - página do câmpus de rio … capítulo 1. introdução 1.1. teoremas e...
TRANSCRIPT
6
Capítulo 1. Introdução 1.1. Teoremas e Comentários
Definição1.0.0 : Uma função f(x,y) satisfaz a condição de Lipschitz na variável y sobre o
conjunto D⊂ ℜ2, se existe uma constante L>0, tal que é válida a propriedade:
|f(t,y1) - f(t,y2)|≤ L | y1 -y2|
sempre (t,y1), (t,y2)∈ D. L é chamada constante de Lipschitz para f.
Lema1.0.1 : Sejam s e t numeros reais positivos e {ai } é uma seqüência
que satisfaz a0 >= -t/s e
ai+1 <=(1+s) ai + t para i =0,1,2, ..., k
então
ai+1 <= e (i+1)s (t/s + a0 ) - t/s
Usando o lema anteriormente citado vamos mostrar a prova do
teorema 1.0.2 que nos diz que:
Teorema 1.0.2 : Suponha que f é uma função contínua e satisfaz a condição
de Lipschitz com constante L no conjunto D = {(t,y) | a<= t <=b ,- ∞< y < ∞
} e que a constante M existe com a propriedade | y’’(t) | <= M para todo t ε
[a,b]
Consideramos também y(t) como uma única solução para o problema
de valor inicial
7
y’ = f(t,y) a<= t <=b , y(a) = α
Então
|y(ti) -wi | <= hM/2L [e L(ti - α) -1 ] para cada i =0,1,2,...,N
PROVA:
Quando i= 0 o resultado é claramente verdadeiro desde que y(t0) = w0 =
α
Utilizando a equação mais geral para o método de EULER ,
para i =0,1,2,...,N, temos:
y(ti+1)=y(ti) + hf(ti,y(ti)) + h2/2 *y’’(ξi). (1.0.3)
O truncando o termo de 2a. ordem (com isso introduz um “pequeno”
erro) e fazendo wi equivalente a y(ti) então a equação 1.0.3 fica
wo = α
wi+1 = wi + h f (ti , wi) (1.0.4 )
Usaremos a notação yi = y(ti) e yi+1 = y (ti+1) .Subtraindo (1.0.3 ) de
(1.0.4) e usando a notação nova temos:
yi+1 - wi+1 = yi - wi + h[f(ti, yi) - f(ti, wi )] + h2/2 *y’’(ξi).
Aplicando o módulo temos:
|yi+1 - wi+1 |= |yi - wi |+ h|f(ti, yi) - f(ti, wi )| + h2/2 *|y’’(ξi)|. (1.0.2)
Como a função satisfaz a condição de Lipschitz então
8
| f(t,y1) - f(t,y2)|<= L |y1 -y2| definição (1.0.0)
Usando a definição (1.0.0) em (1.0.2) e a propriedade | y’’(t) | <= M
temos :
|yi+1 - wi+1 |<= |yi - wi | + hL |yi - wi | + h2/2 *M
Pondo em evidência o termo sublinhado anteriormente temos:
|yi+1 - wi+1 |<= |yi - wi | (1 + hL) + (h2*M)/2
Fazendo analogias para aplicar o lema 1.0.1 temos:
ai+1 = |yi+1 - wi+1 | ; ai = |yi - wi | ; s =hL ; t = (h2*M)/2
Aplicando finalmente o lema dado temos
|yi+1 - wi+1 |<= e(i+1)hL (|y0 - w0 | + (h2*M)/(2hL)) - (h2*M)/(2hL)
Sendo |y0 - w0 | = 0 e (i+1 )h = ti+1 - t0 = t0 - α temos
|yi+1 - wi+1 |<= e(ti+1 -α)L *( (h2*M)/(2hL) ) - (h2*M)/(2hL)
Colocando em evidência o termo grifado temos :
|yi+1 - wi+1 |<= (h*M)/(2L) (e(ti+1 -α)L - 1) para cada i = 0,1,2,...,N c.q.d.
1.2. Breve comentário sobre o funcionamento do algoritmo de RK4 para sistemas
9
O algoritmo Range Kutta de quarta ordem para sistemas de equações diferenciais
de primeira ordem trabalha da mesma maneira que o Range Kutta tradicional de quarta
ordem , só com algumas alterações .
Em cada um dos algoritmos anteriormente citados (rk4 tradicional e rk4 para
sistemas )
existem condições iniciais comuns que o usuário deverá entrar como por exemplo:
• Os valores de a e b sendo que a diferença b-a representará o intervalo onde a variável
t irá variar.
• A variável N que dividirá o intervalo anteriormente citado em N partes iguais .
obs: O valor (b-a)/N nos dará o valor h.
Outras condições iniciais do rk4 para sistemas devem ser entradas, só que estas são
diferentes do rk4 tradiconal:
• Enquanto para o rk4 tradicional existe apenas uma equação diferencial,para o rk4 de
sistemas existem m equações.
• Enquanto para o rk4 tradicional existe apenas uma condição inicial , para o rk4 de
sistemas existem m condições iniciais.
Após esta fase de inicialização de variáveis, o algoritmo atribui wj =αj onde αj são as
condições iniciais e j varia de 1 até o número de equações diferenciais de primeira ordem
entradas.
Depois disso , o algoritmo entra num laço que percorre todo o intervalo b-a ,ou seja, a
variavel t comecará com o valor a e a cada passo será acrescida a ela o valor do passo h.
10
Dentro do laço anterior serão calculados os vários k1,k2,k3,k4 para cada equação
diferencial dada.Assim,cada equação terá seus próprios k’s em cada passo.
Uma importante observação é que para o cálculo de um ki+1 é necessário o valor do ki
anterior .
De posse dos valores de k’s de todas as equações a cada passo calcula-se os valores
de w’s.Assim, temos valores intermediários de w’s a cada passo.
O algoritmo tem sua parada determinada quando o valor de t chegar ao extremo
superior do intervalo ,ou seja, b .
1.3. Métodos de Passos Variáveis A técnica previsor-corretor sempre gera duas aproximações para cada passo,
então ela é a candidata natural para adaptação de controle de erros.
Para demonstrar o procedimento para controle de erro, foi construído um método
previsor-corretor com tamanho de passos variáveis.]
Este algoritmo, a princípio, resolve a equação utilizando o Runge Kutta de Quarta
ordem para que a partir de sua resposta, o algoritmo faça o refinamento do erro cometido.
A cada passo será calculado o valor previsto e o valor corrigido. O cálculo do
erro depende diretamente desses dois fatores. Se esse erro for muito grande, ou
seja,maior que a tolerância desejada, então é realizado mudanças em algumas variáveis
para que o erro no próximo passo reduza. A cada passo , a precisão tende a aumentar.
Com o cálculo do valor corrigido através do uso valor previsto, obtém-se um valor que
mais se aproxima da resposta.
11
A cada passo o RK4 é chamado, mas com uma diferença. Substitue um ponto em
relação a última chamada, sendo que este ponto é o calculado através do método
previsor-corretor, ou seja, a tendência é que o novo resultado do RK4 seja um pouco
mais satisfatório, e que o cálculo do erro dimunua. Este processo continua até que o erro
seja muito pequeno, ou seja, até que se consiga refiná-lo.
1.4. Estabilidade Um método estável é aquele que depende continuamente dos estados iniciais, ou
seja, são estáveis se quando pequenas mudanças nas aproximações subsequentes.
Definição 1: Um método de equação diferencial de um passo com erro local σi(h) no i-
ésimo passo é dito ser consistente com a equação diferencial se
Lim max | σi(h) | = 0 h->0 1<i<N Definição 2: Um método de equação diferencial de 1 passo é dito ser convergente com
a respectiva equação diferencial se
Lim max | ωi - y(ti) | = 0 h->0 1<i<N onde yi = y(ti) denota o valor exato da solução da equação diferencial e ωi è a
aproximação obtida do método de diferença no i-ésimo passo.
Teorema : Suponha o problema de de valor inicial y’ = f(t,y), a≤ t ≤ b , y(a)=α
12
é aproximado por um método de um passo da forma
W0 = α
Wi+1 = Wi + hφ(ti,Wi,h)
Suponha também que um número h0 > 0 existe φ(t,W,h) é contínu e satisfaz a
condição de Lipschitz* na variável com constante Lipschitz L sobre o conjunto D={
(t,W,h) | a≤ t ≤ b, -∝< W< ∝ , 0≤ h≤h0 }. Então
1) o método é estável;
2) o método é convergente, se e somente se é consistente; que é se e somente se
φ(t,W,h) = f(t,y), para todo a≤ t ≤ b;
3) se para cada i=1,2,3...N, o erro local σi(h) satisfaz |σi(h)| ≤ σ(h), sempre que 0≤ h≤h0
então
| y(ti) - ωi | ≤ ( σ(h)/L ) exp(L(ti - a))
1.5. Métodos de Múltiplos Passos Estes métodos, assim como a família Runge-Kutta, também são derivados a
partir de séries de Taylor.
O que caracteriza estes métodos é que eles usam informações sobre a solução em
mais de um ponto.
13
Supondo inicialmente conhecida as aproximações para y(x) em x0, x1, ... , xn e
que xi +1 - xi =h, queremos aproximar a solução da equação diferencial y’=f(x,y) de xn até
xn + 1
xn + 1 xn + 1 � y’ dx = � f(x,y(x)) dx xn xn integrando o 1a. membro, xn + 1 y(xn + 1) - y(xn) = � f(x,y(x)) dx xn O problema agora reside então em aproximar uma solução para a integral acima, para
encontrar uma solução aproximada. Antes de prosseguir a discussão é importante ter em
mente dois conceitos:
1.5.0 MÉTODO EXPLÍCITO: Os métodos desta classe são obtidos quando trabalhamos
com xn,xn-1,...,xn-m, ou seja o cálculo de yn + 1 tem forma explícita em função dos
outros (para calcular yn + 1, uso somente yn, yn-1, yn-2, yn-3, por exemplo se o método
escolhido for de 3 passos).
1.5.1 MÉTODO ÍMPLICITO: Nestes tipos de métodos na fórmula que calcula yn + 1,
deve-se entrar com o valor de yn + 1, ou seja a fórmula não é explícita, o que gera a
grande dificuldade destes destes métodos.
Para uma melhor compreensão destes métodos acompanhe alguns exemplos da família Adams de múltlipos passos, seguidos logo abaixo de um breve comentário, lembrando ao leitor que uma reflexão mais profunda sobre estes métodos é recomendada.
1.6. Métodos de Adams-Bashforth 1.6.0 Método de Adams-Bashforth de 2 passos (2a. ordem)
w0=α , w1= α1
14
wi+1 =wi + h/2[3f(ti,wi)-f(ti-1,wi-1)
1.6.1 Método de Adams-Bashforth de 3 passos (3a. ordem)
w0=α , w1= α1, w2= α2
wi+1 =wi + h/12[23f(ti,wi)-16f(ti-1,wi-1) +5 f(ti-2,wi-2)]
1.6.2 Método de Adams-Bashforth de 4 passos (4a. ordem)
w0=α , w1= α1, w2= α2 , w3= α3
wi+1 =wi + h/24[55f(ti,wi)-59f(ti-1,wi-1) +37f(ti-2,wi-2) - 9 f(ti-3,wi-3)]
1.6.3 Método de Adams-Bashforth de 5 passos (5a. ordem)
w0=α , w1= α1, w2= α2 , w3= α3 , w4= α4
wi+1 =wi + h/720[1901f(ti,wi)-2774f(ti-1,wi-1) +2616(ti-2,wi-2) - 1274 f(ti-3,wi-3)
+251 f(ti-4,wi-4)]
1.7 Métodos de Adams-Moulton 1.7.0Método de Adams-Moulton de 2 passos (2a. ordem)
w0=α , w1= α1
wi+1 =wi + h/12[5f(ti+1,wi+1)+ 8(ti,wi) -(ti-1,wi-1) ]
1.7.1 Método de Adams-Moulton de 3 passos (3a. ordem)
w0=α , w1= α1, w2= α2
wi+1 =wi + h/24[9f(ti+1,wi+1) + 19f(ti,wi) - 5 (ti-1,wi-1) + f(ti-2,wi-2)]
1.7.2 Método de Adams-Moulton de 4 passos (4a. ordem)
w0=α , w1= α1, w2= α2 , w3= α3
15
wi+1 =wi + h/720[251f(ti+1,wi+1) + 646f(ti,wi) - 264 (ti-1,wi-1) + 106f(ti-2,wi-2) - 19
f(ti-3,wi-3)]
1.8. Comentário Os métodos de Adams-B.são todos métodos explícitos e não auto-inicializáveis,
sendo preciso de alguma forma (usando R.K, por exemplo), calcular os m-primeiros wi’s,
quando se usa um método Adams-B de m-passos.Para calcular wj estes métodos usam os
valores anteriores de wj-1,wj-2,...,wo. Então o esforço computacional nestes tipos de
algoritmos se residem em apenas calcular o valor da função em cada ponto. Já os
métodos de Adams-M. se caracterizam por serem fechados (implícitos). A grande
dificuldade deste método é usar uma fórmula implícita , ou seja para calcular a
aproximação em um ponto, a fórmula empregada já usa este valor, o que torna o
problema computacionalmente inviável, pois não se consegue uma recurssividade. A
maneira encontrada para contornar este problema é por exemplo usar um método
explícito para auxiliar.
De maneira geral o módulo do erro para Adams-M. é menor que Adams-B. , mas
depende fundamentalmente se o problema estar bem condicionado e a escolha do melhor
método para aquele problema.
1.9. Métodos Previsor-Corretor Este método usa a fórmula explícita e implícita para aproximar uma solução. A
idéia primeira era usar a fórmula implícita para aproximar uma solução, mas isso esbarra
no problema acima mencionado, ou seja, para calcular yn + 1 uso o valor de xn + 1. Para
16
contornar esta situação obtém-se o valor de yn + 1, através de uma aproximação por um
método explícito (convenientemente escolhido). De posse desta aproximação posso
agora usar a fórmula impícita, substituindo nesta este valor e encontrando assim uma
nova aproximação muito melhor para yn + 1.
A forma explícita primeiramente usada é chamada de um previsor; e a forma
implícita é chamada de corretor. Daí o nome previsor-corretor.
Quando o previsor e o corretor usado são da mesma ordem e a escolha do h é
conveniente a precisão de algoritmo é muito boa.
O esforço computacional demandado é dobrado em relação aos métodos acima
apresentados , pois para calcular o valor duas vezes em em cada ponto: o primeiro
calculo estima o valor, o segundo corrige este valor.
1.10. Modelo para a dinâmica de populações (presa-predador) Um modelo muito simples é aquele em que o crescimento (ou decaimento) da
população é proporcional ao número de membros da mesma. Escrevendo na forma de
equação diferencial ordinária (edo):
dNdt
(t) = rN(t), N(0) = No
sendo: dN/dt a variação da população em relação ao tempo
No a população inicial
17
R a taxa de variação
Porém, este modelo está longe da realidade, pois sabemos que, após um certo
período de tempo, a população será tão grande que surgirão problemas (limitação de
alimentos, espaço etc).
Surgiu então a equação logística
dNdt
(t) = f(N) N(t), N(0) = No
na qual a taxa de variação depende da população e é dada por f(N). Vamos construir uma
função f(N) que tenha as propriedades desejadas:
a) a população cresce exponencialmente quando ela for pequena;
b) o crescimento desacelera conforme a população vai crescendo;
c) observamos mortalidade quando a população for muito grande. Matematicamente,
escrevemos isso como f(n) < 0 quando N >> 1.
Um modelo seria a função:
f(N) = r [1 - (N/M)]
sendo: M o ponto a partir do qual observamos a mortalidade de indivíduos
Um modelo um pouco mais complexo é dado a seguir:
dNdt
(t) = { -r [ 1 - (N/M1)] [ 1 - (N/M2)] } N(t), N(0) = No
18
Finalmente, estudaremos um modelo no qual duas populações competem para
sobreviver. Sejam N1(t) e N2(t) a população de presas e predadores, respectivamente.
Suporemos que as presas tem um suprimento abundante de alimento, enquanto que o
predador alimenta-se das presas. Vamos também assumir que um biólogo nos forneceu as
seguintes hipóteses(todas as constantes ki, i = 1, 2, 3, 4 dadas abaixo são positivas):
1.10.0 PRESA: Taxa de natalidade: proporcional à população naquele instante: k1N1(t) Taxa de mortalidade: depende da população das presas assim como dos predadores. Por simplicidade, adotaremos a expressão: -k2N1(t)N2(t) • PREDADOR: Taxa de natalidade: proporcional à população de predadores assim como a das presas:
k3N1(t)N2(t)
Taxa de mortalidade: proporcional à população de predadores: -k4N2(t)
Colocando essas informações na forma de edo’s, temos o sistema
dNdt
1 = k1N1 - k2N1N2
dNdt
2 = k3N1N2 - k4N2
com N1(0) = N10 e N2(0) = N2
0.
1.11. Exercícios e Programas
• Exercício 4.1 da apostila “Curso Métodos Numéricos - Notas de Aula”
19
• Programa desenvolvido em Borland C++ para a solução deste problema, sendo que o
programa abaixo é genérico possuindo a opção de resolução através dos métodos de Euler
(Runge-Kutta 1a. ordem), Rungr-Kutta 2a. ordem e Runge-Kutta de 4a. ordem
/* Programa para a resolucao de equacoes diferenciais,
atraves dos metodos :
- Runge-Kutta 1a. ordem (Euler)
- Runge-Kutta 2a. ordem
- Runge-Kutta 4a. ordem
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<math.h>
int a,b,n,i;
float h,t0,t[11],w1[11],w4[11],w2[11],ya,g1,g2,k1,k2,k3,k4;
char opc;
FILE *runge1,*runge2,*runge4;
float function(float x,float y)
{
return(x-y+2);
}
void main(void)
20
{
clrscr();
printf("Escolha o metodo que deseja usar : \n");
printf("1->para Runge-Kutta1;2->para Runge-Kutta2;3->para Runge-Kutta4\n");
scanf("%s",&opc);
printf("\nEntre com o numero de iteracoes : ");
scanf("%i",&n);
printf("\nEntre com o valor inicial y(0) : ");
scanf("%f",&w1[0]);
printf("\nEntre com o inicio do intervalo : ");
scanf("%i",&a);
printf("\nEntre com o final do intervalo : ");
scanf("%i",&b);
printf("\nEntre com o passo de integracao : ");
scanf("%f",&h);
w2[0] = w1[0];
w4[0] = w1[0];
switch (opc)
{
case '1':{
runge1=fopen("rk1.dat","wt");
t[0]=a;
fprintf(runge1,"%2.4f,%2.4f\n",t[0],w1[0]);
21
for (i=1;i<=n;i++)
{
w1[i]=w1[i-1]+h*function(i-1,w1[i-1]);
t[i]=t[i-1]+h;
fprintf(runge1,"%2.4f,%2.4f\n",t[i],w1[i]);
}
fclose(runge1);
for(i=0;i<=n;i++)
printf("%2.4f\n",w1[i]);
break;
}
case '2':{
runge2=fopen("rk2.dat","wt");
t[0]=a;
fprintf(runge2,"%2.4f,%2.4f\n",t[0],w2[0]);
for (i=1;i<=n;i++)
{
g1=h*function(i-1,w2[i-1]);
g2=h*function(w2[i-1]+g1,w2[i-1]);
w2[i]=w2[i-1]+0.5*(g1+g2);
t[i]=t[i-1]+h;
fprintf(runge2,"%2.4f,%2.4f\n",t[i],w2[i]);
22
}
fclose(runge2);
for(i=0;i<=n;i++)
printf("%2.4f\n",w2[i]);
break;
}
case '3':{ //open1
runge4=fopen("rk4.dat","wt");
t[0]=a;
fprintf(runge4,"%2.4f,%2.4f\n",t[0],w4[0]);
for(i=1;i<=n;i++)
{ //open2
k1=h*function(i-1,w4[i-1]);
k2=h*function(w4[i-1]+k1/2,w4[i-1]);
k3=h*function(w4[i-1]+k2/2,w4[i-1]);
k4=h*function(w4[i-1]+k3,w4[i-1]);
w4[i]=w4[i-1]+(k1+2*k2+2*k3+k4)/6;
t[i]=t[i-1]+h;
fprintf(runge4,"%2.4f,%2.4f\n",t[i],w4[i]);
printf("%2.4f\n",w4[i]);
}
fclose(runge4);
23
} //close1
}
}
• Gráfico de saída do programa em Borland C++ para h = 0.1 e Método Runge-Kutta 1a.
Ordem (Euler) (plotado no GRAPHER)
1.800
1.900
2.000
2.100
2.200
2.300
2.400
• Gráfico de saída do programa em Borland C++ para h = 0.01 e Método Runge-
Kutta 1a. Ordem (Euler) (plotado no GRAPHER)
24
1.800
1.900
2.000
2.100
2.200
2.300
2.400
• Gráfico de saída do programa em Borland C++ para h = 0.001 e Método Runge-Kutta 1a. Ordem (Euler) (plotado no GRAPHER)
1.800
1.900
2.000
2.100
2.200
2.300
2.400
• Gráfico de saída do programa em Borland C++ para h = 0.1 e Método Runge- Kutta 2a. Ordem (plotado no GRAPHER)
25
1.800
1.900
2.000
2.100
2.200
2.300
2.400
• Gráfico de saída do programa em Borland C++ para h = 0.01 e Método Runge-Kutta 2a. Ordem (plotado no GRAPHER)
1.800
1.900
2.000
2.100
2.200
2.300
2.400
• Gráfico de saída do programa em Borland C++ para h = 0.001 e Método Runge-Kutta 2a. Ordem (plotado no GRAPHER)
26
1.800
1.900
2.000
2.100
2.200
2.300
2.400
• Gráfico de saída do programa em Borland C++ para h = 0.1 e Método Runge-
Kutta 4a. Ordem (plotado no GRAPHER)
1.800
1.900
2.000
2.100
2.200
2.300
2.400
• Gráfico de saída do programa em Borland C++ para h = 0.01 e Método Runge- Kutta 4a. Ordem (plotado no GRAPHER)
27
1.800
1.900
2.000
2.100
2.200
2.300
2.400
• Gráfico de saída do programa em Borland C++ para h = 0.001 e Método Runge-Kutta 4a. Ordem (plotado no GRAPHER)
1.800
1.900
2.000
2.100
2.200
2.300
2.400
• Esquema SIMULINK para a solução da equação diferencial
28
+-+
Somatorio das variaveis
2Constante
ySaida para y1/s
Integracao paraobter y
xSaida para x
Grafico de X/Y
[T,U]
Matriz contendoos valores de x
Gr
Gráfico de saída do esquema SIMULINK para h=0.1.
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
1.5
1.6
1.7
1.8
1.9
2
2.1
2.2
2.3
2.4
2.5
X Axis
Y A
xis
X Y Plot
• Gráfico de saída do esquema SIMULINK para h = 0.01
29
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
1.5
1.6
1.7
1.8
1.9
2
2.1
2.2
2.3
2.4
2.5
X Axis
Y A
xis
X Y Plot
• Gráfico de saída do esquema SIMULINK para h = 0.001
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 11.5
1.6
1.7
1.8
1.9
2
2.1
2.2
2.3
2.4
2.5
X Axis
Y A
xis
X Y Plot
• Exercício 4.2 da apostila “Curso Métodos Numéricos - Notas de Aula”
• Programa desenvolvido em Borland C++ para a solução deste problema
/* Exercicio 2 : RK4
Linguagem : Borland C++ */
30
#include<iostream.h>
#include<stdio.h>
#include<math.h>
#include<conio.h>
double f1(double,double,double);
double f2(double,double,double);
//double f3(double,double,double);
float x0,y0,xn,n,x,h;
int i,j;
float y[3];
float k[4][3];
float w[4]; //valores inicias das equa‡äes diferenciais
int t;
void main()
{
clrscr();
FILE *arq1,*arq2,*arq3;
printf("Entre com o valor de x(0)=a : ");
scanf("%f",&x0);
printf("Entre com o valor de y1(0) : ");
31
scanf("%f",&w[1]);
printf("Entre com o valor de y2(0) : ");
scanf("%f",&w[2]);
printf("Entre com o valor de y3(0) : ");
scanf("%f",&w[3]);
printf("Entre com o valor de x(n)=b : ");
scanf("%f",&xn);
printf("Entre com o valor de n : ");
scanf("%f",&n);
h=(xn-x0)/n;
x=x0;
//double n = 0;
arq1= fopen("V'xt.DAT","wt");
arq2= fopen("Vxt.DAT","wt");
arq3= fopen("VxV'.DAT","wt");
for (i=0;i<n;i++)
{
// 1§ for
k[1][1] =h*f1(x,w[1],w[2]);
k[1][2] =h*f2(x,w[1],w[2]);
// k[1][3] =h*f3(x,w[1],w[2],w[3]);
// 2§ for
32
k[2][1] =h*f1(x+h/2,w[1]+k[1][1]/2,w[2]+k[1][2]/2);
k[2][2] =h*f2(x+h/2,w[1]+k[1][1]/2,w[2]+k[1][2]/2);
// k[2][3]
=h*f3(x+h/2,w[1]+k[1][1]/2,w[2]+k[1][2]/2,w[3]+k[1][3]/2);
// 3§ for
k[3][1] =h*f1(x+h/2,w[1]+k[2][1]/2,w[2]+k[2][2]/2);
k[3][2] =h*f2(x+h/2,w[1]+k[2][1]/2,w[2]+k[2][2]/2);
// k[3][3]
=h*f3(x+h/2,w[1]+k[2][1]/2,w[2]+k[2][2]/2,w[3]+k[2][3]/2);
// 4§ for
k[4][1] =h*f1(x+h/2,w[1]+k[3][1]/2,w[2]+k[3][2]/2);
k[4][2] =h*f2(x+h/2,w[1]+k[3][1]/2,w[2]+k[3][2]/2);
// k[4][3]
=h*f3(x+h/2,w[1]+k[3][1]/2,w[2]+k[3][2]/2,w[3]+k[3][3]/2);
// 5§ for
w[1]=w[1] + (k[1][1] +2*k[2][1] +2*k[3][1] +k[4][1])/6;
w[2]=w[2] + (k[1][2] +2*k[2][2] +2*k[3][2] +k[4][2])/6;
// w[3]=w[3] + (k[1][3] +2*k[2][3] +2*k[3][3] +k[4][3])/6;
x=x0 +i*h;
printf("\nValores de x,w[1],w[2]:
:%3.3f,%3.3f,%3.3f",x,w[1],w[2]);
fprintf(arq1,"%3.3f,%3.3f\n",x,w[1]);
fprintf(arq2,"%3.3f,%3.3f\n",x,w[2]);
33
fprintf(arq3,"%3.3f,%3.3f\n",w[1],w[2]);
}
getch();
fclose(arq1);
fclose(arq2);
fclose(arq3);
}
double f1(double x,double y1,double y2)
{
return(y2);
}
double f2(double x,double y1,double y2)
{
return(((-1/3)*y1-4*y2)/5);
}
/*double f1(double x,double y1,double y2)
{
return(((-1/3)*y1-4*y2)/5);
}*/
• Gráfico de saída do programa em Borland C++ para h = 0.001 (plotado no
GRAPHER)
34
Gráfico da Aceleração
0 50 100 150 200-0.5
0
0.5
Gráfico da Velocidade
0 50 100 150 200-1.5
-1
-0.5
0
0.5
1
1.5
2
Gráfico da Velocidade x Aceleração
35
-2 -1 0 1 2-2
-1
0
1
2
3
Esquema SIMULINK para a solução da equação diferencial
---
Sum
[T,U]
FromWorkspace
1/sIntegrator
0.
Gain
1/sIntegrator1
4
Gain2
0.
Gain1
V x V`
du/dtDerivative
velocidade
f(u)Fcn
Aceleracao1
Gráficos de saída do esquema SIMULINK para h = 0.001 Gráfico da Aceleração
36
0 50 100 150 200-0.5
0
0.5
Time (second) Gráfico daVelocidade
0 50 100 150 200
-1.5
-1
-0.5
0
0.5
1
1.5
2
Time (second) Gráfico da Velocidade x Aceleração
37
-2 -1 0 1 2-2
-1
0
1
2
3
X Axis
Y A
xis
X Y Plot
• Exercício 4.3 da apostila “Curso Métodos Numéricos - Notas de Aula”
Programa desenvolvido em Borland C++ para a solução deste problema.
/* Exercicio 3 : RK4
Linguagem : Borland C++ */
#include<iostream.h>
#include<stdio.h>
#include<math.h>
#include<conio.h>
double f1(double,double,double,double);
double f2(double,double,double,double);
//double f3(double,double,double,double);
float x0,y0,xn,n,x,h;
int i,j;
38
float y[3];
float k[4][3];
float w[4]; //valores inicias das equa‡äes diferenciais
int t;
void main()
{
clrscr();
FILE *arq1,*arq2,*arq3;
printf("Entre com o valor de x(0)=a : ");
scanf("%f",&x0);
printf("Entre com o valor de y1(0) : ");
scanf("%f",&w[1]);
printf("Entre com o valor de y2(0) : ");
scanf("%f",&w[2]);
printf("Entre com o valor de y3(0) : ");
scanf("%f",&w[3]);
printf("Entre com o valor de x(n)=b : ");
scanf("%f",&xn);
printf("Entre com o valor de n : ");
scanf("%f",&n);
h=(xn-x0)/n;
x=x0;
//double n = 0;
39
arq= fopen("DADOS."wt");
for (i=0;i<n;i++)
{
// 1§ for
k[1][1] =h*f1(x,w[1],w[2]);
k[1][2] =h*f2(x,w[1],w[2]);
k[1][3] =h*f3(x,w[1],w[2],w[3]);
// 2§ for
k[2][1] =h*f1(x+h/2,w[1]+k[1][1]/2,w[2]+k[1][2]/2);
k[2][2] =h*f2(x+h/2,w[1]+k[1][1]/2,w[2]+k[1][2]/2);
k[2][3]=h*f3(x+h/2,w[1]+k[1][1]/2,w[2]+k[1][2]/2,w[3]+k[1][3]/2);
// 3§ for
k[3][1] =h*f1(x+h/2,w[1]+k[2][1]/2,w[2]+k[2][2]/2);
k[3][2] =h*f2(x+h/2,w[1]+k[2][1]/2,w[2]+k[2][2]/2);
k[3][3]=h*f3(x+h/2,w[1]+k[2][1]/2,w[2]+k[2][2]/2,w[3]+k[2][3]/2);
// 4§ for
k[4][1] =h*f1(x+h/2,w[1]+k[3][1]/2,w[2]+k[3][2]/2);
k[4][2] =h*f2(x+h/2,w[1]+k[3][1]/2,w[2]+k[3][2]/2);
k[4][3] =h*f3(x+h/2,w[1]+k[3][1]/2,w[2]+k[3][2]/2,w[3]+k[3][3]/2);
// 5§ for
w[1]=w[1] + (k[1][1] +2*k[2][1] +2*k[3][1] +k[4][1])/6;
w[2]=w[2] + (k[1][2] +2*k[2][2] +2*k[3][2] +k[4][2])/6;
40
// w[3]=w[3] + (k[1][3] +2*k[2][3] +2*k[3][3] +k[4][3])/6;
x=x0 +i*h;
printf("\nValores de x,w[1],w[2]:
:%3.3f,%3.3f,%3.3f",x,w[1],w[2]);
fprintf(arq1,"%3.3f,%3.3f,%3.3f ,%3.3f \n",x,w[1],w[2],w[3]);
}
getch();
fclose(arq);
}
double f1(double x,double y1,double y2,double y3)
{
return(y2);
}
double f2(double x,double y1,double y2,double y3)
{
return(y3);
}
/*double f1(double x,double y1,double y2,double y3)
{
return(y2-y1*y1-2*y1-x);
}*/
41
• Gráfico de saída do programa em Borland C++ para h = 0.001 (onde a 1a., 2a. e
3a. curvas, rferem-se à y1[t], y2[t] e y3[t] respectivamente) . (plotado no
GRAPHER)
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 20
0.5
1
1.5
2
2.5
3
3.5
4
4.5
5
• Esquema SIMULINK para a solução da equação diferencial
[T,U]
FromWorkspace
++++
Sum
2
Gain
1/sIntegrator1
1/sIntegrator
1/sIntegrator2
*
Product
Mux Mux
Graph
• Gráficos de saída do esquema SIMULINK para h = 0.001 (onde a 1a., 2a. e 3a. curvas, rferem-se à y1[t], y2[t] e y3[t] respectivamente).
42
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 20
0.5
1
1.5
2
2.5
3
3.5
4
4.5
5
Time (second)
• Exercício 1.a do Conjunto 5.1 da apostila “Initial-Value Problems for Ordinary Differential Equations”
• Esquema SIMULINK para a solução da equação diferencial
1/sIntegrator
[T,U]
FromWorkspace
cos(u)Fcn
*
Product
Graph
youtTo Workspace
• Gráfico de saída dp esquema SIMULINK para h=0.001.
43
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 10
0.5
1
1.5
2
2.5
3
3.5
4
4.5
5
Time (second)
• Exercício 1.b do Conjunto 5.1 da apostila “Initial-Value Problems for Ordinary Differential Equations”
• Esquema SIMULINK para a solução da equação diferencial
1/sy
[T,U]
FromWorkspace exp(u)
funcao exponencial
*
Product22/u
funcao auxiliar++
Sum
Graph
*
Product1
u*ufuncao aux1
• Gráfico de saída dp esquema SIMULINK para h=0.001
44
1 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8 3-5
-4
-3
-2
-1
0
1
2
3
4
5
Time (second)
• Exercício 1.d do Conjunto 5.1 da apostila “Initial-Value Problems for Ordinary Differential Equations” • Esquema SIMULINK para a solução da equação diferencial.
[T,U]
FromWorkspace
1/sIntegrator
4Constant
f(u)Fcn
*
Product*
Product1
Graph
• Gráfico de saída de esquema SIMULINK para h=0.001
45
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1-5
-4
-3
-2
-1
0
1
2
3
4
5
Time (second) • Exercício 1.d do Conjunto 5.2 da apostila “Initial-Value Problems for Ordinary Differential Equations” Esquema SIMULINK para a solução da equação diferencial
f(u)sen(3*u)
f(u)cos(2*u)
[T,U]
FromWorkspace
++
Sum1/s
Integrator1Graph
• Gráfico de saída de esquema SIMULINK para h=0.25.
46
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 10
0.5
1
1.5
2
2.5
3
Time (second)
• Exercício 5 do Conjunto 5.2 da apostila “Initial-Value Problems for Ordinary Differential Equations”
• Esquema SIMULINK para a solução da equação diferencial
2/u2/u
f(u)exp(u)*(u*u)
[T,U]
FromWorkspace
*
Product++
Sum1/s
Integrator1Graph
• Gráfico de saída de esquema SIMULINK para h=0.1
47
1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 20
2
4
6
8
10
12
14
16
18
20
Time (second)
Através do Método de Euler com um passo de 0.1, a solução obtida possui
um desvio de 21% de erro, sendo que o método do Runge-Kutta de 4a. Ordem é
superior na obtenção de soluções.
Item a) A solução apresentada para o método de Euler foi 15.3982,
enquanto que a solução real é 18.6831.
Item b) Com a solução para esses valores (y(1.04), y(1.55) e y(1.97)),
podemos observar que para valores pequenos, perto do inicial, a aproximação é
muito boa, enquanto que para valores próximos ao limite superior do intervalo, as
soluções são discrepantes. Vê-se que o erro introduzido cresce numa escala
exponencial.
Item c) Com o uso da fórmula abaixo
hm
| y(ti) - wi| <= [eL(ti-a) - 1] 2L
chegou a um valor para que o erro seja mínimo, tal que h = 0.001
48
• Programas, em Matlab, para o modelo presa-predador
%========================================
% programa runpop.m
% Programa para executar e plotar os
% resultados do problema predador-presa
% =======================================
%
% leitura dos dados iniciais para um sistema de edo 2x2
global k1 k2 k3 k4
initial(1)=input('Digite a populacao inicial da presa : ');
initial(2)=input('Digite a populacao inicial do predador : ');
% intervalo de tempo usado [ti,tf]
ti = input('Tempo inicial : ');
tf = input('Tempo final : ');
% constantes referentes a presa e ao predador
k1 = 3
k2 = 0.002
k3 = 0.0006
k4 = 0.5
% ode23 = rotina do MATLAB para resolucao de edo's
[x, num_y] = ode23('pop',ti,tf,initial);
49
subplot(211);
plot(x,num_y(:,1));
title('Populacao da Presa')
xlabel('x');
grid;
subplot(212);
plot(x,num_y(:,2));
title('Populacao do Predador'),xlabel('x');
grid;
%========================================
% programa pop.m
% campo vetorial para o
% problema predador-presa
% =======================================
%
function xf = pop(t,x)
global k1 k2 k3 k4
xf(1) = k1*x(1)-k2*x(1)*x(2);
xf(2) = k3*x(1)*x(2)-k4*x(2);
50
0 1 2 3 4 5 6 7 8 9 100
1
2
3
4x 10
4 Populacao da Presa
x
0 1 2 3 4 5 6 7 8 9 100
5000
10000
15000Populacao do Predador
x
• Modelo para calcular a trajetória de uma bola de tênis com “topspin”:
A bola tem massa m, diâmetro d, mas é representada por um ponto. As forças
consideradas são: o peso G, a resistencia do ar D e a força de Magnus M que reflete o
efeito do “topspin”. Essas forças são dadas por:
G = mg, sendo g = (0, 0, -g) e g é a aceleração da gravidade
D = - DL(v) t
sendo v o valor absoluto da velocidade
t o vetor unitário tangente à trajetória
DL(v) = CD12
(π d2/4) ρv2
sendo ρ a densidade do ar
CD a constante empírica
CD = 0,508 [ 1 / (22,053 + 4,196(v/w)5/2)]2/5
w representa a velocidade angular da bola (dada pelo “topspin”).
51
M = - ML(v) n
n é o vetor unitário normal à trajetória e
ML(v) = CM 12
(π d2/4) ρv2
A constante empírica é dada por
CM = 1/ [2,022 + 0,981 (v/w) ]
A dinâmica é governada pelo uso da Lei de Newton em cada uma das direções (x
e z). Isto nos leva a um sistema de duas edo’s de segunda ordem, em que cada uma indica
que força é igual a massa vezes aceleração. Reescrevendo as equações como um sistema
de edo’s de primeira ordem, obtemos:
dxdt
= vx
dvdt
x = - CD α v vx + η CM α v vZ
dzdt
= vz
dvdt
z = -g - CD α v vx + η CM α v vZ
tendo como condições iniciais
x(0) = 0
vx(0) = v0 cos(θ)
z(0) = h
vx(0) = v0 sen(θ)
Adotaremos a seguinte notação para manter as equações em forma compacta:
v = (vx, vz) = (dx/dt, dz/dt)
52
α = ρ π d2 / 8 m
v = v vx z² ²+
η = ± 1
+1 => “topspin” e -1 => sentido contrário
h é a altura da bola na hora da raquetada e θ o ângulo do início da trajetória dela.
• Programas, em Matlab, para o modelo bola de tênis com “topspin”
%==================================================
% Problema para a trajetoria de uma bola de tenis viajando no vacuo,
% no ar e no ar na presenca de um spin (rotacao)
%==================================================
% tenisV = caso no vacuo
% Temos 4 funcoes: tenisA = caso no ar sem spin
% tenisAsp = caso no ar com rotacao positiva
% tenisAfs = caso no ar com rotacao negativa
% Variaveis que serao usadas pelas funcoes com os campos vetoriais
global g alpha w etha
% inicializacao
% Constantes basicas em unidades MKS
clg
g=9.81; d=0.063; m=0.05; rho=1.29;
alpha=pi*d^2/(8*m)*rho;
etha=1;
53
w=20;
%condicoes iniciais
h=1; v0=25; theta=pi/180*15;
xin=[0,h,v0*cos(theta), v0*sin(theta)];
%tempo de voo no vacuo
tmaxid=(xin(4)+sqrt(xin(4)^2 + 2*g*xin(2)))/g;
% solucao no vacuo
[tV, xV]=ode23('tenisV',0,tmaxid,xin);
%solucao no ar sem spin
[tA, xA]=ode23('tenisA',0,tmaxid,xin);
%solucao com spin
[tAsp, xAsp]=ode23('tenisAsp',0,tmaxid,xin);
%Preparando a saida grafica do problema
N = max(xV(:,1)); x = 0:N/100:N;
axis([0,max(xV(:,1)),0,max(xV(:,2))])
hold % comando que permite superpor os tres graficos (plots) seguintes
% esses tres comandos abaixo nao funcionam na versao do estudante
% e por isso foram "comentados"
%1 plot(x,spline(xV(:,1), xV(:,2),x),':g');
%2 plot(x,spline(xA(:,1), xA(:,2), x),'--g');
%3 plot(x,spline(xAsp(:,1),xAsp(:,2),x),'-w');
plot(xV(:,1), xV(:,2), ':g');
plot(xA(:,1), xA(:,2), '-- g');
54
plot(xAsp(:,1), xAsp(:,2), '-w');
%============================================
% Arquivo: tenisA.m
%
% calcula o campo vetorial para a bola no AR sem rotacao
%============================================
function xdot = tenisA(t,x)
%sem spin a constante de Magnus CM e ZERO.
global g alpha
v = sqrt(x(3)^2+x(4)^2);
xdot(1) = x(3);
xdot(2) = x(4);
xdot(3) = -alpha*0.508*x(3)*v;
xdot(4) = -g -alpha*0.508*x(4)*v;
%===========================================
% Arquivo a ser guardado com o nome de tenisAsp.m
%
% Calcula o campo vetorial para a bola no AR com rotacao
%============================================
55
function xdot = tenisAsp(t,x)
global g alpha w etha
v = sqrt(x(3)^2+x(4)^2);
% calculo do campo levando em conta as constantes de arraste CD
% e a de Magnus CM
aux1 = (0.508+1/(22.503+4.196*(v/w)^0.4))*alpha*v;
aux2 = etha*w/(2.022*w+0.981*v)*alpha*v;
xdot(1) = x(3);
xdot(2) = x(4);
xdot(3) = -aux1*x(3) + aux2*x(4);
xdot(4) = -g -aux1*x(4) - aux2*x(3);
%===================================================
% Arquivo : tenisV.m
%
% calcula o campo vetorial para a bola no VACUO
%===================================================
function xdot = tenisV(t,x)
global g
xdot(1) = x(3);
xdot(2) = x(4);
xdot(3) = 0;
xdot(4) = -g;