matrizes e gráficos trajectória de projéctil pedro barahona di/fct/unl introdução aos...

21
Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

Upload: internet

Post on 17-Apr-2015

105 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

Matrizes e Gráficos Trajectória de Projéctil

Pedro BarahonaDI/FCT/UNL

Introdução aos Computadores e à Programação2º Semestre 2007/2008

Page 2: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 2

Gráficos e Matrizes

• Em muitas situações, a informação de saída é mais útil se for apresentada através

de gráficos (ou outra forma de apresentação audio-visual).

• O Octave tem uma capacidade (limitada) de apresentação de gráficos,

implementada através de uma estrutura de dados básica: a matriz.

• Esta funcionalidade será apresentada para obtenção do gráfico da trajectória de um

projéctil, estudada anteriormente, e correspondente à função

02

220 )(cos2

)tan()( yxav

gaxyxf

v0

(0,0)x

y

y0

a

f(a)

dmax

hmax

Page 3: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 3

Matrizes

• Uma matriz (“array”) é uma estrutura de dados que agrega um conjunto de valores

do mesmo tipo, na forma de uma “tabela” multidimensional.

• No Octave, as matrizes têm apenas 1 dimensão (vaectores) ou duas dimensões.

Noutras linguagens os arrays podem ter mais de 2 dimensões.

• Por exemplo, podemos representar no vector V os primeiros 5 números inteiros,

num vector U os primeiros 4 números primos, e na matriz M a tabela da

multiplicação dos primeiros números naturais.

• Nas tabelas os dados estãi dispostos em linhas e colunas. O vector V tem 1 linha e 5

colunas, o vector U tem 4 linhas e 1 coluna, e a matriz M 3 linhas e 4 colunas.

1 2 3 4 5

1 4 9 16 25

Vector V

Matriz M

Vector

U

1 2 3 4

1 1 2 3 4

2 2 4 6 8

3 3 6 9 12

1 2

2 3

3 5

4 7

Page 4: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 4

Inicialização de Matrizes

• A forma mais simples de inicializar uma matriz (pequena) é indicar explicitamente os

seus valores, numa operação de atribuição.

• Em Octave, todas as variáveis são matrizes, mesmo os valores simples, internamente

guardados como matrizes de uma linha e uma coluna.

• Na atribuição directa, as dimensões da matriz são indicadas implicitamente. Os

sucessivos valores são colocados entre parênteses rectos, separados por espaços ou

vírgulas dentro de uma linha, sendo as linhas separadas por ponto e vírgula).

• Exemplos: V = [1, 4 9, 16 25] ; U = [ 2; 3; 5; 7]

M = [1 2 3 4 ; 2, 4, 6, 8 ; 3 6 9 12]

1 2 3 4 5

1 4 9 16 25

Vector V

Matriz M

Vector

U

1 2 3 4

1 1 2 3 4

2 2 4 6 8

3 3 6 9 12

1 2

2 3

3 5

4 7

Page 5: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 5

Inicialização de Matrizes

• Quando as matrizes são “maiores” elas podem ser inicializadas a “0” ou a “1s”por

instruções predefinidas, zeros e ones, indicando-se explicitamente as dimensões

das matrizes.

• Exemplos: V1 = ones(1,5) ; U1 = zeros(4,1)

M1 = ones(3,4)

• Estes valores podem depois ser modificados. Para aceder a elementos da matriz

deve indicar-se o identificador da matriz, seguido, entre parênteses curvos, da

“região” (range) da matriz que se pretende aceder.

Nota: Em Octave, o primeiro elemento da linha ou coluna tem sempre o índice 1.

Vector V1

Matriz M1

Vector

U1

1 2 3 4

1 1 1 1 1

2 1 1 1 1

3 1 1 1 1

1 0

2 0

3 0

4 0

1 2 3 4 5

1 1 1 1 1

Page 6: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 6

Inicialização de Matrizes

• Para aceder a elementos individuais, a região da matriz é indicada pelo número de

linha e coluna, podendo-se omitir as colunas e linhas em vectores linha e coluna,

respectivamente.

• Exemplos: V(3) = 9 ; U(4) = 7 ; M(2,3) = 6

• Para modificação de todos os valores são habitualmente utilizados ciclos, como os

indicados para o vector V (em pseudo-código e em sintaxe Octave)

1 2 3 4 5

1 4 9 16 25

Vector V

Matriz M

Vector

U

1 2 3 4

1 1 2 3 4

2 2 4 6 8

3 3 6 9 12

1 2

2 3

3 5

4 7

i = 1;while i <= 5 V(i) = i^2; i = i+1;endwhile

i = 1;enquanto i <= 5 V(i) = i^2; i = i+1fimenquanto

Page 7: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 7

Ciclos Para

• Sendo conhecido o número de iterações de um ciclo, este ciclo pode ser

especificado através de uma instrução de repetição para (for).

• Assim os ciclos abaixo, escritos em pseudo-código, são equivalentes

• Em Octave o ciclo é especificado pela instrução for. Os limites inicial e final são

especificados como um range, com a sintaxe do Octave.

i = 1;enquanto i <= 5 V(i) = i^2; i = i+1fimenquanto

para i de 1 a 5 V(i) = i^2;fimpara

i = 1;while i <= 5 V(i) = i^2; i = i+1endwhile

for i = 1:5 V(i) = i^2;fimpara

Page 8: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 8

Ranges

• Para além dos valores inicial e final, um range pode ainda ter opcionalmente um

passo (distância entre valores consecutivos), com a sintaxe ilustrada em baixo.

Nota 1: O passo é opcional, e por omissão vale 1. Assim, 1:5 é equivalente a 1:1:5.

X = zeros(1,7)para i de 1 a 5 (passo 2) V1(i) = i^2;fimpara

X = zeros(6,1)for i = 1:3:6 X(i) = i^2;fimpara

1 2 3 4 5 6 7

1 0 9 0 25 0 49

1 1

2 0

3 0

4 16

5 0

6 0

Page 9: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 9

Ciclos Encadeados

• Em geral, é necessário utilizar tantos ciclos quanto as dimensões da matriz.

• Para aceder a todos os elementos de uma matriz (bidimensional), os ciclos terão de

ser encadeados, podendo.se fazer o “varrimento” por linhas ou colunas.

Varrimento por linhasi é linha e j é a coluna

M = zeros(3,4)for i = 1:3 for j = 1:4 M(i,j) = i*j; endforendfor

1 2 3 4

1 1 2 3 4

2 2 4 6 8

3 3 6 9 12

Varrimento por linhasj é linha e i é a coluna

M = zeros(3,4)for i = 1:4 for j = 1:3 M(j,i) = i*j; endforendfor

1 2 3 4

1 1 2 3 4

2 2 4 6 8

3 3 6 9 12

Page 10: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 10

Gráficos e Vectores

• Em Octave a forma mais simples de desenhar o gráfico de uma função f(x) é utilizar

o comando pre-definido

plot(X,F)

– em que X é um vector que as abcissas consideradas;

– e F é o vector com as ordenadas dos pontos correspondentes.

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

X 0.0 0.1 0.2 0.3 0.4 0.5

F 0.00 0.00 0.01 0.03 0.06 0.13

i 7 8 9 10 11

X 0.6 0.7 0.8 0.9 1.0

F 0.22 0.34 0.51 0.73 1.00

Page 11: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 11

Gráficos e Vectores

• Normalmente, para se obter um gráfico de uma função, basta determinar o valor da

função em n pontos, sendo o n dependente do contexto.

• Por exemplo, se pretendermos o gráfico da função f, calculado em n pontos, no

intervalo de [a .. b] podemos usar a função grafico abaixo

em que f é a função definida

ao lado

function y = grafico_f(a,b,n) dx = (b-a)/(n-1); % distância-x entre pontos X(1) = a; % especificação da 1ª abcissa(x) Y(1) = f(X(1)); % cálculo da 1ª ordenada (y) for i = 2:n % cálculo dos outros pontos X(i) = X(i-1) + dx; % i-ésima abcissa Y(i) = f(X(i)); % i-ésima ordenada endfor plot(X,Y); % desenha o gráfico de fendfunction;

function y = f(x) y = x^3+x^2-x;endfunction;

Page 12: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 12

Gráficos de Várias Funções

• O Octave permite igualmente o desenho simultâneo de várias funções, no mesmo

intervalo X, através do mesmo comando plot(X,M)

• No entanto, o 2º argumento deve ser uma matriz com o mesmo número de colunas

do vector X, e com tantas linhas quantas as funções a mostrar.

• Por exemplo, o gráfico das funções f e g entre os pontos a e b, desenhado com n

pontos, pode ser obtido com a função grafico_fg, semelhante à anterior.

• No entanto, em vez de se determinarem apenas os valores de uma ordenada, e

colocá-las num vector Y (com 1 linha), há que determinar os valores de 2 ordenadas,

e colocá-las numa matriz M com 2 linhas.

i 1 2 3 4 5 6

Vector X

X -2.0 -1.9 -1.8 -1.7 -1.6 -1.5

Matriz M

F = x3 + x2 - x -6.00 -5.15 -4.39 -3.72 -3.14 -2.63

G = x3 + x2 + x 0.00 0.00 0.01 0.03 0.06 0.13

Page 13: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 13

Gráficos de Várias Funções

• Desta forma, a função para desenhar as funções f e g, simultâneamente, pode ser

especificada como

em que f é a função anterior e

g a função definida ao lado

function y = grafico_fg(a,b,n) dx = (b-a)/(n-1); % distância-x entre pontos X(1) = a; % especificação da 1ª abcissa(x) M(1,1) = f(X(1)); % cálculo da 1ª ordenada f(x) M(2,1) = g(X(1)); % cálculo da 1ª ordenada g(x) for i = 2:n % cálculo dos outros pontos X(i) = X(i-1) + dx; % i-ésima abcissa M(1,i) = f(X(i)); % i-ésima ordenada f(x) M(2,i) = g(X(i)); % i-ésima ordenada g(x) endfor plot(X,M); % desenha o gráfico de f e gendfunction;

function y = g(x) y = x^3+x^2+x;endfunction;

Page 14: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 14

Passagem de Funções como Parâmetros

• Nas versões anteriores da função gráfico, não se pode passar como parâmetro a

função a desenhar.

• Em linguagens de alto nível, é geralmente possível fazê-lo, passando as funções por

referência.

• Em Octave, onde não há passagem por referência, pode utilizar-se um “truque”,

passando-se o nome da função como argumento e utilizando-se a função pré-

definida feval, que recebe como 1º argumento o nome da função e nos seguintes

parâmetros os parâmetros da função.

• Uma vez definida a função grafico (no diapositivo seguinte), são “equivalentes” as

chamadas

grafico_f(x,a,b) e grafico(‘f’,x,a,b)

bem como as chamadas

grafico_g(x,a,b) e grafico(‘g’,x,a,b)

Page 15: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 15

Passagem de Funções como Parâmetros

• A função feval, recebe como 1º argumento o nome da função e nos seguintes

parâmetros os parâmetros da função.

• Assim, são equivalentes as chamadas

f(x) e feval(‘f’,x)

• Utilizada na especificação da função grafico, indicada abaixo

function y = grafico(func,a,b,n) dx = (b-a)/(n-1); % distância-x entre pontos X(1) = a; % especificação da 1ª abcissa(x) Y(1) = feval(func,X(1)); % cálculo da 1ª ordenada (y) for i = 2:n % cálculo dos outros pontos X(i) = X(i-1) + dx; % i-ésima abcissa Y(i) = feval(func,X(i)); % i-ésima ordenada endfor plot(X,Y); % desenha o gráfico de fendfunction;

Page 16: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 16

Aproximações de Funções• A possibilidade de mostrar várias funções num gráfico, permite visualizar a

aproximação de funções calculadas através de séries.

• Consideremos por exemplo a função ex, obtida através da série

expo(x) = 1 + x + x2/2! + x3/3!+

• Como já foi visto, a função ex pode ser aproximada pela função = expo(x,n) que

considera os primeiros n termos da série. Essa função pode ser definida como

• Há agora que adaptá-la, para mostrar o gráfico da convergência

function z = expo(x,n)

y = 1;

for i = 1:n

y = y + x^i/fact(i);

endfor

z = y;

endfunction

Page 17: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 17

Aproximações de Funções

function z = expo(x,n)

y = 1; for i = 1:n

y = y + x^i/fact(i); endfor z = y;

endfunction

function z = expo(x,n,p) P(1) = 1; Y(1) = 1; for i = 2:n P(i) = P(i-1)+1; Y(i) = Y(i-1) + x^i/fact(i); endfor z = Y(n); if p plot(P,Y) endifendfunction

• Para esse efeito, é necessário

– Guardar os sucessivos valores de y no vector Y;

– Guardar os sucessivos valores das iterações no vector P;

– Condicionar o desenho do gráfico ao parâmetro p de entrada.

Page 18: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 18

Aproximações de Funções

function z = expo(x,n) P(1) = 1; Y(1) = 1;

for i = 2:n P(i) = P(i-1)+1;

Y(i) = Y(i-1) + x^i/fact(i); endfor z = Y(n+1); plot(P,Y)endfunction

• A mesma técnica pode ser utilizada para a função seno

expo(x) = 1 + x + x2/2! + x3/3! + x4/4! + ...

seno(x) = x – x3/3! + x5/5! - x7/7! + x9/9! ...

(para simplificar mostra-se sempre o gráfico, eliminando-se o parâmetro p)

Para

function z = seno(x,n) P(1) = 1; Y(1) = x; k = 1; s = 1; for i = 2:n P(i) = P(i-1)+1; k = k + 2 ; s = - s; Y(i) = Y(i-1)+ s*x^k/fact(k); endfor z = Y(n); plot(P,Y)endfunction

Page 19: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 19

Aproximações de Funções• Outro exemplo de função obtida por iterações sucessivas é a raiz quadrada, que

vamos aproximar por valores sucessivos do vector R.

1. A raiz do número x, raiz(x) está entre 1 e x. Assim uma primeira aproximação, é

obtida pela média de 1 e x, isto é R(1) = (1+x)/2.

2. Suponhamos que a é um valor aproximado de raiz(x) obtido na iteração i-1, isto

é, R(i-1) = a. Então obtem-se outra aproximação de raiz(x), fazendo b = x/a.

3. Notar que se a > raiz(x) então b < raiz(x) (e vice-versa).

4. Assim, o valor médio c = (a+b)/2 é uma melhor aproximação de raiz(x) do que a

ou b, e podemos usá-lo como a aproximação na iteração seguinte, R(i) = c.

• Isto obtem-se com o seguinte ciclo:

for i = 2:n a = R(i-1); b = x / a; c = (a+b)/2; R(i) = c; endfor

Page 20: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 20

Aproximações de Funções• Eis a função r2(x,k), definida em Octave para determinar a raiz quadrada de x, em k

iterações, mostrando graficamente as várias iterações.

function y = r2(x,k); R(1) = x; % valor inicial for i = 2:k b = R(i-1); % valor da iteração anterior a = x/b; % aproximação para o outro lado R(i) = (a+b)/2; % nova e melhor aproximação endfor y = R(k); plot(R);endfunction

• Notar que a função plot tem um só argumento, pelo que a ordenada toma valores

inteiros (1, 2, 3, ...).

Page 21: Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008

10 Outubro 2007 Matrizes e Gráficos - Trajectória de um Projéctil 21

Aproximações de Funções• A função pode generalizar-se para raiz(n,x,k), definida em Octave para determinar a

raiz de ordem n de x, em k iterações, mostrando graficamente as várias iterações.

function y = raiz(n,x,k); R(1) = x; % valor inicial for i = 2:k b = R(i-1); % valor da iteração anterior a = x/b^(n-1); % aproximação para o outro lado R(i) = (a+b)/2; % nova e melhor aproximação endfor y = R(k); plot(R);endfunction

• Notar que a função raiz é a raiz quadrada para n=2.