14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 1
Vectores, Gráficos e FunçõesTrajectória de Projéctil
Jorge CruzDI/FCT/UNL
Programação para as Ciências Experimentais1º Semestre 2005/2006
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 2
Especificação do Problema
Dada uma altura inicial (y0) uma velocidade inicial (v0) e um ângulo inicial de lançamento (), com base no modelo da trajectória apresentado e para uma dada precisão (dx), determinar a distância máxima (dmax) e a altura máxima (hmax) atingidas pelo projéctil e mostrar o gráfico da trajectória.
Algoritmo de Simulação da Trajectória deum Projéctil
Entrada
Altura Inicial : y0
Velocidade Inicial : v0
Ângulo Inicial : Precisão : dx
Resultados
Distância Máxima : dmax
Altura Máxima : hmax
Gráfico Trajectória
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 3
GráficosEm Octave a forma mais simples de desenhar um gráfico da função f(x) é utilizar o comando pre-definido
plot(X,F)
sendo X e F dois vectores do mesmo tamanho, 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
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 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 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]
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 5
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.
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 6
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 (Ex: A=[], B=[1, 2; 3, 4]).
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)
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 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
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 )
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 8
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
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 9
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)
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 10
Alterações ao Algoritmo
O algoritmo para simulação da trajectória de um projéctil pode ser decomposto em 3 “componentes”
1. Inicialização de Variáveis
2. Ciclo de Simulação da Trajectória
3. Apresentação de Resultados
O Ciclo de Simulação da Trajectória tem que ser alterado de modo a guardar num vector os valores da trajectória calculados.
Na Apresentação de Resultados têm que ser adicionadas instruções para mostrar o gráfico da trajectória.
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 11
Ciclo de Simulação• Para guardar todos os pontos calculados da trajectória são necessários dois vectores, X e Y, e um índice i que indica a posição do último elemento.• Ambos os vectores são inicializados com o primeiro ponto da trajectória e o valor de i é inicializado a 1 porque de início apenas existe o primeiro ponto.• Por cada novo ponto: i é incrementado, e os novos valores de x e y são colocados na posição i dos respectivos vectores.• O valor da altura máxima pode agora ser calculado apenas no fim do ciclo, uma vez que se guardaram todos os valores de y no vector Y.
x 0;y y0;enquanto y > 0 fazer x x + dx; y x*tan()-(g*x^2)/ (2*v0^2*cos()^2)+y0; hmax max(hmax,y);fim enquanto
hmax max(Y);
enquanto Y(i) > 0 fazer i i+1; X(i) X(i-1) + dx; Y(i) X(i)*tan()-(g*X(i)^2)/ (2*v0^2*cos()^2)+y0;fim enquanto
X [0]; Y [y0]; i 1;
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 12
Apresentação dos Resultados• Agora, além de se mostrar os valores da distância e altura máximas, tem que ser apresentado o gráfico da trajectória.• Como deixou de existir a variável x, a distancia máxima corresponde agora ao último elemento do vector X.• As instruções para mostrar a distância e altura máximas mantêm-se.• Em pseudo-código, um gráfico pode ser representado por uma instrução Gráfico(X,Y), que terá de ser particularizada para uma qualquer linguagem através das primitivas disponibilizadas nessa linguagem (Octave: plot(X,Y)).
dmax x;Sai dmax; Sai hmax;
Gráfico(X,Y);
Sai dmax; Sai hmax;
dmax X(i);
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 13
Algoritmo Completo% Inicialização de Variáveis
g 9.8; % aceleração da gravidadeEntra y0; % altura inicialEntra v0; % velocidade inicialEntra ; % ângulo inicial Entra dx; % precisãodmax 0; % distância máxima da trajectóriahmax 0; % altura máxima da trajectória
% Ciclo de SimulaçãoX [0]; Y [y0]; i 1;enquanto Y(i) > 0 fazer
i i+1; X(i) X(i-1) + dx; Y(i) X(i)*tan()-(g*X(i)^2)/(2*v0^2*cos()^2)+y0;
fim enquanto % Apresentação de Resultados
hmax max(Y);dmax X(i); Sai dmax; Sai hmax;Gráfico(X,Y);
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 14
Programa Octave% Inicialização de Variáveis
g = 9.8; % aceleração da gravidadey0 = input(" Qual a altura inicial (m)? ");v0 = input(" Qual a velocidade inicial (m/s)? "); tet = input(" Qual o angulo inicial (rad)? ");dx = input(" Qual a precisao (m)? ");dmax = 0; % distância máxima da trajectóriahmax = 0; % altura máxima da trajectória
% Ciclo de SimulaçãoX = [0]; Y = [y0]; i = 1;while Y(i) > 0
i = i+1; X(i) = X(i-1) + dx; Y(i) = X(i)*tan(tet)-(g*X(i)^2)/(2*v0^2*cos(tet)^2)+y0;
endwhile % Apresentação de Resultados
hmax = max(Y);dmax = X(i);
disp("Distância maxima da trajectoria (m):"); disp(dmax);disp("Altura maxima da trajectoria (m):"); disp(hmax);plot(X,Y);
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 15
Funções
• Em geral, as linguagens de programação, além de oferecerem funções prédefinidas (ex: sqrt(x), cos(x),…) permitem que o programador defina as suas próprias funções.
• A ideia é abstrair numa função (com nome, inputs e outputs) todos os procedimentos necessários para calcular os resultados pretendidos, isto é, calcular os outputs a partir dos inputs.
• Esta forma de proceder, tem muitas vantagens, já que permite:
– Estruturar um programa em componentes básicos;
– Reutilizar esses componentes básicos noutros programas.
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 16
Funções
• No exemplo da trajectória de um projéctil, o cálculo do valor de y correspondente a cada valor de x pode ser abstraído numa função f responsável por executar esses cálculos correctamente.
• E, se quisermos, todo o cálculo da altura e distância máximas de uma trajectória pode ser abstraído numa função maximos que por sua vez utiliza a função f.
fEntrada
x, y0, v0,
Resultados
y
maximosEntrada
y0, v0, , dx
Resultados
dmax, hmax
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 17
Funções e Passagem de Parâmetros• Em muitos casos, ao invocar-se uma função pretende-se
obter não apenas um mas vários resultados.
• Este requisito é tratado diferentemente em diferentes linguagens de programação, dependendo em grande parte da forma como são passados os parâmetros de uma função.
• Em OCTAVE, os parâmetros são passados exclusivamente por valor (com uma excepção - nomes de funções).
• Isto quer dizer, que ao especificar-se uma variável no parâmetro de uma função a invocar, o que se passa para a função é o valor da variável.
• Durante a função, a variável não pode ser alterada no programa que invoca a função!
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 18
Passagem de Parâmetros por Valor• Exemplo: Consideremos a função
function y = f(x) x = 2*x y = xendfunction;
• Se chamada com o valor x = 5, durante a computação da função, esse valor é duplicado e retornado.
• Por exemplo, se invocarmos a função na sequência (pode ser ao terminal)
..., x = 5; z = f(x); x, z, ...
os valores de x e y reportados no terminal são x = 5 e z = 10.
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 19
Passagem de Parâmetros por Valor• Exemplo: ..., x = 5; z = f(x); x, z, ...
function y = f(x) x = 2*x; y = x;endfunction;
A computação da função f pode ser assim explicado:
1. Quando começa a ser executada a função f, é criada uma nova variável x, que é local à função f, e que não se confunde com a variável x do programa.
2. O valor inicial da variável x local é o valor da variável do programa que é passsada como parâmetro (e que por acaso se chama x).
3. A instrução x=2*x apenas envolve a variável local x, que passa a valer 10.
4. Na instrução y=x, é a nova variável local que é considerada, e portanto, y = 10, valor esse retornado.
5. No “programa principal” esse valor é atribuído à variável z.
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 20
Passagem de Parâmetros por Referência• Outras linguagens (Pascal, C, C++, ...) permitem a passagem de
parâmetros por referência, i.e. é passada a referência à variável do programa principal, que pode ser alterada pela função.
• Por exemplo se o parâmetro x fosse passado por referência (indicado com uma notação fictícia)
..., x = 5; z = f(x); x, z, ...
function y = f(ref x) x = 2*x; y = x;endfunction;
os valores de x e y reportados no terminal seriam • x = 10 (sendo passada por referência, a variável x referida na
função é a mesma variável que a variável x do programa); e
• z = 10
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 21
Funções com Múltiplos Resultados• A passagem de parâmetros por referência permite que uma
função (ou procedimento) passe vários valores para o programa que a invocou. Basta passar por referência as variáveis onde esses valores devem ser “colocados”.
• O Octave, não suporta passagem de parâmetros por referência. A computação de vários resultados numa função é conseguida pela computação de um vector de resultados.
• Por exemplo, se se pretender que a função f, com argumento x, retorne dois valores, f1 e f2, especifica-se a função como
function [f1,f2] = f(x) ... f1 = ...; f2 = ...; ...endfunction;
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 22
Programas e Funções Octave
• Em Octave, os programas e as funções são muito semelhantes aos apresentados em pseudo-código.
• No entanto eles devem ser escritos em dois ficheiros m (“m files”) distintos, que devem residir na mesma directoria (a menos que se utilizem instruções de alteração da directoria corrente).
• O nome do ficheiro onde uma função é definida deve ter o nome dessa função.
– a função f deverá ser definida num ficheiro com o nome “f.m”.
– a função maximos deverá ser definida no ficheiro “maximos.m”.
• De notar que uma função pode ser invocada a partir de qualquer ficheiro e mesmo do terminal.
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 23
Programa: trajectoria
O programa principal, guardado no ficheiro “trajectoria.m”, chama a função maximos para calcular a distância e a altura máxima da trajectória.
% Inicialização de Variáveis y0 = input(" Qual a altura inicial (m)? ");v0 = input(" Qual a velocidade inicial (m/s)? "); tet = input(" Qual o angulo inicial (rad)? ");dx = input(" Qual a precisao (m)? ");
% Cálculo dos máximos[dmax, hmax]=maximos(y0,v0,tet,dx);
% Apresentação de Resultadosdisp("Distância maxima da trajectoria (m):"); disp(dmax);disp("Altura maxima da trajectoria (m):"); disp(hmax);
14 Outubro 2005 Vectores, Gráficos e Funções - Trajectória de um Projéctil 24
Funções: maximos e fA função maximos é guardada no ficheiro “maximos.m”, e usa a função f para calcular o valor de y a partir do valor de x.function [dmax, hmax]=maximos(y0,v0,tet,dx);
X = [0]; Y = [y0]; i = 1;while Y(i) > 0
i = i+1; X(i) = X(i-1) + dx; Y(i) = f(X(i),y0,v0,tet);
endwhile hmax = max(Y);dmax = X(i); plot(X,Y);
endfunction
A função f , guardada no ficheiro “f.m”, faz as contas.function y=f(x,y0,v0,tet);
g = 9.8;y = x*tan(tet)-(g*x^2)/(2*v0^2*cos(tet)^2)+y0;
endfunction
Top Related