Professional Documents
Culture Documents
AVANADO
Melissa Weber Mendona
UFSC
Contedo
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
4
4
5
6
7
8
9
11
12
14
15
16
16
17
18
19
2 Grficos em 2D e 3D
2.1 Grficos em 2D . . . . . . . . . . . . . . .
2.1.1 Comando plot . . . . . . . . . . .
2.1.2 Retas e segmentos: line . . . .
2.1.3 Regies preenchidas: fill . . .
2.1.4 Subgrficos: subplot . . . . . . .
2.1.5 Curvas no espao: plot3 . . . . .
2.2 Grficos em 3D . . . . . . . . . . . . . . .
2.2.1 Criador de malha: meshgrid . .
2.2.2 Superfcies . . . . . . . . . . . . . .
2.2.3 Curvas de nvel . . . . . . . . . . .
2.2.4 Opes . . . . . . . . . . . . . . . .
2.2.5 Outros comandos . . . . . . . . . .
2.2.6 Grficos como objetos . . . . . .
2.2.7 Grficos com funes annimas
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
21
21
21
25
25
26
26
27
27
28
29
30
31
33
35
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
36
36
36
37
37
38
39
39
40
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
41
41
43
44
44
47
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
48
48
49
49
49
50
50
50
51
51
51
52
52
52
53
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
54
54
54
55
55
55
55
55
56
56
56
56
57
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
CAPTULO 1
1.1
Reviso
Arquivos
Espao de
trabalho
Console
Histrico
Figura 1.1: Janela de trabalho do MATLAB (varia de acordo com a verso instalada)
1.1.1
Console e scripts
Para realizar tarefas simples no MATLAB, podemos usar diretamente o console, digitando os comandos e obtendo as respostas. Se tivermos uma sequncia de comandos a serem executados, podemos salvar estes comandos, em ordem, e um arquivo
de extenso .m chamado script. Em seguida, podemos digitar o nome deste arquivo
no console, sem a extenso .m, tomando cuidado para que isso seja feito dentro do
diretrio em que o arquivo foi salvo. Assim, se temos um script arquivo.m salvo no
diretrio atual, podemos executar os comandos contidos neste script digitando no
console
4
arquivo
1.1.2
Atribuio
Para determinarmos uma varivel e atribuir um valor a ela no MATLAB, basta digitarmos
variavel = valor
a = 1
b = 3.14
Vetores: as entradas devem estar separadas por vrgulas, espaos ou ponto-evrgula, dependendo da dimenso desejada para o vetor. Por exemplo,
v = [1,2,3]
v = [1 2 3]
u = [1;2;3]
A = [1 2 3;4 5 6]
Texto: o valor de uma varivel de texto deve ser sempre informado entre aspas.
Observe que para que o MATLAB execute o comando sem mostrar o resultado no
console, basta acrescentarmos ponto-e-vrgula ao final da linha:
A =
A = [1 2 3;4 5 6]
1 2 3
4 5 6
A = [1 2 3;4 5 6];
Alm disso, para que o MATLAB exiba o valor de uma varivel, basta digitarmos
o nome da varivel no console e em seguida pressionar Enter:
A =
A
1 2 3
4 5 6
disp(Ol!)
ans =
55
1.1.3
Matrizes
ans =
ans =
ans =
ans =
ans =
v = [5;6;7]
v(1)
5
v(2,1)
6
A = [1 0 2;3 6 5;5 3 4]
A(1,2)
0
numero = 2
numero(1)
2
numero(1,1)
2
1.1.4
Comandos bsicos
ans =
a = [1;2;3]
b = [4;5;6]
a.*b
4
10
18
ans =
a = [1;2;3]
b = [4;5;6]
a./b
1/ 4
2/ 5
3/ 6
a.k eleva cada um dos elementos da varivel (que pode ser de qualquer
tipo) k-sima potncia. Exemplo:
a = [1;2;3]
a.2 = [1;4;9]
ans =
ans =
ans =
texto = Palavra
texto(1)
P
size(texto)
1
7
texto
P
a
l
a
v
r
a
1.1.5
O MATLAB oferece uma maneira fcil de se acessar subelementos de matrizes, chamada slicing. Nesta operao, usamos a sintaxe
A(linhainicial:linhafinal, colunainicial:colunafinal)
para acessar a submatriz determinada entre as linhas linhainicial e linhafinal,
e entre as colunas colunainicial e colunafinal. Aqui, preciso tomar cuidado
para que as dimenses da matriz resultante sejam consistentes.
Exemplo:
ans =
ans =
ans =
Note que A(:,:) retorna a matriz original, e que A(:) retorna a matriz em formato vetor:
A(:)
ans =
1
4
7
2
5
8
3
6
9
Usando slicing, podemos facilmente apagar elementos de matrizes (ou linhas/colunas
inteiras) usando a seguinte sintaxe:
A(i,:) = []
A(:,j) = []
lista = [1,3,4,5]
lista = [lista 2]
lista
Observao Como a sintaxe acima tambm se aplica a texto, podemos concatenar textos facilmente e usar slicing:
1.1.6
Controle de fluxo
for
varivel = incio:fim
comando
end
Se quisermos determinar um passo diferente de 1 entre os valores incio e fim,
usamos a sintaxe
for
varivel = incio:passo:fim
comando
end
Observe que estruturas de controle de fluxo podem ser escritas diretamente no
console do MATLAB.
Exemplo:
for i = 1:3
i
end
i =
1
i =
2
i =
3
for i = 3:-1:1
i
end
i =
3
i =
2
i =
1
Quando necessrio repetir certo comando de cdigo vrias vezes at que uma
certa condio lgica seja satisfeita, usamos a estrutura while:
i = 1;
while i < 3
disp(Mais um.)
i = i + 1;
end
Observao Para atribuir um valor a uma varivel usamos o smbolo =; para compararmos se dois valores so iguais, usamos o smbolo ==.
Exemplo:
1.2
i = 2;
if i == 1
disp(Um.)
else
disp(No um...)
end
No um...
i = 1;
if i == 1
disp(Um.)
else
disp(No um...)
end
Um.
Muitas vezes, gostaramos de armazenar dados heterogneos; por exemplo, poderamos desejar armazenar uma tabela do tipo
Ttulo
Nm. Pginas
lgebra Linear
Clculo
Geometria
Topologia
205
346
123
253
12/08,
10/09,
04/08,
01/08,
15/08
12/09
05/09
04/09
Porm, esses dados so de naturezas diferentes: misturamos texto (string), nmeros e intervalos. Como armazenar isso em uma s tabela no MATLAB?
A estrutura de dados que possibilita esse armazenamento chamada clula
(cell), e pode ser utilizada da seguinte maneira:
tabela =
tabela
Algebra Linear
Calculo
Geometria
Topologia
11
[205]
[346]
[123]
[253]
[1x2
[1x2
[1x2
[1x2
double]
double]
double]
double]
celldisp(tabela)
size(tabela)
Para criar uma clula vazia com m por n elementos, usamos o comando
tabela = cell(m,n)
possvel transpor uma clula usando a mesma notao que usamos para
matrizes:
1.2.1
tabela
transpose(tabela)
sub =
tabela =
sub = tabela(1:2,1:2)
Algebra Linear [205]
Calculo
[346]
tabela(2,:) = {MATLAB, 300, [1201, 1401]};
tabela
Algebra Linear
MATLAB
Geometria
Topologia
[205]
[300]
[123]
[253]
[1x2
[1x2
[1x2
[1x2
double]
double]
double]
double]
Note que mesmo as clulas que contm valores numricos no esto armazenadas como nmeros. Repare nos colchetes:
vetor =
vetor = tabela(:,2)
[205]
[300]
[123]
[253]
3*vetor
Undefined function mtimes for input
arguments of type cell.
12
Podemos facilmente converter esses dados para uma varivel numrica usando
o comano cell2mat:
vetor =
ans =
vetor = cell2mat(tabela(:,2))
205
300
123
253
3*vetor
615
900
369
759
tabela{1,1}
tabela{1,2}
ans =
tabela{1:3,2}
205
ans =
300
ans =
123
Note que se fizermos
teste = tabela{1:3,2}
a =
[a,b,c] = tabela{1:3,2}
205
b =
300
c =
123
13
numpaginas =
numpaginas = [tabela{1:3,2}]
205
346
123
ans =
tabela{1,1}(1:3)
Alg
Podemos construir estruturas de dados multidimensionais e heterogneas, inclusive incluindo uma clula dentro de outra.
Exemplo:
v = { { 1, teste, [1;2] };
{ [0,3], 12, nome, rand(4,4) } }
v{2}{1}
1.3
C1 = {Joao, 16};
C2 = {Maria, 18; Ricardo, 13};
cola = {C1 C2}
uniao = [C1; C2]
Outra maneira de armazenar dados heterogneos usar structs: cada struct composta de campos que podem conter quaisquer tipos de dados (assim como as clulas), e que so referenciados por nome. Para criarmos uma struct chamada dados
com o campo chamado Nome, podemos usar diretamente a sintaxe
dados.Nome = Melissa
dados.Sobrenome = Mendona
ou
Nestes casos, a struct dados conter um campo chamado Nome e outro chamado
Sobrenome; podemos armazenar em cada elemento da struct dados valores para
estes campos; assim, isso significa que
14
dados(1).Nome
ans =
ans =
dados =
ans =
ans =
ans =
Melissa
Mendona
Nome:
Sobrenome:
dados.Nome
Fulano
Beltrano
Melissa
ans =
nome1 =
Fulano
[nome1, nome2] = dados.Nome
Melissa
nome2 =
Fulano
Para criarmos uma struct vazia, podemos usar o comando
1.3.1
vazia = struct([])
As structs possuem campos nomeados, o que pode tornar mais fcil acessar os
dados armazenados nesse tipo de varivel. Alguns comandos do MATLAB permitem
fazer isso.
O comando fieldnames(s) permite recuperar em uma clula a lista dos nomes
dos campos da struct s.
O comando s = orderfields(s1) ordena os campos da struct s1 de modo
que a nova struct s tem os campos em ordem alfabtica.
15
1.3.2
Structs e clulas
1.3.3
Melissa
Mendona
sim
Fulano
Beltrano
sim
Convertendo dados
Existem duas funes do MATLAB que nos permitem converter dados de clulas para
structs ou de structs para clulas.
O comando
cria uma struct s a partir de uma clula c, de forma que os dados dispostos ao variarmos a dimenso escolhida possam ser distribudos nos campos correspondentes
informados no comando.
Exemplo:
16
tabela =
s =
ans =
ans =
Melissa
Mendona
sim
Nome:
Sobrenome:
Presente:
Fulano
Beltrano
sim
clula = struct2cell(struct)
celula =
celula = struct2cell(s)
Melissa
Mendona
sim
1.4
Fulano
Beltrano
sim
Funes
[y] = minhafuncao(x)
% Descricao da funcao
comandos;
y = minhafuncao(x)
17
Observao. Uma funo deve sempre ter o mesmo nome que o arquivo no qual
ela est salva.
Exemplo: Construir uma funo que calcule o mdulo de um nmero real .
modulo.m
function
[y] = modulo(x)
if x < 0
y = -x;
else
y = x;
end
[m,n] = size(A)
Se quisermos aplicar a mesma funo a um conjunto de valores, basta colocarmos os valores em um vetor:
m = f([-2 1 3])
Por fim, se uma funo est definida com vrios argumentos de sada mas no
precisamos de todos estes argumentos, podemos usar o smbolo ~.
Exemplo:
1.4.1
[~,n] = size(rand(10,5));
18
Alm disso, podemos definir funes com nmero varivel de argumentos de entrada ou de sada, usando respectivamente os comandos varargin e varargout.
O comando varargin uma varivel de entrada utilizada na definio de uma
funo que permite que a funo receba qualquer nmero de argumentos de entrada. Quando a funo for executada, varargin (que deve ser o ltimo argumento
de entrada) ser uma clula de tamanho 1 por n, onde n o nmero de argumentos de entrada que a funo recebeu alm daqueles explicitamente declarados na
funo.
Exemplo:
somas.m
function
[y] = somas(x,varargin)
if nargin == 1
disp(Nada a calcular.)
elseif nargin == 2
y = x + varargin{1};
elseif nargin == 3
y = x + varargin{1} + varargin{2};
else
disp(Argumentos demais!)
end
1.4.2
Funes annimas
Suponha que queremos declarar uma funo no console, sem ter que guard-la em
um arquivo. Por exemplo, queremos avaliar a funo () = sin em alguns pontos.
Para isto, podemos usar o conceito de funo annima.
19
f = @(x) sin(x)
x = pi;
f(pi)
Esta definio bastante til quando queremos passar uma funo como argumento para outra funo: por exemplo, para calcularmos o valor mnimo de uma
funo avaliada em 3 pontos distintos, podemos definir a funo como uma funo
annima, e em seguida passar o seu handle como argumento para a funo que
calcula o mnimo entre os valores:
f = @(x) x-1;
min(f([-2 1 0]))
Se quisermos criar uma funo annima com mais de uma varivel, usamos
f = @(x,y,z,t) x+y+z+t
f = @(t,u,v) deal(t+u+v,t-u+2*v)
[a,b] = f(1,2,3)
20
CAPTULO 2
Grficos em 2D e 3D
2.1
Grficos em 2D
Cada ponto no grfico dado por uma coordenada (, y), onde um nmero real
e y um nmero real associado a (como y = ()). Mas, no podemos representar
a reta real (contnua) no MATLAB. Por isso, precisamos definir um vetor de pontos
em um determinado intervalo (em R ou R2 ):
= (1 , 2 , . . . , n )
e calcular o valor de apenas nestes pontos; o MATLAB ligar os pontos para desenhar o grfico.
2.1.1
Comando plot
Para fazer grficos simples em 2D (no plano), inicialmente precisamos definir o intervalo a ser utilizado para desenhar o grfico. Para isso, precisamos de 3 argumentos:
x = a:delta:b
Aqui, a a extremidade esquerda do intervalo; b a extremidade direita do intervalo; e delta o espaamento desejado entre cada subintervalo, e determina assim
o nmero total de pontos neste intervalo. O resultado, x, um vetor de pontos (que
pode ser um vetor linha ou um vetor coluna).
Observao Analogamente, podemos usar o comando linspace para termos controle direto sobre o nmero de pontos desejados no intervalo:
y = linspace(a,b,n)
plot(x,y)
x = -4:0.5:4
y = x.2
plot(x,y)
Desta forma,
= (4, 3.5, 3, 2.5, 2, 1.5, 1, 0.5, 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4)
y = (16, 12.25, 9, 6.25, 4, 2.25, 1, 0.25, 0, 0.25, 1, 2.25, 4, 6.25, 9, 12.25, 16)
Algumas opes do comando plot Outras opes, como espessura da linha ou
cor do desenho, podem ser especificadas no comando plot.
Exemplo:
plot(x,y,r*)
plot(x,y,m)
A lista de opes pra o comando plot pode ser obtida no MATLAB ao digitarmos
help plot. Um resumo se encontra na Tabelas 2.1 e 2.2.
Smbolos
Cores
k
r
g
b
m
c
y
w
Preto
Vermelho
Verde
Azul
Rosa
Azul claro
Amarelo
Branco
plot(x,y,Linewidth,2)
22
Smbolo
Estilo de linha
-
-
:
-.
.
+
*
o
x
v
>
<
s
d
p
h
Linha contnua
Linha tracejada
Pontilhado
Trao e ponto
Pontos
Cruzes
Asteriscos
Crculos
X
Tringulos
Tringulos
Tringulos
Tringulos
Quadrados
Losangos
Pentgonos
Hexgonos
plot(x,y)
hold on
plot(x,z)
hold off
O comando hold on sinaliza ao MATLAB que ainda vamos fazer mais grficos no
mesmo eixo, enquanto que o comando hold off desliga essa opo. Portanto, qualquer grfico feito aps o comando hold off vai apagar o grfico atual e substitui-lo
em um novo eixo.
Exemplo: Representar graficamente o sistema linear abaixo:
1 + 2 = 8
2 = 8 1
1
5
=
41 + 22 = 26
2 = 13 21
2
3
x1 = 0:0.1:10
plot(x1,8-x1)
hold on
plot(x1,13-2*x1)
hold off
Ttulo: title
Para incluirmos um ttulo em um grfico produzido no MATLAB, basta usarmos o
comando title aps a criao do grfico:
title(y=f(x))
23
Exemplo:
x = -pi:0.1:pi
plot(x,sin(x),r)
title(Grfico da funo y=sin(x))
t = 0:0.1:10
p = exp(t)
plot(t,p)
title(Grfico da presso em funo do tempo.)
xlabel(tempo)
ylabel(presso)
x = -pi:0.1:pi
plot(x,sin(x))
title(Grfico 1)
legend(y=sin(x))
Exemplo:
x = -2*pi:0.1:2*pi;
plot(x,sin(x))
hold on
plot(x,cos(x),r)
legend(y=sin(x),y=cos(x))
title(Funes seno e cosseno.)
axis auto: deixa o MATLAB tentar encontrar um eixo coordenado ideal para a
imagem desenhada.
axis equal: toma eixos coordenados na mesma escala.
axis tight: toma eixos coordenados justos aos dados.
axis off: no mostrar o eixo coordenado (axis on reverte esta ao)
Malha: grid
Podemos mostrar uma malha no nosso grfico usando o comando grid on. Para
revertermos este comando, basta usar grid off. Alm disso, podemos tambm
escolher uma malha mais refinada usando grid minor.
Exemplo:
2.1.2
t = 0:pi/20:2*pi
plot(sin(t),2*cos(t))
grid on
grid minor
(acrescentamos o comando axis no exemplo acima para podermos visualizar corretamente o tringulo.)
2.1.3
25
2.1.4
X = [0 1 0 0]
Y = [0 0 1 0]
fill(X,Y,m)
Subgrficos: subplot
2
6
3
7
4
8
Exemplo: Fazer em uma mesma janela os grficos das funes seno, cosseno,
tangente e cotangente entre 2 e 2.
2.1.5
x = -2*pi:0.01:2*pi;
subplot(2,2,1), plot(x,sin(x),r)
subplot(2,2,2), plot(x,cos(x),c)
subplot(2,2,3), plot(x,tan(x),g)
subplot(2,2,4), plot(x,cot(x))
plot3(X,Y,Z)
t = 0:pi/50:10*pi;
plot3(sin(t),cos(t),t)
xlabel(sin(t))
ylabel(cos(t))
zlabel(t)
axis square
x = rand(100,1);
y = rand(100,1);
z = rand(100,1);
plot3(x,y,z)
26
2.2
Grficos em 3D
2.2.1
[X,Y] = meshgrid(x,y)
1 2 3
1 2 3
X=
1 2 3
1 2 3
e
y1
y2
Y =
y3
y4
y1
y2
y3
y4
y1
y2
y3
y4
x = -1:0.1:1
[X,Y] = meshgrid(x)
cria uma malha em [1, 1] [1, 1] com espaamento de 0.1 unidades entre os
pontos.
27
2.2.2
Superfcies
Nesta seo, vamos ver os comandos que nos permitem desenhar superfcies no
MATLAB.
Superfcies slidas: surf
Para desenharmos uma superfcie dada por
z = (, y)
com (, y) , onde uma regio do plano definida por [0 , y0 ][1 , y1 ], usamos
o comando surf(X,Y,Z).
x = x0:deltax:x1;
y = y0:deltay:y1;
[X,Y] = meshgrid(x,y);
Z = f(X,Y)
surf(X,Y,Z)
Exemplo:
x = -1:0.1:1;
[X,Y] = meshgrid(x);
Z = X.2+Y.2
surf(X,Y,Z)
Exemplo:
x = -3:0.1:3;
[x,y] = meshgrid(x);
f = @(x,y) x.2+3*y-x.*y.2
surf(x,y,f(x,y));
x = -1:0.1:1;
[X,Y] = meshgrid(x);
Z = X.2+Y.2
mesh(X,Y,Z)
meshz
O comando meshz(X,Y,Z) anlogo ao comando mesh, mas cria uma cortina em
torno da superfcie desenhada.
Exemplo:
x = -1:0.1:1;
[X,Y] = meshgrid(x);
Z = X.2+Y.2
meshz(X,Y,Z)
28
Superfcies Parametrizadas
Para fazermos o grfico de superfcies parametrizadas, devemos garantir que os
parmetros discretizados tenham todos o mesmo tamanho. Por isso, neste caso, a
indicao usar o comando linspace(x1,x2,n).
Exemplo: Fazer o grfico da superfcie parametrizada por (t, ) dada por
t
, cos t, sin t
(, y, z) =
3
com t [0, 10] e [1, 1].
2.2.3
t = linspace(0,10,40);
u = linspace(-1,1,40);
[t,u] = meshgrid(t,u);
x = t/3;
y = u.*cos(t);
z = u.*sin(t);
mesh(x,y,z)
Curvas de nvel
contour(X,Y,Z)
Se quisermos especificar quantas curvas sero desenhadas (no nosso caso, chamaremos esse nmero de n), usamos o comando contour na forma
contour(X,Y,Z,n)
contour(Z,v)
contourf(X,Y,Z,n)
29
ou
contourf(X,Y,Z,v)
Exemplo:
surf(peaks(100))
contourf(peaks(100))
colorbar
contourf(peaks(100),[-6 0 6])
contour3(X,Y,Z)
[X,Y] = meshgrid([-2:.25:2]);
Z = X.*exp(-X.2-Y.2);
contour3(X,Y,Z,30)
2.2.4
surfc(X,Y,Z)
meshc(X,Y,Z)
Opes
Assim como fizemos com os grficos em 2D, algumas opes bsicas podem ser
escolhidas na hora de desenhar grficos em 3D.
Cores: colormap
Aqui, no mais possvel escolhermos a cor da linha desenhada, j que temos uma
malha ao invs de uma linha. Ainda assim, podemos selecionar a paleta de cores a
ser utilizada no grfico. Para isto, usamos o comando colormap:
colormap(mapa)
hsv
spring
winter
copper
30
hot
summer
gray
pink
[x,y,z] = peaks;
surf(x,y,z)
colormap(rand(100,3))
Observao
colormap(default)
Cores: shading
Alm do colormap, temos outra opo para mudar a aparncia da superfcie usando
o comando shading:
shading faceted
shading flat
shading interp
2.2.5
axis([x0 x1 y0 y1 z0 z1])
Outros comandos
Esfera: sphere
Para desenharmos uma esfera de raio 1 centrada no ponto (0, 0, 0) no MATLAB,
usamos o comando
sphere
[X,Y,Z] = sphere
[X,Y,Z] = sphere(n)
31
[X,Y,Z] = sphere
surf(X+3,Y-2,Z-1)
cylinder
Podemos gerar matrizes de coordenadas X,Y e Z para desenhar um cilindro posteriormente usando o comando
[X,Y,Z] = cylinder
[X,Y,Z] = cylinder(n)
Alm disso, podemos desenhar um slido de revoluo dado pela curva c = (t)
com o comando
[X,Y,Z] = cylinder(c)
Exemplo:
t = 0:pi/10:2*pi;
[X,Y,Z] = cylinder(2+cos(t));
surf(X,Y,Z)
axis square
trimesh, trisurf
s vezes, mais conveniente mostrarmos os grficos usando uma triangulao do
domnio. Para isto, usamos os comandos trimesh ou trisurf junto com o comando
delaunay, que cria a triangulao do domnio:
Exemplo:
[x,y] = meshgrid(-3:0.5:3);
tri = delaunay(x,y)
z = x.2+3*y-x.*y.2;
trimesh(tri,x,y,z)
32
Volumes: slice
Quando temos um grfico de volume, por exemplo, de um slido preenchido, podemos visualizar sees bidimensionais deste volume usando o comando
slice(x,y,z,v,xslice,yslice,zslice)
2 y 2 z 2 )
com 2 2, 2 y 2 e 2 z 2.
2.2.6
[x,y,z] = meshgrid(-2:.2:2);
v = x.*exp(-x.2-y.2-z.2);
xslice = [-1.2,.8,2];
yslice = 0;
zslice = [];
slice(x,y,z,v,xslice,yslice,zslice)
surf(X,Y,Z)
tem diversas propriedades, como por exemplo o mapa de cores utilizado, o tamanho
dos eixos, as legendas dos eixos, etc. Vamos ver rapidamente como podemos obter
e modificar estas propriedades de uma figura criada pelo MATLAB.
Os comandos que utilizam esta filosofia so, em geral, teis quando temos mais
de uma janela de grfico aberta e precisamos fazer modificaes nestas janelas
separadamente, por exemplo. Neste caso, precisamos de um identificador de cada
janela. Isto o que o MATLAB chama de figure handle.
Para criarmos um objeto de janela grfica, usamos o comando
figure
h = figure
Aqui, h um valor numrico que pode ser usado posteriormente como um nmero
de identificao da figura recm-criada.
Com relao ao grfico em si, usamos o comando
axes
33
para criar uma janela grfica com um eixo desenhado; usamos o comando
h = axes
para, similarmente, guardarmos na varivel h a referncia para o grfico recmcriado. Podemos ainda fazer, por exemplo, diretamente
h = plot(x,x.2)
para guardarmos na varivel h a referncia para o grfico de () = 2 .
Obter a referncia de um grfico existente
Para obtermos a referncia do ltimo grfico desenhado, podemos usar o comando
fig = gcf
para obtermos a referncia para a janela em que o ltimo grfico foi desenhado, ou
ainda o comando
h = gca
get(h)
Exemplo:
t = -1:0.1:1
plot(t,sin(t))
get(gca)
Exemplo:
x = -2*pi:0.1:2*pi
[X,Y] = meshgrid(x)
surf(X,Y,sin(X)+cos(Y))
get(gca)
get(gcf)
get(h,Propriedade)
Exemplo:
t = -1:0.1:1
plot(t,sin(t))
get(h,type)
get(h,linestyle)
2.2.7
Suponha que queremos passar uma funo como argumento para outra funo: por
exemplo, gostaramos de usar um comando do tipo
plot(x,f(x))
para a funo () = 2 + 1.
Para isso, podemos definir uma funo annima usando a seguinte sintaxe:
f = @(x) x.2+1
e, em seguida
x = -1:0.1:1
plot(x,f(x))
Se quisermos criar uma funo annima com mais de uma varivel, usamos
f = @(x,y,z,t) x+y+z+t
Exemplo:
x = -3:0.1:3;
[x,y] = meshgrid(x);
f = @(x,y) x.2+3*y-x.*y.2
surf(x,y,f(x,y));
35
CAPTULO 3
Manipulao de arquivos e
tratamento de dados
H varias maneiras de se salvar e ler arquivos no MATLAB. O mais simples usarmos arquivos com a extenso .txt, apesar de o MATLAB aceitar diversos tipos de
arquivo.
3.1
Para importarmos dados, o mtodo mais fcil utilizar a interface grfica do MATLAB, selecionando
File Import Data
Em seguida, a interface grfica do MATLAB oferece vrias opes, como selecionar clulas de arquivos de planilha eletrnica e transform-las em variveis diretamente, filtrar dados por tipo (texto ou numricos, por exemplo), salvar os dados em
matrizes ou clulas, e muitas outras opes.
(Para verificar os tipos de arquivo suportados e as funes disponveis, consulte
o Help.)
3.1.1
Para lermos um arquivo que contenha apenas dados numricos, por exemplo chamado dados.txt, usamos o comando
load dados.txt;
A = load(dados.txt)
Esse comando somente pode ser utilizado em arquivos com dados homogneos
e formatados.
36
3.1.2
para obtermos uma struct com o resultado da leitura do arquivo. Aqui, separador
um caractere que denota o separador de dados usado no arquivo (por exemplo,
um espao ( ) ou um ponto-e-vrgula (;)), e ncabecalho um inteiro que contm
o nmero de linhas de cabealho presentes no arquivo (por exemplo, nomes de
variveis e rtulos de colunas).
Se importdata reconhecer a extenso do arquivo, a funo chama o comando
apropriado do MATLAB para ler esse tipo de arquivo (por exemplo, load no caso
de dados numricos ou xlsread no caso de dados de planilhas eletrnicas). Caso
contrrio, importdata interpreta o arquivo como um arquivo de texto puro com
delimitadores (formatado).
Por exemplo, se tivermos um arquivo do tipo
teste.txt
melissa joao maria
12;16;18
dados =
dados = importdata(teste.txt, ;, 1)
data:
textdata:
rowheaders:
3.1.3
[12 16 18]
melissa joao maria
melissa joao maria
arquivo = fopen(nome.txt)
fclose(arquivo)
Note que aqui arquivo uma varivel que contm um apontador para o arquivo
que queramos abrir; uma vez aberto, no precisamos mais nos referir ao nome do
arquivo, mas sim ao apontador que associamos a ele.
37
3.1.4
C = textscan(arquivo,formato)
A = fscanf(arquivo,formato)
arquivo = fopen(info.txt)
a = fscanf(arquivo,%d)
fclose(arquivo)
arquivo = fopen(matriz.txt);
A = fscanf(arquivo,%f,[3 3]);
fclose(arquivo);
A = A;
38
[A,contador] = fscanf(arquivo,%d)
1,
3,
5,
6,
8,
9,
10,
Temperatura
Temperatura
Temperatura
Temperatura
Temperatura
Temperatura
Temperatura
20.6
21.2
23.1
24.5
25.0
25.2
25.8
Observao Para no ler o texto, e ler apenas as idades, podemos pular o campo
de texto com o comando
[dados,texto,resto] = xlsread(arquivo)
[dados,texto,resto] = xlsread(arquivo,planilha)
[dados,texto,resto] = xlsread(arquivo,-1)
para abrir uma janela do Excel e selecionar os dados a serem importados interativamente.
3.2
3.2.1
Escrita
Escrita em arquivos usando save
save(arquivo.txt,variavel)
39
Porm, este comando salva o arquivo no formato MAT, que um formato prprio
do MATLAB, ilegvel para humanos. Assim, para salvarmos em um arquivo texto
simples, acrescentamos a opo -ascii.
Exemplo:
3.2.2
dados = rand(3,4);
save(dadosout.txt,dados,-ascii)
arquivo = fopen(info.txt,w)
fprintf(arquivo,%d,1)
fclose(arquivo)
Aqui, a opo w cria um arquivo novo, vazio, em que sero escritos os dados; se
o arquivo j existir, os dados anteriores so apagados e os novos dados so escritos
dentro do arquivo.
As outras opes de acesso a arquivos com o comando fopen so r (Somente
leitura) ou a (acrescentar texto ao final do arquivo existente).
40
CAPTULO 4
Agora, vamos considerar o caso em que temos um conjunto de dados e que desejamos aplicar algum mtodo de anlise estatstica a estes dados. Vamos analisar
alguns mtodos disponveis no MATLAB que no necessitam da Statistics Toolbox.
Para os mtodos que se encontram nesta toolbox, recomendamos consultar a documentao especfica.
4.1
Funes bsicas
mean(x)
Para calcularmos a mdia aritmtica simples de cada coluna de uma matriz e armazenarmos essas mdias em um vetor linha, podemos usar o comando
mean(matriz)
Para calcularmos a mdia aritmtica simples de cada linha de uma matriz e armazenarmos o resultado em uma matriz coluna, usamos o comando
mean(matriz,2)
Observao Se voc tiver a Statistics Toolbox mo, pode usar o comando trimmmean
para calcular a mdia excluindo os k maiores e menores valores de um vetor X.
Para calcularmos a mediana de um conjunto de dados armazenados em um vetor,
usamos o comando
median(x)
median(matriz)
n
X
n 1 =1
!1
( )2
41
(4.1)
ou
s=
n
1X
n =1
onde
=
!1
2
( )2
n
1X
n =1
(4.2)
std(x)
std(matriz)
Se quisermos calcular o desvio padro dos elementos de um vetor usando a frmula (4.2), usamos
std(x,1)
var(x)
Para calcularmos um vetor linha com as varincias de cada coluna da matriz, usamos
o comando
var(matriz)
O comando var normaliza os dados por n 1, se temos n > 1 dados. Se desejamos normalizar por n, usamos o comando
var(x,1)
cov(X)
diag(cov(X))
sqrt(diag(cov(X)))
42
R = corrcoef(X)
[R, P] = corrcoef(X)
[R,P] = corrcoef(X)
[i,j] = find(p<0.05)
Para encontrarmos a matriz de correlao entre variveis e seus respectivos pvalues, tambm podemos usar a funo corr, com mais opes:
[RHO,PVAL] = corr(X,Y,nome,valor)
Exemplos:
[RHO,PVAL] = corr(X,Y,type,Pearson)
[RHO,PVAL] = corr(X,Y,type,Kendall)
[RHO,PVAL] = corr(X,Y,rows,all)
[RHO,PVAL] = corr(X,Y,rows,complete) : pula linhas com NaN!
4.2
Grficos
n = hist(Y)
n = hist(Y,nbins)
boxplot(X)
cria um grfico de caixas dos dados em X. Se X for uma matriz, existir uma caixa
por coluna; se X for um vetor, existir apenas uma caixa.
Em cada caixa:
a marca central a mediana;
os limites da caixa representam o 25 e o 75 percentil;
os marcadores externos sinalizam os pontos extremos dos dados (sem considerar outliers;
os outliers, se existirem, sero marcados individualmente no grfico.
4.3
Fitting
4.3.1
Regresso
load census
plot(cdate, pop, ro)
sqrt(sum(resids.2))
p = polyfit(x,y,n)
[p,S] = polyfit(x,y,n)
(inv(R)*inv(R))*normr2/df
O comando
y = polyval(p,x)
[y,delta] = polyval(p,x,S)
usa a estrutura S gerada pelo comando polyfit para gerar delta, que uma estimativa do desvio padro do erro obtido ao se tentar calcular p(x).
Exemplo: Se quisermos fazer uma regresso linear em um conjunto de pontos
(, y), usamos o comando
p = polyfit(x,y,1)
x = 1:1:20;
y = x + 10*rand(1,20);
p = polyfit(x,y,1);
plot(x,y,ro)
hold on
t = 0:0.1:20;
plot(t,polyval(p,t))
45
x = 1:1:20;
y = x + 10*rand(1,20);
p = polyfit(x,y,1);
fitted = polyval(p,x);
res = y-fitted;
subplot(2,1,1), plot(x,y,ro,markersize,8)
hold on
t = 0:0.1:20;
subplot(2,1,1), plot(t,polyval(p,t))
subplot(2,1,2), bar(x,res)
O comando
scatter(X,Y)
faz um grfico dos pontos com coordenadas X e Y, usando crculos como marcadores.
Se usarmos
scatter(X,Y,S,C)
scatterhist(x,y)
cria um scatter plot dos dados nos vetores x e y e tambm um histograma em cada
eixo do grfico.
Exemplo:
x = randn(1000,1);
y = exp(.5*randn(1000,1));
scatterhist(x,y)
O comando
lsline
46
x = 1:10;
y1 = x + randn(1,10);
scatter(x,y1,25,b,*)
hold on
y2 = 2*x + randn(1,10);
plot(x,y2,mo)
y3 = 3*x + randn(1,10);
plot(x,y3,rx:)
y4 = 4*x + randn(1,10);
plot(x,y4,g+-)
lsline
refcurve(p)
gline
4.3.2
Comandos em Toolboxes
polytool(x,y)
polytool(x,y,n)
cftool
47
CAPTULO 5
Neste captulo, vamos ver um apanhado dos comandos mais utilizados para a resoluo de sistemas lineares, resoluo de equaes no-lineares e de sistemas
no-lineares de equaes.
5.1
det(A)
eig(A)
[V,D] = eig(A)
inv(A)
48
5.2
Aqui, vamos supor que queremos resolver um sistema linear, ou seja, um problema
do tipo
Encontrar Rn tal que
A = b
com A Rmn e b Rm .
Existem algumas maneiras de resolver este tipo de problema no MATLAB.
5.2.1
Primeiramente, se m = n (ou seja, a matriz do problema quadrada) e A for inversvel, podemos simplesmente invert-la para encontrar
= A1 b.
No MATLAB, teremos ento
x = inv(A)*b
5.2.2
O operador \
x = A\b
49
5.2.3
Decomposio LU: lu
[L,U] = lu(A)
y = L\b
x = U\y
5.2.4 linsolve
Se no quisermos nos preocupar com o algoritmo usado na resoluo do sistema,
temos uma outra opo no comando linsolve.
x = linsolve(A,b)
5.2.5
O MATLAB tambm conta com alguns algoritmos para resolver sistemas lineares de
forma iterativa, isto , a partir de um ponto inicial 0 , obtm-se uma aproximao
para a soluo exata do sistema atravs da realizao de algum procedimento vrias
vezes, at que alguma condio seja satisfeita.
Se a matriz A for grande e esparsa, mtodos diretos (usando fatorao) so, em
geral, pouco eficientes. Nestes casos, podemos usar um dos seguintes mtodos,
disponveis no MATLAB:
pcg Gradiente conjugado precondicionado
bicg Gradiente bi-conjugado (gradiente conjugado para matrizes no necessariamente simtricas)
gmres Generalized minimum residual method (com restarts)
lsqr LSQR (quadrados mnimos)
Para mais informaes sobre estes mtodos, pode-se consultar no help do MATLAB a pgina intitulada Systems of Linear Equations, no item Iterative Methods for
Solving Systems of Linear Equations.
50
5.3
5.3.1
= minhafuncao(x)
comandos
fzero(@minhafuncao,x0)
5.3.2
p = [an an1 a2 a1 a0 ]
r = roots(p)
p = [1 2 -5 -6]
roots(p)
51
5.3.3
Rn
Rm ,
onde F :
fsolve(@minhafuncao,x0)
y1 = 321 + 422 16
y2 = 221 322 5
fsolve(@funcs,[1;1])
Observao Este comando faz parte da Optimization Toolbox, que pode no estar
disponvel na sua instalao do MATLAB.
5.4
5.4.1
x = fminbnd(@funcao,a,b)
[x,fval] = fminbnd(@funcao,a,b)
52
5.4.2
x = fminsearch(@funcao,x0)
[x,fval] = fminsearch(@funcao,x0)
53
CAPTULO 6
6.1
6.1.1
O comando
yi = interp1(x,Y,xi,method)
interpola os dados (x,Y) nos novos pontos xi, usando o mtodo method, que pode
ser:
nearest Vizinho mais prximo
linear Interpolao linear (default)
spline Splines cbicos
cubic Interpolao por polinmios de Hermite
Exemplo:
x = 0:10;
y = sin(x);
xi = 0:.25:10;
yi = interp1(x,y,xi);
plot(x,y,o,xi,yi);
hold on;
zi = interp1(x,y,xi,nearest);
plot(xi,zi,:k);
wi = interp1(x,y,xi,spline);
plot(xi,wi,m);
ui = interp1(x,y,xi,cubic);
plot(xi,ui,-g)
54
6.1.2
O comando
ZI = interp2(X,Y,Z,XI,YI,method)
interpola os dados (X,Y,Z) nos novos pontos (XI,YI) usando o mtodo method, que
pode ser
nearest Vizinho mais prximo
linear Interpolao linear (default)
spline Splines cbicos
cubic Interpolao cbica, se os dados forem uniformemente espaados;
seno, o mesmo que spline.
6.2
O comando
p = polyfit(x,y,n)
6.3
6.3.1
x = 0:10;
y = sin(x);
Integrao Numrica
Integrao numrica geral: integral
Rb
q = integral(fun,a,b)
6.3.2
Rb
Para calcularmos uma aproximao numrica de ()d com e b finitos pela
quadratura de Simpson (adaptativa), usamos o comando
q = quad(fun,a,b)
6.3.3
6.4
x = 0:pi/100:pi;
y = sin(x);
z = trapz(x,y)
(),
(), . . . ,
() .
() =
1
1
n
Para calcularmos o gradiente de uma funo de uma varivel, procedemos da
seguinte maneira.
x = a:h:b;
f = funcao(x);
g = gradient(f,h)
O comando gradient calcula numericamente a derivada de em funo da varivel nos pontos escolhidos.
Para calcularmos o gradiente de uma funo de duas variveis, o procedimento
equivalente. A diferena que agora precisamos gerar uma malha de pontos
usando o comando meshgrid.
6.5
6.5.1
x = a:hx:b;
y = c:hy:d;
[x,y] = meshgrid(x,y);
f = funcao(x,y)
[gx,gy] = gradient(f,hx,hy)
Uma equao diferencial ordinria (EDO) uma equao que envolve uma ou mais
derivadas de uma varivel dependente y com respeito a uma nica varivel independente t (y = y(t)). Com frequncia, y(t) um vetor com componentes y =
(y1 (t), y2 (t), . . . , yn (t)).
O MATLAB resolve equaes diferenciais ordinrias de primeira ordem dos seguintes tipos:
EDOs explcitas, do tipo y 0 = (t, y)
EDOs linearmente implcitas, do tipo M(t, y)y 0 = (t, y), em que M(t, y) uma
matriz
EDOs implcitas, do tipo (t, y, y 0 ) = 0
56
Para resolvermos equaes diferenciais de ordem superior, precisamos escrevlas como um sistema de equaes de primeira ordem (como fazemos no curso de
clculo).
Geralmente, temos uma famlia de solues y(t) que satisfaz a EDO. Para obtermos uma soluo nica, exigimos que a soluo satisfaa alguma condio inicial
especfica, de forma que y(t0 ) = y0 em algum valor inicial t0 .
y 0 = (t, y)
y(t0 ) = y0
No MATLAB, temos solvers para trs tipos de problemas de valor inicial. Em todos
os casos, a sintaxe para resolver uma equao diferencial
[t,y] = solver(odefun,tspan,y0,options)
onde solver substituido por uma das opes que veremos em seguida. Os argumentos de entrada so sempre os seguintes:
odefun: O handle para uma funo que avalia o sistema de EDOs em um ponto.
Esta funo deve estar na forma dydt = odefun(t,y), onde t um escalar e
dydt e y so vetores coluna.
tspan: vetor especificando o intervalo de integrao. O solver impe a condio inicial em tspan(1), e integra de tspan(1) at tspan(end).
y0: vetor das condies iniciais para o problema.
options: Struct de parmetros opcionais que modificam as propriedades padro de integrao.
Os argumentos de sada so
t: vetor coluna das variveis independentes (pontos no intervalo desejado)
y: vetor ou matriz contendo, em cada linha, a soluo calculada no ponto contido na linha correspondente de t.
6.5.2
Solvers
Os mtodos disponveis esto divididos de acordo com o tipo de problema que resolvem:
Problemas No-Stiff:
ode45 (Runge-Kutta, passo simples)
ode23 (Runge-Kutta, passo simples)
ode113 (Adams-Bashforth-Moulton, passo mltiplo)
Problemas Stiff: