Você está na página 1de 324

Matlab

Notas de Aula
Ricardo Vargas Dorneles
27 de junho de 2016

1 / 324

Layout do Ambiente

Figura: Layout do Ambiente

2 / 324

MATLAB um software interativo de alta performance voltado


para o clculo numrico. O MATLAB integra anlise numrica,
clculo com matrizes, processamento de sinais e construo de
grcos em ambiente fcil de usar onde problemas e solues
so expressos somente como eles so escritos
matematicamente, ao contrrio da programao tradicional.
A Janela de Comando ativada quando se inicializa o
MATLAB, e o "prompt"padro () exibido na tela.
A partir desse ponto, o MATLAB espera as instrues do
usurio.
3 / 324

Janela de Comando

Figura: Janela de Comando

4 / 324

Histrico de Comandos

Figura: Histrico de Comandos (Command History)

5 / 324

Editor de Linhas de Comando

As teclas com setas podem ser usadas para se encontrar


comandos dados anteriormente, para execuo novamente ou
sua reedio.
Por exemplo, suponha que voce entre com
 log (sqt(tan(pi/5)))

Como para calcular a raiz quadrada o comando certo sqrt, o


MATLAB responde com uma mensagem de erro:
??? Undened funcion or variable sqt.

Ao invs de reescrever a linha inteira, simplesmente pressione a


tecla "seta para cima".

6 / 324

O comando errado mostrado novamente , e voce pode,


ento, mover o cursor para trs usando a tecla "seta para
esquerda"ou o ponto de insero com o mouse ao lugar
apropriado para inserir a letra r.
Ento, o comando retorna a resposta apropriada:
>> l o g ( s q r t ( tan ( p i / 5 ) ) )
ans =
0.1597

7 / 324

Outras teclas
Alm das teclas com setas, pode-se usar outras teclas para
reeditar a linha de comando.
A seguir dada uma breve descri o destas teclas:
Seta para cima
retorna linha anterior
Seta para baixo
retorna linha posterior
Seta para a esquerda move um espao para a esquerda
Seta para a direita
move um espao para a direita
Ctrl seta esquerda
move uma palavra para a esquerda
Ctrl seta direita
move uma palavra para a direita
Home
move para o comeo da linha
End
move para o nal da linha
Del
apaga um caracter direita
Backspace
apaga um caracter esquerda
8 / 324

Diretrio Atual

Figura: Lista de diretrios

9 / 324

Editor

Figura: Janela de Comando


10 / 324

Janela de Comando

Figura: Janela de Comando


11 / 324

Janela Grca

Figura: Janela Grca

12 / 324

Primeiros passos
Abra o Matlab (Menu Iniciar->Matemtica->Matlab)
Na janela central (Command Window) digite:
2+3
3*2
32
3/2

Ao ser digitada uma expresso na linha de comando, a


expresso avaliada e o resultado mostradono formato
ans = <resultado>

onde "ans"(answer) a varivel padro que mantm o


resultado da ltima operao.
13 / 324

Pode-se tambm armazenar o resultado da expresso em uma


varivel, bastando para isso atribuir a expresso varivel:
a=1
b=2;
Observaes:
No necessrio declarar as variveis no Matlab. Elas so
criadas medida em que valores so atribudos a elas.
A lista de todas as variveis j criadas, bem como seu tipo e
valor corrente mostrada na janela Workspace, em cima
direita.

14 / 324

Espao de trabalho (variveis)

Figura: Espao de trabalho (Workspace)

15 / 324

Os principais operadores aritmticos e funes em Matlab


so:

+, -, *, /
resto de diviso inteira: rem(X,Y)
x(X) - arredonda em direo a zero
para obter o quociente da diviso inteira utiliza-se a funo x.
Assim, o equivalente a 5\2 seria x(5/2).
round(X) - arredonda para o inteiro mais prximo
potenciao: operador (ex: 3 2)
sqrt(X): raiz quadrada de X

16 / 324

Outras funes menos principais so:

abs(x): calcula o mdulo de X


exp(X): calcula e x
imag(X): somente a parte imaginria de um nmero complexo
ceil(X): arredonda "para cima"
log (X): logaritmo natural de X
conj(X): conjugado de X
log10(X): logaritmo na base 10
sign(X): sinal de X
oor(X): arredonda "para baixo"
real(X): parte real de nmero complexo
17 / 324

Funes trigonomtricas:
asin(X): arco seno
atanh(X): arco tangente hiperblico
cosh(X): coseno hiperblico
sinh(X): seno hiperblico
acos(X): arco coseno
asinh(X): arco seno hiperblico
acosh(X): arco coseno hiperblico
atan(X): arco tangente
tan(X): tangente de X
atan2(x,y):arco tangente de x/y
cos(x): coseno
sin(X): seno
tanh(X): tangente hiperblica
pi: gera o valor de pi (3.1415)
18 / 324

Digite agora:
a=1
b=4
c = 3;

Qual a diferena de digitar uma atribuio com e sem o


ponto-e-vrgula ao nal?

19 / 324

Digite:

delta = sqrt (b 2 - 4 * a * c)
r1 = (-b+delta)/(2*a)
r2 = (-b-delta)/(2*a)

Para que os valores sejam apresentados com mais casas


decimais utiliza-se o comando
format long

20 / 324

Todos os comandos digitados na janela de comando so


armazenados em um histrico (visvel na janela Command
History) e podem ser buscados atravs das teclas de setas para
baixo e para cima.
Digite
B = 2;
e recalcule o delta e as razes reutilizando os comandos que
esto no histrico.
Observe que o contedo de todas as variveis denidas pode
ser visto na janela Workspace.
As variveis do Workspace podem ser apagadas com o
comando clear ou clear <varivel> (ex: clear n)
21 / 324

Edio de Arquivo de Comandos

Alm da execuo direta de comandos na janela de comandos,


o Matlab permite a edio e execuo de arquivos de
comandos possuindo uma linguagem prpria para isso.
Os passos para editar e executar um arquivo de comandos so:
a Selecione no menu File a opo New -> Blank M-File, criando
um arquivo vazio. Aparecer uma janela de edio.
b Digite o programa a seguir:

22 / 324

Edio de Arquivo de Comandos


clear
a=input('Digite o valor de a: ');
b=input('Digite o valor de b: ');
c=input('Digite o valor de c: ');
delta=sqrt(b 2-4*a*c);
raiz1=(-b+delta)/(2*a);
raiz2=(-b-delta)/(2*a);
disp(['as raizes so' num2str(raiz1) ' e ' num2str(raiz2) ])

c) Salve o programa digitado (Menu File -> Save as...)


d) Execute o programa (Menu Debug->Run ou triangulozinho
verde na barra de ferramentas)
O resultado da execuo do programa ser exibido na janela de
comandos. Em caso de erro de sintaxe, a linha e coluna onde
ocorreu o erro sero mostrados.
23 / 324

Os arquivos salvos no Matlab so mostrados na janela Current


Folder. Para melhor ocupar o espao na tela, as janelas que
no sero utilizadas podem ser fechadas e podem ser abertas
novamente no menu Desktop, que dene as janelas ativas.
Observaes sobre o exemplo:
a) A leitura de valores no MATLAB pode ser feita com o
comando input. Seu formato :
variavel = input('mensagem a ser exibida');

24 / 324

Comando de escrita
A escrita de mensagens e valores pode ser feita pelo comando
disp. Seu formato :
disp(texto, varivel ou expresso)
O comando disp exibe apenas um elemento. Se for necessrio
exibir mais de um, os elementos devem ser concatenados com
o operador [ ]. Por exemplo:
disp([a,b]) ou disp([a b])
O operador [ ] exige que os operandos sejam todos do mesmo
tipo.
Assim, se um dos elementos da lista um texto (p.ex.: 'O
valor ' ), os valores numricos devem ser convertidos tambm
para texto com a funo num2str(valor).
Ex: disp(['O resultado ' num2str(valor)])
25 / 324

As razes de uma equao de terceiro grau


a3 x

+ a2 x 2 + a1 x + a0 = 0

pode ser calculada pelo seguinte mtodo:


Inicialmente divida todos os coecientes da equao por a3
para que ela que no formato:
3
2
x + a2 x + a1 x + a0 = 0

26 / 324

Calcule os valores auxiliares:


3a1 a22
9
9a1 a2 27a0 2a23
r =
54
=

= q3 + r 2
q

3
= r+ d
q

3
= r d

Deve-se tomar cuidado ao extrair a raiz cbica no clculo de S e T. Se o nmero a ser extrada a
raiz for negativo, a aplicao do operador de potenciao (x (1/3)) retorna uma das razes
complexas ao invs da real necessria no mtodo.
Pode-se extrair a raiz real usando sign(x)*abs(x) (1/3)
27 / 324

As 3 razes da equao so dadas por:


z1

=s +t

1
a
3 2

1
1
3
z2 = (s + t )
a + i
(s t )
2
3 2
2

1
1
3
z3 = (s + t )
a i
(s t )
2
3 2
2

28 / 324

Exerccios

Faa um programa no Matlab que leia 2 valores e escreva o


maior deles. Dica:O maior entre dois valores quaisquer v1 e v2
pode ser calculado pela expresso v 1+v 2+|2 v 1v 2|
Faa um programa no Matlab que l um valor inteiro em reais
e calcula e escreve qual o menor nmero possvel de notas de
100,50,10,5 e 1 real em que o valor pode ser decomposto.
Dica:Isso pode ser calculado a partir de operaes de diviso
inteira.
Faa um programa no Matlab que l uma quantia inteira em
segundos e escreva o nmero de horas, minutos e segundos
correspondente.
29 / 324

Exerccios
1

Faa um programa no Matlab que l 3 valores, lados de um


tringulo, e calcule e escreva a rea do tringulo formado. Dica: A
rea de um tringulo
p de lados l1, l2 e l3 pode ser calculada pela
expresso Area= S (S l1) (S l2) (S l3) onde S o
semi-permetro, ou seja, a metade da soma dos lados
Faa um programa no Matlab que le um valor entre 0 e 9999 e
calcula a soma dos seus dgitos. Dica: O dgito menos signicativo
de um nmero inteiro pode ser obtido pelo resto da diviso do
nmero por 10. Os dgitos restantes podem ser obtidos pela diviso
inteira por 10.
Faa um programa no Matlab que leia 4 valores, Hi, Mi, Hf, Mf,
representando respectivamente a hora e minuto inicial e nal de um
evento, e calcule a durao do mesmo em horas e minutos.
Considere que o evento inicia e termina no mesmo dia. Dica: Para
simplicar o problema, converta cada par de valores em um nico
valor em minutos.
30 / 324

Alternativas gratuitas ao Matlab

H diversos softwares gratuitos equivalentes ao matlab, com


uma linguagem compatvel. Dois deles so:
FreeMat
Octave

31 / 324

Comando Condicional (Comando SE) no Matlab


O formato do comando condicional no Matlab e seu equivalente em
portugus estruturado

ou

if condicao
comandos
end

se condicao
entao comandos
mse

if condicao
comandos
else
comandos
end

se condicao
entao comandos
senao
comandos
mse
32 / 324

No caso de ifs encadeados, em que o if interno est no "else"do


externo, pode-se usar a verso a seguir:
if condio 1
comandos 1

elseif condio 2
comandos 2

end
Nesse caso, os "end"s dos dois if's so substitudos por um nico
"end"

33 / 324

if condio 1
comandos1
elseif condio 2
comandos2
elseif condio 3
comandos3
else comandos4
end

se

condio 1
entao comandos1
senao se condio 2
entao comandos2
senao se condio 3
entao comandos3
senao comandos4
mse

mse
mse

34 / 324

Os operadores de comparao so:

== - igual
- diferente
>, >=, <, <= - maior, menor, maior ou igual, menor ou igual

e os operadores lgicos (E e OU) so


E - representado por && ou &
OU - representado por || ou |

e o && tem uma prioridade maior que o ||

O & e o | efetuam a avaliao completa da expresso,


enquanto o && e o || efetuam a avaliao otimizada da
expresso

35 / 324

Ex:
clear
a=i n p u t ( ' Entre com o l a d o 1 : ' ) ;
b=i n p u t ( ' Entre com o l a d o 2 : ' ) ;
c=i n p u t ( ' Entre com o l a d o 3 : ' ) ;
i f a<b+c & b<a+c & c<a+b
i f a= =b & b= =c
disp ( ' Equilatero ' )
e l s e i f a= =b | b= =c | a= =c
disp ( ' Issceles ' )
e l s e d i s p ( ' Es ca l en o ' )
end
e l s e d i s p ( ' Sorry , no forma ' )
end
36 / 324

C00002100 - A distncia entre dois pontos denidos pelas


coordenadas
(X1 , Y1 ) e (X2 , Y2 ) dada por
p
(X1 X2 )2 + (Y1 Y2 )2 . Faa um algoritmo que leia 8 valores
representando as coordenadas X e Y de 4 pontos e verique se os
pontos formam um quadrado, escrevendo:
1 - se formam um quadrado;
0 - se no formam.
Considere que os pontos so lidos no sentido horrio, seguindo o
permetro do quadrado.

37 / 324

Figuras geomtricas

38 / 324

C00002150 - Faa um algoritmo que leia oito valores


correspondentes s coordenadas dos quatro vrtices de um
quadriltero convexo no espao cartesiano
(X0 , Y0 , X1 , Y1 , X2 , Y2 , X3 , Y3 ). O algoritmo deve identicar o tipo
de polgono formado escrevendo:
1 - se os 4 pontos formam um quadrado.
2 - se formam um retngulo;
3 - se formam um losango;
4 - se formam um paralelograma;
5 - se formam um papagaio (2 pares de lados adjacentes
iguais. Ex: lados de tamanhos 3,3,4 e 4);
6 - se no formam nenhum dos anteriores.
39 / 324

A distncia (tamanho dos lados) entre dois pontos quaisquer


(Xi , Yi ) e (Xj , Yjp
) pode ser obtida atravs da frmula
(Xi Xj )2 + (Yi Yj )2 .
distXi Yi Xj Yj =
Por exemplo, se os pontos lidos foram (3,2), (0,5), (3,8) e
(6,5), a gura formada um quadrado e o algoritmo escreve 1.
Para que a gura seja um quadrado, os comprimentos das
duas diagonais devem ser iguais, bem como os 4 lados.
Se os pontos lidos foram (4,2), (1,4), (4,6) e (7,4), a gura
formada um losango.
Se os pontos lidos foram (2,3), (0,5), (3,8) e (5,6), a gura
formada um retngulo.
Se os pontos lidos foram (7,3), (0,3), (2,5) e (5,5), a gura
formada no nenhuma das anteriores e o algoritmo escreve 6
.
Os pontos so fornecidos em sentido horrio ao longo do
permetro do quadriltero.
40 / 324

C00003300 - Faa um algoritmo que leia 4 valores


X1 , Y1 , X2 , Y2 , correspondendo s coordenadas do canto
inferior esquerdo e canto superior direito de uma regio
retangular no plano. Leia a seguir dois valores X,Y
correspondendo a um ponto no plano e escreva:

0 - Se o ponto est fora da regio retangular;


1 - Se o ponto est dentro da regio retangular;
2 - Se o ponto est exatamente na borda da regio retangular.

41 / 324

42 / 324

C00001950
Uma fbrica produz um recipiente de plstico com sua tampa
(tambm de plstico).
Ambos os componentes utilizam o mesmo equipamento para
fabricao (ou seja, no podem ser fabricados ao mesmo
tempo).
A fabricao do recipiente consome duas horas; a fabricao
da tampa consome uma hora.
Um cliente deseja o mximo de recipientes (com tampa) para
10 dias.
A fbrica trabalha 24 horas/dia e j dispe de uma quantidade
r de recipientes e t de tampas em seu estoque (no
necessariamente iguais).
Faa um algoritmo que leia os valores de r e t e informe o
mximo de conjuntos recipiente-tampa que ela pode fornecer
em 10 dias.

43 / 324

Comando de seleo mltipla (switch...case)


Parecido com o comando if-else, este comando permite que se
escolha uma opo entre vrias dependendo do resultado de
uma varivel ou expresso.
s w i t c h dia_semana
case 1

d i s p ( ' Domingo ' ) ;


2
d i s p ( ' Segunda F e i r a ' ) ;
case 3
d i s p ( ' Tera F e i r a ' ) ;
case 4
d i s p ( ' Quarta F e i r a ' ) ;
case 5
d i s p ( ' Quinta F e i r a ' ) ;
case 6
d i s p ( ' Sexta F e i r a ' ) ;
case 7
d i s p ( ' Sbado ' ) ;
otherwise
d i s p ( ' Dia i n v l i d o ' ) ;
end ;
case

44 / 324

Observaes
Cada case pode conter uma lista de comandos;
Os valores nos cases no precisam estar em qualquer ordem;
Caso haja mais de uma entrada com o mesmo valor, o matlab
executar somente os comandos da primeira entrada
encontrada;
Pode-se ter entradas com mais de um valor. Nesse caso os
diferentes valores so agrupados com {}. Ex:
case {1, 2}

Se o valor testado no for igual a nenhuma das entradas, sero


executados os comandos da entrada otherwise
Se no houver uma entrada otherwise, no ser executado
nenhum comando
45 / 324

Comando fprintf

O fprintf outro comando de escrita, mais exvel que o disp.


Entre as vantagens em relao ao disp ele permite:
Manter o curso na mesma linha, permitindo que diversos
comandos fprintf escrevam na mesma linha;
Escrever elementos de tipos diferentes sem precisar de
converso;

Seu formato :

fprintf(especicador de formato, lista de variveis)

onde o especicador de formato contem a mensagem a ser


escrita e a lista de variveis contem as variveis cujos valores
sero inseridos na mensagem.
46 / 324

A funo fprintf( ) tem como primeiro parmetro a mensagem


a ser mostrada na tela. Ex: fprintf('Oi').
Se essa mensagem deve conter o valor de variveis ou o
resultado de expresses, as variveis e expresses so listadas
imediatamente aps a mensagem. Ex:
a=3;
b=5;
fprintf(' A soma de %d e %d vale %d',a,b,a+b).
O exemplo acima mostrar a mensagem 'A soma de 3 e 5 vale
8'.
47 / 324

Para exibir valores de variveis e expresses, a mensagem deve


conter uma indicao do local na mensagem onde sero
inseridos os valores das variveis e expresses.
Esses indicadores de posio tem o formato %d, se o valor a
ser inserido for inteiro, e %f se o valor a ser inserido for oat.
Os indicadores de posio devem ser em mesmo nmero dos
elementos a serem inseridos, e na mesma ordem.
Tambm podem ser utilizados caracteres de formatao na
mensagem.
O principal caracter o \n que causa uma quebra de linha no
ponto onde foi inserido.
48 / 324

1) Faa um algoritmo que leia um valor em reais e o escreva por


extenso. Ex: 523,45
Quinhentos e vinte e trs reais e quarenta e cinco centavos

49 / 324

Estruturas de repetio no Matlab

O Matlab possui duas estruturas de repetio, o While


(enquanto) e o For (para).
O While totalmente equivalente ao "Enquanto"da linguagem
de algoritmos e o "For" razoavelmente equivalente ao
"Para"da linguagem de algoritmos.
O formato do "While":
while condio
end

comandos

50 / 324

Equivalncia entre o

enquanto e o while

i1
enquanto i<=10 faca
escreva(i)
ii+1
menquanto

i = 1;
while i<=10
end

disp(i)
i=i+1;

51 / 324

e o formato do comando for :

for variavel=valor_inicial : incremento : valor_nal


end

comandos

onde o incremento opcional, e se no for especicado,


assume-se que 1.
Ao contrrio do "Para"de algoritmos, a varivel de controle e o
valor do incremento podem ser valores reais, com casas
decimais.

52 / 324

Equivalncia entre o

para e o for

para i de 1 ate 20 passo 2 faca


escreva(i)
mpara

for i=1:2:20
end

disp(i)

53 / 324

ex:
soma=0;
f o r i =1:10
soma=soma+i ;
end
d i s p ( soma )
como o incremento no especicado, assumido ser 1.

54 / 324

Faa um script no Matlab que escreva os valores do seno de x


para x variando de 0 at 2 em incrementos de 0.01.
for x=0:0.01:2*pi
fprintf('%f %f \n',x,sin(x));

end
Altere o script para que escreva em cada linha, alm do seno,
tambm o coseno, tangente, cotangente (1/tangente), secante
(1/coseno) e cosecante (1/seno) de x.

55 / 324

Altere o script anterior para que a cada 10 linhas ele escreva o


cabealho "x seno coseno tangente cotangente secante
cosecante"alinhado com a tabela
for x=0:0.01:2*pi

fprintf('%7.2f %7.2f %7.2f %7.2f\n',x,sin(x),cos(x),tan(x))


if round(rem(x*100,10))==0

end

end

fprintf('\n x seno coseno tangente\n\n')

56 / 324

Desenho de grcos de funes no Matlab

Uma das funcionalidades mais atraentes do Matlab a


possibilidade de plotar grcos de funes em 2 e 3 dimenses.
O comando para desenhar funes no Matlab o comando
plot.
Inicialmente pode-se utilizar o comando plot de duas formas:
plot(X,Y): plota o ponto X,Y na janela de grcos
plot(X,Y,tipo): plota o ponto X,Y na janela grca
especicando o tipo de ponto e cor pela tabela a seguir:

57 / 324

Cores
Marcadores
smbolo descrio
smbolo
y
amarelo
.
m
lils
*
c
azul claro
o
r
vermelho
+
g
verde
x
b
azul escuro
s
w
branco
d
k
preto
v

<
>
p
h

descrio
ponto
asterisco
crculo
+
x
quadrado
losango
tringulo para baixo
tringulo para cima
tringulo p/ esquerda
tringulo p/ direita
pentagrama
hexagrama

58 / 324

O comando plot abre a janela grca, desenha eixos


compatveis com o valor (ou valores) plotado e desenha o
ponto.
possvel desenhar mais de um ponto em um mesmo
comando plot (plot(X1 , Y1 , X2 , Y2 , X3 , Y3 , ...))
Para poder visualizar cada ponto medida em que so
plotados, pode-se usar o comando pause (tempo em segundos)
f o r i =0:0.01:10 p i

end

plot ( i , sin ( i ) , 'v ' )


pause ( 0 . 1 )

59 / 324

Para evitar que os eixos e a janela sejam redimensionados a


cada novo ponto plotado, pode-se utilizar o comando
axis([Xmin Xmax Ymin Ymax])
No exemplo abaixo, como a funo seno vai de -1 a 1, pode-se
plotar um ponto em (0, 1) e um em (10 pi , 1)
O comando hold on faz com que todos os plots subsequentes
sejam feitos na mesma janela, ao invs de criar uma janela a
cada vez
Para "desligar"o comando hold on, usa-se o comando hold o
Isso permite visualizar todo o grco da funo.

a x i s ( [ 0 10 p i 1 1 ] )
hold on
f o r i =0:0.01:10 p i
plot ( i , sin ( i ) , 'v ' )
pause ( 0 . 1 )
hold on

60 / 324

Faa programas no Matlab para plotar cada uma das funes a


seguir, com intervalos de 0.01:
0.5x cos (6x ) para 2 x 4
y = 3.5
3
y = 3x 26x + 10 e suas derivadas primeira e segunda para
2 x 4 na mesma janela grca, com estilos diferentes.

61 / 324

Comandos para formatao de grcos

xlabel('texto') - Cria um label prximo ao eixo X


ylabel('texto') - Cria um label prximo ao eixo Y
title('texto') - Acrescenta um ttulo ao grco
grid - Desenha uma grade no grco
text(x,y,'texto') - Posiciona o texto com o primeiro caracter na
posio indicada por x,y
gtext('texto') - Posiciona o texto na posio indicada pelo
usurio com o mouse ao executar o comando.

62 / 324

Escreva um programa no Matlab para plotar 1 ciclo da onda


triangular abaixo:

63 / 324

Altere o programa anterior para plotar 10 ciclos da onda


triangular abaixo:

64 / 324

Faa um script no Matlab para plotar a trajetria de um


projtil com velocidade inicial v0 e ngulo de lanamento
fornecidos pelo usurio. Despreze a resistncia do ar.
Considere como coordenada x a distncia horizontal percorrida
e como coordenada y a altitude a cada instante.
A distncia horizontal percorrida pelo projtil dada pela
expresso v0x t, onde v0x a componente horizontal da
velocidade, dada por v0 cos ()
A altitude do 2projtil a cada instante dada pela expresso
h = v0y t at2 onde a a acelerao da gravidade (9.8 m/s 2 )
e v0y a componente vertical da velocidade (v0 sin()).
O ngulo deve ser digitado pelo usurio, em graus, e o script
deve convert-lo para radianos para poder utilizar as funes
trigonomtricas do Matlab (que trabalham em radianos).

65 / 324

Para plotar os eixos devemos saber qual o valor mximo de t,


ou seja, qual o ponto onde o projtil atinge o solo (h=0):
2

h = v0y t at2
2
v0y t = at2
v0y = at2
tmax = 2va0y

=0

66 / 324

Para plotar os eixos devemos saber tambm qual a altura


mxima alcanada pelo projtil. Podemos encontrar o t da
altura mxima derivando a funo da altura e igualando a 0:
2

h = v0y t at2
h0 = v0y 22at
thnax = va0y

= v0y at = 0
2

hmax

v0y

2a

67 / 324

clear ;
v=i n p u t ( ' Entre com a v e l o c i d a d e ' ) ;
angulo=i n p u t ( ' Entre com o angulo ' ) ;
angr=angulo 2 p i /360;
vx=v cos ( angr ) ;
vy=v s i n ( angr ) ;
t f =2 vy / 9 . 8 ;
hmax=vy ^ 2 / ( 2 9 . 8 ) ;
a x i s ( [ 0 vx t f 0 hmax ] )
hold on
f o r t =0: t f /100: t f
a l t= vy t 9.8 t ^2/2
d i s t=vx t
plot ( dist , alt , ' ' )
hold on
pause ( 0 . 0 0 5 )
end
68 / 324

69 / 324

Altere o script anterior para que o projtil, ao atingir o cho, pique


3 vezes, a cada vez com uma velocidade igual metade da
velocidade anterior

70 / 324

% p r i m e i r a s l i n h a s i g u a i s ao a n t e r i o r
a x i s ( [ 0 vx t f 0 hmax ] )
hold on
d i s t t o t a l =0;
f o r k=1:4
f o r t =0: t f /1000: t f
a l t= vy t 9.8 t ^2/2
d i s t=vx t
p l o t ( d i s t+d i s t t o t a l , a l t )
hold on
end
d i s t t o t a l=d i s t t o t a l+d i s t ;
v=v /2;
vx=v cos ( angr ) ;
vy=v s i n ( angr ) ;
t f =2 vy / 9 . 8 ;
a x i s ( [ 0 vx t f+d i s t t o t a l 0 hmax ] )
end

71 / 324

Uma onda quadrada de frequncia f pode ser representada


como um somatrio innito de senoides como:
4
1
1
(sin(2 ft ) + sin(6 ft ) + sin(10 ft ) + ...)

3
5
ou, de modo geral...

4X
sin (2(2k 1)ft )

(2 k 1 )
k =1

72 / 324

A gura abaixo mostra uma aproximao de onda quadrada


com duas senides:

73 / 324

a x i s ( [ 0 2 4/ p i 4/ p i ] )
f =2;
hold on
f o r t =0:0.001:2
y=4/ p i ( s i n (2 p i f t )+1/3 s i n (6 p i f t ) ) ;
plot (t , y)
hold on
end

74 / 324

Comando subplot

O comando subplot permite desenhar diversos grcos em


diferentes eixos usando a mesma janela grca.
Seu formato :
subplot(m,n,p)

que cria m.n subgrafos na janela corrente organizados em m


linhas e n colunas.
a partir da execuo do comando subplot, todos os comandos
referentes a janela grca iro se referir ao subgrafo selecionao
no parmetro p.

75 / 324

O script abaixo plota os gracos de seno em coseno em


subjanelas separadas:
subplot (2 ,1 ,1)
a x i s ( [ 0 2 p i 1 1 ] )
hold on
subplot (2 ,1 ,2)
a x i s ( [ 0 2 p i 1 1 ] )
hold on
f o r i =0:0.01:2 p i
subplot (2 ,1 ,1)
plot ( i , sin ( i ) , ' r ' )
hold on
subplot (2 ,1 ,2)
p l o t ( i , cos ( i ) , ' g ' )
hold on
pause ( 0 . 0 1 )
end

76 / 324

77 / 324

Para criar vrias janelas grcas simultaneamente, usa-se o


comando x=gure(n), onde n o nmero da janela a ser
criada e x pode ser utilizado para fazer com que a janela
associada seja mostrada sobre as outras.
Ex:
h1 = gure;
... plot commands ...
h2 = gure;
... plot commands ...
gure(h2) % mostra a janela h2 sobre as outras

78 / 324

Questes de provas anteriores


1) Escreva um script no matlab para plotar 5 ciclos da onda
trapezoidal mostrada abaixo (as coordenadas assinaladas na gura
representam os vrtices do trapzio).

79 / 324

2) Considere um reservatrio com trs segmentos cilndricos ,


conforme o diagrama abaixo:

80 / 324

Faa um script no Matlab que leia as dimenses R1, H1, R2,


H2, R3 e H3 e a vazo da gua preenchendo o reservatrio em
litros/segundo e plote a altura atingida pela gua em funo
do tempo at o preenchimento total do reservatrio. Considere
que o volume de um cilindro dado por r 2 h. E considere que
1 metro cbico equivale a 1000 litros.

81 / 324

3) A funo abaixo descreve a altitude de um modelo de foguete


desde o momento em que disparado at o momento em que
atinge o solo. Escreva um script no matlab para plotar a altitude
em funo do tempo desde o disparo at o momento em que atinge
o solo:
p /t 1
50 t 2
50
+ 50(t 1) 5(t 1)2 p /t > 1 e t 8
h (t ) =

155 20(t 8)
p /t > 8
e
t <= 15.75

82 / 324

4) Um resistor, R=4, e um indutor, L=1.3 H, so conectados em


um circuito a uma fonte de tenso conforme a gura abaixo.
Quando a fonte de tenso aplica uma onda retangular de amplitude
V=12 V de durao 0.5 segundos, mostrado na gura abaixo.

83 / 324

A corrente i(t) no circuito dada por:


 V
(Rt )/L )
R (1 e
i (t ) =
V e (Rt )/L (e (0.5R )/L 1)
R

0 t 0.5s
0.5 t
Faa um script no Matlab para plotar a corrente no circuito em
funo do tempo para 0 t 2 com um passo de 0.001.
/
p/
p

84 / 324

5) A velocidade de uma partcula que se move ao longo de uma


linha reta, como funo do tempo, dada pelas equaes abaixo:

1.4t

14
+ 5sin( 10
(t 10))
v (t ) =
9

9 95 (t 35)

/
/
p/
p/

0 t 10 s
10 t 25 s
25 t 35 s
35 t 40 s

Faa um script no Matlab para plotar a velocidade da partcula em


funo do tempo para 0 t 40 com um passo de 0.01.

85 / 324

Resumo
plot(X,Y): plota o ponto X,Y na janela de grcos
axis([Xmin Xmax Ymin Ymax]): dene os limites da janela
grca
hold on: mantem a janela atual como ativa. Deve ser dado a
cada plot e axis
for id=1:2:10...end para id de 1 ate 10 passo 2 faca...
if...elseif...elseif...else...end se...senao se ...senao
se...senao...mse
clear: apaga todas as variveis
exp(x): e x
sin(x): seno(x)
pi:
86 / 324

Comandos

Break e Continue

O comando break utilizado para interromper um lao (while


ou for) em qualquer ponto de uma iterao.
Ao executar o comando break, imediatamente interrompida
a execuo da iterao corrente e termina a execuo do
comando de repetio.
As repeties restantes (se ainda havia alguma) no so mais
executadas.

87 / 324

Comandos

Break e Continue

O comando continue utilizado para interromper a iterao


corrente de um lao (while ou for) em qualquer ponto de uma
iterao.
Ao executar o comando continue, imediatamente
interrompida a execuo da iterao corrente, mas a execuo
do lao reinicia na prxima iterao e as iteraes restantes (se
ainda havia alguma) so executadas.

88 / 324

Alguns exemplos do uso de repetio no Matlab:


f o r i =0:0.01:20 p i
p l o t ( i cos ( i ) , i s i n ( i ) , 60 , 60 ,60 ,60)
pause ( 0 . 0 0 0 1 )
hold on
end

89 / 324

f o r i =0:0.1:20 p i

p l o t ( i cos ( i ) , i s i n ( i ) , ' ' , 70 , 70 ,70 ,70)


hold on
pause ( 0 . 0 0 2 )
end
vo=100
f o r i =1:.1:20
a l t= vo i 10 i ^2/2
p l o t ( i , a l t , ' ' ,0 ,0 ,25 ,500)
pause ( 0 . 0 0 5 )
end
90 / 324

Referncias

MATLAB - An Introduction With Applications, Amos Gilat


Programao em MATLAB para engenheiros, Stephen
Chapman
MATLAB for Engineers, Adrian Biran e Moshe Breiner

91 / 324

Gilat 3.9 - ex. 8

Use o MATLAB para mostrar que a soma da srie innita


1

n=0
(2n + 1)(2n + 2)
converge para ln 2. Faa isso calculando o somatrio para:
a) n=50
b) n=500
c) n=5000

Para cada somatrio, calcule e escreva a diferena entre o


valor obtido e o valor de ln 2 calculado pelo MATLAB

92 / 324

soma=0;
f o r i =2:2:100
soma=soma+i ;
end
d i s p ( soma )

93 / 324

O MDC (mximo divisor comum) entre dois nmeros n1 e n2


o maior nmero que divisor de n1 e de n2.
Faa um programa que leia dois nmeros e escreva seu MDC.
a
9
9
9
9

Uma alternativa procurar a partir de algum dos nmeros,


decrementando o MDC at encontrar um valor que seja divisor
dos dois

b MDC
6 6 divide b, mas no divide a
6 5 no divide nenhum dos dois
6 4 no divide nenhum dos dois
6 3 Achei!!! divide a e b

94 / 324

Outra alternativa decompor os dois nmeros em seus fatores


primos (exerccio 3000 e teste de mesa da primeira aula de
repetio).
O MDC o produto dos fatores primos comuns aos 2

a b divisores
30 50
2
divide a e b, entra no MDC
3
divide somente o a. No entra no MDC
15 25
5 25
5
divide a e b, entra no MDC
5
divide somente o b, no entra no MDC
1 5
1 1
m da fatorao. MDC 2 * 5 = 10

95 / 324

Outra alternativa utilizar a funo gcd (greatest common


divider) do matlab, que retorna o mximo divisor comum entre
dois nmeros.
Seu formato gcd(a,b)

96 / 324

O fatorial de um nmero N (representado por N!) o produto


de todos os nmeros de 1 a N. Assim, 4! = 1 x 2 x 3 x 4 =
24. Faa um programa que leia um nmero N e escreva seu
fatorial.
Obs: O Matlab tem uma funo pronta para o clculo do
fatorial. a factorial(n).

O nmero de combinaes (nas combinaes, ao contrrio dos


arranjos, a ordem dos elementos no faz diferena) de N
diferentes objetos em grupos de P objetos dado por
N!
P !(N P )! . Faa um programa que leia uma quantidade N de
objetos e o tamanho P dos grupos a serem formados, e calcule
e escreva a quantidade de grupos que podem ser formados.
97 / 324

Faa um programa que leia 10 valores inteiros menores que 20


e, para cada um, calcule e escreva seu fatorial. O programa
deve ignorar todos os valores maiores ou iguais a 20.
O MMC (mnimo mltiplo comum) entre dois nmeros n1 e
n2 o menor nmero que mltiplo de n1 e de n2. Faa um
programa que leia dois nmeros e escreva seu MMC.
Obs: O Matlab tem uma funo pronta para o clculo do
MMC. a lcm(n) (least common multiple).

98 / 324

Faa um programa no Matlab que calcule e escreva a soma dos


100 primeiros termos da sequncia a seguir: 1+3+5+7+9....
Faa um programa no Matlab que calcule e escreva a soma
dos 100 primeiros termos da sequncia a seguir:
1 1 1 1 1
+ + + + + ...
1 3 5 7 9
Faa um programa no Matlab que leia um valor X e calcule e
escreva a soma dos 100 primeiros termos da sequncia a seguir:
X

+ ...

99 / 324

Faa um programa no Matlab que leia um valor X e calcule e


escreva a soma dos 100 primeiros termos da sequncia a seguir:
X

...

1 3 5 7 9
Faa um programa no Matlab que leia um valor N e escreva a
soma dos N primeiros termos da srie a seguir:
1 1 1 1 1 1 1
+ + + +
+
+
+ ...
2 3 5 7 11 13 17
ou seja, a srie onde os denominadores so os nmeros primos
100 / 324

Faa um programa no Matlab que calcule e escreva a soma


dos termos da srie a seguir
1 1 1 1 1 1
+ + ...
1! 2! 3! 4! 5! 6!
at que o valor absoluto de um termo seja menor que 0.00001.

101 / 324

O valor de pi pode ser calculado pelo produto dos termos da


srie de John Wallis, a seguir:

22446688
= . . . . . . . ...
2 13355779
Escreva um script em Matlab que gere uma tabela para o valor
de pela srie descrita utilizando de 1 at 100 termos.
Mostre tambm, para cada valor calculado, a diferena em
relao ao valor de pi fornecido pelo Matlab.

102 / 324

O valor de pi tambm pode ser calculado pelo somatrio dos


termos da srie de David Bailey, a seguir:

X
4
2
1
1
1

)
=
( )k (
16
8
k + 1
8
k + 4
8
k + 5
8
k + 6
k =0
Escreva um script em Matlab que gere uma tabela para o valor
de pela srie descrita utilizando de 1 at 10 termos.
Mostre tambm, para cada valor calculado, a diferena em
relao ao valor de pi fornecido pelo Matlab.

103 / 324

clear ;
clc ;
soma=0;
f o r k=0:9
soma=soma+(1/16)^k (4/(8 k+1) 2/(8 k+4) 1/(8 k+5) 1/(8 k +6));
f p r i n t f ( '%2d termos p i =%10.8 f e r r o =%10.8 f \n ' , k+1,soma , abs ( pi soma ) ) ;
end

104 / 324

Gerao de Valores Aleatrios


Em aplicaes de engenharia comum o uso de dados
simulados para testar sistemas, antes de submet-los a dados
reais.
Esses dados simulados, frequentemente contm valores
aleatrios, para simular a presena de rudos ou outras
situaes.
Um gerador de nmeros aleatrios uma funo que retorna
um nmero distinto e aparentemente aleatrio cada vez que
chamada.
Como esses valores no so realmente aleatrios, mas gerados
por uma funo matemtica bem denida, tambm so
chamados de pseudo-aleatrios
105 / 324

Uma funo matemtica que gera um valor pseudo-aleatrio


a seguinte:
ni +1 = (8121 ni + 28411)%134456

Essa funo, como a maioria das funes de gerao de valores


aleatrios, utiliza o ltimo nmero que foi gerado para gerar o
prximo valor.
Escreva um script no Matlab que gere 1000 pares de
coordenadas aleatrios no intervalo [-10;10], com a funo
dada, plotando um asterisco na posio dada por cada par.

106 / 324

a x i s ([ 10 10 10 1 0 ] )
hold on
y=0;
f o r i =0:1000
x=rem (8121 y +28411 ,134456)
y=rem (8121 x +28411 ,134456)
p l o t ( x /134456 20 10 , y /134456 20 10 , ' ' )
hold on
pause ( 0 . 0 1 )
end

107 / 324

108 / 324

Diagramas Polares

O MATLAB possui uma funo chamada polar que desenha


dados usando coordenadas polares. A forma bsica dessa
funo :
polar(,r)
onde o ngulo em radianos e r o raio.

Ex: O ganho de um microfone cardiide funo do angulo


segundo a equao:
Ganho=2g(1+cos )
onde g uma constante diferente para cada microfone

o script a seguir plota o ganho para um microfone de g=0.5


109 / 324

g=0.5
f o r t h e t a =0: p i /200:2 p i
r =2 g (1+ cos ( t h e t a ) )
p o l a r ( theta , r )
hold on
end

110 / 324

111 / 324

A equao da reta que passa por dois pontos (x1 ,y1 ) e (x2 ,y2 )
dada por y = ax + b onde a o coeciente angular, obtido a
partir de yx xy11 = xy22 xy11 .
y2 y1
a =
x2 x1 e b = y1 ax1
Faa um script no Matlab que leia as coordenadas de dois
pontos (x1 ,y1 ) e (x2 ,y2 ) e desenhe uma reta ligando os dois
pontos.
A reta deve ser plotada com 1000 pontos e os eixos devem
estar distanciados uma unidade das extremidades da reta.

112 / 324

113 / 324

A funo line([x1 x2 ],[y1 y2 ]) tem o mesmo efeito do script


anterior, plotando uma linha entre (x1 ,y1 ) e (x2 ,y2 )

114 / 324

A tenso ao longo do tempo em um capacitor inicialmente


descarregado em um circuito RC como o dado abaixo dado
por:
t
v0 (t ) = Vs (1 e RC )

115 / 324

Faa um script no Matlab para plotar a tenso no capacitor ao


longo do tempo para os seguintes valores (um grco para
cada resistor):
Vs = 10 Volts
C = 0.000001 (10e-6)
t = 0 : 0.005 : 0.35
R1 = 50000 e R2 =100000

116 / 324

Vs=10;
R1=50000;
R2=100000;
C=0.000001;
a x i s ( [ 0 0.35 0 Vs ] )
hold on
for t =0:0.001:0.35
p l o t ( t , Vs (1 exp( t /(R1 C ) ) ) )
hold on
p l o t ( t , Vs (1 exp( t /(R2 C ) ) ) , ' ' )
hold on
end
l e g e n d ( [ 'RC_1=' num2str (R1 C ) ] , . . .
[ 'RC_2=' num2str (R2 C ) ] , ' l o c a t i o n ' , ' b e s t ' )
117 / 324

118 / 324

E a tenso ao longo do tempo durante a descarga em um


capacitor inicialmente com tenso igual a E em um circuito
RC como o dado abaixo dado por:
t

( ) = E (e RC )

Vo t

119 / 324

Faa um script no Matlab para plotar a tenso no capacitor


sendo descarregado ao longo do tempo para os seguintes
valores (um grco para cada valor de tenso inicial):
Vs1 = 8 Volts
Vs2 = 5 Volts
C = 0.000001 (10e-6)
t = 0 : 0.005 : 0.35
R=100000

120 / 324

Faa um script no Matlab para plotar a tenso no capacitor


durante uma carga de 0.3 segundos e imediatamente aps uma
descarga de 0.3 segundos para os seguintes valores:
Vs = 10 Volts
C = 0.000001 (10e-6)
R=100000

121 / 324

Diagramas Polares

O MATLAB possui uma funo chamada polar que desenha


dados usando coordenadas polares. A forma bsica dessa
funo :
polar(,r)
onde o ngulo em radianos e r o raio.

Ex: O ganho de um microfone cardiide funo do angulo


segundo a equao:
Ganho=2g(1+cos )
onde g uma constante diferente para cada microfone

o script a seguir plota o ganho para um microfone de g=0.5


122 / 324

g=0.5
for theta=0:pi/200:2*pi
r=2*g*(1+cos(theta))
polar(theta,r)
hold on
end

123 / 324

124 / 324

Desenho de rbitas

Quando um satlite gira em torno da Terra, a rbita do satlite


forma uma elipse com a terra em um dos pontos focais. A rbita
do satlite pode se expressa, em coordenadas polares, como
=

1  cos
onde r e so a distncia e o ngulo do satlite medidos a partir
do centro da Terra, p um parmetro que especica o tamanho da
rbita e  um parmetro que representa a excentricidade da rbita.
Considere um satlite com p=1000 kms. Desenhe a rbita desse
satlite para  = 0,  = 0.5 e  = 0.7
r

125 / 324

A espiral de Arquimedes

A espiral de Arquimedes uma curva descrita em coordenadas


polares pela equao r = k , onde r a distncia de um
ponto origem e o ngulo desse ponto em radianos em
relao origem.
Desenhe a espiral de Arquimedes para 0 6 com k=0.5.

126 / 324

A equao da reta que passa por dois pontos (x1 ,y1 ) e (x2 ,y2 )
dada por y = ax + b onde a o coeciente angular, obtido a
partir de yx xy11 = xy22 xy11 .
y2 y1
a =
x2 x1 e b = y1 ax1
Faa um script no Matlab que leia as coordenadas de dois
pontos (x1 ,y1 ) e (x2 ,y2 ) e desenhe uma reta ligando os dois
pontos.
A reta deve ser plotada com 1000 pontos e os eixos devem
estar distanciados uma unidade das extremidades da reta.

127 / 324

Vetores em Matlab

Vetores em Matlab iniciam na posio 1.


Para referenciar um elemento no Matlab, usa-se o nmero do
ndice entre parnteses.
Ex: A(1)=3; A(i)=A(i+1);

Faa um script no Matlab para ler 10 nmeros e escrev-los


em ordem crescente.
No Matlab pode-se escrever um vetor inteiro de uma vez s,
com disp(V).

128 / 324

Pode-se ordenar os elementos de um vetor utilizando a funo


sort( )
Ex: A=sort(B);

[B,I]=sort(A)

- retorna em B o vetor A ordenado e em I as


posies originais que cada elemento ocupava no vetor A.
Um dos recursos mais poderosos do Matlab a possibilidade
de efetuar operaes sobre vetores em uma nica operao.

129 / 324

A gerao de vetores em Matlab pode ser feita atravs do


caracter "dois pontos". A declarao
x=1: 5

gera um vetor linha contendo os nmeros de 1 a 5 com


incremento unitrio.
Outros incrementos, diferentes de um, podem ser usados.
 y = 0 : pi/4 : pi

Incrementos negativos tambm so possveis.


 z = 6 : -1 : 1

130 / 324

Pode-se, tambm, gerar vetores usando a funo linspace. Por


exemplo,
 k = linspace (0, l, 6)

gera um vetor linearmente espaado de 0 a 1, contendo 6


elementos.
Para se criar um vetor j inicializado com valores pr-denidos,
usa-se colchetes:
a = [1 3 5 7 9]

cria um vetor de 5 posies com os valores 1,3,5,7 e 9.

131 / 324

O uso de vetores inicializados permite solues iterativas mais


interessantes para diversos problemas j vistos.
S00000700 - Faa um algoritmo que l um valor inteiro em
reais e calcula e escreve qual o menor nmero possvel de
notas de 100,50,20,10,5,2 e 1 real em que o valor pode ser
decomposto. Dica:Isso pode ser calculado a partir de
operaes de diviso inteira.
vnotas=[100 50 20 10 5 2 1];
valor=input('valor:');
for i=1:7
fprintf('%d notas de %d\n',x(valor/vnotas(i)),vnotas(i));
valor=rem(valor,vnotas(i));
end
132 / 324

Gerao de um vetor com valores randmicos


rand (1,n) - Retorna um vetor de n elementos com nmeros
randmicos reais entre 0 e 1.

Ex: V=rand(1,100) gera um vetor de 100 valores reais entre 0


e1
Como fazer para gerar um vetor de inteiros entre, digamos, 1 e
10?
V=rand(1,100)*100 multiplica por 100 cada valor do vetor,
transformando o intervalo [0..1] em um intervalo [0..100]
V=rand(1,100)*100+10 soma 10 a cada valor do vetor,
transladando o intervalo [0..100] para o intervalo [10..110]
Para gerar valores em um intervalo [a..b] multiplica-se o
resultado do rand pelo comprimento do intervalo (b-a) e
soma-se o valor inicial do intervalo (a)
Para gerar um intervalo de valores entre 20 e 30:
V=rand(1,100)*10+20

Para gerar um vetor de inteiros, aplica-se o x:


VI=x(rand(1,100)*10);

133 / 324

As funes numricas (sin, abs, sqrt...) podem ser aplicadas a


vetores, e resultam em vetores em que cada elemento tem o
valor da funo aplicada ao elemento correspondente. Assim
b = sin(a)

retorna um vetor b em que cada elemento tem o seno do


elemento correspondente em a.
C=dot(A,B) retorna o produto escalar (dot product) entre os
vetores A e B.

134 / 324

H verses dos operadores aritmticos que podem ser


aplicados a vetores, efetuando a operao elemento a
elemento. So eles:

.* - multiplicao
./ - diviso
.\ - diviso esquerda (divide o operando da direita pelo da
esquerda)
. - potenciao

135 / 324

Os operadores de soma e subtrao normais podem ser


aplicados a vetores. Os operadores listados acima, quando
aplicados a vetores, correspondem operaao matricial
correspondente. Ex: M1*M2 denota o produto matricial entre
M1 e M2.
O que resulta do trecho de cdigo a seguir?:
A=[1 2 3];
B=[2 3 5];
C=A*B;

136 / 324

O cdigo acima gerar um erro, porque o operador * o


operador de produto matricial, e para efetuar o produto
matricial entre duas matrizes, o nmero de colunas da primeira
matriz deve ser igual ao nmero de linhas da segunda.
Para que o produto matricial seja possvel, o segundo vetor
deve ser um vetor coluna, com apenas uma coluna.
Isso pode ser obtido colocando um ponto-e-vrgula entre cada
elemento na hora de inicializar o vetor:
B=[2; 3; 5]
agora A tem uma linha e trs colunas, e B tem uma coluna e 3
linhas, permitindo o produto matricial.
137 / 324

138 / 324

Para desenhar grcos com os elementos de um vetor usa-se o


comando plot.
Ex:
a=0:pi/100:2*pi

plot(a) - quando a coordenada x omitida, considerada


como coordenada x o ndice do vetor
plot(sin(a))
plot(a,sin(a))
plot(a,sin(a),a,cos(a))

139 / 324

Uma onda quadrada de frequncia f pode ser representada


como um somatrio innito de senoides como:
4
1
1
(sin(2 ft ) + sin(6 ft ) + sin(10 ft ) + ...)

3
5
ou, de modo geral...

4X
sin (2(2k 1)ft )

(2 k 1 )
k =1

140 / 324

A gura abaixo mostra uma aproximao de onda quadrada


com duas senides:

141 / 324

a) Faa um script para plotar uma onda quadrada de f=3, no


intervalo 0t pi4 , plotando o somatrio das senides com
k=1,2,3,4 at 50.

142 / 324

t=0:0.01:pi/4;
f=3;
s=t*0;
for k=1:50
s1=sin((2*k-1)*2*pi*f*t)/(2*k-1);
s=s+s1;
plot(t,s);
hold on
legend(['k=' num2str(k)])
hold o
pause(1);
end
143 / 324

Vetores podem ser concatenados da forma a seguir:

a = [b b]
no exemplo acima, o vetor a recebe a concatenao de duas
ocorrncias do vetor b. Se b tinha 1 2 3 4 ento o vetor a
car com 1 2 3 4 1 2 3 4

Essa concatenao pode ser utilizada para acrescentar


elementos ao nal de um vetor:

a = [b 3]
Concatena o valor 3 ao nal do vetor, aumentando seu
tamanho em uma posio

Para criar um vetor vazio, atribui-se [ ] a ele:


A=[ ]

144 / 324

Pode-se atribuir intervalos de um vetor para um intervalo de


outro vetor. Por exemplo, para atribuir os elementos do quinto
ao dcimo de vetor A para as posies 3 a 8 do vetor B,
faz-se:
B(3:8)=A(5:10)

especicando-se o intervalos dos elementos com que se quer


trabalhar como:
Nome(posio inicial:posio nal)

145 / 324

Ex: Faa um script que leia um vetor de 10 posies, e


desloque todos os elementos do vetor de uma posio
esquerda, e colocando o contedo da primeira posio na
ltima posio.

aux=v(1);
v(1:9)=v(2:10);
v(10)=aux;
146 / 324

max(A) - retorna o maior elemento do vetor A.


ex: a=max(A) - a recebe o maior valor de A.
ex: [a b]=max(A) - a recebe o maior valor de A e b recebe a
posio do maior valor de A

V00002600 - Faa um algoritmo que leia 10 nmeros reais


armazenando-os em um vetor. Desloque, a seguir, todos os
elementos do vetor uma posio para a esquerda (colocando
na ltima posio o elemento que estava na primeira posio).
Repita isso at o que o maior elemento esteja ocupando a
primeira posio.

147 / 324

min(A) - retorna o menor elemento do vetor.


V00000800 - Escrever um algoritmo que l um vetor C(50) e o
escreve. Encontre, a seguir, o maior elemento de C e o escreva.
V00000900 - Escrever um algoritmo que l um vetor N(80) e o
escreve. Encontre, a seguir, o menor elemento e a sua posio
no vetor N e escreva: "O menor elemento de N = ... e a sua
posio ... ".

148 / 324

iplr(V) - Inverte de posio os elementos de um vetor (troca

o primeiro com o ltimo, segundo com o penltimo, etc...)


gerando o vetor invertido

ex: I=iplr(V)
V00001100 - Escrever um algoritmo que l um vetor N(10) e o
escreve. Troque, a seguir, o 1 elemento com o ltimo, o 2
com o penltimo, etc at o 5 com o 6 e escreva o vetor N
assim modicado.

149 / 324

nd(condio) - Aplicada a um vetor X, gera um vetor com o

ndice de todos os elementos do vetor X que atendem a uma


condio.

Ex: i = nd(x<.5); - retorna os ndices dos elementos menores


que .5

O vetor de ndices gerado pode se aplicado ao vetor original,


obtendo um vetor com os valores dos elementos que atendem
condio.
x(nd(x<.5)) = 0; - zera todos os elementos menores que .5

150 / 324

V00000300 - Faa um algoritmo que leia 10 valores e escreva


primeiramente todos os nmeros pares digitados e em seguida
os nmeros mpares.
disp(a(nd(rem(a,2)==0)))
disp(a(nd(rem(a,2)==1)))
ou
disp([a(nd(rem(a,2)==0)) a(nd(rem(a,2)==1))])

V00000700 - Escrever um algoritmo que l um vetor X(10) e o


escreve. Substitua, a seguir, todos os valores negativos de X
pelos seu mdulo e escreva novamente o vetor X.
length(V) - Retorna o nmero de elementos do vetor.
V00000100 - Escrever um algoritmo que l um vetor V(10) e o
escreve. Conte, a seguir, quantos valores de V so negativos e
escreva esta informao.
151 / 324

Comparando elementos de vetores

A comparao de um vetor com um valor retorna um vetor de


igual dimenso com o resultado da comparao de cada
elemento com o valor, sendo 0 se a comparao resulta falso, e
1 se a comparao resulta verdadeiro
E a comparao entre dois vetores de mesma dimenso resulta
em um vetor de mesma dimenso com o resultado da
comparao elemento a elemento.

152 / 324

V00001250 - Escreva um algoritmo que l em um vetor de 20


posies nmeros positivos, at que o vetor esteja completo ou
que tenha sido fornecido o valor 0 (zero). Aps, escreva o
vetor. A seguir, o algoritmo deve ler um nmero positivo
qualquer e, caso ele se encontre no vetor, deve remover todas
suas ocorrncias. Escreve o vetor modicado.
V00001300 - Escrever um algoritmo que l um vetor G(10)
contendo o gabarito de uma prova. Leia a seguir, para cada
aluno de um conjunto de 5 alunos suas 10 respostas e verique
quantas questes acertou, escrevendo para cada aluno o
nmero de acertos.
153 / 324

V00001000 - Faa um algoritmo que leia 10 valores, calcule


sua mdia e escreva os valores que esto acima da mdia
calculada.
V00001010 - Faa um algoritmo que leia 10 valores, calcule
sua mdia e escreva o valor do menor elemento maior ou igual
mdia calculada.
mean(A) - Retorna a mdia dos elementos do vetor

154 / 324

any(V) - Retorna 1 se h algum elemento diferente de zero no


vetor
sum(A) - Retorna a soma dos elementos do vetor A.
rand (1,n) - Retorna um vetor de n elementos com nmeros
randmicos reais entre 0 e 1.

Como fazer para gerar um vetor de inteiros entre, digamos, 1 e


10?

155 / 324

V00001050 - Faa um algoritmo que leia um vetor de 10


elementos. Leia, a seguir, um valor N e verique se o valor
aparece no vetor escrevendo:
0 - se o valor N no aparece no vetor;
1 - se o valor N aparece no vetor

V00001450 - Faa um algoritmo que leia um vetor de 10


elementos. Leia, a seguir, 10 valores N e, para cada um,
verique se o valor aparece no vetor escrevendo:
0 - se o valor N no aparece no vetor;
1 - se o valor N aparece no vetor

156 / 324

ismember(A,B) - verica para cada elemento de A se ele ocorre


ou no em B. Retorna um vetor com 0 para os elementos que
no esto em B e 1 para os elementos que esto
C=A(nd(ismember(A,B))) - gera um vetor com os elementos
de A que aparecem em B
C=A(nd( ismember(A,B))) - gera um vetor com os
elementos de A que no aparecem em B

157 / 324

V00001500 - Escrever um algoritmo que l um vetor X(10) e,


aps, leia um vetor Y(10). Crie, a seguir, um terceiro vetor Z
com os elementos que aparecem nos dois vetores (interseco).
Os elementos devem aparecer no vetor Z na mesma ordem em
que aparecem no vetor X. Considere que no h repetio de
valores dentro do mesmo vetor. Escreva o vetor Z (apenas as
posies que foram preenchidas).

158 / 324

V00001501 - Escrever um algoritmo que l um vetor X(10) e,


aps, leia um vetor Y(10). Crie, a seguir, um terceiro vetor Z
com os elementos que aparecem em um X ou em Y (unio);
elementos que aparecem em X e Y simultaneamente devem
aparecer apenas uma vez em Z. Os elementos devem aparecer
no vetor Z na mesma ordem em que aparecem no vetor X e Y.
Considere que no h repetio de valores dentro do mesmo
vetor. Escreva o vetor Z (apenas as posies que foram
preenchidas).

159 / 324

V00001700 - Escrever um algoritmo que l 2 vetores X(10) e


Y(10), e escreva os elementos que aparecem no vetor X e no
aparecem no vetor Y (diferena de conjuntos). Escreva os
valores na ordem em que eles aparecem no vetor X. Os dois
vetores devem ser lidos separadamente (em primeiro lugar,
todo o vetor X, aps, o vetor Y).

160 / 324

V00001710 - Escrever um algoritmo que l 3 vetores A[1..10],


B[1.10] e C[1..10] e escreve os elementos que esto em A e B
(interseo) mas no esto em C. Escreva os valores na ordem
em que eles aparecem no vetor A. Os trs vetores devem ser
lidos separadamente (em primeiro lugar, todo o vetor A, aps,
o vetor B e por m o vetor C).

161 / 324

V00001720 - Escrever um algoritmo que l 3 vetores A[1..10],


B[1.10] e C[1..10] e escreve os elementos que so comuns aos
trs vetores (interseco). Escreva os valores na ordem em que
eles aparecem no vetor A. Os trs vetores devem ser lidos
separadamente (em primeiro lugar, todo o vetor A, aps, o
vetor B e por m o vetor C).

162 / 324

V00001730 - Escrever um algoritmo que l 2 vetores A[1..10] e


B[1.10] e escreve os elementos que esto somente em A ou
somente em B. Escreva os valores na ordem em que eles
aparecem no vetor A, e em seguida os que aparecem no vetor
B. Os dois vetores devem ser lidos separadamente (em
primeiro lugar, todo o vetor A e, aps, o vetor B).

163 / 324

isprime(N) - retorna TRUE se N primo, FALSE em caso


contrrio
V00000400 - Escrever um algoritmo que l um vetor V(10) e o
escreve. Conte, a seguir, quantos valores de V so primos e
escreva esta informao.
V00000600 - Escreva um algoritmo que l um vetor A(10) e
escreva a posio de cada elemento primo deste vetor.

164 / 324

Ordenao de vetores (Funo sort)

B = sort(A) - Se A um vetor, retorna o vetor ordenado em


ordem crescente.
B = sort(A,'descend') - Idem, em ordem decrescente
[B,I] = sort(A ) - retorna em B o vetor A ordenado, e em I a
posio que cada elemento ocupava no vetor original.

165 / 324

V00001900 - Faa um script no matlab que gere um vetor com


10 valores randmicos e escreva os valores em ordem crescente.
V00002000 - Faa um algoritmo que leia, para cada pessoa de
um conjunto de 10 pessoas, o seu peso (inteiro) e altura
(real), e escreva a lista de pesos e alturas em ordem crescente
de altura. Os dois dados referentes a cada pessoa devem ser
lidos juntos (ou seja, o algoritmo no deve ler todos os pesos e
em seguida todas as alturas)

166 / 324

V00003550 - Faa um algoritmo que leia 10 datas de


aniversrio, cada uma composta por dia e mes, e escreva as 10
datas em ordem cronolgica crescente.
V00003600 - Faa um algoritmo que leia 10 datas, cada uma
composta por dia, ms e ano, e escreva as 10 datas em ordem
cronolgica crescente.

167 / 324

Matrizes

No Matlab, da mesma forma que em vetores, cada dimenso


da matriz comea na posio 1 e os ndices para referenciar
um elemento de uma matriz so especicados entre
parnteses. Ex:
for i=1:10
for j=1:10

end

end

M(i,j)=0;

168 / 324

Dimenso
A dimenso da matriz determinada automaticamente pelo
MATLAB.
Exemplo:
B(2, 3) = 5; produz

C(3, 1:3) = [1 2 3]; produz


B

0 0 0
0 0 5

0 0 0
0 0 0
1 2 3

169 / 324

Da mesma forma que em vetores, pode-se atribuir um


conjunto de valores a uma matriz ou a uma regio da matriz.
Os valores de uma Matriz so colocados entre colchetes, sendo
que, os elementos de uma linha so separados por espao ou
vrgula, e as linhas so separadas por ponto e vrgula.
Exemplos:
Matriz

A

1 2 5
3 9 0

Entrada do comando no
MATLAB
A = [1 2 5;3 9 0]

170 / 324

size(V) - Retorna o nmero de elementos de cada dimenso de


uma matriz.
Se aplicada a um vetor, retorna um par [1 N], onde N o
nmero de elementos.
Se aplicado a um escalar, retorna [1 1]

length(M) - Retorna o tamanho da maior dimenso da matriz.


Quando aplicada a um vetor, retorna o nmero de elementos
do vetor.

171 / 324

Funes para gerao e manipulao de matrizes


O MATLAB possui alguns utilitrios para a gerao e
manipulao de matrizes. Por exemplo:

ones (m,n) retorna uma matriz de elementos 1 mxn.


zeros (m,n) retorna uma matriz de zeros mxn.
diag(A) extrai a diagonal principal de uma matriz para um
vetor coluna.
sum(A) - Se A um vetor, retorna a soma de seus elementos.
Se A uma matriz, retorna um vetor com a soma de cada
coluna de A.
rand (m,n) retorna uma matriz mxn com nmeros randmicos
reais entre 0 e 1.

Como fazer para gerar uma matriz de inteiros entre, digamos,


1 e 10?
Lembrando que as regras do uso de funes e operadores
aritmticos para vetores tambm valem para matrizes.
172 / 324

A gura abaixo ilustra os ndices (linha e coluna) dos


elementos de uma matriz 5x5.
M00000100 - Faa um script no Matlab que gere uma matriz
com nmeros randmicos inteiros entre 1 e 10 e calcule e
escreva a soma dos elementos da diagonal principal (em
negrito na gura abaixo).
1
2
3
4
5

1
1,1

2,1
3,1
4,1
5,1

2
3
1,2 1,3
2,2 2,3
3,2 3,3
4,2 4,3
5,2 5,3

4
5
1,4 1,5
2,4 2,5
3,4 3,5
4,4 4,5
5,4 5,5
173 / 324

Para os exerccios a seguir, utilize a matriz abaixo:


0
9
8
7
6
5
4
3
2
1

1
0
9
8
7
6
5
4
3
2

2
1
0
9
8
7
6
5
4
3

3
2
1
0
9
8
7
6
5
4

4
3
2
1
0
9
8
7
6
5

5
4
3
2
1
0
9
8
7
6

6
5
4
3
2
1
0
9
8
7

7
6
5
4
3
2
1
0
9
8

8
7
6
5
4
3
2
1
0
9

9
8
7
6
5
4
3
2
1
0
174 / 324

Mais funes para gerao e manipulao de matrizes

rot90(M) - Rotaciona uma matriz em 90o no sentido


anti-horrio.
rot90(M,k) - Rotaciona uma matriz em k*90o no sentido
anti-horrio.
iplr gira (espelha) uma matriz em relao coluna do meio.

A funo iplr, quando aplicada a um vetor, inverte seus


elementos de posio (troca o primeiro com o ltimo, segundo
com o penltimo, etc...)

ipud gira (espelha) uma matriz em relao linha do meio.

175 / 324

Ordenao de matrizes

sort(M): ordena cada coluna da matriz


[X Y ]=sort(M):

X recebe a matriz M com cada coluna ordenada


Y recebe uma matriz com a linha de cada elemento na matriz
original

sortrows(M,k) - troca as linhas da matriz entre si, ordenando


pela coluna k

176 / 324

A gura abaixo ilustra os ndices (linha e coluna) dos


elementos de uma matriz 5x5.
M00000150 - Faa um script no Matlab que calcule e escreva
a soma dos elementos da diagonal secundria da matriz de
teste (em negrito na gura abaixo).
1
2
3
4
5

1
2
3
1,1 1,2 1,3
2,1 2,2 2,3
3,1 3,2 3,3
4,1 4,2 4,3
5,1 5,2
5,3

4
1,4

2,4

3,4
4,4
5,4

5
1,5

2,5
3,5
4,5
5,5

177 / 324

Clculo de Matriz Transposta


A transposta de uma matriz, obtida colocando-se o nome da
matriz seguida de um apstrofo: matriz A04x 3 A3x 4 .
A maioria das operaes sobre matrizes (sum, max, di...)
trabalha por colunas. Quando se deseja aplicar uma dessas
funes a cada linha, basta aplicar a funo correspondente
matriz transposta.
Ex: Clculo da soma de cada linha.
sum(M')

3 2 4
5 7 3
1 2 3

M'

3 5 1
2 7 2 sum(M')
4 3 3

[9 15 6]

178 / 324

Mais funes para gerao e manipulao de matrizes

tril(M) extrai a parte triangular inferior de uma matriz.


tril(M,k) - Extrai a parte triangular inferior de uma matriz a
partir da k-sima diagonal abaixo da diagonal principal (para
diagonais abaixo da principal o k deve ser negativo).
M=[1 2 3;4 5 6;7 8 9]
B=tril(M,1) - k=1 signica "a partir da primeira diagonal acima
da principal"
gera

1 2 0
5 6
B = 4
7 8 9
179 / 324

triu(M) extrai a parte triangular superior de uma matriz.


triu(M,k) - Extrai a parte triangular superior de uma matriz a
partir da k-sima diagonal acima da diagonal principal.
diag(v) sendo v um vetor qualquer, gera uma matriz diagonal
com o vetor v na diagonal.
diag(A,1) extrai a primeira diagonal superior diagonal
principal para um vetor coluna.
[x y]=nd(X<0) - retorna as coordenadas de cada elemento
menor que zero da matriz X

180 / 324

Pode-se identicar a posio de um elemento em relao


diagonal principal (acima, abaixo ou exatamente na diagonal
principal) pela relao entre seus ndices (linha e coluna)

Elementos exatamente na diagonal principal: linha = coluna


Elementos acima da diagonal principal: linha < coluna
Elementos abaixo da diagonal principal: linha > coluna
1
2
3
4
5

1
1,1

2,1
3,1
4,1
5,1

2
3
1,2 1,3
2,2 2,3
3,2 3,3
4,2 4,3
5,2 5,3

4
5
1,4 1,5
2,4 2,5
3,4 3,5
4,4 4,5
5,4 5,5
181 / 324

De forma semelhante pode-se identicar a posio de um


elemento em relao diagonal secundria (acima, abaixo ou
exatamente na diagonal principal) pela soma de seus ndices
(linha e coluna). Em uma matriz NxN:
Elementos exatamente na D.S.: linha + coluna = N + 1
Elementos acima da D.S.: linha + coluna < N + 1
Elementos abaixo da D.S: linha + coluna > N + 1
1
2
3
4
5

1
2
3
1,1 1,2 1,3
2,1 2,2 2,3
3,1 3,2 3,3
4,1 4,2 4,3
5,1 5,2
5,3

4
1,4

2,4

3,4
4,4
5,4

5
1,5

2,5
3,5
4,5
5,5

182 / 324

M00000200 - Faa um script no Matlab que calcule e escreva


a soma dos elementos em toda a regio acima da diagonal
principal da matriz de teste.
0
9
8
7
6
5
4
3
2
1

1 2 3 4
0 1 2 3
9 0 1 2
8 9 0 1

7
6
5
4
3
2

8
7
6
5
4
3

9
8
7
6
5
4

0
9
8
7
6
5

5
4
3
2
1

0
9
8
7
6

6
5
4
3
2
1

0
9
8
7

7
6
5
4
3
2
1

0
9
8

8
7
6
5
4
3
2
1

0
9

9
8
7
6
5
4
3
2
1

183 / 324

M00000300 - Faa um script no Matlab que calcule e escreva


a soma dos elementos em toda a regio acima da diagonal
secundria da matriz de teste.
M00000350 - Faa um script no Matlab que calcule e escreva
a soma dos elementos que esto ao mesmo tempo acima da
diagonal principal e da secundria na matriz de teste.

184 / 324

- max(A) - Se A um vetor, retorna o maior elemento do


vetor. Se uma matriz, retorna um vetor com o maior
elemento de cada coluna.
- [a b]=max(A) - a recebe o maior valor de A e b recebe a
posio do maior valor de A
- min(A) - retorna o menor elemento do vetor.

185 / 324

M00000400 - Faa um script no Matlab que gere uma matriz


10x10 de valores randomicos entre 10 e 20, e escreva o maior
valor existente na matriz, bem como a linha e coluna onde o
valor ocorre.

186 / 324

M00000800 - Faa um script no Matlab que leia uma matriz


M[1..5,1..5] e escreva o nmero da linha que contenha a maior
soma de seus elementos. Considere que a matriz s contem
valores positivos.
M00000900 - Faa um script no Matlab que leia uma matriz
M[1..5,1..5] e escreva o nmero da linha que contenha a maior
soma de seus elementos. Considere que a matriz pode conter
valores positivos e negativos.
M00001000 - Faa um script no Matlab que leia uma matriz
M[1..5,1..5] e gere dois vetores SomaLin[1..5] e SomaCol[1..5],
com a soma dos elementos de cada linha e a soma dos
elementos de cada coluna da matriz M. Escreva ao nal os
vetores Somalin e Somacol.
187 / 324

Intervalos de ndices
Dada uma matriz, pode-se selecionar regies da matriz
especicando o intervalo de linhas e o de colunas com que se
deseja trabalhar no formato M(LInic:Ln, Cinic:Cn)
Para selecionar todas as linhas ou todas as colunas, utiliza-se
somente ":".
Exemplos:
 A = [1 2 3; 4 5 6; 7 8 8]
A=
1 2 3
4 5 6
7 8 8
 B = A(2:3,1:3)
B=
4 5 6
7 8 9

 B = A(2:3,:)
B=
4 5 6
7 8 9
B(:,2) = []
B=
4 6
7 9

188 / 324

M00000600 - Faa um script no Matlab que troque cada


elemento da linha 4 com o elemento correspondente da linha 2
na matriz de teste. Escreva a matriz resultante. No Matlab
pode-se escrever uma matriz inteira de uma vez s, com
disp(M).

189 / 324

eye (m,n) retorna uma matriz mxn com 1 na diagonal principal


(matriz identidade).
zeros (m,n) retorna uma matriz de zeros mxn.
ones (m,n) retorna uma matriz de elementos 1 mxn.

190 / 324

Comparao de matrizes

Os operadores relacionais (>, <, >=,...) quando aplicados a


duas matrizes, geram uma matriz com o resultado da operao
elemento a elemento.
Para comparar se duas matrizes tem mesma dimenso e todos
os valores iguais, utiliza-se a funo isequal(mat1,mat2), que
retorna 1 se as matrizes so iguais, e 0 se seus valores ou
dimenses so diferentes

191 / 324

M00000700 - Uma matriz identidade uma matriz que possui


1 em todos os elementos da diagonal principal, e 0 em todas
as outras posies.
1
0
0
0
0

0
1
0
0
0

0
0
1
0
0

0
0
0
1
0

0
0
0
0
1

Faa um script no Matlab que leia uma matriz M[1..5,1..5] e


verique se uma matriz identidade escrevendo:
1 - Se uma matriz identidade;
0 - Se no uma matriz identidade.

192 / 324

Reformatando matrizes

Os elementos de uma matriz podem ser colocados dentro de


um vetor ou tambm podem ser agrupados para formar uma
matriz com a dimenso diferente da matriz de origem.
Suponha uma matriz A4x 3 ; com o comando b = A(:), os
elementos da matriz A so armazenados em um vetor coluna b.
J com o comando reshape(A,3,4), transformamos a matriz
A3x 4 . Note que o nmero de elementos da matriz nunca pode
mudar.

193 / 324

reshape (M, [dimenses]) muda o formato da matriz.

Ex: A = reshape(M, [1 100])


redimensiona uma matriz M[1..10,1..10] para um vetor
obs: A varredura dos elementos na matriz original feita por
colunas.

194 / 324

M00001010 - Escrever um script no Matlab que l uma matriz


M[1..3,1..3], contendo uma posio de jogo da velha, com
valores 0 (casa livre), 1 (marcada com cruzinha) ou 2
(marcada com bolinha) e escreva:
1 - se o jogador 1 venceu o jogo (alguma linha, coluna ou
diagonal com o mesmo valor);
2 - se o jogador 2 venceu o jogo;
3 - se o jogo terminou empatado (no h mais lances e
ningum ganhou);
4 - se o jogo ainda no terminou (h lances por jogar e
ningum ainda venceu)

195 / 324

M00001100 - Uma matriz dita Diagonalmente Dominante se


atende s duas condies abaixo::

a) em todas as linhas o elemento da diagonal principal maior


ou igual soma dos outros elementos da linha e,
b)h pelo menos uma linha em que o elemento da diagonal
principal MAIOR que a soma dos outros elementos da linha
(no basta que seja igual).

Faa um script no Matlab que leia uma matriz M[1..4,1..4] e


verique se diagonalmente dominante escrevendo:
1 - Se diagonalmente dominante;
0 - Se no diagonalmente dominante

196 / 324

M00001200 - Faa um script no Matlab que leia uma matriz


M[1..5,1..5], onde cada posio contem um nmero entre 0 e
9 e cada linha da matriz representa um nmero de 5 dgitos. O
algoritmo deve calcular a soma dos 5 nmeros contidos na
matriz colocando o resultado em um vetor Soma[1..6]. Escreva
ao nal o vetor Soma.

197 / 324

M00001300 - Faa um script no Matlab que leia uma matriz


M[1..5,1..5], onde cada posio contem um nmero entre 0 e
9 e cada linha da matriz representa um nmero de 5 dgitos. O
algoritmo deve encontrar a linha que contem o maior dos 5
nmeros e escrever o nmero.
M00001400 - Faa um script no Matlab que leia uma matriz
M[1..5,1..5], onde cada posio contem um nmero entre 0 e
9 e cada linha da matriz representa um nmero de 5 dgitos. O
algoritmo deve ordenar os 5 nmeros em ordem crescente, e
escrever a matriz com os nmeros ordenados.

198 / 324

M00001500 - Faa um script no Matlab que leia dois valores D


e DS, correspondendo a um dia do ms e um dia da semana
(1-domingo, 2-segunda,... 7-sbado) e preencha uma matriz
Folhinha[1..6,1..7] com o calendrio correspondente ao ms do
dia digitado. A primeira coluna da matriz contem os
domingos, a segunda coluna contem as segundas e assim por
diante. O algoritmo deve escrever a matriz gerada. As
posies no utilizadas da matriz devem conter 0's.

199 / 324

M00001600 - Uma matriz de adjacncias, para um mapa


rodovirio, composta de elementos 0's e 1's, sendo que
M[i,j]= 1 se existe uma ligao rodoviria da cidade i para a
cidade j e M[i,j]= 0 em caso contrrio. Essa matriz ser
simtrica se para todo caminho i,j existir o caminho j,i
(estradas de mo dupla). Uma caracterstica dessa matriz
que na matriz M 2 , obtida pelo produto matricial de M por M,
cada posio M[i,j] contm o nmero de caminhos entre as
cidades i e j que passam exatamente por 1 outra cidade. E M 3
contem a quantidade de caminhos que passam por 2 outras
cidades. E assim por diante.
200 / 324

Escreva um script no Matlab que leia uma matriz de


adjacncias M para um conjunto de 5 cidades e, aps, leia os
valores c1 e c2 (ambos menores ou iguais a 5) representando
duas cidades quaisquer do conjunto. O algoritmo deve
descrever a quantidade de caminhos entre c1 e c2 que passam
exatamente por 1 outra cidade.
M00001800 - Faa um script no Matlab que leia uma matriz
M[1..5,1..6] e divide todos os 6 elementos de cada linha pelo
valor do menor elemento EM MDULO da linha. Escrever a
matriz modicada.

201 / 324

M00001900 - Faa um script no Matlab que leia uma matriz


M[1..5,1..5], possivelmente com elementos repetidos. Leia, a
seguir, 5 valores e, para cada um, verique se o valor ocorre ou
no na matriz, escrevendo a posio (linha e coluna) em que
foi encontrada a primeira ocorrncia do mesmo e, caso ele no
exista na matriz, a mensagem "No tem".

202 / 324

M00002000 - Uma matriz dita triangular superior se todos os


elementos abaixo da diagonal principal so iguais a zero, e h
pelo menos um elemento nulo acima da diagonal principal.
Da mesma forma, uma matriz dita triangular inferior se
todos os elementos acima da diagonal principal so iguais a
zero, e h pelo menos um elemento no nulo abaixo da
diagonal principal.
E uma matriz dita diagonal se os elementos no nulos
ocorrem somente na diagonal principal.
Faa um script no Matlab que leia uma matriz M[1..5,1..5] e
escreva:
0 - Se a matriz uma matriz diagonal;
1 - Se triangular superior;
2- Se triangular inferior;
3 - Se no nenhuma das anteriores

203 / 324

M00002100 - Uma matriz dita Matriz de Toeplitz se, em


cada diagonal paralela diagonal principal, todos os elementos
so iguais. Assim, um exemplo de Matriz de Toeplitz :
1
2
8
7
9

3
1
2
8
7

5
3
1
2
8

4
5
3
1
2

6
4
5
3
1

Faa um script no Matlab que leia uma matriz M[1..5,1..5] e


verique se uma Matriz de Toeplitz, escrevendo:
1 - Se uma matriz de Toeplitz;
0 - Se no uma matriz de Toeplitz

204 / 324

M00002200 - Uma matriz dita Circulante cada elemento


igual ao elemento imediatamente acima esquerda, e se o
primeiro elemento de cada coluna igual ao ltimo elemento
da coluna anterior. Assim, um exemplo de Matriz Circulante :
1 9 7 8 2
2 1 9 7 8
8 2 1 9 7
7 8 2 1 9
9 7 8 2 1
Faa um script no Matlab que leia uma matriz M[1..5,1..5] e
verique se uma Matriz Circulante, escrevendo:
1 - Se uma matriz Circulante;
0 - Se no uma matriz Circulante

205 / 324

M00002300 - Faa um script no Matlab que leia uma matriz


M[1..3,1..3] e para cada linha divida toda a linha pelo seu
elemento da primeira coluna. Aps isso, a partir da segunda
linha, de cada linha subtraia toda a a primeira linha elemento
a elemento. ex. a matriz:
2 4 6
1 2 3
1 2 3
3 9 6
1 3 2
0 1 -1
2 8 4
1 4 2
0 2 -1
Escreva a matriz alterada.

206 / 324

M00002400 - Uma matriz dita de Hadamard se todos os


seus elementos so 1 ou -1, e o produto escalar (somatrio dos
produtos de cada elemento de uma linha pelo elemento
correspondente da outra linha) entre quaisquer duas linhas
igual a zero. Faa um script no Matlab que leia uma matriz
M[1..4,1..4] e verique se ela de Hadamard escrevendo:
0 - Se no de Hadamard;
1 - Se de Hadamard

207 / 324

Matrizes de Hadamard

208 / 324

M00004900 - Um quadrado mgico de ordem N (sendo N um


nmero mpar) um arranjo de nmero de 1 a NxN em uma
matriz quadrada de tal modo que a soma de cada linha, coluna
e diagonal a mesma. A matriz abaixo representa um
quadrado mgico de ordem 5.
15 8 1 24 17
16 14 7 5 23
22 20 13 6 4
3 21 19 12 10
9 2 25 18 11

209 / 324

A regra para ger-lo relativamente fcil de observar:

Comece com 1 no meio da primeira linha.


Siga para cima e para a esquerda diagonalmente (quando sair
do quadrado suponha que os lados superior e inferior esto
unidos ou que os lados da direita e da esquerda esto unidos,
conforme for o caso).
Em cada quadrado que passar coloque o valor do quadrado
anterior mais 1 (um).
Quando a prxima casa estiver j preenchida, desa um
quadrado e continue seguindo a diagonal at ter preenchido
todos os quadrados.

Escrever um script no Matlab que l um nmero N mpar,


menor ou igual a 99, e gere e escreva, para o nmero lido, o
seu quadrado mgico.

210 / 324

M00005000 - Faa um script no Matlab que leia duas matrizes


M[1..3,1..3] e N[1..3,1..3] (primeiro a matriz M, e aps a
matriz N) e calcule o produto matricial MxN colocando o
resultado em uma matriz P[1..3,1..3]. Escreve ao nal a
matriz P.
M00005100 - As pirmides tm a base quadrada, sendo que a
nica forma de se atingir o topo seguir em espiral pela
borda. Escreva um script no Matlab que leia um valor N e, a
seguir, uma matriz quadrada A[n,n] de ordem no mximo igual
a 10, e verique se a matriz equivalente a uma pirmide
inca, ou seja, se partindo-se do canto superior esquerdo da
matriz, no sentido horrio, em espiral, a posio seguinte na
ordem o inteiro consecutivo da posio anterior. O script
deve escrever: 1 - Se a matriz forma uma pirmide inca; 0 Em caso contrrio.

211 / 324

M00005200 - Escreva um script no Matlab que leia duas


matrizes numricas A[3 X 4] e B[3 X 4] e gere e escreva uma
matriz inteira C[3 X 4], tal que um elemento C[i,j]= 1 se os
elementos nas mesmas posies das matrizes A e B forem
iguais, e 0 em caso contrrio. O algoritmo deve, ao nal,
escrever a matriz C.
M00005300 - Na Teoria de Sistemas, dene-se como elemento
minimax de uma matriz o menor elemento da linha em que se
encontra o maior elemento da matriz. Escreva um script no
Matlab que leia uma matriz A[5 X 5] e determine o seu
elemento minimax. O algoritmo deve, ao nal, escrever o valor
do elemento minimax, bem como a linha e coluna onde
ocorreu.
212 / 324

M00001700 - Faa um script no Matlab que leia uma matriz


M[1..5,1..5] e um valor N e multiplica cada valor da matriz M
por N e coloca o resultado em um vetor V[1..25]. Escreva ao
nal o vetor V.

213 / 324

Exerccios

1. Entre com as matrizes a seguir:



A

2 6
3 9


B

1 2
3 4


C

5
5 3

214 / 324

2. Crie uma matriz nula, de 1's e identidade. Crie as seguintes


matrizes com a ajuda das matrizes genricas citadas acima.

0 0 0
0 0 0
0 0 0

5 0 0
0 5 0
0 0 5


F

3 3
3 3

215 / 324

3. A seguinte matriz G criada colocando as matrizes A, B e C


citadas acima, na sua diagonal. De quantas maneiras voc pode
criar a matriz G, utilizando as submatrizes A, B e C?

2
3
0
0
0
0

6
9
0
0
0
0

0
0
1
3
0
0

0
0
2
4
0
0

0
0
0
0
5
5

0
0
0
0
5
3

216 / 324

4. Crie uma matriz 20 x 20 com o comando H = ones(20).

Agora substitua a submatriz 10 x 10 entre as linhas 6 e 15 e as


colunas 6 e 15 com zeros.
Veja a estrutura da matriz (em termos de entradas diferentes
de zero) com o comando spy(H).
Escolha as submatrizes 5 x 5 no canto superior direito e no
canto inferior esquerdo para zerar e ver a estrutura de novo.

217 / 324

5. Crie uma matriz 10 x 10 qualquer com o comando J = rand(10).


Agora realize as seguintes operaes:
Multiplique todos os elementos por 100 e aproxime todos os
elementos para inteiros com o comando J = x(J).
Substitua todos os elementos de J < 10 por zeros.
Substitua todos os elementos de J < 90 por innito (inf).
Extraia todos os elementos entre 30 e 50 e coloque-os em um
vetor b.

218 / 324

Comparando elementos de matrizes

A comparao de uma matriz (ou vetor) com um valor retorna


uma matriz de igual dimenso com o resultado da comparao
de cada elemento com o valor, sendo 0 se a comparao
resulta falso, e 1 se a comparao resulta verdadeiro
E a comparao entre duas matrizes de mesma dimenso
resulta uma matriz de mesma dimenso com o resultado da
comparao elemento a elemento.

219 / 324

Leitura e escrita em arquivos


O Matlab permite a leitura e gravao de dados em disco,
tanto para arquivos texto quanto para arquivos binrios,
utilizando um formato prprio, atravs dos comandos load e
save
save data1 x y salva os vetores x e y em um arquivo binrio
chamado data1.mat
save data1.dat x y -ascii salva os vetores x e y em um
arquivo texto chamado data1.dat
O arquivo onde os dados sero salvos pode ter qualquer
extenso. Usa-se .dat para evitar confuso com o .mat.
load data1.dat carrega os dados do arquivo data1.dat em

uma matriz chamada data1

220 / 324

Baixe os arquivos candidatos.dat e votos.dat do acervo da


disciplina do UCS Virtual para o diretrio
C:\Users\UCS\Documentos\MATLAB
V00003250 - Faa um script no matlab que leia o arquivo
candidatos.dat, que contem o cadastro e partido (inteiro de 1 a 5)
de 10 candidatos a deputado. Leia a seguir, o arquivo votos.dat
com o voto de cada eleitor. Escreva ao nal o cadastro e nmero
de votos de cada candidato, em ordem crescente de cadastro.
Escreva tambm, ao nal, o nmero de votos nulos (ou seja, votos
que no so iguais ao cadastro de nenhum candidato).

221 / 324

V00003300 - A partir do script anterior, escreva o total de


votos de cada partido.
V00003350 - E escreva, para os 10 partidos, o nmero do
partido e o total de votos, em ordem decrescente de
votao.
V00003400 - E escreva o cadastro, partido e nmero de votos
do candidato mais votado de cada partido, em ordem
crescente de partido.
V00003410 - Idem, em ordem decrescente de votao.
V00003450 - E e escreva o cadastro, partido e nmero de votos
de todos os candidatos, em ordem crescente de partido e, para
o mesmo partido, em ordem crescente de nmero de votos.
222 / 324

V00006400 - Na apurao de um processo de eleio as vagas


disponveis so distribudos entre os partidos proporcionalmente aos
votos obtidos pelo partido. As sobras so distribudas da seguinte
forma: enquanto houver sobras, calcula-se para cada partido a
razo entre o nmero de votos e o nmero de cadeiras j obtidas +
1. Uma das sobras atribuda ao partido de maior razo. Isso se
repete at que no haja mais sobras. A partir do script anterior,
leia o total de vagas e escreva, ao nal, para os partidos de 1 a 5, o
nmero do partido e o nmero de cadeiras obtidas.

223 / 324

Matriz
B=

2x
5i

log (x ) + sin(y )
3 + 2i

Entrada do comando no MATLAB


B = [2*x log(x)+sin(y);5i 3+2i]

Obs.: Usa-se a mesma notao para vetores com uma linha ou com
uma coluna.

224 / 324

Continuao

Se a sua entrada muito longa, voc poder usar reticncias (...) e


continuar a entrada na outra linha.
Exemplo:
A = [ 1/3
5.55*sin(x) 9.35
0.097; ...
3/(x+2*log(x)) 3
0
6.555; ...
(5*x - 23)/55 x-3
x*sin(x) sqrt(3)];

225 / 324

Manipulao de Matrizes

Pode-se manipular a seleo de qualquer elemento de uma


matriz, utilizando vetores como ndices da matriz, para que
seja criada uma submatriz a partir de uma matriz.
Tambm, pode-se adicionar, remover ou substituir linhas e/ou
colunas de uma matriz.
Como exemplo, suponha que A uma matriz 10 x 10, B
uma matriz 5 x 10 e y um vetor de 20 elementos, ento:
A( [1 3 6 9], : ) = [B(1:3, : ); y(1:10)]
As linhas 1, 3 e 6 da matriz A sero substitudas pelas linhas 1, 2 e
3 da matriz B, e a linha 9 da matriz A substituda pelo vetor y.
226 / 324

Exemplo:

Se Q =

2
0
1
2
5

3
0
2
5
10

6 0 5
20 4 3
3 9 8
5 5 6
15 20 25

e v = [ 1 4 5] ento,

Q(v, : ) =

2
2
5

3
10

6
5
15

0
20

5
6
25

e Q( : , v) =

2 0
0 4
1 9
2 5
5 20

5
3
8
6
25

227 / 324

Inserindo uma linha ou uma coluna

Pode-se inserir uma linha ou uma coluna em uma matriz j


existente.
Neste caso o o tamanho da linha ou coluna a ser inserida deve
ter o mesmo tamanho da linha ou coluna da matriz j
existente.
Na concatenao entre matrizes, ou entre matrizes e vetores, o
ponto-e-vrgula assinala que a concatenao do segundo ser
abaixo do primeiro, e o espao em branco ou vrgula assinala
que a concatenao do segundo ser ao lado do primeiro.

228 / 324

Inserindo uma linha ou uma coluna

Ao concatenar vetores deve-se tomar cuidado com a


"orientao"dos vetores. Um vetor linha e um vetor coluna
apresentam estruturas diferentes e sua dimenso deve ser
compatvel na concatenao.
Para transformar um vetor linha em um vetor coluna basta
calcular a transposta do vetor (ex: V = W' )
Exemplo:

229 / 324

1 0 0
0 1 0
0 0 1

5 6 7

1
0
0
5

2
3
4

Ento
A=[A;u] produz

0
1
0
6

0
0
1
7

uma matriz 4x3

230 / 324

1 0 0
0 1 0
0 0 1

5 6 7

1 0 0 2
0 1 0 3
0 0 1 4

2
3
4

Ento

A=[A,v] produz A =

uma matriz 3x4

A = [A u] produz um erro.
231 / 324

B = [ ]; B = [B; 1 2 3] produz B = [ 1 2 3 ], e
B = [ ];
for k = 1:3
B = [B; k k+1 k+2 ];
end
produz

1 2 3
2 3 4
3 4 5

232 / 324

Deletando uma linha ou coluna

Qualquer linha ou coluna de uma matriz pode ser deletada


simplesmente atribuindo um vetor nulo mesma.
Exemplo:
A(2, : ) = [ ] deleta a 2a . linha da matriz A.

233 / 324

 eye(3)

1 0 0

0 1 0
ans =
0 0 1
 B = [ones(3) zeros(3,2); zeros(2,3) 4*eye(2)]

1
1
1
0
0

1
1
1
0
0

1
1
1
0
0

0
0
0
4
0

0
0
0
0
4

234 / 324

 diag(B)'
ans =
[1 1 1 4 4]
 diag(B,1)'
ans =
1100
 d = [2 4 6 8];
 d1 = [-3 -3 -3];
 d2 = [-1 -1];
 D = diag(d) + diag(d1,1) + diag(d2,-2)
2 -3 0 0
0 4 -3 0
D = -1
0 6 -3
0 -1 0 8
235 / 324

Operaes Aritmticas com Matrizes

As operaes aritmticas com matrizes s sero vlidas se elas


forem matematicamente compatveis, conforme as seguintes
condies:

A+B ou A-B - vlida se A e B so do mesmo tamanho


A*B - representa o produto matricial e vlida se o nmero de
colunas de A igual ao nmero de linhas de B.
A/B - vlida e igual a A.B 1 para matrizes quadradas do
mesmo tamanho.
A 2 - faz sentido somente se A quadrada; o comando igual
a A*A.

236 / 324

Diviso direita

Adicionando diviso esquerda( / ), existe tambm a diviso


direita( \ ).
Em particular, o comando x = A b encontra o valor de b
dividido por A.
Portanto A\b quase o mesmo que inv(A)*b, mas mais
rpido e mais numericamente estvel do que computar
inv(A)*b.
A diviso direita (bem como a expresso inv(A)*b) pode ser
utilizada para resolver um sistema de equaes em que A a
matriz de coecientes e b o vetor de termos independentes.
237 / 324

Ordem de operaes

possvel fazer a multiplicao, diviso ou exponenciao


elemento por elemento entre matrizes ou vetores de mesmo
tamanho colocando um ponto ( . ):
.* Multiplicao de elemento por elemento,
./ Diviso esquerda de elemento por elemento,
.\ Diviso direita de elemento por elemento,
. Exponenciao de elemento por elemento,
.' Transposta no conjugada.

238 / 324

Exemplos:

u.*v produz [u1 v1 u2 v2 u3 v3 ... ],


u./v produz [u1 /v1 u2 /v2 u3 /v3 ...], e
u. v produz [u1v1 u2v2 u3v3 ...].

O mesmo verdadeiro para matrizes. Para duas matrizes de


mesmo tamanho A e B, o comando C = A.*B produz uma
matriz C com elementos Cij = Aij . Bij .

239 / 324

 A = [1 2 3;4 5 6;7 8 9];


 x = A(1,:)'

1
2
3

 x'*x
ans =
14

240 / 324

 x*x'
ans =

 A*x
ans =

1 2 2
2 4 6
3 6 9

14
32
50

241 / 324

 A 2

ans

30 36 42
66 81 96
102 126 150

 A. 2

1 4 9
ans = 16 25 36
49 64 81

242 / 324

Funes de Matrizes

As funes de matrizes so:

expm(A) encontra o exponencial da matriz A (eA).


logm(A) encontra log(A), tais que A = elog(A).
sqrtm(A) encontra a raiz da matriz A.

Obs: As funes normais realizam as operaes termo por


termo enquanto as funes de matrizes realizam uma operao
com a matriz. Veja os exemplos a seguir.
 A=[1 2;3 4];
 asqrt = sqrt(A) - raiz quadrada de cada elemento de A

243 / 324

asqrt =
1.0000 1.4142
1.7321 2.0000
 Asqrt = sqrtm(A) - matriz que multiplicada por si mesmo resulta
em A
Asqrt =
0.5537 + 0.4644i 0.8070 - 0.2124i
1.2104 - 0.3186i 1.7641 + 0.1458i

244 / 324

 expaij = exp(A)
expaij =
2.7183 7.3891
20.0855 54.5982
 expA = expm(A)
expA =
51.9690 74.7366
112.1048 164.0738

245 / 324

Matriz Inversa por eliminao de Gauss-Jordan

Uma forma de determinar a inversa duma matriz utilizando a


eliminao de Gauss-Jordan .
Escrevem-se lado a lado a matriz que queremos inverter e a
matriz identidade.
Em seguida, aplicam-se sucessivas operaes elementares sobre
as linhas da matriz a inverter, de modo a transform-la na
matriz identidade, aplicando as mesmas operaes matriz
identidade.
No nal do processo, a matriz identidade tornou-se a matriz
inversa procurada. Simbolicamente:
246 / 324

[A|I ] [I |A1 ].

Exemplo:


2 1 1 0
4 3 0 1


L2 (L2 2L1 )

2 1
0 1

1 0
2 1



247 / 324


L1 (L1 L2 )


2 0
0 1

3 1
2 1



L1 (L1 /2)

248 / 324

1 0
0 1



3
2

21

249 / 324

A ltima matriz a inversa procurada:


A


=

3
2

12

250 / 324

Resoluo de Sistemas de Equaes no Matlab


O sistema de equaes
3a +2b +4c +5d =7
13a +12b +14c +15d =17
31a +22b +14c +25d =27
34a +23b +45c +53d =37
Pode ser representado matricialmente como
3
13

31
34

2
12
22
23

4
14
14
45

5 a
7
b 17
15

25 c = 27
53 d
37

ou MX=b, onde M a matriz de coecientes, X o vetor de


variveis e b o vetor de termos independentes
251 / 324

Algumas formas de calcular o vetor de variveis so:


X=A\b
X=A1 *b
X=A (-1)*b
X=inv(A)*b

252 / 324

Copie o arquivo Planilha_Notas.csv do acervo da disciplina (no


link Lista de Notas) para o diretrio de trabalho do Matlab
O arquivo contem em duas colunas as notas dos alunos de
uma turma nas duas primeiras provas

Se o aluno no zerou nenhuma das provas, e tem possibilidade


matemtica de ser aprovado (pode-se testar isso calculando a
mdia supondo que tire 10 na terceira prova), calcule e escreva
a nota que cada aluno precisa na terceira prova para ser
aprovado na disciplina considerando que a mdia harmnica
ponderada:
6
MH

1
2
3
P1 + P2 + P3

e que a mdia para aprovao sem recuperao deve ser maior


ou igual a 6.
Se o aluno zerou uma ou duas provas, ou precisar mais de 10
na terceira prova, escrever a mensagem "Recuperar".
253 / 324

O coeciente de correlao entre dois conjuntos de dados X


e Y uma medida da relao entre eles e pode ser calculada
por:
P
P
P
(XY ) (X ) (Y )
p
X ,Y = pP
P
P 2
P
(X 2 ) ( (X ))2
(Y ) ( (Y ))2

Calcule o coeciente de correlao entre as notas da primeira e


da segunda prova.

254 / 324

Moda de um conjunto de dados o valor que ocorre com

mais frequncia no conjunto


Mediana: Depois de ordenados os valores por ordem crescente
ou decrescente, a mediana :
o valor que ocupa a posio central, se a quantidade desses
valores for mpar;
a mdia dos dois valores centrais, se a quantidade desses
valores for par.

Encontre a mdia aritmtica, a moda e a mediana da primeira


e da segunda prova dos dados lidos.
Compare a mediana obtida com a obtida pelo comando
median(X), que calcula a mediana.
255 / 324

O desvio padro de um conjunto de valores X dado por:


qX
X
(X 2 ) ( (X ))2

Calcule o desvio padro em cada uma das provas dos dados


lidos
Compare o valor com o valor obtido pela funo std(X), que
calcula o desvio padro de um vetor

256 / 324

O Jogo da Vida
O jogo da Vida (Game of Life) uma simulao de populao
sobre uma matriz de 0's e 1's onde cada clula representa um
indivduo.
A clula com 1 representa um indivduo vivo e a clula com 0
representa um no-vivo
Nessa simulao, a cada iterao gerada uma nova matriz, a
partir da anterior, pelas seguintes regras:
Qualquer clula viva com menos de 2 vizinhos vivos morre (de
solido)
Qualquer clula viva com 2 ou 3 vizinhos vivos continua viva
na prxima gerao
Qualquer clula viva com mais de 3 vizinhos vivos morre (de
superpopulao)
Qualquer clula no-viva com exatamente 3 vizinhos vivos
estar viva na prxima gerao

Considera-se a vizinhana de uma clula as 8 clulas em volta


(acima, abaixo, ao lado e nas diagonais)
257 / 324

Gere uma matriz 15x15, com aproximadamente 50% de 0's e


50% de 1's
Simule 10 geraes de populao, exibindo cada gerao com
o comando spy(M), dando uma pausa de 0.5 segundos entre
cada gerao
Simule 10 geraes a partir de alguns dos padres iniciais a
seguir:

258 / 324

Gerao de matriz com 50% de 0's e 50 % de 1's


M=rand(15)>0.5
ou
M=round(rand(15))

Pode-se calcular a soma dos vizinhos da clula M(i,j) como um


quadrado centrado em i,j
Vizinhos=sum(sum(M(i-1:i+1,j-1:j+1)))-M(i,j)

Para garantir a existncia de vizinhos, pode-se inserir a matriz


M(15,15) em uma matriz (17,17) com zeros. Assim todos os
elementos da matriz M teriam todos os vizinhos.
Z=zeros(17)
Z(2:16,2:16)=M

259 / 324

Alguns padres

260 / 324

Simulao de difuso de calor em uma placa

Z=z e r o s (20 ,20)


f o r i =1:20 , Z(1 , i )=100; Z( i ,1)=100; Z( i ,20)=100;Z(20 , i )=100; end
Z1=Z ;
f o r k =1:1000
p c o l o r (Z) , a x i s ( ' o f f ' ) ;
shading i n t e r p
hold on
pause ( 0 . 0 5 )
f o r i =2:19
f o r j =2:19
Z( i , j )=Z1 ( i , j )+0.051 (Z1 ( i 1, j )+Z1 ( i +1, j )+Z1 ( i , j 1)+Z1 ( i , j +1)4Z1 ( i , j ) ) ;
end
end
Z1=Z ;
end

261 / 324

Difuso de Calor

262 / 324

Grcos sobrepostos

H trs diferentes modos de gerar grcos sobrepostos no


MATLAB: o plot, o hold e linhas de comandos.
Mtodo 1: Usando o comando plot.
Se todos os dados esto disponveis, o comando plot com
mltiplos argumentos pode ser usado para gerar grcos
sobrepostos.
Por exemplo, se houver 3 conjuntos de dados (x1,y1), (x2,y2)
e (x3,y3), o comando plot(x1, y1, x2, y2, ':', x3, y3, 'o'),
desenha (x1,y1) com uma linha slida, (x2,y2) com uma linha
pontilhada e (x3,y3) como vrios pontos separados em forma
de crculos ('o').
263 / 324

Note que todos os vetores devem ter o mesmo tamanho.


Se todos os componente (x1,y1), (x2,y2) e (x3,y3), tiverem o
mesmo tamanho, ento conveniente fazer uma matriz de X
vetores e uma matriz de Y vetores de modo que X = [x1 x2
x3] e Y = [y1 y2 y3], assim o comando plot(X,Y) ir desenhar
os trs grcos na mesma gura com cores diferentes.

264 / 324

Exemplo: A seqncia de comandos abaixo ir gerar o grco a


direita.
 x = [1 2 3; 4 5 6; 7 8 9; 10 11 12]
x=
1
2
3
4
5
6
7
8
9
10 11 12
 y = [2 2 2;5 5 5;8 8 8;11 11 11]
y=
2
2
2
5
5
5
8
8
8
11 11 11
 plot(x,y)

265 / 324

Mtodo 2: Usando o comando hold para gerar grcos


sobrepostos.
Um outro modo de fazer grcos sobrepostos usando o
comando hold.
Digitando 'hold on' em qualquer ponto durante a sesso
congela o grco corrente na janela de grcos.
Todos os subseqentes grcos gerados pelo comando plot so
simplesmente adicionados (e no substitudos) ao grco
existente.
O seguinte arquivo procedimento (Script le) mostra como
gerar o mesmo grco como na gura abaixo, usando o
comando hold.
% Procedimento que g e r a r g r f i c o s s o b r e p o s t o s com o comando hold
x = l i n s p a c e (0 ,2 pi , 1 0 0 ) ;
% Cria o vetor x .
y1 = s i n ( x ) ;
% C a l c u l a y1 .
p l o t ( x , y1 )
% Desenha ( x , y1 ) com uma l i n h a s l i d a .
hold on
% Congela a f i g u r a .
y2 = x ; p l o t ( x , y2 , ' r ' )
% Desenha ( x , y2 ) com uma l i n h a t r a c e j a d a .
y3 = x (x . $\ hat {} $3 )/6+( x . $\ hat {} $5 ) /1 20 ; % C a l c u l a y3 .
p l o t ( x , y3 , ' go ' )
% Desenha ( x , y3 ) com c r c u l o .
a x i s ( [ 0 5 1 5 ] )
% a j u s t a os e i x o s do g r f i c o .
266 / 324
hold o f f
% Descongela a f i g u r a .

Mtodo 3: Usando o comando line para gerar grcos sobrepostos


O line um comando grco de baixo nvel o qual usado pelo
comando plot para gerar linhas. Uma vez que exista um grco na
janela de grco, voc pode adicionar linhas utilizando o comando
line diretamente. O comando line utiliza um par de vetores (ou um
trio em 3D) seguidos de ParameterName / ParemeterValue como
argumentos:
line(xdata, ydata, ParameterName, ParameterValue)

267 / 324

O mesmo grco acima pode ser feito com o comando line ao invs
de ser feito com o comando hold, conforme a seguir:
x = linspace(0,2*pi,100);
y1 = sin(x);
y2 = x;
y3 = x-(x.3)/6+(x.5)/120;
plot(x,y1)
line(x,y2,'linestyle','r')
line(x,y3,'linestyle','go')
axis([0 5 -1 5])
xlabel('x')
ylabel('Aproximao do sen(x)')
legend('sin(t)','Aprox. linear','Aprox. de 5a ordem')
268 / 324

A legenda da gura acima pode ser arrastada para uma outra


posio clicando e segurando o com o mouse em cima da legenda.
269 / 324

Grcos especcos em 2-D


Existem muitas funes especcas de grcos em 2-D. Elas so
usadas como alternativas para o comando plot. Aqui est uma lista
dos possveis modos de desenho em 2D:
area cria uma rea preenchida.
bar cria um grco de barras.
barh cria um grco de barras horizontais.
comet faz uma animao 2D.
compass cria um grco de vetores para nmeros complexos.
contour faz um grco de curvas de nvel.
contourf faz um grco de curvas de nvel preenchidas.
errorbar desenha um grco com barras de erro.
270 / 324

feather faz um grco do vetor velocidade.


ll desenha um polgono preenchido com uma cor especicada.
fplot desenha uma funo de uma nica varivel.
hist faz um histograma.
loglog cria grcos com escala logartmica em ambos os eixos.
pcolor faz um grco de uma matriz, onde cada clula possui
uma cor de acordo com o seu valor.
pie faz um grco em forma de pizza.
plotyy faz um grco com duplo eixo y.

271 / 324

plotmatrix faz uma matriz espalhada.


polar desenha curvas em coordenadas polares.
quiver desenha campos de vetores.
rose faz histogramas em coordenadas polares.
scatter cria um grco espalhado.
semilogx faz um grco semilog com escala logartmica no eixo
x.
semilogy faz um grco semilog com escala logartmica no eixo
y.
stairs desenha um grco em degraus.
stem desenha um grco em fatias.
272 / 324

pie

Populao mundial por continentes


cont = char('sia', 'Europa', 'frica', ...
'Amrica do Norte', 'Amrica do Sul');
pop = [3332; 696; 694; 437; 307];
pie (pop)
for i = 1:5, gtext (cont (i, : ));
end
title ('Populao Mundial (1992)', ...
'Fontsize', 18);

273 / 324

fplot

f(t) = t sen(t), 0 t 10

fplot('x.*sin(x)', [0 10*pi])
Note que a funo para ser desenhada deve ser escrita como uma
funo de x.
274 / 324

semilogx

x = e t , y = t,
0 t 2*

t = linspace (0, 2*pi, 200);


x = exp( -t ); y = t;
semilogx (x, y), grid;
275 / 324

semilogy

x = t, y = e t , 0 t 2

t = linspace (0, 2*pi, 200);


semilogy (t, exp(t))
grid
276 / 324

loglog

x = e t , y = 100 + e 2t ,
0 t 2

t = linspace (0, 2*pi, 200);


x = exp(t); y = 100 + exp(2*t);
loglog (x, y);
grid
277 / 324

polar

= 2 sen (5t), 0 t 2

t = linspace (0, 2*pi, 200);


r = sqrt (abs(2*sin(5*t)));
polar (t, r)

278 / 324

ll

= 2 sen (5t), 0 t 2
x = r cos (t), y = r sen (t);
r

t = linspace (0, 2*pi, 200);


r = sqrt (abs(2*sin(5*t)));
x = r.*cos(t); y = r.*sin(t);
ll (x, y,'k');
axis('square');
279 / 324

bar

= 2 sen (5t), 0 t 2
y = r sen (t);
r

t = linspace (0, 2*pi, 200);


r = sqrt (abs(2*sin(5*t)));
y = r.*sin(t);
bar (t, y);
axis([0 pi 0 inf]);
280 / 324

errorbar

= x - x 3 /3!, 0 t 2
error = faprox sen(x ).

faprox

x = 0: .1: 2;
aprx2 = x - x. 3/6;
er = aprx2 - sin(x);
errorbar (x, aprx2, er);
281 / 324

barh

Populao mundial por


continentes
cont = char('sia', 'Europa', 'frica', ...
'Amrica do Norte', 'Amrica do Sul');
pop = [3332; 696; 694; 437; 307];
barh (pop)
for i = 1:5,
gtext (cont (i, : ));
end
xlabel ('Populao em milhes');
title ('Populao Mundial (1992)', 'Fontsize', 18);

282 / 324

plotyy

y1 = e x sen(x), 0 t 10
y2 = e x
x = 1: .1:10;
y1 = exp(-x).*sin(x);
y2 = exp(x);
Ax = plotyy (x, y1, x, y2);
hy1 = get(Ax(1),'ylabel');
hy2 = get(Ax(2),'ylabel');
set (hy1, 'string','e -x .sen(x)');
set (hy2, 'string','e x');

283 / 324

area

y = sen(x)/x, -3 x 3

x = linspace (-3*pi, 3*pi, 100);


y = -sin(x)./x;
area (x, y)
xlabel ('x'); ylabel ('sen(x)/x ');
hold on
x1 = x (46:55); y1 = y (46:55);
area (x1, y1, 'facecolor','y');

284 / 324

hist

Histograma de 50 nmeros distribudos aleatoriamente entre 0 e 1.


y = randn (50,1); hist (y)

285 / 324

stem

f = e t /5 sen t, 0 t
2
t = linspace(0, 2*pi, 200);
f = exp(-.2*t).* sin(t);
stem(t, f)
286 / 324

stairs

= 2 sen 5t, 0 t 2
y = r sen t

t = linspace(0, 2*pi, 200);


r = sqrt (abs (2*sin(5*t)));
y = r.*sin(t);
stairs (t, y)
axis([0 pi 0 inf])
287 / 324

compass

z = cos + i sen ,
0 2

th = -pi: pi/5:pi;
zx = cos(th);
zy = sin(th);
z = zx + i*zy;
compass (z);
288 / 324

comet

y = t sen t, 0 t 10

q = linspace(0, 10*pi, 200);


y = q.*sin(q);
comet (q, y);
Obs.: melhor visualizar no MATLAB, pois ele desenhado
gradualmente.
289 / 324

contour

z = - (x 2 /2) + xy + y 2
-5 y 5
r = -5: .2:5;
[X, Y] = meshgrid (r, r);
Z = -.5*X. 2 + X.*Y + Y. 2;
cs = contour (X ,Y, Z);
clabel (cs);
290 / 324

quiver

z = x 2 + y 2 -5sen(xy),
-2 x 2, -2 y 2
r = -2: .2: 2;
[X, Y] = meshgrid (r, r);
Z = X. 2 + Y. 2 - 5.*sin(X.*Y);
[dx, dy] = gradient (Z, .2, .2);
quiver (X, Y, dx, dy, 2);
291 / 324

pcolor

z = x 2 + y 2 -5sen(xy),
-2 x 2, -2 y 2
r = -2: .2: 2;
[X, Y] = meshgrid (r, r);
Z = X. 2 + Y. 2 - 5.*sin(X.*Y);
pcolor (Z), axis('o');
shading interp
292 / 324

Grcos 3D

O MATLAB dispe de diversas funes que facilitam a visualizao


do grco 3D. De fato os colormap embutidos podem ser usados
para representar a quarta dimenso. As facilidades dispostas
incluem funes embutidas para plotar curvas espaciais, objetos em
forma de grade, superfcies, superfcies com textura, gerando
contornos automaticamente, especicando os pontos de luz,
interpolando cores e textura e mesmo imagens digitando help
graph3d no comando voc obtm uma lista de funes viveis para
grcos 3D gerais. Aqui est uma lista dos mais comuns:

293 / 324

plot3 plot curvas no espao


stem3 cria dados discretos na plotagem fatiados.
bar3 desenha grcos 3D em barras.
bar3h idem acima para barras horizontais.
pie3 desenha o grco de pizza 3D.
comet3 faz animao grca para grcos 3D.
ll3 desenha guras 3D preenchidas.
contour3 faz os contornos de um grco 3D.
guiver3 desenha vetores de campo em 3D.
scatter3 faz grcos 3D espalhados.
mesh desenha superfcie.
294 / 324

meshc desenha superfcie ao longo de contornos.


meshz desenha superfcie com cortinas.
surf desenha superfcie em 3D (igual ao mesh, porm
preenchido).
surfc idem meshc, porm preenchido.
sur cria superfcie com as fontes de luz especicadas.
trimesh mesh com tringulos.
trisurf surf com tringulos.
slice desenha uma superfcie volumtrica em pedaos.
waterfall cria um grco em forma de cachoeira.
cylinder cria um cilindro.
sphere cria uma esfera.
295 / 324

Processamento simblico no Matlab

O Matlab permite efetuar clculos sobre expresses algbricas


como derivar, integrar ou resolver equaes algbricas.
Para isso so usadas variveis chamadas variveis simblicas.
Para declarar variveis simblicas a, b, c e x usa-se:
ou

syms a,b,c,x

f = sym('a*x 2 + b*x + c');

296 / 324

Pode-se associar valores s variveis de uma expresso


simblica com o comando subs(funo simblica, lista de
variveis, lista de valores)
Ex:
 f = sym('a*x 2 + b*x + c');
 subs(f,x,5)
ans =
25 * a + 5 * b + c
 subs(f,[x a b c],[5 1 2 3])
ans =
38

297 / 324

Pode-se plotar funes simblicas com o comando ezplot:

syms x
f=sin(x)
ezplot(f) ou ezplot(sin(x)): plota a funo no intervalo -2 a
2
h=ezplot(f,[x1 x2]): plota a funo no intervalo [x1,x2]
set(h,'Color','r','Marker','v'): dene cor e estilo da linha do
plot,onde 'h' recebeu o ezplot anterior

298 / 324

ezsurf(f): plota uma superfcie para uma funo de duas


variveis
ezsurf(f,[[1 2] [5 7]); % x de 1 a 2, y de 5 a 7
ezsurf( 'real(atan(x+i*y))' );

299 / 324

Integrao e Derivao

O Matlab calcula a derivada e integral algbrica de funes


simblicas:

di(f) - encontra a expresso da derivada primeira da funo f


di(f,2) - encontra a expresso da derivada segunda da funo
f

Encontra a expresso da derivada parcial de uma funo de


vrias variveis:
f = sin( x * t )
di(f,t) % derivada de f em relao a t

300 / 324

A expresso da integral indenida de uma funo simblica f


pode ser obtida com int(f)
O valor da integral denida de uma funo simblica f no
intervalo [a b] pode ser calculada por int(f,a,b)
O clculo do somatrio innito de termos de uma srie de
termo igual a t pode ser calculado por s1 = symsum(t,1,inf)

301 / 324

Clculo de Razes

Para encontrar as razes de uma funo pode-se usar o


comando solve( )
syms x
f=2*x 2 + 4*x -8;
solve(f,x)

302 / 324

Gerao de Malhas no Matlab

Faa um script que gere uma matriz com os valores da funo


( , ) = xe x

z x y

2 y 2

para x de -1.5 a 1.5 com incrementos de 0.5, e y tambm de


-2 a 2 com incrementos de 0.5.

303 / 324

i =1;

f o r x = 2:0.5:2

j =1;

f o r y = 2:0.5:2

z ( i , j )=x exp( x^2 y ^2);


j=j +1;

end

end
i=i +1;

304 / 324

A matriz a seguir mostra os valores de x e y utilizados para o


clculo de z em cada clula.
-1.5,-2.0
-1.5,-1.5
-1.5,-1.0
-1.5,-0.5
-1.5,0.0
-1.5,0.5
-1.5,1.0
-1.5,1.5
-1.5,2.0

-1,-2.0
-1,-1.5
-1,-1.0
-1,-0.5
-1,0.0
-1,0.5
-1,1.0
-1,1.5
-1,2.0

-0.5,-2.0
-0.5,-1.5
-0.5,-1.0
-0.5,-0.5
-0.5,0.0
-0.5,0.5
-0.5,1.0
-0.5,1.5
-0.5,2.0

0,-2.0
0,-1.5
0,-1.0
0,-0.5
0,0.0
0,0.5
0,1.0
0,1.5
0,2.0

0.5,-2.0
0.5,-1.5
0.5,-1.0
0.5,-0.5
0.5,0.0
0.5,0.5
0.5,1.0
0.5,1.5
0.5,2.0

1.0,-2.0
1.0,-1.5
1.0,-1.0
1.0,-0.5
1.0,0.0
1.0,0.5
1.0,1.0
1.0,1.5
1.0,2.0

1.5,-2.0
1.5,-1.5
1.5,-1.0
1.5,-0.5
1.5,0.0
1.5,0.5
1.5,1.0
1.5,1.5
1.5,2.0
305 / 324

O comando [ X,Y ] = meshgrid(-2:2, -2:2); cria duas matrizes


X e Y, de dimenso 5x5. A matriz X tem 5 colunas, cada
coluna contendo repetidamente o valor de X naquele ponto
(para Y de -2 a 2), e a matriz Y tem a coordenada Y para
cada ponto a ser calculado.
As duas matrizes so mostradas abaixo:
-2
-2
-2
-2
-2

-1
-1
-1
-1
-1

0
0
0
0
0

1
1
1
1
1

2
2
2
2
2

-2
-1
0
1
2

-2
-1
0
1
2

-2
-1
0
1
2

-2
-1
0
1
2

-2
-1
0
1
2

306 / 324

A partir das matrizes X e Y, pode-se calcular uma funo


Z(X,Y) na forma matricial, onde em cada posio (x,y), como
valores de X e Y, sero usados os valores da posio (x,y)
correspondente em cada matriz.
Ex:[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X. 2 + Y. 2) + eps;
Z = sin(R)./R;
mesh(Z) % plota um wireframe da funo Z
surf(Z) % plota uma superfcie com a funo Z

obs: eps o menor valor positivo no matlab (1052 )

307 / 324

mesh(Z)

308 / 324

surf(Z)

309 / 324

contour(Z)

310 / 324

o comando [U V]=gradient(Z); calcula as componentes U e V


do gradiente numrico da funo Z de duas variveis. Esse
gradiente pode ser plotado na forma de vetores atravs do
comando:
quiver(X,Y,U,V);

311 / 324

Respostas (parciais) dos exerccios de vetores


V00000100

disp(length(nd(Vle0)))

V00000300

disp(a(nd(rem(a,2)==0)))
disp(a(nd(rem(a,2)==1)))
ou
disp([a(nd(rem(a,2)==0)) a(nd(rem(a,2)==1))])

V00000700

a(nd(a<0))=abs(a(nd(a<0)))

V00000800

disp(max(V))

V00000900

[min pos]=min(V);
disp(['O menor elemento de N ' numstr(min) ' e a sua posio ' pos])
312 / 324

V00001100

disp(iplr(V))

V00002600

[max pos]=max(V);
V=[V(pos:10) V(1:pos-1)]

313 / 324

M00000100

disp(sum(diag(M)))

M00000150

disp(sum(diag(iplr(M))))

M00000200

disp(sum(sum(triup(M,1))))

M00000300

disp(sum(sum(triup(iplr(M),1))))

M00000350

N=triup(M,1)
disp(sum(sum(triup(iplr(N),1))))
314 / 324

M00000400

[mv lmv]=max(M)
[maior colmaior]=max(mv)
linmaior=lmv(colmaior)

M00000600

M=[M(1,:);M(4,:);M(3,:);M(2,:);M(5,:)]

M00000700

disp(isequal(M,eye(5,5)))

M00000800/900

[m p]=sum(M')
disp(p)

M00001000

SomaCol=sum(M)
Somalin=sum(M')
315 / 324

M00001010

if (isequal(M(1,:),ones(1,3)) || isequal(M(2,:),ones(1,3))||
isequal(M(3,:),ones(1,3)) ||isequal(M'(1,:),ones(1,3)) ||
isequal(M'(2,:),ones(1,3)) || isequal(M'(3,:),ones(1,3)) ||
isequal(diag(M),ones(1,3)) || isequal(diag(M'),ones(1,3)))
disp(1)
elseif ...

M00001100

dif=sum(M')-diag(M)
if (size(nd(dif>0))>0 && size(nd(dif<0))==0)
disp(1)
else disp(0)

316 / 324

O Sudoku um puzzle em que deve-se colocar todos os


nmeros de 1 a 9 em cada linha, coluna e sub-matriz 3x3.
Faa um script em matlab que leia uma instncia de um
sudoku e verique se uma soluo vlida escrevendo uma
mensagem apropriada.

317 / 324

Exerccios de provas anteriores

(2015 - Questo 3) (3.3 pontos) Faa um algoritmo que leia


uma matriz de 20 linhas x 20 colunas. O algoritmo devera
escrever todos os elementos da linha que contem a maior
diferena entre o maior e o menor elemento. Ex:
Lidos:
34725
13845
47526
35764

Deve ser escrita toda a segunda linha (1 3 8 4 5) pois a


diferena entre o maior e o menor elemento da linha (8 - 1)
a maior diferena de todas.
318 / 324

(2011 - Questo 1) (3.5 pontos) Faa um algoritmo que leia,


para uma dada parada de nibus, os horrios (hora e minuto)
dos 100 nibus que passam naquela parada a cada dia. Ordene
os horrios em ordem crescente de hora e, para a mesma hora,
minuto. Leia, a seguir, o horrio em que um passageiro chega
na parada e escreva o horrio do prximo nibus que passar
na parada.

319 / 324

(2013 - Questo 2) (3.0 pontos) A distncia entre dois pontos


de coordenadas (x1 ,y1 ) e (x2 ,y2 ) pode ser calculada por
p
(x1 x2 )2 + (y1 y2 )2 ). Faa um algoritmo que leia para
100 pontos suas coordenadas x e y e encontre e escreva as
coordenadas dos dois pontos mais prximos entre si.

320 / 324

1) (3.5 pontos) Faa um algoritmo que leia, para 45 partidas


de futebol, o cdigo dos dois times que disputaram (os times
so numerados de 1 a 10) e o escore (gols do primeiro time e
gols do segundo), e escreva o nmero do time campeoao nal
das 45 partidas. Cada vitria d 3 pontos e cada empate d 1
ponto. Considere que o time campeo o que fez mais pontos
e, em caso de empate em pontos, o que teve maior saldo de
gols (diferena entre quantidade de gols feitos e gols tomados).

321 / 324

Ex: Suponha a seguinte lista de times:


1 - Manchester
2 - Barcelona
3 - Internazionale
4 - Bayern

Uma possvel entrada de dados seria (time1 time2 gols1


gols2):
1 2 1 2 (Manchester 1 x 2 Barcelona)
4 3 1 0 (Bayern 1 x 0 Internazionale)
3 1 1 0 (Internazionale 1 x 0 Manchester)
2 4 2 0 (Barcelona 2 x 0 Bayern)

E o campeo seria o time 2, com 6 pontos (duas vitrias)


322 / 324

2) (3 pontos) Joo quer ir de Uruguaiana a Caxias do Sul e


para isso necessrio ir de Uruguaiana a Porto Alegre e pegar
outro nibus para ir de Porto Alegre a Caxias. E ele quer fazer
isso de forma a esperar o menor tempo possvel na rodoviria
em Porto Alegre. H 5 horrios de Uruguaiana a Porto Alegre
e 10 horrios de Porto Alegre a Caxias. Faa um algoritmo que
leia a lista dos 5 horrios de sada de Uruguaiana e chegada
em Porto Alegre (horas inteiras) dos 5 nibus
Uruguaiana-Porto Alegre e a lista dos 10 horrios de sada de
Porto Alegre e chegada em Caxias (horas inteiras) dos 10
horrios Porto Alegre-Caxias do Sul. O algoritmo deve escrever
ao nal qual o horrio de sada do nibus que Joo deve pegar
em Uruguaiana de modo a esperar o menor tempo possvel em
Porto Alegre pela conexo para Caxias.
323 / 324

3) (3.5 pontos) Faa um algoritmo que leia uma matriz


M[1..31,0..23] contendo a concentrao de coliformes em uma
sada de esgoto medida a cada hora (da hora 0 at a hora 23)
durante 31 dias (do dia 1 ao dia 31). Assim, cada coluna da
matriz representa uma hora do dia e cada linha representa um
dia do ms. O algoritmo deve escrever, ao nal, a hora e o dia
em que ocorreu a maior concentrao, bem como o dia em
que ocorreu a maior concentrao mdia ao longo das 24 horas
e a hora em que ocorreu a maior concentrao mdia ao longo
dos 31 dias.

324 / 324