1 Ciclos, Vectores e Gráficos Simulação da Queda de Corpos II DI/FCT/UNL 1º Semestre 2004/2005.
Transcript of 1 Ciclos, Vectores e Gráficos Simulação da Queda de Corpos II DI/FCT/UNL 1º Semestre 2004/2005.
1
Ciclos, Vectores e Gráficos Simulação da Queda de Corpos II
DI/FCT/UNL
1º Semestre 2004/2005
2
Simulação da Queda de Corpos IIDada 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.
Algoritmo de Queda
de Corpos
Entrada
Resistência do ArAltura Inicial
Intervalo de Tempo
Resultados
Gráficos para• Posição• Velocidade• Aceleração
3
GráficosEm Octave a forma mais simples de desenhar um gráfico da função f(x) é utilizar a função pre-definida
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.
0.00
0.20
0.40
0.60
0.80
1.00
0.00 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 1.00
X
F
i 1 2 3 4 5 6 7 8 9 10 11X 0.00 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 1.00F 0.00 0.00 0.01 0.03 0.06 0.13 0.22 0.34 0.51 0.73 1.00
4
Tipos de DadosComo 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.
5
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 Octave apenas se podem utilizar, como “primitivas”, estruturas uni-dimensionais (Vectores) e bi-dimensionais (Matrizes).
Em geral, os dados destas estruturas estão organizados em uma ou mais dimensões.
Por exemplo:
1 2 3A = [ 1, 2, 3]
1 2 3
4 5 6B = [ 1 2 3 ; 4 5 6]
6
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).
Vectores e Matrizes
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.
7
Vectores e MatrizesDesta forma, é conveniente inicializar os vectores utilizados num programa, sempre que se conheçam as suas dimensões e tamanho de cada dimensão.
1 1 1
1 1 1
0
0
0
1 0
0 1
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:
A = eye(2)
B = zeros(3,1)
C = ones (2,3)
8
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
1 2 3
4 5 6
2
51 2 3
2ª linha,1ª coluna
1ª linha,todas as colunas
Todas as linhasda 2ª coluna,
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 )
9
Vectores e Matrizes : CiclosPara 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).
i 1;enquanto i < imax fazer A(i) ... ...... i i + 1;fim enquanto;
No caso de vectores unidimensionais, tal pode ser feito num único ciclo enquanto
10
Ciclos ParaPara 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)
11
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
12
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
13
Inicialização de VariáveisAs 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
A constante que representa a aceleração da gravidade deve ser definida com o respectivo valor.
g 9.8;
14
Inicialização de VariáveisAs 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
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.
g 9.8; entra x0; entra k;entra dt;
15
Inicialização de VariáveisAs 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
A variável que indica a iteração corrente é inicializada com o valor 1 representando a primeira iteração.
g 9.8; entra x0; entra k;entra dt;i 1;
16
Inicialização de VariáveisAs 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
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.
g 9.8; entra x0; entra k;entra dt;i 1;T(i) 0; X(i) x0; V(i) 0;
17
Inicialização de VariáveisAs 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
A aceleração inicial pode ser calculada de acordo com a respectiva fórmula.
g 9.8; entra x0; entra k;entra dt;i 1;T(i) 0; X(i) x0; V(i) 0;A(i) -g-kV(i)
18
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.
19
Inicialização de Variáveis
• 1. Inicialização de Variáveis
g 9.8; % Aceleração da Gravidadeentra x0; % Altura inicial entra k; % Coeficiente de Atrito entra dt; % Intervalo de Tempoi 1; % Primeira iteraçãoT(i) 0; % Tempo inicialX(i) x0; % Altura inicialV(i) 0; % Velocidade inicialA(i) -g-kV(i); % Aceleração inicial
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.
enquanto x > 0 fazer t t + dt ; x x + v dt ; % x(t+dt) x(t) + v(t) dt v v + a dt ; % v(t+dt) v(t) + a(t) dt a -g - k v ; % a(t+dt) = - g - k v(t+dt)fim enquanto
No problema anterior, em que não era necessário guardar os valores intermédios, tinhamos:
21
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.
enquanto X(i) > 0 fazer i i + 1; T(i) T(i-1) + dt; X(i) X(i-1) + V(i-1)dt; % x(t+dt) x(t) + v(t) dt V(i) V(i-1) + A(i-1)dt; % v(t+dt) v(t) + a(t) dt A(i) -g - k V(i); % a(t+dt) = - g - k v(t+dt)fim enquanto
Agora temos que guardar os valores de cada iteração nos vectores T, X, V e A:
22
• 2. Ciclo de Simulação
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; % x(t+dt) x(t) + v(t) dt V(i) V(i-1) + A(i-1)dt; % v(t+dt) v(t) + a(t) dt A(i) -g - k V(i); % a(t+dt) = - g - k v(t+dt)fim enquanto
23
Apresentação de ResultadosOs resultados que se pretendem apresentar são a evolução da altura, da velocidade e da aceleração ao longo do tempo de queda.
Gráfico(T,X); % Altura do ObjectoGráfico(T,V); % Velocidade do ObjectoGráfico(T,A); % Aceleração do Objecto
Em pseudo-código, estes gráficos podem ser representados por:
Que terá de ser particularizado para uma qualquer linguagem (por exemplo Octave) através das primitivas disponibilizadas nessa linguagem.
24
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);
25
Algoritmo CompletoIn
icia
liza
ção
de
Var
iáve
isC
iclo
de
Sim
ula
ção
Res
ult
ados Gráfico(T,X); % Altura do ObjectoGráfico(T,V); % Velocidade do ObjectoGráfico(T,A); % Aceleração do Objecto
enquanto X(i) > 0 fazer i i + 1; T(i) T(i-1) + dt; X(i) X(i-1) + V(i-1)dt; % x(t+dt) x(t) + v(t) dt V(i) V(i-1) + A(i-1)dt; % v(t+dt) v(t) + a(t) dt A(i) -g - k V(i); % a(t+dt) = - g - k v(t+dt)fim enquanto
g 9.8; % Aceleração da Gravidadeentra x0; % Altura inicial entra k; % Coeficiente de Atrito entra dt; % Intervalo de Tempoi 1; % Primeira iteraçãoT(i) 0; % Tempo inicialX(i) x0; % Altura inicialV(i) 0; % Velocidade inicialA(i) -g-kV(i); % Aceleração inicial
26
Programa Octaveg = 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);subwindow(1,3); xlabel("Aceleração"); plot(T,A);