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-kV(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-kV(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-kV(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);