Ciclos, Vectores e Gráficos
Simulação da Queda de Corpos II
DI/FCT/UNL
1º Semestre 2004/2005
1
Simulação da Queda de Corpos II
Dada uma altura inicial, um coeficiente de resistência do ar e
uma dada precisão do intervalo de tempo, mostrar a evolução da
posição, velocidade e aceleração do objecto durante o tempo da
queda.
Entrada
Resistência do Ar
Altura Inicial
Intervalo de Tempo
Resultados
Algoritmo de
Queda
de Corpos
Gráficos para
• Posição
• Velocidade
• Aceleração
2
Gráficos
Em Octave a forma mais simples de desenhar um gráfico da
função f(x) é utilizar a função pre-definida
1.00
plot(X,F)
sendo X e F vectores da
mesma dimensão, e em que o
i-ésimo elemento do vector F
corresponde ao valor da
função no ponto x indicado
pelo i-ésimo elemento do
vector X.
i
X
F
1
0.00
0.00
2
0.10
0.00
3
0.20
0.01
4
0.30
0.03
5
0.40
0.06
0.80
0.60
F
0.40
0.20
0.00
0.00 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 1.00
X
6
0.50
0.13
7
0.60
0.22
8
0.70
0.34
9
0.80
0.51
10
0.90
0.73
11
1.00
1.00
3
Tipos de Dados
Como se pretendem gráficos para a posição, velocidade e
aceleração ao longo do tempo, deverá este manter um conjunto
de vectores T, X, V e A com o significado esperado para registar
os valores sucessivos de
• T : os instantes em que são avaliadas as outras grandezas
• X : a posição do corpo nos instantes registados em T
• V : a velocidade do corpo nos instantes registados em T
• A : a aceleração do corpo nos instantes registados em T
As restantes variáveis dt, k e g são do tipo real e mantêm-se
constantes ao longo do problema, uma vez inicializadas.
4
Vectores e Matrizes
Todas as linguagens de programação de alto nível permitem a
especificação de estruturas para agrupar dados do mesmo tipo.
Em geral, os dados destas estruturas estão organizados em uma ou
mais dimensões.
Em Octave apenas se podem utilizar, como “primitivas”, estruturas
uni-dimensionais (Vectores) e bi-dimensionais (Matrizes).
Por exemplo:
A = [ 1, 2, 3]
B = [ 1 2 3 ; 4 5 6]
1
2
3
1
2
3
4
5
6
5
Vectores e Matrizes
As linguagens compiladas requerem em geral que os vectores e
as matrizes sejam declarados antes de utilizados (definindo o
tamanho das várias dimensões).
Tal não é estritamente necessário em Octave (!) que vai alocando
espaço de memória à medida que novos elementos são
introduzidos.
Notar no entanto que:
• Esta flexibilidade tem como custo a maior lentidão de
execução.
• Em execuções sucessivas do mesmo programa, pode-se dar o
caso da estrutura manter uma dimensão (anterior), maior do
que a pretendida na execução corrente.
6
Vectores e Matrizes
Desta forma, é conveniente inicializar os vectores utilizados num
programa, sempre que se conheçam as suas dimensões e
tamanho de cada dimensão.
Em Octave, a inicialização pode ser feita por operações de
“construção” de vectores e matrizes, indicadas através de
parênteses rectos.
Em Octave, podem-se ainda inicializar vectores através das
instruções eye, zeros ou ones que inicializam matrizes
identidade, ou preenchidas com zeros e uns, respectivamente.
Alguns exemplos:
0
1 0
A = eye(2)
0
0 1
0
B = zeros(3,1)
1
1
1
C = ones (2,3)
1
1
1
7
Vectores e Matrizes
Um elemento de uma matriz é referido, indicando-se a ordem desse
elemento em cada dimensão. A notação é diferente nas várias
linguagens. Em Octave a referência faz-se com parênteses curvos.
Por exemplo: x = A(2, 1) % = 4
2ª linha,
1ª coluna
1
2
3
4
5
6
O Octave permite endereçar sub-vectores directamente, utilizando o
operador : como identificador de todos os elementos de uma
dimensão. Por exemplo:
L1 = A(1 , : )
ou
C2 = A(: , 2 )
1
1ª linha,
todas as colunas
2
2
3
Todas as linhas
da 2ª coluna,
5
8
Vectores e Matrizes : Ciclos
Para efeito de endereçamento é vulgar utilizar índices (i, j, k, ...)
que indicam a posição nas respectivas dimensões.
Variando estes índices pode variar-se o elemento do vector que é
referido.
É muito frequente pretender-se num programa “varrer” todos os
elementos de um vector, isto é, percorrê-los por ordem crescente
do(s) seu(s) índice(s).
No caso de vectores
unidimensionais, tal
pode ser feito num
único ciclo enquanto
i  1;
enquanto i < imax fazer
A(i)  ...
......
i  i + 1;
fim enquanto;
9
Ciclos Para
Para evitar a necessidade de inicializar um índice e de ir
procedendo ao seu incremento dentro do ciclo enquanto, todas
as linguagens de programação prevêem um ciclo para que
elimina essa necessidade.
i  1;
enquanto i < imax fazer
A(i)  ...
......
i  i + 1;
fim enquanto;
para i de 1 a imax fazer
A(i)  ...
......
fim para;
Notas:
1. É necessário conhecer imax, o tamanho máximo da dimensão i.
2. Assume-se que o primeiro elemento tem índice 1 (obrigatório em
OCTAVE)
10
Estrutura do Algoritmo
Estamos agora em condições de especificar as
alterações ao algoritmo para simulação da queda dos
corpos com a apresentação da posição, velocidade e
aceleração durante a queda.
Vamos novamente considerar cada uma das seguintes
componentes separadamente:
1. Inicialização de Variáveis
2. Ciclo de Simulação da Queda
3. Apresentação de Resultados
11
Constantes e Variáveis Utilizadas
Constantes:
• g = 9.8 a aceleração da gravidade (na Terra)
Variáveis:
•
•
•
•
•
•
•
•
x0: a altura inicial do corpo
k: o coeficiente de resistência do ar
dt: o valor do intervalo de tempo usado na simulação
i: variável que indica a iteração corrente
T: vector que regista o tempo em cada iteração
X : vector com a altura do corpo em cada iteração
V : vector com a velocidade do corpo em cada iteração
A : vector com a aceleração do corpo em cada iteração
12
Inicialização de Variáveis
As variáveis têm que ser inicializadas e as constantes definidas
antes de poderem ser referidas em expressões.
•
•
•
•
•
•
•
•
•
g: aceleração da gravidade
x0: a altura inicial do corpo
k: o coeficiente de resistência do ar
dt: intervalo de tempo usado na simulação
i: variável que indica a iteração corrente
T: vector com o tempo em cada iteração
X: vector com a altura em cada iteração
V: vector com a velocidade em cada iteração
A: vector com a aceleração em cada iteração
g  9.8;
A constante que representa a aceleração da gravidade deve ser
definida com o respectivo valor.
13
Inicialização de Variáveis
As variáveis têm que ser inicializadas e as constantes definidas
antes de poderem ser referidas em expressões.
•
•
•
•
•
•
•
•
•
g: aceleração da gravidade
x0: a altura inicial do corpo
k: o coeficiente de resistência do ar
dt: intervalo de tempo usado na simulação
i: variável que indica a iteração corrente
T: vector com o tempo em cada iteração
X: vector com a altura em cada iteração
V: vector com a velocidade em cada iteração
A: vector com a aceleração em cada iteração
g  9.8;
entra x0;
entra k;
entra dt;
Quer a altura inicial, quer o valor do coeficiente da resistência
do ar, quer o intervalo de tempo utilizados, devem ser
especificados pelo utilizador através de instruções de entrada.
14
Inicialização de Variáveis
As variáveis têm que ser inicializadas e as constantes definidas
antes de poderem ser referidas em expressões.
•
•
•
•
•
•
•
•
•
g: aceleração da gravidade
x0: a altura inicial do corpo
k: o coeficiente de resistência do ar
dt: intervalo de tempo usado na simulação
i: variável que indica a iteração corrente
T: vector com o tempo em cada iteração
X: vector com a altura em cada iteração
V: vector com a velocidade em cada iteração
A: vector com a aceleração em cada iteração
g  9.8;
entra x0;
entra k;
entra dt;
i  1;
A variável que indica a iteração corrente é inicializada com o
valor 1 representando a primeira iteração.
15
Inicialização de Variáveis
As variáveis têm que ser inicializadas e as constantes definidas
antes de poderem ser referidas em expressões.
•
•
•
•
•
•
•
•
•
g: aceleração da gravidade
x0: a altura inicial do corpo
k: o coeficiente de resistência do ar
dt: intervalo de tempo usado na simulação
i: variável que indica a iteração corrente
T: vector com o tempo em cada iteração
X: vector com a altura em cada iteração
V: vector com a velocidade em cada iteração
A: vector com a aceleração em cada iteração
g  9.8;
entra x0;
entra k;
entra dt;
i  1;
T(i)  0;
X(i)  x0;
V(i)  0;
Assumindo que a queda começa na origem do tempo, da altura
x0 e a partir de repouso, os valores do primeiro elemento dos
vectores T, X e V deverão ser 0, x0 e 0 respectivamente.
16
Inicialização de Variáveis
As variáveis têm que ser inicializadas e as constantes definidas
antes de poderem ser referidas em expressões.
•
•
•
•
•
•
•
•
•
g: aceleração da gravidade
x0: a altura inicial do corpo
k: o coeficiente de resistência do ar
dt: intervalo de tempo usado na simulação
i: variável que indica a iteração corrente
T: vector com o tempo em cada iteração
X: vector com a altura em cada iteração
V: vector com a velocidade em cada iteração
A: vector com a aceleração em cada iteração
g  9.8;
entra x0;
entra k;
entra dt;
i  1;
T(i)  0;
X(i)  x0;
V(i)  0;
A(i)  -g-kV(i)
A aceleração inicial pode ser calculada de acordo com a
respectiva fórmula.
17
Inicialização de Variáveis
• As variáveis x0, dt e k são numéricas e devem ser
introduzidas pelo utilizador, mantendo-se constantes após a
inicialização.
• A variável i é de tipo inteiro e as outras de tipo real, mas no
Octave não é necessário distinguir os tipos de dados
numéricos.
• Os primeiros elementos dos vectores T, X, V e A - isto é,
T(1), X(1), V(1) e A(1) - são inicializados antes do ciclo,
• Os restantes elementos dos vectores – isto é, T(i), X(i), V(i) e
A(i), com i  2, 3 ... – vão sendo calculados nas sucessivas
iterações do ciclo Para.
18
Inicialização de Variáveis
•
1. Inicialização de Variáveis
g  9.8;
entra x0;
entra k;
entra dt;
i  1;
T(i)  0;
X(i)  x0;
V(i)  0;
A(i)  -g-kV(i);
% Aceleração da Gravidade
% Altura inicial
% Coeficiente de Atrito
% Intervalo de Tempo
% Primeira iteração
% Tempo inicial
% Altura inicial
% Velocidade inicial
% Aceleração inicial
19
Ciclo de Simulação
A parte fundamental do algoritmo é o ciclo de simulação em
que se vão calculando os sucessivos valores de tempo, da altura,
da velocidade e da aceleração, em tempos espaçados de um
intervalo dt.
No problema anterior, em que não era necessário guardar os
valores intermédios, tinhamos:
enquanto x > 0 fazer
t  t + dt ;
x  x + v  dt ;
v  v + a  dt ;
a  -g - k  v ;
fim enquanto
% x(t+dt)  x(t) + v(t)  dt
% v(t+dt)  v(t) + a(t)  dt
% a(t+dt) = - g - k  v(t+dt)
20
Ciclo de Simulação
A parte fundamental do algoritmo é o ciclo de simulação em
que se vão calculando os sucessivos valores de tempo, da altura,
da velocidade e da aceleração, em tempos espaçados de um
intervalo dt.
Agora temos que guardar os valores de cada iteração nos
vectores T, X, V e A:
enquanto X(i) > 0 fazer
i  i + 1;
T(i)  T(i-1) + dt;
X(i)  X(i-1) + V(i-1)dt;
V(i)  V(i-1) + A(i-1)dt;
A(i)  -g - k  V(i);
fim enquanto
% x(t+dt)  x(t) + v(t)  dt
% v(t+dt)  v(t) + a(t)  dt
% a(t+dt) = - g - k  v(t+dt)
21
Ciclo de Simulação
•
2. Ciclo de Simulação
enquanto X(i) > 0 fazer
i  i + 1;
T(i)  T(i-1) + dt;
X(i)  X(i-1) + V(i-1)dt;
V(i)  V(i-1) + A(i-1)dt;
A(i)  -g - k  V(i);
fim enquanto
% x(t+dt)  x(t) + v(t)  dt
% v(t+dt)  v(t) + a(t)  dt
% a(t+dt) = - g - k  v(t+dt)
22
Apresentação de Resultados
Os resultados que se pretendem apresentar são a evolução da
altura, da velocidade e da aceleração ao longo do tempo de queda.
Em pseudo-código, estes gráficos podem ser representados por:
Gráfico(T,X);
Gráfico(T,V);
Gráfico(T,A);
% Altura do Objecto
% Velocidade do Objecto
% Aceleração do Objecto
Que terá de ser particularizado para uma qualquer linguagem
(por exemplo Octave) através das primitivas disponibilizadas
nessa linguagem.
23
Gráficos em Octave
Como se pretende mostrar 3 gráficos, com eixos diferentes, tal pode
ser feito em Octave através da criação de 3 janelas de gráficos, e
usando cada uma para a função pretendida
multiplot(1,3);
subwindow(1,1);
xlabel(“Altura");
plot(T,X);
subwindow(1,2);
xlabel(“Velocidade");
plot(T,V);
subwindow(1,3);
xlabel(“Aceleração");
plot(T,A);
24
% Aceleração da Gravidade
% Altura inicial
% Coeficiente de Atrito
% Intervalo de Tempo
% Primeira iteração
% Tempo inicial
% Altura inicial
% Velocidade inicial
% Aceleração inicial
Ciclo de Simulação
g  9.8;
entra x0;
entra k;
entra dt;
i  1;
T(i)  0;
X(i)  x0;
V(i)  0;
A(i)  -g-kV(i);
enquanto X(i) > 0 fazer
i  i + 1;
T(i)  T(i-1) + dt;
X(i)  X(i-1) + V(i-1)dt;
V(i)  V(i-1) + A(i-1)dt;
A(i)  -g - k  V(i);
fim enquanto
Resultados
Inicialização de Variáveis
Algoritmo Completo
Gráfico(T,X);
Gráfico(T,V);
Gráfico(T,A);
% x(t+dt)  x(t) + v(t)  dt
% v(t+dt)  v(t) + a(t)  dt
% a(t+dt) = - g - k  v(t+dt)
% Altura do Objecto
% Velocidade do Objecto
% Aceleração do Objecto
25
Programa Octave
g = 9.8;
x0 = input(" Qual a altura inicial (em metros) ? ");
k = input("
e o coeficiente de atrito (1/s) ? ");
dt = input("
e o intervalo de tempo (em segs) ? ");
i = 1;
T=zeros(1,1); X=zeros(1,1); V=zeros(1,1); A=zeros(1,1);
T(i) = 0;
X(i) = x0;
V(i) = 0;
A(i) = - g - k * V(i);
while (X(i) > 0)
i = i + 1;
T(i) = T(i-1) + dt;
X(i) = X(i-1) + V(i-1)*dt;
V(i) = V(i-1) + A(i-1)*dt;
A(i) = -g - k*V(i);
endwhile;
multiplot(1,3);
subwindow(1,1); xlabel("Altura");plot(T,X);
subwindow(1,2); xlabel("Velocidade"); plot(T,V);
26
subwindow(1,3); xlabel("Aceleração"); plot(T,A);
Download

Ciclos, Vectores e Gráficos - Simulação da Queda de Corpos II