Вы находитесь на странице: 1из 138

Introduc

ao ao MATLAB

&
MATLAB Compiler

Geraldo Leite Torres


Professor Adjunto, PhD
gltorres@ufpe.br

Digital de Sistemas de Potencia

Laboratorio

DEESP CTG UFPE

RESTRITA
DISTRIBUIC
AO
c 2001, 2005 GERALDO L. TORRES

ii

c 2005 G. L. TORRES

Conte
udo

Captulo 1

Introdu
c
ao ao Matlab

1.1. Um Breve Historico . . . . . . .


1.2. Para Executar o Matlab . . . . .
1.3. Para Sair do Matlab . . . . . . .
1.4. O Help On-Line . . . . . . . . . .
1.5. Variaveis . . . . . . . . . . . . . .
1.6. Formas de Interac
ao . . . . . . .
1.7. Func
oes Matematicas Comuns . .
1.8. Aritmetica . . . . . . . . . . . . .
1.9. Operac
oes com Vetores . . . . . .
1.10. Formatos de Sada . . . . . . . .
1.11. Plotagem Simples . . . . . . . . .
1.12. Os Arquivos-M . . . . . . . . . .
1.13. P-code . . . . . . . . . . . . . . .
1.14. Operadores Relacionais e Logicos
Captulo 2

1
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

Algebra
Linear e Matrizes

1
2
3
3
5
9
11
11
13
15
15
16
17
17
19

2.1.
2.2.
2.3.
2.4.
2.5.
2.6.

Matrizes . . . . . . . . . . . . . . . . .
Manipulac
ao de Matrizes . . . . . . .
Gerando Matrizes Especiais . . . . . .
Operac
oes com Matrizes e Vetores . .
Normas e N
umeros Condicionadores .
Equac
oes Lineares . . . . . . . . . . .
2.6.1. Sistema Quadrado . . . . . . .
2.6.2. Sistema Sobredeterminado . . .
2.6.3. Sistema Subdeterminado . . . .
2.7. Inversa, Falsa-Inversa e Determinante
2.8. Fatorizac
ao LU . . . . . . . . . . . . .
2.9. Fatorizac
ao Cholesky . . . . . . . . . .
iii

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

19
21
23
26
29
31
31
32
32
33
34
35


CONTEUDO

iv

2.10. Fatorizac
ao QR . . . . . . . . . . . . . . . .
2.11. Decomposic
ao em Valores Singulares . . . .
2.12. Autovalores e Autovetores . . . . . . . . . .
2.13. Metodos Iterativos para Equacoes Lineares
2.14. Matrizes Esparsas . . . . . . . . . . . . . .
Captulo 3

5.1.
5.2.
5.3.
5.4.
5.5.
5.6.
5.7.

6.1.
6.2.
6.3.
6.4.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

36
36
37
39
39
45

. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
Dados
. . . .
. . . .

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

45
47
49
52
53
58
62
67
68
71

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

M
etodos Num
ericos

71
74
75
76
78
79
79
81
81
82
83
83
89
89
91

Analise de Dados . . . . . . . . . . .
Polinomios . . . . . . . . . . . . . .
Interpolac
ao de Dados . . . . . . . .
Equac
oes Nao-Lineares e Otimizacao
Transformada Rapida de Fourier . .
Integrac
ao . . . . . . . . . . . . . . .
Equac
oes Diferenciais Ordinarias . .

Captulo 6

.
.
.
.
.

Programa
c
ao em Matlab

4.1. Operadores Logicos e Relacionais


4.2. Alem de Vetores e Matrizes . . .
4.2.1. Celulas . . . . . . . . . .
4.2.2. Estruturas . . . . . . . . .
4.3. Lacos for . . . . . . . . . . . . .
4.4. Lacos while . . . . . . . . . . . .
4.5. Estruturas if-else-end . . . . .
4.6. Comando switch . . . . . . . . .
4.7. Estrutura try ... catch . . . .
4.8. Arquivos-M . . . . . . . . . . . .
4.8.1. Editando Arquivos-M . .
4.9. Comandos I/O . . . . . . . . . .
4.10. Classes e Objetos . . . . . . . . .
4.10.1. Identificadores de Funcoes
Captulo 5

.
.
.
.
.

Gr
aficos 2-D, 3-D e Imagens

3.1. Graficos 2-D . . . . . . . . . . . . . . . .


3.2. Personalizando Graficos . . . . . . . . .
3.2.1. Eixos e Anotac
oes . . . . . . . .
3.2.2. Caracteres Especiais . . . . . . .
3.3. M
ultiplos Graficos Numa Figura . . . .
3.4. Graficos 3-D . . . . . . . . . . . . . . . .
3.5. Graficos Especializados para Exibicao de
3.6. Gravando e Imprimindo Figuras . . . .
3.7. Manipulac
ao de Graficos . . . . . . . . .
Captulo 4

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

. 91
. 93
. 95
. 98
. 99
. 100
. 101

Arquivos-MEX

105

Introduc
ao . . . . . . . . . . . .
Usando Arquivos-MEX . . . . .
Localizac
ao dos Arquivos-MEX
Requisitos do Compilador . . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

c 2005 G. L. TORRES

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

105
105
106
106


CONTEUDO

6.5. Testando a Configurac


ao no UNIX . . . . . . . .
6.5.1. Selecionando um Compilador . . . . . . .
6.6. Testando a Configurac
ao no Windows . . . . . .
6.6.1. O Compilador Lcc . . . . . . . . . . . . .
6.6.2. Selecionando um Compilador . . . . . . .
6.6.3. Construindo o Arquivo-MEX no Windows
Captulo 7

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

Matlab Compiler

111

7.1.
7.2.
7.3.
7.4.
7.5.

Introduc
ao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Arquivos Encapsuladores (Wrapper) . . . . . . . . . . . . . . . . . . .
Aplicac
oes Stand-Alone . . . . . . . . . . . . . . . . . . . . . . . . . .
Bibliotecas Compartilhadas . . . . . . . . . . . . . . . . . . . . . . . .
Produtos Builder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.5.1. Matlab Builder for COM . . . . . . . . . . . . . . . . . . . . .
7.5.2. Matlab Builder for Excel . . . . . . . . . . . . . . . . . . . . .
7.6. Compilando uma Aplicac
ao Stand-Alone . . . . . . . . . . . . . . . . .
7.7. Compilando uma Biblioteca Compartilhada . . . . . . . . . . . . . . .
7.8. Testando Componentes na Maquina de Desenvolvimento . . . . . . . .
7.9. Preparando Componentes para Outras Maquinas . . . . . . . . . . . .
7.10. Limitac
oes e Restric
oes . . . . . . . . . . . . . . . . . . . . . . . . . .
7.10.1. Compilando Matlab e Toolboxes . . . . . . . . . . . . . . . . .
7.10.2. Codigo Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.10.3. Aplicac
oes Stand-Alone . . . . . . . . . . . . . . . . . . . . . .
7.11. Compiladores Suportados . . . . . . . . . . . . . . . . . . . . . . . . .
7.12. O Processo de Compilac
ao . . . . . . . . . . . . . . . . . . . . . . . . .
7.13. Arquivos de Entrada e de Sada . . . . . . . . . . . . . . . . . . . . . .
7.13.1. Executavel Stand-Alone . . . . . . . . . . . . . . . . . . . . . .
7.13.2. Biblioteca Compartilhavel C . . . . . . . . . . . . . . . . . . .
7.13.3. Biblioteca Compartilhavel C++ . . . . . . . . . . . . . . . . .
7.14. Processo de Distribuic
ao . . . . . . . . . . . . . . . . . . . . . . . . . .
7.14.1. Portando o Codigo Gerado para uma Plataforma Diferente . .
7.14.2. Trabalhando com o MCR . . . . . . . . . . . . . . . . . . . . .
7.14.3. Distribuindo uma Aplicacao Stand-Alone num Driver de Rede
7.15. Trabalhando com mcc . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.15.1. Usando Arquivos de Encapsulamento (Wrapper) . . . . . . . .
7.15.2. Chamando Func
oes Matlab do C ou C++ . . . . . . . . . . . .
7.15.3. Chamando uma Funcao da Linha de Comando . . . . . . . . .
7.15.4. Usando Arquivos-MAT em Aplicacoes Independentes . . . . . .
7.15.5. Executando as Aplicacoes . . . . . . . . . . . . . . . . . . . . .
7.15.6. Passando Argumentos Para e De uma Aplicacao . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Captulo A C
alculo de Fluxo de Pot
encia
A.1.
A.2.
A.3.
A.4.
A.5.

Introduc
ao . . . . . . . . . . . . . . . . . . . . . . .
Formulac
ao Basica . . . . . . . . . . . . . . . . . .
Soluc
ao pelos Metodos de Gauss e de Gauss-Seidel
O Metodo de Newton-Raphson . . . . . . . . . . .
Programa de Fluxo de Potencia em Matlab . . . .

c 2005 G. L. TORRES

107
107
108
108
109
109

111
111
112
112
113
113
113
113
115
115
115
117
117
117
117
117
118
119
119
120
120
121
121
121
122
123
123
124
124
124
125
125
127

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

127
128
129
130
132

Captulo

Introduc
ao ao Matlab

1.1

Um Breve Hist
orico

MATLAB (abreviac
ao para MATrix LABoratory) e um sistema interativo e linguagem de
programac
ao largamente utilizado para calculos (e visualizacao) cientficos e de engenharia.
Desenvolvido no final dos anos 70, nas universidades americanas de New Mexico e Stanford, e
popularizado nos anos 80, pela Mathworks Inc., sua utilizacao tornou-se bastante popular no
meio academico e na ind
ustria devido `a sua enorme capacidade de manipulacao de matrizes e
vetores. Seu tipo de dado basico e uma matriz que nao requer dimensionamento e especificac
ao
de tipo pelo usuario.
A versao inicial do MATLAB, a qual foi desenvolvida pelo analista numerico Cleve Moler,
foi escrita em Fortran, como uma mera ferramenta de ensino. A versao atual e escrita na
linguagem C e esta disponvel para uma variedade de ambientes computacionais: Sun, Apollo,
VAXstation, HP workstations, VAX, MicroVAX, Gould, i386, Apple Macintosh, e varias
maquinas de processamento paralelo.
Diferentemente das demais linguagens de programacao existentes `a epoca, como Fortran
e C, no MATLAB nao era necessario escrever subrotinas para efetuar calculos matriciais, os
quais poderiam ser feitos diretamente. Mais ainda, as solucoes de varios problemas sao expressas em MATLAB quase da mesma maneira que elas sao escritas matematicamente. Alem de
apresentar varias caractersticas das linguagens de programacao (estruturacao, manipulac
ao
de dados de entrada e sada, etc.), versoes posteriores do MATLAB passaram a incorporar
poderosas rotinas graficas, tornando sua utilizacao, alem de pratica, bastante atraente.
Porem, apesar de ter sido bem aceito nas universidades e nos centros de pesquisa, o MATLAB tinha pouca aplicabilidade pratica, alem de analises off-line e validacoes de modelagens.
Esta deficiencia foi corrigida a partir da versao 4.2, incorporando um gerenciador de sistemas de
1

AO MATLAB
CAP
ITULO 1. INTRODUC
AO

tempo real. Na pratica, isto permite utilizar o MATLAB em aplicacoes industriais e processos,
onde o programa controla de forma on-line as variaveis envolvidas.
Alem dos avancos acima citados, ao longo do tempo foram incorporadas ao MATLAB
ferramentas para tratar de
areas especficas do conhecimento, os chamados toolboxes. Esses
toolboxes sao organizados de forma modular, permitindo assim que o usuario compre e acople
ao seu sistema apenas aqueles de seu interesse particular. Alguns exemplos de toolboxes sao:
uma extens
Simulink : E
ao a MATLAB que adiciona um ambiente grafico para
modelar, simular, e analizar sistemas dinamicos lineares e nao-lineares.
uma colecao de ferramentas para estimacao e identificac
System Identification: E
ao
de sistemas. Identificac
ao de sistemas diz respeito a achar um modelo matematico para
um sistema fsico (como um motor eletrico) baseado apenas em dados de entrada e de
sada registrados.
uma colecao de funcoes do MATLAB para projetar e simular
Neural Network: E
redes neurais. Redes neurais sao arquiteturas de computacao, inspiradas por sistemas
nervosos biologicos, que sao u
teis em aplicacoes onde analise formal e extremamente
difcil ou impossvel, tal como reconhecimento de padroes e identificacao e controle de
sistemas nao-lineares.
Robust Control: Contem um conjunto de ferramentas para a analise e sntese de
sistemas de controle que sao robustos com relacao a incertezas que podem surgir no
mundo real.
Signal Processing: Contem ferramentas para processamento de sinais. Aplicac
oes
incluem
audio, vdeo, telecomunicacoes, medicina (imagem de ressonancia magnetica),
geofsica e econometria.
um conjunto de ferramentas para processamento de imagens e
Image Processing: E
desenvolvimento de algoritmos.
Statistics: Contem ferramentas para analises estatsticas, modelagem, e simulacao de
Monte Carlo, com interfaces graficas para explorar conceitos fundamentais em estatstica
e probabilidade.
Alem dos toolboxes, MATLAB tem seus recursos basicos extendidos atraves da implementacao de func
oes MATLAB, conhecidas como M-files, ou atraves de rotinas escritas na
linguagem C/C++ ou Fortran, chamadas de MEX-files.

1.2

Para Executar o Matlab

Para executar o MATLAB, basta clicar no cone especfico existente na area de trabalho do
monitor, via menu, ou utilizar o comando de sistema matlab. A execucao de MATLAB abre
uma ou mais janelas no monitor. Destas, a janela de comando (Command Window) e o local
primario onde o usuario interage com o MATLAB. Esta janela aparecera como exemplificado
na Figura 1.1.
O smbolo >> visto na janela de comando e o prompt do MATLAB, ou seja, onde as
instrucoes a serem executadas pelo MATLAB sao digitadas. Apos digitar um comando, pressionar a tecla Enter ou Return para que o comando seja executado. Para entrar m
ultiplas
linhas de comandos sem que sejam executados, concluir cada linha usando Shift+Enter ou
Shift+Return. Pressionando Enter ou Return faz com que todas as linhas sejam executadas.
c 2005 G. L. TORRES

1.3. PARA SAIR DO MATLAB

Figura 1.1: Janela principal do MATLAB: Command Window.

1.3

Para Sair do Matlab

Para sair do MATLAB, ao final de uma sessao de trabalho, basta digitar quit ou exit no
prompt do MATLAB:
>> quit
ou entao, com o cursor sobre a janela de comando, teclar Ctrl+C. Para limpar a janela de
comando e reposicionar o prompt na primeira linha da janela basta digitar clc.
A seguir, sao apresentados os comandos mais u
teis e usuais, embora seja importante salien importar que existem in
umeros outros comandos que nao sao abordados neste documento. E
tante, portanto, uma consulta ao manual do usuario e ao guia de referencia, ou ao help on-line
disponvel no programa, sempre que necessario. A consulta ao help on-line e descrita a seguir.

1.4

O Help On-Line

Uma das grandes facilidades apresentadas pelo MATLAB e a disponibilidade de uma ajuda
interativa (o help on-line) bastante completa e esclarecedora, e que pode ser consultada a
qualquer momento. Dependendo da forma como e digitado, o comando help revela informac
oes
diversas. Este comando pode ser utilizado de quatro modos. O help simples fornece a lista dos
principais t
opicos de ajuda. Cada topico corresponde a um diretorio montado no MATLAB
(incluindo os toolboxes instalados). Exemplo:
c 2005 G. L. TORRES

AO MATLAB
CAP
ITULO 1. INTRODUC
AO

>> help
HELP topics:
matlab/general
matlab/ops
matlab/lang
matlab/elmat
matlab/elfun
matlab/specfun
matlab/matfun
matlab/datafun

General purpose commands.


Operators and special characters.
Programming language constructs.
Elementary matrices and matrix manipulation.
Elementary math functions.
Specialized math functions.
Matrix functions - numerical linear algebra.
Data analysis and Fourier transforms.

continua ...
O comando help help explica como utilizar o proprio comando help, enquanto o comando
help <topico> fornece uma descricao detalhada do comando ou funcao <topico>, incluindo
a sua finalidade, sintaxe, algoritmo, exemplos e lista de itens relacionados. Exemplo:
>> help sqrt
SQRT
Square root.
SQRT(X) is the square root of the elements of X. Complex
results are produced if X is not positive.
See also SQRTM.
O comando help <diretorio> fornece uma lista dos comandos ou funcoes contidas neste
<diretorio>. Exemplo:
>> help elfun
Elementary math functions.
Trigonometric.
sin
sinh
asin
asinh
cos
cosh
-

Sine.
Hyperbolic sine.
Inverse sine.
Inverse hyperbolic sine.
Cosine.
Hyperbolic cosine.

continua ...
Se o usuario nao esta seguro do nome correto ou da existencia ou nao de um determinado
topico, o comando lookfor e um recurso mais produtivo de se obter ajuda. O comando
lookfor prover essa ajuda listando todos os topicos cuja primeira linha do help respectivo
contem a palavra chave indicada pelo usuario. O mais importante: a palavra chave nao precisa
ser um comando MATLAB. Por exemplo,
c 2005 G. L. TORRES


1.5. VARIAVEIS

>> lookfor complex


CONJ
CPLXPAIR
IMAG
REAL
CDF2RDF

Complex conjugate.
Sort numbers into complex conjugate pairs.
Complex imaginary part.
Complex real part.
Complex diagonal form to real block diagonal form.

continua ...
Observe que a palavra complex nao e um comando MATLAB, mas foi encontrada na descric
ao
do help de varios comandos MATLAB. Dada essa informacao, o comando help pode agora
ser utilizado para mostrar ajuda sobre um comando especfico. Exemplo:
>> help conj
CONJ
Complex conjugate.
CONJ(X) is the complex conjugate of X.
For a complex X, CONJ(X) = REAL(X) - i*IMAG(X).
See also REAL, IMAG, I, J.
Observe dos comandos lookfor e help acima que e uma convencao do MATLAB que
nomes de func
oes sejam apresentados em letras mai
usculas dentro do texto descritivo do help,
com a finalidade de facilitar a identificacao dos mesmos. Entretanto, o nome de todas as
funcoes que fazem parte do MATLAB ou de qualquer de seus toolboxes devera ser digitado
em letras min
usculas.

1.5

Vari
aveis

Outra grande vantagem do MATLAB sobre as outras linguagens de programacao cientfica e


a sua facilidade em manusear variaveis. Diferentemente de Pascal, C/C++ ou Fortran, nao e
necessario declarar tipo nem dimensionar variaveis. MATLAB trabalha essencialmente com
apenas um tipo de objeto: uma matriz retangular com possivelmente valores complexos. Todas
as variaveis representam matrizes. Em algumas situacoes, matrizes 1-por-1 sao interpretadas
como escalares e matrizes com apenas uma linha ou uma coluna sao interpretadas como vetores.
As variaveis sao automaticamente geradas a medida que vao sendo utilizadas, e suas dimensoes podem ser alteradas sempre que necessario. Todas as variaveis utilizadas numa sessao
de trabalho sao armazenadas na memoria ate que a sessao de trabalho seja encerrada ou que
as variaveis sejam deletadas atraves do comando clear. Para gera-las, utilizam-se comandos
de atribuica
o, que podem ser explcitos ou implcitos. Exemplos de atribuicoes explcitas sao:
>> a
>> b
>> c
>> D
D =

=
=
=
=
1
0
0

1 ;
1 + i*2 ;
[0 1 2] ;
[1 0 0; 0 1 0; 0 0 1]
0
1
0

0
0
1
c 2005 G. L. TORRES

AO MATLAB
CAP
ITULO 1. INTRODUC
AO

A utilizac
ao de um ponto e vrgula logo apos uma atribuicao (ou qualquer outro comando) faz
com que o resultado obtido nao seja exibido na tela, embora seja armazenado na memoria, tal
como ocorre com os dados a, b e c do exemplo acima. Observe que o ponto e vrgula nao e
colocado na atribuic
ao da matriz D e consequentemente o resultado e exibido a seguir.
Uma atribuic
ao implcita atribui `a uma variavel o valor de outra variavel ou o valor de uma
expressao algebrica ou l
ogica envolvendo outras variaveis. Exemplo:
>> A = [1 2; 5 3]; B = [2 1; -3 4]; C = [3 2; 4 1]; k = 2;
>> D = A
D =
1
2
5
3
>> E = C + D
E =
4
4
9
4
>> F = k * (A + B)
F =
6
6
4
14
Como qualquer outra linguagem de programacao, MATLAB impoe algumas regras sobre
os nomes das variaveis. Mais especificamente, estas regras sao:
Variaveis sao case sensitive, ou seja, pode-se ter, numa mesma sessao de trabalho, as
variaveis volt, Volt e VOLT armazenando valores diferentes ao mesmo tempo.
Nomes de variaveis podem conter ate 19 caracteres significativos. Os caracteres alem do
19o sao ignorados.
Nomes de variaveis devem iniciar com uma letra, podendo ser seguida por qualquer
combinac
ao de letras, n
umeros, ou traco de sublinhar.
Em adicao a essas regras, MATLAB possui diversas variaveis especiais, pre-ajustadas:
Variavel
ans
pi
eps
inf
NaN
iej
realmin
realmax

Valor
Nome default de variavel utilizada para resultados
A constante = 3.1415 . . .
Menor n
umero que se adicionado a 1 cria um n
umero
de ponto flutuante maior do que 1 no computador.
Infinito, por exemplo, 1/0
Not-a-Number,
por exemplo, 0/0

i = j = 1
O menor n
umero real positivo que pode ser utilizado
O maior n
umero real positivo que pode ser utilizado

Todas as variaveis utilizadas em uma sessao de trabalho sao armazenadas na memoria ate
que a sessao seja encerrada, ou sejam deletadas incondicionalmente atraves do comando clear.
Por exemplo,
c 2005 G. L. TORRES


1.5. VARIAVEIS

>> clear A

Deleta apenas a variavel A.

>> clear A B C

Deleta as variaveis A, B, e C.

>> clear

Deleta todas as variaveis na area de trabalho. Atencao! O usuario nao e


consultado para confirmar a operacao. Todas as variaveis serao deletadas
e nao poderao ser recuperadas.

No decorrer de uma sessao de trabalho, e possvel armazenar as variaveis existentes na


area de trabalho para utilizac
ao posterior. Para isto, utilizam-se os comandos save e load.
Para saber quais variaveis estao ativas e armazenadas na memoria utiliza-se o comando who
ou whos. Por exemplo,
>> whos
Name
D
E
F
a
b
c
k

Size

Bytes

2x2
2x2
2x2
1x1
1x1
1x3
1x1

32
32
32
8
16
24
8

Class
double
double
double
double
double
double
double

array
array
array
array
array (complex)
array
array

Grand total is 18 elements using 152 bytes


Observe que este comando nao fornece os valores das variaveis; fornece apenas os seus nomes,
dimensao, memoria utilizada, e tipo. Para conhecer o valor de uma variavel basta digitar o
nome da variavel no prompt do MATLAB. Exemplo:
>> E
E =
4
9

4
4

O comando save pode ser utilizado basicamente de tres maneiras:


>> save
armazena todas as variaveis da
area de trabalho no arquivo padrao matlab.mat. O comando
>> save arquivo
armazena todas as variaveis da
area de trabalho em arquivo.mat, sendo o nome arquivo
escolhido pelo usuario. O comando
>> save arquivo var1 var2
armazena as variaveis var1 e var2 no arquivo arquivo.mat. Exemplo:
>> save teste D E a b
c 2005 G. L. TORRES

AO MATLAB
CAP
ITULO 1. INTRODUC
AO

armazena as variaveis D, E, a e b no arquivo teste.mat. A area de trabalho (todas as variaveis)


tambem pode ser salva utilizando-se a opcao Save Workspace As do menu File. Arquivos
.mat tem estrutura especial em formato binario.
As variaveis salvas pelo comando save sao recarregadas na memoria (area de trabalho do
MATLAB) atraves do comando load. O comando load pode ser utilizado de duas maneiras.
O comando simples
>> load
carrega na memoria todas as variaveis que estao armazenadas no arquivo matlab.mat. O
comando
>> load arquivo
carrega na memoria todas as variaveis contidas em arquivo.mat.
Os comandos save e load tambem possuem a opcao de arquivos no formato ASCII. Os
seguintes exemplos ilustram a sintaxe e as opcoes dos comandos save e load:
>> save arquivo X, Y, Z -ascii
salva as variaveis X, Y e Z em arquivo ASCII,
>> load arquivo -ascii
carrega nome-de-arquivo como arquivo ASCII, e
>> save arquivo W -append
acrescenta dados a um arquivo .mat ja existente. O comando
>> save arquivo -regexp exp1 exp2
salva todas as variaveis que contem as expressoes regulares exp1 e exp2. O comando
>> save arquivo -struct S
salva os campos da estrutura S como variaveis individuais no arquivo indicado (arquivo). O
comando
>> save arquivo -struct S X Y Z
salva os campos S.X, S.Y e S.Z em arquivo como variaveis individuais X, Y e Z.
Por default, arquivos .mat criados com save sao compactados. Estes arquivos .mat nao
podem ser carregados por versoes do MATLAB anteriores a versao 7.0. No entanto, a opc
ao
-V6 desabilita esta caracterstica e permite que os arquivos .mat gerados sejam carregados
por versoes anteriores do MATLAB. Quando utiliza-se a opcao -V4, variaveis que sao incompatveis com MATLAB 4 nao sao salvas no arquivo .mat, tais como estruturas, celulas,
variaveis cujos nomes contem mais de 19 caracteres, etc.
Nos subdiretorios de \MATLAB\EXTERN\ ha um conjunto de subrotinas e programas para
auxiliar a gravac
ao e leitura de arquivos .mat por programas em C ou Fortran.
c 2005 G. L. TORRES


1.6. FORMAS DE INTERAC
AO

1.6

Formas de Interac
ao

MATLAB e um sistema interativo. Os comandos digitados no prompt >> sao executados


assim que a tecla <ENTER> e pressionada. Na sua forma mais simples, MATLAB pode ser
utilizado como uma calculadora de bolso:
>> (1+sqrt(5))/2
ans =
1.6180
>> 2^(-53)
ans =
1.1102e-016

O primeiro exemplo calcula (1 + 5)/2 e o segundo 253 . Observe que o segundo resultado
e exibido na notac
ao exponencial: ele representa 1.1102 1016 . Como dito anteriormente, a
variavel ans e criada (ou sobreescrita, se ela ja existe) quando o resultado de uma expressao
nao e atribudo a uma variavel.
Diferentemente de outras linguagens de programacao, as variaveis nao sao declaradas antes
do seu uso; elas sao automaticamente criadas pelo MATLAB assim que a elas e atribudo
algum valor:
>> x = sin(22)
x =
-0.0089
Aqui, atribumos a x o seno de 22 radianos. A impressao da sada pode ser suprimida
acrecentando-se o ponto e vrgula no final da expressao:
>> y = 2*x + exp(-3)/(1+cos(.1)) ;
Vrgulas ou ponto-e-vrgulas sao utilizados para separar declaracoes que aparecem numa mesma
linha:
>> x = 2, y = cos(.3), z = 3*x*y
x =
2
y =
0.9553
z =
5.7320
>> x = 5; y = cos(.5); z = x*y^2
z =
3.8508
A linha pode ser terminada com tres pontos, o que torna a proxima linha uma linha de
continuac
ao:
>> x = 1 + 1/2 + 1/3 + 1/4 + 1/5 + ...
1/6 + 1/7 + 1/8 + 1/9 + 1/10
x =
2.9290
c 2005 G. L. TORRES

AO MATLAB
CAP
ITULO 1. INTRODUC
AO

10

Muitas vezes precisamos capturar informacoes da sessao de trabalho do MATLAB para


incorpora-las a algum documento. Isto e feito de forma mais conveniente com o comando
diary. Digitando-se
>> diary arquivo
toda entrada e texto da sada subsequente a emissao do comando e copiado para o arquivo
especificado. O comando
>> diary off
desativa o dispositivo diario. Digitando-se diary on apos um diary off reabilita-se o
registro das informac
oes no mesmo arquivo diario.
Para exibir o valor de uma variavel ou expressao sem o nome da variavel ou sem o ans
sendo exibido, podemos utilizar o comando disp:
>> A = eye(2); disp(A)
1
0
0
1
>> disp(Resultado:), disp(1/7)
Resultado:
0.1429
Uma cadeia de caracteres, chamada de string, e inserida no MATLAB entre apostrofos.
Exemplo:
>> s = Isto e um teste
s =
Isto e um teste
Strings de textos podem ser exibidas tambem com a funcao disp. Exemplo:
>> disp(Isto e um teste com disp)
Isto e um teste com disp
Mensagens de erros sao exibidas preferencialmente com a funcao error, tal como em
error(A matriz deve ser simetrica!)
uma vez que quando esta localizada numa subrotina MATLAB ela aborta a execucao da
rotina. A interac
ao do MATLAB com o usuario para uma entrada de dados pode ocorrer
atraves da func
ao input. Quando, por exemplo, a instrucao
>> iter = input(Entre com o numero de iteracoes: )
e encontrada, a mensagem no comando input e exibida e a execucao e congelada para que
o usuario digite o dado de entrada. Apos pressionar a tecla <ENTER>, o dado e atribudo a
variavel iter e a execuc
ao prossegue.
Se o usuario simplesmente teclar <ENTER> sem digitar qualquer informacao, entao o comando input retornara uma matriz vazia. O comando
>> nome = input(Qual e o seu nome,s)
c 2005 G. L. TORRES

1.7. FUNC
OES
MATEMATICAS
COMUNS

11

fornece o prompt na mensagem e espera que voce digite uma string. Os caracteres digitados
sao retornados, apos teclar <ENTER>, como uma string MATLAB.
Varios comandos sao disponveis para interacao com o sistema operacional, incluindo os
comandos cd (para mudar de diretorio), copyfile (copiar arquivo), mkdir (criar diretorio), pwd
(exibir nome do diretorio corrente), dir ou ls (listar diretorio), e delete (deletar arquivo).
Um comando pode ser emitido ao sistema operacional, a partir do prompt do MATLAB,
precedendo-se este comando com a marca de exclamacao, !. Por exemplo, a instrucao
>> !edit teste
edita o arquivo teste com o aplicativo edit do MS Windows.

1.7

Fun
c
oes Matem
aticas Comuns

Uma lista parcial da func


oes matematicas elementares que o MATLAB dispoe e apresentada na
importante ressaltar que as funcoes trigonometricas do MATLAB trabalham
tabela abaixo. E
apenas com
angulos em radianos.

1.8

Aritm
etica

MATLAB executa todas as suas operacoes aritmeticas em aritmetica de ponto-flutuante de


precisao dupla, conforme a aritmetica de ponto-flutuante do IEEE. No tipo de dado double do
MATLAB cada n
umero ocupa uma palavra de 64-bit. N
umeros nao-nulos variam, em modulo,
308
+308
entre aproximadamente 10
e 10
, e o limite para o erro relativo na conversao de um
n
umero real para a forma de ponto-flutuante (unit roundoff ) e 253 1.11 1016 . Em outras
palavras, MATLAB armazena n
umeros de ponto-flutuante e executa operacoes elementares
com uma precisao de cerca de 16 dgitos decimais significativos.
A func
ao eps retorna a distancia de 1.0 para o n
umero de ponto-flutuante proximo maior:
>> eps
ans =
2.2204e-016
Se o resultado de um c
alculo e maior do que o valor retornado pela funcao realmax ent
ao
ocorre overflow e o resultado da operacao e Inf, representando infinito. De forma similar, um
resultado negativo menor do que realmax produz Inf.
Um c
alculo cujo resultado nao e matematicamente definido produz um NaN, significando
Not a Number. Por exemplo,
>> 0/0
Warning: Divide by zero.
ans =
NaN
Uma vez gerado, um NaN propaga-se por todos os calculos subsequentes:
>> NaN-NaN
ans =
NaN
c 2005 G. L. TORRES

AO MATLAB
CAP
ITULO 1. INTRODUC
AO

12

Comando
cos(x)
sin(x)
tan(x)
csc(x)
sec(x)
cot(x)
acos(x)
asin(x)
atan(x)
atan2(x)
asec(x)
acsc(x)
acot(x)
cosh(x)
sinh(x)
tanh(x)
sech(x)
csch(x)
coth(x)
acosh(x)
asinh(x)
atanh(x)
asech(x)
acsch(x)
acoth(x)
log(x)
log2(x)
log10(x)
exp(x)
pow2(x)
ceil(x)
fix(x)
floor(x)
round(x)
abs(x)
angle(x)
conj(x)
imag(x)
real(x)
mod(x,y)
rem(x,y)
sign(x)

Func
ao Matematica
Cosseno de x
Seno de x
Tangente de x
Cossecante de x
Secante de x
Cotangente de x
Arco-cosseno de x
Arco-seno de x
Arco-tangente de x
Arco-tangente de x no quarto quadrante
Arco-secante de x
Arco-cossecante de x
Arco-tangente de x
Cosseno hiperbolico de x
Seno hiperbolico de x
Tangente hiperbolico de x
Secante hiperbolica de x
Cossecante hiperbolica de x
Cotangente hiperbolica de x
Arco-cosseno hiperbolico de x
Arco-seno hiperbolico de x
Arco-tangente hiperbolico de x
Arco-secante hiperbolico de x
Arco-cossecante hiperbolico de x
Arco-cotangente hiperbolico de x
Logaritmo natural de x
Logaritmo na base 2 de x
Logaritmo comun (base 10)
Exponencial ex
Potencia na Base 2 dos elementos de x
Arredonda para o valor inteiro proximo maior
Arredonda para o valor inteiro proximo de zero
Arredonda para o valor inteiro proximo menor
Arredonda para o valor mais proximo
Valor absoluto (ou modulo se n
umero complexo) de x

Angulo do n
umero complexo x
Complexo conjugado de x
Parte imaginaria do n
umero complexo x
Parte real do n
umero complexo x
Restante da divisao x/y com o sinal de y
Restante da divisao x/y com o sinal de x
Sinal de x: 1

c 2005 G. L. TORRES


1.9. OPERAC
OES
COM VETORES

1.9

13

Operac
oes com Vetores

Criar vetores e matrizes em MATLAB e extremamente simples. Abra o vetor com o colchete
esquerdo, [, entre com os valores desejados separados por espacos ou vrgulas, e feche o vetor
com o colchete direito, ]. Exemplo:
>> x = [1 2 3 4 5 6 7 8 9 10]
x =
1
2
3
4
5

10

Assim como em Fortran ou C/C++, em MATLAB um determinado elemento de vetor e


acessado utilizando-se subscritos. Por exemplo, x(1) e o primeiro elemento em x, x(2) e o
segundo elemento, e assim por diante.
Diferentemente das outras linguagens, em MATLAB blocos de elementos podem ser acessados de uma so vez utilizando-se a notacao dos dois pontos, :, como segue:
>> x(3:7)
ans =
3

Utilizando-se a notac
ao dos dois pontos, o vetor x acima pode ser criado de forma mais simples,
como:
>> x = 1:10
x =
1
2

10

MATLAB tambem permite a concatenacao de vetores, como segue:


>> a = 1:5, b = 6:10
a =
1
2
3
b =
6
7
8
>> c = [a b]
c =
1
2

10

10

As operac
oes de adic
ao, subtracao, multiplicacao e divisao de um vetor por um escalar
aplica a operac
ao a todos os elementos do vetor. Exemplos:
>> a - 2
ans =
-1

>> 2 * a - 1
ans =
1
3

Quando dois vetores possuem o mesmo n


umero de elementos, as operacoes de adic
ao,
subtracao, multiplicac
ao e divis
ao aplicam-se elemento a elemento. No entanto, a notac
ao
para as operac
oes de multiplicac
ao e divisao de vetores e ligeiramente diferente da notacao de
adicao e subtrac
ao. Por exemplo,
c 2005 G. L. TORRES

AO MATLAB
CAP
ITULO 1. INTRODUC
AO

14

>> d = a + b
d =
7
9

11

13

15

>> e = a .* b
e =
6
14

24

36

50

>> f = a ./ b
f =
0.1667
0.2857

0.3750

0.4444

0.5000

Observe a presenca do ponto nos operadores de multiplicacao (.*) e divisao (./) afim de que
essas operac
oes sejam efetuadas na base elemento a elemento. Potencia de vetores e definida
de varias maneiras. Por exemplo,
>> a .^ 2
ans =
1

16

25

>> 2 .^ a
ans =
2

16

32

>> b .^ a
ans =
6

49

512

6561

100000

O primeiro exemplo eleva os elementos de a a potencia 2, o segundo exemplo eleva 2 a potencia


de cada elemento de a, e o terceiro e u
ltimo exemplo eleva os elementos de b aos elementos de
a correspondentes.
Para mudar a orientac
ao de um vetor, ou seja, converte-lo de linha para coluna e vice-versa,
utiliza-se o ponto-apostrofo (.). No caso de um vetor de n
umeros complexos, para se obter o
conjugado transposto utiliza-se apenas o apostrofo. Por exemplo,
>> d = a + i*a
d =
Columns 1 through 4
1.0000 + 1.0000i
2.0000 + 2.0000i

3.0000 + 3.0000i

Column 5
5.0000 + 5.0000i
>> d.
ans =
1.0000
2.0000
3.0000
4.0000

+
+
+
+

1.0000i
2.0000i
3.0000i
4.0000i
c 2005 G. L. TORRES

4.0000 + 4.0000i

1.10. FORMATOS DE SA
IDA

15

5.0000 + 5.0000i
>> d
ans =
1.0000
2.0000
3.0000
4.0000
5.0000

1.10

1.0000i
2.0000i
3.0000i
4.0000i
5.0000i

Formatos de Sada

Embora todos os c
alculos realizados pelo MATLAB sao executados em precisao dupla, o
formato do resultado exibido no monitor pode ser controlado pelos seguintes comandos:
Comando
format short
format long
format short e
format long e
format short g
format long g
format short eng
format long eng
format rat
format hex
format bank
format +

Formato de Sada
Ponto fixo com 4 dgitos decimais (default)
Ponto fixo com 14 dgitos decimais
Notac
ao cientfica com 4 dgitos decimais
Notac
ao cientfica com 15 dgitos decimais
Notac
ao cientfica com 4 dgitos decimais
Notac
ao cientfica com 15 dgitos decimais
Formato engenharia (exp. m
ultiplo de 3)
Formato engenharia (exp. m
ultiplo de 3)
Aprox. pela razao de menores inteiros
Formato hexadecimal
Dolares e centavos fixos
+, , branco

Exemplo
27.1828
27.18281828459045
2.7183e+01
2.718281828459045e+01
27.183
27.1828182845905
27.1828e+000
27.1828182845905e+000
2528/93
403b2ecd2dd96d44
27.18

Uma vez selecionado, o formato escolhido permanece ativo ate que a escolha de um novo
formato seja feita. O comando
>> format compact
suprime muitas linhas em branco permitindo que mais informacoes sejam exibidas na mesma
pagina ou tela do monitor. O comando
>> format loose
retorna ao formato nao-compacto. Estes comandos sao independentes dos demais comandos
de formato.

1.11

Plotagem Simples

A extensa capacidade grafica de MATLAB nao e totalmente considerada neste documento.


No entanto, sao ilustrados alguns exemplos simples de plotagem. Por exemplo, considere a
plotagem da func
ao
y = sin(x),
para 0 x 2.
Utilizando vetores, MATLAB primeiro define um vetor de 30 pontos entre 0 e 2, em seguida
calcula y = sin(x) para cada ponto, e entao plota a curva x y, como mostrado na Figura 1.2:
c 2005 G. L. TORRES

AO MATLAB
CAP
ITULO 1. INTRODUC
AO

16

>>
>>
>>
>>
>>
>>
>>
>>

x = linspace(0,2*pi,30) ;
y = sin(x) ;
plot(x,y)
grid
xlabel(x)
ylabel(sin(x))
title(y = sin(x) )
print -deps plot.eps

%
%
%
%
%
%
%
%

cria o vetor de pontos


calcula o seno de cada ponto
plota o grafico x versus y
exibe grade em pontilhado
titulo do eixo horizontal
titulo do eixo vertical
titulo do grafico
salva a figura no arquivo plot.eps

y = sin(x)
1

0.8

0.6

0.4

sin(x)

0.2

0.2

0.4

0.6

0.8

Figura 1.2: Plotagem simples de y = sin(x) com a funcao plot.


Observe que a func
ao plot de MATLAB e bastante poderosa. Ela automaticamente
escolhe as escalas do grafico, marca os pontos de dados individuais, e plota a curva ligando
estes pontos. As opc
oes do comando plot permitem ainda plotar m
ultiplos conjuntos de
dados no mesmo eixo, utilizar diferentes tipos de linhas, marcar os pontos de dados sem plotar
qualquer curva, usar diferentes cores para as curvas, incluir rotulos nos eixos, incluir um ttulo
no topo do grafico, e desenhar um grid de orientacao. Os recursos MATLAB para plotar
graficos sao descritos com muito mais detalhes no Captulo 3.

1.12

Os Arquivos-M

Para problemas simples, entrar com os comandos no prompt do MATLAB e rapido e eficiente.
Entretanto, quando o n
umero de comandos necessarios para resolver um problema aumenta,
ou e necessario mudar o valor de uma ou mais variaveis e repetir a execucao de um n
umero
significativo de comandos, digitar os comandos diretamente no prompt do MATLAB torna-se
tedioso.
Para resolver esse problema, MATLAB permite que o usuario coloque essa sequencia de
comandos num arquivo de texto simples e entao faca MATLAB abrir esse arquivo e executar
todos os comandos l
a inseridos como se eles tivessem sido digitados diretamente no prompt do
MATLAB. Estes arquivos sao chamados de script files ou arquivos-M. O termo arquivo-M
c 2005 G. L. TORRES

1.13. P-CODE

17

origina-se do fato de que esses arquivos possuem a extensao .m, por exemplo, teste.m. Para
executar os comandos no arquivo teste.m basta digitar teste no prompt do MATLAB:
>> teste
Os comandos dentro de um arquivo-M tem acesso a todas as variaveis na area de trabalho do
MATLAB, assim como todas as variaveis criadas no arquivo-M tornam-se parte da area de
trabalho.
O arquivo-M de uma func
ao pode conter codigo de mais de uma funcao. A primeira, que
e executada com o nome do arquivo-M, e chamada de funca
o prim
aria. As outras sao ditas
subfunco
es, e sao visveis apenas para a funcao primaria ou para as subfuncoes no mesmo
arquivo. As subfunc
oes comecam consecutivamente, e cada subfuncao inicia com a sua propria
linha de definic
ao de func
ao.
MATLAB possui varios comandos de administracao de arquivos que permitem listar nomes
de arquivos, ver e deletar arquivos-M, exibir e mudar o diretorio corrente, etc. Um resumo
destes comandos e dado abaixo:
Comando
what
dir
type arquivo
delete arquivo
cd diretorio
pwd
which teste

1.13

Descric
ao
Exibe uma lista de todos os arquivos-M no diretorio corrente
Exibe uma lista dos arquivos existentes no diretorio corrente
Exibe o conte
udo de arquivo.m na janela de trabalho
Deleta arquivo.m
Muda do diretorio corrente para diretorio
Exibe o diretorio corrente
Localiza o diretorio do arquivo teste.m

P-code

Um arquivo em P-code (parsed code) e uma versao pre-processada de uma function ou script.
Estes arquivos tem a terminac
ao .p e o conte
udo nao e revelado, ou seja, nao podemos ver
o codigo de um arquivo .p. A finalidade destes arquivos e ganhar tempo na sua utilizac
ao
em MATLAB ou ainda nao revelar o conte
udo do arquivo-M, preservando a propriedade
intelectual. Para gerar o arquivo .p da funcao mean, digite
>> pcode mean
O arquivo mean.m e processado (parsed) e o pseudo-codigo resultante e gravado no arquivo
mean.p. O c
odigo do arquivo mean.p nao pode ser editado nem visto pelo usuario; apenas
aquelas linhas de coment
arios que podem ser exibidas pelo comando help e que sao visveis.

1.14

Operadores Relacionais e L
ogicos

Em adicao as operac
oes matematicas tradicionais, MATLAB suporta operacoes logicas e relacionais. O proposito destes operadores e funcoes e prover respostas para questoes do tipo
Verdadeiro/Falso. Como entrada para toda expressao logica e relacional, MATLAB considera
qualquer n
umero nao-nulo como Verdadeiro e zero como Falso. A sada de toda expressao
logica e relacional fornece 1 para Verdadeiro e 0 para Falso.
Os operadores relacionais sao:
c 2005 G. L. TORRES

AO MATLAB
CAP
ITULO 1. INTRODUC
AO

18

Operador
<
<=
>
>=
==
~=

Descricao
<

>

=
6=

Os operadores relacionais do MATLAB podem ser utilizados para comparar dois vetores do
mesmo tamanho, ou para comparar um vetor a um escalar. Alguns exemplos sao:
>> a = 1:9, b = 9 - a
a =
1
2
3
b =
8
7
6

>> vf = a > 4
vf =
0
0

>> vf = a == b
vf =
0
0

O primeiro exemplo determina os elementos do vetor a que sao maiores do que 4. O segundo
exemplo determina os elementos de a que sao iguais aos elementos de b.
Os operadores l
ogicos fornecem uma maneira para combinar ou negar expressoes relacionais.
Os operadores l
ogicos sao:
Operador
&
!
~

Descricao
E
OU

NAO

Por exemplo, a expressao


>> vf = ( a > 2 ) & ( a < 6 )
vf =
0
0
1
1
1

retorna 1s nas posic


oes onde os elementos de a sao maiores do que 2 e menores do que 6.

c 2005 G. L. TORRES

Captulo

Algebra
Linear e Matrizes

2.1

Matrizes

Uma matrix A e definida como um arranjo retangular de elementos, da seguinte forma:

a11
a21

A= .
..

a12
a22
..
.

am1 am2

a1n
a2n

..
.

amn

Os elementos aij podem ser n


umeros (reais ou complexos) ou funcoes. Se A consiste de m
linhas e n colunas, ent
ao A e dita uma matrix retangular m-por-n. Se m e igual a n, entao A
e dita uma matrix quadrada de ordem n.
Matrizes sao fundamentais para MATLAB, e mesmo que o usuario nao pretenda utilizar
MATLAB para c
alculos envolvendo algebra linear ainda e preciso estar familiarizado com
geracao e manipulac
ao de matrizes. Matrizes podem ser geradas de diversas formas, entre elas
a notacao do colchete:
>> A = [2 3 5
7 11 13
17 19 23]
A =
2
3
5
7
11
13
17
19
23
19


CAP
ITULO 2. ALGEBRA
LINEAR E MATRIZES

20

O fim de uma linha pode ser especificado por um ponto e vrgula em vez de um <ENTER>, e
assim um comando mais compacto, mas com o mesmo efeito, para a matriz acima, e
>> A = [2 3 5; 7 11 13; 17 19 23]
Dentro de uma linha, os elementos podem ser separados por espacos ou por vrgulas. No
primeiro caso, se os n
umeros sao especificados com um sinal + ou deve-se tomar o cuidado
para nao deixar um espaco entre o sinal e o n
umero, senao o MATLAB interpretara o sinal
como um operador de adic
ao ou subtracao. Exemplo:
>> x = [-1 2 -3 4]
x =
-1
2
-3

>> x = [-1 2 - 3 4]
x =
-1
-1
4
MATLAB aceita n
umeros complexos em todas as suas funcoes e operacoes. Duas maneiras
covenientes para entrar com matrizes complexas sao:
>> A = [1 2; 3 4] + i*[5 6; 7 8]
A =
1.0000 + 5.0000i
2.0000 + 6.0000i
3.0000 + 7.0000i
4.0000 + 8.0000i
>> A = [1+5i 2+6i; 3+7i 4+8i]
A =
1.0000 + 5.0000i
2.0000 + 6.0000i
3.0000 + 7.0000i
4.0000 + 8.0000i

O i ou o j deve ser utilizado como a unidade imaginaria 1. Se, entretanto, i e j sao utilizados como variaveis e sobreescrevem o valor imaginario, entao uma nova unidade imaginaria
deve ser gerada como, digamos, ii = sqrt(-1).
Duas func
oes muito importantes para geracao de matrizes no MATLAB sao rand(m,n) e
randn(m,n), as quais geram matrizes m-por-n de n
umeros randomicos. A funcao rand produz
uma matriz de n
umeros de distribuicao uniforme sobre o intervalo [0, 1]. Para esta distribuic
ao
a proporc
ao de n
umeros num intervalo [a b] com 0 < a < b < 1 e b a. A funcao randn produz
uma matriz de n
umeros de distribuicao normal padrao (0, 1). Exemplos:
>> rand
ans =
0.9501
>> rand(3)
ans =
0.2311
0.6068
0.4860

0.8913
0.7621
0.4565

0.0185
0.8214
0.4447
c 2005 G. L. TORRES

DE MATRIZES
2.2. MANIPULAC
AO

21

Algumas vezes, na conduc


ao de experimentos com n
umeros aleatorios, e importante ser
possvel reproduzir os mesmos n
umeros numa ocasiao subsequente. Isto e possvel definindo o
state do gerador de n
umeros aleat
orios, como no exemplo abaixo:
>> rand(state,20) ;
>> rand(3)
ans =
0.7062
0.3586
0.5260
0.8488
0.2157
0.0426

2.2

0.8468
0.3270
0.5541

Manipulac
ao de Matrizes

Uma vez que matrizes sao fundamentais para MATLAB, varios recursos sao disponveis para
manipulac
ao de matrizes. Tendo as matrizes sido formadas, MATLAB dispoe de poderosas
formas para inserir, extrair, e rearranjar subconjuntos delas atraves da facil manipulacao dos
ndices de interesse.
A notac
ao dos dois pontos, :, e utilizada para definir vetores que podem agir como subscritos. Para os inteiros i e j, i:j representa o vetor linha de inteiros de i a j (em incrementos
unitarios). Um incremento s diferente da unidade e especificado como i:s:j. Esta notac
ao
ainda e valida para i, j e s nao-inteiros. Exemplos:
>> 1:5
ans =
1

>> 4:-1:-2
ans =
4
3

>> 0:.75:3
ans =
0

0.7500

1.5000

-1

-2

2.2500

3.0000

Elementos especficos de uma matriz sao acessados como A(i,j), onde i 1 e j 1 (subscritos nulos ou negativos nao sao permitidos no MATLAB). Exemplo:
>> A = [1 2 3; 4 5 6; 7 8 9];
>> A(3,3) = 0
A =
1
2
4
5
7
8

3
6
0

>> A(2,6) = 1
A =
1
2
4
5
7
8

3
6
0

0
0
0

0
0
0

0
1
0

c 2005 G. L. TORRES

22

CAP
ITULO 2. ALGEBRA
LINEAR E MATRIZES

Observe deste exemplo que a matriz A, inicialmente 3-por-3, e aumentada para 3-por-6, com
a adicao do elemento A(2,6), ocorrendo o preenchimento automatico de zeros nos demais
elementos novos.
A submatriz que compreende a intersecao das linhas p a q e as colunas r a s e obtida como
A(p:q,r:s). Exemplo:
>> B = A(1:2,2:3)
B =
2
3
5
6
Como um caso especial, o : sozinho como o especificador de linha ou coluna engloba todos os
elementos naquela linha ou coluna. Assim, A(:,j) e a j-esima coluna de A e A(i,:) a i-esima
linha. Exemplo:
>> B(1,:)
ans =
2
3
>> B(:,2)
ans =
3
6
A palavra-chave end utilizada neste contexto representa o u
ltimo ndice na dimensao especificada. Assim, B(end,:) extrai a u
ltima linha da matriz:
>> B(end,:)
ans =
5
6
Uma submatriz arbitraria pode ser selecionada especificando-se os ndices correspondentes das
linhas e colunas. A instruc
ao A([i j k],[p q]) produz a submatriz que e formada pela
intersecao das linhas i, j e k com as colunas p e q. Exemplo:
>> B = A([1 3],[2 3])
B =
2
3
8
0
Um caso especial do uso do : e A(:), o qual representa um vetor formado por todos os
elementos de A empilhando-se as colunas de A na sequencia da primeira para a u
ltima. Exemplo:
>> C = B(:)
C =
2
8
3
0
Quando colocado no lado esquerdo do comando de atribuicao, A(:) preenche a matriz A,
preservando sua forma. Utilizando esta notacao, uma maneira de definir uma matriz 3-por-3
de n
umeros primos e
c 2005 G. L. TORRES

2.3. GERANDO MATRIZES ESPECIAIS

23

>> A = zeros(3);
>> A(:) = primes(23);
>> A = A
A =
2
3
5
7
11
13
17
19
23
A funcao primes retorna um vetor de n
umeros primos menores ou iguais ao seu argumento.
A transposic
ao A = A e necessaria para reordenar os primos no sentido das linhas em vez das
colunas.
A notac
ao [] representa um vazio; uma matriz 0-por-0. Atribuir [] a uma linha ou coluna
e uma maneira de deletar aquela linha ou coluna de uma matriz. Exemplo:
>> A(:,2) = []
A =
2
5
7
13
17
23
O efeito deste exemplo e o mesmo conseguido por
>> A = A(:,[1 3])
A matriz vazia [] e tambem bastante u
til como um meio de reservar lugar em listas de
argumentos.

2.3

Gerando Matrizes Especiais

Matriz diagonal e uma matrix quadrada n-por-n na qual aij = 0 para i 6= j, da forma:

d11 0
0
0 d22
0

D= .
..
..
..
..
.
.
.
0
0 dnn

Se x e um vetor, ent
ao diag(x) e a matriz diagonal com os elementos de x na diagonal. Se A
e uma matriz quadrada, ent
ao diag(A) e um vetor contendo os elementos da diagonal de A.
Exemplos:
>> x = [4 5 2], A = [2 3 5; 2 4 5; 3 1 9]
x =
4
5
2
A =
2
3
5
2
4
5
3
1
9
>> diag(x)
ans =
c 2005 G. L. TORRES


CAP
ITULO 2. ALGEBRA
LINEAR E MATRIZES

24

4
0
0

0
5
0

0
0
2

>> diag(A)
ans =
2
4
9
Matriz identidade e uma matriz diagonal na qual todos os elementos diagonais sao iguais
a unidade:

1 0 0
0 1 0

I = . . .
..
.
.
.
. .
. .
0 0 1

Para qualquer matriz quadrada A, temos AI = IA = A. Matrizes identididade sao geradas


pelo comando eye(m,n). Exemplos:
>> eye(2,2)
ans =
1
0
0
1
>> eye(2)
ans =
1
0

0
1

>> eye(3,2)
ans =
1
0
0
1
0
0
Uma situac
ao bastante comun e ter que obter uma matriz identidade cujas dimensoes coincidam com as dimensoes de uma certa matriz A. Isto pode ser feito atraves do comando
eye(size(A)). Exemplo:
>> eye(size(A))
ans =
1
0
0
1
0
0

0
0
1

Ha tambem o comando ones(m,n) que gera uma matriz m-por-n de 1s. Exemplo:
>> ones(3,2)
ans =
1
1
c 2005 G. L. TORRES

2.3. GERANDO MATRIZES ESPECIAIS

1
1

25

1
1

Matriz nula e uma matriz que possui todos os seus elementos nulos:

0 0 0
0 0 0

0 = . .
..
.. ..
.
0 0

Para qualquer matriz A, temos A + 0 = A. Uma matriz nula m-por-n pode ser gerada pela
funcao zeros(m,n). Exemplos:
>> zeros(2,3)
ans =
0
0
0
0

0
0

>> zeros(2)
ans =
0
0
0
0
Matriz escalar e uma matriz diagonal cujos elementos diagonais sao todos iguais:

k 0 0
0 k 0

K = . . .
.. = kI
.
.
.
. .
. .
0 0

A geracao de uma matriz escalar no MATLAB e simples. Exemplo:


>> 2*eye(3)
ans =
2
0
0
2
0
0

0
0
2

Matrizes tipo bloco-diagonal podem ser definidas utilizando a funcao blkdiag, como no
exemplo
>> A = blkdiag(rand(2),ones(2))
A =
0.9501
0.6068
0
0.2311
0.4860
0
0
0
1.0000
0
0
1.0000

0
0
1.0000
1.0000

Matriz inversa: A matriz B e dita inversa da matriz A se ela satisfaz a propriedade:


AB = BA = I
c 2005 G. L. TORRES


CAP
ITULO 2. ALGEBRA
LINEAR E MATRIZES

26

A inversa de A geralmente e representada por A1 , e pode ser calculada por:


A1 =

Adj(A)
.
|A|

Portanto, A1 so existe se |A| =


6 0, ou seja, A e nao-singular. O comando MATLAB para o
calculo de A1 e inv(A). Exemplo:
>> A = [ 2 3 5; 2 6 1; 3 0 2];
>> B = inv(A)
B =
-0.1739
0.0870
0.3913
0.0145
0.1594
-0.1159
0.2609
-0.1304
-0.0870
>> B*A
ans =
1.0000
0
0.0000

0
1.0000
0

0.0000
-0.0000
1.0000

O produto B*A tem 1s na diagonal, como esperado. Devido aos erros de truncamento nas
operacoes de ponto-flutuante, os elementos nao-diagonais, mostrados como 0.0000, nao sao,
na verdade, exatamente zeros. MATLAB armazena n
umeros e faz calculos com uma precisao
relativa de cerca de 16 dgitos decimais. Por default, ele exibe os n
umeros em um formato de
5 dgitos.
Alem de diversas matrizes especiais que o MATLAB ja dispoe, a funcao gallery criada
por N. J. Higham prover acesso a uma extensa colecao de matrizes testes. O comando help
gallery exibe a relac
ao de matrizes em gallery.

2.4

Operac
oes com Matrizes e Vetores

Adicao e subtrac
ao sao operac
oes definidas apenas para matrizes de mesma dimensao. O
produto A*B e o resultado da multiplicacao, a qual e definida apenas quando o n
umero de
colunas de A e o n
umero de linhas de B sao iguais. Os operadores \ e / definem soluc
oes
de sistemas lineares: A\B e a solucao X de A*X=B, enquanto A/B e uma solucao X de X*B=A.
Exemplos:
>> A = [1 2; 3 4], B = ones(2)
A =
1
2
3
4
B =
1
1
1
1
>> A+B
ans =
2

3
c 2005 G. L. TORRES


2.4. OPERAC
OES
COM MATRIZES E VETORES

>> A*B
ans =
3
7

3
7

>> A\B
ans =
-1
1

-1
1

27

Multiplicac
ao e divis
ao no sentido vetorial, ou elemento por elemento, sao especificados
precedendo-se o operador com um ponto. Se A e B sao matrizes de mesma dimensao, ent
ao
a operac
ao C = A.*B estabelece C(i,j) = A(i,j)*B(i,j) e C = A./B estabelece C(i,j) =
A(i,j)/B(i,j). A atribuic
ao C = A.\B e equivalente a C = B./A. Exemplos:
>> A.*B
ans =
1
3

2
4

>> B./A
ans =
1.0000
0.3333

0.5000
0.2500

Exponenciac
ao com ^ e definida como potenciacao da matriz, mas a forma do ponto fornece
a exponenciac
ao elemento a elemento. Assim se A e uma matriz quadrada, entao A^2 e o
produto matricial A*A, enquanto A.^2 e A com cada elemento elevado ao quadrado:
>> A^2, A.^2
ans =
7
10
15
22
ans =
1
9

4
16

A forma do ponto da exponenciac


ao permite que a potencia seja um vetor quando as dimensoes
da base e da potencia coincidirem, ou quando a base for um escalar:
>> x = [1 2 3]; y = [2 3 4]; Z = [1 2; 3 4];
>> x.^y
ans =
1

81

>> 2.^x
c 2005 G. L. TORRES


CAP
ITULO 2. ALGEBRA
LINEAR E MATRIZES

28

ans =
2
>> 2.^Z
2
8

4
16

Exponenciac
ao e definida para todas as potencias, nao somente para inteiros positivos. Para p
nao-inteiro, A^p e calculado utilizando os autovalores e autovetores de A; os resultados podem
ser imprecisos ou incorretos quando A e nao-diagonalizavel ou quando A tem um auto-sistema
mal-condicionado.
O conjugado transposto da matriz A e obtido com A. Se A e real, esta operacao fornece
simplesmente o transposto. O transposto sem conjugacao e obtido com A.. As alternativas
funcionais ctranspose(A) e transpose(A) sao algumas vezes mais covenientes. Para o caso
especial de vetores colunas x e y, a operacao x*y fornece o produto interno ou escalar, o qual
tambem pode ser obtido utilizando-se a funcao dot como dot(x,y). Exemplos:
>> x = [-1 0 1]; y = [3 4 5];
>> x*y
ans =
2
>> dot(x,y)
ans =
2
Se um escalar e adicionado a uma matriz entao MATLAB expandira o escalar para uma
matriz com todos os elementos iguais a aquele escalar e efetuara a soma das duas matrizes.
Exemplo:
>> A = [4 3; 2 1] - 4
A =
8
7
6
5
>> A = [1 -1] - 6
A =
-5
-7
Se uma matriz e multiplicada ou dividida por um escalar, entao a operacao e executada no
sentido elemento-a-elemento. Exemplo:
>> A = [3 4 5; 4 5 6]/12
A =
0.2500
0.3333
0.4167
0.3333
0.4167
0.5000
Partes triangulares de uma matriz sao extraidas atraves dos comandos tril e triu. A
parte triangular inferior de A (os elementos sobre a diagonal e abaixo da diagonal principal)
e especificada por tril(A), e a parte superior de A (os elementos sobre a diagonal e acima
c 2005 G. L. TORRES


2.5. NORMAS E NUMEROS
CONDICIONADORES

29

da diagonal principal) e especificada por triu(A). De forma mais geral, tril(A,k) fornece os
elementos sobre e abaixo a k-esima diagonal de A, enquanto triu(A,k) fornece os elementos
sobre e acima a k-esima diagonal de A. Exemplos:
>> A = [2 3 5; 7 11 13; 17 19 23]
A =
2
3
5
7
11
13
17
19
23
>> tril(A)
ans =
2
0
7
11
17
19

0
0
23

>> tril(A,1)
ans =
0
3
0
0
0
0

5
13
0

>> tril(A,-1)
ans =
0
3
0
0
0
0

5
13
0

2.5

Normas e N
umeros Condicionadores

Uma norma pode ser utilizada para quantificar erros e medir distancias num espaco vetorial.
Uma norma k k definida no Rn e um mapeamento que atribui um escalar kxk para todo
x Rn , e satisfaz as seguintes propriedades:
kxk 0 para todo x Rn .
kxk = 0 se e apenas se x = 0.
kxk = ||kxk para todo R e todo x Rn .
kx + yk kxk + kyk para todo x, y Rn (desigualdade do triangulo).
|xT y| kxkkyk para todo x, y Rn (desigualdade de CauchySchwarz), com a igualdade
sendo verificada se e apenas se x e um m
ultiplo de y.
A norma Euclideana e definida por
kxk2 =

xT x =

n
X
i=1

|xi |

!1/2

c 2005 G. L. TORRES


CAP
ITULO 2. ALGEBRA
LINEAR E MATRIZES

30

A norma infinita k k e definida por


kxk = max |xi |.
i

A norma unit
aria k k1 e definida por
kxk1 =

n
X

|xi |.

i=1

As tres normas acima sao casos especiais da norma-p de Holder:


!1/p
n
X
p
|xi |
,
p 1.
kxkp =
i=1

A funcao norm pode calcular qualquer norma-p e sua forma geral e


>> norm(x,p)
com default p = 2. Como um caso especial, p = -inf fornece o valor mini |xi |. Exemplo:
>> x = 1:4;
>> [norm(x,1) norm(x,2) norm(x,inf) norm(x,-inf)]
ans =
10.0000
5.4772
4.0000
1.0000
A extens
ao da norma Euclideana para matrizes e chamada de norma de Frobenius:
!1/2
m X
n
X
kAkF =
.
|aij |2
i=1 i=1

Duas outras normas de matrizes tem suas expressoes de calculo bastante simplificadas:
kAk1 = max

1jn

kAk = max

1im

m
X

i=1
n
X
j=1

|aij |,
|aij |.

Ou seja, a norma-1 e a maxima soma absoluta verificada por colunas da matriz, enquanto a
norma- e a maxima soma absoluta verificada por linhas.
No caso de matrizes, o uso da funcao norm e como segue:
>> norm(A,p)
admitindo os parametros p = 1,2,inf e p = fro para a norma de Frobenius. Exemplo:
>> A = [1 2 3; 4 5 6; 7 8 9]
A =
1
2
3
4
5
6
7
8
9
>> [norm(A,1) norm(A,2) norm(A,inf) norm(A,fro)]
ans =
18.0000
16.8481
24.0000
16.8819
c 2005 G. L. TORRES


2.6. EQUAC
OES
LINEARES

31

Para casos em que o c


alculo da norma-2 de uma matriz e computacionalmente oneroso, a
funcao normest pode ser utilizada para obter uma estimativa. O comando
>> normest(A,tol)
utiliza o metodo da potencia sobre A A para estimar kAk2 dentro de um erro relativo tol; o
default e tol = 1e-6.
Para uma matriz nao-singular A, cond(A) = kAkkA1 k 1 e o n
umero condicionador
com relac
ao a inversao. Ele mede a sensibilidade da solucao de um sistema linear Ax = b a
perturbac
oes em A e b. A matriz A e dita ser bem condicionada ou mal condicionada de acordo
com o valor cond(A) ser pequeno ou grande. Um n
umero condicionador grande implica que
A e proxima de uma matriz singular. O n
umero condicionador e calculado pela funcao cond
como
>> cond(A,p)
As escolhas de norma p = 1,2,inf,fro sao aceitas, com default p = 2. Para p = 2,
matrizes retangulares sao permitidas, caso em que o n
umero condicionador e definido por
+
+
cond(A) = kAk2 kA k2 , onde A e a falsa-inversa.
Calcular o n
umero condicionador exato e oneroso, e por essa razao MATLAB prover duas
funcoes para estimar o n
umero condicionador segundo a norma-1 de uma matriz A quadrada:
rcond e condest. Ambas as func
oes produzem, em geral, estimativas da ordem correta de
magnitude em cerca de um terco do custo para se calcular A1 explicitamente.
A func
ao rcond utiliza o estimador de n
umero condicionador do LAPACK para estimar o
recproco de cond1 (A), produzindo um resultado entre 0 e 1, com o 0 sinalizando singularidade
exata. A func
ao condest estima cond1 (A) e tambem retorna um vetor nulo aproximado, o
qual e requerido em algumas aplicacoes.

2.6

Equac
oes Lineares

A ferramenta fundamental para resolver um sistema linear de equacoes e o operador \. Ele


resolve tres tipos de sistemas lineares da forma Ax = b, onde a matriz A e o vetor b sao dados.
Os tres formatos possveis para A levam a sistemas quadrados, retangulares sobredeterminados
ou retangulares subdeterminados, como descrito abaixo. De forma mais geral, o operador \
pode ser utilizado para resolver AX = B, onde B e uma matriz com p colunas; neste caso,
MATLAB resolve os sistemas AX(:, j) = B(:, j) para j = 1 : p.

2.6.1

Sistema Quadrado

Se A e uma matriz n-por-n nao-singular, entao A\b e a solucao x para Ax = b, calculada por
fatorizac
ao LU com pivoteamento parcial. Durante o processo de solucao, MATLAB calcula
rcond(A) e mostra uma mensagem de advertencia se o resultado e menor do que eps. Exemplo:
>> x = hilb(15)\ones(15,1);
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 9.178404e-019.
Estas mensagens de advertencias podem ser desativadas utilizando o comando warning off.
MATLAB reconhece duas formas especiais de sistemas quadrados, e tira proveito delas
para reduzir o esforco computacional:
c 2005 G. L. TORRES


CAP
ITULO 2. ALGEBRA
LINEAR E MATRIZES

32

Matriz triangular, ou permutacao de uma matriz triangular. O sistema e resolvido por


substituic
ao.
Matriz Hermitiana positiva definida. Neste caso, fatorizacao Cholesky e utilizada em vez
da fatorizac
ao LU . Como o MATLAB sabe que a matriz e positiva definida? Quando o
operador \ e invocado com uma matriz Hermitiana que tem elementos diagonais positivos
o MATLAB tenta fatorizar a matriz por Cholesky. Se a fatoracao Cholesky e finalizada,
ent
ao ela e utilizada para resolver o sistema; caso contrario, uma fatorizacao LU toma o
lugar.

2.6.2

Sistema Sobredeterminado

Se A tem dimensao m-por-n com m > n, entao Ax = b e um sistema sobredeterminado, ou


seja, ha mais equac
oes do que variaveis. Em geral, nao ha um x que satisfaca o sistema.
A operac
ao MATLAB A\b fornece uma solucao de mnimos quadrados para o sistema, ou
seja, uma soluc
ao que minimiza norm(A*x-b) (a norma Euclideana do resduo) sobre todos os
vetores x. Se A possui rank completo n, entao ha uma u
nica solucao de mnimos quadrados.
Se A possui rank k < n, ent
ao A\b e uma solucao basica, ou seja, uma solucao com
no maximo k elementos nao-nulos (k e determinado, e x calculado, utilizando a fatorizac
ao
QR com pivoteamento de coluna). No u
ltimo caso, MATLAB apresenta uma mensagem de
advertencia.
Uma soluc
ao de mnimos quadrados para Ax = b pode tambem ser calculada como
>> x_min = pinv(A)*b
onde a func
ao pinv calcula a falsa-inversa. No caso em que A e rank-deficiente x_min e a u
nica
solucao de norma-2 mnima.
Um vetor que minimiza a norma-2 de Ax b sobre todos os vetores nao-negativos x, para
A e b reais, e calculado por lsqnonneg. O uso mais simples e
>> x = lsqnonneg(A,b)
Varios outros argumentos de entrada e de sada podem ser especificados, incluindo um vetor
de partida para o algoritmo iterativo utilizado.

2.6.3

Sistema Subdeterminado

Se A tem dimensao m-por-n com m n, entao Ax = b e um sistema subdeterminado, ou


seja, possui menos equac
oes do que variaveis. Ou o sistema tem nenhuma solucao ou tem
infinitamente varias. No u
ltimo caso, a operacao A\b fornece uma solucao basica, que e uma
solucao com no maximo k elementos nao-nulos, onde k e o rank de A. Esta solucao geralmente
nao e a soluc
ao de mnima norma-2, a qual pode ser calculada como pinv(A)*b.
Se o sistema nao tem soluc
ao (ou seja, e inconsistente), entao A\b e uma solucao de mnimos
quadrados. A diferenca entre as solucoes \ e pinv e ilustrata no exemplo abaixo:
>> A = [1 1 1; 1 1 -1], b = [3; 1]
A =
1
1
1
1
1
-1
b =
3
c 2005 G. L. TORRES

2.7. INVERSA, FALSA-INVERSA E DETERMINANTE

33

1
>> x = A\b ;
>> y = pinv(A)*b ;
>> [x y]
ans =
2.0000
1.0000
0
1.0000
1.0000
1.0000
>> [norm(x) norm(y)]
ans =
2.2361
1.7321

2.7

Inversa, Falsa-Inversa e Determinante

A inversa de uma matriz A n-por-n e uma matriz X satisfazendo AX = XA = I, onde I e a


matriz identidade. Uma matriz sem uma inversa e dita singular. Uma matriz singular pode ser
caracterizada de varias maneiras: em particular, seu determinante e zero e ela tem um vetor
nao-nulo no espaco nulo, ou seja, ha um vetor v 6= 0 tal que Av = 0.
A matriz inversa e calculada pela funcao inv. Exemplo:
>> A = pascal(3), X = inv(A)
A =
1
1
1
1
2
3
1
3
6
X =
3
-3
1
-3
5
-2
1
-2
1
>> norm(A*X-eye(3))
ans =
0
A inversa e formada utilizando fatorizacao LU com pivoteamento parcial e o rcond e automaticamente calculado. Uma mensagem de advertencia e apresentada se singularidade exata
e detectada ou se rcond e muito pequeno.
Raramente e necessario calcular a inversa de uma matriz. Por exemplo, resolver um sistema
linear quadrado Ax = b por A\b e 2 a 3 vezes mais rapido do que por inv(A)*b, e muitas vezes
produz um resduo menor. Geralmente e possvel reformular os calculos envolvendo uma matriz
inversa em termos da soluc
ao de uma sistema linear, de forma que a inversao explcita da matriz
e evitada.
O determinante de uma matriz quadrada e calculado pela funcao det. Ele e calculado a
partir dos fatores LU . Embora o c
alculo seja afetado por erros de arredondamento em geral,
det(A) retorna um inteiro quando A tem elementos inteiros:
>> A = vander(1:5)
c 2005 G. L. TORRES


CAP
ITULO 2. ALGEBRA
LINEAR E MATRIZES

34

A =
1
16
81
256
625

1
8
27
64
125

1
4
9
16
25

1
2
3
4
5

1
1
1
1
1

>> det(A)
ans =
288
Nao e recomendado testar a proximidade da matriz para a singularidade utilizando det. Em
vez de det deve-se utilizar cond, rcond ou condest.
A falsa-inversa generaliza a nocao de inversa para matrizes A retangulares e rank deficientes, e e escrita como A+ . Ela e calculada com pinv(A). A falsa-inversa A+ de A pode
ser caracterizada como a u
nica matriz X = A+ que satisfaz as quatro condicoes AXA = A,

XAX = X, (XA) = XA e (AX) = AX.

2.8

Fatorizac
ao LU

Uma fatorizac
ao LU de uma matriz quadrada A e uma fatorizacao A = LU onde L e uma
matriz triangular inferior unitaria (ou seja, triangular inferior com 1s sobre a diagonal) e U e
uma matriz triangular superior. Nem toda matriz pode ser fatorada nesta forma, mas quando
permutac
oes de linhas sao consideradas, a fatorizacao sempre existe. A funcao lu calcula uma
fatorizac
ao LU com pivoteamento parcial P A = LU , onde P e uma matriz de permutacao. A
operacao
>> [L,U,P] = lu(A)
retorna os fatores triangulares e a matriz de permutacao. A mesma funcao com apenas dois
argumentos de sada,
>> [L,U] = lu(A)
retorna L= P T L, e assim L e a matriz triangular inferior L com suas linhas permutadas.
Exemplo:
>> format short g
>> A = [0 1 2; 1 0 1; 2 1 0]
A =
0
1
2
1
0
1
2
1
0
>> [L,U] = lu(A)
L =
0
1
0
0.5 -0.5
1
1
0
0
U =
c 2005 G. L. TORRES

CHOLESKY
2.9. FATORIZAC
AO

2
0
0

1
1
0

35

0
2
2

Embora a fatorizac
ao A = LU seja matematicamente definida para matrizes retangulares, a
funcao lu aceita apenas matrizes quadradas como entrada.
Utilizando x = A\b para resolver um sistema linear Ax=b com uma matriz A quadrada e
equivalente a fatorar A = LU e ent
ao resolver o sistema com os fatores:
>> [L,U] = lu(A);
>> x = U\(L\b);
MATLAB tira proveito do fato que L e uma matriz triangular inferior permutada quando
forma o sistema L\b. Uma vantagem desta abordagem de dois passos e que, se outros sistemas
lineares envolvendo a mesma matriz A estao para serem resolvidos entao os fatores LU podem
ser reutilizados, com uma economia significativa nos calculos.

2.9

Fatorizac
ao Cholesky

Qualquer matriz positiva definida tem uma fatorizacao Cholesky A = G G, onde G e uma
matriz triangular superior real com elementos diagonais positivos. O fator de Cholesky e
calculado por G = chol(A). Exemplo:
>> A = pascal(4)
A =
1
1
1
1
2
3
1
3
6
1
4
10
>> G = chol(A)
G =
1
1
0
1
0
0
0
0

1
2
1
0

1
4
10
20

1
3
3
1

Observe que chol trabalha apenas com os elementos no triangulo superior de A (incluindo a
diagonal). Um erro e produzido se A nao e positiva definida.
A func
ao chol pode ser utilizada para testar se uma matriz e positiva definida (na verdade
esse teste e t
ao bom quanto outro qualquer) utilizando a instrucao
>> [G,p] = chol(A)
onde o inteiro p sera zero se a fatorizacao ocorrer com sucesso, e sera positivo caso contrario.
A func
ao cholupdate modifica a fatorizacao Cholesky quando a matriz original e sujeita a
uma perturbac
ao de rank-1 (seja uma atualizacao +xx ou xx ).
c 2005 G. L. TORRES


CAP
ITULO 2. ALGEBRA
LINEAR E MATRIZES

36

2.10

Fatorizac
ao QR

Uma fatorizac
ao QR de uma matriz A m-por-n e uma fatorizacao A = QR, onde Q e uma matriz unitaria m-por-m e R e uma matriz triangular superior m-por-n. Esta fatorizacao e muito
u
til na soluc
ao de problemas de mnimos quadrados e para construir uma base orthonormal
para as colunas de A. O comando
>> [Q,R] = qr(A)
calcula a fatorizac
ao, enquanto quando m > n o comando
>> [Q,R] = qr(A,0)
fornece uma versao tamanho economico na qual Q tem apenas n colunas e R e n-por-n.
Exemplo:
>> format short e
>> A = [1 0 1; 1 -1 1; 2 0 0]
A =
1
0
1
1
-1
1
2
0
0
>> [Q,R] = qr(A)
Q =
-4.0825e-001 1.8257e-001
-4.0825e-001 -9.1287e-001
-8.1650e-001 3.6515e-001
R =
-2.4495e+000 4.0825e-001
0 9.1287e-001
0
0

-8.9443e-001
-6.1745e-017
4.4721e-001
-8.1650e-001
-7.3030e-001
-8.9443e-001

Uma fatorizac
ao QR com pivoteamento de coluna tem a forma AP = QR, onde P e uma
matriz de permutac
ao. A estrategia de permutacao que e utilizada produz um fator R cujos
elementos diagonais sao nao-crescentes: |r11 |r22 | |rnn |. Pivoteamento de colunas e
particularmente apropriado quando A e suspeita de ser rank-deficiente. Um terceiro argumento
forca a func
ao qr utilizar pivoteamento de coluna e retornar a matriz permutacao:
>> [Q,R,P] = qr(A)
As func
oes qrdelete, qrinsert e qrupdate modificam a fatorizacao QR quando uma
coluna da matriz original e deletada ou inserida, bem como quando uma perturbacao de rank
1 e adicionada.

2.11

Decomposic
ao em Valores Singulares

A decomposic
ao em valores singulares (SVD) de uma matriz A m-por-n e da forma
A = U V ,
c 2005 G. L. TORRES

2.12. AUTOVALORES E AUTOVETORES

37

onde U e uma matriz unitaria m-por-m, V e uma matriz unitaria n-por-n e e uma matriz
m-por-n diagonal real com ii = i . Os valores singulares i satisfazem a relacao 1 2
min(m,n) 0. SVD e uma ferramenta extremamente u
til. Por exemplo, o rank de A
e o n
umero de valores singulares nao-nulos, e o menor valor singular e a distancia segundo a
norma-2 para a matriz rank-deficiente mais proxima. A SVD completa de A e calculada por
>> [U,S,V] = svd(A)
Se apenas um argumento de sada e especificado, entao um vetor de valores singulares e retornado. Quando m > n o comando
>> [U,S,V] = svd(A,0)
produz uma SVD de tamanho economico na qual U e uma matriz m-por-n com colunas
ortonormais e S e n-por-n. Exemplo:
>> A = reshape(1:9,3,3) ;
>> format short e
>> svd(A)
ans =
1.6848e+01
1.0684e+00

1.0275e-16

Aqui a matriz e singular. O menor valor singular calculado e da ordem do erro de arredondamento em vez de zero, devido a erros de arredondamentos.
As func
oes rank, null e orth calculam, respectivamente, o rank, uma base ortonormal para
o espaco nulo e uma base ortonormal para o espalhamento da matriz argumento. Exemplo:
>> rank(A)
ans =
2
>> null(A)
ans =
4.0825e-01
-8.1650e-01
4.0825e-01
>> orth(A)
ans =
4.7967e-01
5.7237e-01
6.6506e-01

2.12

7.7669e-01
7.5686e-02
-6.2532e-01

Autovalores e Autovetores

Os problemas algebricos de autovalores e autovetores sao simples de definir mas de soluc


oes
numericas difceis. A func
ao eig simplifica o processo de solucao reconhecendo e tirando
proveito do n
umero de matrizes de entrada, bem como suas estruturas e as sadas solicitadas.
Ela automaticamente escolhe entre 16 algoritmos diferentes ou variacoes algoritmicas, correspondentes a
c 2005 G. L. TORRES


CAP
ITULO 2. ALGEBRA
LINEAR E MATRIZES

38

problema padrao (eig(A)) ou generalizado (eig(A,B));


matrizes A e B reais ou complexas;
A e B simetrica/Hermitiana com B positiva definida, ou nao;
autovetores solicitados ou nao.
O escalar e o vetor x 6= 0 sao um autovalor e autovetor correspondente da matriz A
n-por-n se Ax = x. Os autovalores sao as n razes do polinomio caracterstico de grau n
det(I A). Os n + 1 coeficientes do polinomio
det(I A) = p1 n + p2 n1 + + pn + pn+1
sao calculados por
>> p = poly(A)
enquanto os autovalores de A sao calculados por
>> e = eig(A)
De forma geral, o comando
>> [V,D] = eig(A)
calcula uma matriz D n-por-n diagonal e uma matriz V n-por-n tais que A*V = V*D. Assim, a
matriz D contem os autovalores sobre a diagonal, enquanto as colunas de V contem os autovetores correspondentes.
Nem toda matriz possui n autovetores linearmente independentes, de forma que a matriz V
que eig retorna pode ser singular (ou, devido a erros de truncamento, nao-singular mas muito
mal-condicionada). Exemplo:
>> A = [2 -1; 1 0];
>> [V,D] = eig(A)
V =
0.7071
0.7071
0.7071
0.7071
D =
1
0
0
1
O escalamento de autovetores e arbitrario (se x e um autovetor entao qualquer m
ultiplo naonulo de x tambem e um autovetor).
Uma matriz Hermitiana possui autovalores reais e seus autovetores podem ser obtidos como
mutuamente ortogonais. Exemplo:
>> A = [2 -1; -1 1]) ;
>> [V,D] = eig(A)
V =
-0.8507
-0.5257
0.5257
-0.8507
D =
c 2005 G. L. TORRES

2.13. METODOS
ITERATIVOS PARA EQUAC
OES
LINEARES

2.6180
0

39

0
0.3820

>> norm(V*V-eye(2))
ans =
2.2204e-016

2.13

M
etodos Iterativos para Equac
oes Lineares

Varias func
oes implementam metodos iterativos para resolver sistemas lineares quadrados
Ax = b:
Func
ao
bicg
bicgstab
cgs
gmres
minres
lsqr
pcg
qmr
symmlq

Tipo Matriz
Geral
Geral
Geral
Geral
Hermitiana
Geral
Hermitiana p.d.
Geral
Hermitiana

Metodo
Metodo
Metodo
Metodo
Metodo
Metodo
Metodo
Metodo
Metodo
Metodo

do Gradiente BiConjugado
do Gradiente BiConjugado Estabilizado
do Gradiente Conjugado Quadrado
dos Mnimos Resduos Generalizado
dos Mnimos Resduos
do Gradiente sobre a Equacao Normal
do Gradiente com Precondicionamento
do Resduo Quasi-Mnimo
do LQ simetrico

Todos os metodos empregam o produto matrix-vetor Ax e possivelmente A x, e nao requerem acesso explcito aos elementos de A. As funcoes tem chamadas identicas, com excec
ao
de gmres. O uso mais simples e
>> x = solver(A,b)
onde solver e uma das func
oes da tabela acima. Alternativamente,
>> solver(A,b,tol)
especifica uma tolerancia de convergencia tol, cujo default e 1e-6. Convergencia e declarada
quando uma iterac
ao x satisfaz o teste norm(b-A*x) <= tol*norm(b).
A func
ao gmres tem um argumento extra restart na terceira posicao que especifica em
qual iterac
ao reiniciar o metodo.

2.14

Matrizes Esparsas

Uma matriz e dita esparsa se ela tem uma grande percentagem de elementos nulos. Para lidar
com matrizes grandes, esparsas, e desejavel tirar vantagens da esparsidade armazenando-se
e operando apenas com os elementos nao-nulos. MATLAB possui um tipo de dado sparse
que armazena somente os elementos nao-nulos de uma matriz juntamente com seus ndices
de linhas e de colunas. Nesta secao, utilizamos o termo matriz esparsa para uma matriz
armazenada no tipo de dado sparse, e o termo matriz cheia para uma matriz armazenada
no tipo de dado double (default).
Matrizes esparsas podem ser criadas de diversas maneiras, varias das quais envolvem a
funcao sparse. Dado um vetor s com t elementos, e os vetores de ndices i e j tambem com
t elementos, o comando
c 2005 G. L. TORRES


CAP
ITULO 2. ALGEBRA
LINEAR E MATRIZES

40

>> A = sparse(i,j,s)
define uma matriz esparsa A de dimensao max(i)-por-max(j) com A(i(k),j(k)) = s(k), para
k=1:t e todos os outros elementos nulos. Exemplo:
>> A = sparse([1 2 2 4 4],[3 1 4 2 4],1:5)
A =
(2,1)
2
(4,2)
4
(1,3)
1
(2,4)
3
(4,4)
5
MATLAB exibe uma matriz esparsa listando os elementos nao-nulos precedidos pelos seus
ndices, ordenados por colunas. Uma matriz esparsa pode ser convertida para uma matriz
cheia utilizando-se a func
ao full:
>> B = full(A)
B =
0
0
2
0
0
0
0
4

1
0
0
0

0
3
0
5

De forma inversa, uma matriz cheia B e convertida para o formato de armazenamento esparso
por
>> A = sparse(B)
O n
umero de elementos nao-nulos em uma matriz esparsa (ou cheia) e fornecido por nnz:
>> nnz(A)
ans =
5
A funcao sparse aceita tres argumentos extras. O comando
>> A = sparse(i,j,s,m,n)
constroi uma matriz esparsa m-por-n; os dois u
ltimos argumentos sao necessarios quando a
u
ltima linha ou coluna de A e toda nula. O comando
>> A = sparse(i,j,s,m,n,nzmax)
aloca memoria para nzmax elementos nao-nulos, o que e u
til se elementos nao-nulos extras, nao
presentes em s, forem introduzidos posteriormente, por exemplo quando A e gerada coluna por
coluna.
Uma matriz esparsa de zeros e produzida por sparse(m,n) (ambos argumentos devem ser
especificados), o que e uma abreviacao para sparse([],[],[],m,n,0). O comando spalloc
aloca espaco para uma matriz esparsa. Ou seja, o comando S = spalloc(m,n,nzmax) cria uma
matriz nula m-por-n esparsa, com espaco para eventualmente armazenar ate nzmax elementos
nao-nulos. A func
ao l
ogica issparse(A) retorna 1 se a classe de armazenamento da matriz A
e esparsa e retorna 0 caso contrario.
c 2005 G. L. TORRES

2.14. MATRIZES ESPARSAS

41

A matriz identidade esparsa e produzida por speye(n) ou speye(m,n), enquanto o comando spones(A) produz uma matriz com o mesmo padrao de esparsidade de A e com 1s na
posicao dos elementos nao-nulos. Os argumentos que sparse necessita para reconstruir uma
matriz existente A via A = sparse(i,j,s,m,n) podem ser obtidos por
>> [i,j,s] = find(A);
>> [m,n] = size(A);
A func
ao spdiags e um analogo de diag para matrizes esparsas. O comando
>> A = spdiags(B,d,m,n)
cria uma matriz A m-por-n cujos elementos diagonais indexados por d sao tirados das colunas
de B. Por exemplo,
>> B = [1 2 0; 1 2 3; 0 2 3; 0 2 3], d = [-2 0 1]
B =
1
2
0
1
2
3
0
2
3
0
2
3
d =
-2
0
1
>> A = spdiags(B,d,4,4)
A =
(1,1)
2
(3,1)
1
(1,2)
3
(2,2)
2
(4,2)
1
(2,3)
3
(3,3)
2
(3,4)
3
(4,4)
2
>> full(A)
ans =
2
0
1
0

3
2
0
1

0
3
2
0

0
0
3
2

Matrizes esparsas aleat


orias sao geradas atraves dos comandos sprand e sprandn. O comando A = sprand(S) gera uma matriz com o mesmo padrao de densidade da matriz S e
com elementos nao-nulos uniformemente distribudos sobre o intervalo [0,1]. A sintaxe para
sprandn e a mesma, porem sao gerados n
umeros aleatorios com a distribuicao normal (0,1).
Um comando de valor inestimavel para visualizar matrizes esparsas e spy, o qual plota o
padrao de esparsidade com um ponto representando um elemento nao-nulo.
A func
ao lu para fatorizac
ao LU e a funcao chol para fatorizacao Cholesky comportam-se
de forma similar para matrizes esparsas e matrizes cheias. A funcao lu tem uma opcao que
c 2005 G. L. TORRES


CAP
ITULO 2. ALGEBRA
LINEAR E MATRIZES

42

nao esta presente no caso de matrizes cheias: lu(A,thresh) estabelece uma tolerancia de
pivoteamento thresh, cujo valor deve estar entre 0 e 1. A estrategia de pivoteamento requer
que o elemento pivo tenha magnitude nao inferior a thresh vezes a magnitude do maior
elemento abaixo da diagonal na coluna pivo. O default e 1, correspondendo a pivoteamento
parcial, enquanto um thresh = 0 impede o pivoteamento.
Uma vez que lu e chol nao pivoteiam para esparsidade, e recomendado considerar uma
reordenac
ao da matriz antes de fatora-la. Exemplos:
>> A = gallery(wathen,8,8);
>> subplot(1,2,1), spy(A)
>> subplot(1,2,2), spy(chol(A))
Os graficos spy de A e sua fatorizacao Cholesky sao mostrados na Figura 2.1. Os comandos
abaixo reordenam a matriz utilizando a ordenaca
o simetrica de grau mnimo:
>> m = symmmd(A);
>> subplot(1,2,1), spy(A(m,m))
>> subplot(1,2,2), spy(chol(A(m,m)))
Alem da ordenac
ao simetrica de grau mnimo (symmmd), o MATLAB dispoe de mais seis
algoritmos de ordenac
ao, a saber: colamd (permutacao de grau mnimo aproximado de coluna), symamd (permutac
ao de grau mnimo simetrico aproximado), symrcm (permutacao de
Cuthill-McKee reversa simetrica), colperm (permutacao de colunas), randperm (permutac
ao
randomica) e dmperm (permutac
ao de Dulmage-Mendelsohn).
0

50

50

100

100

150

150

200

200

50

100

150

200

50

100

150

200

Figura 2.1: Matriz de Wathen (esquerda) e sua fatorizacao Cholesky (direita)

c 2005 G. L. TORRES

2.14. MATRIZES ESPARSAS

43

50

100

150

200

50

100

150

200

50

100

150

200

50

100

150

200

Figura 2.2: Matriz de Wathen (superior) e sua fatorizacao Cholesky (inferior) com pivoteamento simetrico de grau mnimo

c 2005 G. L. TORRES

44

CAP
ITULO 2. ALGEBRA
LINEAR E MATRIZES

c 2005 G. L. TORRES

Captulo

Gr
aficos 2-D, 3-D e Imagens

3.1

Gr
aficos 2-D

MATLAB possui capacidades graficas bastante versateis e poderosas. Graficos dos mais diversos tipos podem ser gerados com relativa facilidade e as suas formas e aparencias podem
ser facilmente configuradas. O comando mais comun para plotar graficos 2-D e o comando
plot(x,y). Por exemplo, os comandos
>> x = linspace(0,2*pi,30);
>> y = sin(x);
>> plot(x,y)
produzem o grafico da Figura 3.1, onde os pontos x(i), y(i) sao ligados em sequencia. Podemos substituir plot(x,y) por plot(x,y,string), onde string combina ate tres elementos
que controlam a cor, o marcador e o estilo da linha, conforme a tabela abaixo.
O uso dos smbolos indicados na coluna Marcador plota o smbolo escolhido em cada
ponto x(i),y(i) porem nao conecta os pontos com uma linha. Por exemplo,
>> plot(x,y,r*--)
especifica que um asterisco vermelho deve ser colocado em cada ponto x(i),y(i) e que os
pontos devem ser unidos por uma linha vermelha tracejada, enquanto o comando
>> plot(x,y,y+)
especifica um x amarelo em cada ponto sem que uma linha ligue os pontos. O grafico da
esquerda da Figura 3.2 foi obtido com o comando
45


CAP
ITULO 3. GRAFICOS
2-D, 3-D E IMAGENS

46

0.8

0.6

0.4

0.2

0.2

0.4

0.6

0.8

Figura 3.1: Uso simples do comando plot.

y
m
c
r
g
b
w
k

Cor
Amarela
Magenta
Cyan
Vermelha
Verde
Azul
Branca
Preta

.
o
x
+
*
s
d
^
v
>
<
p
h

Marcador
Ponto
Crculo
Marca-x
Mais
Asterisco
Quadrado
Losango
Triangulo p/ Cima
Triangulo p/ Baixo
Triangulo p/ Direita
Triangulo p/ Esquerda
Estrela 5 Pontas
Estrela 6 Pontas

:
-.
- -

Estilo da Linha
Linha Solida
Linha Pontilhada
Traco-Ponto
Linha Tracejada

>> plot(x,y,kd:)
o qual especifica uma linha preta pontilhada com um marcador tipo losango.
Mais de um conjunto de dados pode ser utilizado no comando plot. Por exemplo, o grafico
da direita da Figura 3.2 foi obtido por
>>
>>
>>
>>

x = linspace(0,2*pi,30);
y = sin(x);
z = cos(x);
plot(x,y,b:,x,z,r--)

O comando plot tambem aceita argumentos matriciais. Se x e um vetor de m elementos e Y


e uma matriz m-por-n, ent
ao plot(x,Y) superpoe os graficos criados por x e cada coluna de Y.
De forma similar, se X e Y sao ambos matrizes m-por-n, entao plot(X,Y) superpoe os graficos
criados pelas colunas correspondentes de X e Y. Se n
umeros complexos sao os argumentos de
c 2005 G. L. TORRES


3.2. PERSONALIZANDO GRAFICOS

47

0.8

0.8

0.6

0.6

0.4

0.4

0.2

0.2

0.2

0.2

0.4

0.4

0.6

0.6

0.8

0.8

Figura 3.2: Graficos de plot(x,y,kd:) e de plot(x,y,b:,x,z,r--)


plot ent
ao as partes imaginarias sao geralmente ignoradas. A u
nica excecao a esta regra surge
quando plot recebe um u
nico argumento. Se Y e complexo, entao plot(Y) e equivalente a
plot(real(Y),imag(Y)). No caso em que Y e real, plot(Y) plota as colunas de Y versus seus
ndices.

3.2

Personalizando Gr
aficos

Os graficos da Figura 3.3 mostram personalizacoes dos grafico da Figura 3.2, aos quais foram
adicionados um grid (linhas horizontais e verticais), um ttulo, e rotulos nos eixos horizontal e
vertical, como segue:
>>
>>
>>
>>

grid
title(Curvas sin(x) e cos(x))
xlabel(Variavel X)
ylabel(Variaveis Y e Z)
Curvas sin(x) e cos(x)

Curvas sin(x) e cos(x)

0.8

0.8

0.6

0.6

0.4

0.4

0.2

0.2

sin(x)

Variavel Y

Variavel Y

cos(x)

0.2

0.2

0.4

0.4

0.6

0.6

0.8

0.8

Variavel X

Variavel X

Figura 3.3: Adicionando ttulo, rotulos e texto ao grafico.


O usuario pode adicionar qualquer outro texto em qualquer local do grafico utilizando o
comando text. A forma geral desse comando e
c 2005 G. L. TORRES


CAP
ITULO 3. GRAFICOS
2-D, 3-D E IMAGENS

48

text(x,y,string)
onde x e y aqui representam as coordenadas da string nas unidades dos eixos do grafico.
Exemplo:
>> text(1.5,0.3,cos(x)), text(2.5,0.7,sin(x))
O resultado e exibido no grafico da direita da Figura 3.3.
Podemos exercer outros controles sobre o grafico inserindo argumentos adicionais no comando plot. As propriedades LineWidth (default 0.5pt) e MarkerSize (default 6pt) podem
ser especificadas em pontos, onde um ponto mede 1/72 . Por exemplo, os comandos
>> plot(x,y,LineWidth,2)
>> plot(x,y,p,MarkerSize,10)
produzem um grafico com uma linha de espessura 2pt e marcador de tamanho 10pt. Para marcadores que possuem um interior bem definido, as propriedades do marcador MarkerEdgeColor
e MarkerFaceColor podem ser ajustadas para uma das cores indicadas anteriormente. Por
exemplo,
>> plot(x,y,o,MarkerEdgeColor,m)
ajusta a borda do marcador tipo crculo para a cor magenta. O comando
>> box off
inibe a exibic
ao da caixa que envolve o grafico, como e mostrado na Figura 3.4, deixando
apenas os eixos x e y.
Curvas sin(x) e cos(x)
1

0.8
sin(x)
0.6

0.4
cos(x)
Variavel Y

0.2

0.2

0.4

0.6

0.8

Variavel X

Figura 3.4: Grafico sem a caixa de contorno.


Se um comando de plotagem e seguido por outro, entao a nova figura ou ira substituir a
anterior ou ira sobrepor, dependendo do estado corrente do comando hold. Digitando-se
>> hold on
c 2005 G. L. TORRES


3.2. PERSONALIZANDO GRAFICOS

49

faz com que as plotagens subsequentes sejam superpostas sobre a atual, enquanto
>> hold off
especifica que cada nova plotagem inicie uma nova figura. O estatus default e hold off.
O comando clf limpa a janela de figura atual (a janela ativa se houver mais de uma),
possvel ter mais de uma janela de figura na
enquanto o comando close fecha esta janela. E
tela. A forma mais simples de criar uma nova janela de figura e digitar figure. A n-esima
janela de figura (onde n e exibido na barra de ttulo da janela) pode ser ativada digitando-se
figure(n). O comando close all fecha todas as janelas de figuras.

3.2.1

Eixos e Anotac
oes

Varios aspectos dos eixos de um grafico podem ser controlados com o comando axis. Os eixos
da figura sao removidos com o comando
>> axis off
A proporc
ao entre os eixos pode ser feita igual a unidade, de forma que, por exemplo, um
crculo nao pareca uma elipse, digitando-se
>> axis equal
A caixa de eixos pode ser feita quadrada com o comando
>> axis square
Exemplos:
>> plot(fft(eye(17))), axis equal, axis square
>> plot(fft(eye(17))), axis equal, axis off

0.8

0.6

0.4

0.2

0.2

0.4

0.6

0.8

1
1

0.8

0.6

0.4

0.2

0.2

0.4

0.6

0.8

Figura 3.5: Grafico sem caixa de contorno e sem eixos coordenados.


O comando
c 2005 G. L. TORRES


CAP
ITULO 3. GRAFICOS
2-D, 3-D E IMAGENS

50

axis([xmin xmax ymin ymax])


causa o eixo x varrer os valores de xmin a xmax e o eixo y varrer os valores de ymin a ymax.
Para retornar para os valores default da escala dos eixos, os quais MATLAB escolhe automaticamente com base nos dados que estao sendo plotados, digite
>> axis auto
Para que um dos limites seja automaticamente escolhido pelo MATLAB, defina o valor desse
limite como -inf ou inf; por exemplo, axis([-1 1 -inf 0]). Os limites dos eixos x e y
podem ser ajustados individualmente com
xlim([xmin xmax])
ylim([ymin ymax])
O exemplo seguinte plota o epicycloid:
x(t) = (a + b) cos(t) b cos((a/b + 1)t)
y(t) = (a + b) sin(t) b sin((a/b + 1)t)

para a = 12 e b = 5.
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>

a = 12; b = 5;
t = 0:0.05:10*pi;
x = (a+b)*cos(t) - b*cos((a/b+1)*t);
y = (a+b)*sin(t) - b*sin((a/b+1)*t);
plot(x,y)
axis equal
axis([-25 25 -25 25])
grid on
title(Epicycloid: a=12, b=5)
xlabel(x(t)), ylabel(y(t))

O comando legend adiciona uma caixa que explica o estilo das linhas; ver Figura 3.7.
Digitando-se legend(string1,string2,...,stringn) cria-se uma caixa de legenda
que poe stringi proximo a informacao de cor/marcador/estilo de linha para o grafico correspondente. Por default, a caixa de legenda aparece no canto direito superior da area do eixo.
A localizac
ao da caixa de legenda pode ser especificada adicionando-se um argumento extra
como segue:
-1
0
1
2
3
4

a direita do grafico
automaticamente escolhe a melhor localizacao
canto direito superior (default)
canto esquerdo superior
canto esquerdo inferior
canto direito inferior

As propriedades FontSize e FontAngle ajustam o tamanho do ponto e o angulo do texto


produzido pelos comandos xlabel, ylabel, title e text (o valor default de FontSize e 10 e
o FontAngle default e normal). Entretanto, o comando legend nao aceita estes argumentos.
A func
ao fill trabalha de forma similar a plot. Digitando-se
c 2005 G. L. TORRES


3.2. PERSONALIZANDO GRAFICOS

51

Epicycloid: a=12, b=5


25

20

15

10

y(t)

10

15

20

25
25

20

15

10

0
x(t)

10

15

20

25

Figura 3.6:
Polinomios de Legendre
1

0.8

0.6

0.4

Pn

0.2

0.2

0.4

0.6

n=1
n=2
n=3
n=4

0.8

1
1

0.8

0.6

0.4

0.2

0
x

0.2

0.4

0.6

0.8

Figura 3.7: Adicao de legendas com o comando legend.


>> fill(x,y,[r g b])
sombreia um polgono cujos vertices sao especificados pelos pontos x(i),y(i). Os pontos
sao tomados na ordem, e o u
ltimo vertice e ligado ao primeiro. A cor do sombreamento e
determinada pelo terceiro argumento [r g b]. Os elementos r, g e b, os quais devem ser
escalares na faixa [0, 1], determinam o nvel de vermelho, verde e azul, respectivamente, no
c 2005 G. L. TORRES


CAP
ITULO 3. GRAFICOS
2-D, 3-D E IMAGENS

52

sombreamento. Assim, fill(x,y,[0 1 0]) utiliza o verde puro e fill(x,y,[1 0 1]) utiliza
magenta. Especificando-se valores iguais de vermelho, verde e azul fornece uma escala de cinza
que pode variar entre preto ([0 0 0]) e branco ([1 1 1]).

3.2.2

Caracteres Especiais

MATLAB tem a capacidade de modificar o texto para ter diferentes estilos, ao dar suporte
para um subconjunto dos caracteres TEX. TEX e uma notacao padrao para conjuntos especiais
de caracteres. Eles podem ser reconhecidos pela barra invertida \ que precede o nome do
caracter. Por exemplo, a letra grega e especificada por \alpha em TEX. A tabela abaixo
lista todos os caracteres TEX disponveis em MATLAB.
Caracter TEX
\alpha
\beta
\gamma
\delta
\epsilon
\zeta
\eta
\theta
\vartheta
\iota
\kappa
\lambda
\mu
\nu
\xi
\pi
\rho
\sigma
\varsigma
\tau
\equiv
\Im
\otimes
\cap
\supset
\int
\rfloor
\lfloor
\perp
\wedge
\rceil
\vee
\langle

Resultado

Caracter TEX
\upsilon
\phi
\chi
\psi
\omega
\Gamma
\Delta
\Theta
\Lambda
\Xi
\Pi
\Sigma
\Upsilon
\Phi
\Psi
\Omega
\forall
\exists
\ni
\cong
\approx
\Re
\oplus
\cup
\subseteq
\in
\lceil
\cdot
\neg
\times
\surd
\varpi
\rangle

Resultado

c 2005 G. L. TORRES

Caracter TEX
\sim
\leq
\infty
\clubsuit
\diamondsuit
\heartsuit
\spadesuit
\leftrightarrow
\leftarrow
\uparrow
\rightarrow
\downarrow
\circ
\pm
\geq
\propto
\partial
\bullet
\div
\neq
\aleph
\wp
\oslash
\supseteq
\subset
\o
\nabla
\dots
\prime
\O
\mid
\copyright

Resultado

6=

...

|
c

3.3. MULTIPLOS
GRAFICOS
NUMA FIGURA

53

Alem de reconhecer os caracteres especiais ja listados, o interpretador TEX do MATLAB


tambem reconhece os seguintes modificadores das fontes usadas:
Modificador TEX
\bf
\it
\sl
\rm
^
_
\fontname{nomedafonte}
\fontsize{tamanhodafonte}

Resultado
Fonte em negrito
Fonte em italico
Fonte inclinada
Fonte normal
Torna parte do texto superscript
Torna parte do texto subscript
Especifica a fonte a ser utilizada
Especifica o tamanho da fonte.

Os quatro primeiros modificadores sao mutuamente exclusivos, de forma que voce nao pode
utiliza-los juntos. Entretanto, voce pode utilizar \fontname em combinacao com um dos outros
modificadores. O seguinte c
odigo ilustra o uso do interpretador TEX:
>>
>>
>>
>>
>>

x = 0:0.1:2*pi ;
plot(x,sin(x)) ;
xlabel(\theta = 0 a 2\pi,FontSize,16) ;
ylabel(sin(\theta),Fontsize,16) ;
title(\it{Valor do seno de 0 a 2\pi},FontSize,16) ;
Valor do seno de 0 a 2
1

0.8

0.6

0.4

sin()

0.2

0.2

0.4

0.6

0.8

= 0 a 2

Figura 3.8: Uso de caracteres especiais TEX.

3.3

M
ultiplos Gr
aficos Numa Figura

Uma figura pode apresentar mais de um conjunto de eixos. O comando subplot(m,n,p)


subdivide a janela de uma figura numa matriz m-por-n de areas de plotagem, e escolhe a pesima area como sendo a ativa. Os subgraficos sao numerados da esquerda para a direita
comecando pela primeira linha. Por exemplo, a Figura 3.9 foi gerada atraves dos comandos:
c 2005 G. L. TORRES


CAP
ITULO 3. GRAFICOS
2-D, 3-D E IMAGENS

54

>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>

x = 0:0.1:2*pi ;
a = 2 * sin(x) .* cos(x);
b = sin(x) ./ (cos(x)+eps);
subplot(2,2,1)
plot(x,sin(x)), axis tight, title(sin(x))
subplot(2,2,2)
plot(x,cos(x)), axis tight, title(cos(x))
subplot(2,2,3)
plot(x,a), axis tight, title(2sin(x)cos(x))
subplot(2,2,4)
plot(x,b), axis([0 2*pi -20 20]), title(sin(x)/cos(x))
sin(x)

cos(x)

0.5

0.5

0.5

0.5

2sin(x)cos(x)
20

0.5

10

0.5

10

sin(x)/cos(x)

20

Figura 3.9: M
ultiplos graficos na mesma figura.
Uma manipulac
ao u
til e nao documentada (e apresentada em [3]) do subplot pode ser
usada para colocar um n
umero diferente de subgraficos numa linha. Por exemplo, em vez
de termos 4 subgraficos numa matriz 2-por-2, podemos ter 2 subgraficos na primeira linha e
apenas um subgrafico na segunda linha, que abrange todas as colunas da linha. O seguinte
codigo ilustra essa situac
ao:
>> x = -2*pi:0.1:2*pi ;
>> subplot(2,2,1)
>> plot(x,sin(x)), axis tight, title(sin(x))
c 2005 G. L. TORRES

3.3. MULTIPLOS
GRAFICOS
NUMA FIGURA

>>
>>
>>
>>

55

subplot(2,2,2)
plot(x,cos(x)), axis tight, title(cos(x))
subplot(2,1,2)
plot(x,sin(x).^2./x.^2), axis tight, title(sin(x)^2/x^2)
sin(x)

cos(x)

0.5

0.5

0.5

0.5

sin(x)2/x2

0.8
0.6
0.4
0.2

Figura 3.10: Quantidade de subgraficos diferente por linhas.


Para incluir o subgrafico maior na primeira linha, basta manipular o subplot da forma:
>>
>>
>>
>>
>>
>>

subplot(2,2,3)
plot(x,sin(x)), axis([-2*pi 2*pi -1 1]), title(sin(x))
subplot(2,2,4)
plot(x,cos(x)), axis([-2*pi 2*pi -1 1]), title(cos(x))
subplot(2,1,1)
plot(x,sin(x).^2./x.^2), axis tight, title(sin(x)^2/x^2)

Para incluir o subgrafico maior na primeira coluna, basta manipular o subplot da forma:
>>
>>
>>
>>
>>
>>

subplot(2,2,2)
plot(x,sin(x)), axis([-2*pi 2*pi -1 1]), title(sin(x))
subplot(2,2,4)
plot(x,cos(x)), axis([-2*pi 2*pi -1 1]), title(cos(x))
subplot(1,2,1)
plot(x,sin(x).^2./x.^2), axis tight, title(sin(x)^2/x^2)
c 2005 G. L. TORRES


CAP
ITULO 3. GRAFICOS
2-D, 3-D E IMAGENS

56

O resultado e mostrado na Figura 3.11. Outros comandos de plotagem sao:


sin(x)2/x2

sin(x)
1

0.9

0.5

0.8

0.7

0.5

0.6

0.5
cos(x)
1

0.4

0.3

0.5

0.2

0.1

0.5

Figura 3.11: Quantidade de subgraficos diferente por colunas.


loglog

Tem a mesma func


ao do comando plot, exceto que escalas logaritmicas sao utilizadas nos eixos x e y.

semilogx

Tem a mesma func


ao do comando plot, exceto que o eixo x utiliza uma escala
logaritmica, e o eixo y utiliza uma escala linear.

semilogy

Tem a mesma func


ao do comando plot, exceto que o eixo y utiliza uma escala
logaritmica, e o eixo x utiliza uma escala linear.

polar

Plota dados em coordenadas polares. A forma do comando e polar(t,r,S), onde


t e o vetor de
angulos em radianos, r e o vetor de raios, e S e uma string de
caracteres com parametros opcionais. Exemplo:
>> t = 0:.01:2*pi;
>> r = sin(2*t).*cos(2*t);
>> polar(t,r)

stem

Uma sequencia de dados discretos pode ser plotada utilizando o comando stem.
stem(y) gera um grafico dos pontos de dados em y conectados ao eixo horizontal
por uma linha. O grafico da esquerda da Figura 3.13 exibe o resultado de:
c 2005 G. L. TORRES

3.3. MULTIPLOS
GRAFICOS
NUMA FIGURA

57

90
0.5
120

60
0.375

150

30

0.25

0.125

180

330

210

240

300
270

Figura 3.12:
>> y = randn(50,1);
>> stem(y,:)
compass

Dados complexos podem ser plotados com as funcoes compass e feather.

fplot

O comando fplot e uma maneira de automaticamente plotar uma funcao de uma


variavel entre limites especificados sem criar um conjunto de dados para a variavel.
fplot(fun,[xmin xmax]) plota a funcao fun para os pontos xmin x xmax
com escolha automatica da escala do eixo y. A opcao fplot(fun,[xmin xmax
ymin ymax]) tambem especifica os limites do eixo y. O grafico da direita da
Figura 3.13 exibe o resultado de:
>> fplot(sin(x)./x,[-20 20 -.4 1.2])
>> title(fplot de f(x)=sin(x)/x)
possvel suprir outros argumentos para fplot. A forma geral do comando e
E
fplot(fun,lims,tol,N,LineSpec,p1,p2,...), em que
fun e a func
ao a ser plotada.

lims especifica os limites sobre x e y.

tol e uma tolerancia de erro relativo, o valor default de 2 103 corresponde


a 0.2% de precisao.
Pelo menos N+1 pontos serao utilizados para produzir o grafico.
LineSpec determina o tipo da linha.

c 2005 G. L. TORRES


CAP
ITULO 3. GRAFICOS
2-D, 3-D E IMAGENS

58

p1,p2,... sao parametros que sao passados para fun, a qual deve ter argumentos de entrada x,p1,p2,....
Os argumentos tol, N e LineSpec pode ser especificados em qualquer ordem, e
uma matriz vazia ([]) pode ser passada para obter o valor default para qualquer
destes argumentos.
Exemplo do comando stem

fplot de f(x)=sin(x)/x

2.5

1.2

1.5

0.8
1

0.6

0.5

0.4

0.5

0.2
1

0
1.5

0.2

2.5

10

15

20

25

30

35

40

45

50

0.4
20

15

10

10

15

20

Figura 3.13:

3.4

Gr
aficos 3-D

A funcao plot3 e a versao 3-D da funcao plot. Os comandos abaixo produzem o grafico 3-D
que e mostrado na Figura 3.14:
>>
>>
>>
>>
>>
>>
>>
>>

t = -5:0.005:5;
x = (1+t.^2).*sin(20*t);
y = (1+t.^2).*cos(20*t);
z = t;
plot3(x,y,z)
grid on
xlabel(x(t)), ylabel(y(t)), zlabel(z(t))
title(Exemplo plot3,FontSize,14)

Observe que utilizamos o comando zlabel analogo de xlabel e ylabel. Observe tambem que
para graficos 3-D o default e box off; digitando-se box on adiciona uma caixa que circunda
o grafico.
O comando ezcontour e um dispositivo simples para plotar curvas de nveis. A chamada
para ezcontour no exemplo seguinte produz os contornos para a funcao
z = sin(3y x2 + 1) + cos(2y 2 2x)
sobre as faixas de valores 2 x 2 e 1 y 1; o resultado pode ser visto na parte
superior da Figura 3.15.
c 2005 G. L. TORRES


3.4. GRAFICOS
3-D

59

Exemplo com plot3

z(t)

5
30
20

30

10

20
0

10
0

10

10

20
y(t)

20
30

30

x(t)

Figura 3.14: Grafico 3-D com o comando plot3.


>> subplot(2,1,1)
>> ezcontour(sin(3*y-x^2+1)+cos(2*y^2-2*x),[-2 2 -1 1]);
Observe que os nveis dos contornos foram escolhidos automaticamente. Para a parte inferior
da Figura 3.15, utilizamos a func
ao mais geral contour, como segue:
>>
>>
>>
>>
>>

subplot(2,1,2)
x = -2:0.01:2; y = -1:0.01:1;
[X,Y] = meshgrid(x,y);
Z = sin(3*Y-X.^2+1)+cos(2*Y.^2-2*X);
contour(x,y,Z,20)

Primeiro, fazemos x = -2:0.01:2 e y = -1:0.01:1 para obtermos pontos igualmente espacados no intervalo indicado. A seguir, fazemos [X,Y] = meshgrid(x,y), o que produz as
matrizes X e Y tais que cada linha de X e uma copia do vetor x e cada coluna de Y e uma
copia do vetor y; a func
ao meshgrid e extremamente u
til na preparacao de dados para muitas
ferramentas MATLAB de plotagem 3-D. A matriz Z e gerada de operacoes matriciais sobre
X e Y, com o resultado de que Z(i,j) armazena o valor da funcao que corresponde a x(j) e
y(i). Esta e exatamente a forma requerida por contour. Digitando-se
>> contour(x,y,Z,20)
instrui MATLAB para considerar Z como as alturas acima do plano xy com o espaco definido
por x e y. O argumento final especifica que 20 nveis de contorno devem ser utilizados; se
este argumento e omitido ent
ao MATLAB escolhe automaticamente o n
umero de nveis de
contorno.
c 2005 G. L. TORRES


CAP
ITULO 3. GRAFICOS
2-D, 3-D E IMAGENS

60

sin(3 yx2+1)+cos(2 y22 x)


1

0.5

0.5

1
2

1.5

0.5

0
x

0.5

1.5

1.5

0.5

0.5

1.5

0.5

0.5

1
2

Figura 3.15: Curvas de nveis com o comando contour.


O proximo exemplo ilustra o uso do comando clabel para rotular os contornos, com o
resultado sendo mostrado na Figura 3.16:
>>
>>
>>
>>
>>
>>
>>

[X,Y] = meshgrid(linspace(-3,3,100),linspace(-1.5,1.5,100));
Z = 4*X.^2 - 2.1*X.^4 + X.^6/3 + X.*Y - 4*Y.^2 + 4*Y.^4;
cvals = [linspace(-2,5,14) linspace(5,10,3)];
[C,h] = contour(X,Y,Z,cvals);
clabel(C,h,cvals([3 5 7 9 13]))
xlabel(x), ylabel(y)
title(Six hump camel back function,FontSize,16)

A func
ao utilizada neste exemplo tem varios pontos de mnimo, maximo e pontos de sela.
A escolha default MATLAB dos nveis de contorno nao produz uma figura interessante neste
exemplo. Por essa razao especificamos os nveis (escolhidos por tentativa e erro) no vetor cvals.
O comando clabel toma como entrada a sada de contour (C contem os dados do contorno e
h a identificac
ao do objeto grafico) e adiciona rotulos aos nveis de contorno especificados no
seu terceiro argumento. Uma forma alternativa de clabel e
clabel(C,h,manual)
a qual permite que voce especifique com o mouse os contornos a serem rotulados: click para
rotular um contorno e tecle <ENTER> para finalizar. O argumento h de clabel pode ser omitido,
c 2005 G. L. TORRES


3.4. GRAFICOS
3-D

61

sin(3 yx2+1)+cos(2 y22 x)


1

0.5

0.5

1
2

1.5

0.5

0
x

0.5

1.5

Six hump camel back function


1.5

2.3077

1.230

5
538 8
0.11.2
30
0
x

0.1538

15

38

46

07

07

15

2.307
4.47615

4.

2.3

1
1.5
3

2.3

08

0.

1.2308

7
4.4615

0.5

07

2.3

0.5

4.4615
2.3077
1
0.15
385 .23

1.2308

0.15385

4.4615

2.3077
4.4615
1

Figura 3.16:
e neste caso os rotulos sao colocados proximo de cada contorno com um sinal de mais marcando
o contorno.
A func
ao mesh aceita dados numa forma similar a contour e produz superfcies em forma de
tela. Se a func
ao meshc e utilizada no lugar de mesh, entao curvas de contorno sao adicionadas
abaixo da superfcie. O exemplo abaixo, cujo resultado e exibido na Figura 3.17, envolve a
superfcie definida por
z = sin(y 2 + x) cos(y x2 ),
>>
>>
>>
>>
>>
>>
>>

0 x, y .

x = 0:0.1:pi; y = 0:0.1:pi;
[X,Y] = meshgrid(x,y);
Z = sin(Y.^2+X)-cos(Y-X.^2);
subplot(1,2,1)
mesh(Z)
subplot(1,2,2)
meshc(Z)

A func
ao surf difere de mesh pelo fato de que ela produz uma superfcie de preenchimento
solido, e surfc adiciona as curvas de contorno abaixo dela. Um resumo dos comandos para
plotar graficos 3-D e apresentado na tabela abaixo:
c 2005 G. L. TORRES


CAP
ITULO 3. GRAFICOS
2-D, 3-D E IMAGENS

62

1.5

1.5

0.5

0.5

0.5

0.5

1.5

1.5

40

40
30

40
30

20

30

40
30

20

20
10
0

20
10

10

10
0

Figura 3.17: Graficos 3-D com os comandos mesh e meshc.


plot3
contour
contourf
contour3
mesh
meshc
meshz
surf
surfc
bar3
bar3h
pie3
fill3
stem3

3.5

Grafico simples nos eixos x-y-z.


Curvas de contorno.
Curvas de contorno preenchidas.
Curvas de contorno 3-D.
Superfcie em forma de tela.
Superfcie em forma de tela mais contornos.
Superfcie em forma de tela com cortina.
Superfcie solida.
Superfcie solida mais contornos.
Grafico de barras 3-D.
Grafico de barras 3-D horizontal.
Polgono preenchido.
Grafico stem.

Gr
aficos Especializados para Exibic
ao de Dados

MATLAB possui quatro func


oes para plotar graficos de barras, incluindo graficos de barras
horizontais e verticais, 2-D e 3-D, com opcoes para empilhar ou para agrupar as barras. O
uso mais simples das func
oes para plotar graficos de barras envolve uma matriz m-por-n como
argumento de entrada. Para graficos de barras 2-D, os elementos numa linha sao agregados, seja num grupo de n barras com o argumento default grouped, ou numa barra com
proporcionalidade entre as n linhas com o argumento stacked.
c 2005 G. L. TORRES


DE DADOS
3.5. GRAFICOS
ESPECIALIZADOS PARA EXIBIC
AO

63

O codigo abaixo utiliza as funcoes bar e barh para produzir o grafico da Figura 3.18:
>> Y = [7
6
4
2
9

6
8
5
3
7

5
1
9
4
2];

>> subplot(2,2,1)
>> bar(Y)
>> title(bar(...,grouped))
>> subplot(2,2,2)
>> bar(0:5:20,Y)
>> title(bar(...,grouped))
>> subplot(2,2,3)
>> bar(Y,stacked)
>> title(bar(...,stacked))
>> subplot(2,2,4)
>> barh(Y)
>> title(barh)
Observe que na forma de dois argumentos bar(x,Y) o vetor x prover a locacao das barras no
eixo x.
Para graficos de barras 3-D o arranjo default e detached, com as barras para os elementos
em cada coluna distribudas ao longo do eixo-y. Os argumentos grouped e stacked
fornecem vizoes 3-D dos graficos 2-D de barras com os mesmos argumentos. Com a mesma
matriz de dados Y, o grafico da Figura 3.19 e produzido por
>> subplot(2,2,1)
>> bar3(Y)
>> title(bar3(...,detached))
>> subplot(2,2,2)
>> bar3(Y,grouped)
>> title(bar3(...,grouped))
>> subplot(2,2,3)
>> bar3(Y,stacked)
>> title(bar3(...,stacked))
>> subplot(2,2,4)
>> bar3h(Y)
>> title(bar3h)
Observe que com o arranjo default detached algumas barras estao escondidas atras de outras. Uma soluc
ao satisfat
oria para este problema pode algumas vezes ser obtida rotacionandose o grafico utilizando-se o comando view ou o mouse.
c 2005 G. L. TORRES


CAP
ITULO 3. GRAFICOS
2-D, 3-D E IMAGENS

64

bar(...,grouped)

bar(...,grouped)

10

10

bar(...,stacked)

10

15

20

barh

20
5
15
4
10

3
2

5
1
0

10

Figura 3.18: Graficos de barras com os comandos bar e barh.


Histogramas sao obtidos utilizando a funcao hist, a qual conta o n
umero de elementos que
estao dentro de intervalos e se nenhum argumento de sada e especificado, plota um grafico de
barras. O primeiro argumento, y, em hist e o vetor de dados e o segundo e ou um escalar
especificando o n
umero de barras ou um vetor definindo os intervalos; se apenas y e fornecido
entao 10 barras sao utilizadas. Se y e uma matriz entao barras sao criadas para cada coluna e
uma barra agrupada e produzida. Os comandos abaixo produzem o grafico da Figura 3.20.
>>
>>
>>
>>
>>

randn(state,1)
y = exp(randn(1000,1)/3);
subplot(2,2,1)
hist(y)
title(vetor de dados 1000-por-1, 10 barras)

>> subplot(2,2,2)
>> hist(y,25)
>> title(25 barras)
>> subplot(2,2,3)
>> hist(y,min(y):0.1:max(y))
>> title(barra espessura 0.1)
c 2005 G. L. TORRES


DE DADOS
3.5. GRAFICOS
ESPECIALIZADOS PARA EXIBIC
AO

bar3(...,grouped)

65

bar3(...,grouped)
10

10
5
5
0

0
1

1
2

2
3

3
4

4
5

bar3(...,stacked)

bar3h

20
5
10

4
3
2

1
2
3

10

Figura 3.19: Graficos de barras 3-D com os comandos bar3 e bar3h.

>>
>>
>>
>>

Y = exp(randn(1000,3)/3);
subplot(2,2,4)
hist(Y)
title(matriz de dados 1000-por-3)

Graficos tipo bolo podem ser produzidos com as funcoes pie e pie3. Eles tomam um vetor
como argumento, x, e para cada elemento x(i) eles desenham uma fatia do bolo com
area
proporcional a x(i). Um segundo argumento explode pode ser dado, o qual e um vetor 0-1
com um 1 em posic
oes que correspondam a fatias que devem ser deslocadas do grafico. Por
default, as fatias sao rotuladas com o percentual da area total que elas ocupam. Os comandos
abaixo produzem o grafico da Figura 3.21:
>> x = [1.5 3.4 4.2];
>> subplot(2,2,1)
>> pie(x)
>> subplot(2,2,2)
>> pie(x,[0 0 1])

c 2005 G. L. TORRES


CAP
ITULO 3. GRAFICOS
2-D, 3-D E IMAGENS

66

vetor de dados 1000por1, 10 barras

25 barras

300

140

250

120
100

200

80
150
60
100

40

50
0

20
0

barra espessura 0.1


350

120

300

100

250

80

200

60

150

40

100

20

50
0

matriz de dados 1000por3

140

Figura 3.20: Histogramas construdos com o comando hist.


>> subplot(2,2,3)
>> pie(x,{Fatia 1,Fatia 2,Fatia 3})
>> subplot(2,2,4)
>> pie3(x,[0 1 0])
A func
ao area produz um grafico de area empilhada. Com vetores como argumentos, a
funcao area e similar a func
ao plot exceto que a area entre os valores de y e 0 (ou o nvel
especificado pelo segundo argumento opcional) e preenchida; para matrizes de argumentos os
graficos das colunas sao empilhados, mostrando a soma em cada valor de x. Os comandos
abaixo produzem o grafico da Figura 3.22:
>> randn(state,1)
>> x = [1:12 11:-1:8 10:15]; Y = [x x];
>> subplot(2,1,1)
>> area(Y+randn(size(Y)))
>> subplot(2,1,2)
>> Y = Y + 5*randn(size(Y));
>> area(Y,min(min(Y)))
c 2005 G. L. TORRES

3.6. GRAVANDO E IMPRIMINDO FIGURAS

67

16%

16%

46%

46%

37%

37%

Fatia 1
46%
16%
Fatia 3

Fatia 2

37%

Figura 3.21: Graficos tipo bolo construdos com os comandos pie e pie3.
>> axis tight

3.6

Gravando e Imprimindo Figuras

Para imprimir um grafico, o usuario pode utilizar tanto a opcao Print da barra de menu,
quanto comandos do MATLAB. Para isto, basta utilizar o comando print, cuja forma geral
e:
>> print -tipo_dispositivo -opcoes
O comando print simplesmente envia o grafico corrente para a impressora corrente. O grafico
tambem pode ser impresso num arquivo. Por exemplo, os graficos que sao apresentados neste
documento foram criados atraves do comando
>> print -deps arquivo
O parametro -deps indica que o format do arquivo criado e o Encapsulated Postscript. Varios
formatos de arquivo sao disponveis, como pode ser verificado com o comando:
>> help print
O comando saveas grava a figura num arquivo numa forma tal que a figura possa ser carregada
novamente numa sec
ao de trabalho do MATLAB. Exemplo:
c 2005 G. L. TORRES


CAP
ITULO 3. GRAFICOS
2-D, 3-D E IMAGENS

68

30
25
20
15
10
5
0

10

12

14

16

18

20

22

10

12

14

16

18

20

22

30
25
20
15
10
5
0
5

Figura 3.22: Grafico construdo com o comando area.


>> saveas(gcf,myfig,fig)
grava a figura atual num arquivo binario, o qual pode ser recarregado no MATLAB com
open(myfig.fig).

3.7

Manipulac
ao de Gr
aficos

A manipulac
ao de objetos graficos de uma figura pode ser feita de uma maneira simples e direta
atraves das opc
oes Figure Properties, Axes Properties e Current Object Properties
do menu Edit da janela da figura. Essas opcoes abrem um Editor de Propriedades atraves do
qual o usuario efetua as alterac
oes desejadas.
Alternativamente, podemos manipular as propriedades dos objetos graficos a partir da linha
de comando do MATLAB, utilizando as funcoes get e set. Todos os objetos graficos sao armazenados hierarquicamente. Essa hierarquia pode ser inspecionada atraves das propriedades
Parent e Children. Podemos obter o identificador (handle) de um objeto grafico clicando
no objeto e a seguir usando um dos comandos:
gcf

(get current figure) fornece o identificador da figura corrente (a que voce clicou).

gca

(get current axes) fornece o identificador do objeto axes corrente.

gco

(get current object) fornece o identificador do objeto corrente.

Esse identificador (handle) e ent


ao utilizado como argumento da funcao get para inspecionar
propriedades do objeto, e da func
ao set para modificar propriedades. Por exemplo, clicando
na curva da func
ao sin(x) no grafico da Figura 3.23 e emitindo o comando
c 2005 G. L. TORRES

DE GRAFICOS

3.7. MANIPULAC
AO

69

Figura 3.23: Manipulacao de propriedades de objetos graficos.


>> get(gco)
e exibida a lista de todas as propriedades relacionadas ao objeto selecionado e os valores
respectivos, como segue:
Color:
EraseMode:
LineStyle:
LineWidth:
Marker:
MarkerSize:
MarkerEdgeColor:
MarkerFaceColor:
XData:
YData:
ZData:
BeingDeleted:
ButtonDownFcn:
Children:
Clipping:
CreateFcn:
DeleteFcn:
BusyAction:
HandleVisibility:
HitTest:
Interruptible:
Selected:
SelectionHighlight:

[0 0 1]
normal
-
0.5000
none
6
auto
none
[1x131 double]
[1x131 double]
[1x0 double]
off
[]
[0x1 double]
on
[]
[]
queue
on
on
on
off
on
c 2005 G. L. TORRES


CAP
ITULO 3. GRAFICOS
2-D, 3-D E IMAGENS

70

Tag:
Type:
UIContextMenu:
UserData:
Visible:
Parent:
DisplayName:
XDataMode:
XDataSource:
YDataSource:
ZDataSource:

line
[]
[]
on
150.0012

manual

Por exemplo, observe da lista de propriedades acima que a espessura da linha da curva
plotada e 0.5pt (propriedade LineWidth igual a 0.5000). O comando get(gco) (tendo
apenas o identificador como argumento) lista todas as propriedades relacionadas ao objeto
corrente. Para inspecionar apenas um grupo de propriedades, use a forma geral e
get(gco,NomePropriedade1,...
NomePropriedade2,...
.
.
NomePropriedadeN)
Para ajustar o valor de uma ou mais propriedades do objeto corrente, utilize a funcao set da
forma
set(gco,NomePropriedade1,ValorPropriedade1,...
NomePropriedade2,ValorPropriedade2,...
.
.
NomePropriedadeN,ValorPropriedadeN);
O identificador do monitor do computador (o maior nvel hierarquico) e sempre o valor 0.
Assim, se quisermos inspecionar a resolucao corrente do monitor, basta emitir o comando
>> get(0,ScreenSize)
ans =
1

1024

768

c 2005 G. L. TORRES

Captulo

Programa
c
ao em Matlab

MATLAB oferece quatro processos de decisao ou estruturas de controle de fluxo. Sao eles:
o laco for, o laco while, estruturas if-else-end, e o comando switch. Uma vez que estas
estruturas englobam varios comandos do MATLAB, elas geralmente aparecem em arquivos-M,
em vez de serem digitadas diretamente no prompt do MATLAB.

4.1

Operadores L
ogicos e Relacionais

Conforme ja mencionado no Captulo 1, os operadores relacionais do MATLAB sao:


Operador
<
<=
>
>=
==
~=

Descricao
<

>

=
6=

Observe que um u
nico = significa atribuicao e nunca um teste de igualdade no MATLAB.
Comparac
oes entre escalares produzem 1 se a relacao for verdadeira, ou zero se ela for falsa.
Comparac
oes sao definidas tambem entre matrizes de mesma dimensao e entre uma matriz e
um escalar, o resultado sendo uma matriz de 0s e 1s em ambos os casos. A comparacao de
matrizes compara os pares de elementos correspondentes, enquanto que a comparacao de uma
matriz com um escalar compara cada elemento da matriz com o escalar. Exemplos:
>> A = [1 2; 3 4]; B = 2*ones(2);
71

EM MATLAB
CAP
ITULO 4. PROGRAMAC
AO

72

>> A == B
ans =
0
0

1
0

>> A > 2
ans =
0
1

0
1

Os operadores l
ogicos do MATLAB sao:
Operador
&
|
~
xor
all
any

Descric
ao
e l
ogico
ou l
ogico
nao l
ogico
ou exclusivo logico
verdade se todos elementos do vetor sao nao-nulos
verdade se qualquer elemento do vetor e nao-nulo

Similar aos operadores relacionais, os operadores logicos &, | e ~ produzem matrizes de 0s e 1s


quando um dos argumentos e uma matriz. Quando aplicado a um vetor, a funcao all retorna
1 se todos os elementos do vetor sao nao-nulos, e retorna zero caso contrario. A funcao any e
definida da mesma forma, com qualquer no lugar de todos. Exemplos:
>> x = [-1 1 1]; y = [1 2 -3];
>> x>0 & y>0
ans =
0
1

>> x>0 | y>0


ans =
1
1

>> xor(x>0,y>0)
ans =
1
0

>> any(x>0)
ans =
1
>> all(x>0)
ans =
0
O comando find retorna os ndices dos elementos nao-nulos de um vetor. Exemplo:
c 2005 G. L. TORRES


4.1. OPERADORES LOGICOS
E RELACIONAIS

73

>> x = [-3 1 0 -inf 0];


>> f = find(x)
f =
1
2

O resultado de find pode ent


ao ser utilizado para extrair exatamente aqueles elementos do
vetor:
>> x(f)
ans =
-3

-Inf

Com o vetor x definido acima, podemos utilizar find para obter os elementos finitos de x,
>> x(find(isfinite(x)))
ans =
-3
1
0
0
e substituir os componentes negativos de x por zero:
>> x(find(x < 0)) = 0
x =
0
1
0
0
Quando a func
ao find e aplicada sobre uma matriz A, o vetor de ndices obtido corresponde a
matriz tratada como um vetor das colunas empilhadas uma sobre a outra, A(:), e este vetor
pode ser utilizado para reindexar a matriz. No exemplo abaixo utilizamos a funcao find para
zerar os elementos de A que sao menores do que os elementos correspondentes de B:
>> A = [4 2 16; 12 4 3], B = [12 3 1; 10 -1 7]
A =
4
2
16
12
4
3
B =
12
10

3
-1

1
7

>> f = find(A<B)
f =
1
3
6
>> A(f) = 0
A =
0
0
12
4

16
0
c 2005 G. L. TORRES

EM MATLAB
CAP
ITULO 4. PROGRAMAC
AO

74

Um uso alternativo de find para matrizes e [i,j] = find(A), o qual retorna vetores i e j
contento os ndices de linhas e colunas dos elementos nao-nulos.
Os resultados dos operadores e funcoes logicas do MATLAB sao arrays (vetores ou
matrizes) de 0s e 1s que sao exemplos de arrays logicos. Arrays logicos podem ser criados
aplicando-se a func
ao logical a um array numerico. Arrays logicos podem ser utilizados para
indexacoes. Exemplo:
>> y = [1 2 0 -3 0]
y =
1
2
0

-3

>> i1 = logical(y)
i1 =
1
2
0

-3

>> i2 = (y ~= 0)
i2 =
1
1
0

>> i3 = [1 1 0 1 0]
i3 =
1
1
0

>> y(i1)
ans =
1

-3

>> y(i2)
ans =
1

-3

>> isequal(i2,i3)
ans =
1
>> y(i3)
??? Index into matrix is negative or zero.
changes to logical indices.

See release notes on

Observe que mesmo embora i2 tenha os mesmos elementos que i3 (e sao considerados iguais
na comparac
ao), apenas o vetor l
ogico i2 pode ser utilizado como indexador.
O uso de find pode algumas vezes ser evitado quando seu argumento e um array logico.
No exemplo anterior, x(find(isfinite(x))) pode ser substitudo por x(isfinite(x)). No
entanto, e recomendado o uso de find para melhor clareza do codigo.

4.2

Al
em de Vetores e Matrizes

MATLAB dispoe de outras estruturas de dados alem de arrays tipo vetores e matrizes, dentre
elas: celulas (cell), estruturas (struct), classes (class) e objetos, e identificadores de func
oes.
c 2005 G. L. TORRES


4.2. ALEM
DE VETORES E MATRIZES

4.2.1

75

C
elulas

Uma celula e uma unidade multidimensional de dados. Arrays de celulas de diferentes dimensoes, cujos elementos sao c
opias de outros arrays, podem ser criados da seguinte maneira:
utilizando-se o smbolo para construcao de arrays de celulas { };
utilizando-se comandos de atribuicao;
utilizando-se a func
ao cell.
Por exemplo,
>> x = 4;
>> C = { x pascal(x) chol(pascal(x)) }
C =
[4]
[4x4 double]
[4x4 double]
Para acessar o conte
udo de uma celula, use subscritos entre chaves, como segue:
>> C{2}
ans =
1
1
1
1

1
2
3
4

1
3
6
10

1
4
10
20

Para acessar o conte


udo de toda a celula, use o comando celldisp:
>> celldisp(C)
C{1} =
4
C{2} =
1
1
1
1

1
2
3
4

1
3
6
10

1
4
10
20

C{3} =
1
0
0
0

1
1
0
0

1
2
1
0

1
3
3
1

Para acessar subconjuntos do conte


udo de uma celula, concatene expressoes indexadoras. Por
exemplo, para obter a primeira linha da matriz na celula C2, utilize
>> C{2}(1,:)
ans =
1
1

A criacao de arrays de celulas atraves de comandos de atribuicao e como exemplificado abaixo:


c 2005 G. L. TORRES

EM MATLAB
CAP
ITULO 4. PROGRAMAC
AO

76

>> A(1,1) = {[1 2; 3 4]};


>> A(1,2) = {Curso MATLAB e SIMULINK};
>> A(2,1) = {[1+2j; 3+4j]};
>> A(2,2) = {1:5};
>> celldisp(A)
A{1,1} =
1
2
3
4
A{2,1} =
1.0000 + 2.0000i
3.0000 + 4.0000i
A{1,2} =
Curso MATLAB e SIMULINK
A{2,2} =
1

Alternativamente, o mesmo array de celulas acima pode ser criado da forma


>>
>>
>>
>>

A{1,1}
A{1,2}
A{2,1}
A{2,2}

4.2.2

=
=
=
=

[1 2; 3 4];
Curso MATLAB e SIMULINK;
[1+2j; 3+4j];
1:5;

Estruturas

Estruturas tambem sao arrays multidimensionais de diferentes tipos de dados, mas seus elementos (recipientes de dados chamados campos) sao acessados por designadores de campos
textuais (campos nominados) e nao atraves de operacoes de indexacao como nos arrays de
celulas. Por exemplo, para criar a estrutura barra contendo o n
umero da barra, nome da
barra, tipo da barra e tensao da barra de uma rede eletrica, faca
>> barra.numero
>> barra.nome =
>> barra.tipo =
>> barra.tensao
>> barra
barra =
numero:
nome:
tipo:
tensao:

= 10;
barra 10;
Swing;
= 1.05;

10
barra 10
Swing
1.0500

Para inserir os dados da segunda barra, digite


>> barra(2).numero = 20;
>> barra(2).nome = barra 20;
c 2005 G. L. TORRES


4.2. ALEM
DE VETORES E MATRIZES

77

>> barra(2).tipo = PV;


>> barra(2).tensao = 1.0;
>> barra(2)
ans =
numero:
nome:
tipo:
tensao:

20
barra 20
PV
1

Um elemento da estrutura tambem pode ser criado com a funcao struct, como segue:
>> barra(3) = struct(numero,30,nome,barra 30,tipo,PQ,tensao,1.0);
>> barra(3)
ans =
numero:
nome:
tipo:
tensao:

30
barra 30
PQ
1

Para acessar um campo especfico de uma estrutura, incluir um ponto apos o nome da estrutura,
seguido pelo nome do campo. Por exemplo,
>> barra(3).nome
ans =
barra 30
A func
ao fieldnames(barra) retorna o nome de todos os campos da estrutura barra. O
comando rmfield(barra,tipo) remove o campo tipo da estrutura barra. Os comandos
getfield/setfield permitem obter/estabelecer o conte
udo de um campo da estrutura.
No entanto, no contexto de um programa de fluxo de potencia, e prefervel criar os campos
ilustrados acima da forma:
>> barra.numero
>> barra.nome =
>> barra.tipo =
>> barra.tensao
>> barra
barra =
numero:
nome:
tipo:
tensao:

= [10 20 30];
{barra 10; barra 20; barra 30};
{Swing; PV; PQ};
= [1.05 1 1];

[3x1 double]
{3x1 cell}
{3x1 cell}
[1.0500 1 1]

>> barra.numero
ans =
10
20
30
c 2005 G. L. TORRES

EM MATLAB
CAP
ITULO 4. PROGRAMAC
AO

78

4.3

Lacos for

O laco for permite que um grupo de comandos seja executado um n


umero pre-determinado,
fixo, de vezes. A forma geral de um laco for e a seguinte:
for vari
avel = express
ao
comandos
end
Geralmente, express
ao e um vetor da forma i:s:j. Os comandos entre as declaracoes for e
end sao executados com vari
avel igual a cada elemento de express
ao. Por exemplo, a soma dos
25 primeiros termos da serie harmonica 1/i e calculada por
>> s = 0;
>> for i = 1:25
s = s + 1/i ;
end
>> s
s =
3.8160
Uma outra forma de definir express
ao e utilizar a notacao dos colchetes:
>> for x = [pi/6 pi/4 pi/3]
disp([x, sin(x)])
end
0.5236
0.5000
0.7854
0.7071
1.0472
0.8660
Lacos for podem ser aninhados:
>> for n = 1:5
for m = 5:-1:1
A(n,m) = n^2 + m^2 ;
end
end
>> A
A =
2
5
10
17
26
5
8
13
20
29
10
13
18
25
34
17
20
25
32
41
26
29
34
41
50
Lacos for devem ser evitados sempre que MATLAB dispuser de uma forma equivalente de se
resolver o problema.
c 2005 G. L. TORRES

4.4. LAC
OS WHILE

4.4

79

Lacos while

Ao contrario de um laco for que avalia um grupo de comandos um n


umero fixo de vezes, o
laco while avalia um grupo de comandos um n
umero indefinido de vezes. A forma geral de
um laco while e a seguinte:
while express
ao
comandos
end
Os comandos entre as declarac
oes while e end sao executados enquanto todos os elementos
em express
ao forem verdadeiros. Por exemplo,
>> num = 0 ;
>> EPS = 1 ;
>> while (1 + EPS) > 1
EPS = EPS / 2 ;
num = num + 1 ;
end
>> num
num =
53
>> EPS = 2 * EPS
EPS =
2.2204e-16
Este exemplo mostra uma forma de calcular o maior n
umero que adicionado a 1 nao mais
e maior do que 1 (porque o computador utiliza um n
umero fixo de dgitos para representar
n
umeros).
Um laco while pode ser terminado com o comando break, o qual passa o controle para a
primeira declarac
ao apos o end correspondente ao while. Um laco infinito pode ser construdo
utilizando while 1, ..., end, o qual e u
til quando nao e coveniente colocar um teste de sada
no topo do laco.

4.5

Estruturas if-else-end

Frequentemente, sequencias de comandos devem ser condicionalmente executadas com base


num teste relacional. Em linguagens de programacao, esta logica e disponvel atraves de
alguma variac
ao de uma estrutura if-else-end. A estrutura if-else-end mais simples e
if express
ao
comandos
end
Os comandos entre as declarac
oes if e end sao executados se todos os elementos em express
ao
sao verdadeiros (nao-nulos). Exemplo:
>> peras = 10;
c 2005 G. L. TORRES

EM MATLAB
CAP
ITULO 4. PROGRAMAC
AO

80

>> custo = peras * 25


custo =
250
>> if peras > 5
custo = (1 - 20/100) * custo
end
custo =
200
Em casos onde ha duas alternativas a estrutura if-else-end e da forma:
if express
ao
comandos executados se verdade
else
comandos executados se falso
end
O primeiro conjunto de comandos e executado se express
ao for verdade (diferente de zero); o
segundo conjunto de comandos e executado se express
ao for falso. Quando ha tres ou mais
alternativas, a estrutura if-else-end e da forma:
if express
ao-1
comandos executados
elseif express
ao-2
comandos executados
elseif express
ao-3
comandos executados
elseif ...
...
else
comandos executados
end

se express
ao-1 e verdade
se express
ao-2 e verdade
se express
ao-3 e verdade

se nenhuma express
ao e verdade

possvel interromper o progresso dos lacos for e while, mas nao o de uma estrutura
E
if-else-end, atraves do comando break. Exemplo:
>> EPS = 1;
>> for num = 1:1000
EPS = EPS / 2;
if (1+EPS) <= 1
EPS = EPS * 2
break
end
end
EPS =
2.2204e-16

c 2005 G. L. TORRES

4.6. COMANDO SWITCH

81

>> num
num =
53
Observe que o comando break forca o laco for terminar prematuramente; neste exemplo,
ele foi executado apenas 53 vezes, apesar do limite 1000.

4.6

Comando switch

A quarta estrutura de controle e o comando switch. Ele consiste de switch express


ao
seguido por uma lista de case express
ao, opcionalmente terminando com otherwise comandos e seguido por end. A express
ao no switch e avaliada e os comandos logo apos a
primeira express
ao de case sao executados. Se nenhum dos case satisfaz a condicao do switch
entao os comandos que seguem o otherwise sao executados. O exemplo seguinte calcula a
norma-p de um vetor x para apenas tres valores possveis de p:
switch p
case 1
y = sum(abs(x));
case 2
y = sqrt(x*x);
case inf
y = max(abs(x));
otherwise
error(p deve ser 1, 2 ou inf.)
end
A expressao que segue um case pode ser uma lista de valores. Neste caso a expressao switch
pode atender qualquer dos valores desta lista:
>> x = input(Digite um numero real: );
switch x
case {inf,-inf}
disp(Mais ou menos infinito)
case 0
disp(Zero)
otherwise
disp(Finito e nao-nulo)
end

4.7

Estrutura try ... catch

Esta estrutura altera o controle de fluxo se um erro ocorre durante a execucao. A forma geral
da estrutura e como segue:
try
comando1
comando2
.
c 2005 G. L. TORRES

EM MATLAB
CAP
ITULO 4. PROGRAMAC
AO

82

.
comandoN
catch
comando1
comando2
.
.
comandoM
end
Normalmente, apenas os comandos entre try e catch sao executados. Porem, se um erro
ocorre enquanto executa qualquer dos comandos, entao o erro e capturado em lasterr e os
comandos entre catch e end sao executados. Se um erro ocorre entre catch e end, ent
ao a
execucao e terminada, a nao ser que outra sequencia try ... catch tenha sido estabelecida.
A string do erro na falha do bloco try pode ser obtida com a funcao lasterr.

4.8

Arquivos-M

Quando o usuario chama func


oes do MATLAB tais como inv e sqrt, MATLAB toma as
variaveis que o usuario passa, calcula os resultados requeridos utilizando essas variaveis, e
entao retorna os resultados para o usuario. Os comandos executados pela funcao, bem como
qualquer variavel criada por esses comandos, sao invisveis para o usuario. Tudo que ele ver e
o que e passado para a func
ao e o que dela retorna.
Arquivos-M sao arquivos textos (ASCII) com a terminacao .m. Sao arquivos externos
(ou seja, nao sao criados na janela de comando do MATLAB) criados com um editor de texto
tal como o edit do MS-DOS. Ha dois tipos de arquivos-M:
Script

(ou arquivos de comandos) nao tem argumentos de entrada e de sada e operam


sobre variaveis da
area de trabalho.

Function contem uma linha de definicao function e pode aceitar argumentos de entrada e
retornar argumentos de sada, e suas variaveis internas sao locais a funcao (a nao
ser que seja declarada global).
Um script permite-nos armazenar uma sequencia de comandos que serao utilizados repetidamente ou que serao necessarios em algum tempo futuro. Exemplo:
%SWEEP
Generates a volume-swept 3D object.
N = 10;
z = linspace(-5,5,N);
radius = sqrt(1+z.^2);
theta = 2*pi*linspace(0,1,N);
X = radius*cos(theta);
Y = radius*sin(theta);
Z = z(:,ones(1,N));
surf(X,Y,Z)
axis equal
O exemplo abaixo mostra uma function stat que calcula a media aritmetica e o desvio padrao
dos elementos de um vetor x:
c 2005 G. L. TORRES

4.9. COMANDOS I/O

83

function [mean,stdev] = stat(x)


%STAT Funcao para calcular a media aritmetica e o desvio padrao
%
dos elementos de um vetor.
n = length(x);
mean = sum(x) / n;
stdev = sqrt(sum((x - mean).^2)/n);
A primeira linha comeca com a palavra chave function seguida pela lista de argumentos de
sada entre colchetes, [mean,stdev], e o smbolo =. A direita do smbolo = vem o nome da
funcao, stat, seguido pelo argumento de entrada, x, entre parenteses.
MATLAB faz uma distinc
ao clara entre entrada e sada. Argumentos de entrada aparecem
`a direita do nome da func
ao, entre parenteses, e argumentos de sada aparecem `a esquerda,
entre colchetes. Diferentemente de outras linguagens, MATLAB permite n
umero variavel de
argumentos de entrada e de sada. O n
umero de argumentos de entrada e de sada pode ser
qualquer. O nome da func
ao deve ser o mesmo nome do arguivo .m no qual a funcao esta
armazenada.
A segunda linha de uma arquivo de funcao e chamada de linha H1 (help 1). Ela deveria ser
uma linha de coment
ario de forma especial: uma linha comecando com um caracter %, seguido
sem qualquer espaco pelo nome da funcao em letras mai
usculas, seguido por um ou mais espacos
e entao uma breve descric
ao. A descricao deveria comecar com uma letra mai
uscula e terminar
com um ponto, e omitir as palavras the e a. Todas as linhas de comentario da primeira
linha ate a primeira linha nao comentada (geralmente uma linha em branco, para melhor leitura
convencional utilizar
do codigo) sao exibidas quando o comando help funca
o e digitado. E
letras mai
usculas na digitac
ao do nome da funcao e das variaveis nas linhas de comentarios.
O arquivo-M de uma func
ao pode conter codigo de mais de uma funcao. A primeira, que
e executada com o nome do arquivo-M, e chamada de funca
o prim
aria. As outras sao ditas
subfunco
es, e sao visveis apenas para a funcao primaria ou para as subfuncoes no mesmo
arquivo. As subfunc
oes comecam consecutivamente, e cada subfuncao inicia com a sua propria
linha de definic
ao de func
ao.

4.8.1

Editando Arquivos-M

Para criar e editar arquivos-M temos duas escolhas. Podemos utilizar qualquer editor para
arquivos ASCII, ou podemos utilizar o MATLAB Editor/Debugger que faz parte do software.
No sistema MS Windows este editor e carregado digitando-se edit no prompt do MATLAB,
ou clicando no cone apropriado na barra de ferramentas, ou selecionando as opcoes New ou
Open... do menu File.
O editor do MATLAB possui varias caractersticas interessantes para auxiliar na edic
ao
de arquivos-M, incluindo identac
ao automatica de lacos e estruturas if, sintaxe de cores, e
fechamento de colchetes e quotas . Estas e outras caractersticas podem ser desativadas ou
personalizadas selecionando Preferences no menu File, e na caixa de dialogo que surge, no
item Editor/Debugger, personalize o editor de acordo com as suas preferencias.

4.9

Comandos I/O

MATLAB dispoe de uma variedade de comandos relacionados com a manipulacao de arquivos


de entrada e de sada de dados. O comando
c 2005 G. L. TORRES

EM MATLAB
CAP
ITULO 4. PROGRAMAC
AO

84

>> help iofun


exibe a lista completa de comandos relacionados com entrada e sada de dados. Os comandos
mais frequentemente utilizados sao descritos a seguir. O comando
>> arq = fopen(arquivo,permissao)
abre o arquivo especificado (arquivo) com a permissao especificada (permissao). O arquivo,
se aberto com sucesso, passa a ser identificado pelo inteiro arq. Se ocorrer qualquer problema
na abertura do arquivo, o valor 1 e atribudo a arq. A permissao pode assumir uma das
seguintes formas:
Permissao
r
w
a
r+
w+
a+

Descricao
Leitura apenas.
Escrita apenas (cria o arquivo se necessario).
Agrega (cria o arquivo se necessario).
Leitura e escrita (nao cria o arquivo).
Trunca ou cria para leitura e escrita.
Ler e agrega (cria o arquivo se necessario).

Por default, arquivos sao abertos no modo binario. Para abrir um arquivo no modo texto,
deve-se adicionar t a string de permissao, como em rt e wt+.
O comando
>> st = fclose(arq)
fecha o arquivo que possui o identificador arq atribudo previamente pelo comando fopen.
fclose retorna 0 em st se o fechamento ocorreu com sucesso; caso contrario, retorna 1.
Os comandos para leitura e escrita de dados em arquivos binarios sao fread e fwrite,
respectivamente. A leitura de dados formatados pode ser feita pelo comando fscanf:
>> [A,contador] = fscanf(arq,formato)
ler dados do arquivo identificado por arq, converte os dados de acordo com a string de formato
especificada, e retorna os dados na matriz A. O argumento de sada contador e um argumento
opcional que retorna o n
umero de elementos lidos com sucesso. O argumento formato e uma
string contendo especificac
oes de formato da linguagem C.
No exemplo
>> fprintf(%6.3f\n,pi)
3.142
o caracter % representa o incio de um especificador de formato requerendo uma largura de
campo de 6 dgitos com 3 dgitos apos o ponto decimal e \n representa uma nova linha (sem a
qual sadas subsequentes continuariam sobre a mesma linha). Se a largura do campo especificado nao e larga o suficiente, ent
ao MATLAB expande-a conforme for necessario:
>> fprintf(%6.3f\n,pi^10)
93648.047
A notacao de ponto fixo produzida por f e adequada para exibir inteiros (utilizando %n.0f) e
quando um n
umero fixo de casas decimais e desejado, tal quando exibindo valores monetarios
(utilizando %n.2f). Se f e substituido por e, entao o dgito apos o ponto representa o n
umero
de dgitos significantes para exibir na notacao exponencial:
c 2005 G. L. TORRES

4.9. COMANDOS I/O

85

>> fprintf(%12.3e\n,pi)
3.142e+000
Quando escolher a largura do campo lembrar que para um n
umero negativo o sinal de menos
ocupa uma posic
ao:
>> fprintf(%5.2f\n%5.2f\n,exp(1),-exp(1))
2.72
-2.72
Um sinal de menos exatamente apos o caracter % resulta no n
umero alinhado a esquerda.
Exemplo:
>> fprintf(%5.0f\n%5.0f\n,9,103)
9
103
>> fprintf(%-5.0f\n%-5.0f\n,9,103)
9
103
O formato string pode conter caracteres a serem literamente impressos, como:
>> m = 5; iter = 11; U = orth(rand(m)) + 1e-10;
>> fprintf(iter = %2.0f\n,iter)
iter = 11
>> fprintf(norm(U*U-I) = %11.4e\n,norm(U*U-eye(m)))
norm(U*U-I) = 8.4618e-010
Observe que, dentro de uma string, representa um u
nico apostrofo. Para imprimir % e \
utilizamos \% e \\ no formato da string.
Outro especificador de formato u
til e g, o qual utiliza e ou f para produzir o resultado
mais curto:
>> fprintf(%g %g\n,exp(1),exp(20))
2.71828 4.85165e+008
Varios outros especificadores de formato e caracteres especiais sao aceitos pelo comando de
sada fprintf, o qual comporta-se similarmente ao comando C/C++ de mesmo nome. Tais
especificac
oes envolvem o caracter %, flags opcionais, largura e campos de precisao opcional,
especificador de subtipo, e os caracteres de conversao da primeira parte da tabela abaixo.
O comando
contador = fprintf(arq,formato,A,...)
formata os dados na matriz A (e quaisquer argumentos adicionais), sob o controle da string
formato especificada, e escreve os dados no arquivo identificado por arq. contador e um
argumento opcional de sada que contem o n
umero de bytes escritos com sucesso.
c 2005 G. L. TORRES

EM MATLAB
CAP
ITULO 4. PROGRAMAC
AO

86

d
i
o
u
x
X
f
e
E
g
G
c
s
\n
\r
\t
\b
\f
\\
\%

notac
ao decimal (sinal)
notac
ao decimal (sinal)
notac
ao octal (sem sinal)
notac
ao decimal (sem sinal)
notac
ao hexadecimal (letras min
usculas)
notac
ao hexadecimal (letras mai
usculas)
notac
ao de ponto-fixo
notac
ao exponencial (e min
usculo)
notac
ao exponencial (E mai
usculo)
forma mais compacta de %e ou %f
forma mais compacta de %E ou %F
Caracter u
nico
String de caracteres
Avanca a impressao para a proxima linha.
Tecla de retorno.
Tabulacao.
Backspace.
Nova pagina.
Imprime a barra invertida \.
Imprime o caracter %.

O comando
>> [S,msgerro] = sprintf(formato,A,...)
formata os dados na parte real do array A (e em qualquer argumento de entrada adicional),
sob controle da string de formato especificada (formato), retornando os dados formatados na
variavel string S. Se ocorre um erro na leitura entao o argumento de sada msgerro retorna uma
mensagem de erro. Caso contrario, msgerro retorna uma string vazia. sprintf e o mesmo que
fprintf exceto que ele retorna os dados numa variavel string MATLAB em vez de escrever
num arquivo ou dispositivo de sada.
Outros comandos de leitura sao fgetl e fgets:
>> linha = fgetl(arq)
retorna a proxima linha do arquivo identificado por arq como uma string MATLAB. O terminador de linha nao e includo. O comando fgets tem a mesma funcao, exceto que o terminador
de linha e includo na string.
Um comando de leitura muito interessante e o textread, o qual ler dados formatados de
um arquivo texto. Os comandos
A
A
A
A

=
=
=
=

textread(nomearquivo)
textread(nomearquivo,,N)
textread(nomearquivo,,parametro,valor,...)
textread(nomearquivo,,N,parametro,valor,...)

ler dados numericos do arquivo nomearquivo retornando numa u


nica variavel. Se o arquivo
contem qualquer dado tipo texto, entao um erro e produzido. Os comandos
[A,B,C,...]
[A,B,C,...]
[A,B,C,...]
[A,B,C,...]

=
=
=
=

textread(nomearquivo)
textread(nomearquivo,formato,N)
textread(nomearquivo,formato,parametro,valor,...)
textread(nomearquivo,formato,N,parametro,valor,...)
c 2005 G. L. TORRES

4.9. COMANDOS I/O

87

leem dados do arquivo nomearquivo retornando nas variaveis A, B, C, etc. O tipo de cada
argumento de retorno e dado pela string formato. O n
umero de argumentos de retorno deve
ser exatamente igual ao n
umero de especificadores de formato na string formato. Se houver
menos campos no arquivo do que na string formato, entao um erro e produzido.
Se N e especificado, ent
ao a string formato e reutilizada N vezes. Se N e igual a -1 (ou nao
e especificado), ent
ao textread ler o arquivo todo. Se pares parametro,valor sao fornecidos,
entao opc
oes configuraveis pelo usuario personalizam o comportamento de textread.
O comando textread funciona identificando e convertendo grupos de caracteres do arquivo.
Um campo de entrada e definido como uma string de caracteres nao espaco branco extendendo
ate o proximo espaco em branco ou caracter de delimitacao ou ate que a largura do campo seja
esgotada. Caracteres delimitadores repetidos sao significantes, enquanto que caracteres espaco
branco repetidos sao considerados como um so.
Se a string formato e vazia, ent
ao textread ler apenas dados numericos. A string formato
pode conter caracteres de espaco (os quais sao ignorados), caracteres ordinarios (os quais sao
esperados igualar o proximo caracter nao-espaco branco na entrada), ou especificacoes de
conversao. As especificac
oes de conversao suportadas sao:
%n

ler um n
umero, seja em ponto flutuante ou inteiro (retorna double array).
%5n ler ate 5 dgitos ou ate o proximo delimitador.

%d

ler um valor inteiro com sinal (retorna double array).


%5d ler ate 5 dgitos ou ate o proximo delimitador.

%u

ler um valor inteiro (retorna double array).


%5u ler ate 5 dgitos ou ate proximo delimitador.

%f

ler um valor em ponto flutuante (retorna double array).


%5f ler ate 5 dgitos ou ate proximo delimitador.

%s

ler uma string separada por espaco branco (retorna cellstr).


%5s ler ate 5 caracteres ou ate espaco branco.

%q

ler uma string delimitada por ", ignorando as aspas (retorna cellstr).
%5q ler ate 5 caracteres nao aspas ou ate espaco branco.

%c

ler caracter ou espaco branco (retorna char array).


%5c ler ate 5 caracteres incluindo espaco branco.

%[...]

ler caracteres iguais aos entre os colchetes ate o primeiro caractere diferente ou espaco
branco (retorna cellstr). Use %[]...] para incluir ].
%5[...] ler ate 5 caracteres.

%[^...] ler caracteres diferentes dos caracteres entre os colchetes ate o primeiro caractere
igual ou espaco branco (retorna cellstr). Use %[^]...] para exlcuir ].
%5[^...] ler ate 5 caracteres.
Utilizar %* em vez de % numa conversao causa textread desprezar o campo na entrada (e
nenhuma sada e criada para essa conversao). O % pode ser seguido por uma largura de campo
opcional para manusear campos com largura fixa. As opcoes configuraveis pelo usuario sao:
bufsize

maximo comprimento de string em bytes (default e 4095).

commentstyle um dos possveis valores:


matlab - caracteres apos o % sao ignorados.
c 2005 G. L. TORRES

EM MATLAB
CAP
ITULO 4. PROGRAMAC
AO

88

shell
c
c++

- caracteres apos o # sao ignorados.


- caracteres entre /* e */ sao ignorados.
- caracteres apos // sao ignorados.

delimiter

caracteres delimitadores (default e nenhum).

emptyvalue

valor de celula vazio em arquivos delimitados (default e 0).

endofline

caractere de fim de linha (default determinado do arquivo).

expchars

caracteres expoentes (default e eEdD).

headerlines

n
umero de linhas a desprezar no incio do arquivo.

whitespace

caracteres espaco em branco (default e \b\t).

O comando textread e muito u


til para ler arquivos texto com formato conhecido. Tanto
formato fixo quanto livre podem ser tratados. Por exemplo, suponha que o arquivo texto
dados.txt contenha dados na forma:
Joao
Maria
Jose

Tipo1
Tipo2
Tipo1

12.34
23.54
34.90

45
60
12

Sim
Nao
Nao

Para ler cada coluna numa variavel, digite


[nome,tipo,x,y,resposta] = textread(dados.txt,%s%s%f%d%s);
Para ler a primeira coluna num vetor de celulas (desprezando as outras colunas), digite
[nome] = textread(dados.txt,%s%*[^\n])
Para ler o primeiro caractere num array char (desprezando o resto da linha), digite
[inicial] = textread(dados.txt,%c%*[^\n])
Para ler o arquivo como um formato fixo enquanto despreza os valores em ponto flutuante,
[nome,tipo,y,resposta] = textread(dados.txt,%10c%5s%*f%2d%3s)
Para ler e satisfazer Tipo literal
[nome,numtipo,x,y,resposta] = textread(dados.txt,%sTipo%d%f%d%s)
O comando input:
>> R = input(Numero de barras no sistema)
fornece ao usuario o prompt na string de texto e aguarda pela entrada atraves do teclado.
A entrada pode ser qualquer expressao valida em MATLAB, a qual e avaliada utilizando as
variaveis na
area de trabalho, e o resultado retornado em R.
Outros comandos de uso comun sao clc, que limpa a janela de comando, pause, que causa
a interrupc
ao de uma execuc
ao e aguarda o usuario pressionar qualquer tecla para continuar
o processamento, e o comando keyboad, que interrompe execucao do arquivo-M e passa o
controle ao usuario ate que o mesmo digite return no prompt do MATLAB.
c 2005 G. L. TORRES

4.10. CLASSES E OBJETOS

4.10

89

Classes e Objetos

Em determinadas aplicac
oes pode ser u
til associar atributos especficos a certas categorias de
dados. Classes sao novos tipos de dados tendo comportamentos especficos para elas definidos
(estruturas e operac
oes) e, portanto, podem ser vistas como tens novos que podem ser tratados
como entidades u
nicas. Um objeto e um exemplar de uma classe particular. Assim, objetos
sao estruturas tipificadas. O rotulo dado `a classe identifica tanto o tipo da estrutura quanto o
nome da func
ao que cria objetos que pertencem `aquela classe.
As possveis classes de objetos sao:
double

array de n
umeros em ponto flutuante precisao dupla.

single

array de n
umeros em ponto flutuante precisao simples.

float

array de n
umeros em ponto flutuante precisao simples ou precisao dupla.

int8, uint8, int16, uint16, int32, uint32 arrays de inteiros.


integer

array de qualquer das classes de inteiros acima.

numeric

array de n
umero em ponto flutuante ou inteiro.

logical

array l
ogico.

char

array de caracteres alfanumericos.

sparse

matriz esparsa, seja real ou complexa.

struct

array de estruturas.

cell

array de celulas.

class nome

classe de objeto definida pelo usuario.

java class

nome da classe Java para objetos Java.

function handle identificador de funcao.


A func
ao isa detecta se um objeto pertence a uma determinada classe:
>> isa(objeto,nome_classe)
retorna 1 se objeto pertence, ou herda, da classe nome classe, e retorna 0 caso contrario. O
comando
>> class(nome_objeto)
retorna a classe do objeto nome objeto. O comando
>> objeto = class(s,nome_classe)
cria um objeto da classe nome classe usando a estrutura s como gabarito. Consulte o help
para outras formas de uso da func
ao class.

4.10.1

Identificadores de Func
oes

Um identificador de func
ao (function handle) e um tipo de dado do MATLAB que contem
informac
ao utilizada para se referenciar uma funcao. Ao se criar um identificador de func
ao,
nele sao armazenados todos os dados acerca da funcao necessarios para que seja executada
posteriormente. Isto capacita ao seguinte:
c 2005 G. L. TORRES

EM MATLAB
CAP
ITULO 4. PROGRAMAC
AO

90

passar informac
ao de acesso a funcao, capturar todos os metodos associados a diferentes
tipos de argumentos da func
ao.
acesso mais amplo a subfunc
oes e funcoes particulares.
maior confiabilidade no c
alculo da funcao.
reduc
ao do n
umero de arquivos que define a funcao.
melhoria do desempenho em operacoes repetidas.
manipulac
ao de identificadores em arrays, estruturas e arrays de celulas.
Um identificador (handle) de func
ao e criado no MATLAB da seguinte forma:
>> identificador = @nome_funcao
O identificador e passado a outras funcoes como um argumento. Por exemplo,
>> x = fminbnd(@humps,0.3,1)
Neste exemplo o handles da func
ao humps foi passado para a funcao fminbnd como um argumento, que o processa usando feval:
>> feval(identificador,arg1,arg2,...,argn)
Isto e similar a uma chamada direta da funcao, porem mais eficiente.

c 2005 G. L. TORRES

Captulo

M
etodos Num
ericos

5.1

An
alise de Dados

Devido a sua orientac


ao a matrizes, MATLAB prontamente executa analises estatsticas sobre
conjuntos de dados. Por definic
ao, conjuntos de dados sao armazenados em matrizes e orientados por colunas. Ou seja, cada coluna de uma matriz representa a medida de uma variavel
diferente, e cada linha representa amostras individuais das variaveis. Por exemplo, assuma que
a temperatura diaria mais alta, num perodo de 31 dias, de tres cidades foram registradas e
armazenadas na matriz temp 31-por-3:
>> temp
temp =
12
15
12
14
12
11
15
8
19
12
14
11
9

8
9
5
8
6
9
9
10
7
7
10
8
7

18
22
19
23
22
19
15
20
18
18
19
17
23
91

CAP
ITULO 5. METODOS
NUMERICOS

92

8
15
8
10
12
9
12
12
10
13
9
10
14
12
13
15
13
12

8
8
9
7
7
8
8
8
9
12
10
6
7
5
7
10
11
12

19
18
20
17
22
19
21
20
17
18
20
22
21
22
18
23
24
22

Cada linha contem as temperaturas mais elevadas nas cidades para um certo dia. Cada coluna
contem as temperaturas elevadas para uma cidade diferente. Podemos utilizar o comando plot
para visualizar os dados:
>>
>>
>>
>>
>>

d = 1:31;
plot(d,temp(:,1),k-,d,temp(:,2),k-o,d,temp(:,3),k-.)
xlabel(Dia do Mes)
ylabel(Temperatura (Graus Celcius))
title(Temperatura Diaria Mais Alta em Tres Cidades)

O resultado e exibido na Figura 5.1.


Alguns dos recursos do MATLAB para a analise de dados sao ilustrados abaixo, com base
nos dados de temperatura acima. A media das temperaturas pode ser calculada atraves do
comando mean:
>> temp_media = mean(temp)
temp_media =
11.9677
8.2258
19.8710
Portanto, a terceira cidade possui a maior temperatura media. Observe que MATLAB calcula
a media de cada coluna da matriz (cidade) individualmente. A temperatura media das tres
cidades pode ser calculada como
>> media_media = mean(temp_media)
media_media =
13.3548
A temperatura maxima de cada cidade no perodo de 31 dias e obtida por
>> temp_max = max(temp)
temp_max =
19
12
24
c 2005 G. L. TORRES


5.2. POLINOMIOS

93

Temperatura Diaria Mais Alta em Tres Cidades


24

22

Temperatura (Graus Celcius)

20

18

16

14

12

10

10

15

20

25

30

35

Dia do Mes

Figura 5.1:
A temperatura maxima de cada cidade e o dia (linha da matriz) em que ela ocorreu e dada
por
>> [temp_max,x] = max(temp)
temp_max =
19
12
24
x =
9
23
30
Ou seja, a temperatura maxima na primeira cidade, de 19 graus, ocorreu no dia 9. A temperatura mnima de cada cidade e o dia em que ela ocorreu e dada por
>> [temp_min,n] = min(temp)
temp_min =
8
5
15
n =
8
3
7
O desvio padrao das temperaturas e obtido por
>> desvio_padrao = std(temp)
desvio_padrao =
2.5098
1.7646
2.2322

5.2

Polin
omios

MATLAB alem de encontrar as razes de um polinomio dispoe de varias ferramentas para


manipulac
ao do mesmo. MATLAB representa um polinomio por um vetor linha contendo os
coeficientes do polinomio em ordem decrescente. Por exemplo, o polinomio
p(x) = x4 12x3 + 0x2 + 25x + 116
c 2005 G. L. TORRES

CAP
ITULO 5. METODOS
NUMERICOS

94

e representado por:
>> p = [1 -12 0 25 116]
p =
1
-12
0
25

116

Observe que o termo com coeficiente nulo deve ser incluido. As razes de um polinomio sao
encontradas utilizando-se a func
ao roots:
>> r = roots(p)
r =
11.7473
2.7028
-1.2251 + 1.4672i
-1.2251 - 1.4672i
Uma vez que tanto o polinomio como o conjunto de suas razes sao vetores em MATLAB,
MATLAB adota a convenc
ao de que polinomios sao vetores linha e razes sao vetores colunas.
Conhecidas as razes de um polinomio, e possvel construir o polinomio (determinar os seus
coeficientes) utilizando-se o comando poly:
>> pp = poly(r)
pp =
1.0000 -12.0000

-0.0000

25.0000

116.0000

A multiplicac
ao de polinomios e possvel atraves da funcao conv (que executa a convoluc
ao
de dois vetores). Por exemplo, dados os polinomios
a(x) = x3 + 2x2 + 3x + 4,
b(x) = x3 + 4x2 + 9x + 16,
o produto a(x)b(x) e obtido por:
>> a = [1 2 3 4]; b = [1 4 9 16];
>> c = conv(a,b)
c =
1
6
20
50
75
84

64

O resultado deve ser interpretado como o polinomio


c(x) = x6 + 6x5 + 20x4 + 50x3 + 75x2 + 84x + 64.
A multiplicac
ao de mais de dois polinomios requer o uso repetido do comando conv.
MATLAB nao dispoe de uma funcao direta para somar polinomios. A soma dos vetores
correspondentes funciona apenas se os polinomios a serem somados possuem o mesmo grau.
Assim, a soma dos polinomios a(x) e b(x) acima e dada por:
>> d = a + b
d =
2
6

12

20
c 2005 G. L. TORRES

DE DADOS
5.3. INTERPOLAC
AO

95

e esse resultado deve ser interpretado como


d(x) = 2x3 + 6x2 + 12x + 20.
Quando dois polinomios possuem graus diferentes, ao polinomio de grau menor deve ser adicionado coeficientes nulos ate o termo de maior grau do outro polinomio. Por exemplo,
>> e = c + [ 0 0 0 d ]
e =
1
6
20
52

81

96

84

Assim,
e(x) = x6 + 6x5 + 20x4 + 52x3 + 81x2 + 96x + 84.
Em algumas aplicac
oes e necessario dividir um polinomio por outro. No MATLAB, isto e
efetuado pela func
ao deconv. Quando um polinomio c(x) e dividido por um polinomio b(x) ha
um quociente q(x) e um restante r(x), ou seja, c(x) = b(x)q(x)+r(x). Utilizando os polinomios
b(x) e c(x) acima, temos:
>> [q,r] = deconv(c,b)
q =
1
2
3
4
r =
0
0
0
0

A derivada de um polinomio e facil de estabelecer, e para isto o MATLAB dispoe da func


ao
polyder. Exemplo:
>> f = polyder(c)
f =
6
30
80

150

150

84

A avaliac
ao do polinomio p(x) para valores dados de x e efetuada pela funcao polyval.
Exemplo:
>> x = linspace(-1,3);
>> p = [1 4 -7 -10];
>> v = polyval(p,x);

5.3

Interpolac
ao de Dados

O problema de ajuste de curvas (interpolacao de dados) pode ser abordado atraves da func
ao
m
polyfit. Suponha que o conjunto de dados {xi , yi }i=1 possua valores xi distintos, e que
desejamos encontrar um polinomio p de grau no maximo n tal que p(xi ) yi , i = 1, . . . , m.
A funcao polyfit calcula
o ajuste polinomial de mnimos quadrados, ou seja, determina o
P
2
polinomio p tal que m
(p(x
e da
i ) yi ) seja minimizado. A chamada do comando polyfit
i=1
forma
>> p = polyfit(x,y,n)
c 2005 G. L. TORRES

CAP
ITULO 5. METODOS
NUMERICOS

96

Especificando-se o grau n tal que n m produz uma interpolacao polinomial, ou seja, p(xi ) =
yi , i = 1, . . . , m, o polinomio ajusta os dados de forma exata. Entretanto, polinomios de
grau elevado podem ser extremamente oscilatorios, de forma que valores pequenos de n sao
geralmente preferveis. O exemplo seguinte calcula e plota um ajuste polinomial de mnimos
quadrados de grau 3. O dado compreende a funcao 1/(x + (1 x)2 ) avaliada em 20 pontos
igualmente separados sobre o intervalo [2, 2], gerados por linspace.
>>
>>
>>
>>

x = linspace(-2,2,20);
y = 1./(x+(1-x).^2);
p = polyfit(x,y,3);
plot(x,y,*,x,polyval(p,x),--)

O resultado e mostrado no grafico da esquerda da Figura 5.2.


A func
ao spline pode ser utilizada se uma interpolacao exata e requerida. Dados os vetores
de dados x e y, o comando
>> yy = spline(x,y,xx)
retorna no vetor yy o valor da spline nos pontos dados por xx. O exemplo seguinte utiliza
esta tecnica para ajustar uma spline para os dados utilizados no exemplo acima. A curva
resultante e mostrada no grafico da direita da Figura 5.2.
>>
>>
>>
>>
>>

x = linspace(-2,2,20);
y = 1./(x+(1-x).^2);
xx = linspace(-2,2,60);
yy = spline(x,y,xx);
plot(x,y,*,xx,yy,--)

1.4

1.4

1.2

1.2

0.8

0.8

0.6

0.6

0.4

0.4

0.2

0.2

0
2

1.5

0.5

0.5

1.5

0
2

1.5

0.5

0.5

1.5

Figura 5.2:
MATLAB tem func
oes para interpolacao em uma, duas ou mais dimensoes. A func
ao
interp1 aceita pares de dados x(i),y(i) e um vetor adicional xi. Ela ajusta um interpolador
ao dado e ent
ao retorna os valores do interpolador nos pontos em xi:
>> yi = interp1(x,y,xi)
O vetor x deve ter elementos monotonicamente crescentes. Quatro tipos de interpoladores sao
disponveis, sendo especificado por um quarto parametro, conforme a tabela abaixo:
c 2005 G. L. TORRES

DE DADOS
5.3. INTERPOLAC
AO

nearest
linear
spline
cubic

97

Interpolacao
Interpolacao
Interpolacao
Interpolacao

vizinho mais proximo.


linear (default)
c
ubica spline
c
ubica

A interpolac
ao linear poe uma linha entre pares de dados adjacentes, enquanto a interpolacao do vizinho mais proximo reproduz o valor y do proximo ponto x. O seguinte exemplo
ilustra o uso de interp1:
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>

x = [0 pi/4 3*pi/8 3*pi/4 pi]; y = sin(x);


xi = linspace(0,pi,40);
ys = interp1(x,y,xi,spline);
yn = interp1(x,y,xi,nearest);
yl = interp1(x,y,xi,linear);
xx = linspace(0,pi,50);
plot(xx,sin(xx),-,x,y,.,MarkerSize,20), hold on
set(gca,XTick,x), set(gca,XTickLabel,0|pi/4|3pi/8|3pi/4|2pi)
set(gca,XGrid,on)
h = plot(xi,ys,x,xi,yn,o,xi,yl,+);
axis([-0.25 3.5 -0.1 1.1])
legend(h,spline,nearest,linear), hold off

O resultado e exibido na Figura 5.3. Este codigo amostra 5 pontos de uma senoide no intervalo
[0, ], calcula interpoladores utilizando tres dos quatro metodos mencionados acima, e avalia
os interpoladores em 40 pontos do intervalo.
MATLAB possui duas func
oes para interpolacao em duas dimensoes: griddata e interp2.
Outras func
oes de interpolac
ao sao interp3, para interpolacao em tres dimensoes, e interpn
para interpolac
ao n-dimensional.
spline
nearest
linear

0.8

0.6

0.4

0.2

pi/4

3pi/8

3pi/4

Figura 5.3:

c 2005 G. L. TORRES

2pi

CAP
ITULO 5. METODOS
NUMERICOS

98

5.4

Equac
oes N
ao-Lineares e Otimizac
ao

MATLAB possui rotinas para determinar um zero de uma funcao de uma variavel (fzero) e
para minimizar func
oes de uma variavel (fminbnd) ou de n variaveis (fminsearch). Em todos
os casos a func
ao deve produzir um valor real e ter argumentos reais. Infelizmente, nao ha um
recurso para resolver diretamente um sistema de n equacoes a n variaveis.
A chamada mais simples de fzero e x = fzero(fun,x0), sendo x0 um escalar, o qual
tenta obter um zero da func
ao fun proximo de x0. Exemplo:
>> fzero(cos(x)-x,0)
Zero found in the interval: [-0.9051, 0.9051].
ans =
0.7391
Mais precisamente, fzero procura por um ponto onde fun muda de sinal. Um busca inicial e
executada partindo de x0 para encontrar um intervalo no qual fun muda sinal. A funcao fun
deve retornar um escalar real quando e passado um argumento escalar real. Falhas de fzero
sao sinalizadas com o retorno de um NaN.
Para forcar fzero a afastar-se de singularidades podemos fornecer um intervalo inicial que
engloba um zero mas nao uma singularidade:
>> [x, fval] = fzero(x-tan(x),[-1 1])
Zero found in the interval: [-1 1].
x =
0
fval =
0
A tolerancia de convergencia e a exibicao do resultado em fzero sao controlados por um terceiro
argumento, a estrutura options, a qual e melhor definida utilizando a funcao optimset.
Apenas dois dos campos da estrutura options sao utilizados: Display especifica o nvel de
informac
oes, com valores off para nenhuma sada, iter para sada a cada iteracao, e final
para sada apenas do resultado final; e TolX e uma tolerancia de convergencia. Exemplos:
>> fzero(fun,x0,optimset(Display,iter))
>> fzero(fun,x0,optimset(TolX,1e-4))
A especificac
ao default e optimset(Display,final,TolX,eps). O algoritmo utilizado
por fzero e uma combinac
ao dos metodos da bi-secao, da secante e da interpolacao quadratica
inversa.
O comando x = fminbnd(fun,x1,x2) tenta obter um mnimo local x da funcao de uma
variavel especificada por fun sobre o intervalo [x1,x2]. Um ponto x e um mnimo local de f
se ele minimiza f num intervalo em torno de x. Em geral, uma funcao pode ter varios mnimos
locais. MATLAB nao possui uma funcao para resolver o difcil problema de determinar o
mnimo global de uma func
ao. Exemplo:
>> [x,fval] = fminbnd(sin(x)-cos(x),-pi,pi)
Optimization terminated successfully:
the current x satisfies the termination criteria using
OPTIONS.TolX of 1.000000e-004
x =
c 2005 G. L. TORRES


5.5. TRANSFORMADA RAPIDA
DE FOURIER

99

-0.7854
fval =
-1.4142
Assim como em fzero, as opc
oes podem ser especificadas utilizando-se a estrutura options via
a funcao optimset. Em adic
ao aos campos utilizados por fzero, fminbnd utiliza MaxFunEvals
(o n
umero maximo de avaliac
oes de funcoes permitidas) e MaxIter (o n
umero maximo de
iteracoes permitido). O default corresponde a
optimset(Display,final,MaxFunEvals,500,MaxIter,500,TolX,1e-4)
O algoritmo utilizado por fminbnd e uma combinacao da busca golden section com uma
interpolac
ao parabolica.
A func
ao fminsearch busca por um mnimo local de uma funcao real de n variaveis reais.
A sintaxe de uso e similar a fminbnd exceto que um vetor inicial em vez de um intervalo e
fornecido: x = fminsearch(fun,x0,options). Os campos em options sao aqueles aceitos
por fminbnd mais TolFun, uma tolerancia de termino sobre o valor da funcao. Dada a func
ao
function f = fquad(x)
f = x(1)^2 - x(2)^2 - x(1)*x(2);
podemos executar
>> [x,fval] = fminsearch(@fquad,ones(2,1))
Optimization terminated successfully:
the current x satisfies the termination criteria using
OPTIONS.TolX of 1.000000e-04
and F(X) satisfies the convergence criteria using
OPTIONS.TolFun of 1.000000e-04
x =
1.0e-04 *
-0.4582
-0.4717
fval =
2.1635e-09
Alternativamente, podemos definir f na lista de argumentos, como segue:
>> [x,fval] = fminsearch(x(1)^2+x(2)^2-x(1)*x(2),ones(2,1))

5.5

Transformada R
apida de Fourier

A transformada de Fourier discreta de um vetor x de n elementos e o vetor y = Fn x onde Fn


e uma matriz unitaria n-por-n formada por razes de unidade e ilustrada por

1 1
1
1
1 2 3

F4 =
= e2i/4 .
1 2 4 6 ,
1 3 6 9

A transformada rapida de Fourier (FFT) e uma maneira mais eficiente de formar y. A func
ao
fft implementa a FFT e e chamada como y = fft(x). A eficiencia de fft depende do valor
c 2005 G. L. TORRES

CAP
ITULO 5. METODOS
NUMERICOS

100

de n; valores primos sao ruins, n


umeros altamente compostos sao bons, e potencias de 2 sao
melhores. Um segundo argumento pode ser dado a fft: y = fft(x) causa x ser truncado
or complementado com zeros para fazer x de comprimento n antes que o algoritmo FFT seja
aplicado. A FFT inversa, x = Fn y, e executada pela funcao ifft: x = ifft(y). Exemplo:
>> y = fft([1 1 -1 -1])
y =
0
2.0000 - 2.0000i
0
2.0000 + 2.0000i
>> x = ifft(y)
x =
1
1
-1
-1
MATLAB tambem implementa transformadas de Fourier discretas e suas inversas de dimensoes elevadas: fft2, fftn, ifft2 e ifftn.

5.6

Integra
c
ao

Quadratura e um sinonimo para integracao numerica, a aproximacao de integrais definidas


Z b
f (x)dx.
a

MATLAB tem duas func


oes principais para quadratura, quad e quadl. Ambas requerem a
e b finitos e que o integrando nao tenha singularidades no intervalo [a, b]. O uso basico e
q = quad(fun,a,b,tol), onde fun especifica a funcao a ser integrada. A funcao fun deve
aceitar um argumento vetor e retornar um vetor de valores de funcao. O argumento tol e uma
tolerancia de erro absoluto, cujo default e um pequeno m
ultiplo de eps vezes uma estimativa
da integral. Dada a func
ao
function f = fxlog(x)
f = x.*log(x);
executamos
>> quad(@fxlog,2,4)
ans =
6.7041
para obtermos uma aproximac
ao para
Z

x log xdx.

O n
umero de avaliac
oes da func
ao e retornado num segundo argumento:
[q,count] = quad(fun,a,b)
c 2005 G. L. TORRES

5.7. EQUAC
OES
DIFERENCIAIS ORDINARIAS

101

A subrotina quad e baseada sobre a regra de Simpson para integracao numerica.


Uma outra func
ao de quadratura e trapz, a qual aplica a regra do trapezio. Ela difere de
quad e quadl no fato de que sua entrada compreende vetores de valores de xi e f (xi ) em vez
de uma func
ao representando o integrando f . Exemplo:
>> x = linspace(0,2*pi,10);
>> f = sin(x).^2./sqrt(1+cos(x).^2);
>> trapz(x,f)
ans =
2.8478
Integrais duplas podem ser avaliadas com dblquad. Para ilustrar, considere a integral dupla
Z

6Z 1

(y 2 ex + x cos y)dxdy.

Utilizando a func
ao
function out = fxy(x,y)
out = y^2*epx(x)+x*cos(y);
executamos
>> dblquad(@fxy,0,1,4,6)
ans =
87.2983

5.7

Equac
oes Diferenciais Ordin
arias

MATLAB tem uma gama de func


oes para resolver equacoes diferenciais ordinarias (EDO)s.
Estes problemas sao da forma
d
y(t) = f (t, y(t)),
dt

y(t0 ) = y0 ,

onde t e uma escalar real, y(t) e um vetor desconhecido de dimensao m, e f e um vetor de


funcoes tambem de dimensao m. A funcao f define a EDO, e a condicao inicial y(t0 ) = y0 define
um problema do valor inicial. A forma mais simples de resolver este problema e escrever uma
funcao que avalia f e ent
ao chamar um dos solvers de EDOs do MATLAB. A informac
ao
mnima que deve ser fornecida ao solver e o nome da funcao, a faixa de valores de t sobre
os quais a soluc
ao e desejada e a condicao inicial y0 . Entretanto, as rotinas MATLAB para
resolver EDOs permitem argumentos extras de entrada e sada que tornam possvel especificar
mais sobre o problema matematico e como ele deve ser resolvido.
Os exemplos abaixo ilustram o uso da funcao ode45. Esta funcao implementa um algoritmo
de Runge-Kutta adaptativo e e tipicamente o algoritmo mais eficiente para as classes de EDOs
que interessam aos usuarios do MATLAB. Para resolver a EDO
d
y(t) = y(t) 5et sin 5t,
dt

y(0) = 1,

para 0 t 3 com ode45, criamos no arquivo funf.m a funcao


c 2005 G. L. TORRES

CAP
ITULO 5. METODOS
NUMERICOS

102

function yprime = funf(t,y)


%FUNF
funcao exemplo de EDO.
%
YPRIME = FUNF(T,Y) calcula derivada.
yprime = -y - 5*epx(-t)*sin(5*t);
e entao executamos
>>
>>
>>
>>

tspan = [0 3]; yzero = 1;


[t,y] = ode45(@funf,tspan,yzero);
plot(t,y,*--)
xlabel t, ylabel y(t)

Este codigo produz o grafico da Figura 5.4. Os argumentos de entrada para ode45 sao a
funcao funf, o vetor tspan que especifica o intervalo de tempo, e a condicao inicial yzero.
Dois argumentos de sada t e y sao retornados. Os valores de t sao ordenados no intervalo
[0,3] e y(i) aproxima a soluc
ao no instante t(i).
A soluc
ao para a EDO acima e y(t) = et cos 5t, de forma que podemos verificar o erro
maximo na aproximac
ao ode45 como:
>> max(abs(y - exp(-t).*cos(5*t)))
ans =
2.8991e-04
Se mais do que dois valores de tempo sao especificados, entao ode45 retorna a soluc
ao
nestes tempos apenas, suprimindo quaisquer valores de solucao que podem ter sidos calculados
para instantes intermediarios:
>> tspan2 = 0:4;
>> [t2,y2] = ode45(@funf,tspan2,yzero);
>> disp([t2 y2])
0
1.0000
1.0000
0.1043
2.0000
-0.1136
3.0000
-0.0378
4.0000
0.0075
EDOs de ordem elevada podem ser resolvidas se elas primeiro sao escritas como um sistema
de EDOs de primeira-ordem. Por exemplo, a EDO de segunda-ordem
d2
(t) + sin (t) = 0
dt2
pode ser reescrita como
d
y1 (t) = y2 (t),
dt
d
y2 (t) = sin y1 (t).
dt

onde, por definic


ao, y1 (t) = (t) e y2 (t) = (t).
Esta informacao pode ser codificada para uso
por ode45 numa func
ao pend somo segue:
c 2005 G. L. TORRES

5.7. EQUAC
OES
DIFERENCIAIS ORDINARIAS

103

0.8

0.6

y(t)

0.4

0.2

0.2

0.4

0.6

0.5

1.5
t

2.5

Figura 5.4:
function yprime = pend(t,y)
%PEND
Pendulo simples.
%
YPRIME = PEND(T,Y).
yprime = [y(2); -sin(y(1))];
Os seguintes comandos calculam solucoes sobre 0 t 10 para tres condicoes iniciais diferentes:
>>
>>
>>
>>
>>

tspan = [0 10];
yazero = [1; 1]; ybzero = [-5; 2]; yczero = [5; -2];
[ta,ya] = ode45(@pend,tspan,yazero);
[tb,yb] = ode45(@pend,tspan,ybzero);
[tc,yc] = ode45(@pend,tspan,yczero);
A forma geral da chamada para ode45 e como segue:

[t,y] = ode45(@fun,tspan,yzero,options,p1,p2,...);
A lista de argumentos adicionais p1,p2,... representa parametros do problema que, se fornecidos, sao passados adiantes para a funcao fun. O argumento opcional options e uma estrutura
que controla varias caractersticas do solver e pode ser especificada via a funcao odeset. Exemplo:
options = odeset(AbsTol,1e-7,RelTol,1e-4);
c 2005 G. L. TORRES

CAP
ITULO 5. METODOS
NUMERICOS

104

Solver
ode45
ode23
ode113
ode15s
ode23s
ode23t
ode23tb

Tipo do Problema
Nonstiff
Nonstiff
Nonstiff
Stiff
Stiff
Midly stiff
Stiff

Tipo do Algoritmo
Runge-Kutta ordens 4 e 5
Runge-Kutta ordens 2 e 3
Multipassos lineares explcitos, ordens 1 a 13
Multipassos lineares implcitos, ordens 1 a 5
Par Rosenbrock modificado (um passo), ordens 2 e 3
Regra trapezoidal (implcita), ordens 2 e 3
Algoritmo tipo Runge-Kutta implcito, ordens 2 e 3

O MATLAB dispoe tambem de funcoes para resolver problemas do valor de fronteira


(bvp4c) e equac
oes diferenciais parciais (pdepe).

c 2005 G. L. TORRES

Captulo

Arquivos-MEX

6.1

Introdu
c
ao

Voce pode chamar as suas proprias subrotinas C ou Fortran do MATLAB, como se elas
fossem func
oes intrnsecas do MATLAB. Programas C e Fortran chamaveis pelo MATLAB
sao chamados de arquivos-MEX. Arquivos-MEX sao subrotinas dinamicamente conectadas que
o interpretador MATLAB pode carregar e executar automaticamente.
Os arquivos-MEX tem varias aplicacoes:
Programas ja existentes grandes e complexos em C e Fortran podem ser chamados do
MATLAB sem ter que serem reescritos como arquivos-M.
Gargalos de processamento (geralmente lacos for) que nao executam suficientemente
rapidos em MATLAB podem ser recodificados em C ou Fortran para melhor eficiencia
computacional.
Arquivos-MEX nao sao apropriados para todas as aplicacoes. MATLAB e um sistema de alta
produtividade cuja especialidade e eliminar o tempo na programacao em linguagens compiladas
como C e Fortran. Em geral, a maior parte da programacao deveria ser feita em MATLAB.
Apenas recorra a facilidade MEX se ela for indispensavel para a sua aplicacao.

6.2

Usando Arquivos-MEX

Arquivos-MEX sao subrotinas produzidas a partir de codigos fontes C ou Fortran. Elas


comportam-se exatamente como arquivos-M e funcoes intrnsicas do MATLAB. Enquanto
105

CAP
ITULO 6. ARQUIVOS-MEX

106

arquivos-M tem uma extens


ao independente da plataforma (.m), MATLAB identifica arquivosMEX pela extens
ao especfica da plataforma, como segue:
Plataforma
HP-UX
Linux
Linux 64
Macintosh
Solaris
Windows (32-bit)

Extens
ao Arquivo-MEX
mexhpux
mexglx
mexglxa64
mexmac
mexsol
mexw32

Voce pode chamar um arquivo-MEX da mesma maneira que voce chama uma funcao-M.
Por exemplo, um arquivo-MEX chamado conv2.mex no diretorio MATLAB datafun executa
uma convoluc
ao 2-D de matrizes. O arquivo-M conv2.m contem apenas o texto do help. Se
voce requisitar a func
ao conv2 a partir do MATLAB, entao o MATLAB varre cada diretorio
procurando pela primeira ocorrencia de um arquivo chamado conv2 com a correspondente
extensao da tabela acima ou a extensao .m. Quando ele encontra uma ocorrencia, ele carrega
o arquivo e executa-o. Arquivos-MEX tomam precendencia sobre arquivos-M quando arquivos
com o mesmo nome (exceto a extensao) existem no mesmo diretorio. Entretanto, o texto da
documentac
ao do help ainda e lido do arquivo .m.

6.3

Localizac
ao dos Arquivos-MEX

Para MATLAB ser capaz de executar as suas funcoes C ou MATLAB voce deve colocar
os arquivos-MEX compilados contendo essas funcoes num diretorio no caminho MATLAB,
ou executar MATLAB no diretorio no qual elas residem. Funcoes no diretorio de trabalho
corrente sao encontradas antes de funcoes no caminho MATLAB.
Digite path para ver quais diretorios estao atualmente includos no seu caminho. Voce
pode adicionar novos diretorios ao caminho utilizando a funcao addpath, ou selecionando Set
Path... no menu File para editar o caminho.

6.4

Requisitos do Compilador

A versao do seu MATLAB instalado contem todas as ferramentas que voce precisa para
trabalhar com a API. MATLAB inclui um compilador C para o PC chamado Lcc, mas nao
inclui um compilador Fortran. Se voce escolher utilizar o seu compilador C proprio, ele deve ser
um compilador C ANSI. Mais ainda, se voce esta trabalhando numa plataforma MS Windows,
entao seu compilador deve ser capaz de criar DLLs (Dinamic Linked Librarys) Windows 32-bit.
O MATLAB suporta varios compiladores e prover arquivos pre-configurados, chamados
arquivos de opc
ao, designados especificamente para estes compiladores. O proposito de suportar uma larga colec
ao de compiladores e possibilitar que voce utilize a ferramenta de sua
escolha. Uma lista dos compiladores suportados pelo MATLAB encontra-se no seguinte endereco Internet:
www.mathworks.com/support/tech-notes/1600/1601.shtml
c 2005 G. L. TORRES

NO UNIX
6.5. TESTANDO A CONFIGURAC
AO

6.5

107

Testando a Configurac
ao no UNIX

A maneira mais rapida e efetiva de examinar se o seu sistema esta devidamente configurado para criar arquivos-MEX e tentar o verdadeiro processo. Ha um codigo fonte C de um
exemplo, yprime.c, e seu similar Fortran, yprimef.F e yprimefg.F, includos no diretorio
<matlab>/extern/examples/mex, onde <matlab> representa o diretorio onde o MATLAB
esta instalado no seu sistema.
Para compilar e conectar os arquivos fontes yprime.c ou yprimef.F e yprimefg.F, na
plataforma UNIX, voce deve primeiro copiar os arquivos para um diretorio local, e ent
ao
modificar o diretorio de trabalho do MATLAB para esse diretorio local. Na linha de comando
do MATLAB, digite
>> mex yprime.c
Isto utiliza o compilador do sistema para criar o arquivo-MEX chamado yprime com a extens
ao
apropriada para o seu sistema. Voce pode entao chamar yprime como se ele fosse uma func
aoM, como segue:
>> yprime(1,1:4)
ans =
2.0000
8.9685

4.0000

-1.0947

Para tentar a versao Fortran do mesmo programa com o seu compilador Fortran, na linha de
comando do MATLAB digite
>> mex yprimef.F yprimefg.F
Como alternativa a executar o script mex na linha de comando do MATLAB, voce pode
tambem executar o script na linha de comando do sistema operacional.

6.5.1

Selecionando um Compilador

Para modificar o seu compilador default, voce seleciona um arquivo de opcoes diferente. Isto
pode ser feito a qualquer momento, utilizando o comando:
>> mex -setup
Using the mex -setup command selects an options file that is
placed in ~/.matlab/R14 and used by default for mex. An options
file in the current working directory or specified on the command line
overrides the default options file in ~/.matlab/R14.
Options files control which compiler to use, the compiler and link
command options, and the runtime libraries to link against.
To override the default options file, use the mex -f command
(see mex -help for more information).
The options files available for mex are:
1: /usr/local/matlab704/bin/f90opts.sh :
c 2005 G. L. TORRES

CAP
ITULO 6. ARQUIVOS-MEX

108

Template Options file for building Fortran 90 MEX-files via the


system ANSI compiler
2: /usr/local/matlab704/bin/gccopts.sh :
Template Options file for building gcc MEX-files
3: /usr/local/matlab704/bin/mexopts.sh :
Template Options file for building MEX-files via the system ANSI
compiler
Enter the number of the options file to use as your default options file:
Selecione o arquivo de opc
oes apropriado para o seu sistema digitando o n
umero da opc
ao
e pressionando Enter. Se um arquivo de opcoes nao existe no seu diretorio MATLAB, ent
ao
o sistema exibe uma mensagem declarando que o arquivo de opcoes esta sendo copiado para o
diretorio matlab especificado pelo usuario. Se um arquivo de opcoes ja existe no seu diretorio
matlab, o sistema questiona se deve sobreescrever o arquivo ou nao.
A opc
ao -setup cria um diretorio matlab especificado pelo usuario no seu diretorio raiz
pessoal e copia o arquivo de opc
oes apropriado para o diretorio. (Se o diretorio ja existe ent
ao
nao sera criado um novo diretorio.) Este diretorio MATLAB e utilizado para seus arquivos
de opcoes individuais apenas; cada usuario pode ter seus proprios arquivos de opcoes (outros
produtos MATLAB podem colocar arquivos de opcoes neste diretorio).
Utilizando a opc
ao -setup reseta seu compilador default de forma que o novo compilador
e usado toda vez que voce utiliza o script mex.

6.6

Testando a Configurac
ao no Windows

Antes que voce crie arquivos-MEX na plataforma Windows, voce deve configurar o arquivo
de opcoes default, mexopts.bat, para seu compilador. A opcao -setup prover uma maneira
rapida para voce configurar o arquivo de opcoes default, executando a qualquer momento o
comando
mex -setup
seja na linha de comando do MATLAB ou da linha de comando do DOS.

6.6.1

O Compilador Lcc

MATLAB inclui um compilador C chamado Lcc que voce pode utilizar para criar arquivosMEX a partir de c
odigos em C. Ajuda sobre a utilizacao do compilador Lcc e disponvel num
arquivo help que acompanha o MATLAB. Para ver este arquivo, digite na linha de comando
do MATLAB
>> ! <matlab>\sys\lcc\bin\wedit.hlp
substituindo o termo <matlab> com o caminho para o diretorio no qual MATLAB esta instalado no seu sistema.
c 2005 G. L. TORRES

NO WINDOWS
6.6. TESTANDO A CONFIGURAC
AO

6.6.2

109

Selecionando um Compilador

O script mex utiliza o compilador Lcc por default se voce nao tem um compilador C ou C++
proprio ja instalado no seu sistema e voce tenta compilar um arquivo-MEX C. Se voce deseja
compilar programas Fortran, ent
ao voce deve fornecer seu compilador Fortran proprio.
O script mex utiliza a extens
ao do arquivo para determinar o tipo de compilador a usar
para criar seus arquivos-MEX. Por exemplo,
>> mex test1.f
usaria seu compilador Fortran e
>> mex test2.c
usaria seu compilador C.
Se voce nao tem um compilador proprio C ou C++ no seu sistema, entao o utilitario mex
automaticamente configura-se para o compilador Lcc. Assim, para criar arquivos-MEX nestes
sistemas, voce precisa apenas digitar
>> mex filename.c
Em sistemas onde ha um compilador C, C++ ou Fortran, voce pode selecionar qual compilador
deseja utilizar. Uma vez escolhido seu compilador, este compilador torna-se seu compilador
default e voce nao mais tem que selecionar um compilador quando voce compila arquivos-MEX.
Para selecionar um compilador ou mudar o compilador default existente, utilize o comando
>> mex -setup
Este exemplo mostra o processo de ajustar o compilador default para o compilador Microsoft
Visual C++ Version 6.0:
>> mex -setup
Please choose your compiler for building external interface (MEX) files:
Would you like mex to locate installed compilers [y]/n?
Select a compiler:
[1] Digital Visual Fortran version 6.0 in C:\Program Files\Microsoft Visual Studio
[2] Lcc C version 2.4 in E:\MATLAB7\sys\lcc
[3] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio
[0] None
Compiler: 3

6.6.3

Construindo o Arquivo-MEX no Windows

Ha um codigo fonte C de exemplo, yprime.c, e seu similar Fortran, yprimef.f e yprimefg.f,


includos no diretorio <matlab>\extern\examples\mex, onde <matlab> representa o diretorio
raiz onde o MATLAB esta instalado no seu sistema.
Para compilar e conectar o arquivo fonte exemplo no MS Windows, na linha de comando
do MATLAB digite
c 2005 G. L. TORRES

CAP
ITULO 6. ARQUIVOS-MEX

110

>> cd([matlabroot \extern\examples\mex])


>> mex yprime.c
Isto devera criar o arquivo-MEX de nome yprime e extensao .mexw32, o que corresponde a
plataforma Windows 32-bit.
Voce pode agora chamar yprime como se ele fosse uma funcao-M do MATLAB, da forma:
>> yprime(1,1:4)
ans =
2.0000
8.9685

4.0000

-1.0947

Para tentar a versao Fortran do programa exemplo com o seu compilador Fortran, comute para
seu compilador Fortran utilizando mex -setup. A seguir, na linha de comando do MATLAB,
digite
>> cd([matlabroot \extern\examples\mex])
>> mex yprimef.f yprimefg.f
Como alternativa a executar o script mex da linha de comando do MATLAB, voce pode
tambem executar o script da linha de comando do sistema.

c 2005 G. L. TORRES

Captulo

Matlab Compiler

7.1

Introdu
c
ao

O MATLAB Compiler Version 4 permite que voce converta automaticamente seus programas MATLAB em aplicac
oes auto-contidas ou em componentes de softwares dinamicamente
conectados (DLLs), e o compartilhamento destes com usuarios finais. Nem os aplicativos nem
os componentes criados com o MATLAB Compiler requerem o MATLAB para execuc
ao.
O compilador MATLAB toma aplicacoes MATLAB (arquivos-M, arquivos-MEX, ou outros
codigos executaveis) como entradas e gera aplicacoes ou componentes de softwares independentes e redistribuveis. As aplicacoes e componentes resultantes sao para uma plataforma
especfica.
O MATLAB Compiler pode gerar os seguintes tipos de aplicacoes ou componentes:
Aplicac
oes stand-alone, ou seja, aplicacoes que executam sem o MATLAB.
Bibliotecas compartilhadas C e C++ (DLLs).
Dispositivos Excel (requer o MATLAB Builder for Excel).
Objetos COM (requer o MATLAB Builder for COM).
O MATLAB Compiler suporta todas as funcionalidade do MATLAB, incluindo objetos.

7.2

Arquivos Encapsuladores (Wrapper)

O MATLAB Compiler (mcc) gera, a partir de arquivos-M, tanto aplicacoes stand-alone quanto
componentes de programas redistribuveis. O alvo final especfico pode ser qualquer dos tipos
111

CAP
ITULO 7. MATLAB COMPILER

112

de componentes suportados relacionados acima. O MATLAB Compiler gera o arquivo encapsulador (wrapper ) apropriado baseado no alvo desejado. Um arquivo encapsulador contem a
interface requerida entre a aplicac
ao compilada e o tipo executavel suportado.
Arquivos encapsuladores diferem dependendo do ambiente de execucao. Para propiciar a
interface requerida, o encapsulador
Executa inicializac
ao e terminacao especfica do encapsulador.
Define vetores de dados contendo informacao de caminho, chaves criptograficas, e outras
informac
oes necessarias pelo MATLAB Component Runtime (MCR).
Prover o c
odigo necessario para passar chamadas das funcoes de interface para as func
oes
MATLAB na MCR.
Por exemplo, o encapsulador para um executavel stand-alone contem a funcao main. Ja o
encapsulador para uma biblioteca contem os pontos de entrada para cada funcao-M p
ublica.
MATLAB Component Runtime (MCR) e um conjunto de bibliotecas compartilhadas autocontidas que possibilitam a execucao de arquivos-M. A MCR prover suporte completo para
todas as caractersticas da linguagem MATLAB. Uma vez que a tecnologia MCR prover total
suporte para a linguagem MATLAB, incluindo Java, iniciar uma aplicacao compilada toma
aproximadamente a mesma quantidade de tempo que a inicializacao do MATLAB.
O MATLAB Compiler 4 tambem utiliza um arquivo Component Technology File (CTF)
para hospedar o pacote distribuvel. Todos os arquivos-M sao criptografados no arquivo CTF
utilizando o sistema de criptografia Advanced Encryption Standard (AES). Cada aplicacao ou
biblioteca produzida pelo MATLAB Compiler tem um arquivo CTF associado. O arquivo
contem o conte
udo MATLAB executavel (arquivos-M, arquivos-MEX, etc.) associado com o
componente. Quando o arquivo CTF e extrado no sistema do usuario, os arquivos permanecem
criptografados. O arquivo CTF e independente do alvo final (executavel ou biblioteca), mas e
especfico da plataforma. O arquivo encapsulador prover a interface necessaria para o tipo do
alvo.

7.3

Aplicac
oes Stand-Alone

O MATLAB Compiler, quando invocado com a opcao macro -m, toma os arquivos-M de
entrada e produz o arquivo encapsulador adequado requerido para uma aplicacao stand-alone.
Entao, seu compilador C ou C++ compila esse codigo e conecta com o MCR, o qual e um
conjunto de bibliotecas compartilhadas que habilita a execucao de arquivos-M. Por exemplo,
para gerar um executavel stand-alone do arquivo exemplo.m, utilize
>> mcc -m exemplo

7.4

Bibliotecas Compartilhadas

Biblioteca C
Voce pode utilizar a opc
ao -l para criar uma biblioteca compartilhada C de um conjunto de
arquivos-M. Por exemplo,
>> mcc -l arquivo1.m arquivo2.m arquivo3.m
c 2005 G. L. TORRES

7.5. PRODUTOS BUILDER

113

A opcao -l e um conjunto de opc


oes que expande em
-W lib -T link:lib
A opcao -W lib informa ao compilador MATLAB para gerar um encapsulador de funcao para
uma biblioteca compartilhada e chama-a de libarquivo1. A opcao -T link:lib especifica a
sada alvo como uma biblioteca compartilhada.
Biblioteca C++
O procedimento para criar uma biblioteca compartilhada C++ de arquivos-M e identico ao
procedimento para criar uma biblioteca compartilhada C, exceto que voce usa o encapsulador
cpplib. Por exemplo,
-W cpplib -T link:lib

7.5
7.5.1

Produtos Builder
Matlab Builder for COM

Com o MATLAB Builder for COM, voce pode criar componentes COM que podem ser utilizados em qualquer aplicac
ao que trabalha com objetos COM. O produto MATLAB Builder for
COM permite que voce converta arquivos-M para objetos Component Object Model (COM)
que sao acessveis de Visual Basic, C, C++, MS Excel, ou qualquer outro cliente COM. A
colecao de arquivos-M e traduzida numa u
nica classe COM. O MATLAB Builder for COM
suporta m
ultiplas classes por componente.

7.5.2

Matlab Builder for Excel

Com o MATLAB Builder for Excel, voce pode automaticamente gerar um arquivo Visual
Basic Application (.bas) e um DLL plug-in do seu modelo MATLAB que pode ser importado
no Excel com uma func
ao executavel. Usuarios podem ent
ao chamar ou utilizar seus algoritmos
baseados no MATLAB da mesma maneira que outros aplicativos Excel.
O MATLAB Builder for Excel compila arquivos-M em um objeto COM que pode ser
utilizado como um plug-in Excel. A colecao de arquivos-M e traduzida num u
nico plug-in
Excel. O MATLAB Builder for Excel suporta uma classe por componente.
O MATLAB Builder for COM e MATLAB Builder for Excel sao disponveis apenas na
plataforma Windows.

7.6

Compilando uma Aplicac


ao Stand-Alone

Para criar uma aplicac


ao independente do arquivo-M minhafuncao, use o comando
>> mcc -m minhafuncao
Este comando cria um executavel independente de nome minhafuncao.exe no Windows e
minhafuncao no UNIX/Linux. Suponha agora que voce deseja gerar um codigo executavel da
funcao-M magicsquare.m do MATLAB:
Copie o arquivo magicsquare.m de
c 2005 G. L. TORRES

CAP
ITULO 7. MATLAB COMPILER

114

<matlabroot>/extern/examples/compiler
para o seu diretorio.
Para compilar o c
odigo-M, use
>> mcc -mv magicsquare.m
A opc
ao -m informa o MATLAB Compiler (mcc) para gerar uma aplicacao stand-alone.
A opc
ao -v exibe os passos de compilacao atraves do processo e ajuda identificar outras
informac
oes u
teis tais como qual compilador e usado e quais variaveis ambientes sao
referenciadas.
O comando cria a aplicac
ao stand-alone chamada magicsquare e os arquivos adicionais.
A plataforma Windows agrega a extensao .exe ao nome.

Testando a Aplicac
ao
Estes passos testam a sua aplicac
ao na maquina onde foi desenvolvida:
Atualize o caminho. No Windows adicione o seguinte diretorio ao caminho:
<matlabroot>\bin\win32
No Linux, adicione os seguintes diretorios especficos da plataforma para o caminho da
biblioteca dinamica:
setenv LD_LIBRARY_PATH
<matlabroot>/sys/os/glnx86:
<matlabroot>/bin/glnx86:
<matlabroot>/sys/java/jre/glnx86/jre1.5.0/lib/i386/native_threads:
<matlabroot>/sys/java/jre/glnx86/jre1.5.0/lib/i386/client:
<matlabroot>/sys/java/jre/glnx86/jre1.5.0/lib/i386:
setenv XAPPLRESDIR <matlabroot>/X11/app-defaults
Execute a aplicac
ao stand-alone da linha de comando do sistema digitando o nome da
aplicac
ao:
magicsquare.exe 4
magicsquare 4

(No Windows)
(No UNIX)

Os resultados sao exibidos como:


ans =
16
5
9
4

2
11
7
14

3
10
6
15

13
8
12
1
c 2005 G. L. TORRES

7.7. COMPILANDO UMA BIBLIOTECA COMPARTILHADA

7.7

115

Compilando uma Biblioteca Compartilhada

Para criar uma biblioteca compartilhada do arquivo-M minhafuncao, use o comando


>> mcc -l minhafuncao.m
Este comando cria uma biblioteca compartilhada de nome minhafuncao.dll no Windows e
minhafuncao.so no UNIX/Linux.
Para criar uma aplicac
ao executavel de um arquivo fonte escrito pelo usuario chamado
meucodigo e que chama a biblioteca minhafuncao acima, use o comando
>> mbuild meucodigo.c minhafuncao.lib
>> mbuild meucodigo.c minhafuncao.so

7.8

% Windows
% Linux

Testando Componentes na M
aquina de Desenvolvimento

Para testar os componentes na propria maquina onde foram desenvolvidos, certifique-se de que
voce tem seu caminho ajustado apropriadamente. No Windows, adicione o seguinte diretorio
para a variavel PATH do seu sistema
<matlabroot>\bin\win32
No UNIX, adicione os seguintes diretorios especficos de plataforma para o seu caminho de
biblioteca dinamica:
setenv LD_LIBRARY_PATH
<matlabroot>/sys/os/glnx86:
<matlabroot>/bin/glnx86:
<matlabroot>/sys/java/jre/glnx86/jre1.5.0/lib/i386/native_threads:
<matlabroot>/sys/java/jre/glnx86/jre1.5.0/lib/i386/client:
<matlabroot>/sys/java/jre/glnx86/jre1.5.0/lib/i386:
setenv XAPPLRESDIR <matlabroot>/X11/app-defaults
Voce pode ent
ao executar as aplicacoes compiladas na sua maquina de desenvolvimento para
testa-las.

7.9

Preparando Componentes para Outras M


aquinas

Para preparar o seu componente para uma maquina alvo que nao tem a mesma versao do
MATLAB instalada na maquina de desenvolvimento (ou qualquer versao de MATLAB),
voce precisa empacotar os componentes e configurar as maquinas alvos como segue:
Windows
O componente executavel ou a biblioteca compartilhada.
O arquivo CTF que o compilador cria para o componente (<nome_componente>.ctf).
O arquivo MCRInstaller.exe que esta no diretorio
<matlabroot>\toolbox\compiler\deploy\win32.
c 2005 G. L. TORRES

CAP
ITULO 7. MATLAB COMPILER

116

Na maquina alvo, faca o seguinte:


Instale o MCR executando MCRInstaller.exe. Durante o processo de instalacao, voce
sera indagado para informar o diretorio onde sera instalado o MCR.
Copie o componente e o arquivo CTF para o diretorio raiz da sua aplicacao.
Adicione o seguinte diretorio para o caminho do sistema:
<mcr_root>\<ver>\runtime\win32
No Windows XP este diretorio e automaticamente adicionado ao caminho.
Teste o componente.
UNIX
O componente executavel ou a biblioteca compartilhada.
O arquivo CTF que o compilador criou para o componente (<nome_componente>.ctf).
O arquivo MCRInstaller.zip.
Para criar o arquivo MCRInstaller.zip, execute o comando
>> buildmcr
Este comando coloca o arquivo MCRInstaller.zip no diretorio
<matlabroot>/toolbox/compiler/deploy/<ARCH>
onde <ARCH> e sua arquitetura de sistema (Linux=glnx86). Se voce nao tem permissao de
escrita nesse diretorio, voce pode especificar o diretorio de destino como uma entrada para o
comando buildmcr.
Na maquina alvo, faca o seguinte:
Instale o MCR descompactando o arquivo MCRInstaller.zip num diretorio, por exemplo, /home/<user>/MCR. Voce pode escolher qualquer diretorio exceto <matlabroot> ou
qualquer diretorio abaixo de <matlabroot>.
Copie o componente e o arquivo CTF para o diretorio raiz da aplicacao.
Adicione os seguintes diretorios especficos da plataforma ao caminho da biblioteca
dinamica.
Linux
setenv LD_LIBRARY_PATH
<mcr_root>/<ver>/runtime/glnx86:
<mcr_root>/<ver>/sys/os/glnx86:
<mcr_root>/<ver>/sys/java/jre/glnx86/jre1.5.0/lib/i386/native_threads:
<mcr_root>/<ver>/sys/java/jre/glnx86/jre1.5.0/lib/i386/client:
<mcr_root>/<ver>/sys/java/jre/glnx86/jre1.5.0/lib/i386:
setenv XAPPLRESDIR <mcr_root>/<ver>/X11/app-defaults
Teste o componente.
c 2005 G. L. TORRES

7.10. LIMITAC
OES
E RESTRIC
OES

7.10

Limitac
oes e Restric
oes

7.10.1

Compilando Matlab e Toolboxes

117

O MATLAB Compiler suporta toda a linguagem MATLAB e quase todos os toolboxes MATLAB. Entretanto, algumas funcionalidades limitadas do MATLAB e toolboxes nao sao licenciadas para compilac
ao.
Muitas das GUIs pre-existentes includas no MATLAB e seus toolboxes nao compilam.
Funcionalidades que nao podem ser chamadas diretamente da linha de comando nao
compilam.
Alguns toolboxes, tal como o Symbolic Math Toolbox, nao compilam.

7.10.2

C
odigo Matlab

O MATLAB Compiler 4 suporta a maior parte da funcionalidade do MATLAB. Entretanto,


ha algumas limitac
oes e restric
oes.

7.10.3

Aplicac
oes Stand-Alone

Ha um conjunto de func
oes que nao e suportado no modo stand-alone. Estas funcoes caem em
tres categorias:
Func
oes que imprimem ou reportam codigo MATLAB de uma funcao, por exemplo, a
func
ao help do MATLAB, nao funcionara.
Func
oes Simulink, em geral, nao funcionarao.
Func
oes que requerem uma linha de comando, por exemplo, a funcao lookfor MATLAB, nao funcionara.
Os comandos clc, home, e savepath nada farao no modo independente.
Em adicao, ha func
oes que sao nao-distribuveis devido a restricoes de licensa.
add_block
dbdown
dbtype
fields
linmod
new_system
sim

7.11

add_line
dbquit
dbup
get_param
mislocked
open_system
simget

applescript
dbstack
delete_block
help
mlock
pack
sldebug

close_system
dbstatus
delete_line
home
mlock
publish
type

dbclear
dbstep
echo
inmem
more
rehash

dbcont
dbstop
edit
keyboard
munlock
set_param

Compiladores Suportados

Compiladores Windows ANSI C e C++


Utilize um dos seguintes compiladores C/C++ 32-bit que criam DLLs 32-bit Windows ou
aplicacoes Windows:
c 2005 G. L. TORRES

CAP
ITULO 7. MATLAB COMPILER

118

Lcc C versao 2.4.1 (includo no MATLAB). Este e um compilador C apenas, ou seja,


nao suporta C++.
Borland C++ versoes 5.5, 5.6 e 5.5 livre.
Microsoft Visual C/C++ versoes 6.0 e 7.1.
Vale ressaltar que o u
nico compilador que suporta a criacao de objetos COM e plug-ins Excel
e o Microsoft Visual C/C++ (versoes 6.0 e 7.1).
Compiladores UNIX ANSI C e C++
O MATLAB Compiler suporta os compiladores nativos nas plataformas Solaris e HP-UX. Nos
sistemas Linux, Linux x86-64 e Mac OS X, o MATLAB Compiler suporta gcc e g++.

7.12

O Processo de Compilac
ao

O processo de criac
ao de componentes de softwares com o MATLAB Compiler e completamente automatico. Por exemplo, para criar uma aplicacao stand-alone, basta voce fornecer
a lista de arquivos-M que constituem a aplicacao. O compilador entao executa as seguintes
operacoes:
Analise de dependencias.
Gerac
ao de c
odigo.
Criac
ao de arquivo.
Compilac
ao.
Linkagem.
An
alise de depend
encias
O primeiro passo determina todas as funcoes nas quais os arquivos-M, os arquivos-MEX e os
arquivos-P (pcode aplicado sobre arquivos-M) dependem. Esta lista inclue nao somente os
arquivos dados como tambem os arquivos que eles chamam, e assim por diante.
Gera
c
ao do c
odigo encapsulador (wrapper)
Este passo gera todo o c
odigo necessario para o componente alvo, incluindo
O c
odigo interface C/C++ para aquelas funcoes-M supridas na linha de comando. Para
bibliotecas e componentes, este arquivo inclue todas as funcoes interface geradas.
Um arquivo de dados de componente que contem informacoes necessarias para executar
o c
odigo-M em tempo de execucao. Estes dados incluem informacao do caminho e chaves
de criptografia necessarias para carregar o codigo-M armazenado nos componentes do
arquivo CTF.
c 2005 G. L. TORRES

7.13. ARQUIVOS DE ENTRADA E DE SA


IDA

119

Cria
c
ao de arquivo
A lista de arquivos executaveis MATLAB (arquivos-M e arquivos-MEX) criados durante a
analise de dependencias e utilizada para criar um arquivo CTF que contem os arquivos necessitados pelo componente para executar apropriadamente no tempo de execucao. Os arquivos
sao criptografados e comprimidos num u
nico arquivo para distribuicao.
Compila
c
ao C/C++
Este passo compila os arquivos C/C++ gerados do codigo wrapper em codigo objeto. Para
alvos que suportam a inclusao de codigo C/C++ suprido pelo usuario na linha de comando
mcc, este c
odigo e tambem compilado neste estagio.
Linkagem
O passo final conecta (linka) os arquivos objetos gerados com as bibliotecas MATLAB necessarias para criar o componente finalizado. Os passos de compilacao C/C++ e conexao usam
o utilitario mbuild que e includo com o compilador MATLAB.

7.13

Arquivos de Entrada e de Sada

7.13.1

Execut
avel Stand-Alone

Neste exemplo, o MATLAB Compiler toma os arquivos foo.m e bar.m como entrada e gera
um executavel stand-alone chamado foo:
>> mcc -m foo.m bar.m
foo main.c

O arquivo fonte C do wrapper principal contendo a funcao main


do programa. A funcao main toma os argumentos de entrada
que sao passados na linha de comando e passa-os como strings
para a funcao foo.

foo mcc component data.c

Arquivo fonte C contendo dados necessitados pelo MCR para


executar a aplicacao. Estes dados incluem informacoes do caminho, chaves de criptografia, e outras informacoes de inicializac
ao
para o MCR.

foo.ctf

O arquivo CTF. Este arquivo contem um arquivo compactado e


criptografado do arquivos-M que constituem a aplicacao (foo.m
e bar.m). Ele tambem contem outros arquivos chamados pelos
dois arquivos arquivos-M principais bem como qualquer outro
conte
udo executavel e arquivos de dados necessarios em tempo
de execucao.

foo

O principal arquivo executavel da aplicacao. Este arquivo ler e


executa o conte
udo armazenado no arquivo CTF. No Windows
este arquivo e foo.exe.
c 2005 G. L. TORRES

CAP
ITULO 7. MATLAB COMPILER

120

7.13.2

Biblioteca Compartilh
avel C

Neste exemplo, o MATLAB Compiler toma os arquivos foo.m e bar.m como entrada e gera
uma biblioteca compartilhada C chamada libfoo:
>> mcc -W lib:libfoo -T link:lib foo.m bar.m
libfoo.c

O arquivo fonte C do wrapper principal contendo as func


oes
exportadas da biblioteca representando a interface C para as
duas funcoes-M (foo.m e bar.m) bem como codigo de inicializacao da biblioteca.

libfoo.h

O arquivo header. Este arquivo e includo por aplicacoes que


chamam as funcoes exportadas de libfoo.

libfoo mcc component data.c Arquivo fonte C contendo os dados necessitados pelo MCR
para inicializar e utilizar a biblioteca. Estes dados incluem
informacao do caminho, chaves de criptografia, e outra inicializacao para o MCR.
libfoo.exports

O arquivo de exportacao usado por mbuild para conectar a


biblioteca.

libfoo.ctf

O arquivo CTF. Este arquivo contem um arquivo compactado


e criptografado dos arquivos-M que constituem a biblioteca
(foo.m e bar.m). Este arquivo tambem contem outros arquivos chamados pelos dois arquivos-M principais bem como
qualquer outro conte
udo executavel e arquivos de dados necessarios em tempo de execucao.

libfoo

O arquivo binario da biblioteca compartilhada. No Windows


este arquivo e libfoo.dll.

7.13.3

Biblioteca Compartilh
avel C++

Neste exemplo, o MATLAB Compiler toma os arquivos foo.m e bar.m como entrada e gera
uma biblioteca compartilhada C++ chamada libfoo:
>> mcc -W cpplib:libfoo -T link:lib foo.m bar.m
libfoo.cpp

O arquivo fonte C++ do wrapper principal contendo as


funcoes exportadas da biblioteca representando a interface
C++ para as duas funcoes-M (foo.m e bar.m) bem como
codigo de inicializacao da biblioteca.

libfoo.h

O arquivo header do wrapper da biblioteca. Este arquivo e


includo por aplicacoes que chamam as funcoes exportadas
de libfoo.

libfoo mcc component data.cpp Arquivo fonte C++ contendo os dados necessitados pelo
MCR para inicializar e usar a biblioteca. Estes dados incluem informacao do caminho, chaves de criptografia, e
outra inicializacao para o MCR.
libfoo.exports

O arquivo de exportacao usado por mbuild para conectar


a biblioteca.
c 2005 G. L. TORRES


7.14. PROCESSO DE DISTRIBUIC
AO

121

libfoo.ctf

O arquivo CTF. Este arquivo contem um arquivo compactado e criptografado dos arquivos-M que constituem a
biblioteca (foo.m e bar.m). Este arquivo tambem contem
outros arquivos chamados pelos dois arquivos arquivos-M
principais bem como qualquer outro conte
udo executavel
e arquivos de dados necessarios em tempo de execucao.

libfoo

O arquivo binario da biblioteca compartilhada. No Windows este arquivo e libfoo.dll.

7.14

Processo de Distribuic
ao

Apos criar seu componente com o MATLAB Compiler voce pode distribu-lo para terceiros de
forma que eles possam usa-lo nas suas maquinas, independente de terem o MATLAB instalado
ou nao. O processo de distribuic
ao requer que voce:
Junte num pacote os componentes necessarios dependendo do tipo de aplicacao gerada.
Distribua-os para os usuarios finais.
Faca com que os usuarios finais instalem nas suas maquinas o pacote distribudo. Durante
esta fase do processo de instalacao, cada usuario executa o MCRInstaller uma vez na
sua maquina alvo, ou seja, a maquina onde ele ira executar a aplicacao ou biblioteca.
No Windows, MCRInstaller e um executavel auto-extravel que instala os componentes
necessarios para executar a aplicacao. No UNIX, MCRInstaller e um arquivo ZIP.

7.14.1

Portando o C
odigo Gerado para uma Plataforma Diferente

Uma vez que formatos binarios sao diferentes em cada plataforma, os varios componentes
gerados pelo MATLAB Compiler nao podem ser movidos de uma plataforma para outra da
forma que se encontra. Voce pode distribuir uma aplicacao gerada no MATLAB Compiler
para qualquer maquina alvo que tem o mesmo sistema operacional que a maquina onde a
aplicacao foi compilada.
Para distribuir uma aplicac
ao para uma maquina cujo sistema operacional nao e o mesmo da
maquina usada no desenvolvimento da aplicacao requer uma recompilacao, ou seja, voce deve
recompilar a aplicac
ao na plataforma alvo desejada. Por exemplo, se voce deseja distribuir
a aplicac
ao que foi desenvolvida numa maquina Windows para uma maquina Linux, ent
ao
voce deve usar o MATLAB Compiler numa maquina Linux e reconstruir por completo a
aplicacao. Consequentemente voce deve ter uma licensa do MATLAB Compiler valida para
cada plataforma.

7.14.2

Trabalhando com o MCR

Antes que um usuario possa executar na sua maquina os componentes que foram gerados no
MATLAB Compiler, ele precisa instalar o MCR, se este ja nao estiver presente. Embora os
usuarios precisam instalar o MCR nas suas maquinas apenas uma vez, o MCR e especfico
da versao do MATLAB Compiler utilizada. Assim, os usuarios finais devem ter a versao
apropriada do MCR instalada nas suas maquinas.
Para preparar uma maquina para receber uma distribuicao para a plataforma Windows, o
usuario precisa apenas instalar o MCR, executando o arquivo MCRInstaller.exe. O usuario
c 2005 G. L. TORRES

CAP
ITULO 7. MATLAB COMPILER

122

deve ter privilegios administrativos para instalar o MCR na maquina, uma vez que a instalac
ao
faz modificac
oes do registro do sistema e do caminho do sistema. Entretanto, a execucao do
aplicativo apos o MCR ter sido apropriadamente ajustado na maquina alvo requer apenas
privilegios a nvel de usuario.
No caso da plataforma UNIX, os usuarios UNIX devem:
Instalar o MCR.
Ajustar o caminho apropriadamente.
Ajustar as variaveis do ambiente necessarias.
Usuarios UNIX devem executar o MCRInstaller, o qual e um arquivo ZIP, e entao manualmente ajustar o caminho e variaveis ambientes como requerido. Lembrar que o arquivo
MCRInstaller.zip e gerado usando a funcao buildmcr no MATLAB. Nao e preciso instalar
o MCR na maquina que tem instalada a mesma versao do MATLAB que foi usada para criar
o componente distribuido.
O MCRInstaller suporta a instalacao de m
ultiplas versoes do MCR numa m
aquina alvo.
Isto permite que aplicac
oes compiladas com versoes diferentes do MCR executem lado a lado
na mesma maquina.
Os usuarios devem sempre executar suas aplicacoes compiladas com a versao correspondente
do MCR. Se voce atualizar o MATLAB Compiler na sua maquina de desenvolvimento e
distribuir a aplicac
ao compilada para seus usuarios, voce devera tambem distribuir a versao
correspondente do MCR. Os usuarios devem atualizar suas MCRs para a nova versao.

7.14.3

Distribuindo uma Aplicac


ao Stand-Alone num Driver de Rede

Voce pode distribuir uma aplicac


ao stand-alone compilada para um driver de rede de forma
que aplicac
ao pode ser acessada por todos os usuarios da rede sem que eles tenham que instalar
o MCR nas sua maquinas pessoais:
Em qualquer maquina Windows, execute MCRInstaller.exe para instalar o MCR.
Copie todo o diretorio MCR (o diretorio onde o MCR esta instalado) num driver de rede.
Copie a aplicac
ao compilada num diretorio separado e adicione o caminho
<mcr_root>\<ver>\runtime\<arch>
para todas as maquinas clientes. Todos os usuarios da rede podem executar a aplicac
ao.
Se voce esta utilizando seja o MATLAB Builder for COM ou o MATLAB Builder for Excel,
voce precisa registrar as seguintes DLLs em toda maquina cliente:
mwcommgr.dll
mwcomutil.dll
Para registrar as DLLs, na linha de comando do DOS entre
regsvr32 <nomedll>
Estas DLLs estao localizadas em <mcr_root>\<ver>\runtime\<arch>.
c 2005 G. L. TORRES

7.15. TRABALHANDO COM MCC

7.15

123

Trabalhando com mcc

mcc e o comando MATLAB que invoca o MATLAB Compiler. Voce pode invocar o comando
mcc seja da linha de comando do MATLAB ou da linha de comando do sistema operacional.
Voce pode especificar uma ou mais flags de opcoes do MATLAB Compiler para o mcc. Voce
pode listar as opc
oes separadamente, como no exemplo
>> mcc -m -g minhafuncao
Macros sao opc
oes do MATLAB Compiler supridas pela MathWorks que simplificam as tarefas
de compilac
ao mais comuns. Em vez de agrupar manualmente varias opcoes juntas para
executar um tipo particular de compilacao, voce pode utilizar uma simples opcao macro.
Voce pode agrupar opc
oes que nao tomam argumentos precedendo a lista de flags com um
hfen, como no exemplo
>> mcc -mg minhafuncao
Opcoes que tomam argumentos nao podem ser combinadas a menos que voce coloque a opc
ao
com seus argumentos por u
ltimo na lista, como no exemplo
>> mcc -v -W main -T link:exe minhafuncao
>> mcc -vW main -T link:exe minhafuncao
Ja o formato abaixo nao e valido
>> mcc -Wv main -T link:exe minhafuncao
Em casos onde voce tem mais de uma opcao que tem argumentos, voce pode incluir apenas
uma dessas opc
oes numa lista combinada e essa opcao deve ser a u
ltima. Voce pode colocar
m
ultiplas listas combinadas na linha de comando do mcc.

7.15.1

Usando Arquivos de Encapsulamento (Wrapper)

Arquivos wrapper encapsulam os arquivos-M da sua aplicacao com uma interface que abilita os
arquivos-M a operarem num dado ambiente. Para prover a interface requerida, o encapsulador
Executa inicializac
ao e terminacao especficas do encapsulador.
Prover o despacho de chamadas de funcoes para o MCR.
Para especificar o tipo de encapsulador a gerar, use a sintaxe
-W <tipo>
A opcao -W main gera encapsuladores que sao adequados para construir aplicacoes stand-alone.
A opc
ao -l, ou sua equivalente -W lib:libname, produz um arquivo encapsulador de
biblioteca C. Esta opc
ao produz uma biblioteca compartilhada de um conjunto arbitrario de
arquivos-M. O arquivo header gerado contem uma declaracao de funcao C para cada uma
das func
oes-M compiladas. A lista de exportacao contem o conjunto de smbolos que sao
exportados da biblioteca C compartilhada.
A opc
ao -W cpplib:libname produz o arquivo encapsulador de uma biblioteca C++. Esta
opcao permite a inclusao de um conjunto arbitrario de arquivos-M numa biblioteca. O arquivo
header gerado contem todos os pontos de entrada para todas as funcoes-M compiladas.
c 2005 G. L. TORRES

CAP
ITULO 7. MATLAB COMPILER

124

7.15.2

Chamando Func
oes Matlab do C ou C++

Para habilitar um programa C ou C++ a chamar uma funcao MATLAB diretamente, voce
deve escrever um encapsulador arquivo-M em torno de cada funcao MATLAB que voce deseja
acessar de fora do MATLAB. Isto e necessario porque nao ha qualquer interface C para func
oes
MATLAB. Por exemplo, para usar a funcao magic numa aplicacao independente, voce pode
utilizar este arquivo-M:
function magicsquare(n)
%MAGICSQUARE generates a magic square matrix of the size specified
%
by the input parameter n.
% Copyright 2003 The MathWorks, Inc.
if (ischar(n))
n=str2num(n);
end
magic(n)

7.15.3

Chamando uma Func


ao da Linha de Comando

Voce pode tornar uma func


ao MATLAB num executavel que e diretamente chamavel da linha
de comando do sistema. Todos os argumentos passados para a funcao MATLAB da linha de
comando do sistema sao strings. Duas tecnicas para trabalhar com estas funcoes sao:
Modifique a func
ao MATLAB original para testar cada argumento e converter strings
para n
umeros.
Escrever uma func
ao MATLAB encapsuladora que faz este teste e entao chama a func
ao
MATLAB original. Por exemplo,
function x = foo(a, b)
if (isstr(a)),
a = str2num(a);
end
if (isstr(b))
b = str2num(b)
end
% O resto do seu codigo-M aqui ...
Voce apenas faz isso se sua funcao espera entrada numerica. Se sua funcao espera strings,
nao ha nada a fazer porque este e o default da linha de comando.

7.15.4

Usando Arquivos-MAT em Aplicac


oes Independentes

Para utilizar um arquivo-MAT numa aplicacao, use a opcao -a do MATLAB Compiler para
incluir o arquivo-MAT no arquivo CTF.
c 2005 G. L. TORRES

7.15. TRABALHANDO COM MCC

7.15.5

125

Executando as Aplicac
oes

Se voce utiliza um caminho relativo para iniciar uma aplicacao de um diretorio que nao e o
seu diretorio de trabalho, ent
ao pode haver falha. Por exemplo, se voce executa sua aplicac
ao
usando
..\myProgram.exe
voce pode ver o erro
Cannot find the directory containing the myProgram component,
which is required by this application. Make sure the directory
containing myProgram.ctf is on your dynamic load library path
(PATH on Windows, or LD_LIBRARY_PATH on Linux, for example), or
your application search path (PATH on both Windows and Linux).
Error initializing CTF Archive.
Usar um caminho relativo nao e suportado diretamente. Quando voce inicia um programa de
um diretorio usando um caminho relativo, seu diretorio de trabalho atual nao e o diretorio do
executavel. O diretorio de trabalho deve ser o mesmo que o do executavel para que o arquivo
CTF seja encontrado ou senao o diretorio contendo seu arquivo CTF deve estar no caminho
do sistema. Portanto, voce deve iniciar sua aplicacao do seu diretorio ou senao modificar o
caminho do seu sistema.

7.15.6

Passando Argumentos Para e De uma Aplicac


ao

Para passar argumentos de entrada para um codigo gerado pelo MATLAB Compiler, voce
passa-os exatamente como numa aplicacao tipo console. Por exemplo, para passar um arquivo
chamado arquivo para a func
ao compilada chamada programa, use
programa arquivo
Para passar n
umeros ou letras (por exemplo, 1, 2, e 3), use
programa 1 2 3
Nao separe os argumentos com vrgulas. Para passar matrizes como entrada, use
programa "[1 2 3]" "[4 5 6]"
Voce deve utilizar aspas em torno de um argumento de entrada se ha espaco nele. A sintaxe
de chamada e similar ao comando DOS.
Ha varias aspectos que voce deve ter em mente para o seu arquivo-M antes que voce o
compile:
Os argumentos de entrada que voce passa para o seu executavel da linha de comando do
sistema sao considerados como string. Se, no seu codigo-M antes da compilacao, voce
esta esperando os dados em formato diferente, digamos double, voce precisara converter
a entrada string para o formato requerido. Por exemplo, voce pode usar str2num para
converter a entrada string para dado numerico. Voce pode determinar em tempo-deexecuc
ao se e para fazer isso ou nao usando a funcao isdeployed. Se o seu arquivo-M
espera entradas numericas no MATLAB, o codigo pode verificar se esta sendo executado
como uma aplicac
ao stand-alone. Por exemplo,
c 2005 G. L. TORRES

CAP
ITULO 7. MATLAB COMPILER

126

function myfun (n1, n2)


if (isdeployed)
n1 = str2num(n1);
n2 = str2num(n2);
end
Voce nao pode retornar valores de sua aplicacao stand-alone para o usuario. A u
nica
maneira para retornar valores de codigo compilado e exib-lo na tela ou armazena-lo
num arquivo. Para exibir na tela, voce precisa eliminar o ponto-e-vrgula dos comandos
cujos resultados produzem dados que voce deseja retornar para a tela, ou usar o comando
disp para exibir o valor. Voce pode entao redirecionar estas sadas para outras aplicac
oes
usando redirecionamento de sada (operador >) ou pipes (UNIX apenas).

c 2005 G. L. TORRES

Ap
endice

C
alculo de Fluxo de Pot
encia

A.1

Introdu
c
ao

Neste captulo, ilustramos os recursos e a facilidade da programacao em MATLAB atraves do


desenvolvimento de um programa de calculo de fluxo de potencia em redes eletricas.
O objetivo principal dos estudos de fluxo de potencia e determinar as condicoes de operac
ao
do sistema eletrico, ou seja, determinar as tensoes e potencias em todas as barras do sistema,
de forma que a demanda de potencia seja atendida em nveis de tensoes adequados.
A modelagem da rede eletrica e estatica, ou seja, a rede e representada por um conjunto
de equac
oes e inequac
oes algebricas (nao ha equacoes diferenciais na formulacao). A analise
da rede e estatica. Em outras palavras, para uma certa alteracao na rede, so ha interesse nas
condicoes de operac
ao antes e depois da alteracao, nao importando a trajetoria seguida entre
os dois pontos.
As aplicac
oes dos programas de fluxo de potencia sao diversas, tanto no planejamento
da expansao do sistema quanto no planejamento da operacao. Exemplo de uma aplicac
ao
na operac
ao e na analise de seguranca. Na analise de seguranca, varias contingencias sao
simuladas e o estado de operac
ao da rede apos a contingencia deve ser obtido. Eventuais
violacoes dos limites de operac
ao sao detectados e acoes de controle corretivo e/ou preventivo
sao determinadas.
No planejamento da expansao, novas configuracoes da rede sao determinadas para atender
ao aumento da demanda, e o estado de operacao da rede para a nova configuracao deve ser
obtido.
127

APENDICE
A. CALCULO
DE FLUXO DE POTENCIA

128

A.2

Formulac
ao B
asica

As equac
oes basicas do problema de fluxo de potencia sao obtidas, considerando-se a analise
nodal, impondo-se a conservac
ao das potencias ativa e reativa em cada barra do sistema, como
uma consequencia das leis de Kirchhoff. Da analise nodal, temos a equacao de rede:
b
b b
Y11 Yb12 Yb1n
V1
I1
Yb21 Yb22 Yb2n Vb2 Ib2


.
. =.
..
..
..
..
.
.
. .. ..
Ybn1 Ybn2 Ybnn
Vbn
Ibn

ou simplesmente

Yb Vb = Ib

onde Ib e o vetor das injec


oes lquidas de corrente nas barras, Vb e o vetor das tensoes complexas
b
de barra, e Y e a matriz admitancia de barra. Da teoria basica de circuitos, temos que os
elementos de Yb sao definidos por
Ybii =

X 1
zbij
jI

1
Ybij =
zbij

onde zbij e a impedancia do elemento ligando as barras i e j, e I e o conjunto dos ndices das
barras diretamente conectadas a barra i, incluindo a propria barra i. Identificando-se as partes
real e imaginaria da injec
ao de potencia complexa na barra i:
X
Ybij Vbj
(A.1)
Sbi = Vbi Ibi = Vbi
jI

obtemos as injec
oes de potencia ativa e reativa na barra, como
X
Vj (Gij cos(i j ) + Bij sin(i j ))
Pi = Vi

(A.2)

Vj (Gij sin(i j ) Bij cos(i j ))

(A.3)

jI

Q i = Vi

X
jI

onde Vi e i sao, respectivamente, a magnitude e o angulo de fase da tensao complexa Vbi =


Vi eji , Gij e o elemento ij da matriz condutancia de barra G, e Bij e o elemento ij da matriz
susceptancia de barra B.
O problema de fluxo de potencia e o de calcular as magnitudes das tensoes V e os angulos
de fase tais que as potencias calculadas em (A.2) e (A.3), para i = 1, 2, . . . , n, satisfacam o
balanco de potencias nas barras:
Pi (V, ) = PiG PiD = Pidef

D
def
Qi (V, ) = QG
i Qi = Qi

onde PiG e QG
ao potencias geradas e PiD e QD
ao potencias de cargas (demandas).
i s
i s
A definic
ao completa dos fluxos de potencia atraves dos elementos do sistema requer o
conhecimento de quatro variaveis em cada barra do sistema. Duas delas sao conhecidas de
c 2005 G. L. TORRES

PELOS METODOS

A.3. SOLUC
AO
DE GAUSS E DE GAUSS-SEIDEL

129

antemao, e o objetivo do c
alculo de fluxo de potencia e determinar as duas variaveis restantes.
Dependendo de quais sao as duas variaveis conhecidas, geralmente classificamos as barras do
sistema em tres tipos diferentes1 , a saber:
PQ

dados Pi e Qi e desconhecidos Vi e i .

PV

dados Pi e Vi e desconhecidos Qi e i .

dados Vi e i e desconhecidos Pi e Qi .

As barras tipo PQ e PV representam as barras de carga e as barras de tensao-controlada,


respectivamente. A barra tipo V e a barra de balanco ou barra de referencia, e tem papel especial na formulac
ao. Ela serve como a referencia angular para as barras restantes, usualmente
V = 0 , e tambem fecha o balanco da potencia ativa, uma vez que as perdas do sistema nao
sao conhecidas de antemao.
Para um sistema CA simples, precisamos resolver o conjunto de equacoes nao lineares:
X
Vj (Gij cos(i j ) + Bij sin(i j )) = 0
(A.4)
Pidef Vi
jI

para as barras tipo PQ e PV, e


X
Vj Gij sin(i j ) Bij cos(i j )) = 0
Qdef
i Vi

(A.5)

jI

para as barras tipo PQ, onde Pidef e Qdef


sao os valores especificados de injecoes de potencia
i
ativa e reativa, respectivamente, para a barra i. As equacoes (A.4) e (A.5) sao altamente nao
lineares devido aos termos seno e cosseno, e sao conhecidas como as equacoes de resduos de
potencia. Ha um segundo conjunto de equacoes que deve ser resolvido:
X
Vj (Gij sin(i j ) Bij cos(i j ))
(A.6)
Q i = Vi
jI

para as barras tipo V e PV, e


X
Vj (G1j cos(1 j ) + B1j sin(1 j ))
P1 = V1

(A.7)

jI

a potencia ativa injetada na barra de referencia, considerada aqui, sem perda de generalidade,
como sendo a Barra 1. As Equacoes (A.6) e (A.7) sao avaliadas por aplicacao direta das
tensoes e dos
angulos calculados. As potencias reativas calculadas em (A.6) sao comparadas
com limites de operac
ao que sao impostos. Se o limite de potencia reativa em uma barra tipo
PV esta sendo violado, esta barra passa a ser considerada como uma barra tipo PQ, com o
valor de potencia reativa especificado sendo o do limite violado.

A.3

Soluc
ao pelos M
etodos de Gauss e de Gauss-Seidel

Os metodos de Gauss e de Gauss-Seidel iteragem sobre a seguinte variacao da Equacao (A.1)


da potencia complexa:


n
X
1 Sbi
b
b
b

Yij Vj
Vi =
Ybii Vb
i

k=1,k6=i

=b
hi (Vb1 , Vb2 , . . . , Vbn )

Alguns controles sobre a maneira como o sistema opera pode requerer outras definic
oes de tipos de barras
c 2005 G. L. TORRES

APENDICE
A. CALCULO
DE FLUXO DE POTENCIA

130

O processo iterativo do metodo de Gauss e como segue:


a) Faca k = 0 e escolha a estimativa inicial Vbi0 = 10 para as tensoes
complexas de nos do sistema.

b) Calcule

Vbik+1 = Vbik (Vb k b


hi (Vb1k , Vb2k , . . . , Vbnk ))

onde k (0, 1] e o comprimento de passo escolhido de forma tal que


maxi |Vbik+1 Vbik | seja sempre reduzido.

c) Se as tensoes complexas Vbk+1 satisfazem o teste


max |Vbik+1 Vbik |
i

onde e uma pequena tolerancia, entao PARE. Senao, retorne para o


passo (b).
Algoritmo A.1: Calculo de fluxo de potencia pelo metodo de Gauss.
O processo iterativo do metodo de Gauss-Seidel e como segue:
a) Faca k = 0 e escolha a estimativa inicial Vbi0 = 10 para as tensoes
complexas de nos do sistema.

b) Calcule

k+1 b k
Vbik+1 = Vbik (Vb k b
hi (Vb1k+1 , . . . , Vbi1
, Vi , . . . , Vbnk ))

onde k (0, 1] e o comprimento de passo escolhido de forma tal que


maxi |Vbik+1 Vbik | seja sempre reduzido.

c) Se as tensoes complexas Vbk+1 satisfazem o teste


max |Vbik+1 Vbik |
i

onde e uma pequena tolerancia, entao PARE. Senao, retorne para o


passo (b).
Algoritmo A.2: Calculo de fluxo de potencia pelo metodo de Gauss-Seidel.
Com relac
ao a escolha de k , tipicamente, para cada iteracao, comecamos com k = 1 e
reduzimos k pela metade ate que maxi |Vbik+1 Vbik | seja menor do que maxi |Vbik Vbik1 |.

A.4

O M
etodo de Newton-Raphson

O metodo de Newton-Raphson opera sobre as equacoes de balanco das potencias ativa e reativa
nas barras, em vez da equac
ao da potencia complexa. No problema de fluxo de carga, desejamos
resolver as equac
oes nao-lineares (A.4) e (A.5) para as magnitudes das tensoes das barras PQ
e para os
angulos de fase das barras PQ e PV. Esse problema consiste em determinar as razes
c 2005 G. L. TORRES


A.4. O METODO
DE NEWTON-RAPHSON

131

das equac
oes nao-lineares


  def  
  
P
P
P (V, )
0
=

=
.
def
Q
Q
Q(V, )
0

Na iterac
ao k, o metodo de Newton-Raphson requer a solucao do sistema linear:


 

Hk Nk k
Pk
=
Mk Lk Vk
Qk

(A.8)

(A.9)

onde
k
Hij

Nijk =
Mijk =
Lkij =

(

Vik Vjk (Gij sin(ik jk ) Bij cos(ik jk ))
se i 6= j
Pi
=

j (Vk ,k )
Qki (Vik )2 Bii
se i = j
(

Vik (Gij cos(ik jk ) + Bij sin(ik jk ))
se i 6= j
Pi
=

k
k
k
Vj (V~k ,~k )
Pi /Vi + Vi Gii
se i = j
(

Vik Vjk (Gij cos(ik jk ) + Bij sin(ik jk ))
se i 6= j
Qi
=

k
k
2
j (V~k ,~k )
Pi (Vi ) Gii
se i = j
(

Vik (Gij sin(ik jk ) Bij cos(ik jk ))
se i 6= j
Qi
=

k
k
k
Vj (Vk ,k )
Qi /Vi Vi Bii
se i = j.

a) Faca uma escolha inicial das magnitudes e dos angulos de fase das tensoes
de barra (tipicamente, Vi0 = 1 e i0 = 0.)
b) Calcule os resduos de potencia ativa nas barras PQ e PV, e de potencia
reativa nas barras PQ:

  def  

Pk
P
P (Vk , k )
=

Qdef
Qk
Q(Vk , k )
Pare o processo iterativo se o teste abaixo e satisfeito:
max |Pik | ,

max |Qki | .

c) Forme o sistema linear




H k Nk
Mk Lk



 

k
Pk
=
Vk
Qk

e resolva para as correcoes k e Vk .


d) Obtenha uma nova estimativa para a solucao como
k+1 = k + k ,

Vk+1 = Vk + Vk .

Faca k k + 1 e retorne para o passo (b).


Algoritmo A.3: Calculo de fluxo de potencia pelo metodo de Newton.
c 2005 G. L. TORRES

(A.10)
(A.11)
(A.12)
(A.13)

APENDICE
A. CALCULO
DE FLUXO DE POTENCIA

132

Uma vez conhecidos as magnitudes e os angulos de fase das tensoes, os fluxos de potencia
ativa e reativa nos elementos de transmissao podem ser determinados por:
Pij = gij Vi2 Vi Vj (gij cos(i j ) bij sin(i j ))

Qij = (bij +

2
bsh
ij )Vi

+ Vi Vj (bij cos(i j ) gij sin(i j ))

(A.14)
(A.15)

no caso de linhas de transmissao, ou por


Pij = t2ij gij Vi2 tij Vi Vj (gij cos(i j ) bij sin(i j ))

Qij =

t2ij bij Vi2

+ tij Vi Vj (bij cos(i j ) gij sin(i j ))

(A.16)
(A.17)

no caso de transformadores.

A.5

Programa de Fluxo de Pot


encia em Matlab

A distribuic
ao do c
odigo MATLAB deste programa e restrita, podendo uma copia ser obtida
ou nao mediante contato direto com o autor (Prof. Geraldo L. Torres, gltorres@ufpe.br).

c 2005 G. L. TORRES

Refer
encias

[1] The MathWorks Inc., MATLAB : Users Guide, Prentice-Hall, 1995.


[2] D. J. Higham and N. J. Higham, Matlab Guide, SIAM, 2000.
[3] P. Marchand and O. T. Holland, Graphics and GUIs with MATLAB, Chapman &
Hall/CRC, 2003.
[4] A. Monticelli, Fluxo de Carga em Redes de Energia Eletrica, Editora Edgard Bl
ucher LTDA,
1983.

133

Вам также может понравиться