Escolar Documentos
Profissional Documentos
Cultura Documentos
Introduo
1.1. Teoremas e Comentrios
Definio1.0.0 : Uma funo f(x,y) satisfaz a condio de Lipschitz na varivel y sobre o
conjunto D 2, se existe uma constante L>0, tal que vlida a propriedade:
|f(t,y1) - f(t,y2)| L | y1 -y2|
sempre (t,y1), (t,y2) D. L chamada constante de Lipschitz para f.
ento
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 funo contnua e satisfaz a condio
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 tambm y(t) como uma nica soluo para o problema
de valor inicial
(1.0.3)
(1.0.4 )
t ir variar.
A varivel N que dividir o intervalo anteriormente citado em N partes iguais .
Dentro do lao anterior sero calculados os vrios k1,k2,k3,k4 para cada equao
diferencial dada.Assim,cada equao ter seus prprios ks em cada passo.
Uma importante observao que para o clculo de um ki+1 necessrio o valor do ki
anterior .
De posse dos valores de ks de todas as equaes a cada passo calcula-se os valores
de ws.Assim, temos valores intermedirios de ws a cada passo.
O algoritmo tem sua parada determinada quando o valor de t chegar ao extremo
superior do intervalo ,ou seja, b .
10
A cada passo o RK4 chamado, mas com uma diferena. Substitue um ponto em
relao a ltima chamada, sendo que este ponto o calculado atravs do mtodo
previsor-corretor, ou seja, a tendncia que o novo resultado do RK4 seja um pouco
mais satisfatrio, e que o clculo 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 mtodo estvel aquele que depende continuamente dos estados iniciais, ou
seja, so estveis se quando pequenas mudanas nas aproximaes subsequentes.
Definio 1: Um mtodo de equao diferencial de um passo com erro local i(h) no isimo passo dito ser consistente com a equao diferencial se
11
Wi+1 = Wi + h(ti,Wi,h)
Suponha tambm que um nmero h0 > 0 existe (t,W,h) contnu e satisfaz a
condio de Lipschitz* na varivel com constante Lipschitz L sobre o conjunto D={
(t,W,h) | a t b, -< W< , 0 hh0 }. Ento
1)
o mtodo estvel;
2)
3)
se para cada i=1,2,3...N, o erro local i(h) satisfaz |i(h)| (h), sempre que 0 hh0
ento
| y(ti) - i | ( (h)/L ) exp(L(ti - a))
12
xn + 1
f(x,y(x)) dx
xn
O problema agora reside ento em aproximar uma soluo para a integral acima, para
encontrar uma soluo aproximada. Antes de prosseguir a discusso importante ter em
mente dois conceitos:
+ 1
outros (para calcular yn + 1, uso somente yn, yn-1, yn-2, yn-3, por exemplo se o mtodo
escolhido for de 3 passos).
w1= 1
13
w1= 1, w2= 2
w1= 1
w1= 1, w2= 2
14
1.8. Comentrio
Os mtodos de Adams-B.so todos mtodos explcitos e no auto-inicializveis,
sendo preciso de alguma forma (usando R.K, por exemplo), calcular os m-primeiros wis,
quando se usa um mtodo Adams-B de m-passos.Para calcular wj estes mtodos usam os
valores anteriores de wj-1,wj-2,...,wo. Ento o esforo computacional nestes tipos de
algoritmos se residem em apenas calcular o valor da funo em cada ponto. J os
mtodos de Adams-M. se caracterizam por serem fechados (implcitos). A grande
dificuldade deste mtodo usar uma frmula implcita , ou seja para calcular a
aproximao em um ponto, a frmula empregada j usa este valor, o que torna o
problema computacionalmente invivel, pois no se consegue uma recurssividade. A
maneira encontrada para contornar este problema por exemplo usar um mtodo
explcito para auxiliar.
De maneira geral o mdulo do erro para Adams-M. menor que Adams-B. , mas
depende fundamentalmente se o problema estar bem condicionado e a escolha do melhor
mtodo para aquele problema.
15
dN
(t) = rN(t), N(0) = No
dt
16
R a taxa de variao
Porm, este modelo est longe da realidade, pois sabemos que, aps um certo
perodo de tempo, a populao ser to grande que surgiro problemas (limitao de
alimentos, espao etc).
Surgiu ento a equao logstica
dN
(t) = f(N) N(t), N(0) = No
dt
na qual a taxa de variao depende da populao e dada por f(N). Vamos construir uma
funo f(N) que tenha as propriedades desejadas:
dN
(t) = { -r [ 1 - (N/M1)] [ 1 - (N/M2)] } N(t), N(0) = No
dt
17
dN 1
= k1N1 - k2N1N2
dt
dN 2
= k3N1N2 - k4N2
dt
com N1(0) = N10 e N2(0) = N20.
18
Programa desenvolvido em Borland C++ para a soluo deste problema, sendo que o
programa abaixo genrico possuindo a opo de resoluo atravs dos mtodos de Euler
(Runge-Kutta 1a. ordem), Rungr-Kutta 2a. ordem e Runge-Kutta de 4a. ordem
19
{
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]);
20
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]);
21
}
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);
22
//close1
Grfico de sada do programa em Borland C++ para h = 0.1 e Mtodo Runge-Kutta 1a.
Ordem (Euler) (plotado no GRAPHER)
2.400
2.300
2.200
2.100
2.000
1.900
1.800
Grfico de sada do programa em Borland C++ para h = 0.01 e Mtodo RungeKutta 1a. Ordem (Euler) (plotado no GRAPHER)
23
2.400
2.300
2.200
2.100
2.000
1.900
1.800
24
2.400
2.300
2.200
2.100
2.000
1.900
1.800
Grfico de sada do programa em Borland C++ para h = 0.01 e Mtodo RungeKutta 2a. Ordem (plotado no GRAPHER)
2.400
2.300
2.200
2.100
2.000
1.900
1.800
25
2.400
2.300
2.200
2.100
2.000
1.900
1.800
2.300
2.200
2.100
2.000
1.900
1.800
Grfico de sada do programa em Borland C++ para h = 0.01 e Mtodo RungeKutta 4a. Ordem (plotado no GRAPHER)
26
2.400
2.300
2.200
2.100
2.000
1.900
1.800
2.300
2.200
2.100
2.000
1.900
1.800
27
2
Constante
+
+
[T,U]
Matriz contendo
os valores de x
Somatorio
das variaveis
1/s
Integracao para
obter y
y
Saida para y
x
Saida para x
Grafico de X/Y
Gr
Grfico de sada do esquema SIMULINK para h=0.1.
X Y Plot
2.5
2.4
2.3
2.2
Y Axis
2.1
2
1.9
1.8
1.7
1.6
1.5
0
0.1
0.2
0.3
0.4
0.5
X Axis
0.6
0.7
0.8
0.9
28
X Y Plot
2.5
2.4
2.3
2.2
Y Axis
2.1
2
1.9
1.8
1.7
1.6
1.5
0.1
0.2
0.3
0.4
0.5
X Axis
0.6
0.7
0.8
0.9
2.5
2.4
2.3
2.2
Y Axis
2.1
2
1.9
1.8
1.7
1.6
1.5
0.1
0.2
0.3
0.4
0.5
X Axis
0.6
0.7
0.8
0.9
/* Exercicio 2 : RK4
Linguagem : Borland C++ */
29
#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 equaes 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) : ");
30
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
31
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;
//
:%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]);
32
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);
}*/
Grfico de sada do programa em Borland C++ para h = 0.001 (plotado no
GRAPHER)
33
Grfico da Acelerao
0.5
-0.5
0
50
100
150
50
100
150
200
Grfico da Velocidade
2
1.5
1
0.5
0
-0.5
-1
-1.5
0
200
34
3
2
1
0
-1
-2
-2
-1
4
Gain2
Sum
[T,U]
From
Workspace
0.
Gain
1/s
Integrator
1/s
Integrator1
f(u)
Fcn
du/dt Aceleracao
1
Derivative
V x V`
35
0.5
-0.5
50
100
150
Time (second)
200
Grfico daVelocidade
2
1.5
1
0.5
0
-0.5
-1
-1.5
50
100
150
Time (second)
200
36
X Y Plot
Y Axis
2
1
0
-1
-2
-2
-1
0
X Axis
37
float y[3];
float k[4][3];
float w[4]; //valores inicias das equaes 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;
38
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;
39
//
:%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);
}*/
40
Grfico de sada do programa em Borland C++ para h = 0.001 (onde a 1a., 2a. e
0.2
0.4
0.6
0.8
1.2
1.4
1.6
1.8
Product
+
+
+
+
Sum
[T,U]
From
Workspace
1/s
Integrator1
1/s
Integrator
1/s
Integrator2
Mux Mux
Graph
Grficos de sada do esquema SIMULINK para h = 0.001 (onde a 1a., 2a. e 3a.
curvas, rferem-se y1[t], y2[t] e y3[t] respectivamente).
41
5
4.5
4
3.5
3
2.5
2
1.5
1
0.5
0
0.2
0.4
0.6
0.8
1
1.2
Time (second)
1.4
1.6
1.8
Differential Equations
Esquema SIMULINK para a soluo da equao diferencial
yout
To Workspace
*
1/s
Integrator
Graph
[T,U]
From
Workspace
Product
cos(u)
Fcn
42
5
4.5
4
3.5
3
2.5
2
1.5
1
0.5
0
0.1
0.2
0.3
0.4
0.5
0.6
Time (second)
0.7
0.8
0.9
1/s
y
[T,U]
From
Workspace
Graph
2/u
funcao auxiliar
Product2
u*u
funcao aux1
exp(u)
funcao exponencial
+
+
Sum
*
Product1
43
5
4
3
2
1
0
-1
-2
-3
-4
-5
1.2
1.4
1.6
1.8
2
2.2
Time (second)
2.4
2.6
2.8
Differential Equations
Esquema SIMULINK para a soluo da equao diferencial.
1/s
Integrator
Graph
*
Product
[T,U]
From
Workspace
4
Constant
*
Product1
f(u)
Fcn
44
5
4
3
2
1
0
-1
-2
-3
-4
-5
0.1
0.2
0.3
0.4
0.5
0.6
Time (second)
0.7
0.8
0.9
Differential Equations
Esquema SIMULINK para a soluo da equao diferencial
[T,U]
From
Workspace
f(u)
sen(3*u)
f(u)
cos(2*u)
+
+
Sum
1/s
Integrator1
Graph
45
2.5
1.5
0.5
0.1
0.2
0.3
0.4
0.5
0.6
Time (second)
0.7
0.8
0.9
[T,U]
From
Workspace
2/u
2/u
f(u)
exp(u)*(u*u)
*
Product
+
+
Sum
1/s
Integrator1
Graph
46
20
18
16
14
12
10
8
6
4
2
0
1.1
1.2
1.3
1.4
1.5
1.6
Time (second)
1.7
1.8
1.9
[eL(ti-a) - 1]
2L
chegou a um valor para que o erro seja mnimo, tal que h = 0.001
47
%========================================
% 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);
48
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);
49
x 10
Populacao da Presa
3
2
1
0
15000
5
6
x
Populacao do Predador
10
10
10000
5000
5
x
1
DL(v) = CD ( d2/4) v2
2
sendo a densidade do ar
CD a constante emprica
CD = 0,508 [ 1 / (22,053 + 4,196(v/w)5/2)]2/5
w representa a velocidade angular da bola (dada pelo topspin).
50
M = - ML(v) n
n o vetor unitrio normal trajetria e
ML(v) = CM
1
( d2/4) v2
2
dx
= vx
dt
dvx
= - C D v vx + C M v vZ
dt
dz
= vz
dt
dvz
= -g - CD v vx + CM v vZ
dt
tendo como condies iniciais
x(0) = 0
vx(0) = v0 cos()
z(0) = h
vx(0) = v0 sen()
Adotaremos a seguinte notao para manter as equaes em forma compacta:
v = (vx, vz) = (dx/dt, dz/dt)
51
= d2 / 8 m
v=
vx + vz
= 1
%==================================================
%
%==================================================
%
52
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'
);
53
%============================================
%
Arquivo: tenisA.m
%
%
%============================================
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;
%===========================================
%
%
%
%============================================
54
%===================================================
%
Arquivo : tenisV.m
%
%
%===================================================
function xdot = tenisV(t,x)
global g
xdot(1) = x(3);
xdot(2) = x(4);
xdot(3) = 0;
xdot(4) = -g;
55
3
2.5
2
1.5
1
0.5
0
0
10
20
30
56