Matrizes e Gráficos
Trajectória de Projéctil
Pedro Barahona
DI/FCT/UNL
Introdução aos Computadores e à Programação
2º Semestre 2008/2009
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
y
hmax
f ( x)  y  x t an(a) 
f(a)
g
x 2  y0
2
2
2v0 cos (a)
v0

y0
(0,0)
13 Março 2009
a
dmax
x
Matrizes e Gráficos - Trajectória de um Projéctil
2
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.
Matriz M
1
2
Vector
2
3
U
3
4
Vector V
•
1
2
3
4
5
1
4
9
16
25
1
2
3
4
1
1
2
3
4
5
2
2
4
6
8
7
3
3
6
9
12
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.
13 Março 2009
Matrizes e Gráficos - Trajectória de um Projéctil
3
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]
Matriz M
1
2
Vector
2
3
U
3
4
Vector V
1
2
3
4
5
1
4
9
16
25
13 Março 2009
1
2
3
4
1
1
2
3
4
5
2
2
4
6
8
7
3
3
6
9
12
Matrizes e Gráficos - Trajectória de um Projéctil
4
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)
1
0
Vector
2
0
U1
3
4
Vector V1
•
1
2
3
4
5
1
1
1
1
1
Matriz M1
1
2
3
4
1
1
1
1
1
0
2
1
1
1
1
0
3
1
1
1
1
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.
13 Março 2009
Matrizes e Gráficos - Trajectória de um Projéctil
5
Inicialização de Matrizes
•
Para identificar 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
1
2
Vector
2
3
U
3
4
Vector V
•
1
2
3
4
5
1
4
9
16
25
; M(2,3) = 6
Matriz M
1
2
3
4
1
1
2
3
4
5
2
2
4
6
8
7
3
3
6
9
12
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)
i = 1;
enquanto i <= 5
V(i) = i^2;
i = i+1
fimenquanto
13 Março 2009
i = 1;
while i <= 5
V(i) = i^2;
i = i+1;
endwhile
Matrizes e Gráficos - Trajectória de um Projéctil
6
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
i = 1;
enquanto i <= 5
V(i) = i^2;
i = i+1
fimenquanto
•
para i de 1 a 5
V(i) = i^2;
fimpara
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;
while i <= 5
V(i) = i^2;
i = i+1
endwhile
13 Março 2009
for i = 1:5
V(i) = i^2;
fimpara
Matrizes e Gráficos - Trajectória de um Projéctil
7
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.
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
Nota 1: O passo é opcional, e por omissão vale 1. Assim, 1:5 é equivalente a 1:1:5.
13 Março 2009
Matrizes e Gráficos - Trajectória de um Projéctil
8
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 linhas
i é linha e j é a coluna
M = zeros(3,4)
for i = 1:3
for j = 1:4
M(i,j) = i*j;
endfor
endfor
13 Março 2009
1
2
3
4
1
1
2
3
4
2
2
4
6
3
3
6
9
Varrimento por linhas
j é linha e i é a coluna
M = zeros(3,4)
for j = 1:4
for i = 1:3
M(i,j) = i*j;
endfor
endfor
1
2
3
4
1
1
2
3
4
8
2
2
4
6
8
12
3
3
6
9
12
Matrizes e Gráficos - Trajectória de um Projéctil
9
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.
1.00
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
0.80
0.60
F
i

X
 0.6
F
 0.22 0.34 0.51 0.73 1.00
7
8
9
10
11
0.7
0.8
0.9
1.0
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
13 Março 2009
Matrizes e Gráficos - Trajectória de um Projéctil
10
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
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 f
endfunction;
em que f é uma função definida function y = f(x)
y = sqrt(x) * sin(3*x);
noutro ficheiro, por exemplo
endfunction;
13 Março 2009
Matrizes e Gráficos - Trajectória de um Projéctil
11
Gráficos de Várias Funções
•
O Octave permite o desenho simultâneo de várias funções, com o mesmo comando
plot(X,M), mas em que o 2º argumento é 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.
function y = grafico_fg(a,b,n)
dx = (b-a)/(n-1); X(1) = a;
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 g
endfunction;
Por exemplo, a função g pode
ser definida no ficheiro g.m como
13 Março 2009
function y = g(x)
y = sqrt(x) * sin(3*x) + 1;
endfunction;
Matrizes e Gráficos - Trajectória de um Projéctil
12
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)
e
grafico(‘g’,x,a,b)
bem como as chamadas
grafico_g(x,a,b)
13 Março 2009
Matrizes e Gráficos - Trajectória de um Projéctil
13
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, saõ equivalente 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);
%
X(1) = a;
%
Y(1) = feval(func,X(1));
%
Z(1) = 0;
for i = 2:n
%
X(i) = X(i-1) + dx;
%
Y(i) = feval(func,X(i)); %
Z(i) = 0;
endfor
plot(X,[Z;Y]);
%
endfunction;
13 Março 2009
distância-x entre pontos
especificação da 1ª abcissa(x)
cálculo da 1ª ordenada (y)
cálculo dos outros pontos
i-ésima abcissa
i-ésima ordenada
desenha o gráfico de f
Matrizes e Gráficos - Trajectória de um Projéctil
14
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
•
•
function z = expo(x,n)
y = 1;
for i = 1:n
y = y + x^i/fact(i);
endfor
z = y;
endfunction
Há agora que adaptá-la, para mostrar o gráfico da convergência
13 Março 2009
Matrizes e Gráficos - Trajectória de um Projéctil
15
Aproximações de Funções
•
Para esse efeito, é necessário
– Guardar os sucessivos valores de y no vector Y;
– Guardar os sucessivos valores das iterações no vector P (opcional);
– Condicionar o desenho do gráfico ao parâmetro p de entrada.
function z = expo(x,n)
y = 1;
for i = 1:n
y = y + x^i/fact(i);
endfor
z = y;
endfunction
13 Março 2009
function z = expo(x,n,p)
P(1) = 1;
Y(1) = 1;
for i = 1:n
P(i+1) = P(i)+1;
Y(i+1) = Y(i) + x^i/fact(i);
endfor
z = Y(n+1);
if p
plot(P,Y)
endif
endfunction
Matrizes e Gráficos - Trajectória de um Projéctil
16
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
13 Março 2009
Matrizes e Gráficos - Trajectória de um Projéctil
17
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 (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) = (a+b)/2 .
•
Isto obtem-se com o seguinte ciclo:
for i = 2:n
a = R(i-1);
b = x / a;
R(i) = (a+b)/2;
endfor
13 Março 2009
Matrizes e Gráficos - Trajectória de um Projéctil
18
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) = (1+x)/2;
for i = 2:k
a = R(i-1);
b = x/a;
R(i) = (a+b)/2;
endfor
y = R(k);
plot(R);
endfunction
•
% valor inicial
% valor da iteração anterior
% aproximação para o outro lado
% nova e melhor aproximação
Notar que a função plot tem um só argumento, pelo que a ordenada toma valores
inteiros (1, 2, 3, ...).
13 Março 2009
Matrizes e Gráficos - Trajectória de um Projéctil
19
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) = (1+x)/n;
% valor inicial
for i = 2:k
a = R(i-1);
% valor da iteração anterior
b = x/a^(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.
13 Março 2009
Matrizes e Gráficos - Trajectória de um Projéctil
20
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) = (1+x)/n;
% valor inicial
for i = 2:k
a = R(i-1);
% valor da iteração anterior
b = x/a^(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.
13 Março 2009
Matrizes e Gráficos - Trajectória de um Projéctil
21
Zero de Funções por Bipartição
•
Uma forma mais eficiente de determinar o zero de uma função consiste em localiizar
o zero num intervalo inicial, e sistematicamente partir o intervalo ao meio,
aproveitando o sub-intervalo que contem o zero.
•
Para esse efeito iremos considerar os seguintes vectores, cujos valores se vão
actualizando ao longo das várias iterações
 L – O limite inferior do intervalo que contem o zero (na iteração i)
 U – O limite superior do intervalo que contem o zero (na iteração i)
•
O desenho dos limites inferior e superior permite visualizar a largura do intervalo que
contem a solução, isto é, o erro máximo com que o zero da função é calculado.
•
Em cada iteração deverá proceder-se do seguinte modo:
1. Partir o intervalo ao meio, determinando o seu ponto médio;
2. Verificar se se aproveita a metade inferior ou superior do intervalo anterior; e
3. Parar a bipartição quando o comprimento do intervalo for inferior a um erro
(dado pelo utilizador).
13 Março 2009
Matrizes e Gráficos - Trajectória de um Projéctil
22
Zero de Funções por Bipartição
Geração dos vários intervalos:
1. Se o valor da função no ponto médio tem o mesmo sinal do valor no limite inferior do
intervalo, aproveita-se o sub-intervalo superior, (altera-se o limite inferior).
2. Caso contrário, aproveita-se o sub-intervalo superior, alterando-se o limite inferior.
Denotando por L(i-1) e U(i-1) os limites inferior e superior, respectivamente do intervalo
que contem a solução na iteração “anterior”, os limites da iteração corrente (i) podem ser
calculados da seguinte forma
m = (U(i-1)+L(i-1))/2;
% ponto médio do intervalo anterior
fm = feval(f,m);
% valor da função nesse ponto, e ...
f1 = feval(f,L(i-1));
% ... e no limite inferior
f2 = feval(f,U(i-1));
% ... e no limite inferior
if fm * f1 > 0
L(i) = m; U(i) = U(i-1); % muda o limite inferior
else
U(i) = m; L(i) = L(i-1); % muda o limite superior
endif
13 Março 2009
Matrizes e Gráficos - Trajectória de um Projéctil
23
Zero de Funções por Bipartição
•
Eis o programa completo, com a inicialização, o teste de terminação e o desenho do
gráfico dos limites do intervalo que contem o zero (Nota: a instrução plot, utiliza para
abcissas o vector [1,2...,i], que em Octave se pode definir pelo range [1:i] )
function y = zero_bip(f,a,b,erro);
i = 1; L(1) = a; U(1) = b;
%
do
i = i + 1;
%
m = (L(i-1) + U(i-1))/2;
f1 = feval(f,L(i-1));
f2 = feval(f,U(i-1));
fm = feval(f,m);
if fm * f1 > 0
L(i) = m; U(i) = U(i-1);
else
U(i) = m; L(i) = L(i-1);
endif
until (U(i) - L(i)) < erro
%
y = (L(i) + U(i))/2
%
plot([1:i],[L;U]);
endfunction
13 Março 2009
1ª iteração (inicial)
i-ésima iteração
testa incerteza
retorna melhor aproximação
Matrizes e Gráficos - Trajectória de um Projéctil
24
Download

pp - SSDI