Você está na página 1de 17

1

TEXAS TECH
U N I V E R S I T Y
Traduzido por Eduardo Tavares de Sousa
e Rafael Perazzo Barbosa Mota
Matemtica 4330/5344 - # 3
Laos, desvios condicionais, exemplos e programao
1. Introduo
O Matlab oferece um ambiente interativo amigvel para visualizao e programao
cientifica. O Matlab vem evoluindo para um poderoso ambiente computacional para o
desenvolvimento e testes de modelos, como a obteno de avaliaes imadiatas
sobre solues de problemas dificeis. Alm disso existem inumeros toolboxes (caixa
de ferramentas) que expandem consideravelmente o potencial de uso do MatLab. Por
exemplo, com a toolbox do compilador de C voc pode transformar programas em
cdigo C e at mesmo executar programas em C. Nesta aula, continuarei introduzindo
as vrias construes bsicas do MatLab. Falaremos sobre os laos for, while ,
desvios if, relaes como igual (==), diferente (~=), menor que (<) (ou igual que <=) e
maior que (>) (ou igual que >=). Comearemos introduzindo o conceito do arquivo m
do MatLab (programa) e algumas ferramentas para tornar esses programas
interativos, como o comando input. Falaremos sobre comandos de programao
importantes como o any, all e find . Alguns exerccios no final desta aula tem
como objetivo continuar a reforar sua abilidade em construir matrizes com estruturas
especiais usando comandos embutidos do MatLab como o diag , eye , rot90, tril ,
e obviamente o Colon notation .
2. Aula 3 : Laos for , declaraes if e while , e mais da sintaxe do
MatLab
Nesta seo introduziremos muitas construes teis usadas constantemente na
programao com o MatLab.
1. A declarao do programa
X=input(algum texto definindo x)
Permite a voc inserir interativamente o valor de x durante a execuo do
programa. Por exemplo, no ltimo exerccio, voc construiu vetores de tamanhos
dados com propriedades dadas sem a interao com o usurio. Para propsitos de
programao, interessante permitir que o usurio insira qualquer tamanho
desejado de um vetor no momento da execuo do programa.
N=(Insira um inteiro);
Depois coloque o comando:
V=(1:2:n).^2
2
Assim fazendo, ser solicitado ao usurio a insero de um nmero inteiro e o
vetor v ficar definido da seguinte maneira: V=[1 9 25 49 ... n
2
] , onde n o nmero
de elementos do vetor.
NA PRTICA :

2. Na programao em MatLab existem alguns tipos de laos e desvios condicionais.
(a) Primeiro vamos considerar o lao for. A sintaxe
For {var}={um vetor de valores contados}
{comandos}
end
por exemplo:

for i=1:3 {i varia de 1 at 3}
x(i)=i^2 {o elemento de indice i do vetor x e igual ao quadrado de i}
end
produz x=[1 4 9 ]
(b) Aqui temos um exemplo de laos for aninhados
For i=1:5
For j=1:5
A(i,j)=1/(i+j-1)
End
End
Para fazer essas mesmas operaes com mais eficincia no MatLab, podemos
usar o seguinte comando :
aa=hilb(5)
Na prtica :
Ex: Digitando-se 5 para o valor
de n.
n=input('Insira um inteiro: ');
Insira um inteiro: 5
v=(1:2:n).^2
v =
1 9 25
USANDO O for
for i=1:5
for j=1:5
A(i,j)=1/(i+j-1);
end
end
A
A =
1.0000 0.5000 0.3333 0.2500 0.2000
0.5000 0.3333 0.2500 0.2000 0.1667
0.3333 0.2500 0.2000 0.1667 0.1429
0.2500 0.2000 0.1667 0.1429 0.1250
0.2000 0.1667 0.1429 0.1250 0.1111
USANDO O hilb
aa=hilb(5)
aa =
1.0000 0.5000 0.3333 0.2500 0.2000
0.5000 0.3333 0.2500 0.2000 0.1667
0.3333 0.2500 0.2000 0.1667 0.1429
0.2500 0.2000 0.1667 0.1429 0.1250
0.2000 0.1667 0.1429 0.1250 0.1111
3
(c) Aqui temos um exemplo do uso do lao for para exibir o fenmeno do
arredondamento de erros. Calculando os valores de um polinomio de sexto
grau pelo mtodo dumb e depois plotando o grfico da funo , voc ver que
teremos uma figura que nos mostrar uma coisa muito esquisita um polinomio
de sexto grau aparenta Ter mais do que seis zeros. A necessidade de ser
cuidadoso na programao deve ficar clara com esse exemplo. Este arquivo
est disponvel no subdiretrio SciCOmpFiles. Voc pode mudar para o diretrio
SciCompFiles e executar o arquivo simplismente teclando o nome zoom.
Lembre-se que todos os arquivos de rotina e funo devem terminar com a
extenso .m.
%ROTINA ARQUIVO ZOOM
%PLOTA (x-1)^6 perto de (x-1) com
% escala refinada de incremento
% Calculo de (x-1)^6 via
% x^6-6x^5+15x^4-20x^3+15x^2-6x+1
% que tende para um cancelamento severo
close all
k=0;
for delta =[.1 .01 .008 .007 .005 .003 ]
x=linspace(1-delta,1+delta,100);
y=x.^6 6*x.^5 + 15*x.^4 20*x.^3 + 15*x.^2 6*x+
ones(100,1);
k=k+1;
subplot(2,3,k)
plot(x,y,x,zeros(1,100))
axis([1-delta 1+delta-max(abs(y)) max(abs(y))])
end
HILB Matriz de Hilbert
HILB(N) uma matriz N por N com elementos 1/(i+j-1),
que um famoso exemplo de uma matriz mal condicionada.
Consulte INVHILB para extrair a inversa.
4
Grdfico do programa escrito acima zoom
3. O proximo condicional o desvio if
if {relao}
{comandos}
end
Mais genericamente, voc pode escrever:
if { relao }
{comandos}
else if {relao}
{comandos}
else
{comandos}
end
(a) Aqui temos um exemplo de laos for e desvios if aninhados. Primeiro,
usaremos o comando input para selecionarmos um valor n.
n=4
clear A
for i=1:n
for j=1:n
if i<j
A(i, j)=-1;
elseif i>j
A(i, j)=0;
0.9 1 1.1
-5
0
5
x 10
-7
0.99 1 1.01
-1
-0.5
0
0.5
1
x 10
-12
0.995 1 1.005
-2
-1
0
1
2
x 10
-13
0.995 1 1.005
-1
-0.5
0
0.5
1
x 10
-13
0.995 1 1.005
-1
0
1
x 10
-14
0.998 1 1.002
-5
0
5
x 10
-15
RESULTADOS NA PRTICA (executando-se
um arquivo com os comandos ao lado)
n =
4
A =
1 -1 -1 -1
0 1 -1 -1
0 0 1 -1
0 0 0 1
5
else
A(i, j)=1;
end
end
end
A
Como ilustrao do poder de se usar funes embutidas do MatLab, esta matriz
pode ser construida tambm da seguinte maneira:
AA=eye(n)-triu(ones(n),1)
4. Agora temos o lao condicional while
while {relao}
{comandos}
end
a) Aqui temos um exemplo:
j=1;
while j<=10
k(j)=cos(j*pi);
j=j+1;
end
k
% compare esse com
kk=cos((1:10)*pi)
b) Aqui um exemplo do [2]: O problema achar o menor inteiro positivo q tal que 2
-
q
=0 no ponto aritmtico flutuante .
x=1; q=0;
while x>0
RESULTADOS N PRTICA DO COMANDO AO
LADO
AA=eye(n)-triu(ones(n),1)
AA =
1 -1 -1 -1
0 1 -1 -1
0 0 1 -1
0 0 0 1
COMPARAO
kk=cos((1:10)*pi)
kk =
-1 1 -1 1 -1 1 -1 1 -1 1
RESULTADO DOS COMANDOS AO
LADO
k =
-1 1 -1 1 -1 1 -1 1 -1 1
RESULTADOS
q =
1075
6
x=x/2; q=q+1;
end
q
c) Aqui um exemplo de como achar o menor inteiro p tal que 1+2
-p
=1 no ponto
aritmtico flutuante.
x=1; p=0; y=1; z=x+y;
while x~=z
y=y/2; p=p+1; z=x+y;
end
p
2*y
eps
Note que 2*y nos d o menor ponto flutuante no nulo no eps* do MatLab.
* Ponto flutuante de preciso relativa.
5. Nos conceitos if e while descritos ns introduzimos a notao de relao. Uma
relao tem a seguinte forma genrica:
{matriz}{relao}{matriz}
a) As operaes relacionais so
==igual ~=diferente
<menor que <= menor que ou igual
>maior que >=maior que ou igual
b) O valor de uma relao uma matriz contendo zeros e uns. Uma entrada zero
se a relao falsa e 1 se a relao verdadeira.
c) Por exemplo , se
A=[1 2; 3 4]; B=[1 2;2 4]
T1=A==B
retorna a matriz
T1=[1 1; 0 1]
Tente esses outros exemplos :
T2=A<=B
T3=A>B
T4=A<=3
T5=A~=B
p =
53
ans =
2.2204e-016 {2*y}
ans =
2.2204e-016 {eps}
ENTENDA MELHOR
a
11
=1 =b
11
, ento T
11
=1 (verdadeiro)
a
12
=2 =b
12
, ento t
12
=1 (verdadeiro)
a
21
=3 ,b
21
=2,ento t
21
=0 (falso)
a
22
=4 =b
22
, ento t
22
=1 (verdadeiro)
T2=A<=B
T2 =
1 1
0 1
T3=A>B
T3 =
0 0
1 0
T4=A<=3
T4 =
1 1
1 0
7
d) Outras operaes teis usadas nas expresses relacionais so:
& % e
| %ou
~ %no
Estes so usados em matrizes obtidas a partir de uma matriz relacional (com
zeros e uns). Por exemplo:
T1=[1 1; 0 1]; T2=[1 0;0 0]
T=T1&T2
nos d a matriz
T1=[1 0;0 0]

e
T=T1|T2
nos d a matriz
T=[1 1;0 1]
Finalmente
T=~T1
nos d a matriz
T=[0 0;1 0]
6. Dois comandos de programao teis que produzem matrizes formadas por zeros
e uns so o any e o all. Para vetores , any(v) retorna 1 se algum dos elementos do
vetor no nulo. Caso contrrio o retorno ser zero. Para matrizes, any (x) opera
nas colunas de X, retornando um vetor linha de uns e zeros. Um exemplo de como
usar o comando any, vamos :
M=floor(11*rand(3,4))-1
any(M>=8)
T5=A~=B
T5 =
0 0
1 0
NA PRTICA:
M =
9 4 4 3
1 8 -1 5
5 7 8 7
ans =
1 1 1 0
O comando rand um comando usado para gerar matrizes com
numeros aletorios. No exemplo acima, gerada uma matriz
randomica de ordem 3 por 4, depois cada elemento
multiplicado por 11 e finalmente cada elemento resultante
decrementado de uma unidade.
J o comando floor transforma cada elemento da matriz para um
numero inteiro, ou seja, retorna a parte inteira de cada elemento,
despresando a parte fracionria.
8
Aqui um programa que faz o mesmo que o comando any
v(5:2:10)=5:2:10;
w=0;
k=1;
while (k<=length(v)&w==0)
if v(k)~=0
w=1
end
k=k+1;
end
Agora compare com o comando:
any(v)
7. Agora, consideremos o comando all. Para vetores, all(v) retorna 1 se todos os
elementos do vetor V so no-nulos. Caso contrrio retorna zero. Para matrizes,
all(x) opera nas colunas de (x) retornando um vetor linha de zeros e uns.
Aqui um exemplo:
M=floor(11*rand(3,4))-1
all(M<=8)
8. O comando find muito til na programao. I=find(x) retorna os indices do vetor X
que so no nulos. Por exemplo, I=find(A>100), retorna os indices dos elementos
de A que so maiores que 100.
[I,J ]=find(X) retorna os indices da linha e da coluna dos elementos no nulos da
matriz X.
x=floor(10*rand(1,20))
I=find(x==3)
NA PRTICA
w =
1
USANDO O any(v)
any(v)
ans =
1
NA PRTICA
M =
9 3 3 2
7 9 8 7
0 9 -1 -1
ans =
0 0 1 1
9
J=find(x<5)
9. Outro comando til o diag. Se V um vetor linha ou coluna com N componentes,
diag(V,K) a matriz quadrada de ordem N+abs(K) (lembre-se que abs o valor
absoluto) com os elementos de V na K-sima diagonal. K=0 a diagonal principal,
K>0 est acima da diagonal principal e K<0 abaixo da diagonal principal. diag(V)
simplismente coloca V na diagonal principal. Por exemplo:
m=3
D= diag(-m:m) + diag(ones(2*m,1),1) + diag(ones(2*m,1),-1)
produz uma matriz tridiagonal de ordem 2*m+1.
Se A uma matriz, (A,K) um vetor coluna formado a partir dos elementos da k-
gesima diagonal de A . diag(A) a diagonal principal de A, diag((A)) uma matriz
diagonal.
V=round(10*rand(1,4))
diag(V)
diag(V,1)
e
A=round(10*rand(4))
diag(A)
diag(diag(A))
NA PRTICA
x =
Columns 1 through 12
1 2 1 6 2 1 0 7 4 9 4 4
Columns 13 through 20
8 5 2 6 8 0 6 3
I =
20
J =
1 2 3 5 6 7 9 11 12 15 18 20
No exemplo dado,
primeiramente gerado
um vetor v
randomicamente com 20
posies , depois forma-se
o vetor I com os indices
dos elementos do vetor x
que so iguais a 3. J o
vetor J contem os indices
dos elementos de x que
so menores que 5.
NA PRTICA
V =
8 7 3 3
ans =
8 0 0 0
0 7 0 0
0 0 3 0
0 0 0 3
ans =
0 8 0 0 0
0 0 7 0 0
0 0 0 3 0
0 0 0 0 3
0 0 0 0 0
NA PRTICA
A =
3 8 5 8
5 6 4 10
7 4 7 5
3 7 6 9
ans =
3
6
7
9
ans =
3 0 0 0
0 6 0 0
0 0 7 0
0 0 0 9
10
10. Finalmente consideremos os comandos triu e tril para matrizes triangulares
superiores e inferiores. Descreveremos apenas o comando triu, consulte a ajuda
para o comando tril. Para uma matriz A, triu(A) a parte superior de A . K=0 a
diagonal principal, K>0 est acima da diagonal principal e K<0 est abaixo da
diagonal principal.
A=round(10*rand(4))
triu(A)
triu(A,1)
triu(A,-1)
11. Finalmente, descreveremos um comando frequentemente usado rot90 que usado
para girar os elementos da matriz. A sintaxe geral rot90(A,k) onde k um inteiro
positivo ou negativo correspondente a K*90 graus de rotao.
A=diag(-2:2)
B=rot90(A)
NA PRTICA
A =
2 9 9 3
10 7 2 5
3 1 3 1
3 0 7 10
ans =
2 9 9 3
0 7 2 5
0 0 3 1
0 0 0 10
ans =
0 9 9 3
0 0 2 5
0 0 0 1
0 0 0 0
ans =
2 9 9 3
10 7 2 5
0 1 3 1
0 0 7 10
NA PRTICA (11)
A =
-2 0 0 0 0
0 -1 0 0 0
0 0 0 0 0
0 0 0 1 0
0 0 0 0 2
B =
0 0 0 0 2
0 0 0 1 0
0 0 0 0 0
0 -1 0 0 0
-2 0 0 0 0
11
EXERCCIOS 3
1. Escreva um pequeno programa no matlab para ler um valor n e construir uma matriz n
por n com os nmeros 1,2,...,n na diagonal principal e zeros nas demais posies
(Dica: Consulte o comando diag) .
Sol.
clear
n=input('Digite o valor de n: ');
A=(1:n)
D=diag(A)
2. Escreva um pequeno programa no MatLab para ler um valor n e construir uma matriz
A nxn com elementos a
ij
=3
ij
. Primeiramente tente fazer usando laos e depois tente
refazer sem usar laos.
Sol.
%Exerccio 2 Usando Loops
clear
n=input('Digite o valor de n: ');
for i=1:n
for j=1:n
A(i,j)=3.^(i*j);
end
end
A
3. Escreva um pequeno programa no MatLab usando laos para calcular os 100
primeiros numeros da sequencia de Fibonnaci.
a
1
=1; a
2
=1; a
3
=a
n-1
+a
n-2
Sol:
a_ant=0; a=1; a_prox=1; %Valores iniciais
for cont=1:97 %Calcular os 97 numeros restantes da serie
a_ant=a; %Atribuio dos valores
a=a_prox
a_prox=a_ant+a;
end
4. Escreva um arquivo-m do MatLab que leia um valor inteiro n, um numero w e um vetor
x com n elementos. Depois escreva um programa com lao for para construir matrizes
A,B,C com os elementos dados. Depois tente refazer o problema sem usar laos
usando a sintaxe do MatLab.
(a) a
ij
=w
(i-1)(j-1)
(b) b
ij
=1/(i+1-1)
12
(c) c
ij
=x
i
(j-1)
Aqui uma sintaxe para ler os n,w,x.
n=input('Digite um inteiro n =');
w=input('Digite um numero w =');
x=input('Digite um vetor n, x=');
Sol
n=input('Digite n: '); %Leitura de n
w=input('Digite w: '); % Leitura de w
for i=1:n %Leitura do vetor x
x(i)=input('Digite o valor do vetor : ');
end
for i=1:n
for j=1:n %Construo das matrizes
A(i,j)=w^((i-1)*(j-1)); %letra (a)
B(i,j)=1/(i+1-1); %letra(b)
C(i,j)=(x(i))^((j-1)); %letra c
end
end
A
B
C
5. Neste exerccio vamos considerar o exemplo do lao while para solucionar o problema
relatado no exemplo na parte 4 b) onde determinamos o menor inteiro q , que 2
-q
=0.
Escreva um pequeno programa no MatLab para achar o menor inteiro positivo r, tal
que 2
r
= no ponto aritmetico flutuante. Note que infinito no MatLab denotado por inf.
Dica: Voc dever usar um lao while assim : while x~=inf .
Sol
r=0; %Inicializa r em 0
while (2^r) ~= inf %Enquanto 2 elevado a r nao for infinito
r=r+1;
end
r %Mostra o menor inteiro tal que 2^r = inf
6. Escreva um novo programa baseado no arquivo zoom.m onde voc muda apenas a
maneira com que a funo calculada. Use
y=(x-1).^6
ao invs da verso estendida. Qual sua concluso de qual a melhor maneira de se
visualizar essa funo ?
7. O seguinte cdigo gera 100 matrizes 2x2 com coeficientes inteiros no intervalo
k=1,2,3,...,20. Para cada K fixo, ele encontra o percentual que singular.
13
percent =zeros(1,20);
for k=1:20
for i=1:100
if det(floor((2*k+1)*rand(2) - k)) ==0
percent(k)=percent(k)+1;
end
end
end
percent
(a) O que os valores da varivel percent nos diz sobre a percentagem de matrizes que
so singulares medida que K aumenta ?
A medida que K incrementado o percentual de matrizes singulares diminui
(b) Repita o teste para matrizes 3x3. O que voc pode falar sobre a percentagem de
matrizes singulares neste caso ?
A quantidade de matrizes singulares tambm tende a diminuir quando aumentamos
a ordem para 3x3
(c) O que isto indica sobre o percentual de matrizes singulares a medida que o
tamanho da matriz aumenta ?
Indica que a medida que aumentamos a ordem da matriz tambm diminui a
percentagem de matrizes singulares.
8. Para qualquer n, construa uma matriz nxn
e encontre a inversa.
n=input('Digite n:'); %insere o valor da ordem da matriz
A=diag(ones(1,n-1),-1)+eye(n); %monta a matriz A colocando na
diagonal inferior um vetor de uns e somando identidade
A
InvA=inv(A) % Cria a inversa de A

=
1 1 0 0
0 0 1 1
0 0 0 1
!
" " " " "
!
!
A
14
9. Faa um programa que tenha como entrada os vetores a e b do mesmo tamanho n e
construa a matriz
Encontre o determinante. Use casos simples. Voc ver que a resposta depende apenas
do vetor b. Voc sabe como ?
clear
n=input('Digite o valor do tamanho dos vetores: ');
for i=1:n
a(i)=input(sprintf('Valor de a(%i): ',i)); % Recebe os valores
de a e b
b(i)=input(sprintf('Valor de b(%i): ',i));
end
C=[ones(n,1)*a]+diag(b,0); % Monta a matriz somando a diagonal
principal por b
C=[a;C]; % Coloca o vetor 'a' no topo da matriz C
C=[ones(n+1,1) C]; % coloca um vetor coluna de uns no inicio de C
C
det(C)
Depende sim pois se pelo menos 1 elemento do vetor b for igual a zero teremos duas
linhas iguais consequentemente o determinante igual a zero
10. Escreva um programa que tenha como entrada dois numeros a e b, e construa uma
matriz 2kx2k (voce deve entrar com o k)
(a est na diagonal principal e b na diagonal secundaria e todos os outros elementos so
0). Encontre o determinante. Use casos simples. Uma formula para o determinante (a
x
-
b
y
)
z
para algum x,y e z. Encontre x,y,z.
a=input('Digite a: ');
b=input('Digite b: ');
k=input('Digite k: ');

+
+
=
n n
n
n
n
b a a a a
a a a a
a a b a
a a a a
C
3 2 1
3 2 1
3 1 1
3 2 1
1
1
1
1
"

=
a b
b a
C
0 0
0 0
0 0
0 0
!
# $
" "
$ ! #
!
15
C=eye(2*k)*a; % multiplica a pela identidade ou seja coloca a na
diagonal principal
C=C+fliplr(eye(2*k))*b % coloca b na diagonal secundria
multiplcando b pela identidade invertida da direita para esquerda
Aps calcularmos literalmente o determinante de matrizes 2x2 e 4x4 notamos que se
pode resumir o determinante na forma (a
2
-b
2
)

onde sempre coincide com o valor de k


logo x=y=2 e z=k.
11. Para qualquer inteiro positivo n construa a matriz
Calcule o determinante. Compare d=1!2!3!...(n-1)!.
clear
j=2; m=1;
n=input('Digite n: ');
while (m<=n-1) %Construo da matriz, excluindo a coluna1
for i=1:n
A(i,j)=i^m;
end
m=m+1;
j=j+1;
end
j=1;
for i=1:n % Construo da coluna 1 da matriz
A(i,j)=1;
end
A
determinante=det(A)
CP=1;
k=1; fat=1; %Calculo do produto 1!2!3!...(n-1)!
while k<=(n-1) for i=k:-1:1
fat=fat*i;
end
k=k+1;
end
if determinante==fat disp('O determinante igual ao produto dos
fatoriais !')
else disp('No h nenhuma relao entre determinante e esse
produto !')
end

1 2
1 2
1 2
1 2
1
3 3 3 1
2 2 2 1
1 1 1 1
n
n
n
n
n n n
C
!
" " " " "
!
!
!
16
Problemas Extras
1. Escreva um programa que tenha entradas um vetor a de tamanho n e construa a
matriz
Consideremos que C
k
denote o determinante da submatriz de C dada por C(1:k,1:k) para
K de 3 at n. Parece ser verdade que C
k
=a
k
C
k-1
+C
k-2
?
2. Escreva um programa que tenha entradas dois vetores a e b de tamanho n e construa
a matriz

=
n
a
a
a
a
C
1 0 0
0 1 1 0
0 0 1 1
0 0 1
3
2
1
! !
" " " " " "
!
!
! !

=
n
a b b b
a a b b
a a a b
C
3 2 1
2 2 2 1
1 1 1 1
1 1 1 1
"
!
!
!
17
(Note que o tamanho de C (n+1)x(n+1).) Encontre o determinante. Como podemos
achar a formula do determinante em termos de a e b ?
3. Escreva um programa que tenha entrada um vetor a de tamanho n e um nmero x,
depois construa a matriz
Depois defina a funo , calcule a derivada de f. Depois tente
comparar o determinante de A com d=f(x)-xf'(x) (isto , escreva uma srie de comandos
no matlab que calcule f e f' e d voce deve querer determinar a derivada de f tendo em
mos antes uma formula para isto.)

=
) (
) 2 (
) 1 (
n a x x
x a x
x x a
A
!
" # # "
#
!

=
=
n
j
x j a x f
1
) ) ( ( ) (