A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Ciclos e Funções Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2008/2009.

Apresentações semelhantes


Apresentação em tema: "Ciclos e Funções Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2008/2009."— Transcrição da apresentação:

1 Ciclos e Funções Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2008/2009

2 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 2 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. De notar que qualquer linguagem contem várias funções pré-definidas, como por exemplo as funções max/2 e sqrt/1 já utilizadas. função EntradaResultados

3 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 3 Funções e Passagem de Parâmetros Numa linguagem de programação uma função tem de ser definida, para poder ser invocada (chamada) posteriormente, normalmente em vários pontos de um programa ou de outra função. Nos casos mais simples podemos considerar numa função –Os seus parâmetros de entrada –O valor da função, obtido a partir dos parâmetros Existem duas formas clássicas de passagem de parâmetros: –Por valor –Por referência Em Octave, os parâmetros são geralmente passados por valor (com uma excepção - nomes de funções), pelo que começamos por analizar este modo de passagem de parâmetros.

4 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 4 Passagem de Parâmetros por Valor Exemplo: Consideremos a função triplo (que, como o nome indica, calcula o triplo do parâmetro de entrada). A sua definição (em Octave) é feita através da especificação function v = triplo(u) v = 3*u endfunction; Se chamada com o valor 5, normalmente o valor que uma determinada variável tem na altura da chamada da função, esse valor é triplicado e retornado. Por exemplo, se invocarmos a função na sequência (pode ser ao terminal) x = 5, y = 7, y = triplo(x); x, y,... os valores de x e y reportados no terminal são x = 5 y = 7 x = 5 y = 15.

5 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 5 Passagem de Parâmetros por Valor Exemplo: A computação da função triplo pode ser assim explicada: 1.Quando começa a ser executada a função triplo, são criadas duas novas variáveis, u e v, que são locais à função f. 2.O valor inicial da variável (local) u é o valor do parâmetro de chamada. Neste caso, é o valor da variável (do programa) x. 3.A instrução v = 3*u apenas envolve as variáveis locais u e v. 4.Após a execução da função, a variável v, contem o valor a ser retornado ao programa principal. 5.No programa principa esse valor é atribuído à variável (de programa) y...., x = 5; y = 7; y = triplo(x); x, y,... function v = triplo(u) v = 3*u; endfunction;

6 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 6 Passagem de Parâmetros por Valor NOTA: As variáveis que aparecem na definição da função são locais a essa função. Num programa grande, com várias funções, é inevitável que variáveis em funções diferentes tenham o mesmo nome (embora os nomes das variáveis devam ser escolhidos para evitar essas coincidências). Assim, elas podem ter o mesmo nome das variáveis de programa, que não serão confundidas com elas.( as variáveis x, y do programa principal não se confundem com as variáveis x, y da função) x = 5, y = 7 e z = 15...., x = 5; y = 7; z = triplo(x); x, y, z,... function y = triplo(x) x = 3 * x; y = x; endfunction;

7 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 7 Passagem de Parâmetros por Referência Outras linguagens (Pascal, C, C ++,...) permitem a passagem de parâmetros por referência. Neste caso, o que é passado à função é uma referência (apontador) à 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 z reportados no terminal, após a chamada da função, 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 (como anteriormente, o valor da função é atribuído à variável z do programa principal)

8 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 8 Funções em Octave Em geral, a especificação de uma função tem de ser visível do programa de onde a função é chamada. Em várias linguagens de programação, a função e o programa podem ser especificados no mesmo ficheiro, garantindo-se essa visibilidade. Quando são especificados em ficheiros separados, no ficheiro programa são especificados os ficheiros onde estão especificadas as funções utilizadas. Em Octave, a situação é diferente. A especificação de uma função com nome deve ser feita num ficheiro chamado, que deve ser colocado na pasta (folder) corrente. Essa pasta pode ser modificada atarvés da instrução cd (change directory). Por exemplo, se pretendermos trabalhar com uma pasta my_files, mantida numa caneta flash, e se a caneta for instalada no computador como o dispositivo E:, então para especificar essa pasta como a pasta corrente deverá usar-se o comando cd E:\my_files.

9 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 9 Funções de Funções em Octave Uma vez especificada, uma função pode ser utilizada na especificação de outras funções, ou nos próprios parâmetros de entrada de outras ou da mesma função. Por exemplo, definidas as funções dobro e triplo, nos respectivos ficheiros dobro.m e triplo.m Pode fazer-se a chamada z = dobro(triplo(5)) ou definir a nova função sextuplo Ficheiro dobro.m function y = dobro(x) y = 2*x endfunction Ficheiro triplo.m function y = triplo(x) y = 3*x endfunction Ficheiro sextuplo.m function y = sextuplo(x) y = dobro(triplo(x)) endfunction

10 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 10 Funções Múltiplas em Octave 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, y1 e y2, especifica-se a função como function [y1,y2] = f(x)... y1 =...; y2 =...;... endfunction;

11 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 11 Funções Múltiplas em Octave Exemplo: Para um ângulo alpha (expresso em radianos) obter numa só função os valores do seu seno, coseno, tendo em atenção que function [s,c,t] = trigonom(x) s = sin(x); c = cos(x); t = tan(x); endfunction; Podemos agora exemplificar a utilização de funções na resolução de um problema de engenharia relativo à trajectória de um projéctil.

12 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 12 Máximos e Mínimos de uma Função Antes de abordar o problema da trajectória de um projéctil, vamos estudar o problema de obter o máximo / mínimo de uma função, que aliás é utilizado para se obter o zero de uma outra função (utilizados depois no problema da trajectória). Vamos pois determinar a solução da equação x log(x) = 5, que pode ser considerado como a determinação do zero da função g(x) = x log(x) – 5. Sendo a função contínua no intervalo ]0, [, a função terá um zero no intervalo [1,5] já que g(1) = 1 log(1) – 5 = -5 e g(5) = 5 log(5) – 5 3.05. Assim queremos especificar a função [z,d] = zero(lo,up) que, no intervalo [lo, up], determina um zero, z, da função g, com um desvio, d, próximo de zero. Isto é, lo z up e g(z) = d 0

13 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 13 Máximos e Mínimos de uma Função A forma mais simples, mas não muito eficiente de determinar o zero da função é varrer o intervalo [lo, up], testando vários valores de x nesse intervalo e reportar aquele em que a função g(x) está mais próxima de zero. Para esse efeito podemos usar o ciclo que testa os valores x = lo, lo+dx, lo+2dx, lo+3dx,..., up e actualiza o erro d, mantendo o erro mais pequeno encontrado no varrimento De notar que se obtem o mínimo do valor absoluto de g(x), pois o erro é sempre uma medida positiva. x lo; e g(lo); enquanto x <= up fazer y = |g(x)|; se y > min e y; z x; fim se: x x + dx; fim enquanto

14 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 14 Máximos e Mínimos de uma Função O ciclo anterior pode agora ser utilizado na definição da função zero, que recebe como parâmetros os limites do intervalo, lo e up, bem como a precisão dx, com que se pretende varrer esse intervalo. Em Octave, terão de ser criados os ficheiros zero.m e g.m, com o seguinte código function y = g (x); y = x * log(x) – 5; endfunction; Ficheiro g.m function [z,d] = zero(lo, up, dx); x = lo; d = g(lo); while x <= up y = abs(g(x)); if y < d d = y; z = x; endif x = x + dx; endwhile; endfunction; Ficheiro zero.m

15 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 15 Máximos e Mínimos de uma Função Tendo em atenção que o ciclo testa todos os valores entre lo e up, com uma separação dx, o ciclo enquanto pode ser substituido por um ciclo para que, sendo equivalente, apresenta uma sintaxe mais agradável. Assim em vez de pode utilizar-se o ciclo: ou na sintaxe Octave: x lo; d g(lo); enquanto x <= up fazer y = |g(x)|; se y > min d y; z x; fim se: x x + dx; fim enquanto d g(lo); para x = lo: dx: up fazer y = |g(x)|; se y > min d y; z x; fim se: fim fazer e = g(lo); for x = lo: dx: up y = |g(x)|; if y > min e y; z x; endif: endfor

16 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 16 Máximos e Mínimos de uma Função Uma versão mais eficiente, faz parar o ciclo de varrimento quando o erro se torna suficentemente pequeno. Neste caso, arbitra- se um erro suficientemente pequeno e pode reescrever-se o ciclo como Um ciclo enquanto (que se execute pelo menos uma vez) pode ser re-escrito como um ciclo repetir.. até equivalente mas com uma sintaxe mais intuitiva, pois testa-se no fim do ciclo a condição de continuação (que é oposta à condição do ciclo enquanto). Neste caso, poderá utilizar-se o ciclo ao lado em que a condição d >= erro é substituida por d < erro no ciclo repetir até. x lo; d g(lo); enquanto d >= erro fazer y = |g(x)|; se y > min d y; z x; fim se: x x + dx; fim enquanto; x lo; d g(lo); repetir y = |g(x)|; se y > min d y; z x; fim se: x x + dx; até d < erro;

17 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 17 Máximos e Mínimos de uma Função A função zero pode agora ser substituída por uma versão mais eficiente, que recebe como parâmetro adicional o erro permitido e utiliza a sintaxe do ciclo repetir... até, que em Octave se especifica como do... until. Em Octave, terão de ser criados os ficheiros zero.m e g.m, com o seguinte código Nota: No caso de o erro ser muito pequeno a condição de paragem deverá ser (d up). Porquê? function [z,d] = zero2(lo, up, dx, erro); x = lo; d = abs(g(lo)); do y = abs(g(x)); if y < d d = y; z = x; endif x = x + dx; until d < erro; endfunction; Ficheiro zero_2.m

18 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 18 Trajectória de um Projéctil Passemos agora à especificação do problema da trajectória de um projéctil. Dada uma altura inicial (y 0 ) uma velocidade inicial (v 0 ) 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 (d max ) e a altura máxima (h max ) atingidas pelo projéctil. Algoritmo de Simulação da Trajectória de um Projéctil Entrada Altura Inicial : y 0 Velocidade Inicial : v 0 Ângulo Inicial : Precisão : dx Resultados Distância Máxima : d max Altura Máxima : h max

19 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 19 Modelação do Problema Um projéctil é lançado de uma altura de y 0 metros, com um ângulo inicial de lançamento de radianos e com uma velocidade inicial de v 0 metros por segundo. A trajectória do projéctil em coordenadas (x,y) pode ser modelada através da seguinte equação: v0v0 (0,0) x y y0y0 a f(a)f(a) d max h max

20 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 20 Resolução Informal Problema: determinar a distância máxima (d max ) e a altura máxima (h max ) atingidas pelo projéctil. Pode-se simular a trajectória do projéctil usando a função f para calcular o valor de y correspondente a cada valor de x. –Considera-se o ponto inicial da trajectória x 0 = 0: (x 0, y 0 ) –Considera-se uma sequência de valores de x (x 1, x 2,…) para os quais se calcula o respectivo valor de y (y 1, y 2,…) usando a fórmula indicada. –Termina-se o cálculo quando aparecer o primeiro ponto da trajectória com o valor de y negativo. Os valores da distância máxima e da altura máxima podem ser aproximados respectivamente pelos valores maximos de x e y obtidos nos pontos calculados da trajectória.

21 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 21 Resolução Informal A simulação da trajectória do projéctil pode ser simulada por um ciclo em que: O último ponto considerado é o primeiro (x 11 ) com y negativo: y 10 > 0 e y 11 < 0 A distância máxima (d max ) é aproximada pelo maior valor de x: d max x 11 A altura máxima (h max ) é aproximada pelo maior valor de y: h max y 6 A precisão das aproximações depende dos pontos da trajectória calculados: –se a distância dx entre dois pontos consecutivos diminuir, a precisão aumenta (x0,y0)(x0,y0) x y (x 1, y 1 ) (x 2, y 2 ) (x 11, y 11 ) (x 6, y 6 ) h max ^ d max ^

22 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 22 Problemas e Algoritmos Uma vez compreendida a especificação de um problema, e obtido um método informal de o resolver, há que especificar um algoritmo formal, que possa vir a ser a base do programa para resolver o problema inicial. Para especificar um algoritmo deveremos 1.Definir quais as variáveis necessárias, bem como o seu significado. As variáveis deverão ser sempre inicializadas antes de ser utilizadas ! 2.Decompor o algoritmo em componentes suficientemente simples para serem programadas facilmente. Tipicamente num algoritmo podem definir-se as seguintes fases 1.Inicialização de Variáveis 2.Corpo do algoritmo (que pode ser ainda mais decomposto) 3.Apresentação de Resultados

23 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 23 Simulação de Trajectórias - Variáveis No presente problema de trajectórias podemos identificar as seguintes variáveis, com os correspondentes significados: VariávelValor InicialSignificado g9.8 aceleração da gravidade yoentrada altura inicial v0entrada velocidade inicial alfaentrada ângulo inicial dxentrada precisão desejada x0 distância do projéctil num dado instante yy0 altura do projéctil nesse dado instante dmax0 distância máxima da trajectória hmax0 altura máxima da trajectória

24 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 24 Algoritmo de Simulação O corpo do algoritmo corresponde a um ciclo em que vão sendo obtidos valores de x e de y até se obter um valor de y negativo. Em simultâneo vão sendo considerados os valores máximos de x e de y, a que corresponderão os valores finais de dmax e hmax A apresentação dos resultados neste caso corresponde a escrever os valores de dmax e hmax (no terminal). enquanto y > 0 fazer x x + dx; y x * tan(alfa)-(g*x^2)/(2*v 0 ^2*cos(alfa)^2)+y 0 ; se hmax < y hmax max fim se; % dmax é obtido pelo valor final de x fim enquanto dmax x sai(dmax); sai(hmax);

25 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 25 Programa Octave % Inicialização de Variáveis g = 9.8; % aceleração da gravidade y0 = input(" Qual a altura inicial (m)? "); v0 = input(" Qual a velocidade inicial (m/s)? "); alfa = input(" Qual o angulo inicial (rad)? "); dx = input(" Qual a precisao (m)? "); x = 0 ; dmax = 0; % distância máxima da trajectória y = 0; hmax = 0; % altura máxima da trajectória % Ciclo de Simulação while y >= 0 x = x + dx; y = x*tan(alfa)-(g*x^2)/(2*v0^2*cos(alfa)^2)+y0; hmax = max(y, hmax); endwhile dmax = x; % Apresentação de Resultados disp("Distância maxima da trajectoria (m):"); disp(dmax); disp("Altura maxima da trajectoria (m):"); disp(hmax);

26 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 26 Utilização de 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. Mais interessantemente, 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. f Entrada x, y 0, v 0, Resultado y maximos Entrada x, y 0, v 0, Resultados dmax, hmax

27 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 27 Exemplo de Funções: Altura/4 Como vimos, podemos determinar a altura y da trajectória de um projéctil através da expressão abaixo. Essa determinação pode ser especificada na função altura, definida abaixo e guardada num ficheiro de nome altura.m Uma vez definida, esta função pode ser utilizada para definição doutras funções. Ficheiro altura.m function y = altura(x, y0, v0, alfa) g = 9.8; a = alfa * pi / 180; y = x*tan(alfa)-(g*x^2)/(2*v0^2*cos(alfa)^2)+y0; endfunction

28 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 28 Exemplo de Funções Múltiplas: Máximos/4 Um exemplo de função múltipla é a função maximos, que determina a distância e a altura máxima da trajectória de um projectil nas condições anteriores, e que é apresentada abaixo Ficheiro maximos.m function [dmax, hmax] = maximos(y0, v0, alfa, dx) x = 0 ; dmax = 0; y = y0; hmax = y0; while y > 0 x = x + dx; y = altura(x, y0, v0, alfa); hmax = max(y, hmax); endwhile dmax = max(x, dmax); endfunction

29 9 Março 2009 Ciclos e Funções - Trajectória de um Projéctil 29 Exemplo de Funções Múltiplas em Octave Esta função pode agora ser chamada do programa principal, com vários valores de y0, v0, alfa e dx. Por exemplo, >> [d,h] = maximos(0,10,45,0.1) d = 10.300 h = 2.5510 Outro exemplo >> [d,h] = maximos(10,10,45,0.01) d = 16.420 h = 12.551 Ficheiro maximos.m function [dmax, hmax] = maximos(y0, v0, alfa, dx).... endfunction


Carregar ppt "Ciclos e Funções Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2008/2009."

Apresentações semelhantes


Anúncios Google