Anda di halaman 1dari 255

THOIV'ISON

\,
Progra1nação e1n MATLAB®
l]XDfiJffi ~rfilIB@@J])@DI:P®~

Stephen J. Chapman
BAE SYSTEMS Austrália

Dadoe Internacionais de Catalogação na Publicação (Clt>}


{Câmara Brasileira de Livro, SP, Brasil)

Tradução Técnica:
Flávio Soares Correa da Silva
1,111•J! :,rnrn1r,q
1 PhD em Inteligência Artificial pela Univcrsity of Edinburgh,
livre-docente e professor associado do Depto. de Ciência da

__J 1
1.
MA.TLAB 1.
irndlise
Titulo.
Computação, Instituto de Matemática e Estatística da USP

03-19JS CDD-519. 40285512

Índices para catálogo sistemático:


,\nâl isc numé-rir:a ;-;plicaçao de i-V\TLAB
s t 9. 402e':i:.> 11 THOIVISC>N

51'.J.4028:J::>JJ

Austràha Brasil Canadá Cingapura Espanha Estados Unidos Méiuco Reino Unido
THOIVISON

Gerente Editorial: Título Original: Revisão:


Adilson Pereira MATLAB® Programming for Fernanda Almeida Umile e
Engineers Maria Alice da Costa
Editora de Desenvolvimento:
Eugênia Pessotti Tradução Técnica: Composição:
Flávio Soares Correa da Silva Segmento & Co. Produções
Produtora Editorial: Gráficas Ltda.
Ada Santos Seles Copidesque:
Glauco Peres Damas Capa:
Produtora Gráfica: Lummi Produção Visual e
Patricia La Rosa Assessoria Ltda.

© Copyright 2002 by Todos os direitos reservados. Dados Internacionais de


Brooks/Cole 21h edition Nenhuma parte deste livro Catalogação na Publicação
© Copyright 2003 para a Língua poderá ser reproduzida sejam (CIP)
Portuguesa adquirido por Pioneira quais forem os meios (Cãmara Brasileira de livro, SP,
Thomson Learning Ltda., uma empregados sem a permissão, Brasil)
divisão da Thomson Learning, por escrito, da Editora. Chapman, Stephen J.
lnc. Thomson Learning ™ é uma Aos infratores aplicam-se as Programação em MATLAB® para
marca registrada aqui utilizada sanções previstas nos artigos engenheiros/ Stephen J. Chapman ;
sob licença. 102, 104, 106 e 107 da tradução técnica Flávio Soares
Lei n, 9.610, de 19 de fevereiro Correa da Silva. -· São Paulo :
Impresso no Brasil. de 1998. Pioneira Thomson Learning, 2003.
)f Printed in Brazil.
h 1 2 3 4 05 04 03
Título original: MATLAB®
programming for engineers. f
ISBN: 85-221-0325-9
JI Rua Traipu, 114 - 3o andar
Perdizes - CEP 01235-000 1. Análise numérica -
'-
São Paulo - SP Processamento de dados
Tel.: (11) 3665-9900 2. MATLAB 1. Título.
Fax: (11) 3665-9901 03-1935 CDD-519.40285513
sac@thomsonlearning.com.br Índices para catálogo Este livro é dedicado a minha esposa Rosa,
sistemático:
www.thomsonlearning.com .br
1. Análise numérica : Aplicação
após 25 anos maravilhosos juntos.
de MATLAB 519.40285513
2. MATLAB: Aplicação em
análise numérica 519.40285513
( i

J i

'11

.,n ., ..; ..

Sumário

Prefácio xv

. '!"\:,' '.}
1 Introdução ao MATLAB
1.1 Vantagens do MATLAB 1
1.2 Desvantagens do MATLAB 3
1.3 O Ambiente MATLAB 3
1.3.1 A Área de Trabalho MATLAB 4
1.3.2 A Janela de Comandos 4
1.3.3 A Janela de Histórico de Comandos 7
1.3.4 O Espaço de Lançamento 7
1.3.5 A Janela de Edição/ Depuração 8
1.3.6 Janela de Figuras 9

,,
'"
1,
i

1
1.3.7 O Espaço de Trabalho MATLAB 10
1.3.8 O Navegador do Espaço de Trabalho 11
1.3.9 Obtendo Ajuda 13
1.3.10 Alguns Comandos Importantes 14
1.3.11 O Caminho de Busca MATLAB 15
1
1.4 Utilizando o MATLAB como Prancheta de Rascunhos 16
1.5 Resumo 18
1.5.1 Resumo do MATLAB 19
1.6 Exercícios 19

2 MATLAB Básico 21
2.1 Variáveis e Matrizes 21
2.2 Iniciando Variáveis no MATLAB 24
Viii I Programação em MATIAS® para Engenheiros
Sumário I ix

2.2.1 Iniciando Variáveis em Expressões de Atribuição 25 3.3.3 Operadores Lógicos 88


2.2.2 Iniciando com Expressões de Atalho 27 3.3.4 Funções Lógicas 90
2.2.3 Iniciando com Funções Predefinidas 28 3.4 Ramificações 92
2.2.4 Iniciando Variáveis com Entrada pelo Teclado 29 3.4.1 A Estrutura i f 92
2.3 Matrizes Multidimensionais 31 3.4.2 Exemplos de Utilização de Estruturas i f 94
2.3.1 Armazenando Matrizes Multidimensionais em Memória 32 3.4.3 Notas a Respeito do Uso de Estruturas i f 100
2.3.2 Acessando Matrizes Multidimensionais com um Único Subscript 33 3.4.4 A Estrutura swi tch 102
2.4 Submatrizes 34 3.4.5 A Estrutura try / ca tch 104
2.4.1 A Função end 35 3.5 Características Adicionais de Diagramas 106
2.4.2 Utilizando Submatrizes no Lado Esquerdo de uma Declaração de 3.5.1 Controlando os Limites nos Diagramas dos Eixos x e y 106
Atribuição 35 3.5.2 Desenhando Múltiplos Diagramas sobre os Mesmos Eixos 109
2.4.3 Atribuindo um Escalar a uma Submatriz 37 3.5.3 Criando Múltiplas Figuras 109
2.5 Valores Especiais 37 3.5.4 Subdiagramas 110
2.6 Exibindo Dados de Saída 39 3.5.5 Controle Avançado de Linhas Desenhadas 111
2.6.1 Alterando o Formato-Padrão 39 3.5.6 Controle Avançado de Cadeias de Texto 113
2.6.2 A Função disp 40 3.5.7 Diagramas Polares 113
2.6.3 Saída Estruturada Usando a Função fprintf 40 3.5.8 Anotando e Armazenando Diagramas 121
2.7 Arquivos de Dados 42 3.6 Notas Adicionais a Respeito da Depuração de Programas MATLAB 123
3.7 Resumo 126
2.8 Operações com Escalares e Matrizes 44
3.7.1 Resumo de Bqas Práticas de Programação 127
2.8.1 Operações com Escalares 45
3.7.2 Resumo do MATLAB 127
2.8.2 Operações com Matrizes 45 3.8 Exercícios 128
• 1 2.9 Hierarquia de Operações 48
1
2.10 Funções Predefinidas MATLAB 51 4 Laços 135
2.10.1 Resultados Opcionais 51 4.1 O Laço while 135
2.10.2 Utilizando Funções MATLAB com Matrizes como Entrada 52 4.2 O Laço for 141
2.10.3 Funções MATLAB Comuns 52 4.2.1 Detalhes de Operação 148
2.11 Introdução a Diagramas 52 4.2.2 As Expressões break e continue 152
2.11.1 Utilizando Diagramas xy Simples 54 4.2.3 Laços Aninhados 153
.,, 2.11.2 Imprimindo um Diagrama 55 4.3 Matrizes Lógicas e Vetorização 155
1
2.11.3 Diagramas Múltiplos 56 4.3.1 A Importância das Matrizes Lógicas 156
2.11.4 Cores de Linhas, Estilos de Linhas, Estilos de Marcadores e Legendas 56 4.3.2 Criando o Equivalente a Estruturas if / els e com Matrizes Lógicas 159
2.11.5 Escalas Logarítmicas 58 4.4 Exemplos Adicionais 161
2.12 Exemplos 59 4.5 Resumo 176
2.13 Depurando Programas MATLAB 67 4.5.1 Resumo de Boas Práticas de Programação 176 1
,,_ 2.14 Resumo 69 4.5.2 Resumo do MATLAB 176
1
i 2.14.1 Resumo de Boas Práticas de Programação 69 4.6 Exercícios 177
2.14.2 Resumo do MATLAB 70
2.15 Exercícios 72 5 Funções Definidas pelo Usuário 185
5.1 Introdução a Funções MATLAB 186
5.2 Passagem de Variáveis em MATLAB: O Esquema de Passagem por Valor 192
3 Expressões de Ramificação e Projeto de Programa 79
5.3 Argumentos Opcionais 202
3.1 Introdução a Técnicas de Projeto Top-Down 79
5.4 Compartilhando Dados pelo Uso de Memória Global 207
3.2 Uso de Pseudocódigo 84
5.5 Preservando Dados Entre Chamadas de uma Função 215
3.3 Operadores Relacionais e Lógicos 85
5.6 Funções de Funções 220
3.3.1 Operadores Relacionais 85 5.7 Subfunções e Funções Privadas 224
3.3.2 Nota de Atenção a Respeito dos Operadores == e - = 87 5.8 Resumo 226
X 1 Programaçao em MAi lAl§B! para Engenheiros Sumário J •I

5.8.1 Resumo de Boas Práticas de Programação 226 7.3 Matrizes Estruturas 304
5.8.2 Resumo do MATLAB 227 7.3.1 Criando Estruturas 304
5.9 Exercícios 228 7.3.2 Adicionando Campos a Estruturas 306
7.3.3 Removendo Campos de Estruturas 307
6 Dados Complexos, Dados de Caracteres e 1ipos Adicionais de Diagramas 239 7.3.4 Usando Dados em Matrizes Estruturas 308
6.1 Dados Complexos 239 7.3.5 As Funções getfield e setfield 309
6.1.1 Variáveis Complexas 241 7.3.6 Usando a Função size com Matrizes Estruturas 310
6.1.2 Usando Números Complexos com Operadores Relacionais 242 7.3.7 Aninhando Matrizes Estruturas 310
6.1.3 Funções Complexas 242 7.3.8 Resumo das Funções structure 311
6.1.4 Colocando Dados Complexos em Diagramas 246 7.4 Resumo 312
6.2 Funções de Cadeias de Caracteres 250 7.4.1 Resumo de Boas Práticas de Programação 313
6.2.1 Funções de Conversão de Cadeias de Caracteres 250 7.4.2 Resumo do MATLAB 313
6.2.2 Criando Matrizes Bidimensionais de Caracteres 250 7.5 Exercícios 314
6.2.3 Concatenação de Cadeias de Caracteres 251
6.2.4 Comparação de Cadeias de Caracteres 252 8 Funções de Entrada/Saída 317
6.2.5 Busca/Substituição de Caracteres Dentro de uma Cadeia 254 8.1 A Função textread 317
6.2.6 Conversão para Maiúscula e Minúscula 256 8.2 Mais Informações sobre os Comandos load e save 319
6.2.7 Conversões de Número para Cadeia de Caracteres 256 8.3 Uma Introdução ao Processamento de Arquivos MATLAB 321
6.2.8 Conversões de Cadeia de Caracteres para Número 258 8.4 Abrindo e Fechando Arquivos 322
8.4.1 A Função fopen 323
6.2.9 Resumo 258
8.4.2 A Função fel-os e 326
6.3 Matrizes Multidimensionais 264
8.5 Funções de E/S Binárias 326
6.4 Diagramas Bidimensionais Adicionais 266
8.5.1 A Função fwri te 326
6.4.1 Tipos Adicionais de Diagramas Bidimensionais 266
8.5.2 A Função fread 327
6.4.2 Funções para Diagramas 271
8.6 Funções de E/S Estruturadas 330
6.4.3 Histogramas 272
8.6.1 AFunção fprintf 330
6.5 Diagramas Tridimensionais 274 8.6.2 Entendendo as Especificações de Conversão de Formato 332
6.5.1 Diagramas Tridimensionais de Linha 274 8.6.3 Corno as Cadeias de Caracteres de Formato São Utilizadas 334
6.5.2 Diagramas Tridimensionais de Superfície, Malha e Curva de Nível 276 8.6.4 A Função fscanf 337
6.6 Resumo 279 8.6.5 A Função fgetl 339
6.6.1 Resumo de Boas Práticas de Programação 280 8.6.6 A Função fgets 339
6.6.2 Resumo do MATLAB 280 8.7 Comparando Funções de E/S Binárias e Estruturadas 339
6.7 Exercícios 281 8.8 Posicionamento de Arquivo e Funções de Estado 345
8.8.1 A Função exi s t 345
7 Matrizes Esparsas, Matrizes Celulares e Estruturas 285 8.8.2 A Função ferror 347
7.1 Matrizes Esparsas 285 8.8.3 A Função f co f 348 f
7.1.1 O Tipo de Dados sparse 287 8.8.4 A Função ftell 348
7.2 Matrizes Celulares 292 8.8.5 A Função frewind 348
7.2.1 Criando Matrizes Celulares 294 8.8.6 A Função f seek 348
7.2.2 Usando Chaves {) como Construtores de Células 295 8.9 Função uiimport 354
7.2.3 Vendo o Conteúdo de Matrizes Celulares 296 8.10 Resumo 356
7.2.4 Estendendo Matrizes Celulares 296 8.10.1 Resumo de Boas Práticas de Programação 357
7.2.5 Apagando Células em Matrizes 298 8.10.2 Resumo do MATLAB 357
7.2.6 Usando Dados em Matrizes Celulares 298 8.11 Exercícios 358
7.2.7 Matrizes Celulares de Cadeias de Caracteres 299
7.2.8 A Importância das Matrizes Celulares 300 9 Gráficos de Controle 361
7.2.9 Resumo das Funções da Matriz cell 303 9.1 O Sistema de Gráficos MATLAB 361


"" 1 nuy1•11.,,au em IVIRIUl!:1"" para t:ngenne,ros Sumário I xiii

9.2 Controles de Objetos 363 10.7 Dicas para Criar Interfaces Gráficas de Usuário Eficientes 434
9.3 Examinando e Modificando Propriedades de Objetos 363 10.7.1 Dicas de Ferramentas 434
9.3.1 Modificando Propriedades do Objeto no Momento da Criação 363 10.7.2 Pcode 435
9.3.2 Modificando Propriedades de Objetos após a Criação 364 10.7.3 Melhorias Adicionais 437
9.4 Usando set para Listar .Valores Possíveis de Propriedades 370 10.8 Resumo 441
9.5 Dados Definidos pelo Usuário 372 10.8.1 Resumo de Boas Práticas de Programação 443
9.6 Localizando Objetos 373 10.8.2 Resumo do MATLAB 443
9.7 Selecionando Objetos com o Mouse 375 10.9 Exercícios 444
9.8 Posição e Unidades 378
9.8.1 Posições de Objetos figure 378 Apêndice A Conjunto de Caracteres ASCII 447
9.8.2 Posições de Objetos axes e uicontrol 379
9.8.3 Posições de Objetos text 379 Apêndice B Respostas para os Testes 449
9.9 Posições de Impressão 382
9.10 Propriedades Default e de Fábrica 383 Índice Remissivo 463
9.11 Propriedades de Objetos Gráficos 385
9.12 Resumo 385
9.12.1 Resumo de Boa Prática de Programação 386
9.12.2 Resumo do MATLAB 386
9.13 Exercícios 387

1O Interfaces Gráficas de Usuários 389


10.1 Como Funciona uma Interface Gráfica de Usuário 389
10.2 Criando e Exibindo uma Interface Gráfica de Usuário 390
10.2.1 Espiando Por Trás dos Panos 400
10.2.2 A Estrutura de uma Subfunção de Retomo 402
102.3 Adicionando Dados de Aplicação a uma Figura 403
10.2.4 Algumas Funções Úteis 404
10.3 Propriedades de Objetos 404
10.4 Componentes da Interface Gráfica de Usuário 405
10.4.1 Campos de Texto 407
10.4.2 Caixas de Edição 407
10.4.3 Quadros 407
10.4.4 Botões 407
10.4.~ Chaves 409
10.4.6 Caixas de Verificação e Marcadores 409
10.4.7 Menus Dinâmicos 412 f
10.4.8 Caixas de Listagem 412
10.4.9 Réguas 415
10.5 Caixas de Diálogo 420
10.5.1 Caixas de Diálogo de Erro e de Aviso 421
10.5.2 Caixas de Diálogo de Entrada 421
10.5.3 As Caixas de Diálogo uigetfile e uisetfile 422
10.6 Menus 423
10.6.1 Suprimindo o Menu-Padrão 426
10.6.2 Criando seus Próprios Menus 427
10.6.3 Teclas de Aceleração e Mnemônicos de Teclado 428
10.6.4 Criando Menus de Contexto 428
Prefácio

MATLAB (que abrevia MATrix LABoratory- Laboratório de Matrizes) é um programa


de computador de uso específico, otimizado para executar cálculos científicos de e
engenharia. Ele nasceu como um programa para operações matemáticas sobre matrizes,
mas ao longo dos anos transformou-se em um sistema computacional flexível capaz de
resolver essencialmente qualquer problema técnico.
O programa MATLAB implementa a linguagem MATLAB, e oferece uma ampla
biblioteca de funções predefinidas para que a programação técnica se torne mais fácil e
eficiente. Essa variedade extremamente ampla de funções torna muito mais fácil
resolver problemas técnicos em MATLAB do que em outras linguagens, como Fortran
ou C. Este livro apresenta a linguagem MATLAB e mostra como utilizá-la para resolver
problemas técnicos típicos.
Esta obra ensina o MATLAB como uma linguagem de programação técnica,
mostrando aos estudantes corno escrever programas limpos, efl:ientes e bem-docu-
mentados. Ela não tem a pretensão de ser uma descrição completa de todas as centenas
de funções MATLAB. Em vez disso, ensina como usar o MATLAB como uma lingua-
gem, e como localizar qualquer função desejada através dos recursos de ajuda on-line do
MATLAB.
Os primeiros seis capítulos são feitos para servir como texto para um curso de "In-
trodução à Programação/ Resolução de Problemas" para estudantes calouros de enge-
nharia. Esse material deve se adequar folgadamente para um curso de nove semanas
com três horas por semana. Os capítulos restantes cobrem tópicos avançados como
entrada/ saída e interfaces gráficas de usuários. Esses capítulos podem ser cobertos
em cursos mais longos, ou usados corno referência por estudantes de engenharia
ou engenheiros que utilizem o MATLAB como parte de seus cursos ou atividades
profissionais.
XVÍ I Programação em MATlAB® para Engenheiros Prefácio I XVii

Esta edição é especificamente devotada às versões 6.0 e 6.1 do MATLAB. Embora Além da grande biblioteca de funções construída na linguagem básica
a linguagem MATLAB básica tenha se mantido constante desde a versão 5.0, as ferra- MATLAB, existem muitas outras caixas de ferramentas especializadas dispo-
mentas integradas, as janelas e o subsistema de ajuda mudaram drasticamente. Adicio- níveis para ajudar a resolver problemas complexos em áreas específicas. Por
nalmente, um paradigma completamente novo para projetos de interfaces gráficas de exemplo, um usuário pode comprar caixas de ferramentas-padrão para
usuário MATLAB foi introduzido na de 6.0. Os usuários que trabalham com versões do resolver problemas em processamentos de sinais, sistemas de controle, comu-
t MATLAB anteriores à de 6.0 precisam estar conscientes que a descrição do desenvolvi-
mento de interfaces gráficas de usuário no Capítulo 10 não serve para eles.
nicações, processamentos de imagens e redes neurais, dentre muitas outras.

O livro também cobre as melhorias pequenas, porém importantes, na própria lin- 4. Diagramas Independentes de Dispositivos
guagem, como a introdução da expressão continue. Diferente de outras linguagens de computador, MATLAB tem diversos coman-
dos para imagens e desenhos integrais. Os desenhos e as imagens podem ser
exibidos em qualquer dispositivo gráfico suportado pelo computador onde está
As Vantagens do MATLAB para Programação Técnica funcionando o MATLAB. Esse recurso torna o MATLAB uma ferramenta
notável para visualizar dados técnicos.
MATLAB apresenta muitas vantagens, em comparação com linguagens de computador 5. Interface Gráfica de Usuário
convencionais, para resolução de problemas técnicos. Dentre elas, temos: MATLAB inclui ferramentas que permitem que um programador construa
1. Facilidade de Uso interativamente uma interface gráfica de usuário (GUI, do inglês Graphica! User
MATLAB é urna linguagem interpretada, assim como muitas versões de Basic. Interface) para seu programa. Com esse recurso, o programador é capaz de pro-
Como Basic, é muito fácil de usar. O programa pode ser usado como prancheta jetar programas sofisticados para análise de dados que podem ser operados por
de rascunhos para avaliar expressões digitadas em linha de comando, ou para usuários relativamente inexperientes.
executar programas grandes previamente escritos. Programas podem ser escri-
6. Compilador MATLAB'
tos e modificados com facilidade usando o ambiente de desenvolvimento inte-
A flexibilidade e a independência de plataforma do MATLAB são propor-
grado embutido, bem como depurados usando o depurador MATLAB. Por ser
cionadas pela compilação de programas MATLAB em um pseudocódigo inde-
muito fácil de usar, a linguagem é ideal para uso educacional e para desen-
pendente de dispositivo, e pela interpretação das instruções do pseudocódigo em
volver rapidamente protótipos de novos programas.
tempo .de execução. Essa abordagem é semelhante à usada na linguagem de
Muitas ferramentas de desenvolvimento de programas são fornecidas
programação Visual Basic, da Microsoft. Infelizmente, o programa resultante
para tornar o programa fácil de usar. Dentre elas, temos um editor/ depurador,
por vezes pode ser lento, pois o código MATLAB é interpretado em vez de com-
um navegador de espaço de trabalho e muitos programas de demonstração.
pilado. Indicaremos aspectos que tendem a reduzir a velocidade da execução
2. Independência de Plataforma de programas, quando os encontrarmos.
MATLAB tem suporte em muitos sistemas computacionais diferentes, propor- Um compilador MATLAB separado está disponível. Ele pode compilar
cionando, em grande medida, uma independência de plataforma. No momento um programa MATLAB como um executável verdadeiro que executa mais rápido
de preparação deste livro, a linguagem tinha suporte em Windows 9x/NT /2000 que o código interpretado. Essa é uma grande forma de converter um programa
e em diversas versões de UNIX. Programas escritos em uma plataforma fun- de protótipo MATLAB em um executável apropriado para venda e distribuição
cionam em todas as outras, e arquivos de dados escritos em qualquer plataforma a usuários.
podem ser lidos transparentemente em todas as outras. Como resultado, pro-
gramas escritos em MATLAB podem migrar para novas plataformas quando as f
necessidades do usuário se alteram. Características deste Livro
3. Funções Predefinidas 1 Muitas características deste livro têm por objetivo enfatizar a maneira apropriada de
MATLAB vem completo, com uma grande biblioteca de funções predefinidas escrever programas MATLAB. Essas características devem ser úteis para um estudante
que proporcionam soluções testadas e empacotadas para muitas tarefas técnicas aprendendo a usar o MATLAB e para quem já trabalha com esse programa. Dentre
básicas. Por exemplo, suponha que você esteja escrevendo um programa que elas, temos:
precise calcular a estatística associada com um conjunto de dados de entrada.
Na maioria das linguagens, você precisaria escrever suas próprias sub-rotinas 1. Ênfase na metodologia de projetos top-down
ou funções para implementar os cálculos como média aritmética, desvio O livro apresenta uma metodologia de projetos top-dawn no Capítulo 3, e então
padrão, mediana etc. Essas e centenas de outras funções são construídas já na a utiliza de forma consistente no seu decorrer. Essa metodologia encoraja o
linguagem MATLAB, tornando seu trabalho muito mais fácil. estudante a pensar a respeito do projeto apropriado de um programa antes de

..........
xviii I Programação em MATLA&9 para Engenheiros Pretflcio I xix

iniciar a codificação. Ela enfatiza a importância de definir claramente o proble- 5. Notas de erros de programação
ma a ser resolvido e os dados requeridos de entrada e saída antes de iniciar Essas notas enfatizam erros comi.ns que podem ser evitados. Apresentamos a
qualquer outra atividade. Uma vez definido apropriadamente o problema, seguir uma nota de erros de programação.
ensina o estudante a aplicar o refinamento passo a passo para subdividir a tarefa
em subtarefas menores, e implementar as subtarefas como sub-rotinas ou
funções separadas. Finalmente, a metodologia utilizada ensina a importância
de efetuar testes em todos os estágios do processo, tanto testes unitários das
rotinas componentes como testes exaustivos do produto final. Sempre verifique se os seus nomes de variáveis não se repetem nos primeiros 31 carac-
O processo formal de projeto ensinado no livro pode ser assim resumido: teres. Se isso não ocorrer, o MATLAB não conseguirá diferenciar as variáveis.
• Estabeleça claramente o problema que você está tentando resolver.
• Defina os dados de entrada requeridos pelo programa e os dados de
saída produzidos por ele. 6. Ênfase nas estruturas de dados
• Descreva o algoritmo que você pretende implementar no programa. No Capítulo 7, temos uma discussão detalhada a respeito das estruturas de
Esse passo requer projeto top-down e decomposição passo a passo, dados MATLAB, incluindo matrizes esparsas, matrizes de células e matrizes
fazendo uso de pseudocódigo ou de diagramas de fluxo. de estruturas. O uso apropriado dessas estruturas de dados é ilustrado nos
• Transforme o algoritmo em sentenças MATLAB. capítulos sobre Gráficos de Apoio e Interfaces Gráficas de Usuários.
• Teste o programa MATLAB. Nesse passo estão incluídos os testes
unitários de funções específicas e o teste exaustivo do programa final,
com diferentes conjuntos de dados.
Características Pedagógicas·

2. Ênfase em funções Os primeiros seis capítulos deste livro são projetados especificamente para uso em
O livro enfatiza o uso de funções para a decomposição lógica de tarefas em cursos de Introdução à Programação e à Resolução de Problemas. Deve ser possível
cobrir esse material confortavelmente em um curso de nove semanas, com três horas
subtarefas menores. Ele ensina as vantagens das funções para ocultar dados.
semanais. Se o tempo for insuficiente em algum programa particular de engenharia, o
Enfatiza também a importância dos testes unitários das funções antes de com-

j
Capítulo 6 poderá ser eliminado; os capíti1los remanescentes ainda assim ensinarão os
biná-las no programa final. O livro mostra ainda os erros comumente efetuados fundamentos de programação e uso do MATLAB para resolução de problemas. Essa
com funções e como evitá-los. característica deve ser atraente para os profl·ssores de engenharia pressionados para
3. Ênfase em ferramentas MATLAB compactar cada vez mais material dentro d(• 11m currículo finito.
Os capítulos seguintes tratam de mat{'n,d avançado que será útil para estudantes
O livro ensina o uso apropriado das ferramentas pré-construídas MATLAB
e engenheiros ao longo de suas carreiras. 1-'•,•;(' material inclui recursos avançados de
para facilitar a programação e depuração de programas. As ferramentas
entrada/ saída e o projeto de interfaces grá11< ,is de usuários para os programas.
tratadas são o Espaço de Lançamento, o Editor /Depurador, o Navegador do O livro inclui diversas características I '' 111l'ladas para dar suporte à compreensão
Espaço de Trabalho, o Navegador de Ajuda e ferramentas de projeto de GUI. do esh1dante.* Estão incluídos 15 testes, distribuídos ao longo dos capítulos. As
respostas a todas as perguntas estão apre:c111t.1das no Apêndice B.ps testes podem ser
4. Notas de boa prática de programação
usados como autotestes de compreensãc. Além disso, temos aproximadamente 140
As notas enfatizam as boas práticas de programação à medida que são apre-
exercícios de final de capítulo. As boas pMlh ,is de programação são apresentadas em
sentadas, para a conveniência do estudante. Além disso, as boas práticas de todos os capítulos em quadros de Boa Prálit ,1 de Programação, e os erros comuns são
programação apresentadas em um capítulo são resumidas no seu final. Apre- ~ apresentados em notas de Erros de Progra1t\;1i,ão. O material de final de capítulo é com-
sentamos a seguir uma nota de boa prática de programação. posto por Resumos de Boas Práticas de l'l()gramação e Resumos de Comandos e
Funções MATLAB.

Sempre destaque com tabulação o corpo de uma construção i f, com dois ou mais
espaços, para melhorar a legibilidade do código.
NE: Há, no final do livro, um encarte de figur , , ,loridas. Elas ilustram algum ponto especial a res-
peito de cada figura que não pôde ser exibido II lnns de cinza.
'l!
!
i

Agradecimentos

Quero agradecer a minha esposa, Rosa, e a nossos filhos Avi, David, Rachel, Aaron,
Sarah, Naomi, Shira e Devorah, por serem pessoas tão agradáveis e inspirarem todos os
meus esforços.

Stephen J. Clwpman

1
Capítulo 1

Introdução ao MATLAB

MATLAB (que abrevia MATrix LABoratory- Laboratório de Matrizes) é um programa


de computador especializado e otimizado para cálculos científicos e de engenharia.
Inicialmente, era projetado para cálculos com matrizes; ao longo dos anos, transformou-se
em um sistema computacional flexível, capaz de resolver essencialmente qualquer
problema técnico.
O programa MATLAB implementa a linguagem de programação MATLAB, junta-
mente com uma grande biblioteca de funções predefinidas que tornam as tarefas de
programação técnica mais fáceis e eficientes. Este livro apresenta a linguagem MATLAB
e mostra como utilizá-la para resolver problemas técnicos típicos.
MATLAB é um programa muito grande, com uma rica variedade de funções. Até
mesmo a versão básica do MATLAB, sem ferramentas adicionais, é muito mais rica que
outras linguagens de programação técnica. Existem mais de 1.000 funções no produto
MATLAB, e as ferramentas adicionais ampliam esses recursos com muito mais funções
em diferentes especialidades. Este livro não pretende apresentar ao leitor todas as
funções MATLAB. Em vez disso, o usuário aprende os fundamentos de como escrever,
depurar e otimizar bons programas MATLAB, juntamente com um subconjunto das
funções mais importantes. Outro aspecto igualmente importante é que o programador
aprende a utilizar as ferramentas do próprio MATLAB para localizar a função adequa-
da a um propósito específico a partir da enorme gama de opções disponíveis.

1.1 Vantagens do MATLAB


MATLAB tem muitas vantagens, em comparação com linguagens computacionais con-
vencionais, para resolver problemas técnicos. Dentre elas, temos:
,. '
\i 2 1 Programação em MATlAB@ para Engenheiros Capítulo 1 Introdução ao MATlAB 1 3

1 Facilidade de Uso 5 Interface Gráfica de Usuário


MATLAB é uma linguagem interpretada, assim como diversas versões de Basic. MATLAB tem ferramentas que permitem a um usuário construir interativa-
Como o Basic, ele é muito fácil de usar. O programa pode ser usado como pran- mente uma interface gráfica de usuário (GUI, do inglês Graphical User Interface)
cheta de rascunhos para avaliar expressões digitadas em linha de comando, ou para seus programas. Com esse recurso, o programador pode projetar pro-
pode ser utilizado para executar programas grandes escritos previamente. Os gramas sofisticados de análise de dados, os quais podem ser operados por
programas podem ser facilmente escritos e modificados no ambiente integrado usuários relativamente inexperientes.
de desenvolvimento, e depois depurados pgr meio do depurador MATLAB.
6 O Compilador MATLAB
Como a linguagem é muito fácil de usar, ele é ideal para o desenvolyimento
A flexibilidade e a independência de plataforma do MATLAB resultam da com-
rápido de protótipos para novos programas.
pilação de programas MATLAB em um código inàependente de dispositivo
Diversas ferramentas para desenvolvimento de programas são fornecidas, o denominado pcode, e da interpretação em tempo de execução das instruções
que facilita o uso do programa. Dentre elas, temos um editor/ depurador integrado, em pcode. Essa abordagem é similar à adotada pela linguagem Visual Basic da
um navegador do espaço de trabalho e diversos programas de demonstração. Microsoft. Infelizmente, os programas resultantes podem às vezes se tornar
2 Independência de Plataforma lentos, pois o código MATLAB é interpretado em vez de compilado. Indicaremos
os aspectos que tendem a tornar a execução de programas mais lenta quando os
MATLAB tem suporte em diferentes sistemas computacionais, o que propor-
encontrarmos.
ciona independência de plataforma. No momento da preparação deste livro, a
Existe um compilador MATLAB separado. Ele pode compilar um pro-
linguagem tem suporte em Windows 95 / 98 /ME/ NT / 2000 e diferentes versões grama MATLAB como um programa efetivamente executável, que é mais rápido
de UNIX. (Versões mais antigas do MATLAB eram disponíveis para computa- que o código interpretado. Essa é uma boa forma de converter um programa
dores Macintosh e VAX, as quais ainda são utilizadas em diversos locais.) protótipo MATLAB em um programa executável que pode ser vendido e dis-
Programas escritos em qualquer plataforma são executados nas outras plata- tribuído a usuários.
formas, e arquivos de dados escritos em qualquer plataforma podem ser lidos
transparentemente nas outras. Com isso, programas escritos em MATLAB
podem migrar para novas plataformas caso o usuário precise da mudança.
1.2 Desvantagens do MATLAB
3 Funções Predefinidas
MATLAB vem completo, com uma grande biblioteca de funções predefinidas, MATLAB tem duas desvantagens principais. Primeiro, ele é uma linguagem interpretada,
que representam soluções testadas e empacotadas para diversas tarefas técnicas por isso pode ser mais lento que linguagens compiladas. Esse problema pode ser dimi-
básicas. Por exemplo, suponha que você esteja escrevendo um programa para nuído pela estruturação apropriada dos programas MATLAB e pelo uso do compilador
calcular as estatísticas relacionadas com um conjunto de dados de entrada. Na MATLAB para compilar o programa final MATLAB para distribuição e uso geral.
maioria das linguagens, você precisaria escrever suas próprias sub-rotinas ou A segunda desvantagem é o custo: uma cópia completa do MATLAB é de cinco a
funções para implementar os cálculos de média aritmética, desvio-padrão, me- dez vezes mais cara que um compilador convencional C ou Fortran. Esse custo relati-
diana, etc. Essas e centenas de outras funções fazem parte da linguagem MAT- vamente alto é mais do que compensado pelo tempo reduzido requerido para um
LAB, assim facilitando o seu trabalho. engenheiro ou cientista criar um programa o que toma o MATLAB eficaz para empresas.
Além da grande biblioteca de funções presentes na linguagem MATLAB Ele pode ser muito caro, entretanto, para a compra individual. Felizmente, existe uma
básica, diversas ferramentas específicas estão disponíveis para ajudar a resolver versão de estudante mais barata do MATLAB, que é urna excelente ferramenta para
problemas complexos em áreas específicas. Por exemplo, um usuário pode estudantes que queiram aprender a linguagem. A versão de estudante do MATLAB é
adquirir ferramentas-padrão para resolver problemas em Processamento de essencialmente idêntica à versão completa.
Sinais, Sistemas de Controle, Comunicações, Processamento de Imagens e
Redes Neurais, além de outros. Existem também muitos programas MATLAB
de uso livre, que são contribuições de usuários compartilhadas por meio da ~ 1.3 O Ambiente MATLAB
página WWW do MATLAB.
A unidade fundamental de dados em qualquer programa MATLAB é a matriz. Uma
4 Desenhos Independentes de Dispositivos matriz é uma coleção de valores de dados organizados em linhas e colunas, determi-
Diferente da maioria das linguagens de computador, MATLAB tem muitos co- nada por um nome único. Valores individuais de dados em uma matriz podem ser aces-
mandos para desenhos e imagens. Os desenhos e imagens podem ser apresen- sados por meio do nome da matriz seguido de índices entre parênteses que identificam
tados em qualquer dispositivo de saída gráfica suportado pelo computador que a linha e a coluna de um valor particular. Até mesmo escalares são tratados como
executa o MATLAB. Esse recurso torna o MATLAB uma ferramenta excepcional matrizes em MATLAB - eles são simplesmente matrizes com apenas uma linha e uma
para visualização de dados técnicos. coluna. Aprenderemos a criar e a manipular matrizes MATLAB no Capítulo 2.

h,,,
4 1 Programação em MATIAEJl!J para Engenheiros Capítulo 1 Introdução ao MATIAB 1 5

Na execução do MATLAB podem ser exibidas janelas de diferentes tipos, as quais - ----o Espaço de Lançamento
aceitam comandos ou exibem informações. Os três tipos mais importantes de janelas exibe uma árvore de Esse controle permite
documentação, Dispara o que um usuário verifique
são Janela de Comandos, onde podem ser colocados comandos; Janela de Figuras, que demonstrações e ferramentas ou modifique o diretório
Navegador de Janela da Comandos
exibem desenhos e gráficos; e Janelas de Edição/Depuração, que permitem a um para cada produto Ajuda corrente MATLAB
usuário criar e modificar programas MATLAB. Vamos ver exemplos desses três tipos de
janelas na presente seção.
Além disso, o MATLAB pode exibir outras janelas de auxílio e que possibilitam ao
usuário examinar o valor de variáveis definidas em memória. Vamos examinar aqui
algumas dessas janelas adicionais, e examinar as outras quando discutirmos como • X

depurar programas MATLAB. ~llTWI


.ç,. toatrol
Sysua Toolbox
4'\.DTLAB Coapiler >> ed 'd: \book\~&tl&b\2:-e\re.vl\chapl'
4\Kapp1ni; TOOlbOX » 1
• Sipal h:ocessing Toolbox

......,.
• Stlt.ti8t1CS 'foolbox
1.3.1 A Área de Trabalho MATLAB • Spbolic llatb Toolbox

~ hft~ Sya:tn. llocl:set.


Ao iniciar o MATLAB Versão 6, aparece uma janela especial denominada área de tra- • Systeahild to Siaulink Ti:4Mlàto:r:

balho MATLAB. A configuração inicial da área de trabalho MATLAB é exibida na


Figura 1.1. Ela integra diversas ferramentas para gerenciar arquivos, variáveis e apli-
cações dentro do ambiente MATLAB.
As principais ferramentas presentes na área de trabalho MATLAB, ou que podem
ser acessadas a partir dela, são as seguintes:
• Janela de Comandos
• Janela de Histórico de Comandos
• Espaço de Lançamento
• Janela de Edição/Depuração
AJanela de Histórico O Navegador do Diretório ONavegador da Área de
• Janela de Figuras da Comandos exibe os Corrente exibe os arquivos Trabalho exibe as variáveis
• Navegador do Espaço de Trabalho e Editor de Matrizes comandos anteriores do diretório corrente definidas na área de trabalho
• Navegador de Ajuda
• Navegador do Diretório Corrente Figura 1.1 A área de trabalho MATLAB. A aparência exata da janela pode diferir ligeiramente
em diferentes tipos de computador.
Vamos discutir as funções dessas ferramentas em seções posteriores deste capítulo.

1.3.2 A Janela de Comandos


O lado direito da área de trabalho MATLAB contém a Janela de Comandos. Um usuá-
rio pode inserir comandos interativos pelo marcador de comandos (» ), na Janela de
.. O MATLAB calcula a resposta assim que a tecla Enter é pressionada, e armazena o
Comandos, e eles serão executados de imediato. resultado em uma variável (na realidade, em uma matriz 1 x 1) denominada area. O
Um exemplo de cálculo interativo simples é o seguinte: suponha que você queira conteúdo dessa variável é exibido na Janela de Comandos, conforme mostrado na
calcular a área de um círculo com raio de 2,5 m. Isso pode ser feito pela janela de coman- Figura 1.2, e a variável pode ser usada em outros cálculos. (Note que 7t é predefinido no
dos MATLAB, digitando: MATLAB, por isso podemos simplesmente usar pi sem antes termos de declarar seu
» area =pi* 2.5A2 valor como 3,141592... ).
area = Se uma declaração é muito extensa para ser digitada em uma única linha, ela pode
19.6350 ser complementada em linhas sucessivas digitando reticências (... ) no final de cada
6 1 Programação em MATlAEJ8 para Engenheiros Capítulo 1 Introdução ao MAT!AB 1 7

,MKilfti· ,'.:.fgj· l ~1AfLAU


,1
., .
Fie· Edt· 'VleW Wfb ""'1dow ~
. ', l:dt Vll!W •·w., Wh:fow ~.
Cl.liJ I .J!. ~li"' "'l • I ? JC1anrtDNc1ory:lo:w2lMn .=.l.d '. 1.)!,--:~ c-.lal t 1~~10:~~
&1·l •lllll 1t•dcF--::J.
r$
....
m:i)acea
1 Size 1 -~• 1 Claoo
To qet star::ted, selece "KATLAB Help'.. troa the Hdp aenu,

>> ace• • pi *
area •
2.,5"2 ..
Claoe
>>
To qet au1:ted., select "KATLAB Help" ttoa the Help aema..

UH. • pi • 2,5"2
double at
acea •
»
19. 6350
1 '1 llllxl lxl dauhle l.t 19.6350
1 » xl • 1 + 1/2 + 1/3 + 1/4 + li! + 1/6;
»
!
.,''
1
i
1
1
•I 1 !.I
·• 1• 1' Launch Pad WOrlCSDICI 1
•1x
: -~~:..: •Cl•,-53.:fB,&/02/01-'-"-\ ..... ..
;
ai:ea • p1 • 2.5 ... 2
'

···--
··-·-
DIÍole&üe,-.,

• 1• 1 Command Hlsloiy I CUl!enl Diretloiy 1 •I I•


Ready

Figura 1.2 A Janela de Comandos fica mais à direita na área de trabalho. Os usuários podem
inserir comandos e ver as respostas ali. Figura 1.3 A Janela de Histórico de Comandos, mostrando dois comandos sendo apagados.

... J--
"
1.3.3 AJanela de Histórico de Comandos
linha, e então continuando na linha seguinte. Por exemplo, as duas expressões a seguir
são idênticas: A Janela de Histórico de Comandos exibe uma lista dos comandos que um usuário
inseriu na Janela de Comandos. A lista de comandos anteriores pode se estender a exe-
xl = 1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6;
cuções anteriores do programa. Os comandos permanecem na lista até serem apagados.
e Para reexecutar qualquer comando, simplesmente dique duas vezes sobre ele com o
botão esquerdo do mouse. Para apagar um ou mais comandos da Janela de Histórico de
xl 1 + 1/2 + 1/3 + 1/4 ... Comandos, selecione os comandos e clique sobre eles com o botão direito do mouse.
+ 1/5 + 1/6; Surgirá um menu, que permitirá ao usuário apagar os itens (ver Figura 1.3).
Em vez de digitar comandos diretamente na Janela de Comandos, uma série de
comandos pode ser colocada em um arquivo, e o arquivo inteiro pode ser executado
quando digitamos seu nome na Janela de Comandos. Esses arquivos são denominados
1.3.4 O Espaço de Lançamento
arquivos de scripts. Arquivos de scripts (e funções de scripts, como veremos) são tam- O Espaço de Lançamento é uma ferramenta especial que agrupa referências a docu-
bém chamados arquivos M, por terem uma extensão de arquivo " . m". mentação, demonstrações e ferramentas relacionadas para o próprio MATLAB e para
~

~
1
Launch Pad

r-,

~-
""'HATLAB

~ Demos
lil Cui:rent Ditectory
lil úTorkspace
lil Path
D EJ !!i} w ,book \lnatlab \2e\revl \chapl \calc_area.m

D
Fie Edt · Vle'N . Text . Debug B r ~ Web Whdow Hep

1
2
3-
•-
l.iiÍr

-5::-
B-
liil
;-
&; 1 J{, lit>i 8 .-,
nus 10:-flle calct.llates the
and displ&ys the re.sult..
redius • 2. S;
area • pi ,.. 2. 5"'2;
n
' :· , •

str::inq • [ 'Toe acea of the circle is


di•p(•tring);
li J• 1 .~
&H:-:1
~ I ·@ 'IBi W fll lfll
of a cil:cler

I num2st.c(area) J;
I St,d c ~ _ ! J

1, lill GUIDE (GUI Builder) 7


1
ClProdu~Page (úTeb)
1
;I ~ - • Contrnl System Toolbox
it-""- HATLAB Compiler
t/t-""- Signal I
t Processing Toolbox
r¼i--Ji St:i=rt.i :q:t.i r.~ Tnn 1hnx
~ Launch Pad r--W-o-rk_s_p_ac-e--,.------..;;.i
..:.J

Figura 1.4 O Espaço de Lançamento.

Ready

Figura 1.5 A Janela de Edição/Depuração, exibindo o arquivo calc_area .m.

cada conjunto de ferramentas que você adquire. A informação é organizada por pro-
Uma vez gravado o arquivo M, ele pode ser executado ao digitarmos seu nome na
duto, com todas as referências listadas abaixo de cada produto ou conjunto de ferra-
Janela de Comandos. Para o arquivo M da Figura 1.5, os resultados são
mentas. Pessoas diferentes irão adquirir produtos diferentes, portanto, o conteúdo
exato dessa janela varia de instalação para instalação. » calc_area
A Figura 1.4 mostra o Espaço de Lançamento com referências expandidas para o The area of the circle is 19.635
MATLAB básico. Ao clicar duas vezes sobre um desses itens, você pode obter ajuda
para usar o MATLAB, executar os programas de demonstração, acessar as ferramentas- A Janela de Edição/Depuração também funciona como depurador, conforme vere-
padrão fornecidas com o programa ou visitar a página WWW do MATLAB na Internet. mos no Capítulo 2.

1.3.5 A Janela de Edição/Depuração 1.3.6 Janela de Figuras

Uma Janela de Edição/Depuração é usada para criar novos arquivos M ou modificar os Uma Janela de Figuras é usada para exibir gráficos MATLAB. Uma figura pode ser a
1

1 já existentes. Uma Janela de Edição/Depuração é criada automaticamente quando você representação gráfica bidimensional ou tridimensional de dados, uma imagem ou uma
cria um novo arquivo M ou abre um. Você pode criar um novo arquivo M selecionando GUI. Um arquivo de script simples que calcula e desenha a função seno (x) é mostrada
I:
··1
i "File/New /M-file" no menu da área de trabalho, ou clicando sobre o ícone Dna Barra
de Ferramentas. Você pode abrir um arquivo M selecionando "File/ Open" no menu da
a seguir:

% sin_x.rn: Esse arquivo M calcula e desenha a


área de trabalho ou clicando sobre o ícone ~ na Barra de Ferramentas.

~!,
% função seno(x) para O<= x <= 6.
A Janela de Edição/Depuração é essencialmente um editor de textos de progra- X = 0:0.1:6;

r\,
--"-=.-il
mas, com características da linguagem MATLAB destacadas por cores diferentes.
Comentários em um arquivo M aparecem em verde, variáveis e números, em preto,
y = sin(x);
plot (x,y};
cadeias de caracteres, em vermelho, e palavras-chave da linguagem, em azul. Um exem-
·f plo de Janela de Edição contendo um arquivo M simples é exibido na Figura 1.5. Esse Se esse arquivo for gravado com o nome sin_x .rn, um usuário poderá executá-lo digi-
arquivo calcula a área de um círculo, dado o seu raio, e exibe o resultado. tando "sin_x" na Janela de Comandos. Quando o arquivo de script for executado, o
1O I Programação em MATLAB® para Engenheiros Capítulo 1 Introdução ao MATLAB 1 11

IUl1114§N Umêl lista de todas as variáveis e matrizes no espaço de trabalho corrente pode ser
Fie Edt View lnsert Toeis Wildow 1-1,t, gerada por meio do comando whos. Por exemplo, após executar os arquivos
~D ~ liil 491 ~ A .l' / 1 %1 J3 G calc_ar.ea e sin_x, o espaço de trabalho contém as seguintes variáveis:
» w:hos
N,ame Size Bytes Class
0.8
/' ~\
a.rea lxl 8 double array
/ \ r.adius lxl 8 double array

//
0.6 \
string lx32 64 char array
0.4 \ X lx61 488 double array
0.2
I \ y lx61 488 double array

\
Gratld total is 156 elements using 1056 bytes
o
O arquivo de script calc_area criou as variáveis area, radius e string, e o a:quivo
-0.2 de script § in_x criou as variáveis x e y. Observe que todas as variáveis estão no mesmo
espaço de trabalho. Se dois arquivos de script forem executados sucessivamente, o
-0.4

/
\
segundo a,rquivo de script poderá usar variáveis criadas pelo primeiro.
-0.6 O conteúdo de qualquer variável ou matriz pode ser determinado pela digitação
do nome apropriado na Janela de Comandos. Por exemplo, o conteúdo de string
-0.8
/,/
/ pode ser obtido da seguinte forma:
-1
o 2 3 4 5 6 » string
str:ing =

The area of the circle is 19.635


Figura 1.6 Desenho MATLAB de seno (x) versus x.
Uma variável pode ser apagada do espaço de trabalho usando o comando clear.
Esse coma-ndo tem a seguinte forma:
cle~r varl var2 ...
MATLAB abrirá uma Janela de Figuras e desenhará a função seno (x) dentro dela. O onde varl e var2 são os nomes das variáveis a serem apagadas. O comando clear
desenho resultante é exibido na Figura 1.6. variables, ou simplesmente clear, apaga todas as variáveis do espaço de trabalho
'J corrente.
1
1

1 1.3. 7 O Espaço de Trabalho MATLAB


1.3.8 O Navegador do Espaço de Trabalho
Uma declaração da forma
z = 10; O conteúJ.o do espaço de trabalho corrente pode também ser examinado por meio do
Navegador do Espaço de Trabalho baseado em GUI. Na configuração básica, o \!ave-
cria uma variável denominada z, armazena o valor 10 nessa variável e a grava em uma ~ gador do Espaço de Trabalho aparece no canto superior esquerdo da área de trabalho.
parte da memória do computador denominada espaço de trabalho. Um espaço de tra- Por meio dele, temos uma apresentação gráfica da mesma informação dada pelo co-
balho é a coleção de todas as variáveis e matrizes que podem ser usadas pelo MATLAB mando wltos, e o que é apresentado é atualizado dinamicamente cada vez que muda o
quando um comando, arquivo M ou função em particular está em execução. Todos os conteúdo do espaço de trabalho. O Navegador do Espaço de Trabalho também permite
comandos executados na Janela de Comandos (e todos os arquivos de script executados que um u~uário modifique o conteúdo de qualquer variável no espaço de traball-co.
a partir da Janela de Comandos) compartilham um espaço de trabalho comum, para Uma típica Janela do Navegador do Espaço de Trabalho é exibida na Figura 1.7.
que eles possam compartilhar variáveis. Conforme veremos neste livro, as funções Como você pode ver, ela exibe a mesma informação que o comando whos. Clicar duas
MATLAB diferem dos arquivos de script, pois cada função tem seu próprio espaço de vezes sobre qualquer variável na janela aciona o Editor de Matrizes (Figura 1.8), que
trabalho separado. permite que o usuário modifique a informação armazenada em uma variável.


.... - ·- ,..-·- -"i;,--"""'" .... Capitulo 1 /11/rodução ao MATlAB 1 13

V"•xY::p:i,:e DEI
~lillE1Jl!11t stadc: 1ease ..:.1 ~---- -····-·---·--····------------··-- ----·
llu.e Size Bytes Cle.ss
.3 MdlDFon11te11

·-
l!tllaz:ea lxl 8 double az:z:ay
BoginHere
fffl z:adius lxl 8 double az:z:ay
t(JR12Rel--s
'\ t
~stz:ing lx32 64 chaz: az:z:ay
:li-D Gelling Slalled lii Leamlng MATLAB
ffflx lx6l 488 double az:z:ay é-9 UsingMA1U8
fffly lx6l 488 double az:i:ay · á 'Otvelopmenl Environment • Oejbrtq $1atle0 - mtroducüon to MATLAB.

li tj} li Slartlno and Quitting MATLAB


~i-E9 Using lhe Oesktop
• ~ • user gu,ctes. for au or MATLAS.
• lndl!k of QoçumeritatlQn EKamt)les - major examples. tn lhe MATLAB 11otumentanon.
[ tf:-fl: RuMinO MATLAS Funclions
I :H;s Otltlng Hefp IL' Flndlng Functions and Propertles
; j--~ Types oflnformafü,n
~ :r. -~ Using the Hefp Browser • MATL.A8 Functtons U§fea by Cate-goty- btoWse MATlA8 túnc.ti8ns bycategoiy.
lf,··11 Using lhe Help Na,igator
t! Viewing Oocumentation in
lt'you knOwlhtJunction namt:
o ClckSNn:11 lnthe Help Browsers left pane
•J • ] .Launch Pad Workspace 1 ❖-9' Preterences fOrlhê Hetp B1
ífl-5 P1inting DocumentatiOn
o SeleclFuncClanName torthe type orsearch

+·D USlng Help Funcbons


: :ti--& Olhar MelhOds íot Getting t
o Enlerthe name ofthe function ln lhe Searehfar tetd and dltkGo.

• Hand!e Gr?Pb!CS Property Browser-viewdescriptiens ot afl grlJ)hk:s ob)eel properliu.


Figura 1.7 O Navegador do Espaço de Trabalho. ~dl Wotkspace, Palh, .and f"He Ope
j ~ 5 MATLAB WOrkSpace Ili; Printing the Documentation
.:.-11 Search Pau,
! t·-11 How lhe Search Palh V' • Punbtlf@Yf'S•ons of lhe MATLAB documerdalion and relaled papers in PDF ftN'mal.
l --a Vte-wing ano Sethng ttn
;;.r& Fite Operations
:f1-i tmporttng and Exporfing Data .!.] 1

ill !

Figura 1.9 O Navegador de Ajuda.

Fte Edt Vlew Web Wtldow Hep


Numaric fOrmat jshortO .!.J I Slze: ri--- by ~ ~ Uma ou mais variáveis podem ser apagadas do espaço de trabalho pela seleção
z 3 4 5 6 7 com o mouse e utilização da tecla Delete, ou clicando com o botão direito do mouse e
selecionando a opção de apagar.

1.3.9 Obtendo Ajuda


Você pode obter ajuda no MATLAB de três maneiras. O método preferido é utilizar o
Navegador de Ajuda. Você pode iniciar o Navegador de Ajuda selecionando o ícoae de
Ajuda '? localizado na barra de ferramentas, ou digitando helpdesk ou helpw:.n na
Janela de Comandos. É possível também obter ajuda navegando pela documentação do
MATLAB, ou você pode procurar os detalhes de um comando em particular. O
]! Navegador de Ajuda é mostrado na Figura 1.9.
.!.l Existem também duas formas baseadas em linhas de comando para obter ajuda. A
Ready primeira forma é digitar help ou help seguido de um nome de função na Janela de
Comandos. Se .-ocê digitar somente help, o MATLAB exibirá uma lista de possíveis
Figura 1.8 O Editor de Matrizes é acionado clicando duas vezes sobre uma variável no tópicos de ajuda na Janela de Comandos. Se uma função específica ou nome de conjunto
Navegador do Espaço de Trabalho. O Editor de Matrizes permite que o usuário de ferramentas for acrescentado, será apresentada ajuda para aquela função ou con-
modifique os valores contidos em uma variável ou matriz. junto de ferramentas específico.
1-. 1 , 1uy1a11ra~au GJ1•1~,n1Lr1u- pa,a &.fll/tHIIIGIIU-> 1,apnuI0 1 mrroouçao ao MAi LAB I H>

A segunda maneira de obter ajuda é o comando lookfor. Ele difere·do comando Para evitar essa possibilidade, uma boa idéia é usar o comando clear no início
help, pois este procura por um nome de função que case perfeitamente com o forne- de cada cálculo independente.
cido, enquanto o comando lookfor pesquisa informação resumida e rápida para cada Outro comando importante é o abort. Se um arquivo M der a impressão de estar
função. Assim, o comando lookfor é mais lento que o help, mas aumenta a chance executando por tempo demasiado, ele pode conter um laço infinito e nunca terminar.
de fornecer informação útil. Por exemplo, suponha que você esteja procurando uma Nesse caso, o usuário pode recuperar o controle digitando control-c (abreviado como
função para inverter uma matriz. O MATLAB não tem uma função chamada inverse, "e) na Janela de Comandos. Esse comando é digitado pressionando a tecla Controle
assim, o comando help inverse não encontrélrá nada. Por ot1tro lado, o comando digitando "c" ao mesmo tempo. Quando o MATLAB detecta um 'e, ele interrompe o
lookfor inverse apresentará os seguintes resultados: · programa em execução e devolve um marcador de comandos.
» lookfor inverse O ponto de exclamação ( ! ) é outro caractere especial importante. Seu uso especial
INVHILB Inverse Hilbert matrix. é _enviar um comando para o sistema operacional do computador. Qualquer ca~actere
AC0S Inverse cosine. depois do ponto de exclamação será enviado para o sistema operacional e executado
AC0SH Inverse hyperbolic cosine. como se tivesse sido digitado na linha de comando do sistema operacional. Isso permite
AC0T Inverse cotangent. a inclusão de comandos de sistema operacional diretamente em programas MATLAB.
AC0TH Inverse hyperbolic cotangent. Finalmente, você pode acompanhar tudo o que for feito durante uma sessão
ACSC Inverse cosecant. MATLAB por meio do comando diary. A forma desse comando é
ACSCH Inverse hyperbolic cosecant.
ASEC Inverse secant. diary nome do arquivo
ASECH Inverse hyperbolic secant.
ASIN Inverse sine. Após digitar esse comando, uma cópia de todos os dados de entrada e da maioria dos
ASINH Inverse hyperbolic sine. dados de saída digitados na Janela de Comandos é ecoada no arquivo diário. Essa é
ATAN Inverse tangent. uma excelente ferramenta para recriar eventos quando algo sai errado durante uma
ATAN2 Four quadrant inverse tangent. sessão MATLAB. O comando diary off suspende a entrada de dados no arquivo de
ATANH Inverse hyperbolic tangent. diário, e o comando diary on reinicia os dados de entrada.
ERFINV Inverse error function.
INV Matrix inverse.
PINV Pseudoinverse.
IFFT Inverse discrete Fourier transforrn. 1.3.11 O Caminho de Busca MATLAB
IFFT2 Two-dirnensional inverse discrete Fourier transforrn.
IFFTN N-dirnensional inverse discrete Fourier transform. O MATLAB utiliza um caminho de busca para encontrar os arquivos M. Os arquivos M
IPERMUTE Inverse permute array dimensions. do MATLAB são organizados em diretórios em seu sistema de arquivos. Muitos desses
diretórios de arquivos M são fornecidos junto com o MATLAB, e os usuários podem
Com essa lista, podemos verificar que a função de interesse se chama inv. adicionar outros. Se um usuário insere um nome diante do marcador do MATIAB, o
interpretador MATLAB tenta encontrar o nome da seguinte forma:

1.3.1 O Alguns Comandos Importantes 1. Ele procura pelo nome como uma variável. Se ele for uma variável, o MATLAB
J !
exibe o conteúdo corrente da variável.
Se você está iniciando no MATLAB, algumas demonstrações podem ajudar a fornecer
2. Ele verifica se o nome é urna função ou comando predefinido. Se for, o MATLAB
uma idéia de seus recursos. Para executar as demonstrações fornecidas no MATLAB, ~
executa a função ou comando.
digite demo na Janela de Comandos, ou selecione "demos" do Espaço de Lançamento.
O conteúdo da Janela de Comandos pode ser esvaziado a qualquer momento 3. Ele verifica se o nome é um arquivo M no diretório corrente. Se for, o MATLAB
usando o comando e lc, e o conteúdo da Janela de Figuras corrente pode ser esvaziado executa a função ou comando.
a qualquer momento usando o comando clf. As variáveis no espaço de trabalho 4. Ele verifica se o nome é um arquivo M em qualquer diretório no caminho de
podem ser esvaziadas com o comando clear. Conforme já visto, o conteúdo do espaço busca. Se for, o MATLAB executa a função ou comando.
de trabalho persiste entre execuções de comandos e arquivos M separados, por isso é
possível que os resultados de um problema tenham efeitos sobre o outro que você tenta Observe que o MATLAB verifica primeiro os nomes de variáveis, portanto, se
resolver. você definir uma variável com o mesmo nome de uma função ou comando MATLAB,
16 1 Programação em MATlAfJI' para Engenheiros Capítulo 1 Introdução ao MATlAB 1 17

aquela função ou comando se tornará inacessível. Esse é um erro comum cometido por
usuários novatos.
.AH ctianges take éffect lmmedlately.

IIIATLAB search palh:


Add Folder... CJ O:IMatlabR1 2\loolbox\mallab\general •
CJ O:\MaUabR1 2\loolbox\mallablops
Nunca use uma variável com nome igual ao de uma função ou comando MATLAB. Se
Add wllh Subtolders .. ,! CJ O:IMallabR12\loolbox\matlab\lang
você fizer isso, aquela função ou comando ficará inacessível. CJ D:\MallabR12\toolbox\matlab\elmal
Move to Top CJ D:\MallabR12\loolboit\mallab\elfun
CJ D:IMatlabR12\loolboit\mallab\specfun
Move Up CJ 0:1MallabR1 2\loolbo><lmatlablmalfun
Além disso, se houver mais de uma função ou comando com o mesmo nome, o CJ D:IMallabR1 2\loolbo><lmallab\datafun
Remove
primeiro encontrado no caminho de busca será executado, e os outros permanecerão CJ D:\MallabR12\loolbolt\matlab\audio
inacessíveis. Isso é um problema comum para novatos, pois às vezes eles criam arquivos M Move Oown CJ 0:1MatlabR1 2\loolbox\matlab\polyfun
com nomes iguais aos de funções MATLAB-padrão, o que toma esses arquivos inacessíveis. CJ O:IMallabR1 2\loolbox\mallab\funfun
Move to Bottoml
CJ D:\MatlabR12\loolboit\mallab\sparfun

. Save Close Révert Default Help ·..

Nunca crie um arquivo M com nome igual ao de uma função ou comando MATLAB.

Figura 1.1 D A Ferramenta de Caminhos.


O MATLAB contém um comando especial (which) para ajudar a descobrir qual ver-
são de um arquivo está sendo executada, e onde ele está localizado. Isso pode ser útil para
descobrir conflitos de nomes de arquivos. O formato desse comando é which nome da
função, onde nome da função é o nome da função que você está tentando localizar.
Por exemplo, a função de produto cartesiano cross .m pode ser localizada assim: e potência, respectivamente. Após digitar uma expressão, o resultado é automatica-
mente calculado e exibido. Por exemplo, suponha que queiramos calcular o volume de
» which cross um cilindro de raio r e altura l. A área do círculo na base do cilindro é dada pela equação
-- D:\MatlabR12\toolbox\matlab\specfun\cross.m
"'."J·
A= 1tr2 (1.1)
O caminho de busca do MATLAB pode ser analisado e modificado a qualquer
momento pela seleção do Caminho de Busca no Espaço de Lançamento, ou digitando e o volume total do cilindro é
editpath na Janela de Comandos. O Caminho de Busca está apresentado na Figura
'
1 1.10. Ele permite que o usuário acrescente, remova ou modifique a ordem dos diretórios V=Al (1.2)
1
no caminho. Outras funções relacionadas com caminhos são:
Se o raio do cilindro é de 0,1 m e a altura é de 0,5 m, o volume do cilindro pode ser obtido

' •



addpath
path
path2rc
rmpath
Adiciona um diretório ao caminho de busca do MATLAB.
Exibe o caminho de busca do MATLAB.
Adiciona o diretório corrente ao caminho de busca do MATLAB.
Remove um diretório do caminho de busca do MATLAB.
~
usando as declarações MATLAB (as entradas do usuário são apresentadas em negrito):
»
A

»
A = pi

0.0314
* 0.1-'2

V = A * 0.5
1.4 Utilizando o MATLAB como Prancheta de Rascunhos V
0.0157
Em sua forma mais simples, o MATLAB pode ser usado como prancheta de rascunhos
para efetuar cálculos matemáticos. Os cálculos são digitados diretamente na Janela de Observe que pi é predefinido com o valor 3,141592... Observe também que o valor
Comandos, usando os símbolos+, -, *, / e /\ para soma, subtração, multiplicação, divisão armazenado em A foi preservado pelo MATLAB e reutilizado no cálculo de V.
l 18 1 Programação em MATLAB® para Engenheiros Capítulo 1 Introdução ao MATLAB 1 19
1

·· · o mostrador do Diretório Corrente. A Janela de Comandos é a janela mais importante:


Teste 1.1
nela, todos os comandos são digitados e os resultados são apresentados.
Neste teste, faremos uma verificação rápida da sua compreensão dos conceitos apre- A Janela de Edição/Depuração é usada para criar ou modificar arquivos M. Ela
sentados no Capítulo 1. Se você tiver dificuldades com o teste, releia as seções, consulte exibe o conteúdo do arquivo M com uma codificação de cores por função: comentários,
seu professor ou discuta o material com um colega. As respostas estão no Apêndice B. palavras-chave, cadeias de caracteres, e assim por diante.
A Janela de Figuras é utilizada para exibir gráficos.
1. Qual é a função da Janela de Comandos MATLAB? E a da Janela de Edi- Um usuário MATLAB pode obter ajuda por meio do Navegador de Ajuda cu das
ção/Depuração? E a da Janela de Figuras? funções de ajuda em linha de comando help e lookfor. O Navegador de Ajuda
2. Liste as diferentes maneiras de obter ajuda no MATLAB. possibilita acesso total à documentação MATLAB. A função de linha de comando
help apresenta ajuda sobre funções específicas na Janela de Comandos. Infelizmente,
3. O que é um espaço de trabalho? Como você pode determinar o que está arma-
você precisa saber o nome da função para obter ajuda sobre ela. A função lookfor
zenado em um espaço de trabalho MATLAB?
procura urna cadeia de caracteres na primeira linha de comentários de todas as funções
4. Como você pode limpar o conteúdo de um espaço de trabalho? MATLAB e exibe os casamentos.
5. A distância percorrida por uma bola em queda livre é dada pela equação. Quando um usuário digita um comando na Janela de Comandos, o MATLAB pro-
cura o comando nos diretórios especificados no caminho MATLAB. O MATLAB executa
1 o primeiro arquivo M no caminho que casa com o comando, e qualquer outro arquivo M
x = x 0 + v 0t + - at2
com o mesmo nome nunca é encontrado. A Ferramenta de Caminho pode ser usada
2
para adicionar, remover ou modificar diretórios no caminho MATLAB.
Use o MATLAB para calcular a posição da bola no tempo t = 5 s se x 0 = 10 m,
v 0 = 15 m/s e a= -9,81 m/s2.
6. Suponha que x = 3 e y = 4. Use o MATLAB para avaliar a seguinte expressão: 1.5.1 Resumo do MATLAB
x2y3 O resumo abaixo lista todos os símbolos especiais MATLAB descritos neste capítulo,
(x -y)2 juntamente com uma breve descrição de cada um.

As questões abaixo devem auxiliá-lo a familiarizar-se com as ferramentas MATLAB. Símbolos Especiais
(Se tiver uma versão do MATLAB anterior à 6.0, você pode sentir certa dificuldade + Soma
com algumas questões, pois algumas ferramentas são diferentes em versões mais - Subtração
antigas do MATLAB.) * Multiplicação
/ Divisão
7. Execute os arquivos M calc_area. m e s in_x. rn na Janela de Comandos. " Potência
Depois, utilize o Navegador do Espaço de Trabalho para determinar quais va-
riáveis estão definidas no espaço de trabalho corrente.
8. Use o Editor de Matrizes para examinar e modificar o conteúdo da variável x 1.6 Exercícios
no espaço de trabalho. Então, digite o comando plot (x, y) na Janela de
Comandos. O que acontece com os dados exibidos na Janela de Figuras? 1.1 As seguintes declarações MATLAB desenham a função y(x} = 2e-o.2, para o inter-
valo O ~ x ~ 10.
X = 0:0.1:10;
y = 2 * exp( -0.2 * x);
1.5 Resumo plot (x,y);

Neste capítulo, estudamos os tipos básicos de janelas MATLAB, o espaço de trabalho e Utilize a Janela de Edição MATLAB para criar um novo arquivo M, digite essas
como obter ajuda on-line. A área de trabalho MATLAB surge quando iniciamos o pro- declarações no arquivo e grave o arquivo com o nome tes t 1 . m. Execute o programa
grama. Ela integra muitas das ferramentas do MATLAB em um único local. Dentre digitando o nome testl na Janela de Comandos. Que resultado você obtém?
essas ferramentas, temos a Janela de Comandos, a Janela de Histórico de Comandos, o 1.2 Obtenha ajuda a respeito da função MATLAB exp usando: (a) o comando "help
Espaço de Lançamentos, o Navegador do Espaço de Trabalho, o Editor de Matrizes e exp" digitado na Janela de Comandos e {b) o Navegador de Ajuda.
20 1 Programação em MATLA88 parn Engenheiros
\.'j!,

1.3 Utilize o comando lookfor para determinar como obter o logaritmo base 10 de

2
.~

um número em MATLAB.
1.4 Suponha que u = 1 e v = 3. Avalie as expressões a seguir usando o MATLAB: Capítulo
4u
a.
3v
2v- 2
b.
(u + v)2
v3
c.
v3- u3 MATLAB Básico
t
4
d. - n v2
3
1.5 Utilize o Navegador de Ajuda do MATLAB para encontrar o comando necessário
para mostrar o diretório corrente MATLAB. Qual é o diretório corrente quando
o MATLAB é iniciado?
Neste capítulo, vamos apresentar alguns elementos básicos da linguagem
1.6 Utilize o Navegador de Ajuda do MATLAB para descobrir como criar um novo
MATLAB. No final, você deve ser capaz de escrever programas MATLAB simples,
diretório de dentro do MATLAB. Crie um novo diretório, denominado mynewdir,
porém funcionais.
sob o diretório corrente. Coloque esse novo diretório no topo do caminho MATLAB.
1.7 Modifique o diretório corrente para mynewdir. Abra uma Janela de Edição e adi-
cione as seguintes linhas:
2.1 Variáveis e Matrizes
% Create an input array from -2*pi to 2*pi
t -2*pi:pi/10:2*pi; A unidade fundamental de dados, em qualquer programa MATLAB, é a matriz. Matriz
% Calculate lsin(t) é uma coleção de valores de dados organizados em linhas e colunas, conhecidos por um
x = abs (sin(t)); nome único (ver Figura 2.1). Valores individuais de dados em uma matriz são acessados
por meio do nome da matriz, seguido de índices entre parênteses que identificam a
% Plot resul t
linha e a coluna do valor particular. Mesmo os escalares são tratados como matrizes no
plot(t,x);
MATLAB - eles são simplesmente matrizes com somente uma linha e uma coluna.
Grave o arquivo com o nome tes t2. me execute-o digitando test2 na Janela de Matrizes podem ser classificadas como vetores ou matrizes propriamente ditas. O
Comandos. O que acontece? termo "vetor" geralmente descreve uma matriz com somente uma dimensão, enquanto
1.8 Feche a Janela de Figuras e retorne ao diretório original do início Jo MATLAB. o termo "matriz" costuma ser usado para descrever matrizes com duas ou mais di-
Digite "tes t2" na Janela de Comandos. O que acontece, e por quê? mensões. Neste texto, vamos usar o termo vetor na discussão de matrizes unidimen-
sionais, e o termo matriz na discussão de matrizes com duas ou mais dimensões. Se
uma discussão em particular se aplicar aos dois tipos de matrizes, usaremos também o
termo genérico "matriz"*.
O tamanho de uma matriz é especificado pelo número de linhas e de colunas,
sendo o número de linhas apresentado antes. O número total de elementos da matriz
será o produto do número de linhas e o número de colunas. Por exemplo, os tamanhos
das matrizes a seguir são:

NT: No original em inglês, o termo genérico é nrr/1}/, ficando o termo matrix reservado para matrizes com
duas ou mais dimensões. Nesta tradução, explicitaremos quando estivermos falando de matrizes em
geral ou de matrizes com necessariamente duas ou mais dimensões.
22 1 Programação em MATLAEfl para Engenheiros Capítulo 2 MATIAS Básico 1 23

Os nomes das variáveis MATLAB precisam iniciar com uma letra, seguida de
Linha 1---. qualquer combinação de letras, números e o símbolo de sublinhado (_). Somente os
primeiros 31 caracteres são significativos; se mais do que 31 caracteres forem utilizados,
os caracteres restantes serão ignorados. Se duas variáveis forem declaradas com dife-
rença somente no 32!! caractere, o MATLAB as tratará como a mesma variável.
Linha2---.

Linha a--.
Certifique-se de que os nomes de variáveis sejam únicos nos primeiros 31 caracteres.
Caso contrário, o MATLAB não poderá diferenciar as variáveis.

Ao escrever um programa, é importante escolher nomes com significado para as


'i i i i i
Gol. 1 Gol. 2 Col. 3 Gol. 4 Gol. 5
variáveis. Nomes com significado tomam um programa muito mais fácil de ler e man-
ter. Nomes como dia, mes e ano são claros até mesmo para alguém que vê o programa
pela primeira vez. Como os espaços não podem ser usados em nomes de variáveis
matriz arr MATLAB, o caractere de sublinhado pode ser usado para criar nomes com significado.
Por exemplo, taxa de câmbio poae ser representada como taxa_de_cambio.
Figura 2.1 Uma matriz é uma coleção de valores de dados organizados em linhas e colunas.
A matriz arr exibida aqui é composta por 20 elementos, organizados em quatro
linhas e cinco colunas. O elemento destacado nessa matriz seria identificado como
arr(3,2).
Sempre use nomes descritivos e fáceis de lembrar para suas variáveis. Por exemplo,
uma taxa de câmbio poderia ser chamada de taxa_de_cambio. Essa prática tomará
seu programa mais claro e fácil de entender.
~f;
Matriz Tamanho
É também importante incluir um dicionário de dados no cabeçalho de qualquer

a= [ ~:] Essa é uma matriz 3 x 2 que contém 6 elementos.


programa que você escrever. Um dicionário de dados lista a definição de cada variável
usada em um programa. A definição deve incluir uma descrição do conteúdo e as
unidades de medidas usadas. Um dicionário de dados pode parecer desnecessário
b = [1 2 3 4] Essa é uma matriz 1 x 4, conhecida como um vetor-linha; contém 4 elementos. enquanto o programa está sendo escrito, mas é de grande valor quando você ou outra
e=[ i] Essa é uma matriz 3 x 1, conhecida como vetor-coluna; contém 3 elementos.
pessoa precisa voltar para o programa posteriormente.

Elementos individuais na matriz são identificados pelo nome da matriz, seguido


da linha e da coluna do elemento em particular. Se a matriz é um vetor linha ou co- Crie um dicionário de dados para cada programa, a fim de tomar mais fácil a

1 luna, somente um índice é requerido. Por exemplo, nas matrizes acima, a ( 2 , 1 ) = 3


ec(2) = 2.
manutenção dos programas.

Uma variável MATLAB é uma região de memória que contém uma matriz,
conhecida por um nome especificado pelo usuário. O conteúdo de uma matriz pode ser A linguagem MATLAB é sensível à capitalização, o que significa que letras maiús-
utilizado ou modificado a qualquer momento pela inclusão de seu nome em um co- culas e minúsculas não são a mesma coisa. Assim, as variáveis name, NAME e Narne são
mando MATLAB apropriado. diferentes no MATLAB. Você precisa ser cuidadoso no uso de capitalização ao em-

L. L
24 1 Programação em MATLAEf'P para Engenheiros Capítulo 2 MATLAB Básico 1 25

l
\, !
pregar uma variável. Embora não seja requerido, é usual utilizar caixa baixa para nomes
de variáveis ordinárias.

B~a Prática de Programação


---As duas primeiras maneiras serão discutidas aqui; a terceira abordagem será discutida
na seção 2.7.

2.2.1 Iniciando Variáveis em Expressões de Atribuição


1, Verifique se você capitaliza uma variável exatamente da mesma forma cada vez que ela A forma mais simples de criar e iniciar uma variável é associar um ou mais valores em
é usada. Uma boa prática é usar sempre caixa baixa em nomes de variáveis. uma declaração de atribuição. Uma declaração de atribuição tem a forma geral
var = expressão

Os tipos mais comuns de variáveis MATLAB são double e char. Variáveis do onde var é o nome de uma variável e expressão é uma constante escalar, uma matriz
tipo double são escalares ou matrizes de 64 bits com números de dupla precisão e ou a combinação de constantes, outras variáveis e operações matemáticas(+, - etc.). O
ponto flutuante. Elas podem representar valores reais, imaginários ou complexos. Os valor da expressão é calculado por meio das regras normais da matemática, e o resul-
componentes reais e imaginários de cada variável podem ser números positivos ou tado é armazenado na variável. Exemplos simples de variáveis iniciadas com decla-
negativos, variando de 10-3os a 10308, com 15 a 16 dígitos decimais de precisão. São o tipo rações de atribuição são:
numérico principal de dados no MATLAB.
Uma variável do tipo double é criada automaticamente quando um valor var = 40*i;
numérico é associado a um nome de variável. Por exemplo, a declaração a seguir cria var2 = var / 5;
uma variável de nome var contendo um elemento único de tipo double, e armazena array = [1 2 3 4];
o valor complexo {l + i) nela. x = l; y = 2;
var = 1 + i; O primeiro exemplo cria um escalar do tipo double e armai:ena o número imaginário
40i nele. O segundo exemplo cria uma variável escalar var2 e armazena o resultado da
Variáveis do tipo char são compostas por escalares ou matrizes com valores de 16
expressão var / 5 nela. O terceiro exemplo cria uma variável array e armazena nela um
bits, cada uma representando um único caractere. Matrizes desse tipo são usadas para
cadeias de caracteres. São criadas automaticamente quando um caractere único ou vetor linha de quatro elementos. O último exemplo mostra que declarações múltiplas
uma cadeia de caracteres são associados a um nome de variável. Por exemplo, a decla- de atribuição podem ser colocadas em uma mesma linha, desde que elas sejam sepa-
ração abaixo cria uma variável do tipo char com o nome cornment e armazena a cadeia radas por vírgula ou ponto-e-vírgula. Observe que, se alguma das variáveis já existisse
especificada nela. Uma vez executada a declaração, commcn t será uma matriz de durante a execução da declaração, os conteúdos anteriores seriam perdidos.
caracteres de l x 26. Conforme mostra o terceiro exemplo, variáveis podem também ser iniciadas com
matrizes de dados. Essas matrizes são construídas com o uso de colchetes ( [ l ) e ponto-
cornrnent 'Isso ó urna cadeia de caracteres'; e-vírgula. Todos os elementos de uma matriz são listados por linha. Em outras palavras,
Em linguagens como C, o tipo e o nome de cada variável precisam ser declarados os valores de cada linha são listados da esquerda para a direita, com a linha de cima
1 explicitamente em um programa antes de usar a variável. Essas linguagens são primeiro e a linha de baixo por último. Valores individuais cm uma linha são separados
chamadas de tipos fortes. Em contraste, MATLAB é uma linguagem tipos fracos. por brancos ou por vírgulas, e as linhas são separadas por ponto-e-vírgula ou no,as li-
1 nhas. As expressões a seguir são todas matrizes sintaticamente corretas que podem ser
i,I Variáveis podem ser criadas a qualquer momento simplesmente associando valores a
elas, e os tipos de dados associados à variável determinam o tipo de variável criada. usadas para iniciar uma variável:

l 2.2 Iniciando Variáveis no MATLAB


[ 3, 4] Essa expressão cria urna matriz 1 x 1 {um escalar)
que contém o valor 3,4. Os colchetes não são neces-

~'I
sários nesse caso.
[1,0 2,0 3,0] Essa expressão cria uma matriz 1 x 3 que contém o
Variáveis MATLAB são criadas automaticamente quando iniciadas. Existem três formas vetor-linha [1 2 3].
,1 comuns de iniciar uma variável em MATLAB:
[1,0; 2,0; 3,0) Essa expressão cria uma matriz 3 x 1 com o ,etor-

rn
li
1. Associar dados à variável em uma declaração apropriada.
li 2. Fornecer dados à variável pelo teclado.
jl mlun,
3. Ler dados de um arquivo.

li L
26 1 Programação em MATLA!fi!' para Engenheiros Capítulo 2 MATlAB Básico j 27

,,1

~
[l, 2, 3; 4, 5, 6] Essa expressão cria uma matriz 2 x 3 que contém a O ponto-e-vírgula no final de cada declaração de atribuição anterior tem uma
função especial: ele suprime o eco automático de valores que ocorre normalmente quando
matriz [ 1 2 3]
4 5 6 uma expressão é avaliada em uma declaração de atribuição. Se urna declaração de
[ 1, 2, 3 Essa ex[ressão cria uma matriz 2 x 3 que contém a atribuição é digitada sem o ponto-e-vírgula, os resultados da declaração são automati-
\, 4, 5, 6l camente exibidos na Janela de Comandos.
matriz 1 2 3 ]. O final da primeira linha encerra
4 5 6
» e [1, 2, 3; 4, 5, 6]
a primeira linha da matriz.
e
[] Essa expressão cria uma matriz vazia, que não con- 1 2 3
tém linhas nem colunas. (Observe que isso não é a 4 5 6
mesma coisa que uma matriz com zeros.)
Se um ponto-e-vírgula é colocado no final da declaração, o eco desaparece. O eco é uma
Observe que o número de elementos em cada linha de uma matriz precisa ser o forma excelente para verificar rapidamente o seu trabalho, mas ele atrasa seriamente a
mesmo. O número de elementos em cada coluna também precisa ser o mesmo. execução de programas MATLAB. Por essa razão, normalmente suprimimos o eco o
Uma expressão como
tempo todo.
[1 2 3; 4 5]; Ecoar os resultados de cálculos, entretanto, é uma ótima técnica prática de depuração.
Se você não está seguro a respeito dos resultados de uma declaração de atribuição espe-
é ilegal, pois a linha 1 tem três elementos e a linha 2 tem somente dois elementos. cífica, simplesmente não coloque o ponto-e-vírgula na declaração: os resultados serão
exibidos na Janela de Comandos assim que a declaração for executada.

O número de elementos em todas as linhas de uma matriz precisa ser o mesmo, e o nú-
mero de elementos em todas as colunas também. Tentar definir uma matriz com
11?'.rrática de Programação
números diferentes de elementos nas linhas ou nas colunas produzirá um erro quando Use um ponto-e-vírgula no final de todas as declarações de atribuição MATLAB para
a declaração for executada. suprimir o eco de valores atribuídos na Janela de Comandos, Isso acelera muito a exe-
cução dos programas.

As expressões utilizadas para iniciar matrizes podem incluir operações algébricas


e a totalidade ou partes de matrizes previamente definidas. Por exemplo, as declarações
de atribuição
f~!;;-,

a [O 1+7]; lp;a Prática de Programação


b [a(2) 7 a];
Se for preciso examinar os resultados de uma declaração durante a depuração de um
definirão uma matriz a = [ O 8] e uma matriz b = [ 8 7 O 8] . programa, você pode remover o ponto-e-vírgula daquela declaração para que seus
Nem todos os elementos de uma matriz precisam estar definidos quando ela é resultados sejam ecoados na Janela de Comandos.
criada. Se um elemento específico da matriz estiver definido e um ou mais elementos
antes dele não, os elementos anteriores serão automaticamente criados e iniciados com
1

~- o valor zero. Por exemplo, se c não foi previamente definido, a declaração


c(2, 3) = 5;

--, ,,1
. , a ma tr·1z e = [ O O O ] . De maneira
prod uzira
O O 5
. ·1ar, uma matriz
. srm1 . pod e ser estendida

pela especificação de um valor para um elemento adiante do tamanho definido. Por


2.2.2 Iniciando com Expressões de Atalho
É simples criar pequenas matrizes listando explicitamente cada termo na matriz, mas o
exemplo, suponha a matriz d = [1 2]. Então, a declaração que ocorre se a matriz contiver centenas ou mesmo milhares de elementos? Não é práti-
d(4) = 4;

produzirá a matriz d [1 2 O 4J. L


\
co escrever separadamente cada elemento da matriz!
O MATLAB tem urna notação especial de atalho para essas circunstâncias, utíli-
zando o opmdo, dois-ponto,. O operndo, dois-pontos especifica =•
sfrie de ,almes
lõ I Programação em MATlAEfS' para Engenheiros Capítulo 2 MATlAB Básico i 29

pela especificação do primeiro valor na série, o passo de incremento e o último valor na --~-~eras com o mesmo tamanho de outra matriz. Alguns exemplos de uso da função
~1-1, série. A forma geral de um operador dois-pontos é
prirn:incr:último
zeros são apresentados a seguir.

a zeros (2);
b zeros ( 2, 3) ;
onde prim é o primeiro valor na série, incr é o passo de incremento e último é o
e [1 2; 3 4l ;
último valor na série. Se o incremento for um, ele pode ser omitido. Por exemplo, a
d zeros (size (e) l;
expressão 1:2:10 é um atalho para um vetor-linha de 1 x 5 com os valores 1, 3, 5, 7 e 9.
» X 1:2:10
X Tabela 2.1 Funções MATLAB Úteis para Iniciar Variáveis
1 3 5 7 9
Função Propósito
Com a notação de dois pontos, uma matriz pode ser iniciada com os cem valores zeros(n) Gera uma matriz n x n de zeros.
1t 1!I., ..., 1t da seguinte maneira:
100' 100 zeros(n,m) Gera uma matriz n x m de zeros.
zeros {size (arr)) Gera uma matriz de zeros do mesmo tamanho que arr.
angles = (0,01:0,01:1) * pi;
ones(nl Gera uma matriz n x n de uns.
Expressões de atalho podem ser combinadas com o operador de transposição (') ones(n,m) Gera uma matriz n x m de uns.
para iniciar vetores coluna e matrizes mais complexas. O operador de transposição
ones(size(arr)) Gera uma matriz de uns do mesmo tamanho que arr.
troca linhas e colunas de qualquer matriz à qual ele seja aplicado. Assim, a expressão
eye(nl Gera uma matriz identidade n x n.
f = [1:4]'; eye(n,m) Gera uma matriz identidade n X m.

nJ
gera um vetor linha de quatro elementos [1 2 3 4], e depois transpõe esse vetor no vetor length(arr) Retorna o comprimento de um vetor ou a dimensão maior de uma matriz bidi-
mensional.
size(arr) Retorna dois valores, especificando o número de linhas e o de colunas em arr.
coluna de quatro elementos f " De maneirn simi!ac, as e, pcessões

j g 1:4;
Essas expressões geram as seguintes matrizes:
. 1
h [g' g' l; a b
oº]
o o
produzem a matriz h
[HJ e

De maneira similar, a função ones pode ser usada para gerar matrizes que contêm
uns, e a função cye pode ser usada para gerar matrizes identidade, nas quais os ele-
mentos da diagonal principal são uns e os outros elementos são zeros. A Tabela 2.1 apre-
senta uma lista de funções MATLAB comuns e úteis para iniciar variáveis.
2.2.3 Iniciando com Funções Predefinidas
Matrizes também podem ser iniciadas por meio de funções predefinidas do MATLAB.
Por exemplo, a função zeros pode ser usada para criar uma matriz de zeros do tamanho 2.2.4 Iniciando Variáveis com Entrada pelo Teclado
desejado. Existem muitas formas de função zeros. Se a função tiver um único argu-
mento escalar, ela produzirá uma matriz quadrada utilizando o argumento único como Também é possível iniciar uma variável com dados digitados diretamente pelo teclado.
o número de linhas e de colunas da matriz. Se a função tiver dois argumentos escalares, Essa opção permite que um arquivo de script solicite ao usuário a entrada de valores
o primeiro argumento será o número de linhas e o segundo argumento será o número durante a execução. A função input exibe um marcador na Janela de Comandos e
de colunas. Como a função size retoma dois valores com o número de linhas e de colu- espera o usuário digitar uma resposta. Por exemplo, considere a seguinte expressão:
nas na matriz, ela pode ser combinada com a função zeros para gerar uma matriz de my_val = input ('Enter an input value:');
.,u I nugramaçao em IVIAILAl:f" para tngenne,ros Capitulo 2 MATLAB Básico J 31

Quando essa expressão é executada, o MATLAB escreve a cadeia 'Enter an input 4. Qual o valor de w ( 2 , 1 ) ?
value: ' e espera a resposta do usuário. Se o usuário fornece um único número, o
5. Qual o valor de x ( 2 , 1 ) ?
número pode ser digitado. Se o usuário fornece uma matriz, ela precisa ser cercada por
colchetes. De qualquer maneira, o que for digitado será armazenado na variável 6. Qual o valor de y ( 2 , 1 ) ?
\, my_ val quando a tecla Enter for pressionada. Se apenas a tecla Enter for pressionada, 7. Qual o valor de v ( 3) após a execução da expressão (g)?
uma matriz vazia será criada e armazenada na variável.
Se a função input tiver o caractere 's ' como segundo argumento, os dados de
entrada serão devolvidos para o usuário como uma cadeia de caracteres. Assim, a
expressão

» inl = input('Enter data: ');


Enter data: 1.23
Linha 1---. Linha 1---.
armazena o valor 1. 2 3 em inl, e a expressão
» in2 = input('Enter data: ','s'};
Linha 2---. Linha 2---.
Enter data: 1.23
armazena a cadeia de caracteres '1. 2 3 ' em in2.
Linha3---.

este 2.1
linha4---.
Este teste apresenta uma verificação rápida do seu entendimento dos conceitos apre-
sentados nas Seções 2.1 e 2.2. Se você tiver problemas com o teste, releia as seções, per-
gunte ao seu professor ou discuta o material com um colega. As respostas podem ser
encontradas no final do livro.

1. Qual a diferença entre uma matriz e um vetor?


i i i i i
Cal. 1 Cal. 2 Cal. 3 Cal. 4 Ccl. 5

2. Responda às questões seguintes considerando a matriz abaixo. al (ilin) a2 (ilin, icol)


(a) Matriz Unidimensional (b) Matnz Bidimensional
1, 1 -3,2 3,4 0,6]
e = [ 0,6 1,1 -0,6 3,1
Figura 2.2 Representações de matrizes uni e bidimensionais.
1,3 0,6 5,5 0,0
a. Qual o tamanho de e?
b. Qual o valor de e ( 2, 3 )?
e. Apresente os índices de todos os elementos cujo valor seja 0,6.

3. Determine o tamanho das seguintes matrizes. Verifique suas respostas criando 2.3 Matrizes Multidimensionais
as matrizes no MATLAB e usando o comando whos ou o Navegador do Espaço
de Trabalho. Observe que as últimas matrizes podem depender das definições de , Conforme vimos, as matrizes MATLAB podem ter uma ou mais dimensões. Matrizes
matrizes definidas anteriormente neste exercício. unidimensionais podem ser visualizadas como uma série de valores colocados em urna
a. u [ 10 20*i 10+20]; coluna, com um único índice para selecionar os elementos individuais da matriz (Figura
b. v [ - :!_; 2 O; 3 J ; 2.2a). Essas matrizes são úteis para descrever dados que são funções de uma variável
c. w l1 o -9; 2 -2 o; 1 2 3 J; independente, corno uma série de medidas de temperatura efetuadas em intervalos
d. x [u' v); fixos de tempo.
e. y ( 3 , 3) = - 7; Alguns tipos de dados são funções de mais do que uma variável independente.
f. z = [ zeros ( 4, 1) ones ( 4, 1) zeros ( 1, 4) ' J ; Por exemplo, podemos medir a temperatura em cinco localidades diferentes e quatro
g. V ( 4) = X ( 2, 1); momentos diferentes. Nesse caso, nossas 20 medidas poderiam ser logicamente
32 1 programação em MATLA~ para Engenheiros
Capitulo 2 MATLAB Básico 1 33

agrupadtls em cinco colunas, cada uma contendo quatro medidas, sendo cada coluna -+--------rapido, e assim por diante; o último índice é o incrementado mais lentamente. Por
reservadil para uma localização (Figura 2.2b). Nesse caso, usamos dois índices para , exemplo, ern uma matriz 2 x 2 x 2, os elementos seriam alocados na seguinte ordem:
acessar tlm dado elemento na matriz: o primeiro índice para selecionar a linha e o (1,1,1), (2,1,1 ), (1,2,1), (2,2,1), (1,1,2), (2,1,2), (1,2,2), (2,2,2).
segundo ]:>ara selecionar a coluna. Essas matrizes são denominadas matrizes bidimen-
sionais. () número de elementos em uma matriz bidimensional será o produto dos
números de linhas e de colunas na matriz. 2.3.2 Acessando Matrizes Multidimensionais com um Único Subscript
º, 1;'fATLAB permite a criação de matrizes com tantas dimensões quanto
Uma das peculiaridades do MATLAB é que ele permite que um usuário ou pro-
necessartl) para um dado problema. Essas matrizes têm um índice para cada di-
gramador trate uma matriz multidimensional como se ela fosse uma matriz
mensão, e um elemento individual é selecionado pela especificação de um valor
unidimensional cujo comprimento é igual ao número de elementos na matriz multi-
para cada. índice. O número total de elementos na matriz será o produto do valor máxi-
dimensional. Se uma matriz multidimensional for endereçada por meio de uma
mo de ca:tla índice. Por exemplo, as duas expressões seguintes criam uma matriz e
única dimensão, os elementos serão acessados na ordem em que foram colocados
de 2 x 3 ><: 2:
na memória.
Por exemplo, suponha a declaração de uma matriz de elementos 4 x 3 a:
>> t::(:,:,1)=[1 2 3; 4 5 6] ;
>> t::(:,:,2)=[7 8 9; 10 11 12];
>> vhos e
Ni'trne Size Bytes Class
e 2x3x2 96 double array a (1, 1)
1
Es~a- matriz contém 12 elementos organizados (2 x 3 x 2), e seu conteúdo pode ser 4 a(2,l)
ex1b1do como o de qualquer matriz.
7 a (3, 1)
>> <;:
e (:,:, 1) 10 a (4, 1)
1 2 3 1 2 3
2 a(l,2)
4 5 6
e (:,:, 2)
4 5 6 5 a(2,2)
7 8 9
10 11 12 8 a (3, 2)
7 8 9
J 10 11 12
11 a (4, 2)

3 a ( 1, 3)
2.3.1 Armazenando Matrizes Multidimensionais em Memória
6 a (2, 3)
Uma matriz multidimensional com m linhas e n colunas conterá m x n elementos, e esses
elementos ocuparão rn x n localizações sucessivas na memória do computador. Como 9 a(3,3)
esses elerAentos são organ!zados na memória do computador? O MATLAB sempre
aloca os el~mentos da matnz em ordem de coluna - ou seja, aloca a primeira coluna na 12 a(4, 3)
memória, <fopois a segunda, depois a terceira, e assim por diante, até que todas as colu-
nas tenhaAl sido alocadas. Na Figura 2.3, temos esse esquema de alocação de memória
para uma A1atriz 4 x 3 a. Como podemos ver, o elemento a ( 1, 2 ) é efetivamente o quinto
elemento Mocado na memória. A ordem de alocação desses elementos na memória será (b)
(a)
imp~rtant~ quando discutirmos endereçamento de índice único, na próxima seção, e as
funçoes de E/S de baixo nível, no Capítulo 8.
O me6mo esquema de alocação se aplica a matrizes com mais de duas dimensões. Figura 2.3 (a) Valores de dados para a matriz a. (b) Organização dos valores na memóna para
O primeir() índice da matriz é incrementado mais rápido, o segundo índice, menos a matriz a.
34 1 Programação em MATlAB1" para Engenheiros Capitulo 2 MAT/AB Básico 35

>>
a =
a = [1 2 3; 4 5 6; 7 8 9; 10 11 12]
+ ~---2~4.1 A Função end
1 2 3 O MATLAB tem uma função especial denominada end, muito útil para criar
4 5 6 índices de matrizes. Quando utilizada no índice de uma matriz, a função end re-
7 8 9 torna o valor mais alto admitido para ele. Por exemplo, suponha que a matriz :i.rr3
10 11 12
seja definida como
O valor de a ( 5 ) , então, será 2, que é o valor do elemento a ( 1 , 2 ) , pois a {1 , 2 ) foi alo- arr3 = [ 1 2 3 4 5 6 7 8 l ;
cado em quinto lugar na memória.
Em circunstâncias normais, você nunca deveria utilizar esse recurso do MATLAB. Então, arr 3 ( 5 : end) seria a matriz [ 5 6 7 8 ] , e ar r 3 {er:d) seria o valor 8.
O endereçamento de matrizes multidimensionais com um índice único é uma receita O valor retornado por end é sempre o valor mais alto de um dado índice. Se end
para confusão. aparece em diferentes índices, ele pode retomar diferentes valores na mesma expressão.
Por exemplo, suponha que a matriz 3 x 4 arr4 seja definida como:

Q'oª Prática• de Programação arr4 = (1 2 3 4; 5 6 7 8; 9 10 11 12];

Sempre utilize o número apropriado de dimensões ao endereçar uma matriz multi- A expressão arr 4 {2 : end, 2 : end) retornaria a matriz [ 6 7 8 ] . Observe que o pri-
dimensional. 10 11 12
meiro end retornou o valor 3, enquanto o segundo end retomou o valor 4!

2 .4 Submatrizes
2.4.2 Utilizando Submatrizes no Lado Esquerdo de uma Declaração de
É possível selecionar e utilizar subconjuntos de matrizes MATLAB como se fossem Atribuição
matrizes separadas. Para selecionar uma parte de uma matriz, simplesmente inclua
É também possível utilizar submatrizes no lado esquerdo de declarações de atribuição
uma lista de todos os elementos a serem selecionados entre parênteses após o nome
da matriz. Por exemplo, suponha que a matriz arrl seja definida da seguinte para atualizar somente alguns valores da matriz, desde que a forma (o número de linhas
maneira: e de colunas) dos valores atribuídos case com a forma da submatriz. Se as formas não
casarem, ocorrerá um erro. Por exemplo, suponha que a matriz 3 x 4 arr4 seja defi-
arrl = [1.1 -2.2 3.3 -4.4 5.5]; nida como:

Então, arrl { 3) é simplesmente 3.3, arrl ( [ 1 4] ) é a matriz [ 1. 1 -4. 4] e >> arr4 [1 2 3 4; 5 6 7 8; 9 10 11 12]
arrl(l:2:5) éa matriz [l.1 3.3 5.5]. arr4
Para uma matriz bidimensional, dois-pontos podem ser usados como índice para 1 2 3 4
i
,, selecionar todos os valores daquele índice. Por exemplo, suponha que 5 6 7 8
9 10 11 12
arr2 = [12 3; -2 -3 -4; 3 4 5];
Então, a seguinte declaração de atribuição é legal, uma vez que as expressões nos dois

Essa deda;ação cria,ia uma matriz arr2 contendo os valores [-i -; -: ]. lados do sinal de igual têm a mesma forma (2 x 2):

>> arr4(1:2, [1 4]} = [20 21; 22 23]


Com essa definição, a submatriz arr2 ( 1 , : ) seria [ 1 2 3 J, e a submatriz arr2 { : , 1 : 2 : 3) arr4 =

~ri• H-H 20
22
9
2
6
10
3
7
11
21
23
12

Ítn,
,,.._, ilti I Programação em MATUIIJ9 para Engenheiros ft Capitulo 2 MATUIB Básico 1 37

i
f
1
Observe que os elementos (1,1), (1,4), (2,1) e (2,4) da matriz foram atualizados. +--,:4;3 Atribuindo um Escalar a uma Submatriz
Contrastando com isso, a expressão a seguir é ilegal, pois os dois lados não têm a

1'
mesma forma.
>> arrS(l:2,1:2} = [3 4]
i
1
Um valor escalar no lado direito de uma declaração de atribuição sempre casa com a
forma especificada no lado esquerdo. O valor escalar é copiado em todos os elementos
i especificados no lado esquerdo da declaração. Por exemplo, assuma que a matriz 3 x 4
??? Em uma atribuição A(matriz,matriz) = B, o número de li- 1
nhas em B e o número de elementos em A com linha de índice arr4 seja definida como:
r
matriz precisam ser os mesmos. arr4 = (1 2 3 4; 5 6 7 8; 9 10 11 12];
Nesse caso, a expressão abaixo atribui o valor um a quatro elementos da matriz:
ÊrrÔs..de Programação >> arr4(1:2,1:2} = 1
arrS
Para declarações de atribuição com submatrizes, as formas das submatrizes em ambos os 1 1 3 4
lados do sinal de igual precisam casar. O MATLAB gerará um erro se elas não casarem. 1 1 7 8
9 10 11 12

Existe uma diferença importante, no MATLAB, entre atribuir valores a uma submatriz
e atribuir valores a uma matriz. Se valores são atribuídos a uma submatriz, somente aqueles 2.5 Valores Especiais
valores são atualizados e todos os outros valores na matriz permanecem inalterados. Por outro lado,
se valores são atribuídos a uma matriz, todo o conteúdo da matriz é apagado e substituído pelos O MATLAB tem diversos valores especiais predefinidos, que podem ser usados a qual-
novos valores. Por exemplo, suponha que a matriz 3 x 4 arr4 seja definida como: · quer momento, sem terem sido_iniciados antes. Uma lista dos valores predefinidos mais
1 comuns é dada na Tabela 2.2. ·
>> arr4 [1 2 3 4; 5 6 7 8; 9 10 11 12] Esses valores predefinidos são armazenados em variáveis ordinárias, portanto, podem ser
1 arr4 sobrescritos ou modificados por um usuário. Se um novo valor for atribuído a um~ das
' 1 2 3 4 variáveis predefinidas, ele substituirá o valor fornecido em todos os cálculos poste-
i 5 6 7 8 riores. Por exemplo, considere as seguintes declarações que calculam a circunferência
1, 9 10 11 12 de um árculo com raio de 10 cm:
1
1
Então, a seguinte declaração de atribuição substitui os elementos especificados de arr4: circl = 2 *pi* 10
,,l
., >> arr4(1:2, [1 4))
arr4 =
= [20 21; 22 23)
pi= 3;
circ2 = 2 *pi* 10
20 2 3 21
22 6 7 23
9 10 11 12 Tabela 2.2 Valores Especiais Predefinidos
Função Propósito
Contrastando com isso, a seguinte declaração de atribuição substitui todo o conteúdo de
i
arr4 por uma matriz 2 x 2: pi Armazena lt com 15 dígitos significativos.

f >> arr4
arr4 =
[20 21; 22 23)
i, j
lnf
Contêm o valor i (-.r=i }.
Esse símbolo representa um infinito de máquina. É usualmente gerado como resultado de
divisão por O.
20 21 ,, NaN Esse símbolo significa Não É Número. Ele é o resultado de uma operação matemática indefini-
22 23 da, como a divisão de zero por zero.
' clock Essa variável especial contém a data e a hora correntes na forma de um vetor linha de 6 ele-
mentos, contendo ano, mês, dia, hora, minuto e segundo.
!. Boa Prática de Programação date Contém a data corrente em formato de cadeia de caracteres, como 24-Nov-1999.
eps Esse nome de variável abrevia epsi1on. Ele representa a menor diferença entre dois números que
i Diferencie corretamente a atribuição de valores a uma submatriz e a uma matriz. O pode ser representada no computador.
1 MATLAB tem comportamentos diferentes nesses dois casos. ans Uma variável especial usada para armazenar o resultado de uma expressão, caso esse resultado

.
não seja explicitamente atribuído a outra variável.

1i .. ,
38 1 Programação em MATIAS® para Engenheiros
Capitulo 2 MATIAB Básico 1 39

Na primeira declaração, pi tem valor fornecido de 3,14159 ..., então circl vale 62 8319 b. a = eye ( 3 , 3 ) ;
que é a circunferência correta. A segunda declaração redefine pi para 3, então, ~a ter~ b = [4 5 6];
ceira declaraç~o, circ2 vale 60. Modificar um valor predefinido no programa criou a(:,3) = b';
uma resposta incorreta e introduziu um erro sutil e difícil de encontrar. Imagine tentar
c. a = eye ( 3 , 3 ) ;
localizar a origem de um erro oculto como esse em um programa de 10.000 linhas!
b = [7 8 9];
a(3,:) = b([3 1 2]);
Erros de Programação d. a = eye ( 3 , 3 ) ;
b=[789];
Nunca redefina o significado de uma variável predefinida no MATLAB. Essa é uma a(3,:) = b([3 1 2]);
receita para o desastre, produzindo erros sutis e difíceis de encontrar.

2.6 Exibindo Dados de Saída


este 2 .2
'
Existem muitas maneiras de exibir dados de saída no MATLAB. A mais simples é uma
Este teste apresenta uma verificação rápida do seu entendimento dos conceitos apre-
já vista - simplesmente não escreva o ponto-e-vírgula no final da declaração e eles serão
sentados nas seções de 2.3 a 2.5. Se você tiver problemas com o teste, releia as seções,
pergunte ao seu professor ou discuta o material com um colega. As respostas podem ser ecoados na Janela de Comandos. Iremos agora explorar algumas outras maneiras de
encontradas no final do livro. exibir dados.
1. Assuma que a matriz e seja definida como abaixo e determine o conteúdo das
seguintes submatrizes:
2.6.1 Alterando o Formato-Padrão
. 1:, 1.1 -3.2 3.4
0.6]
e = [ 0.6 1.1 -0.6 3.1 Quando dados são ecoados na Janela de Comandos, valores inteiros são sempre
' ' 1.3 0.6 5.5 o.o exibidos como inteiros, e outros valores são impressos com um formato-padrão. O for-
a. c(2,:) mato-padrão para o MATLAB exibe quatro dígitos depois do ponto decimal, e pode ser
b. e(: ,end) exibido com notação científica com um expoente se o número for muito grande ou
c. c(l:2,2:end)
..~-~J d.
e.
c(6)
c(4:end)
muito pequeno. Por exemplo, as declarações

X 100.11
f. c(l:2,2:4)
y 1001.l
g. e( [1 4J, 2)
h. e ( [2 2], (3 3J) z O. 00010011

2. Determine o conteúdo da matriz a após a execução das seguintes declarações: produzem a saída
a. a = [ 1 2 3; 4 5 6; 7 8 9] ;
a([3 1),:) = a([l 3],:); X
.;: 100.1100
b. a = [1 2 3; 4 5 6; 7 8 9l ;
a([l 3],:) = a([2 2],:); y
c. a = [ 1 2 3 ; 4 5 6 ; 7 8 9 ] ; 1. 0011e+003
a([2 2],:); z
\,

3. Determine o conteúdo da matriz a após a execução das seguintes declarações: 1.00lle-004


a. a = eye ( 3 , 3 ) ;
Esse formato-padrão pode ser alterado com o uso do comando format. O comando
b=[l23];
a(2,:) =b; format altera o formato-padrão de acordo com os valores dados na Tabela 2.3.
\
i
~
40 Prograr1111ção em MATLA~ para Engenheiros CapHulo 2 MATLAB Básico 41
------ ----·-·-··-·-·-·--··

Tabela 2.3 Formatos de Exibição de Saída trolar a maneira como os valores são exibidos. A forma geral dessa função, quando uti-
Comando de Formata~o ResuHados Exemploª lizada para exibir dados na Janela de Comandos, é:
format short 4 dígitos decimais (formato-padrão) 12.3457 fprintf(format,data)
format long 14 dígitos decimais 12.34567890123457
onde forma t é uma cadeia de caracteres descrevendo a maneira como os dados devem
forrnat short e 5 dígitos mais expoente l.2346e+001
ser exibidos e da ta é composto por um ou mais escalares ou matrizes para exibição. A
format short g 5 dígitos no total, com ou sem expoente 12.346 cadeia de caracteres format contém texto a ser apresentado, mais caracteres especiais
format longe 15 dígitos mais expoente. l.234567890123457e+001 descrevendo o formato dos dados. Por exemplo, a função
format long g 15 dígitos no total, com ou sem expoente 12.3456789012346
fprintf('0 valor de pi= %f \h',pi}
format bank formato monetário 12.35
format hex exibição hexadecimal de bits 4028b0fcd32f707a apresenta 'o valor de pi = 3 .141593 ', seguido de uma mudança de linha. Os
format rat razão aproximada entre inteiros pequenos 1000/81 caracteres %f são denominados caracteres de conversão; indicam que um valor na lista de
format compact suprime linhas adicionais dados deveria ser apresentado em formato de ponto flutuante naquele local da cadeia
de formatação. Caracteres como o \n são denominados caracteres de escape. O caractere
format loose restabelece as linhas adicionais
\n indica que uma mudança de linha deve ser incluída, para que o texto seguinte inicie
format + exibe somente o sinal do número +
em uma nova linha. Existem muitos tipos de caracteres de conversão e de escape que
• O valor utilizado no exemplo é 12. 345678901234567 em todos os casos. podem ser usados em urna função fprintf. Alguns são apresentados na Tabela 2.4, e
urna lista completa pode ser encontrada no Capítulo 8.
É também possível especificar a largura do campo de exibição de um número e o
O formato-padrão pode ser modificado para exibir mais dígitos significativos, forçar a número de casas decimais a serem exibidas. Isso é feito especificando-se a largura· e a
exibição em notação científica, exibir dados com dois dígitos decimais ou então eliminar precisão depois do sinal% e antes do f. Por exemplo, a função
linhas adicionais para que mais dados sejam visíveis por vez na Janela de Comandos.
Faça alguns experimentos com os comandos da Tabela 2.3. fprintf('0 valor de pi= %6.2f \n', pi)

exibe 'o valor de pi = 3. 14 ', seguido de urna mudança de linha. Os caracteres de


2.6.2 A Função disp conversão %6 . 2 f indicam que o primeiro item de dados na função deveria ser apre-
sentado em formato de ponto flutuante e um campo com seis caracteres de largura,
Outra maneira de exibir dados é a função di sp. Ela aceita urna matriz como argumento incluindo dois dígitos depois do ponto decimal.
e exibe o valor da matriz na Janela de Comandos. Se a matriz for do tipo char, a cadeia A função fprintf tem uma limitação bastante significativa: ela somente exibe a
de caracteres contida na matriz é exibida.
porção real de um valor complexo. Essa limitação pode levar a resultados enganosos quando
Essa função é freqüentemente combinada com as funções num2str {que converte
um número em cadeia de caracteres) e int2str (que converte um inteiro em cadeia de os cálculos produzem respostas complexas. Nesses casos, é melhor usar a função disp
para exibir respostas.
i caracteres) para criar mensagens exibidas na Janela de Comandos. Por exemplo, as de-
clarações MATLAB a seguir exibem "O valor de pi= 3.1416" na Janela de Comandos. A
primeira declaração cria uma matriz de caracteres que contém a mensagem, e a segunda
declaração exibe a mensagem. Tabela 2.4 caracteres Especiais Comuns em cadeias de Caracteres de Formatação para o fpr~n_tf
str = ['O valor de pi= 'num2str{pi}]; Caracteres de Formatação Resultados
disp (str);
%d Exibe valor como inteiro.
%e Exibe valor em formato exponencial
2.6.3 Saída Estruturada Usando a Função fprintf %f Exibe valor em formato de ponto flutuante.
%g Exibe valor em formato de ponto flutuante ou exponencial-o que for mais curto.
Uma forma ainda mais flexível de exibir dados é a função fprintf. Essa função exibe
um ou mais valores juntamen~e com texto relacionado e permite ao programador con- \n Muda de linha.
\t
1,
:, i

ºi~ \ 1,
42 Programaçlo em MATIAS- para Engenheiros
1 .,...
~-
.

Capitulo 2 MATlAB Básico 1 43


71. ··-·----····-···-· -------- --------i-;,;;,-------------------···-·····-···-····---·-··-·-···
Por exemplo, as seguintes declarações calculam um valor complexo x e exibem Por exemplo, suponha que a matriz x seja definida como
esse valor utilizando fprintf e disp:
X=[l.23 3.14 6.28; -5.1 7.00 O];
X = 2 * (1 - 2*i) A3;
str = ['disp: x = ' num2str(x)]; O comando "save x.dat x -ascii" produzirá um arquivo denominado
disp(str); x. da t com os seguintes dados:
fprintf('fprintf: x = %8.4f\n',x);
1.2300000e+000 3.1400000e+000 6.2800000e+000
Os resultados impressos por essas declarações são -5.l000000e+000 7.0000000e+000 0.0000000e+000
·"ffl-·.
disp: x -22+4i ,r~
Esses dados estão em um formato que pode ser lido por planilhas ou programas escritos
fprintf: x -22.0000 em outras linguagens, o que facilita o compartilhamento de dados entre programas
MATLAB e outras a lica ões.
ignorou a p a resposta.

li
il Se dados precisam ser compartilhados entre o MATLAB e outros programas, grave os
A função fpr in t f exibe somente a parte real de um número complexo, que pode pro- dados MATLAB em formato ASCII. Se os dados forem usados apenas pelo MATLAB,
duzir resultados enganosos quando se trabalha com valores complexos. grave-os em formato de arquivo MAT.

O MATLAB não determina a extensão dos arquivos ASCII, mas é melhor para o
2.7 Arquivos de Dados usuário quando uma convenção de nomes consistente é utilizada. Uma extensão "da t"
é uma escolha comum para arquivos ASCII.
Existem muitas maneiras de carregar e gravar arquivos de dados no MATLAB. A maio-
ria delas será vista no Capítulo 8. Por enquanto, vamos apenas considerar os comandos
load e save, os mais simples de usar.
O comando save grava dados do espaço de trabalho MATLAB corrente em um
arquivo de disco. A forma mais comum desse comando é
Grave os arquivos de dados ASCII com uma extensão de arquivo "dat", para dife-
save filename varl var2 var3 renciá-los dos arquivos MAT, que têm uma extensão de arquivo "mat".

onde filename é o nome do arquivo no qual as variáveis são gravadas, e varl, var2
etc., são as variáveis gravadas no arquivo. A extensão-padrão de nome de arquivo é
"mat", e esses arquivos de dados são chamados arquivos MAT. Se nenhuma variável O comando load é o oposto do comando save. Ele carrega dados de um arquivo
for especificada, todo o conteúdo do espaço de trabalho será gravado. de disco para o espaço de trabalho corrente do MATLAB. A forma mais comum desse
O MATLAB grava os arquivos MAT em um formato compacto especial, que comando é
preserva muitos detalhes, incluindo o nome e o tipo de cada variável, o tamanho de
i' load filename
cada matriz e todos os valores de dados. Um arquivo MAT criado em qualquer platafor-
ma (PC, Mac ou UNIX) pode ser lido em qualquer outra, por isso os arquivos MAT são
t..,,. -- oridel:i lename é o nome do arquivo a ser carregado. Se o arquivo for um arquivo MAT,
uma boa forma de trocar dados entre computadores se ambos utilizam o MATLAB. todas as variáveis no arquivo serão recuperadas, com os nomes e tipos idênticos aos
Infelizmente, o arquivo MAT tem um formato que não pode ser lido por outros pro- anteriores. Se uma lista de variáveis for incluída no comando, somente essas variáveis
gramas. Se os dados precisam ser compartilhados com outros programas, a opção serão recuperadas.
-ascii precisa ser especificada, e os valores de dados serão escritos no arquivo como O MATLAB pode carregar dados criados por outros programas em formato ASCII,
cadeias de caracteres ASCII separadas por espaços. Entretanto, informações especiais com dados separados por espaços em branco. Ele examinará cada arquivo para deter-
como nomes e tipos de variáveis são perdidas quando gravamos os dados em formato minar se ele é um arquivo MAT ou um arquivo ASCII, e tratar os dados de acordo. O
ASCII, e o arquivo resultante de dados fica muito maior. MATLAB pode ser forçado a tratar um arquivo como ASCII quando especificamos a
.,._"I:,,
44 1 Programação em MATLABI!' para Engenheiros Capítulo 2 MATLAB Básico 1 45

opção -ascii na declaração load. O conteúdo de um arquivo ASCII será convertido de expression no local variable_name. Por essa razão, o sinal de igual é chamado de
em uma matriz MATLAB, com o mesmo nome do arquivo de onde foram carregados os operador de atribuição. Uma declaração como
dados. Por exemplo, suponha que um arquivo de dados ASCII com o nome x. da t con-
tenha os seguintes dados: ii = ii + 1;

1.23 3.14 6.28 não faz o menor sentido em álgebra usual, mas faz sentido perfeitamente no MATLAB.
-5.1 7.00 O Ela significa: pegue o valor corrente armazenado na variável i i, sorne um a esse valor
e armazene o resultado de volta na variável i i.
O comando "load x.dat" criará uma matriz 2 x 3 denominada x no espaço de tra-
balho corrente, contendo os valores de dados.
2.8.1 Operações com Escalares
1

Teste 2.3
de escalares, matrizes, parênteses e operadores aritméticos. As operações aritméticas-
Este teste apresenta uma verificação rápida do seu entendimento dos conceitos apre- padrão entre dois escalares são dadas na Tabela 2.5.
sentados nas Seções 2.6 e 2.7. Se você tiver problemas com o teste, releia as seções, per- Parênteses podem ser usados para agrupar termos sempre que desejado. Quando são
gunte ao seu professor ou discuta o material com um colega. As respostas podem ser usados parênteses, as expressões dentro deles são avaliadas antes das expressões que estão
encontradas no final do livro. fora. Por exemplo, a expressão 2 A ( ( 8 + 2 ) / 5) é avaliada conforme mostrado a seguir.
1. Corno você faria o MATLAB exibir todos os valores reais em formato expo- 2 A ({8+2)/5) 2 A (lQ/5)
nencial com 15 dígitos significativos? 2 A 2
2. O que fazem os seguintes conjuntos de declarações? Qual a saída de cada um 4
deles?
a. radius = input ( 'Enter circle radius: \n');
area pi* radius'2; 2.8.2 Operações com Matrizes
str ['The areais ' num2str(area)];
O MATLAB dá suporte a dois tipos de operações entre matrizes, conhecidos como operações
disp(str);
estruturais e operações matriciais. Operações estruturais são operações entre matrizes exe-
b. value = int2str{pi);
cutadas elemento a elemento - a operação é executada sobre os elementos correspon-
disp{['The value is ' value ' ! ' ] ) ;
3. O que faz o seguinte conjunto de declarações? Qual a saída dele? dentes nas matrizes. Por exemplo, se a= [ 1 3 ] e b =
2 4
[-l
-2 1
3 ], então a + b
1 5
5 ]. [º
value = 123.4567e2; Observe que, para que essas operações funcionem, o número de linhas e de colunas nas duas
fprintf ( 'value %e\n' ,value); matrizes precisa ser o mesmo. Caso contrário, o MATLAB gera uma mensagem de erro.
fprintf { 'value %f\n' ,value); Operações estruturais entre matrizes podem também ocorrer entre uma matriz e um
fprintf ( 'value %g\n', value) ; escalar. Se a operação for entre uma matriz e um escalar, o valor do escalar será aplica-
fprintf ( 'value %12,4f\n' ,value);
do a todos os elementos da matriz. Por exemplo, se a = [ ! !], então a + 4 = [; ~ l
2.8 Operações com Escalares e Matrizes Tabela 2.5 Operações Aritméticas entre Dois Escalares
Operação Forma Algébrica Forma no MATLAB
Cálculos são especificados no MATLAB com urna declaração de atribuição, cuja forma
geral é Soma a+b a + b
Subtração a-b a - b
variable_name = expression; axb a * b
Multiplicação
a a / b
A declaração de atribuição calcula o valor da expressão à direita do sinal de igual, e Divisão
atribui o valor à variável à esquerda desse sinal. Observe que o sinal de igual não
significa igualdade no sentido usual da palavra. Em vez disso, significa: armazene o valor Expoente a • b
. ,, Capítulo 2 MATLAB Básico j 47
46 1 Prograrração em MATLA~ para Engenheiros

!11!1'
i,1
,t
Em contraste, operações matriciais seguem as regras normais da álgebra linear - tiplicação estrutural como matricial são aplicáveis para duas matrizes quadradas de
por exemplo, multiplicação de matrizes. Na álgebra linear, o produto e = a x b é mesmo tamanho, mas as respostas são totalmente diferentes. Cuidado para especificar
1 definido pela equação exatamente o que você quer!
_11

n
c(i, j) = L a(i, k) b(k, j)
k-1

Porexemplo,sea =[;!]e b = [=; n,entãoa X b =[-;-;].observe


Cuidado para diferenciar entre operações estruturais e matriciais em seu código MATLAB.
É especialmente comum confundir multiplicação estrutural com multiplicação matricial.
que, para que a multiplicação de matrizes funcione, o número de colunas na matriz apre-
cisa ser igual ao número de linhas na matriz b.
O MATLAB usa um símbolo es ecial
- operações matriciais. Nos casos em que operações estruturais e operações matriciais
l têm definições distintas, o MATLAB utiliza um ponto antes do símbolo para indicar
uma operação estrutural (por exemplo,.*). Uma lista de operações estruturais e matri-
Assuma que a, b, e e d são definidas como a seguir.
ciais é apresentada na Tabela 2.6.
1 b
1 a = [; ~]
\
Tabela 2.6 Operações Estruturais e Matriciais Comuns
e [~] d 5
Operação Forma MATLAB Comentários

Soma Estrutural a + b Soma de matrizes estrutural é idêntica à matricial. Qual é o resultado das seguintes expressões?
Subtração Estrutural a - b Subtração de matrizes estrutural é idêntica à matricial. a. a + b e. a + e
Multiplicação Estrutural a * b Multiplicação elemento a elemento de a e b. As duas b. a .* b f. a + d
matrizes precisam ter a mesma forma, ou uma delas c. a * b g. a * d
ser um escalar.
d. a * e h. a * d
Multiplicação Matricial a * b Multiplicação das matrizes a e b. O número de colunas
em a precisa ser igual ao de linhas em b.
Solução
Divisão à Direita Estrutural a ./ b Divisãoelementoaelementodeaeb: a (i, j) / b( i, j).
As duas matrizes precisam ter a mesma forma, ou uma a. Soma estrutural ou matricial: a + b = [~ ; ] .
delas precisa ser um escalar.
Divisão à Esquerda Estrutural a . \ b Divisão elemento a elemento de a e b: b ( i, j) / a ( i, j).
As duas matrizes precisam ter a mesma forma, ou uma b. Multiplicação estrutural elemento a elemento: a * b
delas precisa ser um escalar.
Divisão Matricial à Direita a / b Divisão matricial definida por a * inv (b), onde inv (b)
é o inverso da matriz b.
e. Multiplicação matricial: a * b [-2-1 52].
Divisão Matricial à Esquerda a \ b Divisão matricial definida por inv (a) * b, onde inv (a)
é o inverso da matriz a.
d. Multiplicação matricial: a * e = [~].
Expoente Estrutural a • b Expoenteelementoaelementodeaeb: a (i, j) • b (i, j).
As duas matrizes precisam ter a mesma forma, ou uma
e. Essa operação é ilegal, pois a e b têm números diferentes de colunas.
delas precisa ser um escalar.
f. Soma de uma matriz e um escalar: a + d = [ ~ ~] .

Usuários novatos freqüentemente confundem as operações estruturais com as


g. Multiplicação estrutural: a . * d º]
[ 105 5 .
matriciais. Em alguns casos, a substituição de uma pela outra produz uma operação ile-
gal, e o MATLAB apresenta uma mensagem de erro. Em outros casos, as duas operações h. Multiplicação matricial: a * d [ 5
10 5 .
O]
são legais, e o MATLAB executa a operação errada e produz um resultado errado. O
problema mais comum ocorre quando se trabalha com matrizes quadradas. Tanto mul- •
·t-·
48 1 Programação em MATLAEJIP para Engenheiros
t Capitulo 2 MATLAB Básico 1 49
\

A divisão matricial à esquerda tem uma importância especial que deve ser enten-
Tabela 2.7 Hierarquia de Operações Aritméticas
dida. Um conjunto 3 x 3 de equações lineares simultâneas tem a forma
Precedência Operação
ª11X1 + ª12X2 + a13x3 = bI 1 o conteúdo de todos os parênteses é avaliado, a partir dos parênteses mais internos
ª21X1 + ª22X2 + ª23X3 = b2 (2.1) em direção aos mais externos.
[ ·:::•· -
ª31X1 + ª32X2 + ª33X3 = b3 2 Todos os expoentes são avaliados, da esquerda para a direita.
3 Todas as multiplicações e divisões são avaliadas, trabalhando da esquerda para a
que pode ser expressa como direita.
4 Todas as somas e subtrações são avaliadas, trabalhando da esquerda para a direita.
Ax=B (2.2)
;.~-
i--·
a a a b Para eliminar a ambi .. idade da avalia ão d~s ex ressões, o MATLAB esta~eleceu uma
O ª21 ª22 ª23 1 B= b2
série de regras governando a hierarquia, ou a ordem em que as operaç~s sao ava 1a as
em uma expressão. As regras em geral seguem as regras normais da algebra. A ordem
ª31 ª32 ª33 b3
de avaliação das operações aritméticas é dada na Tabela 2.7.
A equação 2.2 pode ser resolvida para x usando álgebra linear. O resultado é
1

1 X= A-1 B (2.3) Exemplo 2.2
Como o operador de divisão à esquerda A\ B é definido como inv (A) x B, o operador As variáveis a, b, e e d foram iniciadas com os seguintes valores:
de divisão à esquerda resolve um sistema de equações simultâneas com uma única a= 3; b 2; e = 5; d = 3;
declaração!
Avalie as seguintes declarações de atribuição MATLAB.
a. saída a*b+c*d;
b. saída a* (b+c) *d;
2.9 Hierarquia de Operações e. saída (a*b) + (c*d);
d. saída aAbAd;
Freqüentemente, muitas operações aritméticas são combinadas em uma única expres- e. saída aA(bAd;
são. Por exemplo, considere a equação para a distância percorrida por um objeto ini-
Solução
cialmente em repouso e sujeito a uma aceleração constante.
a. Expressão a avaliar: saída a*b+c*d;
Com os valores: saída 3*2+5*3;
distance = 0.5 * accel * time A 2
Primeiro, avalie as multiplicações e divisões, da
esquerda para a direita: saída 6+5*3;
Existem duas multiplicações e um expoente nessa expressão. Em uma expressão como
saída 6+15;
essa, é importante saber a ordem de avaliação dos operadores. Se o expoente for ava- saída 21;
Agora, avalie as somas:
liado antes da multiplicação, essa expressão será equivalente a
b. Expressão a avaliar: saída a* (b+c) *d;
distance = 0.5 * accel * (time A 2) Com os v=al=o::.:re:..::.::s:.c:~--------------;s,ca,,i~'dct;;--ª-::-,; :~~; ~) * 3 ;
-Primeiro os parênteses: saida
Agora, avalie as multiplicações e divisões, da
Se a multiplicação for avaliada antes do expoente, essa expressão será equivalente a saída 21*3;
esquerda para a direita:
saída 63;
distance = (0.5 * accel * time) A 2
c. Expressão a avaliar: saída (a*b) + (c*d);

-.
l
.,iili Com os valores: saída (3*2)+(5*3);
Essas duas equações têm resultados distintos, e precisamos ser capazes de distingui-las
Primeiro os parênteses: saída 6+15;
claramente. .
Agora as somas: saída 21;
50 1 Programação em MATlA~ para Engenheiros Capítulo 2 MATlAB Básico j 51

d. Expressão a avaliar: saída aAbAd; 1. Assuma que a, b, e e d são definidas conforme a seguir, e calcule os resultados
Com os valores: saída 3A2A3; das seguintes operações se elas forem legais. Se uma operação for ilegal,
Avalie os expoentes da esquerda para a direita: saída 9A3; explique o motivo.
saída 729;
e. Expressão a avaliar: saída aA (bAd);
a = [_; ;] b =
[~ -i] e
[;] d = -3
Com os valores: saída 3A(2A3); a. result a * e;
Primeiro os parênteses: saída 3A8; b. result a * [e e] ;
Agora o expoente: saída 6561; c. result a * [e e];
• d. result a + b * e;
e. result a + b * e;

· -·-como podemos ver, a or em e execuçao as operaçoes em um e eito essenc1a 2. Resolva para x a equação A.x = B, onde A = 2 3 2 e B= 1
no resultado final de uma expressão algébrica. -1 O 1 O
É importante que qualquer expressão em um programa seja tão clara quanto pos-
sível. Qualquer programa de valor deve ser não só escrito, mas também mantido e
modificado quando necessário. Você deve sempre perguntar a si mesmo: "Vou entender
com facilidade essa expressão quando voltar a ela daqui a seis meses? Outro progra- 2.1 O Funções Predefinidas MATLAB
mador poderia olhar o meu código e entender com facilidade o que estou fazendo?". Se
houver qualquer dúvida em sua mente, use parênteses adicionais na expressão para Na matemática, uma função é uma expressão que aceita um ou mais valores de entrada
tomá-la o mais claro possível. e calcula um único resultado a partir deles. Cálculos científicos e técnicos em geral
requerem funções mais complexas do que soma, subtração, multiplicação, divisão e
expoente, conforme discutido até aqui. Algumas dessas funções são muito comuns
e usadas em diferentes disciplinas técnicas. Outras são mais raras e espeóficas de um
problema ou pequeno número de problemas. Exemplos de funções muito comuns são
Use parênteses quando necessário para tornar suas equações claras e fáceis de entender. as funções trigonométricas, logarítmicas e raízes quadradas. Exemplos de funções mais
raras são as funções hiperbólicas, funções de Bessel, e assim por diante. Uma das
grandes forças do MATLAB é que ele vem com uma incrível variedade de funções ·
prontas para uso.
Parênteses usados em uma expressão devem ser balanceados, ou seja, deve existir
um número igual de parênteses abertos e fechados na expressão. É um erro ter mais
parênteses de um tipo que do outro. Erros desse tipo, geralmente tipográficos, são
2.10.1 Resultados Opcionais
capturados pelo interpretador MATLAB quando o comando é executado. Por exemplo,
a expressão Diferente das funções matemáticas, as funções MATLAB podem devolver mais de um
(2 + 4) / 2)
resultado para o programa que as ativa. A função rnax é um exemplo de função desse
tipo. Essa função normalmente retorna o valor máximo de um vetor de entrada, mas ela
produz um erro quando é executada. também pode retornar um segundo argumento contendo a localização no vetor de
entrada onde o valor máximo foi encontrado. Por exemplo, a declaração
maxval = max ([1 -5 6 -31)
Teste 2.4
retorna o resultado maxval = 6. Entretanto, se duas variáveis forem fornecidas para
Este teste apresenta uma verificação rápida do seu entendimento dos conceitos apre- armazenar resultados, a função retornará o valor máximo e a localização desse valor.
sentados nas Seções 2.8 e 2.9. Se você tiver problemas com o teste, releia as seções, per- [maxval index] = max ([1 -5 6 -3])
gunte ao seu professor ou discuta o material com um colega. As respostas podem ser
encontradas no final do livro. produz os resultados maxval = 6 e index = 3.
I:;:l!
52 1 Programaçlo em MATI..AU9 para Engenh/Jlros Capitulo 2 MATlAB Básico 53
. ________.,__ ,, _________________ -- - -------------------- ---------~------------------------- --- -· ------------------· - .. -------··
2.10.2 Utilizando Funções MATLAB com Matrizes como Entrada

1
.l Tabela 2.8 Funções MATLAB Comuns
:
li Muitas funções MATLAB são definidas para uma ou mais entradas escalares e produ- Fun9lo Descrição
zem uma saída escalar. Por exemplo, a declaração y = sin (x) calcula o seno de x e FURfltl Malamillca1
armazena o resultado em y. Se essas funções recebem uma matriz com valores de entrada, abs(x) Calcula Ix 1.
elas calculam uma matriz com valores de saída calculados elemento a elemento.. Por ·· acos (x) Calcula cos-1x, com o resultado em radianos.
exemplo,sex = [O pi/2 pi 3*pi/2 2*pi],adeclaração
angle(x) Retorna o ângulo de fase do valor complexo x, em radianos.
y = sin(x) asin(x) Calcula sin-1x, com o resultado em radianos.
' produz o resultado y [010-10). atan(x) Calcula tan-1x, com o resultado em radianos.
atan2(y,x) Calcula tan-1 ( 1!. ) para os quatro quadrantes do círculo (resultado em
X

2.10.3 Funções MATLAB Comuns cos(x) Calcula cos x, com x em radianos.

Algumas das funções mais comuns e úteis do MATLAB são apresentadas na Tabela 2.8. eXp(X) Calcula~.
Elas serão usadas em muitos exemplos e exerácios. Se tiver de localizar uma função log(x) Calcula o logaritmo natural log, x.
espeófica que não esteja nessa lista, você pode pesquisar alfabeticamente ou por assunto [value,index] max ( x) Retorna o valor máximo do vetor x, e opcionalmente a localização desse
usando o Navegador de Ajuda do MATLAB. valor.
Observe que, diferente de outras linguagens de computador, muitas funções
[value,index] min(x) Retorna o valor mínimo do vetor x, e opcionalmente a localização desse
MATLAB operam corretamente com entradas tanto reais como complexas. As fun- valor.
ções MATLAB calculam automaticamente a resposta correta, mesmo se o resultado
mod(x,y) Função resto (ou função módulo).
for imaginário ou complexo. Por exemplo, a função sqrt (-2) produzirá um erro em
linguagens como C ou Fortran. No MATLAB, o cálculo correto será efetuado, pro- sin(x) Calcula sin x, com x em radianos.
duzindo a resposta imaginária. sqrt(x) Calcula a raiz quadrada de x.
» sqrt(-2) tan(x) Calcula tan x, com x em radianos.
ans =
Funçlles de Arredondamento
O+ 1,4142i
ceil (x) Arredonda x para o inteiro mais próximo em direção a mais infinito:·
ceil(3.l) = 4eceil(-3.l) = -3.
fix(x) Arredonda x para o inteiro mais próximo em direção ao zero: f ix ( 3 . 1)
2.11 Introdução a Diagramas = 3efix(-3.1) = -3.

floor(x) Arredonda x para o inteiro mais próximo em direção a menos infinito:


Os recursos amplos e independentes de dispositivos do MATLAB são uma de suas ca-
floor(3.l) = 3efloor(-3.l) = -4.
racterísticas mais poderosas. Eles facilitam o desenho de quaisquer dados em qualquer
momento. Para desenhar um conjunto de dados, simplesmente crie dois vetores con- round(x) Arredonda x para o inteiro mais próximo.
tendo os valores de x e de y a serem desenhados, e use a função plot.
Funções de Convenio de Caracteres
Por exemplo, suponha que queiramos desenhar a função y = x2 -10x + 15 para va-
char(x) Converte uma matriz de números em uma cadeia de caracteres. Para ca-
lores de x entre O e 10. São suficientes três declarações para criar esse desenho. A
racteres ASCII, a matriz deveria amter míroeros <127
primeira declaração cria um vetor de valores de x entre O e 10, por meio do operador
dois-pontos. A segunda declaração calcula os valores de y usando a equação (note que double(x) Converte uma cadeia de caracteres em uma matriz de números.
estamos utilizando operadores estruturais, para que a equação seja aplicada a cada int2str(x) Converte x em uma cadeia de caracteres que representa o número como
valor de x, elemento a elemento). Finalmente, a terceira declaração cria o desenho. um inteiro.

X = 0:1:10; i :"ll",':' num2str (x) Converte x em uma cadeia de caracteres que representa o número com um
''>I<'
i¼., ponto decimal.
y = x.A2 - 10.*x + 15;
·--1'
plot(x,y);

--- str2nurn(s) Converte uma cadeia de caracteres s em número.


54 Prograrr,ação em MATlAIP para Engenheiros
Capítulo 2 MATlAB Básico 1 55

Plot of y = x.•-10."l<+ 15

t -5

Figura 2.4 Diagrama de y = x2 -10x + 15 de Oa 10.


X

Figura 2.5 Diagrama de y = x2 -10x + 15 com título, legendas e linhas de grade.


Quando a função plot é executada, o MATLAB abre uma Janela de Figuras e
exibe o desenho nessa janela. O desenho produzido por essas declarações é apresentado
na Figura 2.4.

2.11.2 Imprimindo um Diagrama


2.11.1 Utilizando Diagramas xy Simples
Uma vez criado, um diagrama pode ser impresso por meio do comando print, clicando
Conforme vimos acima, é muito fácil desenhar no MATLAB. Qualquer par de vetores pode sobre o ícone de impressão na Janela de Figuras ou selecionando a opção de menu
ser desenhado um contra o outro, desde que os vetores tenham o mesmo comprimento. "File/Print" na Janela de Figuras.
Entretanto, o resultado não é um produto acabado, pois não temos títulos, legendas A forma do comando print é:
para os eixos ou linhas de grade.
Títulos e legendas para os eixos podem ser adicionados ao desenho com as funções print <opções> <arquivo>
ti tle, xlabel e ylabel. Cada função é acionada com uma cadeia de caracteres que
contém o título ou a legenda correspondente. Linhas de grade podem ser adicionadas Sem o nome do arquivo, esse comando envia uma cópia da figura corrente para a
ou removidas do desenho com o comando grid: grid on ativa as linhas de grade, e impressora. Com um nome de arquivo especificado, o comando imprime uma cópia da
grid off apaga as linhas de grade. Por exemplo, as declarações a seguir geram um figura corrente no arquivo especificado.
desenho da função y = x2 -10x + 15 com títulos, legendas e linhas de grade. O desenho Existem-muitas- opções diferentes que especificam o formato de -saída enviado
resultante está na Figura 2.5.
para um arquivo ou para a impressora. Uma opção muito importante é -dtiff. Essa
X = 0:1:10; opção especifica que a saída será uma imagem no formato TIFF - do inglês Tagged Image
y = x.A2 - 10.*x + 15; File Format. Como esse formato pode ser importado para todos os processadores de
plot (x,y);
texto importantes para PC, Mac ou UNIX, essa é urna boa maneira de incluir desenhos
title ('Plot of y = x.•2 - 10.*x + 15');
xlabel ('x'); MATLAB em um documento. O seguinte comando cria urna imagem TIFF na figura
ylabel ( 'y' l; corrente e a armazena em um arquivo denominado my_image. ti f:
grid on;
print -dtiff my_image.tif
56 1 Programação em MATLA~ para Engenheiros Capitulo 2 MATLAB Básico 57

Também é possível criar imagens TIFF selecionando "File/Export" na Janela de


Figuras.

2.11.3 Diagramas Múltiplos


É possível desenhar múltiplas funções sobre o mesmo gráfico, simplesmente incluindo

.\
1
mais de um conjunto de valores (x,y) na função de desenho. Por exemplo, suponha que
queiramos desenhar a função f(x) = sin 2x e sua derivada no mesmo desenho. Aderi-
vada de f(x) = sin 2x é
d
- sm = cos2x (2.4)
dt

Para desenhar as duas funções sobre os mesmos eixos, precisamos gerar um conjunto
de valores x e os valores y correspondentes a cada função. Para desenhar as funções,
podemos então simplesmente listar os dois conjuntos de valores (x, y) na função de
desenho, conforme mostrado a seguir.
x = 0:pi/100:2*pi; X

yl = sin {2*x);
y2 = 2*cos{2*x); Figura 2.6 Diagrama de fi.x) = sin 2x e fi.x) = 2 cos 2x sobre os mesmos eixos.
plot(x,yl,x,y2);

O diagrama resultante é exibido na Figura 2.6.


Tabela 2.9 Cores, Marcadores e Estilos de Linhas
Cor Marcador Estilo de Linha
2.11.4 Cores de Linhas, Estilos de Linhas, Estilos de Marcadores e Legendas y Amarelo Ponto Sólido

O MATLAB permite que um programador selecione a cor de uma linha a ser desenhada, m Magenta o Círculo Pontilhado
o estilo da linha e o tipo de marcador para pontos de dados na linha. Isso tudo pode ser e Ciano X X Ponto-traço
selecionado pelo uso de uma cadeia de caracteres de atributo após os vetores x e y na r Vermelho Mais Tracejado
+
função plot.
A cadeia de caracteres de atributos pode ter até três componentes. O primeiro es- g Verde Asterisco <none> Sem linha
pecifica a cor da linha, o segundo, o estilo do marcador, e o último, o estilo da linha. Os b Azul s Quadrado
caracteres para as diferentes cores, marcadores e estilos de linhas são apresentados na w Branco d Losango
Tabela 2.9.
k Preto V Triângulo (apontando para baixo)
Os caracteres de atributos podem ser misturados em qualquer combinação, e mais
------~•---- 'friângalo (apm,tando para cuna)
de uma cadeia de caracteres de atributos pode ser especificada se mais de um par de

1
vetores (x,y) for incluído em uma mesma chamada da função plot. Por exemplo, as
seguintes declarações desenharão a função y = x 2 -lOx + 15 com urna linha pontilhada
vermelha e incluirão os pontos de dados corno círculos azuis:
i
'~ >

p
Triângulo (apontando para a esquerda)
Triângulo (apontando para a direita)
Pentágono
X = 0:1:10;
,.,, h Hexágono

-
..
y = x.•2 - 10.*x + 15;
plot(x,y, 'r--' ,x,y, 'bo'); -..•·.·I···.•
. . . .,. .'·:-.· .·• <none> Sem marcador
58 1 Programação em MATiAEP para Engenheiros
Capítulo 2 MATiAB Básico 59

Legendas podem ser criadas por meio da função legend. A forma básica dessa Plot of f(x) = sin(2x) and its derivative
função é 2 ,-c-
. .- - - . - - - - - - - , - - - , , : ; - ; : - \ - - - --,---~----r-;,-,
legend('stringl', 'string2', ... , pos) ''
'
''
' '
1.5 ~~-+----t---:--+---';-----t-------t
''
,
onde stringl, string2 etc. são os rótulos associados às linhas desenhadas, e pos é ,,
um inteiro que especifica onde colocar a legenda. Os valores possíveis para pos são ,,,
,
dados na Tabela 2.10. O comando legend off remove uma legenda existente. --\,,,C::::+---t--,;'--+----;,-=t-,ç---t---:•-+---
,
Um exemplo de desenho completo é apresentado na Figura 2.7, e as declarações ,'
111 ,,
1.•
para produzir esse desenho são apresentadas a seguir. Elas desenham a função f(x) = sin 2x ,'
e sua derivada sobre os mesmos eixos, com uma linha preta sólida para f(x) e uma linha ,,
vermelha tracejada para sua derivada. O desenho inclui um título, rótulos para os eixos, ,,,
uma legenda e linhas de grade. ,
,
,,
---x-;,, o:p11100:2*pi; -----------~---:n,;;1=-==i=::lli=--=1+t-=-~t=---=--~t=-:-1=-=r-t=-=--i=r--
yl = sin (2*x);
y2 = 2*cos(2*x); -1
plot(x,yl, 'k-',x,y2, 'b--'); '' ,,'
title ('Plot of f(x) = sin(2x) and its derivative'); '' ','
-1.5
'
xlabel ( 'x'); '
ylabel ( 'y'); '' r
,i
'' "
'1
legend ('f(x) ', 'd/dx f(x) ') -2
o 3 4 5 6 7
grid on; X

Figura 2. 7 Um desenho completo com título, rótulos nos eixos, legenda, grade e múltiplos
estilos de linha.
2.11.5 Escalas Logarítmicas
É possível desenhar dados em escalas logarítmicas e em escalas lineares. Existem quatro
combinações possíveis de escalas lineares e logarítmicas nos eixos x e y, e cada combi- Todas essas funções têm a mesma seqüência de chamada - a única diferença é o tipo de
nação é produzida por uma função separada. eixo utilizado para desenhar os dados. Exemplos de cada desenho são exibidos na
Figura 2.8.
1. A função plot desenha os dados em x e y sobre eixos lineares.
2. A função semi logx desenha dados em x de forma logarítmica e em y de forma
linear.
3. A função semi l ogy desenha dados em x de forma linear e em y de forma loga- 2.12 Exemplos
rítmica.
4. A função loglog desenha os dados em x e y sobre eixos logarítmicos. Os exemplos a seguir ilustram a resolução de problemas com o MATLAB.

Tabela 2.10 Valores de pos no Comando legend



Exemplo 2.3 - Conversão de Temperatura
Valor Significado
--construa um programa MAi LAB que leia uma temperatura de entrada ·em graus
o Escolha automática da "melhor" posição (mínimo conflito com os dados) Fahrenheit, converta essa temperatura para um valor absoluto em kelvins e escreva o
1 Canto superior direito (dejault)
'i resultado.
2 Canto superior esquerdo
1:1 3
',1 Canto inferior esquerdo Solução
• 1
4 Canto inferior direito
:lil
:] -1 À direita do desenho A relação entre temperatura em graus Fahrenheit (°F) e temperatura em kelvins (K)
pode ser obtida de livros de física. Ela é
il
'1
:'=.:.• i
60 1 Progra111Jçlo em MATLAf111 para Engenheiros
••··-•-- Capitula 2 MAnAB BAslco 1 61

- - - - ------·---·--- ...
·---------··---. · sam11õgx--·-·····- % Script file: temp_cÕnversion
30
%
25

20
25

20
-- .... %
%
Purpose:
To convert an input temperature from degrees Fahrenheit to
% an output temperature in kelvins.
:... 15
10
:... 15

10
'\ %
% Record of revisions:
\ % Date Programmer Description of change
5 5 I\
%
o % 12/01/98 S. J. Chapman Original code
2 4 6 8 10 10-1 1()11 101
X X %
Semllogy Loglog % Define variables:
1()2 11)2 % temp_f Temperature in degrees Fahrenheit

% Prornpt the user for the input temperature.


:... 101 :...101 ternp_f = input('Enter the temperature in degrees Fahrenheit: ');
% Convert to kelvins.
ternp_k = (5/9) * {temp_f - 32) + 273.15;
1()11 L _ _ J . _ _ . J _ ~ ~ - J __ __J 1 ()O L-.......L-L...L..L..U..U.L--L..-1-ULI..LL.U
O 2 4 6 8 10 10-1 100 101 % Write out the result.
X X fprintf{'%6.2f degrees Fahrenheit= %6.2f kelvins.\n', ...
ternp_f, ternp_k) ;
Figura 2.8 Comparação entre desenhos linear, semilog x, semilog y e loglog.
Para testar o programa completo, vamos executá-lo com os valores de ex:i-tra-
da conhecidos e dados acima. Observe que as entradas do usuário aparecem em
negrito no texto a seguir.
» temp_conversion
T {in Kelvins) = ( ~ T {in 11F)- 32,0) + 273,15 (2.5) Enter the temperature in degrees Fahrenheit: 212
212.00 degrees Fahrenheit= 373.15 kelvins.
Os livros de física também nos dão valores de exemplo, nas duas escalas de tempera- » temp_conversion
tura, que podemos usar para verificar a operação de nosso programa. Dois desses va- Enter the temperature in degrees Fahrenheit: -110
lores são: -110.00 degrees Fahrenheit= 194.26 kelvins.
Ponto de ebulição da água 212 "F 373,15 K Os resultados do programa coincidem com os valores do livro de física.
Ponto de sublimação do gelo seco -110 "F 194,26 K •
Nosso programa precisa efetuar os seguintes passos: Nesse programa, ecoamos os valores de entrada e escrevemos os valores de saída
1. Pedir para o usuário digitar a temperatura de entrada em ºF; juntamente com as unidades. Os resultados desse programa só fazem sentido se as
unidades (graus Fahrenheit e kelvins) forem incluídas com seus valores. Como regra
2. Ler a temperatura de entrada; geral, as unidades associadas a um dado de entrada devem ser sempre apresentadas
3. Calcular a temperatura em kelvins usando a equação (2.5); junto com a solicitação de valor, e as unidades associadas a qualquer dado de saída
4. Escrever o resultado e terminar. ~,..,..,~ devem ser apresentadas junto caro o valar

Usaremos a função input para obter a temperatura em graus Fahrenheit e a função


fprintf para escrever o resultado. O programa resultante é apresentado a seguir.•

Sempre inclua as unidades apropriadas junto com os valores que você ler ou escrever
• NT.: Os comentários e as mensagens do programa foram mantidos como no original em inglês, para em um programa.
respeitar a autoria de código do autor.

______________
.,,::- ,
62 1 Programaçlo em MATLA~ para Engenheiros Capítulo 2 MATIAS Básico 63

O programa do exemplo anterior exibe muitas boas práticas de programação que 3. Calcular a potência fornecida para a carga para cada valor de RL.
descrevemos neste capítulo. Ele tem um dicionário de dados que define o significado de 4. Desenhar a potência fornecida para a carga para cada valor de Ru e determinar
todas as variáveis no programa, e também usa nomes descritivos de variáveis, e o valor da resistência resultante da carga em potência máxima.
unidades apropriadas são associadas a todos os valores apresentados.
O programa MATLAB final é este:
• Script file: calc_power.m
Exemplo 2.4 - Engenharia Elétrica: Transferência de Carga Máxima
Na Figura 2.9, temos uma fonte de voltagem V= 120 V com resistência interna R5 de 50 n, % Purpose:
suprindo uma carga de resistência RL. Encontre o valor da resistência de carga RL que % To calculate and plot the power supplíed to a load as
resultará na potência máxima possível fornecida pela fonte para a carga. Quanta po- % a function of the load resistance.
,,
tência será fornecida nesse caso? Desenhe também a potência fornecida para a carga %
comofunção da resistência d L· ecor o rev1.s1.ons:
% Date Prograrnmer Description of change
Solução %
Nesse programa, precisamos variar a resistência da carga RL e computar a potência % 12/01/98 S. J. Chapman Original code
fornecida para a carga para cada valor de Re A potência fornecida para a resistência da %
carga é dada pela equação % Define variables:
% amps Current flow to load (amps)
p L =I2R L (2.6) % pl Power supplied to load (watts)
% rl Resistance of the load (ohms)
onde I é a corrente fornecida para a carga. A corrente fornecida para a carga pode ser
% rs Internal resistance of the power source (ohms)
calculada pela lei de Ohm.
% volts Voltage of the power source (volts)
V V
I=-- = - - - (2.7) % Set the values of source voltage and internal resistance
RTOT Rs + RL volts= 120;
O programa precisa executar os seguintes passos: rs = 50;

1. Criar uma matriz de valores possíveis para a resistência da carga RL. A matriz % Create an array of load resistances
varia RL de 1 n até 100 n, em passos de 1 n. rl = 1:1:100;
2. Calcular a corrente para cada valor de RL. % Calculate the current flow for each resistance
amps = volts ./ ( rs + rl );
% Calculate the power supplied to the load
pl = (amps .' 2) .* rl;
% Plot the power versus load resistance
plot ( rl, pl) ;
title('Plot of power versus load resistance');
V xlabel('Load resistance (ohms) ');
RL Carga
-+.,..-Y1ab_eli_'___E<llier_ _0ti~k-'>..J.-.-.,_,__ _ _ _ _ _ _ _ _ _ _ _ _ _ __
grid on;

Quando esse programa é executado, o desenho resultante é o mostrado na Figura


2.10. Com esse desenho podemos verificar que a potência máxima é fornecida para a
Fonte de voltagem carga quando a resistência da carga é 50 n. A potência fornecida para a carga com essa
resistência é de 72 watts.
Figura 2.9 Urna fonte de voltagem com uma voltagem V e urna resistência interna R5 suprindo
uma carga de resistência RL. •
:..
64 1 Programação em MATIAS® para Engenheiros

Plot of power versus load resistance


ao,--,-,----,--'--.--.---.---,----.---,--~

~-
;:e,

l':,
'I·••·
/

Decaimento do carbono 14
Capítulo 2 MATlAB Básico 1 65

-
--
100~
70 - 90 l----''d-------i--+---+--1---t-------i--+---+----t
1/v ~

r-----
60
80 t--------+--""--"rl-----+--t--------+----+----+---+----t
íi,
'fil 50 / - 70 l-----+-----+-"'~----+----+-+---+-------+--------1

~-
.!.
ai
~ 40
/ é '-..
lB ao1---+----+-----1---..----+----+--+----+----+-----1
"-
e.

.,,., / ~~ "" ~--- ......

20
/ i
10 /
/
~
40 "'"-.

301---+-----l---+---+--l---+-----l---+---+..........__--"""I

o 20 t------+----+---+---+---+----+----+--+---+-----1
o 10 20 30 40 50 60 70 80 90 100
Load resistance (ohms)
10t----+-----t--+---+--t----+-----+--+---+----l

Figura 2.10 Desenho da potência fornecida para a carga versus resistência da carga. O+---~-~---+--~----~-~--~-~---'
o 1.000 2.000 3.000 4.000 5.000 6.000 7.000 8.000 9.000 10.000
Anos

Figura 2.11 Decaimento radioativo do carbono 14 como função do tempo. Observe que 50% do
carbono 14 original está presente após 5.730 anos.
Observe o uso dos operadores estruturais .*, /'e./ nesse exemplo. Esses opera-
dores garantem o cálculo das matrizes amps e pl elemento a elemento.

• de material Q no momento presente, podemos resolver a Equação (2.8) em t para


Exemplo 2.5 - Datação de Carbono 14 determinar por quanto tempo vem ocorrendo o decaimento. A equação resultante é
1 Q
Um isótopo radioativo de um elemento é uma forma do elemento que não é estável. Em t decay = - ~ log, Qo {2.9)
vez disso, ela decai espontaneamente para outro elemento por um certo período. O
decaimento radioativo é um processo exponencial. Se Q é a quantidade inicial de uma A Equação (2.9} tem aplicações práticas em muitas áreas da ciência. Por exemplo,
substância radioativa no tempo t = O, a quantidade da ~ubstância presente a qualquer arqueólogos usam um relógio radioativo com base no carbono 14 para determinar o
momento t no futuro é dada por tempo que se passou desde a morte de um ser vivo. O carbono 14 é ingerido conti-
------ ntiámenti'q:ior um corpo enquanto uma planta ou arumal VIve, portanto, a quaritidàde
presente dessa substância no corpo é dada como conhecida. A constante de decaimento
(2.8)
À do carbono 14 é bem-determinada e vale 0,00012097 / ano, assim, se a quantidade de
onde À é a constante de decaimento radioativo. carbono 14 remanescente for medida com precisão, a Equação (2.9) poderá ser usada
para determinar há quanto tempo o ser vivo morreu. A quantidade de carbono 14
Como o decaimento radioativo ocorre a uma taxa conhecida, ele pode ser usado
remanescente como função do tempo é apresentada na Figura 2.11.
como um relógio para medir o tempo desde o início do decaimento. Se conhecermos a Escreva um programa que leia a porcentagem de carbono 14 remanescente em uma
quantidade inicial de material radioativo Q0 presente em uma amostra, e a quantidade amostra, calcule a idade da amostra e imprima o resultado com as unidades apropriadas.
66 Programaçlo em MATLAII' para Engenheiros Capftulo 2 MATIAB Básico 67
- - - - - - - - - - - - ---- -------------- -- -- ---------- ..

~
Nosso programa precisa efetuar os seguintes passos:
11, » cl4_date
Enter the percentage of carbon 14 remaining:

1. Pedir que o usuário forneça a porcentagem de carbono 14 remanescente na


amostra. ¾
: f 50
The age of the sample is 5729.9097 years.

lj 2. Ler a porcentagem. -- · i 'I O CRC Handbook of Chemistry and Physics estabelece que a meia-vida do carbono 14

1
3. Converter a porcentagem na fração g. ;T
é de 5.730 anos. A saída do programa, portanto, está de acordo com ele.
.•
4. Calcular a idade da amostra em anos, t.sando a Equação (2.9).
f
i 1' ~

~
/
) 5. Escrever o resultado e terminar.
-i::::-:~ 2.13 Depurando Programas MATLAB '
%
_____ ~- código resultante é este:
Script file: c14_da_t_e__-m-----------------------,1'i_i_w~1
'
.·_:---===================-------------------
Existe um antigo ditado que estabelece que as únicas certezas são a morte e o Imposto
%
% Purpose: 1T
1~,
de Renda. Podemos adicionar uma terceira certeza a essa lista: se você escrever um
% To calculate and age of an organic sample from the percentage 1- programa de tamanho significativo, ele não funcionará na primeira vez que você tentar
il' utilizá-lo! Erros em programas recebem o nome de bugs, e o processo de localizar e
%
%
of the original carbon 14 remaining in the sample.
J
::&
eliminar bugs é denominado depuração. Quando escrevemos um programa e ele não
funciona, como podemos depurá-lo?
% Record of revisions:
% Date Programmer Description of change /:J. Três tipos de erros ocorrem em programas MATLAB. O primeiro tipo é o erro sin-

l
% i ;~ tático. Erros sintáticos são erros em uma declaração MATLAB, como erros tipográficos
% 12/02/98 S . J. Chapman Original cede ! ou de pontuação. São detectados pelo compilador MATLAB na primeira vez que é exe-
%
% Define variables: rutad: :m :::•v: ~/p:}~emplo, adeclaração
% age The age of the sample in years.
% lamda The radioactive decay constant for carbon-14, j ..,; contém um erro sintático, pois os parênteses não estão balanceados. Se essa declaração
%
in units of 1/years. !j estiver em um arquivo M denominado test .m, a seguinte mensagem aparecerá
percent The percentage of carbon 14 remaining at the quando tes t for executado:
time of the measurement.
% ratio The ratio of the carbon 14 remaining at the ;,1_•· » test
time of the measurement to the original amount
of carbon 14. :1
·*

'.if.
:·~
??? X = (y + 3) / 2)
1
Missing operator, comma, or semi-colon.
% Set decay constant for carbon-14 l 11L -
lamda = 0.00012097; Error in ==> d:\book\matlab\chap2\test.rn
% Prompt the user for the percentage of C-14 remainíng. Online 2 ~=>
percent = input('Enter the percentage of carbon 14 remaining:\n'); O segundo tipo de erro é o erro em tempo de execução. Ele aparece quando uma
% Perform calculations operação matemática ilegal ocorre durante a execução do programa (por exemplo, tentar
ratio = percent / 100; % Convert to fractional ratio dividir por O). Esses erros levam o programa a retomar Inf ou NaN, que são então uti-
age= (-1.0 / lamda) * log(ratio); % Get age in years lizados em-outros cálculos. Os resultados de um programa contendo cálculos que usam
% Tel1 the user about the age of the sample. Inf ou NaN são em geral inválidos.
string= ['The age of the sample is 'num2str(age) 'years.']; O terceiro tipo de erro é o erro lógico. Ocorre quando o programa compila e exe-
disp ( string) ; cuta com sucesso, mas produz a resposta errada.
Os erros mais comuns efetuados durante a programação são os tipográficos. Alguns
Para testar o programa completo, vamos calcular o tempo necessário para erros tipográficos criam declarações MATLAB inválidas. Eles produzem erros sintáticos
que metade do carbono 14 desapareça. Esse tempo é conhecido como meia-vida do que são capturados pelo compilador. Outros erros tipográficos ocorrem em nomes de va-
carbono 14. riáveis. Por exemplo, as letras em alguns nomes de variáveis podem ser transpostas, ou
68 1 Programação em MATLAIJIJ para Engenheiros Capítulo 2 MATLAB Básico 1 69

uma letra incorreta pode ser digitada. O resultado-será uma nova variável, e o MATLAB cução do seu programa declaração a declaração e examinar o valor de cada variável a
simplesmente criará a nova variável quando ela for referenciada pela primeira vez. O cada passo ao longo do caminho. Depuradores simbólicos possibilitam verificar todos os
MATLAB não pode detectar esse tipo de erro. Erros tipográficos podem também produzir resultados intermediários sem a necessidade de inserir muitas declarações de saída em
erros lógicos. Por exemplo, se as variáveis vell e vel2 forem usadas para velocidades seu código. Aprenderemos a usar o depurador simbólico do MATLAB no Capítulo 3.
no programa, uma delas poderá ser inadvertidamente usada em lugar da outra em algum
ponto. Você precisa verificar esse tipo de erro inspecionando manualmente o código.
Às vezes um programa inicia a execução, mas erros em tempo de execução ou
erros lógicos ocorrem durante ela. Nesse caso, existe algo errado com os dados de entrada 2.14 Resumo
ou com a estrutura lógica do programa. O primeiro passo para localizar esse tipo de bug
deve ser verificar os dados de entrada do programa. Remova o ponto-e-vírgula das decla- Neste capítulo, introduzimos dois tipos de dados: double e char. Também introduzimos
rações de entrada, ou adicione declarações de saída para verificar se os dados de entra- as declarações de atribuição, os cálculos aritméticos, as funções intrínsecas, as deda-
da são aqueles que você espera. rações de entrada/saída e os arquivos de dádos.
- ---5e-osnomes de variáveis,-p;an~m--estai1""0on'.ebos--e--c,s-da:dc,s--c±e--enmnt.restiío-co:r----+::;:_---=---,,'°ºnr• efi'mrnâi'e•aavvaã1i1aaçr.a'iioTTt.,aíiis~ee'xicipõ"rr.e~s:ssõoeess1i711m~Fsiseeigufüiee"tuirmnaaruleei'.raa:rr<qJiui1[ãatfixaa-:-,ccoonm:1-
retos, você está provavelmente diante de um erro lógico. Você deve verificar cada uma operações de nível mais alto avaliadas antes das operações de nível mais baixo. A
de suas declarações de atribuição. hierarquia das operações está resumida na Tabela 2.11.
A linguagem MATLAB inclui um número extremamente grande de funções pre-
1. Se uma declaração de atribuição é muito longa, quebre essa declaração em decla-
definidas para auxiliar a resolver problemas. Essa lista de funções é muito mais rica do
rações de atribuição menores. Declarações menores são mais fáceis de verificar.
que a lista de funções encontrada em outras linguagens, como Fortran ou C, e inclui
2. Verifique a colocação dos parênteses em suas declarações de atribuição. Um recursos para desenhar que são independentes de dispositivos. Algumas das funções
•i
erro muito comum é ter as operações em uma declaração de atribuição avalia- intrínsecas mais comuns estão apresentadas na Tabela 2.8, e muitas outras serão intro-
~ das na ordem errada. Se você tem dúvidas quanto à ordem de avaliação das
variáveis, adicione conjuntos de parênteses para tornar claras as suas intenções.
<luzidas ao longo do livro. Uma lista completa de todas as funções MATLAB pode ser
acessada através do Navegador de Ajuda.
li 3. Verifique se você iniciou todas as variáveis adequadamente.
11
11
1:
?
4. Confira se todas as funções utilizadas estão com unidades corretas. Por exemplo,
a entrada nas funções trigonométricas precisa ser em radianos, não em graus. 2.14.1 Resumo de Boas Práticas de Programação
Se você ainda obtiver a resposta errada, adicione declarações de saída em vários
Todo programa MATLAB deve ser projetado para que outra pessoa familiarizada com
pontos do programa para ver os resultados dos cálculos intermediários. Se puder loca-
o MATLAB possa entendê-lo com facilidade. Isso é muito importante, pois um bom pro-
lizar o ponto com os cálculos errados, você saberá onde procurar problema, o que será
grama pode ser utilizado por muito tempo. Nesse período, as condições irão mudar, e
95% da batalha.
Se ainda assim não conseguir encontrar o problema, explique a um colega ou ao seu
o programa precisará sofrer modificações para refletir essas mudanças. As modificações
professor o que você está fazendo, e deixe que eles olhem seu código. É muito comum poderão ser feitas por outra pessoa além do programador original. O programador que
que uma pessoa veja apenas o que ela espera ver quando verifica o próprio código. fizer as alterações precisará entender o programa original muito bem antes de tentar
Outra pessoa pode freqüentemente encontrar depressa um erro que você não percebeu. modificá-lo.

Tabela 2.11 Hierarquia de Operações


Precedência Operação
Para reduzir o esforço de depuração, verifique se durante o projeto do seu programa
você: 1 O conteúdo de todos os parênteses é avaliado, de dentro para fora.
2 Os expoentes são avaliados, da esquerda para a direita.
1. Iniciou as variáveis.
3 As multiplicações e divisões são avaliadas, da esquerda para a direita.
2. Utilizou parênteses para tornar claras as funções nas declarações de atribuição.
4 As somas e subtrações são avaliadas, da esquerda para a direita.

O MATLAB tem uma ferramenta especial de depuração denominada depurador É muito mais difícil escrever programas claros e bons para entender e manter do
simbólico. Um depurador simbólico é uma ferramenta que permite acomparihar a exe- que simplesmente escrever programas. Para isso, um programador deve desenvolver
70 Programação em MATLAEP para Engenheiros Capítulo 2 MATLAB Básico 1 71

-----------·-·
disciplina para documentar adequadamente seu trabalho. Adicionalmente, precisa evitar \ Divisão matricial à esquerda
com cuidado os erros conhecidos no caminho em direção aos bons programas. As A
Expoente estrutural
seguintes regras ajudam a desenvolver bons programas: Operador de transposição
1. Use nomes significativos de variáveis sempre que possível. Escolha nomes que Comandos e Funções
podem ser entendidos de imediato, como dia, mês e ano. Continua uma declaração MATLAB na linha seguinte.
2. Crie um dicionário de dados para cada programa, para facilitar a manutenção. abs (x) Calcula o valor absoluto de x.
3. Use somente caixa baixa nos nomes de variáveis, para que não ocorram erros ans Variável default utilizada para armazenar o resultado de
de diferença entre maiúsculas e minúsculas em diferentes ocorrências de um expressões não atribuídas a outra variável.
nome de variável. acos(x) Calcula o co-seno inverso de x. O ângulo resultante é, em radia-

/
J 4. Use um ponto-e-vírgula no final das declarações de atribuição MATLAB para nos, entre Oe 7t.
asin(x) Calcula o seno inverso de x. O ân
.. ___2-u rimir o eco de valores atrib í
examinar os resultados de uma declaração durante a depuração do programa, entre - n/2 e n/2.
atan(x) Calcula a tangente inversa de x. O ângulo resultante é, em radia-
você precisará remover o ponto-e-vírgula dessa declaração apenas.
nos, entre -n/2 e n/2.
5. Se for preciso ocorrer o intercâmbio de dados entre o MATLAB e outros pro- atan2(y,x) Calcula a tangente inversa de y!x, válida para todo o círculo. O
gramas, armazene os dados MATLAB em formato ASCII. Se os dados forem ângulo resultante é, em radianos, entre -7t e n.
apenas para o MATLAB, armazene-os em formato de arquivo MAT. ceil(x) Arredonda x para o inteiro mais próximo em direção ao infinito
6. Armazene arquivos de dados ASCII com uma extensão de arquivo "da t", para positivo:ceil(3.1) = 4eceil(-3.1) = -3.
diferenciá-los dos arquivos MAT, que têm uma extensão "ma t". char Converte uma matriz de números em uma cadeia de caracteres.
7. Use parênteses quando necessário para tomar suas equações claras e fáceis de Para caracteres ASCII, a matriz deve conter números ~ 127.
entender. clock Hora corrente.
8. Sempre inclua as unidades apropriadas nos valores lidos ou escritos pelo programa. cos(x) Calcula o co-seno de x, com x em radianos.
date Dia corrente.
disp Exibe dados na Janela de Comandos.
2.14.2 Resumo do MATLAB doe Abre a Ajuda HTML diretamente para urna descrição de função
particular.
O resumo a seguir lista todos os símbolos especiais, comandos e funções do MATLAB double Converte uma cadeia de caracteres em uma matriz de números.
apresentados neste capítulo, junto com uma breve descrição de cada item. eps Representa precisão de máquina.
exp(x) Calcula e'.
Símbolos Especiais eye(n,m) Gera uma matriz identidade.
[ ] Construtor de matrizes fix(x) Arredonda x para o inteiro mais próximo em direção ao zero:
( ) Forma índices fix(3.1) = 3efix(-3.l) = -3.
Marca os limites de uma cadeia de caracteres floor(x) Arredonda x para o inteiro mais próximo em direção ao menos
(vírgula) separa índices ou elementos de matriz infinito: floor ( 3 .1) = 3 e floor (-3 .1) = -4.
1. Suprime o eco na Janela de Comandos format + Imprime somente os sinais + e -.
2. Separa as linhas da matriz format bank Exibe em formato monetário.
3. Separa declarações de atribuição em uma linha format compact Suprime as mudanças adicionais de linha na saída.
% Início de comentário format hex Imprime em formato hexadecimal de bits.
Dois-pontos, usado para criar listas resumidas _.,_,......_ format 1-011g lmpnme com 14 dig1tos dep01s do ponto deomal. ····

!1 I~~t It:::
+ Soma estrutural e matricial Imprime com 15 dígitos mais o expoente.
Subtração estrutural e matricial Imprime com 15 dígitos, com ou sem o expoente.
* Multiplicação estrutural Imprime com as mudanças adicionais de linha na saída.
* Multiplicação matricial Imprime como razão aproximada de inteiros pequenos.
./ Divisão estrutural à direita Imprime com 4 dígitos depois do ponto decimal.
\ Divisão estrutural à esquerda format short e Imprime com 5 dígitos mais o expoente.
/ Divisão matricial à direita _ _ forrnat short g Imprime com 5 dígitos, com ou sem o expoente.
;!!

\.t ;_. 11
72 1 Programaçlo em MATlAEJII para Engenheiros 73
.
'í'
1
Capitulo 2 MATIAS Básico

--------····---·--····.
fprintf Imprime a informação formatada. a. Qual o tamanho de arrayl?
grid Adiciona/remove uma grade de um desenho. b. Qual o valor de arrayl ( 4, 1)?
i H c. Qual o tamanho e o valor de arrayl ( : , 1 : 2 ) ?
Inf Representa o infinito de máquina (oo). d. Qual o tamanho e o valor de arrayl ( [ 1 3] , end) ?
input Cria um marcador e lê um valor do teclado.
int2str 2.2 Os nomes de variáveis MATLAB a seguir são legais ou ilegais? Por quê?
Converte x em uma cadeia de caracteres de inteiros.
a. dogl
j H b. ldog
legend Adiciona uma legenda a um desenho.
length(arr) c. Do_you_know_ the_way_ to_san_j ose
~
Devolve o comprimento de um vetor ou a maior dimensão de
d. _help
uma matriz bidimensional.
e. What' s_up?
) load
log(x)
Carrega os dados de um arquivo.
Calcula o logaritmo natural de x. 2.3 Determine o tamanho e o conteúdo das 'matrizes a seguir. Observe que as últimas
1 og mg-~- ese o og- og. este
lookfor Procura um termo que case na descrição de funções de uma mesmo exercício.
linha do MATLAB. a. a 1:2:5;
max(x) Retoma o valor máximo no vetor x, e, opcionalmente, a locali- b. b [a ' a ' a ' ] ;
zação desse valor. e e b(l:2:3,1:2:3);
min(x) Retoma o valor mínimo no vetor x, e, opcionalmente, a localiza- d. d a + b (2 , : ) ;
ção desse valor. e. w [ zeros ( 1, 3) ones ( 3, 1) ' 3: 5' J ;
mod(n,m) Função resto, ou módulo. f. b ( [ 1 3 J , 2 l = b ( [ 3 1 J , 2 ) ;
NaN Representação de "não-um-número". 2.4 Assuma que a matriz arrayl seja definida conforme mostrado, e determine o
num2str(x) Converte x em uma cadeia de caracteres.
conteúdo das submatrizes a seguir.
ones(n,m) Gera uma matriz de uns.
pi
plot
Representa o número 7t.
Gera um desenho xy linear.
1.1
[ O. O
o.o 2.1 -3.5
1.1 -6. 6 2.8
6.0]
3.4
arrayl = 2.1 0.1 0.3 -0.4 1. 3
print Imprime uma Janela de Figuras.
round(x) Arredonda x para o inteiro mais próximo. -1.4 5.1 o.o 1.1 o.o
save Armazena os dados do espaço de trabalho em um arquivo. a. arrayl (3,:)
semilogx Gera um desenho log-linear. b. arrayl ( : , 3)
semilogy Gera um desenho linear-log. c. arrayl ( 1: 2 : 3, [ 3 3 4] ) )
sin(x) Calcula o seno de x, com x em radianos. d. arrayl ( [1 1),:)
size Captura o número de linhas e de colunas de uma matriz. 2.5 Assuma que o valor inicial de value seja 101t. Determine o que será impresso
sqrt Calcula a raiz quadrada de um número. pelas declarações abaixo
str2num Converte uma cadeia de caracteres em um número. disp (['value = 'num2str(value)]);
tan(x) Calcula a tangente de x, com x em radianos. disp (['value = ' int2str(value)]);
title Adiciona um título a um desenho. fprintf(['value %e\n',value);
zeros Gera uma matriz de zeros. fprintf(['value %f\n',value);
fprintf(['value %g\n',value);
fprintf(['value - %12.4f\n'.yaluel;
2.15 Exercícios 2.6 Considere a, b, e e d definidas conforme a seguir, e calcule os resultados das seguintes
operações caso elas sejam legais. Se uma operação for ilegal, explique o motivo.
2.1 Responda às seguintes perguntas a respeito da matriz abaixo.

l [
1.1
o.o
o.o
1.1 -6.6
2.1 -3.5
2.8
6.0]
3.4
a [-12 -2]2 b

array = 2.1 O. 1 O. 3 -0. 4 1. 3


-1.4 5.1 o.o 1.1 o.o
e
L1J d eye(2)
...,,
'

74 1 Programaçlo em MATIAEP para Engenheiros Capitulo 2 MAT/AB Básico 1 75

-····----·----- --- -- . - .. ···-··--·-·--··--·-····- ----- -- -- - - - - - - - · - - - - - - - · - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ··-------··· -·---·------··----··


a. result a + b; Escreva um programa para calcular a distância entre quaisquer dois pontos (xl, yl)
b. result a * d; e (x2, y2) especificados pelo usuário. Utilize boas práticas de programação em seu
c. result a * d; programa. Use-o para calcular a distância entre os pontos (2, 3) e (8, -5).
d. result a * e;
e. result a * e;
f. result a \ b;
g. result a . \ b;
y
h. result a A b;
• (x1,Y1)
2. 7 Avalie cada uma das seguintes expressões:
a. 11 / 5 + 6
) b. (11 / 5) + 6
• (Jc2, ;2)

----tltt---- - , __ ____j;'.,__i___,___--L---L:1-.±-.D.J-----------------------------lf-iii.....-----------------1----t---------------
d. 3 A 2 A 3
e. 3 A (2 A 3)
f. ( 3 A 2) A 3
g. round(-11/5) + 6
h. ceil(-11/5) + 6
L floor(-11/5) + 6
Figura 2.12 Distância entre dois pontos em um plano cartesiano.
2.8 Use o MATLAB para avaliar estas expressões:
a. (3 -St)(-4 + 6i)
b. cos-1 (1.2)
2.9 Resolva o seguinte sistema de equações simultâneas para x: 2.12 Decibéis. Os engenheiros freqüentemente medem a razão entre duas medidas de
-2.0 xl + 5.0 X2 + 1.0 X3 + 3.0 X4 + 4.0 X5 - 1.0 x6 o.o potência em decibéis, ou dB. A equação para a razão entre duas medidas de potên-
2.o x1 - 1 . o x2 - 5 . o X3 - 2 . o x4 + 6 •o x5 + 4.o x6 1 •o cia, em decibéis, é
-1.0 xl + 6.0 X2 - 4.0 X3 - 5.0 X4 + 3.0 xs 1.0 x6 -6.0 P2
4. o Xi + 3. o x2 - 6. o x3 - 5. o x4 2. o x5 2. o x6 10. o dB = 10 log10 - (2.13)
-3.0 xl + 6.0 X2 + 4.0 X3 + 2.0 X4 - 6.0 xs + 4.0 x6 -6.0 pl
2.0 x1 + 4.0 X2 + 4.0 x3 + 4.0 X4 + 5.0 X5 4.0 x6 -2.0 onde P2 é o nível de potência medido e P1 é um nível de potência de referência.
2.10 Posição e Velocidade de uma Bola. Se uma bola estacionária é lançada da altura a. Assuma que o nível de potência de referência P1 seja de um miliwatt, e escreva
h0 acima da superfície da Terra, com velocidade vertical v01 a posição e a veloci- um programa que aceite como entrada uma potência P2 e a converta em dB com
dade da bola como função do tempo serão dadas pelas equações relação ao nível de referência de 1 mW. (Os engenheiros têm uma unidade es-
pecial para níveis de potência em dB com respeito à referência de lmW: dBm.)
h(t) = } gt2 + v0t + h0 (2.10) Utilize boas práticas de programação em seu programa.
v(t) = gt + v0 (2.11) 1 b. Escreva um programa que crie um desenho da potência em watts versus potência

i
em dBm com relação à medida de referência de 1 mW. Crie desenhos linear em
onde g é a aceleração da gravidade (-9,81 m/ s2), h é a altura acima da superfície x e y e log-linear.
da Terra (assumindo ausência de atrito do ar) e v é o componente vertical da 2.13 Co-Seno Hiperbólico. A função de co-seno hiperbólico é definida pela equação
velocidade. Escreva um programa MATLAB que solicite ao usuário a altura inicial
da bola em metros e a velocidade da bola em metros por segundo, depois desenhe coshx== - - - (2.14)
a altura e velocidade como função do tempo. Não deixe de incluir as legendas 2
apropriadas no seu desenho. Escreva um programa que calcule o co-seno hiperbólico de um valor x fornecido
2.11 A distância entre dois pontos (x1, yl) e (x2, y2) em um plano de coordenadas carte- pelo usuário. Utilize o programa para calcular o co-seno hiperbólico de 3.0. Com-
sianas é dada pela equação pare a resposta do seu programa com a resposta produzida pela função cosh (x) .
Qual é o menor valor admitido para essa função? Qual o valor de x correspon-
d "' ✓ (x1 - x2)2 + (yl - y2)2 (2.12) dente a esse valor?
76 1 Programação em MATlAEP para Engenheiros Capítulo 2 MATlAB Básico 1 77

2.14 Energia-ATI11.a.zenadaemuma Mõlai-ltfõrçii-í-equeridã. para comprfmir-ii.mamoTa


linear é dada pela equação
F=kx (2.15)
onde F é a força em newtons e k é a constante da mola em newtons por metro. A
energia potencial armazenada na mola comprimida é dada pela equação

kx 2E= l (2.16)
2
onde E é a energia em joules. A informação a seguir diz respeito a quatro molas.
Terra .,.

Força (N)
Constante da Mola k (N / m)
a. Desenhe a voltagem na carga resistiva como função da freqüência. Em qual fre-
qüência temos o pico de voltagem na carga resistiva? Qual a voltagem na carga
Determine a compressão de cada mola e a energia potencial armazenada em cada com essa freqüência? Essa freqüência também é chamada freqüência de
uma delas. Qual mola tem mais energia potencial armazenada? ressonância / 0 do circuito.
b. Se a freqüência mudar para 10% acima da freqüência de ressonância, qual será
2.15 Receptor de Rádio. Uma versão simplificada da parte frontal de um receptor de
a voltagem na carga? Quão seletivo será o receptor de rádio?
rádio AM é apresentada na Figura 2.13. Esse receptor é composto por um circuito
c. Em quais freqüências a voltagem na carga cairá para a metade da voltagem na
que contém um resistor R, um capacitor C e um indutor L conectados em série. O
freqüência de ressonância?
circuito é conectado a uma antena externa e aterrado conforme mostra a figura.
O circuito permite que o rádio selecione uma estação específica dentre as 2.17 Suponha que dois sinais sejam recebidos na antena do rádio descrita no problema
que transmitem na faixa AM. Na freqüência de ressonância do circuito, essen- anterior. Um sinal tem potência de 1 V a uma freqüência de 1.000 kHz, e o outro sinal
cialmente todo o sinal V0 da antena vai até o resistor, que representa o resto do tem potência de 1 V a 950 kHz. Quanta potência será fornecida pelo primeiro sinal para
rádio. Em outras palavras, o rádio recebe seu sinal mais forte na freqüência de a carga resistiva R? E pelo segundo sinal? Expresse a razão, em decibéis, entre a
ressonância. A freqüência de ressonância do circuito indutor-capacitor é dada potência fornecida pelo sinal um e a potência fornecida pelo sinal dois. Qual a melho-
pela equação ria ou supressão do segundo sinal, comparado com o primeiro?
1 2.18 Raio de Curva de Aeronaves. Um objeto movendo-se em uma trajetória circular,
fo = (2.17) com velocidade tangencial constante v, é apresentado na Figura 2.14. A aceleração
2rr,Jic radial requerida para o objeto se mover na trajetória circular é dada pela equação
onde L é a indutância em henrys (H) e C é a capacitância em farads (F). Escreva um a= v2 (2.19)
programa que calcule a freqüência de ressonância desse aparelho de rádio, dados r
valores específicos para L e C. Teste seu programa pelo cálculo da freqüência do onde a é a aceleração centrípeta do objeto em m/ s2, v é a velocidade tangencial do
rádio quando L = 0,1 mH e C = 0,25 nF. objeto em m/ s e r é o raio da curva em metros. Supondo que o objeto seja uma
2.16 Receptor de Rádio. A voltagem através da carga resistiva, na Figura 2.13, varia aeronave, responda às seguintes questões sobre ela:
como função da freqüência, conforme a Equação (2.18). a. _Sl!f>OnbÊ que a aeronave esteja se movendo a Macb 0,85, ou seja 85% da~veloci-
dade do som. Se a aceleração centrípeta for de 2 g, qual será o raio da curva da
aeronave? (Nota: para este problema, você pode assumir que Mach 1 = 340 m/s
e 1 g = 9,81 m/s2.)
(2.18) b. Suponha que a velocidade da aeronave aumente para Mach 1,5. Qual o raio da
curva para a aeronave?
onde co = 21t/ e fé a freqüência em hertz. Assuma que L = 0,1 mH, C = 0,25 nF, R = e. Desenhe o raio da curva como função da velocidade da aeronave para veloci-
SOO e V 0 = 10mV. dades entre Mach 0,5 e Mach 2,0, assumindo que a aceleração permaneça em 2 g.
78 1 Programação em MATlAIP para Engenheiros

3
d. Suponha que a aceleração máxima suportada pelo piloto seja de 7 g. Qual o
menor raio da curva da aeronave a Mach 1,5?
e. Desenhe o raio da curva corno função da aceleração centrípeta para acelerações Capítulo
entre 2 g e 8 g, assumindo urna velocidade constante de Mach 0,85.

Expressões de Ramificação e
/ r Projeto de Programa

No capítulo anterior, desenvolvemos diversos programas MATLAB completos e fun-


cionais. Entretanto, todos foram muito simples, compostos por séries de declarações
Figura 2.14 Um objeto deslocando-se em movimento circular uruforme com aceleração cen-
MATLAB executadas urna após a outra em urna ordem fixa. Esses programas são
trípeta a. denominados programas seqüenciais. Eles lêem dados de entrada, processam esses
dados para produzir urna resposta desejada, exibem o resultado e encerram o proces-
samento. Não há corno repetir partes do programa mais de uma vez nem como execu-
tar seletivamente apenas certas partes do programa, dependendo de valores dos dados
de entrada.
Nos próximos dois capítulos, introduziremos diversas declarações MATLAB
para controlar a ordem de execução das declarações em um programa. Existem duas
grandes categorias de declarações de controle: ramificações, que selecionam partes
específicas do código para serem executadas, e laços, que fazem partes específicas do
código serem repetidas. As ramificações serão discutidas neste capítulo, e os laços, no
Capítulo 4.
Com a introdução de ramificações e laços, nossos programas se tomarão mais
complexos, por isso será mais fácil cometer erros. Para ajudar a evitar erros de progra-
mação, introduziremos um procedimento formal para projetos de programas, baseado
em uma técnica conhecida como projeto top-down {"de cima para baixo"). Vamos tam- •
bém introduzir uma ferramenta de desenvolvimento de algoritmos conhecida como
pseudocódigo.

3.1 Introdução a Técnicas de Projeto Top-Oown


Suponha que você, engenheiro em uma empresa, precise escrever um programa para
resolver um problema. Como você começa?
Diante de um novo problema, existe uma tendência natural de irmos direto para
o teclado sem "perder" tempo pensando a respeito do problema. Freqüentemente, é
80 Programaçlo em MATlAIJII para Engenheiros Capitulo 3 Express/Jes de Ramificação e Projeto de Programa 81

-- -···--·---···· · · · ~ - - - - -------· --··-·-·---·-- --------·-- - - - - - l i r - - - - - - - - - - - - - ------ ·····- -----·-··


possível resolver a situação com essa abordagem "em tempo real" para problemas Início
muito pequenos, como boa parte dos exemplos neste livro. No mundo real, entre-
tanto, os problemas são maiores, e um programador com uma abordagem dessas ten-
derá a perder-se irremediavelmente. Para problemas maiores, vale a pena pensar no Estabeleça o problema que

t
problema e na abordagem a ser usada para resolvê-lo antes mesmo de escrever uma você está tentando resolver
linha de código.
Introduzimos aqui um processo formal para projetos de programas, e então
usamos esse processo em todas as aplicações desenvolvidas no restante do livro. Para
Defina as entradas
alguns exemplos simples que faremos, o processo de projeto poderá parecer um e saldas requeridas
exagero. Entretanto, à medida que os problemas resolvidos se tornarem maiores, o
processo passará a ser cada vez mais essencial para o sucesso na programação.
an o eu era um estu te e graduação, um de meus professores gostava de
dizer: "Programar é fácil. Saber o que programar é o difícil". Isso ficou claro para mim
Projete o algoritmo
quando deixei a universidade e comecei a trabalhar em empresas, envolvido com pro-
jetos de softwares de grande porte. Descobri que a parte mais difícil do meu trabalho
era entender o problema que eu estava tentando resolver. Uma vez entendido o problema, Refinamento passo a passo
era fácil quebrá-lo em partes menores e mais fáceis de gerenciar, com funções bem-
Converta o algorttmo em
definidas, para então atacar cada uma das funções uma por vez. declarações MATLAB
O projeto top-down é o processo de iniciar com uma tarefa grande e quebrá-la em
partes menores e mais fáceis de entender (as subtarefas), que desempenhem uma parte
da tarefa desejada. Cada subtarefa deve, por sua vez, ser subdividida em subtarefas
ainda menores, se necessário. Uma vez dividido o programa em partes menores, cada Teste o programa
MATLAB resultante
parte pode ser codificada e testada independentemente. Não tentamos combinar as
subtarefas antes que cada uma delas seja verificada individualmente.
O conceito de projeto top-down é a base de nosso processo formal de projeto de
programas. Vamos agora introduzir os detalhes do processo, que é ilustrado na Figura 3.1. Fim!
Os passos envolvidos são:
Figura 3.1 O processo usado neste livro para projetar programas.
1. Estabeleça com clareza o problema a ser resolvido

-r-,1
Os programas em geral são escritos para satisfazer alguma necessidade, mas
essa necessidade pode não ser claramente articulada pela pessoa que requi-
sita o programa. Por exemplo, um usuário pode solicitar um programa para
resolver um sistema de equações lineares simultâneas. Essa requisição não é li i;i! Projete e escreva um programa para resolver um sistema de equações lineares
!..!:~_- '._
suficientemente dara para permitir que um programador projete um pro- simultâneas, com coeficientes reais e até 20 equações e 20 variáveis livres.
grama; é preciso antes saber muito mais sobre o problema a ser resolvido.
O sistema de equações a ser resolvido é real ou complexo? Qual o número T 2. Defina as entradas requeridas pelo programa e as saídas produzidas por ele
máximo de equações e de variáveis livres que o programa precisa tratar? ii ~~-As-entradas para o progxama e as saídas produzidas p01 ele precisam ser
Existem simetrias, nas equações, que possam ser exploradas para facilitar a especificadas para que o novo programa se ajuste adequadamente ao esquema
resolução? O projetista do programa precisa conversar com o usuário que re-
de processos geral. Nesse exemplo, os coeficientes das equações a resolver estão
quisitou o programa, e os dois devem estabelecer claramente e com exatidão
provavelmente em alguma ordem preexistente, e nosso novo programa precisa
o que estão tentando construir. Um estabelecimento claro do problema evita
mal-entendidos e ajuda o projetista do programa a organizar adequadamente ser capaz de lê-los nessa ordem. De maneira similar, ele precisa produzfr as
seu raciocínio. No exemplo descrito, estabelecer claramente o problema po- respostas requeridas pelos outros programas no processo geral e escrever essas
deria significar: respostas no formato requerido por eles.
82 1 Programaçlo em MATLAIJ9 para Engenhfliros Capitulo 3 Express66s de Ranificaçlo e Projeto de Programa 83

---------------- ----1----- ----------------------------.


3. Projete o algoritmo que você pretende implementar no programa Início
Um algoritmo é um procedimento passo a passo para encontrar a solução de
um problema. É nesse estágio do processo que entram as técnicas de projeto
top-down. O projetista busca divisões lógicas no problema, dividindo-o em
subtarefas de acordo com essas divisões. Esse processo é chamado decomposição. r- Teste unitário das
subtarefas Individuais
Se as subtarefas são grandes, o projetista pode subdividi-las ainda mais em ---··f_---
' _ _-
subtarefas menores. O processo se repete até o problema ser dividido em diversas l'
partes pequenas, cada uma delas efetuando uma tarefa simples e de claro Subtarefas validadas separadamente
entendimento.
[I
Montagens sucessivas
Após a decomposição do problema em partes menores, cada parte é refi- (adicionando subtarefas Tantas vezes quanto necessário
/ nada por meio de um processo denominado refinamento passo a passo: um pro- ao programa)
- ---ietis Subtarefas combinadas como um lÍllklO programa
fazer, e então define as funções em detalhes cada vez maiores, até que elas se
tomem específicas o suficiente para serem transformadas em declarações
MATLAB. O refinamento passo a passo é em geral efetuado com pseudocó- Versão alfa Tantas vezes quanto necessário

digo, que será descrito na próxima seção.


Costuma ser útil resolver um exemplo simples do problema à mão
Correção dos erros mais graves
durante o processo de desenvolvimento do algoritmo. Se o projetista en-

I·_-
tender os passos seguidos durante a resolução do problema à mão, ele apli-
cará com maior facilidade ao problema a decomposição e o refinamento Versão beta Tantas vezes quanto necessário
passo a passo.
;
'!
4. Transforme o algoritmo em declarações MATLAB
Correção de erros menores
Se os processos de decomposição e refinamento foram executados apro-
priadamente, este passo será muito simples. Tudo o que o programador Programa terminado
precisará fazer será substituir o pseudocódigo pelas declarações MATLAB
correspondentes, que devem corresponder ao pseudocódigo em uma relação Figura 3.2 Um processo de testes típico para um programa grande.
um para um.
5. Teste o programa MATLAB resultante
Este passo é crucial. Os componentes do programa precisam ser testados
primeiro individualmente, se possível, e depois o programa como um todo pre-
cisa ser testado. Ao testar um programa, precisamos verificar se ele funciona
corretamente para todos os conjuntos legais de dados de entrada. É muito comum
que um programa seja escrito, testado com alguns conjuntos básicos de dados
e liberado para uso, para então verificarmos que ele gera as respostas erradas
w-
'""'
i '.
nadas para produzir o programa final. A primeira montagem do programa
tipicamente inclui apenas algumas poucas subtarefas. Ela é usada para veri-
ficar as interações entre as subtarefas e as funções executadas pelas combi-
nações de subtarefas. Em montagens sucessivas, mais e mais subtarefas são
(ou falha) com outros dados de entrada. Se o algoritmo implementado em um 1
adicionadas, até completar todo o programa. Os testes são executados em
programa inclui ramificações diferentes, precisamos testar todas as possíveis cada montagem, e os erros (bugs) detectados são corrigidos antes de passar
ramificações para garantir que o programa opere corretamente sob qualquer - - -para a mantagem seguinte.
circunstância possível. Os testes continuam mesmo depois de completar o programa. A primeira
Programas grandes tipicamente passam por uma série de testes antes de versão completa do programa é geralmente chamada versão alfa. Ela é expe-
liberação para uso geral (ver Figura 3.2). O primeiro estágio de teste é por


rimentada pelos programadores e outras pessoas próximas, de todas as ma-
vezes chamado de teste unitário. Nessa fase, as subtarefas individuais do neiras possíveis, e os bugs descobertos durante os testes são corrigidos. D~pois

j
programa são testadas separadamente para confirmar se elas estão fun- de removidos do programa os bugs mais sérios, uma nova versão, denominada
cionando corretamente. Após completar o teste unitário, o programa passa versão beta, é preparada. A versão beta é normalmente fornecida a usuários
por uma série de montagens, nas quais as subtarefas individuais são combi- externos "cooperativos" que necessitam do programa no seu dia-a-dia. Esses
l ,. 84 Programação em MATlAIP para Engenheiros Capítulo 3 Expressões de Ramificação e Projeto de Programa 85
i !
usuários colocam o programa em uso sob diversas condições diferentes e com dessas construções é denominado algorihno estruturado. Quando o algorihno é imple-
diversos conjuntos distintos de dados de entrada, e reportam aos programa- mentado como um programa MATLAB, o programa resultante é denominado pro-
dores os bugs encontrados. Corrigidos os bugs, o programa está pronto para ser grama estruturado.
liberado para uso geral. Como os programas neste livro são bastante pequenos, As construções utilizadas para algorihnos podem ser descritas de uma forma
não passaremos por testes extensivos como os descritos anteriormente. Entre- especial denominada pseudocódigo. Pseudocódigo é uma mistura lu'brida de MATLAB
tanto, seguiremos os princípios básicos para testar todos os nossos programas. e de português. Efa é estruturada como o MATLAB, com uma linha separada para cada
idéia ou segmento distinto de código, mas as descrições de cada linha são em por-
O processo de projetar programas pode ser resumido como: tuguês. Cada linha do pseudocódigo deve descrever sua idéia em português simples,
1. Estabelecer claramente o problema a ser resolvido. de fácil compreensão. O pseudocódigo é muito útil para desenv!Jlver algorihnos, pois é
2. Definir as entradas requeridas pelo programa e as saídas a serem produzidas flexível e fácil de modificar. É especialmente útil devido à possibilidade de ser escrito e
/ por ele. modificado pelo mesmo editor ou processador de texto usado para escrever o progra-
3,-P-rojetar o algoritmo a ser-impl.enrerrta1:fo-norpi1"0J2:raJmac:----------------iir--f'fta-Mi\'.fb<ltB----i'lefltlttlm-ret=ttrso--griHi(:0-1e8f,eeittt-é-1-eqtterttttr.------------
4_ Transformar o algorihno em declarações MATLAB. Por exemplo, o pseudocódigo para o algorihno do Exemplo 2.3 é:
5. Testar o programa MATLAB. Solicite ao usuário a temperatura em graus Fahrenheit
i Leia a temperatura em graus Fahrenheit (temp_f)
i
,1 temp_k em kelvins ~ (5/9) * (temp_f - 32) + 273.15
1 Escreva a temperatura em kelvins
·1
Siga os passos do processo de projetar programas para construir programas MATLAB Observe a flecha para a esquerda(~), utilizada no lugar do sinal de igual(=) para in-
confiáveis e de fácil entendimento. dicar que um valor é armazenado em uma variável. Isso evita confusão entre atribuição
e igualdade. O pseudocódigo deve auxiliar a organização de seu raciocínio antes de
convertê-lo em código MATLAB.
Em um projeto de programação de grandes proporções, o tempo efetivamente
ocupado por programação é surpreendentemente pequeno. No livro The Mythical
Man-Month, 1 Frederick P. Brooks Jr. sugere que, em um típico projeto de software de 3.3 Operadores Relacionais e Lógicos
grandes proporções, um terço do tempo é ocupado planejando o que fazer (passos 1 a
3), um sexto do tempo é ocupado efetivamente escrevendo o programa (passo 4) e A operação de muitas construções de ramificação é controlada por uma expressão cujo
metade do tempo é ocupado testando e depurando o programa! Obviamente, qualquer resultado é verdadeiro (1) ou falso (O). Existem dois tipos de operadores que produzem
coisa que pudermos fazer para reduzir o tempo de testes e depuração será muito útil. resultados verdadeiro/ falso no MATLAB: operadores relacionais e operadores lógicos.
Podemos reduzir da melhor maneira os testes e a depuração sendo cuidadosos na fase Como na linguagem C, o MATLAB não tem um tipo de dados booleano ou lógico.
de planejamento e utilizando boas práticas de programação. Boas práticas de progra- Em vez disso, o MATLAB interpreta um valor zero como falso e um valor diferente de
mação reduzirão o número de bugs no programa e tornarão mais fáceis de identificar zero como verdadeiro.
os que ainda sobrarem.

3.3.1 Operadores Relacionais


3.2 Uso de Pseudocódigo
Operadores relacionais são operadores com dois operandos numéricos ou de cadeias
Como parte do processo de projeto, é necessário descrever o algorihno a ser imple- __,..;;;;;_. de canu:;tere~~uzem-um resultado verdadeiro (1) ou falso (01 dependendo.da
mentado. A descrição do algorihno deve ser em uma forma padronizada e fácil para relação entre os dois operandos. A forma geral de um operador relacional é
você e outras pessoas entenderem, e ajudá-lo a transformar seus conceitos em código ª1 op ª2
MATLAB. As formas padronizadas que utilizamos para descrever algorihnos são
denominadas construções (ou estruturas, às vezes), e um algorihno descrito por meio onde a1 e a2 são expressões arihnéticas, variáveis ou cadeias de caracteres, e op é um dos
operadores relacionais da Tabela 3.1.
Se a relação entre a1 e a2 expressa pelo operador for verdadeira, a operação retor-
The Mythical Man-Month, de Frederick P. Brooks Jr., Addison-Wesley, 1974. na um valor 1; caso contrário, a operação retorna um valor O.
III
86 Programação em MATLAIJII para Engenheiros capítulo 3 Expressões de Rawficação e Projeto de Programa 87

--1--------------------------------
Tabela 3.1 Operadores Relacionais sinal. Um erro muito comum de programadores novatos é usar um sinal de igual único
para tentar efetuar uma comparação.
Operador Operação

Igual a
Diferente de
> Maior que Cuidado para não confundir o operador de equivalência relacional(==) com a decla-
>= Maior que ou igual a ração de atribuição (=).
< Menor que -·-~ - ~- -.-. ,. . , . .-- ------=---------. ----·----·-
. - -
- ·--- .
<= Menor que ou igual a
Na hierarquia de operações, operadores relacionais são avaliados depois de todos

(ambas são verdadeiras e produzem um valor 1):


Algumas operações relacionais e seus resultados são apresentados a seguir.
7 + 3 < 2 + 11
Operação Resultado (7 + 3) < (2 + 11)
3 < 4 1
3 <= 4 1
3 -- 4 o 3.3.2 Nota de Atenção a Respeito dos Operadores== e-=
3 > 4 o O operador de equivalência (==) retorna 1 quando os dois valores comparados são
4 <= 4 1 iguais, e O quando são diferentes. De maneira similar, o operador de não equivalência
'A' < 'B' 1 (~=) retorna Oquando os dois valores comparados são iguais, e 1 quando são diferentes.
Esses operadores são, de maneira geral, bons para comparar cadeias de caracteres, mas
A última operação relacional produz 1 porque os caracteres são avaliados em ordem
podem às vezes produzir resultados surpreendentes quando dois valores numéricos
alfabética. são comparados. Devido a erros de arredondamento durante cálculos computacionais,
Operadores relacionais podem ser usados para comparar um valor escalar com uma dois números teoricamente iguais podem ser ligeiramente diferentes, levando um teste
matriz. Por exemplo, se a = [ 1 O ] e b = O, então a expressão a > b produzirá de igualdade ou de desigualdade a falhar.
-2 1 Por exemplo, considere os dois seguintes números, que deveriam ser ambos iguais
o resultado [ ~ ~ ] . Operadores relacionais podem também ser usados para comparar aü,O:
a= O;
duas matrizes, desde que ambas tenham o mesmo tamanho. Por exemplo, se b = sin(pi);
a = [ 1 O]
e b =[ 1 O],
então a expressão a > = b produzirá o resultado
Como esses números são teoricamente o mesmo, a operação relacional a == b deveria
-2 1 -2 -1
[! ~ l Se as matrizes tiverem tamanhos diferentes, um erro será produzido.
produzir um 1. Na realidade, o resultado desse cálculo no MATLAB é
»a= O;
Observe que, como cadeias de caracteres são na realidade matrizes de caracteres, » b = sin(pi);
operadores relacionais podem comparar duas cadeias de caracteres somente se elas tiverem o »a== b
mesmo comprimento. Se elas tiverem comprimentos distintos, a operação de comparação ans_ "'- ________________________
produzirá um erro. Vamos aprender uma forma mais geral de comparar cadeias de ca- o
racteres no Capítulo 6. O MATLAB reporta que a e b são diferentes em decorrência de um ligeiro erro de
O operador relacional de equivalência é escrito com dois sinais de igual, enquanto arredondamento no cálculo de sin (pi), que leva o resultado a ser 1,2246 x 10-16 em
operador de atribuição é escrito com um único sinal de igual. Esses operadores são vez de exatamente zero. Os dois valores teoricamente iguais diferem ligeiramente de-
muito diferentes, e programadores novatos freqüentemente os confundem. O símbolo vido ao erro de arredondamento!
== é uma operação de comparação que retorna um resultado lógico, enquanto o sím- Em vez de comparar dois números para ver a igualdade exata, você deve ajustar
bolo = atribui o valor da expressão à direita do sinal de igual à variável à esquerda desse seus testes para determinar se dois números são aproximadamente iguais, com uma
•· "".f ~I. -·,
l
'
r
:
li
i~.11:1.;

Í' ~
88 1 Programação em MATlA~ para Engenheiros
- Capítulo 3 Expressões de Ramificação e Projeto de Programa 89

precisão "qüeleve erri conta. os. erros . dé. arredondamento esperad~; para os números Tabela 3.3 Tabelas-Verdade para Operadores Lógicos
comparados. O teste
» abs (a - b) < 1.0E-14 ,, Entradas
/2
e
,, & /2
ou
,, 1 /2
ou exclusivo
xor(/1,/2)
não
-1,
ans
li =
1 o o o o o 1
o 1 o 1 1 1
produz a resposta correta, apesar dos erros de arredondamento no cálculo de a e b.
1 o o 1 1 o
---=_,.,,..-...,...,..,.,~-~-~-...,......~--- - -
1 1 1 1 o o
ffl .f ~,. 'ff~,; " ~;it\; ,'\:r•\ 1 ,:t - • ,., , ~-~ •- ~ ,- '
• ,., ~ "• ' '"' ' .. "" A. ~ •

Cuidado ao testar a igualdade de valores numéricos, pois erros de arredondamento


··podern:f anave1s que evenam ser 1gua1s arem no teste de igualdade. Em era ores ogicos podem ser usados para comparar um valor escalar com uma
vez disso, teste para ver se as variáveis são quase iguais dentro de um erro de matriz. Por exemplo, se a = [ ~ ~] e b = O, então a expressão a&b apresentará
arredondamento esperado para o seu computador.

o resultado [ ~ ~ ]. Operadores lógicos podem também ser usados para comparar

duas matrizes, desde que as duas tenham o mesmo tamanho. Por exemplo, se
3.3.3 Operadores Lógicos
Operadores lógicos são operadores com um ou dois operandos lógicos que produzem
a [ ~ ~] e b = [ ~ ~} então a expressão a I b apresentará o resultado [ ~ !]·
um resultado lógico. Existem três operadores lógicos binários - E, OU e OU exclusivo - Se as matrizes tiverem tamanhos diferentes, um erro será produzido. .
e um operador unário - NÃO. A forma geral de uma operação lógica binária é Na hierarquia de operações, os operadores lógicos são avaliados depois de todas
as operações aritméticas e relacionais. A ordem de avaliação dos operadores em uma
11 op 12
expressão é dada a seguir.
e a forma geral de uma operação lógica unária é
1. Todos os operadores aritméticos são avaliados primeiro, na ordem descrita
anteriormente.
onde 11 e /2 são expressões ou variáveis, e op é um dos operadores lógicos mostrados na 2. Todososoperadoresrelacionais (==, ~=, >, >=, <, <=) são avaliados,
Tabela 3.2. Se a relação entre 11 e 12 expressa pelo operador for verdadeira, a operação da esquerda para a direita.
retorna um valor 1; caso contrário, a operação retorna um valor O.
Os resultados dos operadores estão nas tabelas-verdade apresentadas na Tabela 3.3, 3. Todos os operadores ~ são avaliados.
que mostram o resultado de cada operação para todas as combinações possíveis de 11 e 12• 4. Todos os operadores & são avaliados, da esquerda para a direita.
Nas operações lógicas, o MATLAB trata um operando como verdadeiro se ele for dife-
rente de zero, e falso se for igual a zero. Assim, o resultado de ~5 é O, e o resultado 5. Todos os operadores I são avaliados, da esquerda para a direita. 2
de -O é 1.
Assim como acontece com os operadores aritméticos, os parênteses podem ser
usados para mudar a ordem-padrão de avaliação. Exemplos de operadores lógicos e
Tabela 3.2 Operadores Lógicos seus resultado!rSão dados no Exemplo 3.1.
Operador Operação

& E lógico
2 Nota: Antes do MATLAB 6, os operadores & e I tinham precedência igual, e eram avaliados da es-
OU lógico querda para a direita em ordem de ocorrência. A partir do MATLAB 6, o & passou a ser avaliado antes
xor OU exclusivo lógico do 1. Assim, uma expressão como a I b&c seria avaliada diferente no MATLAB 5.3.1 ou anterior e no
NÃO lógico
MATLAB 6.0 ou posterior. Cuidado! Por garantia, sempre use parênteses para indicar a ordem dese-
jada de avaliação de uma expressão.
90

__
1 Programação em MATlAB!' para Engenheiros
Capítulo 3 Expressões de Ramificação e Projeto de Programa 1 91

• ...
Teste 3.1
Exemplo 3.1
Considere que as seguintes variáveis são iniciadas com os valores mostrados, e calcule Este teste apresenta uma verificação rápida do seu entendimento dos conceitos apre-
o resultado das expressões especificadas. sentados na Seção 3.3. Se você tiver problemas com o teste, releia as seções, pergunte ao
seu professor ou discuta o material com um colega. As respostas podem ser encontradas
valuel 1 no final do livro.
value2 o
value3 -10 Assuma que a, b, e e d sejam conforme dado, e avalie as seguintes expressões:
a 20; b -2;
Expressão Lógica
Resultado e o; d 1;
----a.--'iiH'U'½-l+-ttUf"C-+1-~-----------------flr---------------~fi::....-------t--;---a--:,.--tr-------------------------------
~ valuel value2 1 2. b > d;
c. valuel & value2 o 3. a > b & e > d
d. valuel & value2 1 value3 1 4. a -- b
~ valuel & (value2
[ -{valuel & value3)
value3)
o
1 5. a & b > e
6. --b 1
• . 1 a ·ua •
'ílmtt-PIIWI\R!l l.lfWlll"!llffllll un1,•: f. Assuma que a, b, e e d sejam conforme dado, e avalie as expressões a seguir.

O operador ~ é avaliado antes dos outros operadores lógicos. Portanto, os pa- 1""
a 2.
'
b
L~ ~~];
rênteses na expressão (f) do exemplo anterior são necessários. Sem esses parênteses, a
expressão (f) teria sido avaliada na ordem (-valuel) & value3.
e =
[~ ~];
7. -(a > b)
d
[-i 1
1
i];
8. a > e & b > e;
3.3.4 Funções Lógicas 9. e<= d

Assuma agora que a, b, e e d sejam conforme dado. Explique a ordem de avaliação de


O MATLAB tem diversas funções lógicas que retomam 1 quando a condição testada
cada uma das seguintes expressões, e especifique os resultados em cada caso:
for verdadeira e O quando a condição testada for falsa. Essas funções podem ser
usadas com operadores relacionais e lógicos para controlar a operação de ramifi- a 2; b 3;
cações e laços. e 10; d O;
Algumas das funções lógicas mais importantes são dadas na Tabela 3.4. 10. a*bA2 > a*c
11. d 1 b > a
12. (d 1 b) > a
Tabela 3.4 Funções Lógicas do MATLAB
Assuma que a, b, e e d sejam conforme dado, e avalie as seguintes expressões:
Função Objetivo ~--~
a 20; b -2;
ischar(a) Devolve 1 se a for uma matriz de caracteres, e O, caso contrário.
~ e O; d 'Test';
isempty(a) Devolve 1 se a for uma matriz vazia, e O, caso contrário. !
~ 13. isinf(a/b)
isinf(a) ~
Devolve 1 se o valor de a for infinito ( In f), e O, caso contrário. :;&~'

s: 14. isinf{a/c)
isnan(a)
isnumeric(a)
Devolve 1 se o valor de a for NaN {não um número), e O, caso contrário.
Devolve 1 se a for uma matriz numérica, e O, caso contrário. • 15. a > b & ischar{d)
16. isempty(c)
92 1 Programação em MATLAB® para Engenheiros Capítulo 3 Expressões de Flãmificação e Projeto de Programa 93

3.4 Ramificações quando a condição correspondente é falsa. Assim, quando um operador é verdadeiro, o
resultado é diferente de zero e o bloco correspondente é executado.
Ramificações são declarações MATLAB que nos permitem selecionar e executar seções Como um exemplo de construção i f, considere a solução da equação quadrática
específicas de código (denominadas blocos) e saltar outras seções do código. São varia- da forma
ções da construção i f, da construção swi tch e da construção try / ca tch. ax2 + bx +e= O (3.1)
A solução dessa equação é
3.4.1 A Estrutura if
-b± ✓ b2-4ac
X= - - - - - - - - - (3.2)
A construção i f tem a forma 2a
.if~xpr: -on trol~ __________________________.µ;:___---1.JL.te=LO-lt),2'--'_=--4,ac_.e...c:oi:Lhe~io-.com.<)41SQr:m,w:,,.rmJ:e..cla.Jeqi.lal;ã(;~ie.-l:~2=-,.,a,.ic..;:>-U,,....h.ÍÍ--'mas-.raíízeS--
Declaração 1} reais distintas para a equação quadrática. Se b2 -4ac = O, há uma única raiz repetida para
D. e_ c_ laração 2 Bloco 1 a equação. Se b2 - 4ac < O, há duas raízes complexas para a equação quadrática.
Suponha que queiramos examinar o discriminante de uma equação quadrática e
elseif expr_controle_2 dizer a um usuário se a equação tem duas raízes complexas, duas raízes reais idênticas
Declaração 1} ou duas raízes distintas reais. Em pseudocódigo, essa construção adotaria a forma
Declaração 2 Bloco 2
if (bA2 - 4*a*c) < o
else Escreva que a equação, tem duas raízes complexas.
Declaração elseif (bA2 4*a*c) -- o J

Declaração ~} Bloco 3 Escreva que a equação tem duas raízes reais idênticas.
else
end Escreva que a equação tem duas raízes reais distintas.
end
onde as expressões de controle controlam a operação da construção if. Se expr_con-
trole_l é diferente de zero, o programa executa as declarações no Bloco 1 e salta para As declarações MATLAB para fazer isso são
a primeira declaração executável depois de end. Caso contrário, o programa verifica o if (b'2 - 4*a*c) < O
estado de expr_controle_2. Se expr_controle_2 é diferente de zero, o programa disp( 'Essa equação tem duas raízes complexas.');
executa as declarações no Bloco 2 e salta para a primeira declaração executável depois elseif (bA2 - 4*a*c) == O
de end. Se todas as expressões de controle são zero, o programa executa as declarações disp( 'Essa equação tem duas raízes reais idênticas.');
no bloco associadas com a cláusula e 1 se. else
Pode haver qualquer número de cláusulas elseif (O ou mais) em uma construção disp( 'Essa equação tem duas raízes reais distintas.');
if, mas pode haver no máximo uma cláusula else. A expressão de controle em cada end
cláusula será testada somente se as expressões de controle em todas as cláusulas acima
dela forem avaliadas como zero. Quando uma das expressões é diferente de zero e o Lembre-se de que os operadores relacionais retomam um valor diferente de zero (1)
bloco correspondente é executado, o programa salta para a primeira declaração execu- quando o teste é verdadeiro, por isso um teste verdadeiro provocará a execução do
tável depois de end. Se todas as expressões de controle são zero, o programa executa as bloco de código correspondente.
declarações no bloco associadas com a cláusula els e. Se não existir uma cláusula else, Para facilitar a leitura, os blocos de código com uma construção if são em geral
a execução continua depois de end sem executar qualquer parte da construção i f. · tabulados-em dois ou três espaços, mas isso na verdade não é estritamentereq_uerido.
Note que a palavra chave end no MATLAB, nessa construção, é completamente dife-
rente da função end do MATLAB que usamos no Capítulo 2 para retomar o valor mais
alto de um índice dado. O MATLAB diferencia esses dois usos de end pelo contexto em
que aparece a palavra em um arquivo M.

i---
Sempre tabule o corpo de uma construção i f em dois ou mais espaços, para facilitar a
.
Na maioria das circunstâncias, as expressões de controle são uma combinação de opera-
dores relacionais e lógicos. Conforme aprendemos no início do capítulo, os operadores .· legibilidade do código.
relacionais e lógicos produze_m 1 quando a condição correspondente é verdadeira e O
---~
94 Programação em MATlAEP para Engenheiros Capítulo 3 Expressões de Ramificação e Projeto de Programa 1 95

É possível escrever uma construção i f completa em uma única linha, separando discriminante. É razoável, portanto, implementar esse algoritmo com uma cons-
as partes da construção por vírgulas ou ponto-e-vírgula. Assim, as duas construções a trução i f de três ramificações. O pseudocódigo resultante é
seguir são idênticas: Solicite ao usuário os coeficientes a, b e c.
Leia a, b e c.
if X< Ü discriminante f-- b'2 - 4 *a* c
y = abs {x); if discriminante> O
end xl f-- ( -b + sqrt{discriminante) ) / (2 * a)
x2 f-- ( -b - sqrt(discriminante) ) / (2 * a)
e
Escreva que a equação tem duas raízes reais distintas.
if x < O; y = abs{x); end Escreva as duas raízes.
elseif discriminante== O·
Entretanto, isso deve ser feito somente 1 f-- -b 2 * a
Escreva que a equação tem duas raízes reais idênticas.
Escreva a raiz repetida.
3.4.2 Exemplos de Utilização de Estruturas if else
parte_real f-- -b / (2 * a)
Vamos agora analisar dois exemplos de uso das construções if. parte_imag f-- sqrt (abs (discriminante) ) / (2 * a)
Escreva que a equação tem duas raízes complexas.
• end
Escreva as duas raízes.

Exemplo 3.2 - Equação Quadrática


4. Transforme o algoritmo em declarações MATLAB
Projete e escreva um programa para resolver as raízes de uma equação quadrática, inde- O código final MATLAB é conforme a seguir.
pendentemente do tipo.
% Script file: calc_roots.m
Solução %
% Purpose:
Vamos seguir os passos de projeto apresentados anteriormente no capítulo. % This program solves for the roots of a quadratic equation
1. Estabeleça o problema % of the form a*x'2 + b*x + c O. It calculates the answers
% regardless of the type of roots that the equation possesses.
A apresentação do problema para este exemplo é muito simples. Queremos es-
%
crever um programa para resolver as raízes de uma equação quadrática, indepen-
% Recora of revisions:
dentemente de serem raízes reais distintas, reais repetidas ou raízes complexas. Description of change
% Date Prograrnmer
2. Defina as entradas e saídas %
As entradas requeridas para esse programa são os coeficientes a, b e e da
equação quadrática ·-.- % 12/04/98
%
S. J. Chapman Original code

ax2 +bx+c=O (3.1) 11 % Define variables:


% a Coefficient of x"2 term of equation
A saída do programa serão as raízes da equação quadrática, independente-
mente de serem raízes reais distintas, reais repetidas ou complexas.
3. Projete o algoritmo
Essa tarefa pode ser quebrada em três seções, cujas funções são entrada, proces-
1 %b
%c
% discriminant
% imag_part
% real_part
Coefficient of x term of equation
Constant term of equation
Discriminant of the equation
Imag part of equation {for complex roots)
Real part of equation (for complex roots)
samento e saída.
% xl First solution of equation (for real roots)
:qJF
Leia os dados de entrada % x2 Second solution of equation (for real roots)
Calcule as raízes
Escreva as raízes
Agora, quebramos as seções acima em partes menores e mais detalhadas.
* % Prompt the user for the coefficients of the equation
disp ('This progream solves for the roots of a quadratic');
Existem três possíveis_maneiras de calcular as raízes, dependendo do valor do disp ('equation of the form A*X'2 + B*X + C = O. ');
.
,;:.-
-.. . 1•.·.-
.
96

a
1 Programaçlo Bm MATWJ8 para Engenheiros

-------- -· ·- ...
input ( 'Enter the coefficient A: ');
.... - --·· --·----- ····-·-·-- -·-- ,_
~
-- Capitulo 3 ExpresslíBs dB Ramificaçlio B Projeto dB Programa

-------•--•--•••-•••----•-••-•••--•••••a•••••••••-••-•--•-"

This equation has two real roots:


97

b input ( 'Enter the coefficient B: I ) ;


xl = -2.000000
e input ( 'Enter the coefficient C: ' ) ; x2 = -3.000000

-,-.-
» calc_roots
% Calculate discriminant ,. This program solves for the roots of a quadratic
discriminant = bh2 - 4 *a* e;
equation of the forro A*XA2 + B*X + C O.
% Solve for the roots, depending on the value of the discriminant Enter the coefficient A: 1
if discriminant >O% there are two real roots, so ... Enter the coefficient B: 4
Enter the coefficient C: 4
xl = ( -b + sqrt(discriminant)
x2 = ( -b - sqrt(discriminant)
) / ( 2 *a);
) / ( 2 *a); f This equation has two identical real roots:
xl = x2 = -2.000000

•I· .
.

1
disp ('This equation has two real roots:'); » calc_roots
fprintf ('xl = %f\n', xl); This program solves for the roots of a quadratic
fprintf ('x2 = %f\n', x2); Enter the coefficient A: 1
elseif discriminant ==O% there is one repeated root, so ... Enter the coefficient B: 2
- Enter the coefficient C: 5
xl = ( -b ) / ( 2 * a ) ; This equation has complex roots:
disp ('This equation has two identical real roots;'); 1 •
xl = -1.000000 +i 2.000000
fprintf ('xl = x2 = %f\n', xl); xl = -1.000000 -i 2.000000

J
'
else % there are complex roots, so li,; O programa dará as respostas corretas para nossos dados de testes em todos
real_part = ( -b ) / ( 2 * a ) ; !. ,." os três casos possíveis.
imag_part = sqrt ( abs ( discriminant) ) / ( 2 *a);
/ ..

disp ( 'This equation has complex roots:'); ··--;··1,. . '· ·::·;··· -
fprintf ( 'xl %f +i %f\n', real_part, imag_part );

1 "
!''
fprintf ( 'xl + %f -i %f\n', real_part, imag_part ); -~,·
'1141"'' Exemplo 3.3 -Avaliar uma Função de Duas Variáveis
end l Escreva um programa MATLAB para avaliar uma função ft.x, y) para quaisquer dois va- _
5. Teste o programa lores x e y especificados pelo usuário. A função ft.x,y) é definida assim:
A seguir, vamos testar o programa utilizando dados reais. Como existem três
possíveis caminhos pelo programa, precisamos testar todos os três caminhos antes x+y x ~ O and y :2!: O
de termos certeza de que o programa está funcionando apropriadamente. A par- f( x )- { x+y2 x~0andy<0
tir da Equação (3.2), é possível verificar as soluções para as equações a seguir. ,y - x2+y x<Oandy.::O
x2 + y2 x < Oand y < O
x2 + Sx + 6 = O x = -2, and x = - 3
x2 + 4x + 4 = 0 X = -2 Solução
x 2 + 2x + 5 = 0 X= -1 ± i2
A função ft.x,y) é avaliada diferentemente, dependendo dos sinais das duas variáveis
Se esse programa for executado três vezes com os coeficientes acima, os re- independentes x e y. Para determinar a equação ideal a ser aplicada, será necessário ve-
sultados serão como os mostrados (os dados fornecidos pelo usuário aparecem rificar os.sinais. dos_ya)ores de r e y fornecidas pela usuária
em negrito):
» calc_roots 1. Estabeleça o problema
A apresentação deste problema é muito simples: avalie a função ft.x , y) para
This program solves for the roots of a quadratic
quaisquer valores x e y fornecidos pelo usuário.
equation of the form A*XA2 + B*X + e o. ~
Enter the coefficient A: 1 "' 2. Defina as entradas e saídas
Enter the coefficient B: 5
iI
As entradas requeridas pelo programa são os valores das variáveis independentes
Enter the coefficient C: 6 x e y: A saída do programa será o valor da função ft.x, y).
··1
98 1 Programaçlo em MATlA8f/J para Engenheiros Capítulo 3 Express/Jes de P.amificação e Projeto de Programa 99

3. Projete õ algorittno . % Define variables:


Essa tarefa pode ser quebrada em três seções, cujas funções são entrada, proces- % X First independent variable
samento e saída. % y Second independent variable
Leia os valores de entrada x e y % fun Resulting function
Calcule f (x, y)
Escreva f(x,y) % Prompt the user for the values x and y
x input ('Enter the x coefficient: ');
Vamos agora quebrar as seções acima em partes menores e mais detalhadas.
y = input ('Enter the y coefficient: ');
Existem quatro maneiras possíveis de calcular a função f(x,y), dependendo dos
valores de x e y, por isso é razoável implementar esse algoritmo com uma cons-
% Calculate the function f(x,y) based upon
trução i f com quatro ramificações. O pseudocódigo resultante é
% the signs of x and y.
Solicite ao usuário os valores de x e y. i f X >= Ü & y >= __Q __ _ - - - - - - - - - - - - - - - - - - - -
Leia x e y
fun = x + y;
ifx~0ey~0
elseif x >= O & y < O
fun +- x + y
fun = x + yA2;
elseif X :::: o e y < o
elseif x < O & y >= O
fun +- X + yA2
fun xA2 + y;
elseif X < o e y :::: o
fun +- XA2 + y else
else fun
fun +- XA2 + yA2 end
end
Escreva f (x, y) % Write the value of the function.
disp (['The value of the function is 'num2str(fun)]);
4. Transforme o algoritmo em declarações MATLAB
O código MATLAB final é este. 5. Teste o programa
% Script file: funxy.m Precisamos agora testar o programa usando dados de entrada reais. Como _
% existem quatro caminhos possíveis pelo programa, precisamos testar todos os
% Purpose: quatro caminhos antes de termos certeza de que o programa está funcionando
% This program solves the function f{x,y) for a corretamente. Para testar todos os possíveis caminhos, executaremos o progra-
% uscr-specified x and y, where f(x,y) is defined as: ma com os quatro conjuntos de valores de entrada (x, y) = (2, 3), (2, -3), (-2, 3)
% e (-2, -3). Calculando à mão, veremos que
%
% X y
+ x >= O and y >= O
f (2, 3) = 2 + 3 = 5
% X + yA2 x >= O and y < O
f (2, 3) = 2 + (-3)2 = 11
% f{x,y) XA2 + Y x < O and y >= O
f (-2, 3) = (-2)2 + 3 = 7
% XA2 + yA2 x < O and y > O
f(-2, -3) = (-2)2 + (-3)2 = 13
%
Se o programa for compilado e executado quatro vezes com os valores acima,
%
os resultados serão:
% Record of revisions:
% Date Programmer Description of change » funxy
% ----------=--======== Enter the x coefficient: 2
% 12/05/98 S. J. Chapman Original code Enter the y coefficient: 3
% The value of the function is 5

..::;;,..
li:
.··:,. l i
; ; t 1, 100 1 Programação em MATLA~ para Engenheiros Capítulo 3 Expressões de Ramificação e Projeto de Programa 1 101
:. 111
,t
» funxy if (test3)
Enter the X coefficient: 2
Enter the y coefficient: -3 end
The value of the function is 11
» funxy end
Enter the X coefficient: -2
Enter the. y coefficient: 3 end
The valtÍe of the function is 7
» funxy Esse programa contém três construções i f aninhadas que podem se espalhar por
• Enter the X coefficient: -2 centenas de linhas de código. Agora, suponha que a primeira declaração end seja
Enter the y coefficient: -3 acidentalmente removida durante uma se:;são de edição. Quando isso ocorre, o
The value of the function is 13 interpretador MATLAB associa automaticamente o segundo end com a construção if
( test3) mais interna, e o terceiro end, com a if ( test2) do meio. Quando o inter-
O programa dará as respostas corretas para nossos valores de teste em todos os pretador atinge o fim do arquivo, ele se dá conta de que a primeira construção i f
quatro casos possíveis. (testl) não foi fechada e gera uma mensagem de erro dizendo que falta um end.
• Infelizmente, ele não pode dizer onde o problema ocorreu, daí a necessidade de voltar e
procurar manualmente em todo o programa para localizar o erro.
É às vezes possível implementar um algoritmo usando múltiplas cláusulas
3.4.3 Notas a Respeito do Uso de Estruturas if elseif ou declarações if aninhadas. Nesse caso, um programador pode escolher o
estilo que melhor lhe aprouver.
A construção i f é muito flexível. Ela exige uma declaração i f e uma declaração end.
No meio, pode ter qualquer número de cláusulas elseif, e pode também ter uma
cláusula else. Com essa combinação de características, é possível implementar qual- •
quer construção desejada de ramificação. Exemplo 3.4 - Distribuição de Notas Usando Letras
Adicionalmente, construções i f podem ser aninhadas. Duas construções i f são
aninhadas se uma delas se posiciona inteiramente dentro de um único bloco de código Suponha o desenvolvimento de um programa para ler uma nota de aluno numérica e
da outra. As duas construções i f a seguir estão apropriadamente aninhadas. associar uma letra a ela, segundo a tabela a seguir:

if X> 0 nota > 95 A


95 2: nota > 86 B
if y < o '- 86 2: nota > 76 e
76 2: nota > 66 D
end 66 2 nota > o F

Escreva uma construção if para distribuir as notas conforme descrito acima usando
end (a) múltiplas cláusulas elseif e (b) construções if aninhadas.
O interpretador MATLAB sempre associa uma dada declaração end com a decla-
ração i f mais recente, assim, o primeiro end fecha a declaração i f y < O, enquanto Solução
o segundo end fecha a declaração i f x > O. Isso funciona bem para um programa a. Uma possível estrutura com o uso de cláusulas elseif é
escrito apropriadamente, mas pode levar o interpretador a produzir mensagens de
erros confusas se o programador preparar um código errôneo. Por exemplo, suponha --~Íf nota > 95. O
que tenhamos um programa de grande porte com uma construção deste tipo: disp( 'A nota é A.');
elseif nota> 86.0
disp{ 'A nota é B. ');
if (testl) elseif nota> 76.0
disp ( 'A nota é e. •);
if (test2) elseif nota> 66.0
disp('A nota é D.');
102 1 Programação em MATLA&a para Engenheiros
Capítulo 3 Expressões de Ramificação e Projeto de Programa 1 103

case case_expr_2,
disp ( 'A nota é F. ' ) ;
Declaração 1
end
Declaração 2 } Blooo2
b. Uma possível estrutura com o uso de construções i f aninhadas é
if nota> 95.0 otherwise,
disp( 'A nota é A.'); Declaração 1
else Declaração 2 } Blocon
if nota> 86.0
disp( 'A nota é B. ');
else end
if nota> 76.0 - Se o valor de expr_switch for igual a expr_case'.:_1, o primeiro bloco de código será execu-
disp( 'A nota é e.'); SWl. C •
else De maneira similar, se o valor de expr_switch for igual a expr_case_2, o segundo bloco
if ~ > 66.0 de código será executado e o programa saltará para a primeira declaração após o final da
disp( 'A nota é D.'); construção swi tch. A mesma idéia se aplica os outros casos na construção. O bloco de
else código otherwise é opcional. Se ele estiver presente, será executado sempre que o
disp ('A nota é F. '); valor de expr_swi tch estiver fora do coberto por todos os seletores de casos. Se ele
end
não estiver presente e o valor de expr_swi tch não for coberto pelos seletores de casos,
end
end nenhum dos blocos de código será executado. O pseudocódigo para o construtor de
end casos é idêntico à sua implementação em MATLAB.
Se muitos valores de expr_swi tch provocarem a execução do mesmo código,
• será possível incluir todos esses valores em um único bloco por meio de chaves, con-
forme ilustrado a seguir. Se a expressão casar com alguma das expressões na lista, o
Deve ficar claro, pelo exemplo acima, que, se houver muitas opções mu-
tuamente exclusivas, uma construção i f única com múltiplas cláusulas bloco será executado. ·
elseif será mais simples do que uma construção i f aninhada. switch (expr_switch)
case (expr_case_l, expr_case_2, expr_case_3),
Declaração 1
Declaração 2 } Bloco 1
Para ramificações com muitas opções mutuamente exclusivas, utilize uma única construção
i f com múltiplas cláusulas elseif, preferencialmente a construções if aninhadas. otherwise,
Declaração 1
------------ - ------ -------------- - . -- -- . Declaração 2

3.4.4 A Estrutura swi tch end


A switch_expr e cada uma das case_expr podem ser valores numéricos ou de cadeias
A construção swi tch é outra forma de construção de ramificação. Ela permite que um
de caracteres.
programador selecione um bloco de código em particular ser executado, com base no
valor de um único inteiro, caractere ou expressão lógica. A forma geral de uma cons- .. Note_que.no.máximo um bioro de cócHgo pode ser execntado Após a execução de
trução swi tch é: um bloco de código, a execução salta para a primeira declaração executável depois da
declaração end. Assim, se a expressão switch casar com mais de uma expressão case,
switch (expr_switch) somente a primeira será executada.
case expr_case, Vamos analisar um exemplo simples de construção swi tch. As declarações
Declaração 1 ~ abaixo determinam se um inteiro entre um e dez é par ou impar e imprimem uma men-
Declaração 2 } Bloco 1 sagem apropriada. Com isso, ilustramos o uso de uma lista de valores como seletores
de casos, e também o uso do bloco otherwise.
.,
tt· :i--
l li 104 1
t ...
.'
Progranwção em MATlA8'9 para Engenheiros
Capítulo 3 Expressões de Ramificação e Projeto de Progranw 1 105
mr
switch {valor)
% Inicia a matriz
case ( 1, 3 , 5, 7, 9) , a 1 -3 2 5];
disp('O valor é impar.'); try

,li
case (2, 4, 6, 8, 10), % Tenta exibir um elemento
disp('O valor é par.'); índex= input('Forneça o índice do elemento a ser exibido: ');
, otherwise, disp{ ['a{' int2str(index) ') 'num2str(a(index))] );
disp{'O valor é inválido.'); catch
end Se chegarmos aqui, ocorreu um erro
l li %

l :1i .

,j
disp( ['Índice ilegal: ' int2str(index)] ) ;
end
11 3.4.5 A Estrutura try/catch o executar esse programa, as resultaad.ca1Ss...:;s,.;ãLCai:,·- - - - - - - - - - - - - - - - -
~
l!iii A construção try / ca tch é uma construção de ramificação especial para capturar
» try_catch
Forneça o índice do elemento a ser exibido: 3
erros. Normalmente, quando um programa MATLAB encontra um erro durante a
a (3) = 2
execução, o programa aborta. A construção try / ca tch modifica esse comporta-
» try_catch
mento-padrão. Se ocorrer um erro em uma declaração no bloco try dessa construção,
Forneça o índice do elemento a ser exibido: 8
em vez de abortar o programa executará o código dentro do bloco ca tch e continuará Índice ilegal: 8
a execução. Com isso, um programador pode manipular erros dentro do programa sem
provocar a parada do programa.
A forma geral de uma construção try/catch é:
este 3.2
try
Declaração 1 Este teste apresenta uma verificação rápida da sua compreensão dos conceitos apresen-
Declaração 2 } Bloco Try tados na Seção 3.4. Se você tiver problemas com o teste, releia as seções, pergunte ao seu
professor ou discuta o material com um colega. As respostas podem ser encontradas no
catch final do livro.
Declaração 1 Escreva declarações MATLAB para as funções descritas a seguir.
Declaração 2 } Bloco Catch 1. Se x é maior que ou igual a zero, escreva o valor da raiz quadrada de x na va-
riável sqrt_x e imprima o resultado. Caso contrário, imprima uma mensagem
end de erro sobre o argumento da função de raiz quadrada e coloque o valor zero
em sqrt_x.
Quando uma construção try / ca tch for alcançada, as declarações no bloco 2. Uma variável denominada fun é calculada como numerador/ denominador.
try serão executadas. Se não ocorrerem erros, as declarações no bloco ca tch serão Se o valor absoluto de denominador for menor que l.OE-300, escreva "Erro de
ignoradas e a execução continuará a partir da primeira declaração depois da cons- divisão por zero". Caso contrário, calcule e imprima o valor de fun.
trução. Por outro lado, se um erro ocorrer no bloco try, o programa interromperá a
3. O custo por milha de um veículo alugado é $ 0,50 para as primeiras 100 milhas,
execução das declarações naquele bloco e executará de imediato as declarações no $_(130 I@"ª as 200 milhas seguintes e$ 0,20 para todas as milhas.alémd.as 300
bloco catch. primeiras. Escreva declarações MATLAB para determinar o custo total e o custo
Um programa de exemplo que contém uma construção try / ca tch é apresen- médio por milha para um dado número de milhas (armazenado em uma va-
tado a seguir. Ele cria uma matriz e solicita que o usuário especifique um elemento da riável distância).
matriz para ser exibido. O usuário fornece um número de índice e o programa exibe o Examine as declarações MATLAB abaixo. Elas estão corretas ou incorretas? Se
elemento correspondente da matriz. As declarações no bloco try serão sempre execu- estiverem incorretas, onde está o erro?
tadas nesse programa, enquanto o bloco ca tch será executado somente se ocorrer um
4. if volts > 125
erro no bloco try.
disp('WARNING: High voltage online.');
106 1 Programação em MATlAf!IP para Engenheiros Capítulo 3 Expressões de Ramificaçlo e Projeto de Programa 1 107

H volts ros Tabela 3.5 Formas do Comando/ Função axis

else
<
disp('WARNING: Low voltage online.'); i Comando Descrição
disp(nLine voltage is within tolerances.'); v = axis; Essa função retorna um vetor-linha de 4 elementos que contém
end (xmin xmax ymin ymax], onde xmin, xmax, ymin e ymax
são os limites do desenho.
5. color = 'yellow';
switch ( color) axis ( [xmin xmax ymin ymax]); Essa função ajusta os limites x e y para o desenho com os valo-
res especificados.
case 'red';
disp ('Stop now!'); axis equal Esse comando ajusta os incrementas de eixos para que sejam
case 'yellow', iguais nos dois eixos.
disp('Prepare to stop.'); axis square Esse comando torna quadrado o quadro de eixos corrente.
case u green' , axis normal Esse comando cancela os efeitos dos dois comandos anteriores.
disp('Proced through intersection.'); axis off Esse comando desliga todos os rótulos, marcas e efeitos de
otherwise, fundo.
disp('Illegal color encountered.'); axis on Esse comando liga os rótulos, marcas e efeitos de fundo (forma-
end padrão ).
6. i f tempera ture > 3 7
disp('Human body temperature exceeded.');
elseif temperature > 100
disp{'Boiling point of water exceeded.');
end
Alguns comandos MATLAB aparentemente não conseguem decidir se são comandos
ou funções. Por exemplo, às vezes axis parece ser um comando, e às vezes uma função.
Ora tratamos essa declaração como um comando (axis on), ora podemos tratá-la
como urna função (axis ([O 20 O351)). Como é isso possível?
3.5 Características Adicionais de Diagramas Uma resposta curta é: os comandos MATLAB são na realidade implementados por
funções, e o interpretador MATLAB consegue substituir por uma chamada de função todo
Esta seção descreve os recursos adicionais para os diagramas simples bidimensionais comando encontrado. É sempre possível ativar um comando diretamente como uma função
apresentados no Capítulo 2. Esses recursos nos permitem controlar os intervalos dos em vez de utilizar a sintaxe de comando. Assim, estas duas declarações são idênticas:
valores de x e y apresentados no diagrama, colocar diagramas múltiplos um sobre o
outro, criar múltiplas figuras, criar múltiplos diagramas em uma figura e proporcionar axis on;
maior controle sobre linhas e textos no diagrama. Aprenderemos também como criar axis ( 'on');
diagramas polares.
Toda vez que o MATLAB encontra um comando, ele forma uma função a partir do
comando, tratando cada argumento do comando como uma cadeia de caracteres e ati-
1
1,
3.5.1 Controlando os Limites nos Diagramas dos Eixos x e y vando a função equivalente com aquelas cadeias de caracteres como argumentos.
Assim, o MATLAB interpreta o comando
O padrão é exibir os diagramas com eixos x e y de dimensões suficientes para mostrar
garbage 1 2 3
todos os pontos de um conjunto de dados de entrada. Entretanto, por vezes é útil exibir
somente um subconjunto de dados que seja de interesse particular. Isso pode ser feito _ ___________________
__.__
como a seguinte ativação de função:
pelo comando/função axis (veja a Nota sobre a relação entre comandos e funções
MATLAB). garbage ( '1 ' , '2 ' , '3' )
Algumas formas do comando/ função axi s são apresentadas na Tabela 3.5. As
duas mais importantes são apresentadas em negrito - permitem que um programador Observe que somente as funções com caracteres como argumentos podem ser tratadas como
capture os limites de um diagrama e os modifique. Uma lista completa de todas as comandos. Funções com argumentos numéricos podem ser utilizadas somente na forma
opções pode ser encontrada na documentação on-line do MATLAB. de função. Isso explica por que a declaração axis é às vezes tratada como um comando
Para ilustrar o uso do axi s, vamos desenhar a função f (x) = sin x de -27t até 21t, e e outras vezes tratada como uma função.
depois restringir os eixos para as regiões O~ x ~ e O::; y :S: 1 .

. -::.,
·; ,,:
',:, 11··'
:,i
\t. ,'
: ,t; Capítulo 3 ExpressãtJs de Ramificação e Projeto de Programa 1 109
j .1 108 1 Programação em MATIAf!S para Engenheiros
'11:.1
1,
.. ······-·--·--- .... ··-··-·-·---·-·····-------- - - - - - - - - - -

. 1
i (, (~ As declarações que criam esse diagrama são apresentadas a seguir, e o diagrama resul-
tante é apresentado na Figura 3.3a.
0,8

0,6
I \ I \ X= -2*pi:pi/20:2*pi;
y = sin(x);

0,4
I \ I \ plot(x,y);
title ('Diagrama de sin(x) vs x');
0,2
\ I
/
\ grid on;

o I \ \ Os limites do diagrama podem ser determinados com a função axis básica.

-0.2
\ j \ I » limits=axis
limits =

-0,4 \ I \ -8 8 -1 1

-0,6
\ I \ I Esses limites podem ser modificados pela ativação da função axis ( [ O pi O 1] ) . Exe-
cutada a função, o diagrama resultante é o apresentado na Figura 3.3b.
\ /
l

-0,8 /
-1
,/ \/ 3.5.2 Desenhando Múltiplos Diagramas sobre os Mesmos Eixos
-8 -8 -4 -2 o 2 4 6 8
Em condições normais, um novo diagrama é criado cada vez que se usa um comando
(a) plot, e os dados anteriores são perdidos. Esse comportamento pode ser modificado
com o comando hold. Após utilizar o comando hold on, todos os diagramas adi-
cionais serão colocados uns sobre os outros. Depois do comando hold off, o com-
portamento da construção de diagramas voltará para a forma-padrão, em que um
/
"' \ \
diagrama novo substitui um anterior.
0,9 Por exemplo, os comandos a seguir desenham sin x ecos x sobre os mesmos eixos.
/ O diagrama resultante é apresentado na Figura 3.4.
0,8 J

0,7
/ X = -pi:pi/20:pi;
yl = sin (x);

0,6
/ \ y2 = cos (x);
plot(x,yl, 'b-'l;

0,5 / \ \
hold on;
plot(x,y2, 'k--');

0,4
/ \ hold off;
legend ( 'sin x' , 'cos x' ) ;
0,3 / \
0.2 / \ 3.5.3 Criando Múltiplas Figuras

0,1 / \
O MATLAB pocle criar múltiplas Janelas de Figuras, com dados distintos· exibidos
em cada uma delas. Cada Janela de Figuras é identificada por um número de figura, que
/ \ é um inteiro positivo pequeno. A primeira Janela de Figuras recebe o rótulo Figure 1, a
0,5 1,5 2 2,5 3 segunda Figure 2, e assim por diante. Uma das Janelas de Figuras será a figura corrente,
(b) e todos os novos comandos de desenho serão nela exibidos.
A figura corrente é selecionada com a função figure. Essa função é escrita como
• "figure (n) ", onde n é um número de figura. Quando esse comando é executado, a
Figura 3.3 (a) Diagrama de sin x versus x. (b) Aproximando a visão para a região [ o 1t o 1]. figura com o rótulo Figure n toma-se a figura corrente e é utilizada nos comandos de
11 O I Programaçlo em MATIAIJB para Engenheiros Capitulo 3 ExpressiJes de Ramificaçio e Proieto de Programa 1 111

---------------···-------------··--···-
f Esse comando criam x n subdiagramas na figura corrente, organizados em m linhas e n
·:.1
!
0,8 .,// í colunas, e seleciona o subdiagrama p para receber os comandos de desenho correntes.
Os subdiagramas são enumerados da esquerda para direita e de cima para baixo. Por
slnx
'' exemplo, o comando subplot ( 2, 3, 4) cria seis subdiagramas na figura corrente, e

i
0,6 / cosx
'' coloca como subdiagrama corrente o subdiagrama 4 (o mais baixo à esquerda).
'\

/
0,4 \ Se um comando subplot criar um novo conjunto de eixos em conflito com um
',
conjunto preexistente, os eixos mais antigos serão apagados automaticamente.
0,2
\ T
Os comandos exibidos a seguir criam dois subdiagramas em uma mesma janela e
exibem gráficos separados em cada subdiagrama. A figura resultante está apresentada

/
o na Figura 3.5.

-0,2
figure(l)
' subplot(2,1,1)
'' -pi:pi/20:pi;
-0,4 '' ' X=

'' y = sin(x);
-0,6 I
,'
'' plot (x,y);
title('Título do subdiagrama 1');
-0,8 subplot(2,1,2)
',
X= -pi:pÍ/20:pÍ;
-1 y = cos (x);
-4 -3 -2 o 2 3 4
plot (x,y);
title('Título do subdiagrama 2');
Figura 3.4 Diversas curvas desenhadas sobre um mesmo conjunto de eixos, com o uso do
comando hold.
3.5.5 Controle Avançado de Linhas Desenhadas
Título do subdiagrama 1
desenho. A figura é criada automaticamente caso ainda não exista. A figura corrente
pode também ser selecionada pelo mouse.
A função gc f retorna o número da figura corrente. Essa função pode ser usada em 0,5
um arquivo M caso informação seja necessária.
Os comandos a seguir ilustram o uso~a função figure. Eles criam duas figuras, o
exibindo ex na primeira e e-r na segunda.
figure (1)
X= 0:0.05:2;
yl = exp(x);
plot(x,yl);
figure(2)
y2 = exp (-x) ;
plot(x,y2); 0,5

3.5.4 Subdiagramas
É possível colocar mais de um conjunto de eixos em uma mesma figura, criando assim
~-
múltiplos subdiagramas. Os subdiagramas são criados pelo comando subplot, que
tem a forma ~'

subplot(m,n,p) ·--
1 ·Figura 3.5 Um desenho com múltiplos subdiagramas.

_.,.
--~.-
112 1 Programação em MATlA~ para Engenheiros Capítulo 3 Expressões de Ramificação e Projeto de Programa 1 113

----------------- -· ·--------------.
a.----.------.----.----.------,----~---~ 3.5.6 Controle Avançado de Cadeias de Texto
7 É possível melhorar as cadeias de texto nos desenhos (títulos, rótulos dos eixos etc.),
com formatações como negrito, itálico ou ambos, e também com caracteres especiais
como símbolos matemáticos e letras gregas.
6
A fonte utilizada para exibir o texto pode ser alterada por modificadores de cor-
rente. Um modificador de corrente é uma seqüência especial de caracteres que informa
5 ao interpretador MATLAB que ele deve modificar seu comportamento. Os modifi-
cadores de corrente mais comuns são:
4 • \bf - negrito
• \ i t - itálico
3
• \ rm - fonte normal.
• \ fon tname {nome da -ront~specifica o rrome--da fonte a ser utilizada.
• \fontsize{tamanho da fonte} -especificaotamanhodafonte.
2 • _ {xxx} - os caracteres dentro das chaves são em subscrito.
• A { xxx} - os caracteres dentro das chaves são em sobrescrito.

Urna vez inserido um modificador de corrente em uma cadeia de texto, ele permanece
ativo até o final da cadeia ou até ser cancelado. Se um modificador vier antes de chaves {},
somente o texto entre elas é afetado.
14 Símbolos matemáticos e letras gregas podem também fazer parte de cadeias de
texto. Eles são criados pela inserção de seqüências especiais na cadeia de texto. Essas
Figura 3.6 Um desenho que ilustra o uso das propriedades LineWidth e Marker (uma ver- seqüências são um subconjunto das seqüências especiais com suporte pela linguagem
são colorida desse desenho aparece no encarte). TEX. Uma amostra dos códigos possíveis está na Tabela 3.6 a seguir. O conjunto cpm-
pleto de possibilidades está incluído na documentação on-line do MATLAB.
Se um dos caracteres especiais \, {, }, _ ou, " precisar ser apresentado, ele deve ser
precedido por uma barra invertida.
No Capítulo 11 aprendemos como ajustar a cor1 o estilo e o tipo de marcador para uma Os exemplos a seguir ilustram o uso de modificadores de corrente e caracteres especiais.
linha. Também é possível ajustar quatro propriedades adicionais associadas a cada linha: Cadeia de caracteres Resultado
\tau_{ind} versus \omega_{\itm} 't'ind versus ffim
• LineWidth - especifica em pontos a espessura de cada linha.
• MarkerEdgeColor - especifica a cor do marcador ou da borda de marcadores
\theta varia de O\circ até 90\circ e varia de Oº até 90°
\bf{B}_{\itS} Bs
preenchidos.
• MarkerFaceColor - especifica a cor interna dos marcadores preenchidos.
• MarkerSi ze - especifica em pontos o tamanho do marcador. 3.5. 7 Diagramas Polares
Essas propriedades são especificadas no comando plot em seguida aos dados a ser O MATLAB tem uma função especial chamada polar, que desenha dados usando
desenhados: coordenadas polares. A forma básica dessa função é
plot(x,y, 'PropertyName' ,value, ... ) polar(theta,r)
Por exemplo, o comando a seguir desenha urna linha cheia preta com três pontos de onde theta é urna matriz de ângulos em radianos e ré uma matriz de distâncias. Isso
espessura e marcadores circulares de seis pontos de diâmetro para os dados. Cada é útil para desenhar--dados que são funções inLiínsecas de une ângulo.
marcador tem borda vermelha e interior verde, corno exibido na Figura 3.6 (veja tam-
bém o encarte colorido). •
X= 0:pi/15:4*pi; Exemplo 3.5 - Microfone Cardi6ide
y = exp(2*sin(x)); A maioria dos microfones para uso em palcos de teatro é direcional. São construídos
plot(x,y,'-ko', 'LineWidth' ,3.0, 'MarkerSize' ,6, ... especificamente para ampliar os sinais recebidos do cantor posicionado à frente do
'MarkerEdgeColor', 'r', 'MarkerFaceColor', 'g') microfone e suprimir o ruído da audiência que está atrás.
. ~. li.,
·~
tt· 114 1 Programação em MATIAP para Engenheiros Capllulo 3 Expressões de Ramificação e Projeto de Programa 1 115
1,
' 1

- - -···---·---·-----····· ···-------·- -----·----- -------------·--. --- ---


Tabela 3;6 Alguns·Sfmbolos··Matemâtitcfiftetras Gregas·· ·- ·- - · % Record of revisions:
% Da te Programmer· Description of change
Seqüência de Seqüência de Seqüência de
%
Caracteres Símbolo Caracteres Símbolo Caracteres Símbolo
% 12/10/98 S. J. Chapman Original cede
\alpha a \int f %
\beta p \cong = % Define variables:
% g Microphone gain constant
\garnma 'Y \Garnma r \sim % gain Gain as a function of angle
\delta 6 \Delta A \infty 00 % theta Angle from microphone axis (radians)
\epsilon e \pm ±
% Calculate gain versus angle
\eta 11 \leq s = 0.5;
\theta 8 \geq ~

\lamda À \Lamda A \neq . gain = 2*g*(l+cos(theta));


\mu µ \propto oc
% Plot gain
\nu V \div + polar (theta,gain,'r-');
\pi
\phi
,r

~
\Pi n \circ
\ leftrightarrow
o

H
1 title ( 1 \bfGain versus angle \theta');
O diagrama resultante está na Figura 3.7. Note que esse tipo de microfone é chamado
\rho \leftarrow t
de cardióide, pois seu ganho apresenta a forma de um coração.
p ~

\sigma (T \Sigma l: \rightarrow • i


!

\tau T \uparrow t
\omega llJ \Omega o \downarrow !
-..-
1' - • 3.6
Exemplo -- - - -Elétrica:
Engenharia - -Resposta
- -de- - -de-um-
Freqüência -de-
Filtro - -Baixa
Passagem
1....
!L Um filtro de passagem baixa simples* é apresentado na Figura 3.8. Esse circuito é com-
O ganho de um microfone desse tipo é função do ângulo segundo a equação ~ posto por um resistor e um capacitor ligados em série, e a razão entre a voltagem de
t;.
?'i; saída V0 e a voltagem de entrada V; é dada pela equação
Ganho = 2g{l + cos e) (3.3)
V0 = 1 {3.4}
em que g é uma constante diferente para cada microfone e 0 é o ângulo entre o eixo V; 1 + j2trfRC
do microfone e a fonte sonora. Assumindo que g seja 0,5 para um dado microfone, onde V; é uma voltagem de entrada em senóide com freqüência f, Ré a resistência em ohms,
desenhe um diagrama polar do ganho do microfone como função da direção da C é a capacitância em farads e j é '1/-1(os engenheiros eletricistas utilizam j em vez de i para
fonte sonora. ..[:f, pois a letra i é tradicionalmente reservada para a corrente em um circuito).
Assuma que a resistência R = 16 kn e a capacitância C = 1 µF, e desenhe a ampli-
Solução tude e a resposta de freqüência desse filtro.
.,.~,_-_
.. ·.
Precisamos calcular o ganho do microfone versus o ângulo e desenhar esse ganho uti-
...

Solução
lizando um diagrama polar. O código MATLAB para isso é:
% Script file: microphone.m l1 A resposta de amplitude de um filtro é a razão entre a amplitude da voltagem de saída
e a amplitude da voltagem de entrada, e a resposta de fase do filtro é a diferença entre
% a fase da voltagem de saída e a fase da voltagem de entrada. A forma mais simples de
~
•• .
% Purpose: ¼- calcular a amplitude e a resposta de fase do filtro é avaliar a Equação (3.4} para diversas
% This program plots the gain pattern of a cardioid
%
%
microphone.
•·
1
-
• NT: Esse tipo de filtro é comumente chamado de filtro passa-baixa pelos profissionais da área.
. - ·1111
; --'ij 1:1
-i:_ - J til 116 1 Programaçio em MATLAfJII para Engenheiros Capitula 3 Expressões de Ramificaçio e Projeto de Programa 1 117
t •.
'
Ganho versus Angulo ----------- -------------- · -- ---- ----- ----------- ----iiir-----=-es-=--c=-=aTla:-:s:,1.-,-in_e_a_r_e-=--s.'U'"'ti;-;.l,.-iz_a_r_e_m_o_s_u~ diagrama log log para a resposta de amplitude e um
90 2 diagrama semilogx para a resposta de fase do filtro. Vamos apresentar as duas res-
postas como dois subdiagramas de uma mesma figura.
O código MATLAB para criar e desenhar as respostas é apresentado a seguir.
% Script file: plot_filter.m
%
% Purpose:
% This program plots the amplitude and phase responses
% of a low-padd RC filter.
%
% Record of revisions:
% Date Programmer Description of chanqe
o =-========= ---=---============~=
% 12/29/98 S . J. Chapman Original code
%
% Define variables:
% amp Amplitude response
% e Capacitance (farads)
% f Frequency of input signal (Hz)
% phase Phase response
% R Resistance (ohms)
% res Vo/Vi

270 % Initialize R & e


R 16000; % 16 k ohms
C = l.0E-6; % 1 uF
Figura 3. 7 Ganho de um microfone cardióide.
% Create array of input frequencies
f = 1:2:1000;
R
% Calculate response
res = 1 ./ ( 1 + j*2*pi*f*R*C );
+
e
% Calculate amplitude response
amp = abs (res);

% Calculate phase response


phase = angle(res);
Figura 3.8 Um circuito simples para um filtro de passagem baixa.
% Create plots
subpl-aÉ-f:.1,---1--,.,.µ.__,__ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __
loglog( f, amp );
freqüências diferentes. O diagrama da magnitude da Equação (3.4) versus a freqüência title('Amplitude Response');
é a resposta de amplitude do filtro, e o diagrama do ângulo da Equação (3.4) versus a xlabel('Frequency (Hz) ');
freqüência é a resposta de fase do filtro. ylabel('Output/Input Ratio');
Como a freqüência e a resposta de amplitude de um filtro podem variar bastante, grid on;

1
é usual desenhar esses dois valores em escalas logarítmicas. Por outro lado, a fase varia
sobre uma faixa bastante limitada, assim, costuma-se desenhar a fase do filtro usando - subplot(2,l,2);
- --
-
-
11

, ; 1I'
118 j Programação em MATLA~ para Engenheiros Capítulo 3 Expressões de Ramificação e Projeto de Programa 1 119
t: ti.·•.!.
·:1
,1
-----···-

semilogx ( f:, phase ) ; Um gás ideal pode ser caracterizado por três quantidades: pressão absoluta (P),
title('Phase Response'); volume (V) e temperatura absoluta (T). A relação entre essas quantidades em um gás
xlabel('Frequency (Hz) '); ideal é conhecida como Lei dos Gases Ideais:
ylabel('Output-Input Phase (rad) ');
grid on; PV=nRT (3.5)

As respostas de amplitude e de fase resultantes estão na Figura 3.9. Note que esse cir- onde Pé a pressão do gás em kilopascais (kPa), V é o volume do gás em litros (L), n é o
cuito recebe o nome de filtro de passagem baixa, pois as freqüências baixas receberil número de moléculas do gás em unidades de mol (mol), R é a constante universal dos
pouca atenuação, enquanto as freqüências mais altas são fortemente atenuadas. gases (8,314 L*kPa/mol K) e T é a temperatura absoluta em kelvins (K). (Nota: 1 mo!=
6,02 x 1023 moléculas.)
• Considerando que uma amostra de um gás ideal contém um mol de moléculas à
temperatura de 273 K, responda às questões,seguintes.
a. Como varia o volume desse gás à medida que a pressão varia de um para
l.000kPa? Desenhe a pressão versus o volume para esse gás, utilizando um con-
Amplitude response
junto apropriado de eixos. Utilize uma linha cheia vermelha com espessura de
dois pixeis.
- r-... b. Suponha que a temperatura do gás aumente para 373K. Nesse caso, como varia
r-. o volume do gás com a pressão? Desenhe a pressão versus o volume para esse
gás, utilizando os mesmos eixos da parte (a). Utilize uma linha tracejada azul
~

~ com espessura de dois pixeis.


"-
~"""" Inclua um título em negrito e legendas para os eixos x e y do diagrama, bem como
101 102 103 legendas para cada linha.
Frequency {Hz)

!
--- Phase response Solução
'â. o
'S Os valores que queremos desenhar variam por um fator 1.000. Um diagrama linear
'1----
r-o.s
'S . "' ordinário desses não é adequado, desenharemos os dados em uma escala loglog .
g. Note que precisamos desenhar duas curvas sobre o mesmo conjunto de eixos.
::, ~
O -1 Precisamos utilizar o comando hold on depois do desenho do primeiro diagrama, e
............... 1---

-1.5
hold off depois de completar o desenho. Precisamos também especificar a cor, o estilo
e a espessura de cada linha, e especificar que os rótulos precisam estar em negrito.
-2 Um programa que calcula o volume do gás corno função da pressão e cria o dia-
100 101 102 103 grama apropriado é apresentado a seguir. Note que os recursos especiais que controlam
Frequency (Hz) o estilo do desenho estão apresentados em negrito.

Figura 3.9 Respostas de amplitude e de fase do circuito de filtro de passagem baixa. % Script file: ideal_gas.m
%
! % Purpose:
% This program plots the pressure versus volume of an
% ideal gas.
• %
% Record of revisions:
Exemplo 3.7 -Termodinâmica: Lei dos Gases Ideais Description of change
i % Date Programmer
,11 Em um gás ideal, todas as colisões entre moléculas são perfeitamente elásticas. Podemos %
1,,
j! considerar as moléculas de um gás ideal como bolas de bilhar perfeitamente rígidas que % 07/17/00 S . J . Chapman Original code
':i colidem e ricocheteiam sem perda de energia cinética. %
li
-;,. Ili
120 1 Programaçlo Bm MATLAfJIJ para Engenheiros

%- oefinEf ·variãbles :
- "
-
..
Capitulo 3 Expressões de P.amificaçlo e Projeto dB Programa 1

·-·--···-
Volwne va P.-u19 ln an Ideal Gu
··-·· ··-·-·· ·---······ -·--
121

%
%
n
P
Number of atoms (mol)
Pressure (kPa)
10'
.- R

ideal gas constant (L kPa/rnol K)


% R ....
~
% T Ternperature (K) ,.. ...
101 - ~
% V

% Initialize nRT
volume (L)
1 -
m
...-.J
lliii1•....
n l; % Moles of atorns 2
R 8.314; % Ideal gas constant ~ ......
T 273; % Ternperature (K)

··-
----
i 11)1

...._
% Create array of input pressures. Note that this
% array rnust be quite dense to catch the major 101 ~ ......
% changes in volume at low pressures. ri'.
P = 1:0.1:1000; ~ ~ .
% Calculate volumes
V = (n * R * T) •/ P; '
•1• 100
100
! 11
101
Pl888Uf9 (kPa)
1()2 101

% Create first plot


figure(l);
loglog( P, V, 'r-', 'LineWidth', 2 );
1
-··,_. Figura 3.10 Pressão versus volume para um gás ideal.
title('\bfVolume vs pressure in an Ideal Gas');
xlabel('\bfPressure (kPa) ');
ylabel('\bfVolume (L)');
!!
grid on;
hold on;
fG.
~ 3.5.8 Anotando e Armazenando Diagramas
t
% Now increase ternperature -r· Tendo criado um diagrama pelo programa MATLAB, um usuário pode editar e anotar
j,;;.
T = 373; % Ternperature (K) _;f o diagrama utilizando as ferramentas disponíveis na GUI da barra de ferramentas para
..w'
diagramas. Na Figura 3.11 temos as ferramentas disponíveis, que permitem adicionar
% Calculate volumes ¾-·
y linhas, flechas e textos. Quando o botão de Edição ( 1 }é selecionado na barra de ferra-
V= (n * R * T) ./ P;
1,.... mentas, as ferramentas de anotação e edição ficam disponíveis para uso.
Adicionalmente, quando o botão de Edição está liberado, a seleção de qualquer

1.
% Add second line to plot linha ou texto na figura seleciona esse objeto para edição. Ao clicar duas vezes na linha
figure(l);
ou no texto, surge uma janela de propriedades que permite a modificação de qualquer
loglog( P, V, 'b--', 'LineWidth', 2 );
uma ou-de-todas-as cmactexísticas do objeto. A Figura 3.12 apresenta a Figura 3.lUapós
hold off;
a edição que modifica a linha azul para uma linha tracejada com espessura de três pixeis
% Add legend
e adiciona uma flecha e um comentário.
· . ir:
legend( 'T = 273 K', = 373 Após a edição e a anotação do desenho, você pode guardar o diagrama em um
'T k'); lit--
O diagrama resultante de volume versus pressão está na Figura 3.10.

•• arquivo de forma modificável utilizando o item de menu "File/Save As" da Janela de
Figuras. O arquivo de figura resultante(*. fig) contém todas as informações necessá-
rias para recriar a figura e as anotações a qualquer momento no futuro.

1i:;
122 1 Programaçlo em MATLA/1' para EngenhBiros Capitulo 3 Expressats de Ramificaçlo e Projeto de Programa 1 123

104

1
!
1
2
1 1 1()2

~
!

1 1
101

1()0L_ _L____J__l_J_LLL.ll_ _ j_ _L_..L...JL.LLLl-:::--------'-'\-'-_.,_-'-'-'-~1""


100 1~ ~
Pressuia (kPa)
Note:~ =30 L at 100 kPa.

Figura 3.12 A Figura 3.10 após a modificação da linha azul e a inserção de uma an~ção uti-
Figura 3.11 As ferramentas de edição na barra de ferramentas de Figuras. lizando as ferramentas de edição presentes na barra de ferramentas de Figuras.

Teste 3.3 Escreva as expressões resultantes das seguintes cadeias de texto:


5. '\tau\it_{m}'
Este teste apresenta uma verificação rápida do seu entendimento dos conceitos apre-
6. '\bf\itx_{l} " { 2} + x_{2}"{ 2} \rm(units:
sentados na Seção 3.5. Se você tiver problemas com o teste, releia as seções, pergunte ao
\bfm" { 2} \rm) '
seu professor ou discuta o material com um colega. As respostas podem ser encontradas
no final do livro. 7. Como você exibe o caractere de barra invertida(\) em uma cadeia de texto?

1. Escreva as declarações MATLAB para desenhar o sin x versus cos 2x de O a 21t


em intervalos de 1t/l0. Os pontos devem ser conectados por uma linha vermelha
com espessura de dois pixeis, e cada ponto deve ser identificado com um mar-
cador circular azul com seis pixeis de diâmetro. 3.6 Notas Adicionais a Respeito da Depuração de Programas MATLAB
2. Utilize as ferramentas de edição de Figuras para modificar para quadrados pre-
É muito mais fácil cometer erros na preparação de um programa que contém ramifi-
tos os marcadores do desenho anterior. Acrescente uma flecha e uma anotação
indicando o ponto x = 1t no diagrama. cações e laços que na preparação de programas seqüenciais. Mesmo passando por todo
o processo de projeto, um programa de qualquer tamanho quase certamente conterá
Escreva a cadeia de texto do MATLAB que produz as seguintes expressões:
erros quando for utilizado pela primeira vez. Suponha que tenhamos construído o pro-
3. f(x) = sin 0 CDS 2cp grama e descoberto, durante os testes, que os resultados contêm erros. Como podemos
4. Plot of l:x2 versus x encontrar e corrigir os bugs?
l 124 Programação em MATLAEJIP para Engenheiros Capítulo 3 Expressões de Ramificação e Projeto de Programa 1 125

1 Prompt the w,er for the coefficJ.ents of tbe equetion 1 Prornpt tbe wi:er for the coefficients of tbe equatiOn
di.a:p ( 'ThJ.a prcgrUll •olve• for the root• of • quadratic disp ( 'Th.is program so.lves for the roots of • quadrati.C
diap ( 'equau.on of the forn A*X"2 + s•:r: + e= O. '); di.sp ( 'equ•tion of the for• A•X"'2 + s•x + C = O. '1;
• • .1.Aput ('Enter tM coeff.1.ci.ent A: '); • • input ( '!nter the coeff1ci@nt A: ');
b = input ( '!nter tbe coefU.ci.ent J: '); b = 1.bput ( '!nter the coeffic.ient 8: '>;
e • 111.pvt ('Inter the coefficient e: '); e= i.nput ('?nt@r the coefficient C: ');

t Ca.lculate cilscr .iminant 1 Calculo.te di.:lcrllti.no.nt

t Solve for tN!!: roots, dependíng on tbe: valu.e of the di.scr1lnínant 1 solvi! for the roots, depend.J.ng on the value of the di.scri.111.i.nant
if ducriJUJMmt > O t tbere are t-...:. real roots, so ... if discria.inaat > O I there are two rea.1 roots, so. , .

d = 1 -b + eqrt (di.8criai.nant) } / ( 2 • a ) ; x1 = ( --b + •qrt (ducriai..J1u.tl ) / ( 2 • • l J


,:2 • ( -b - sqrt (di.acrin.i..nant) 1 / ( 2 • • >; x2 • ( -b - • qrt Idi.acr ia1.n.&nt 1 ) / ( 2 • • •;
dap ( 'Thís equat1.0n bm, two real roo ta: '> J di•p ( 'Thi.s equetion has two real roots! '1 i
fpri.ntf ( 'xl = tf\n', xl); f rintf 'xl =
fpri.D.tt' 1'xl = U\n', x2); fprJ.ntf ('x2 = lf\n'1 x2);

elseif diacri.a1.Aaat = O 1 there iS one repeated root, .so •.. elseíf díscrilldJ:Mul.t = O 1. there is one repee.ted root1 so ...

x l = ( - b ) / ( 2 * • ); xl = ( -b 1 / ( 2 • • ) ;
diap ( 'Th1.s equation he.s two i.dentic.al rul roo ta: •) ; disp ( • Thi.a 11:quation hu two ide.nti.Cal real roo te: ') ;
1prJ.D.tf ( 'xl = xl = lf\n', xl); fprintf ('xl = x2 = lf\n', d);

e.L!u! t tbere are eomplex roote, 80 ••• e.lse I there ere complf!:x roots, ao ...

rea.l_part • ( -b) / ( 2 • • J; re-.l_put • ( -b l / ( 2 • • l;


Jaiaq_part • aqrt ( ah• { di.scrilú.nant ) J / ( 2 • • ) ; J:aag_part • sqrt ( abs ( diacrilUA&D.t l ) / ( 2 • a ) ;
dUp t I Thu equation hel!il complex roo ta: •) ; dup ( • This equation ha.s c0111plex roots: '};
fpr.i.ntf('x1 = tf +.1 lf\n',. real_put, J:aaq_part ); fprintf{'xl = tf +i lf\n', real_part, J.-.q_pect J;
fprintf('xl = lf -1. lf\n•~ n•l_part~ iaag'_part ); fpt:intf('xl = tf -1 U\n',. re.l_part# .i..&g_p«rt )J

Figura 3.13 Uma janela de Edição/Depuração com um programa MATLAB carregado. Figura 3.14 A janela após a criação de um ponto de interrupção. Note o ponto vermelho à
esquerda da linha que contém o ponto de interrupção.

Quando começamos a utilizar laços e ramificações, a melhor maneira de localizar


um erro é pelo depurador simbólico do próprio MATLAB. Esse depurador é integrado Depois de criado o ponto de interrupção, execute o programa da maneira usual,
ao editor MATLAB. digitando calc_roots na Janela de Comandos. O programa irá executar até atingir o
Para utilizar o depurador, primeiro abra o arquivo a ser depurado, utilizando a primeiro ponto de interrupção e parar nele. Uma flecha verde aparecerá sobre a linha
seleção de menu "File/Open" da Janela de Comandos MATLAB. Quando o arquivo é corrente durante o processo de depuração, conforme exibido na Figura 3.15. Assim que
aberto, ele é colocado no editor e a sintaxe é automaticamente codificada com cores. o ponto de interrupção for atingido, o programador poderá examinar e/ ou modificar
Comentários aparecem em verde, variáveis e números aparecem em preto, cadeias de qualquer variável no espaço de trabalho, digitando o nome da variável na Janela de
caracteres aparecem em vermelho e palavras reservadas da linguagem aparecem em Comandos. Quando o programador estiver satisfeito com o programa naquele ponto,
azul. A Figura 3.13 exibe um exemplo de Janela de Edição/Depuração com o arquivo poderá seguir em frente linha por linha utilizando a tecla FlO, ou seguir até o eróximo
calc_roots .m. ponto-de-interrupçao utfüzando a tecla FS. Ê sempre possível examinar os valores de
Digamos que nosso interesse seja determinar o que acontece quando o programa qualquer variável em qualquer ponto do programa.
é executado. Para isso, podemos criar um ou mais pontos de interrupção, clicando Outra característica muito importante do depurador está no menu de Pontos de
com o botão direito do mouse e nas linhas de interesse e escolhendo a opção Interrupção ("Breakpoints"). Esse menu tem dois itens: "Stop if Error" e "Stop if
"Set/Clear Breakpoint". Quando um ponto de interrupção é criado, um ponto ver- Warning". Se ocorrer em um programa um erro que provoque a sua interrupção ou gere
melho aparece à esquerda da linha que contém o ponto de interrupção, conforme mensagens de erro, o programador poderá ativar esses itens e executar o programa. O
exibido na Figura 3.14. programa irá executar até o ponto do erro ou da mensagem de aviso e parar, permitindo

I
126 1 Programação em MATlAB® para Engenheiros
1 -

-,~---
Capítulo 3 Expressões de Ramificação e Projeto de Programa 1 127

! ~
podémser-áninhadas para p:roduzir testes mais complexos. lJm segundo tipo de rami-
ficação é a construção swi tch. Ela pode ser usada para selecionar alternativas mu-
tuamente exclusivas especificadas por uma expressão de controle. Um terceiro tipo de
1 froapt the ver for the coefficie:nta of the equ.ation
di.ap ( 'Thu progr• aolve• for the roots of a quadrat1.e '); ramificação é a construção try / ca tch, usada para capturar erros que possam ocorrer
d1ap ('equati.oo. of tbe fona A*X-'2 + B*X +e= O. ');
a• 1.Dput ('Inter tbe coeffJ.cJ.ent A: '};
durante a execução.
b = J.Aput ('lntu tbe coe:ffJ..cient B1 ')1
e • 1Dput ( 'Inter the coe:ff1.c1.ent C: ');
Neste capítulo, tivemos também informações adicionais sobre diagramas. Oco-
mando axis permite que o programador selecione intervalos de dados x e y para
1 ôtlcule.te: d.Lser .JJll.inant
desenhar. O comando hold permite que desenhos posteriores sejam colocados sobre os
1 5olve for the roots, dependíng on the va.lue of the ducr.1minan.t
anteriores de tal forma que os elementos possam ser adicionados a um gráfico paulati-
1.f di.acrJJu.nent > O I there are two real root3, so ... namente. O comando figure permite que o programador crie e selecione múltiplas
x1 • ( -b + eqrt (diacriainant) ) / ( 2 • • } ; Janelas de Figuras, para que um programa possa criar diagramas múltiplos em janelas
x2 • ( -b - •qrt (dJ.scrJai.nant) ) / ( 2 • a ) ;
dup { 'Thà equation baa two real roots: •) J separadas. O comando subplot permite que o programador crie e selecione múltiplos
fprUtf f 'xl = tf\n', xl);
fpr.Utf C ';iü: = lf\n •, xl} 1 enbos em uma 1ínica Janela de Eigmas
elseif diacriainant =- O i tru!re ie o~ repeated root, so ...
Aprendemos também a controlar características adicionais de nossos desenhos,
como espessuras de linha e cores dos marcadores. Essas propriedades podem ser con-
xl=(-b)/(2*a);
dJ.ap { 'Thi.e e.quatJ.on haa two .identi.eal real roota: '); troladas com pares 'PropertyName' , valor no comando de desenho após produzir
fpri.Dtf { 'xl = x2 = U\n', xlJ;
um diagrama com dados.
else I there are comp.Lex roote, so ... Cadeias de texto em diagramas podem ser melhoradas por modificadores de cor-
rea.1._pert • t -b ) / ( 2 • • ) ; rente e seqüências de caracteres. Modificadores de corrente permitem que um progra-
iailig'_put • • qrt ( ab • ( duer.lai.n.ant ) ) / ( 2 • a ) ;
d1ap ( 'Thi.s e~tion hu COffiple:x roots: '); mador especifique propriedades como negrito, itálico, sobrescrito, subscrito, tamanho e
fpr.int-f('xl = \f +i. lf\n', reai_pert, i.Mag_,PU"t )J
fpr.iatf('xl := lf -i. tf\n', reaJ._part, J:aag_part ); tipo de fonte. Seqüências de caracteres permitem que o programador inclua caracteres
especiais como símbolos matemáticos e letras gregas na cadeia de texto.
O depurador simbólico do MATLAB facilita muito a depuração de código no MATLAB.
Você deve investir um pouco de tempo para se familiarizar com essa ferramenta.
Figura 3.15 Uma flecha amarela aparecerá sobre a linha corrente durante o processo de
depuração.
3.7.1 Resumo de Boas Práticas de Programação
As próximas orientações devem ser seguidas em programações que contenham cons-
truções de ramificação e de laços. Seguindo-as consistentemente, seu código deverá
ao programador examinar os valores das variáveis e verificar com exatidão o que está conter menos bugs, ficar mais fácil de depurar e se tornar mais fácil de entender para
causando o problema. terceiros que precisarem trabalhar com ele no futuro.
Quando um bug é encontrado, o programador pode utilizar o Editor para corrigir 1. Seja cuidadoso nos testes de igualdade com valores numéricos, pois os erros de
o programa MATLAB e armazenar a versão modificada no disco. Note que todos os arredondamento podem levar duas variáveis que deveriam ser iguais a falhar
pontos de interrupção podem ser perdidos quando o programa é armazenado no disco, no teste de igualdade. Em vez disso, teste se as variáveis são quase iguais, con-
por isso eles precisam ser criados novamente antes que a depuração continue. Esse siderando um erro de arredondamento esperado para o computador que você
processo se repete até o programa ficar (ao menos aparentemente) livre de bugs. utilizar.
Ocupe um pouco de tempo agora para se familiarizar com o depurador - esse é 2. Siga os passos do processo de projetar programas para construir programas
um investimento que vale muito a pena. MATLAB confiáveis e fáceis de entender.
3. ~rni:,re use tabulação nos blocos de código das constmções i f e swi tch, para
que eles se tomem mais legíveis.
3.7 Resumo
No Capítulo 3, apresentamos os tipos básicos de ramificações no MATLAB e as opera- 3. 7 .2 Resumo do MATLAB
ções relacionais e lógicas utilizadas para controlá-los. O tipo principal de ramificação é
a construção if. Essa construção é muito flexível. Ela pode ter tantas cláusulas elseif O resumo a seguir lista todos os comandos e funções do MATLAB apresentados neste
quanto necessário para construir qualquer teste desejado. Além disso, as construções i f capítulo, junto com uma breve descrição de cada item.

·';..
128 1 Programação em MATlAEJ3 para Engenheiros
1
IIS
Capítulo 3 Expressões de Ramificação e Projeto de Programa 1 129

Comandos e Funções
f
·t 3.2 As declarações a seguir devem alertar um usuário sobre leituras de um ter-
):: môrnetro perigosamente altas (os valores estão expressos em graus
axis

figure
(a) Ajusta os limites em x e y para os dados desenhados.
(b)Captura os limites em x e y dos dados desenhados.
(e) Ajusta outras propriedades dos eixos.
Seleciona uma Janela de Figuras para ser a Janela de
/ · I·1 Fahrenheit). Elas estão corretas ou incorretas? Se estiverem incorretas,
explique o erro e as corrija.
if temp < 97. 5
·· i disp ('Temperatura mui to baixa') ;
Figuras corrente. Se a Janela de Figuras selecionada não
existir, ela será automaticamente criada. lJ["f elseif temp > 97.5
disp ( 'Temperatura normal');
hold Permite que comandos múltiplos de desenho escrevam
uns sobre os outros.
1T elseif temp > 99.5
"f' disp('Temperatura ligeiramente alta');
i f construct Seleciona um bloco de declarações para executar se uma i~
r=- elseif temp > 103.0
condição especificada for satisfeita. ------,1_,i,..···-------e-n__._,~w.i..,as,;.p-"'(1-'-T._,ec:.m.upe.r-a.tu=i---p€l;i;i.g~.--a.l-t;.a.,_,+--<.---------
ischar(a) Devolve 1 se a for uma matriz de caracteres, e O, caso
contrário.
!,-.:.._,. 3.3 O ~l sto$d3e 7e5nviar umdpacot~ por _c1orreiofrexrress? é dde $ 10,00 pilaraSeo primeiro
isempty(a) Devolve 1 se a for uma matriz vazia, e O, caso contrário. '" qm o e , para ca a meio qm o ou açao acima e um qu o. o pacote
isinf (a) Devolve 1 se o valor de a for infinito (Inf), e O, caso !J pesar mais que 35 quilos, uma taxa de peso adicional de $ 10,00 é adicionada
contrário. 11' ao custo. Nenhum pacote com mais de 50 quilos é aceito. Escreva um progra-
i'.'i'
.: i..·. ma que aceite o peso de um pacote em quilos e calcule o custo de enviar o
isnan(a) Devolve 1 se o valor de a for NaN (não um número), e O,
caso contrário.
1
t pacote. Inclua o caso dos pacotes acima do peso.
isnumeric(a)
polar
Devolve 1 se a for uma matriz numérica, e O, caso contrário.
Cria um diagrama polar.
if
.:;::
3.4 No Exemplo 3.3, escrevemos um programa para avaliar a função f(x,y) para
quaisquer dois valores especificados pelo usuário para x e y, com a função
subplot Seleciona um subdiagrama na Janela de Figuras corrente. ;f f(x,y) definida como segue. ·
Se o subdiagrama selecionado não existir, ele é auto- 1 x+y x:?:0ey:?:0
maticamente criado. Se o novo subdiagrama entrar em ! X = x+y2 x:2'.0ey<0
j( ,y) { x2 + y x<0ey:?:0
conflito com um sistema de eixos previamente exis-
tente, eles são apagados automaticamente. x2 + y2 x<0ey<0
swi tch construct Seleciona um bloco de declarações para executar, a partir O problema foi resolvido com uma única construção i f de quatro blocos de
de um conjunto de opções mutuamente exclusivas e código para calcular f (x,y) para todas as combinações possíveis de x e y. Rees-
com base nos resultados de uma expressão única. creva o programa f unxy utilizando construções i f aninhadas, de maneira
try / ca::ch construct Uma construção especial utilizada para capturar erros. Ela que a construção mais externa avalie o valor de x e a mais interna avalie o
executa o código no bloco try. Se ocorrer um erro, a valor de y.
execução é imediatamente interrompida e transferida 3.5 Escreva um programa MATLAB para avaliar a função
para o código na construção ca tch.
1
y(x)= ln l -x

3.8 Exercícios para qualquer valor de x especificado pelo usuário, sendo x um número < 1
(observe que ln é o logaritmo natural, ou seja, o logaritmo na base e). Utilize
3.1 A função tangente é definida como tan 0 = sin 0 / cos 0. Essa expressão uma estrutura i f para verificar se o valor passado para o programa é legal.
pode ser avaliada para obter a tangente se a magnitude de cos 0 não se Se o valor de x for legal, calcule y(x). Caso contrário, escreva uma mensagem
aproximar demais de O. {Se o cos 0 for O, a avaliação da equação para tan 0 de erro apropriada e encerre o programa.
produzirá o valor não numérico Inf.) Assuma que 0 seja dado em graus e 3.6 Escreva um programa que permita que um usuário forneça urna cadeia de
escreva as declarações MATLAB para avaliar a tan 0, desde que a magnitude caracteres que contenha um dia da semana ("segunda-feira", "terça-feira" etc.) e
de cos 0 seja maior que ou igual a 10-20 • Se a magnitude de cos 0 for menor utilize uma construção swi tch para converter o dia em um número corres-
que 10-20, escreva uma mensagem de erro. pondente, de maneira que o domingo seja considerado o primeiro dia da semana
130 1 Programação em MATWJII para Engenheiros
1 Capítulo 3 Expressões de Ramificação e Projeto de Programa 1 131

-------··-·--····--- .. - ...
e o sábado seja considerado o último dia da semana. Imprima o número de
dia resultante. Lembre-se de considerar o caso de um nome ilegal de dia da
semana! (Nota: não se esqueça de utilizar a opção ' s ' na função input para
que os dados de entrada sejam considerados cadeias de caracteres.) Região 1 Índice de refração n1
3. 7 Lei dos Gases Ideais. A Lei dos Gases Ideais foi definida no Exemplo 3.7.
Assuma que o volume de 1 mol desse gás seja 10 L e desenhe a pressão do gás
como função da temperatura quando a temperatura varia de 250 a 400 kelvins.
Que tipo de desenho (line~ semilogx etc.) é o mais apropriado para esses dados?
3.8 Padrão de Ganho de Antena. O ganho G de uma certa antena de microondas
li
li pode ser expresso como função do ângulo pela equação
Jt Jt
G(9 ) = 1sinc 49 1 for---'- S9 S - . -(3:6)
2 2
!I onde 9 é medido em radianos a partir das bordas da antena e sinc x = sin xi x.
Desenhe essa função de ganho em um diagrama polar, com o título "Ganho
da Antena versus 9 " em negrito.
3.9 Refração. Quando um raio de luz passa de uma região com índice de refração Região 1 Índice de refração n1
n1 para uma região com índice de refração diferente ni, ele é desviado (ver
Figura 3.16). O ângulo de desvio é dado pela lei de Snell.
n 1 sin 9 1 - n2 sin 82 (3.7)
onde 9 1 é o ângulo de incidência da luz na primeira região e e 2 é o ângulo de
incidência da luz na segunda região. Utilizando a lei de Snell, é possível pre-
ver o ângulo de incidência de um raio de luz na Região 2 se o ângulo de
incidência 9 1 na Região 1 e os índices de refração n1 e n2 forem conhecidos. A
equação para efetuar esses cálculos é (b)

Agura 3.16 Um raio de luz é desviado quando passa de um meio para outro. (a) Se o raio de luz
02 = sin-1 ( :: sin 01 ) (3.8)
passa de uma região com índice de refração mais baixo para uma região com índice
de refração mais alto, o raio de luz se desvia para a vertical. (b) Se o raio de luz passa
Escreva um programa para calcular o ângulo de incidência (em graus) de um
de uma região com índice de refração alto para uma região com índice de refração
raio de luz na Região 2, dados o ângulo de incidência e1 na Região 1 e os
ii"·
mais baixo, o raio de luz se desvia para a horizontal.
índices de refração n 1 e n2• (Nota: se n1 > n 21 então, para alguns ângulos 01, a
Equação 3.8 não terá soluções reais, pois o valor absoluto da quantidade [~~,
( :: sin e 1) será maior que 1.0. Quando isso ocorrer, toda a luz será refletida i1. :

de volta para a Região 1 e nenhuma luz passará para a Região 2. Seu pro-
grama deve ser capaz de reconhecer e tratar apropriadamente essa condição.)
O programa deve também criar um diagrama que mostre o raio incidente, a
fronteira entre as duas regiões e o raio refratado do outro lado da fronteira.
Teste seu programa com os dois seguintes casos: (a) n1 = 1,0, n2 = 1,7 e e1 =
.T•.
l• .

.
-

f.
'
1•.·.:·•··
3.11 Filtro de Passagem Alta. Na Figura 3.17, temos um filtro simples de passa-
-_gem alta, composto por um resistor e um capacitor. A razão entre a yolt~gem
de saída V0 e a voltagem de entrada Ví é dada pela equação

j21rfRC
45°; (b) n 1 = 1,7, n2 = 1,0 e 0 1 = 45°.
3.10 Assuma que a função complexa/(t) seja definida pela equação •-•• -
1 + j21rfRC
(3.4)


f (t) = (0,5 - 0,25i)t - 1,0 Assuma que R = 16 kn e C = 1 µF. Calcule e desenhe as respostas de ampli-
Desenhe a amplitude e a fase para a função f com O S t S 4. tude e de fase desse filtro como função da freqüência .
. . 1·.·.·.··.···
132 1 Programação em MATIAEP para Engenheiros Clpftulo 3 Exprsssões de P.amlficaçlo e Projeto de Programa 1 133

onde r e 9 são a distância e o ângulo do satélite medidos a partir do centro da


R Terra, p é um parâmetro que especifica o tamanho da órbita e e é um parâ-
metro que representa a excentricidade da órbita. Uma órbita circular tem
excentricidade e igual a O. Uma órbita elíptica tem excentricidade OS e S 1.
V, e
Se E > 1, o satélite segue uma trajetória hiperbólica e escapa do campo gra-
vitacional da Terra.
Considere um satélite com parâmetro de tamanho p - 1.000 km. Desenhe
a órbita desse satélite se (a) e = O; (b) e = 0,25; (e) e = 0,5. Quão próximo cada
uma dessas órbitas chega da Terra? Compare os três desenhos que você crfou.
Você é capaz de determinar qual o significado do parâmetro p, observando
Figura 3.17 Um circuito de filtro de passagem alta simples.
esses desenhos?

3.12 A Espiral de Arquimedes. A espiral de Arquimedes é uma curva descrita em


coordenadas polares pela equação
r = k(J (3.10)
onde r é a distância de um ponto à origem e (J é o ângulo desse ponto em
radianos com relação à origem. Desenhe a espiral de Arquimedes para O= S
(J S 61t, com k = 0,5. Coloque legendas apropriadas no desenho.

3.13 Potência de Saída de um Motor. A potência de saída produzida por um


motor rotativo é dada pela equação
(3.11)
onde 'tINo é o torque induzido no eixo, em Newton-metros, IDm é a velocidade
rotacional do eixo, em radianos por segundo, e P é dado em watts. Assuma
que a velocidade rotacional de um eixo de motor em particular seja dada pela
equação
com = 188,5(1 - e-0,2~) rad/ s
e o torque induzido no eixo seja dado por
'tINo = l0e-0,h N · m
Desenhe o torque, a velocidade e a potência fornecida versus o tempo para
OS t S tos. Coloque as legendas apropriadas com os símbolos 'tINo e com. Crie
dois desenhos, um com a potência em escala linear e outro com a potência
de saída em escala logarítmica. O tempo deve ser apresentado sempre em
escala linear.
3.14 Desenho de Órbitas. Quando um satélite gira em torno da Terra, a órbita
do satélite forma uma elipse com a Terra em um dos pontos focais. A órbita do
satélite pode ser expressa, em coordenadas polares, como

r = _....:P'---- (3.12)
1- ecos 8
Capítulo 4

Laços

Laços são construções MATLAB que nos permitem executar uma seqüência de decla-
rações mais de uma vez. Existem duas formas básicas de construção de laços: laços
while e laços for. A principal diferença entre esses dois tipos de laço é como a repe-
tição é controlada. O código em um laço while é repetido uma quantidade indefinida
de vezes até que alguma condição especificada pelo usuário seja satisfeita. Em con-
traste, o código em um laço for é repetido uma quantidade determinada de vezes, e o
número de repetições é conhecido antes do inicio do laço.

4.1 O Laço while


Um laço while é um bloco de declarações que se repete indefinidamente, enquanto
uma condição for satisfeita. A forma geral de um laço while é

while expressão

} Bioro de OOdigo

end

Se a expressão for diferente de zero (verdadeira), o bloco de código será executado e


o controle retomará para a declaração while. Se a expressão ainda for diferente de
zero (verdadeira), as declarações serão executadas novamente. Esse processo se repe-
tirá até que a expressão se tome zero (falsa}. Quando o controle retomar para a decla-
ração while e a expressão for zero, o programa executará a primeira declaração
depois de end.
136 1 Programação sm MATlAfP para En{JBnhB/ros C8pltulo 4 Laços 1 137

O pseudocódigo correspondente a um laço while é Solução


while expr Esse programa precisa ser capaz de ler um número arbitrário de medidas, e então cal-
cular a média e o desvio-padrão dessas medidas. Vamos utilizar um laço while para
acumular as medidas de entrada antes de efetuar os cálculos.
Depois que todas as medidas forem lidas, precisaremos de alguma maneira infor-
end mar o programa que não há mais dados a serem fornecidos. Por enquanto, vamos
assumir que todas as medidas de entrada são positivas ou zero, e utilizar um valor
Vamos agora mostrar um exemplo de programa para análise estatística imple- negativo como indicador de que não há mais dados a serem fornecidos. Se um valor nega-
mentado COfll um laço while. tivo for fornecido, o programa interromperá a leitura dos valores de entrada e calcu-
lará a média e o desvio-padrão do conjunto de dados.
• _ 1. Estabeleça o problema
Exemplo 4.1 -Análise Estatística Como vamos assumir que os números de entrada precisam ser positivos ou
zero, uma apresentação apropriada do problema seria: calcule a média e o desvio-
É muito comum, em ciência e engenharia, trabalharmos com grandes conjuntos de padrão de um conjunto de medidas, assumindo que todas as medidas são positivas· ou
números, os quais são medidas de alguma propriedade em particular na qual estamos zero e que não sabemos quantas medidas estão incluídas no conjunto de dados. Um
interessados. Um exemplo simples seriam as notas da primeira prova deste curso. Cada valor negativo indica o final do conjunto de medidas.
nota seria uma medida de quanto um estudante em particular aprendeu no curso até o
momento. 2. Defina os dados de entrada e de saída
Na maior parte do tempo, não estamos interessados em observar tão de perto cada ·"i.~ Os dados de entrada requeridos por esse programa são um número desconhe-
uma das medidas efetuadas. Em vez disso, queremos sumarizar os resultados de um cido de números positivos ou iguais a zero. Os dados de saída desse programa
conjunto de medidas por meio de uns poucos números que nos indiquem bastante a são a média e o desvio-padrão do conjunto de dados de entrada. Adicio-
.;;;
respeito do conjunto de dados como um todo. Dois desses números são a média (ou nalmente, exibiremos o número de pontos fornecidos ao programa, uma vez
média aritmética) e o desvio-padrão de um conjunto de medidas. A média aritmética de um que essa é uma verificação útil da correção dos dados de entrada.
conjunto de números é definida como 3. Projete o algoritmo
Esse programa pode ser subdividido em três passos principais.
1 N
x=-Ix; (4.1) Acumule os dados de entrada
N i=I Calcule a média e o desvio-padrão
onde X; é a amostra i de N amostras. Se todos os valores de entrada forem apresentados Escreva a média, o desvio-padrão e o número de pontos
em uma matriz, a média de um conjunto de números poderá ser calculada diretamente O primeiro passo do programa é acumular os dados de entrada. Para isso,
a partir da Equação (4.1) ou pela função mean predefinida no MATLAB. temos de solicitar ao usuário os números. Quando os números forem forne-
O desvio-padrão de um conjunto de números é definido como cidos, precisaremos registrar o número de valores fornecidos, a soma e a soma
dos quadrados desses valores. O pseudocódigo para esses passos é:
2 Inicie n, sum_x e sum_x2 com valor O
N ~
N
xr- ( N
~ X;
) (4.2) Solicite ao usuário o primeiro número
s= Leia o primeiro x
N(N-1)
while x >= O
n ~ n _+ 1 ________________________
O desvio-padrão é uma medida do espalhamento das medidas; quanto maior o desvio-
padrão, mais espalhados serão os pontos no conjunto de dados. Se todos os valores de sum_x f- sum_x + x
entrada estiverem disporúveis em uma matriz, o desvio-padrão de um conjunto de números sum_x2 f- sum_x2 + x•2
poderá ser calculado diretamente a partir da Equação (42), ou utilizando a função std, Solicite ao usuário o próximo número
predefinida no MATLAB. Para este exemplo, vamos calcular a média e o desvio-padrão Leia o próximo número
diretamente a partir das equações (4.1) e (4.2), em vez de utilizar as funções predefinidas. end
Implemente um algoritmo que leia um conjunto de medidas e calcule a média e o Note q1,1e precisamos ler o primeiro valor antes do laço while iniciar, para que
desvio-padrão do conjunto de dados de entrada. esse laço tenha um valor a ser testado durante a primeira execução.
138 1 Programaçio em MATLAflll para Engenheiros
1
IS
Capllulo 4 laços 1 139

Depois, precisamos calcular a média e o desvio-padrão. O pseudocódigo % Calculate the mean and standard deviation
para esse passo são as versões MATLAB para as equações (4.1) e (4.2). x_bar = sum_x / n;
x_bar ~ sum_x / n std_dev = sqrt( (n * sum_x2 - sum_xA2) / (n * (n-1)) );
std_dev ~ sqrt( (n*sum_x2 - sum_xA2) / (n*(n-1))) % Tel1 user.
Por fim, precisamos escrever os resultados. fprintf('The mean of this data set is: %f\n', x_bar);
fprintf('The standard deviation is: %f\n', std_dev);
Escreva o valor da média x_bar
fprintf('The number of data points is: %f\n', n);
Escreva o valor do desvio-padrão std_dev
Escreva o número de dados de entrada n 5. Teste o programa
·I
Para testar esse programa, vamos calcular à mão as respostas para um conjunto
4. Trtnsforme o algoritmo em declarações MATLAB
1 simples de dados, e então comparar. as respostas com os resultados do· pro-
O programa MATLAB é apresentado a seguir:
grama. Se utilizarmos os -~~lores de entrª-da 3, 4 e 5, a m é d ~
% Script file: stats_l.m serão.
%
% Purpose: 1 N 1
% To calculate mean and the standard deviation of
x= - L Xj = - 12 = 4
N i=l 3
% an input data set containing an arbitrary number
% of input values.
%
% Record of revisions:
% Date Prograrnrner Description of change s=
%
% 12/05/98 S. J. Chapman Original code Quando fornecermos esses valores ao programa, teremos estes resultados:
%
% Define variables: » stats_l
% n The number of input samples Enter first value: 3
% std_dev The standard deviation of the input samples Enter next value: 4
% sum_x The sum of the input values Enter next value: 5
% sum_x2 The sum of the squares of the input values Enter next value: -1
% X An input data value The mean of this data set is: 4.000000
% xbar The average of the input samples The standard deviation is: 1. 000000
% Initialize sums. The number of data points is: 3.000000
n = O; sum_x = O; sum_x2 = O; O programa fornece as respostas corretas para nosso conjunto de dados de teste.
% Read in first value •
x = input ( 'Enter first value: ');
% While loop to read input values. Nesse exemplo, não conseguimos seguir o processo de projeto completamente.
while x >= O Isso deixou o programa com uma falha fatal! Você a identificou?
% Accumulate sums. A falha está em não..hfiller testado o programa completamente com-todo6--054ipos-possíveis
n = n + 1;
de entrada. Observe novamente o exemplo. Se não fornecermos nenhum número ou
sum_x = sum_x + x; então somente um número, estaremos dividindo por zero nas equações acima! O erro de
sum_x2 = swn_x2 + xA2; divisão por zero provocará avisos de divisão por zero, e os valores de saída serão NaN.
Precisamos modificar o programa para detectar esse problema, informar ao usuário
% Read in next value
qual é o problema e encerrar apropriadamente.
x = input('Enter next value: '); Uma versão modificada do programa - s ta ts_2 - é apresentada a seguir. Nessa
end versão, verificamos se temos dados de entrada em quantidade suficiente antes de efetuar
140 1 Programaçlo em MATLAEJ® para Engenheiros Capitulo 4 Laços 1 141

os cálculos. Se não tivennos;-o progtaJna apresenta um.a mensagem de erro inteligente - % Tel1 user.
e encerra o processamento. Teste o programa modificado. fprintf('The mean of this data set is: %f\n', x_bar);
fprintf('The standard deviation is: %f\n', std_dev);
% Script file: stats_2.m
fprintf('The number of data points is: %f\n', n);
%
end
% Purpose:
% To calculate mean and the standard deviation of Observe que a média e o desvio-padrão poderiam ter sido calculados com as
% an input data set containing an arbitrary number funções predefinidas do MATLAB mean e s td se os valores de entrada fossem
% of input values. · armazenados em um vetor e esse vetor fosse passado para as funções. Em um exercício
% no final deste capítulo, você será solicitado a criar uma versão do programa que utilize
% Record of revisions: as funções MATLAB-padrão.
% Date Programmer Description of change
% -------------======--
% 12/05/98 S. J. Chapman Original code 4.2 O Laço for
% 1. 12/06/98 S. J. Chapman Correct divide-by-0 error if
% O or 1 input values given. O laço for executa um bloco de declarações durante um número especificado de vezes.
% Ele tem a forma
% Define variables:
% n The number of input samples for índice
Declaração ~x}pr
%
%
std_dev
sum_x
The standard deviation of the input samples
The sum of the input values
n Corpo
% sum_x2 The sum of the sguares of the input values Declaração
% x An input data value end
% xbar The average of the input samples onde índice é a variável do laço (também conhecida como índice do laço) e expr é a
% Initialize sums. expressão de controle do laço. As colunas em expr são armazenadas uma por vez na
n = O; sum_x = O; sum_x2 = O;' variável índice e o corpo do laço é executado. Por essa razão, o laço é executado uma
vez para cada coluna em expr. A expressão em geral adota a forma de um vetor em
% Read in first value
notação abreviada primeiro: incremento: último.
x = input('Enter first value: ');
As declarações entre a declaração for e a declaração end são conhecidas como o
% While loop to read input values. corpo do laço. Elas são executadas repetidamente durante cada passagem do laço for.
while x >= O A construção de laço for funciona conforme descrito a seguir.
% Accumulate sums. 1. No início do laço, o MATLAB gera a expressão de controle.
n n + 1· 2. Na primeira passagem pelo laço, o programa associa a primeira coluna da
sum_x sum_x + x; expressão à variável de laço índice, e o programa executa as declarações no
sum_x2 sum_x2 + xA2; corpo do laço.
% Read in next value 3. Após a execução das declarações no corpo do laço, o programa associa a próxi-
x = input('Enter next value: ' ) ;
ma coluna da expressão à variável de laço índice, e o programa executa as
declarações no corpo do laço novamente.
end 4. O passo 3 é repetido enquanto houver colunas adicionais na variável de controle.
% Check to see if we have enough input data.
if n < 2 % Insufficient information Vamos- analisar alguns exemplos cspec1hcos para esclarecer melhor a operação do
laço for. Primeiramente, vamos considerar o seguinte exemplo:
disp('At least 2 values must be enteredl');
for ii = 1:10
else % There is enough information, so
Declaração 1
% calculate the mean and standard deviation

x_bar = sum_x / n; Declaração n


std_dev = sqrt( (n * sum_x2 - sum_xA2) / (n * {n-1)) ); end

.'I:.· - - - - - - - - - -
•·r
il
lt 142 1 Programação em MATJ.AB® para Engenheiros Capítulo 4 Laços 1 143
,!1
: ~ -

Nesse caso, a expressão de controle gera uma matriz 1 x 10, por isso as declarações O pseudocódigo correspondente a um laço for se assemelha ao próprio laço.
de 1 a n serão executadas dez vezes. O índice de laço i i será 1 na primeira vez, 2 na for índice= expressão
segunda, e assim por diante. O índice de laço será 10 na última passagem pelas decla- Declaração 1
rações. Quando o controle é devolvido para a declaração for depois da décima pas-
sagem, não há mais colunas na expressão de controle; a execução é transferida para a Declaração n
primeira declaração depois da declaração end. Note que o índice do laço ii permanece end
com o valor 10 após o término da execução do laço.
Segundo, considere o exemplo a seguir.

for ii = 1:2:10 Exemplo 4.2 - A Função Fatorial
Declaração 1
Para ilustrar a operação de um laço for, vamos utilizar um laço desses para calcular a
- · - torial-é-definida--com
Declaração n
end N! 1 N O
Nesse caso, a expressão de controle gera uma matriz 1 x 5, por isso as declarações de
N! N * (N-1) * {N-2) * ... * 3 * 2 * 1 N > O
1 a n serão executadas cinco vezes. O índice de laço i i será 1 na primeira vez, 3 na O código MATLAB no cálculo de N fatorial para valores positivos de N será
segunda, e assim por diante. O índice de laço será 9 durante a quinta e última passagem
pelas declarações. Quando o controle é devolvido para a declaração for depois da n_factorial = 1
quinta passagem, não há mais colunas na expressão de controle; a execução é transfe- for ii = 1:n
rida para a primeira declaração após a declaração end. Note que o índice do laço ii n_factorial n_factorial * ii;
permanece com o valor 9 após o término da execução do laço. end
Terceiro, considere o exemplo abaixo. Suponha que queremos calcular o valor de 5! Se n vale 5, a expressão de controle do °laço
for será o vetor-linha [ 1 2 3 4 5 J. Esse laço será executado cinco vezes, com a variá-
for ii = [ 5 9 7 J
vel i i assumindo os valores 1, 2, 3, 4 e 5 nas passagens sucessivas. O valor resultante
Declaração 1
de n_factorial será 1 x 2 x 3 x 4 x 5 = 120.
Declaração n •
end

Aqui, a expressão de controle é uma matriz 1 x 3 explicitamente apresentada, por isso •


as declarações de 1 a n serão executadas três vezes, com o índice do laço valendo 5 na Exemplo 4.3 - Calculando o Dia do Ano
primeira vez, 9 na segunda vez e 7 na última. A variável de índice i i permanece com
O dia do ano é o número de dias (incluindo o dia presente) desde o início de determi-
o valor 7 depois que o laço termina sua execução.
nado ano. Ele varia de 1 a 365 para anos ordinários e de 1 a 366 para anos bissextos.
Por último, considere este exemplo:
Escreva um programa MATLAB que aceite um dia, mês e ano e calcule o dia do ano cor-
for i i = [ 1 2 3; 4 5 6 J respondente a essa data.
Declaração 1
Solução
Declaração n _ _..,..,__ Para determinar o dia do ano, esse programa precisa somar o mímero de dias em cada
end mês anterior ao mês corrente, mais o número de dias passados no mês corrente. Um
laço for será utilizado para efetuar essa soma. Corno o número de dias varia para cada
Nesse caso, a expressão de controle é uma matriz 2 x 3, por isso as declarações de mês, é preciso determinar o número correto de dias a serem adicionados em decorrên-
1 a n serão executadas três vezes. O índice do laço i i receberá o vetor-coluna [ !] cia de cada mês. Uma construção swi tch será utilizada para determinar o número
apropriado de dias a serem adicionados em decorrência de cada mês.
na primeira vez, [;] na segunda e[~] na terceira. Esse exemplo ilustra o fato de que Durante um ano bissexto, um dia a mais precisa ser adicionado ao dia do ano para
um índice de laço pode ser um vetor. qualquer mês corrente depois de fevereiro. Esse dia a mais contabiliza o dia 29 de
,,
+
144 1 Prograrmçlo em MATLAIJII para Engenheiros ' CapftUIO 4 1 145

b_.
LJIÇOS

- - do mo fürtanb>,
.P""" eal~lar ronetamente o cál~ do ,füid~_;.,;,, % Calcula te day of year by adding current day to the
prec1sam~s dete~ar qua1S_anos sao anos b1s~extos. Segundo o calendano gregonano, f % days 1.n previous months.
os anos bissextos sao determinados pelas seguintes regras: lf
1
day_of_year = day;
1. Anos divisíveis por 400 são bissextos. li: for ii = 1 :month-1
2. Anos divisíveis por 100 mas não por 400 não são bissextos. 'T % Add days in months from January to last month
3. Anos divisíveis por 4 mas não por 100 são bissextos. 1
,
11
swi tch ( i i )
4. Nenhum outro ano é bissexto. fi case {1,3,5,7,8,10,12},
Utilizaremos a função mod (de módulo) para determinar se um ano é divisível por ;,!;;., day_of_year = day_of_year + 31;
outro. Se o resultado de mod for zero, o ano será divisível. !~ case {4,6,9,11},
Um programa para calcular o dia do ano é apresentado a seguir. Note que o pro- 1-;,..,.,-~· day_of_year day_of_year + 30;
,,..
grama soma o número de dias de cada mês até o mês corrente, e que ele utiliza uma case 2
construção swi tch para determinar o número de dias em cada mês. · day_of_year day_of_year + 28 + leap_day;
% Script file: doy.m end
%
% Purpose: end
% This program calculates the day of year corresponding % Tel1 user.
% to a specified date. It illustrates the use switch and fprintf('The date %2d/%2d/%4d is day of year %d.\n',
% for constructs. month, day, year, day_of_year);
%
% Record of revisions: Utilizaremos os seguintes resultados conhecidos para testar o programa:
% Date Programmer Description of change
% 1 :;.,.;. 1. O ano 1999 não é bissexto; 1• de janeiro precisa ser o dia do ano 1 e 31 de
% 12/07 /98 S. J. Chapman Original code
,,"!,
tT'
dezembro precisa ser o dia do ano 365.
% f."
2. O ano 2000 é bissexto; 12 de janeiro precisa ser o dia do ano 1 e 31 de dezembro
% Define variables: precisa ser o dia do ano 366.
% day Day (dd) 3. O ano 2001 não é bissexto; 1• de março precisa ser o dia do ano 60, pois janeiro
% day_of_year Day of year
tem 31 dias, fevereiro tem 28 dias e 1~ de março é o dia corrente.
% ii Loop index
% month Month (mm) Se esse programa for executado cinco vezes com as datas fornecidas, os resultados
% year Year (yyyy)
serão
% Get day, month, and year to convert
disp('This program calculates the day of year given the'); » doy
disp('current date.'); This program calculates the day of year given the
month input('Enter current month (1-12): '); current date.
day input('Enter current day(l-31): '); Enter current month (1-12): 1
" year input ( 'Enter current year (yyyy) : ') ; '' '-~'?
11
Enter current day(l-31): 1
% Check for leap year, and add extra day if necessary Enter current year(yyyy): 1999
if mod(year,400) == O The_date __ l/1/1999 is day of year 1.
leap_day = 1; % Years divisible by 400 are leap years » doy
elseif mod(year,100) == O
This program calculates the day of year given the
leap_day = O % Other centuries are not leap years
elseif mod(year,4) == O current date.
leap_day 1; % Otherwise every 4th year is a leap year Enter current month (1-12): 12
else Enter current day(l-31): 31
leap_day O; % Other years are not leap years Enter current year (yyyy) : 1999
end The date 12/31/1999 is day of year 365.
li
i1.i.li
. ;í·.•
1
--li
IS
146 1 Programação em MATlAB® para Engenheiros r.r Capítulo 4 Laços 1 147
f ft
:.1

» doy % Purpose:
This program calculates the day of year given the % To calculate mean and the standard deviation of
current date. % an input data set, where each input value can be
Enter current month (1-12): 1 % positive, negative, or zero.
Enter current day{l-31): 1 %
Enter current year{yyyy): 2000 % Record of revisions:
The date 1/1/2000 is day of year 1. % Date Programmer Description of change
%
» doy
% 12/08/98 S. J. Chaprnan Original code
This program calculates the day of year given the
%
current date. % Define variables:
Enter current month (1-12): 12 % ii Loop index
Enter current day{l-31): 31 % n The nurnber of input samples
Enter current year{yyyy): 2000 % std_dev The standard deviation of the input samples
The date 12/31/2000 is day of year 366. % sum_x The sum of the input values
» doy % surn_x2 The sum of the squares of the input values
This program calculates the day of year given the % X An input data value
current date. % xbar The average of the input samples
Enter current month (1-12): 3 % Initialize surns.
Enter current day{l-31): 1 surn_x = O; surn_x2 = O;
Enter current year{yyyy): 2001 % Get the nurnber of points to input.
The date 3/1/2001 is day of year 60. n = input{'Enter number of points: ');
O programa fornece as respostas corretas para nossas datas de teste nos cinco casos % Check to see if we have enough input data.
testados. if n < 2 % Insufficient data
• disp ('At least 2 values must be entered.');
else % we will have enough data, so let's get it.
% Loop to read input values.
• for ii = 1:n
Exemplo 4.4 - Análise Estatística % Read in next value
x = input('Enter value: , ) ;
Implemente um algoritmo que leia um conjunto de medidas e calcule a média e o
desvio-padrão do conjunto de dados de entrada, considerando que cada valor no con- % Accumulate surns.
junto de dados pode ser positivo, negativo ou zero. sum_x surn_x + x;
sum_x2 surn_x2 + xA2;
Solução end
Esse programa precisa ser capaz de ler uma quantidade arbitrária de medidas e calcular % Now calculate statistics.
a média e o desvio-padrão delas. Cada medida pode ser positiva, negativa ou zero. x_bar sum_x / n;
Como desta vez não podemos utilizar um valor de dados como marcador, vamos ~sECCcfev = sqrt ( (n * sum_x2 - sum_xA2) 7 (n * (n__:1-) } ) ;
solicitar que o usuário indique o número de valores de entrada e então utilizar um laço % Tel1 user.
for para ler esses valores. O programa modificado que permite o uso de qualquer valor fprintf{'The mean of this data set is: %f\n', x_bar};
de entrada é apresentado a seguir. Avalie a sua operação pelo cálculo da média e do fprintf('The standard deviation is: %f\n', std_dev);
desvio-padrão para os cinco valores de entrada dados: 3, -1, O, 1 e -2. fprintf{'The number of data points is: %f\n', n};
% Scrip~ file: stats 3.m end
% •
lilil
'f
• 11
·tt
148 1 Programação em MATlAB® para Engenheiros Capitulo 4 Laços 1 149
r : i
' 1

4.2.1 Detalhes de Operação for executada, a matriz será automaticamente estendida para oito elementos,
com os valores [ 1 2 3 4 O O O 6] . Infelizmente, cada vez que uma matriz
Agora que já vimos exemplos de um laço for em operação, precisamos examinar é estendida, o MATLAB precisa (1) criar uma nova matriz, (2) copiar o con-
alguns detalhes importantes necessários para usá-lo apropriadamente. teúdo da matriz antiga para a nova, (3) adicionar o novo valor à matriz e (4)
apagar a matriz antiga. Esse processo consome bastante tempo para matrizes
1. Não é necessário tabular o corpo de um laço for, conforme apresentado nos
grandes.
exemplos acima. O MATLAB reconhece o laço mesmo quando todas as decla-
rações iniciam na coluna um. Entretanto, o código ficará muito mais legível se Quando um laço for armazena valores em uma matriz anteriormente
o corpo do laço for estiver tabulado, por isso você deveria sempre tabular o indefinida, o laço força o MATLAB a passar por todo esse processo cada vez
corpo de um laço. que o laço é executado. Por outro lado, se a matriz for pré-alocada com seu
valor máximo antes de iniciar a execução do laço, nenhuma cópia precisará
acontecer e o código será executado muito mais depressa. O fragmento de có-
1
di o a se ir mostra como ré-alocar uma matriz antes de inici
square = zeros(l,100);
Sempre tabule o corpo de um laço for com dois ou mais espaços, para melhorar a legi-
bilidade do código. for ii = 1:100
square(ii) = ii'2;
end
2. O índice do laço para um laço for nunca deve ser modificado dentro do laço. Ava-
riável de índice é freqüentemente utilizada como um contador dentro do laço,
e modificar seu valor pode provocar erros estranhos e difíceis de encontrar. O
exemplo abaixo deveria iniciar os elementos de uma matriz, mas a declaração
ii 5" foi inserida acidentalmente no corpo do laço. Como resultado,
Sempre pré-aloque as matrizes utilizadas em um laço antes de executar o laço. Essa
somente a ( 5 ) é iniciada, recebendo os valores que deveriam ir para a ( 1 ) , prática aumenta significativamente a velocidade de execução do laço.
a ( 2 ) , e assim por diante.
for il = 1:10 4. É sempre possível efetuar cálculos utilizando laços for ou vetores. Por exem-
plo, o fragmento de código abaixo calcula os quadrados, as raízes quadradas e
i i = 5; % Erro! as raízes cúbicas de todos os inteiros entre 1 e 100, utilizando um laço for.

a (ii) <cálculos> for i i = 1 : 1 OO


end square(ii) = ii'2;
square_root(ii) = ii'(l/2);
cube_root ( ii) = iiA (1/3);
end

Nunca modifique o valor de um índice de laço no corpo do laço. O fragmento de código a seguir efetua os mesmos cálculos com vetores.
ii = 1:100;
square = ii.'2;
3. Aprendemos, no Capítulo 2, que podemos estender uma matriz existente pela square_root = ii.'(1/2);
simples alocação de um valor a um elemento de índice mais alto. Por exemplo, cuoe_root(ll) = ll.A(l/3);
a declaração
Apesar de esses cálculos produzirem as mesmas respostas, eles não são equiva-
arr = 1:4; lentes. A versão com o laço for é mais de 15 vezes mais lenta que a versão com o
define uma matriz de quatro elementos que contém os valores [ 1 2 3 4] . Se vetor! Isso ocorre devido à necessidade de a declaração no laço for ser inter-
a declaração pretada e executada uma linha por vez pelo MATLAB, durante a execução de
cada passo do laço. De fato, o MATLAB precisa interpretar e executar 300 linhas
arr (8) = 6; separadas de código. Em contraste, o MATLAB precisa interpretar e executar
150 1 Programação em MATLAB® para Engenheiros Capítulo 4 Laços 1 151

somente quatro linhas de código na versão com o vetor. Como o MATLAB é % ealculate the squares of all integers from 1 to
projetado para implementar declarações sobre vetores de forma muito efi- % 10,000 in three different ways:
ciente, esse modo é muito mais rápido. % 1. Using a for loop with an uninitialized output
A desvantagem das declarações com vetores é que mais memória será % array.
necessária, pois algumas matrizes intermediárias terão de ser criadas. Isso é em % 2. Using a for loop with a pre-allocated output
geral uma penalidade bastante pequena; os cálculos com vetores são quase % array.
sempre melhores que os cálculos com laços for. % 3. Using veetors.
%
No MATLAB, o processo de substituir laços por declarações com vetores é conhecido % Reeord of revisions:
como vetorização. A vetorização pode promover melhorias drásticas em desempenho % Date Programmer Deseription of ehange
para muitos programas MATLAB. % ----------
% 12/08/98 S. J. Chapman Original eode

% Define variables:
% ii, j j Loop índex
Se for possível implementar um cálculo por meio de um laço for ou utilizando vetores, % averagel Average time for ealeulation 1
sempre implemente utilizando vetores. Seu programa ficará muito mais rápido. % average2 Average time for ealeulation 2
% average3 Average time for ealeulation 3
% maxeount Number of times to loop ealeulation
% square Array of squares
• %
%
leap_day
month
Extra ay for leap year
Month (mm)
Exemplo 4.5 - Comparando Laços e Vetorização % year Year {yyyy)
Para comparar a velocidade de execução de declarações com laços e com vetores, efetue % Perform calculation with an uninitialized array
e cronometre os três conjuntos de cálculos a seguir. % "square". This ealculation is dane only onee
% beeause it isso slow.
1. Calcule os quadrados de cada inteiro de 1 a 10.000 utilizando um laço for, sem maxeount = 1; % One repetition
antes iniciar a matriz de quadrados. tie; % Start timer
2. Calcule os quadrados de cada inteiro de 1 a 10.000 utilizando um laço for, com for j j = l:maxcount
a função zeros para pré-alocar a matriz de quadrados. clear square % Clear output array
3. Calcule os quadrados de cada inteiro de 1 a 10.000 utilizando vetores. for ii = 1:10000
square(ii) = ii 0 2; % Calculate square
Solução end
end
Esse programa precisa calcular os quadrados de inteiros de 1 a 10.000 para cada uma
averagel = (toc)/maxeount; % Calculate average time
das três maneiras descritas, cronometrando a execução em cada caso. A contagem de
tempo pode ser efetuada pelas funções tie e toe do MATLAB. % Perform calculation with a pre-allocated array
A função tie zera o contador de tempo, e a função toe retoma o tempo transcor- % "square". This ealculation is averaged over 10
rido em segundos desde a última chamada da função tie. % loops.
Como os relógios de tempo real em muitos computadores têm uma granularidade maxcount = 10; % One repetition
de medida pouco precisa, pode ser necessário executar cada conjunto de instruções tic; % Start timer
forjj--=--1-:maxcounr----------------
múltiplas vezes para obter uma medida média de tempo válida.
clear square % Clear output array
Um programa MATLAB para comparar a velocidade dessas três abordagens é
square = zeros{l,10000); % Pre-initialize array
apresentado a seguir.
for ii = 1: 10000
% Seript file: tirnings.m square(ii) = ii 0 2; % Calculate square
% end
% Purpose: end
% This program caleulates the time required to average2 {toe) /maxcount; % Calculate average time
152 1 Programaçio em MATlAEJlb para Engenheiros Capitulo 4 Laços 1 153

% Perform calculation with vectors. This calculation Quando esse programa é executado, a saída é
% averaged over 100 executions.
rnaxcount = 100; % One repetition » test_break
tic; % Start tirner ii = 1
for j j = l:rnaxcount ii = 2
clear square % Clear output array Fim do laço!
ii = 1:10000; % Set up vector
square ii. "2; % Calculate square Note que a declaração break foi executada na iteração quando i i era 3, e o controle foi
end transferido para a primeira declaração executável depois do laço, sem executar a decla-
average3 (toc)/rnaxcount; % Calculate average time ração fprintf.
Se uma declaração continue for executada no corpo de um laço, a execução da
% Display results
passagem corrente pelo laço será interrompida e o controle retomará ao início do laço.
fprintf('Loop / uninitialized array %8.4f\n', _ __.____ A : v a r i á ~ J a ç o .f o:i::.assumirá-0,5eu..proximo--valor,-e-0-l~-será exerutaàe
averagel);
novamente. Um exemplo de declaração continue em um laço for é mostrado a seguir.
fprintf('Loop / initialized array = %8.4f\n',
average2); for i i = 1: 5
fprintf('Vectorized = %8.4f\n', if ii == 3;
average3); break;
' end
Quando esse programa é executado col.n o MATLAB 6 e um Pentium de 733MHz,
os resultados são fprintf('ii = %d\n' ,ii);
end
» timings disp('Firn do laço!');
Loop / uninitialized array 2.9640
Loop / initialized array = 0.1002 Quando esse programa é executado, a saída é
Vectorized = 0.0014
» test_continue
Como você pode verificar, o uso apropriado' de valores iniciais e cálculos vetorizados ii 1
pode fazer uma diferença incrível para a velocidade de seu código MATLAB! ii 2
• . ii
ii
4
5
Fim do laço!
4.2.2 As Expressões break e continue Observe que a declaração continue foi executada na iteração quando ii era 3, e o con-
Duas declarações adicionais podem ser utilizadas para controlar a operação dos laços trole foi transferido para o início do laço sem executar a declaração fprintf.
while e for: as declarações break e continue. A declaração break encerra a exe- As declarações break e continue funcionam em laços while e em laços for.
cução de um laço e passa o controle para a próxima declaração logo após o fim do laço;
a declaração continue termina a passagem corrente pelo laço e retoma o controle para
o início do laço. 4.2.3 Laços Aninhados
Se uma declaração break for executada no corpo de um laço, a execução do corpo
será interrompida e o controle será transferido para a primeira declaração executável Um laço pode estar completamente dentro de outro laço. Nessa condição, eles são
depois do laço. Um exemplo de declaração break em um laço for é mostrado a seguir. denomiila~<>~l!'~ºs aninhados. O exemplo abaixo mostra dois laços for ~a.9-~s que
calculam e escrevem o produto de dois inteiros. --
for ii = 1:5
if i i == 3; for i i = 1:3
break; for jj == 1:3
end product = ii * jj;
fprintf('ii = %d\n',iil; fprintf('%d * %d= %d\n' ,ii,jj,product);
end end
disp('Firn do laço!'); end
l !~ i
154 1 Prograrmção em MATIAflll para En{l8nheiros Capltlllo 4 laÇO$ 1 155
t ...-;
'
Nesse exemplo; crlaço for externo assocíãrinimvãfor 1 à variável de índice H, o laço e "!'.""•
·T
laço interno", o índice-d~ laço externo será incrementado em 1 e a execução do laço mais
for interno então será executado. O laço for interno será executado três vezes com a interno recomeçará. Os valores de saída resultantes serão
variável de índice j j adotando os valores 1, 2 e 3. Quando o laço for interno estiver
completo, o laço for externo associará um valor 2 à variável de índice ii, e o laço for
1 * 1 = 1
1 * 2 = 2
·1 interno será executado novamente. Esse processo se repetirá até que o laço for externo Fim do laço interno
tenha sido executado três vezes, e a saída resultante será 2 * 1 = 2
2 * 2 = 4
1 * 1 1
Fim do laço interno
. 1 * 2 2
3 * 1 = 3
1 * 3 3 3 * 2 = 6
1 2 * 1 2 Fim do laço interno
11 2 * 2 4 Eim do -laço exter--nG - -·--------·,. -------------·--
2 * 3 6
3 * 1 3
3 * 2 6
,i
1 4.3 Matrizes lógicas e Vetorização
3 * 3 9

Note que o laço for interno é executado completamente antes de a variável de índice No Capítulo 2, mencionamos que o MATLAB tem dois tipos de dados fundamentais:
numérico e cadeia de caracteres. Dados numéricos contêm números, enquanto cadeias
do laço for externo ser incrementada.
de caracteres contêm caractetes. Além desses dois tipos de dados, o MATLAB contém
Quando o MATLAB encontra uma declaração end, ele associa cada declaração com a cons- um terceiro ("por assim dizer'') tipo de dados: o tipo de dados lógico.
trução mais interna correntemente em aberto. Portanto, a primeira declaração end acima O tipo de dados "lógico" não é efetivamente diferenciado no MATLAB. Em vez
fechaolaço"for j j = 1:3",easegundafechaolaço"for ii = 1:3".~ssefato disso, ele é uma matriz numérica-padrão com uma propriedade especial "lógica" acres-
pode produzir erros difíceis de encontrar se uma declaração end for acidentalmente centada. Matrizes 16gicas são criadas por todos os operadores relacionais e lógicos. Elas
apagada dentro de uma construção de laço aninhado. podem ser diferenàaqas das matrizes ordinárias pela ocorrênàa do modificador (lo-
Se os laços for estiverem aninhados, eles devem ter variáveis de índice de laço distintas. gical) em seguida a elas, por meio do comando whos ou do Navegador de Espaço de
Se eles tiverem a mesma variável de índice de laço, o laço interno modificará o valo! do Trabalho.
índice de laço ajustado pelo laço externo. Por exemplo, considere as seguintes declarações:
Quando uma declaração break ou continue aparece dentro de um conjunto de
a= [1 2 3; 4 5 6; 7 8 9J;
laços aninhados, a declaração break se refere ao laço mais interno que a contém. Por b = a > 5;
exemplo, considere o programa a seguir.
Essas declarações produzem duas matrizes a e b. A matriz a é uma matriz numérica

i!
for ii = 1:3
for j j == 1:3
if j j == 3;
que contém os valores [123]4 5 6 ; a matriz b é uma matriz numérica especial com a
7 8 9

end
break;

product = ii * jj;
propriedade lógica ativada, que contém os valores
1 1 1
[ooº]
O O 1 . Ao executar o comando
·
fprintf('%d *%d= %d\n',ii,jj,product); whos, os resultados são como os exibidos abaixo. Note que a matriz b tem_~ J?:lodifi-
end cador (logicãl) assooaaoaela.
fprintf('Fim do laço interno\n'); » whos
end Name Size Bytes Class
fprintf('Fim do laço externo\n'); a 3x3 72 double array
Se o contador do laço interno j j for igual a 3, a declaração break será executada. J5so b 3x3 72 double array (logical)
levará o programa a abandonar o laço mais interno. O programa imprimirá "Fim do Grand total is 18 elements using 144 bytes

----------------------~--
._:;,:',,
1
156 1 Programação em MATLAB® para Engenheiros
•-i~.
.~.
Capítulo 4 Laços 1 157

É também possível adicionar a propriedade lógica a uma matriz, utilizando a » a (b) = sqrt {a (b))
li
I! função logical. Por exemplo, a declaração e = logical (a) colocará os valores da a
i matriz a na matriz e, associando a propriedade lógica à matriz: 1.0000 2.0000 3.0000
4.0000 5.0000 2.4495
» e = logical(a) 2.6458 2.8284 3.0000
e
1 2 3 Essa é uma maneira bastante rápida e inteligente de efetuar operações sobre subcon-
4 5 6 juntos de uma matriz sem a necessidade de laços ou ramificações.
7 8 9 Os dois fragmentos de código a seguir calculam a raiz quadrada de todos os ele-
» whos mentos de uma matriz a cujo valor é maior que cinco, mas a abordagem vetorizada é
Name Size Bytes Class muito mais rápida que a abordagem baseada•em laços.
a 3x3 72 double array for ii = l:size(a,1)
b 3x3 72 double array (logical) for jj == l:size(a,2)
e 3x3 72 double array (logical) if a(ii,jj) > 5
Grand total is 27 elernents using 216 bytes a(ii,jj) = sqrt(a(ii,jj));
end
A propriedade lógica pode ser removida de uma matriz por meio de quase qual- end
quer operação aritmética sobre ela. Por exemplo, se adicionarmos zero à matriz e, os end
valores permanecerão inalterados mas a propriedade lógica será perdida.
b = a > 5;
» e = e o a(b) = sqrt(a(b));
+
e
1 2 3 •
4 5 6 Exemplo 4.6 - Utilizando Matrizes Lógicas como Máscaras de Operações
7 8 9
» whos Para comparar as velocidades de execução de laços e ramificações com código vetori-
Narne Size Bytes Class zado, utilizando uma matriz lógica, vamos executar e cronometrar os dois conjuntos de
cálculos a seguir.
a 3x3 72 double array
b 3x3 72 double array ( logical) 1. Criar uma matriz com 10.000 elementos. A matriz deve conter os valores 1, 2 ...,
e 3x3 72 double array 10.000. Calcular a raiz quadrada de todos os elementos cujos valores sejam
Grand total is 27 elernents using 216 bytes maiores que 5.000, utilizando um laço for e uma construção if.
2. Criar uma matriz com 10.000 elementos. Ela deve conter os valores 1, 2... ,
10.000. Calcular a raiz quadrada de todos os elementos cujos valores sejam
maiores que 5.000, utilizando uma matriz lógica.
4.3.1 A Importância das Matrizes Lógicas
Solução
As matrizes lógicas têm uma propriedade especial muito importante: podem servir como
Esse programa precísa.criar-üina matriz que contenha os inteiros de 1 a 10.000 e calcular a
máscara para operações aritméticas. Máscara é uma matriz que seleciona os elementos de
outra matriz para utilizar em uma operação. A operação especificada será aplicada raiz quadrada de cada valor maior que 5.000, utilizando cada uma das duas maneiras
sobre os elementos selecionados, mas não sobre os outros elementos. descritas acima.
Por exemplo, suponha que as matrizes a e b sejam conforme definido na seção Um programa MATLAB para comparar a velocidade das duas abordagens é apre-
anterior. No caso, a declaração a (b) = sqrt ( a (b) ) produzirá a raiz quadrada de sentado a seguir:
todos os elementos para os quais a matriz lógica b seja diferente de zero, e manterá inal- % Script file: logicall.m
terados os outros elementos. %
tt
.,.
158 1 Programação em MATLA~ para Engenheiros
--- Capítulo 4 Laços 1 159

••
- ~ . ·•....
·-

% Purp·ose: % Display results


'
• 1
% This prograrn calculates the time required to fprintf('Loop / if approach %8.4f\n',
% calculate the square roots of all elernents in averagel);
% array a whose value exceeds 5000. This is done fprintf{'Logical array approach %8.4f\n',
% in two different ways: average2);
% 1. Using a for loop and if construct.
Quando esse programa é executado pelo MATLAB 6, em um computador Pentium III
% 2. Using a logical array. de 733 MHz, os resultados são os seguintes:
%
% Record of revisions: » logicall
% Date Prograrnrner Description of change Loop / if approach 0.1200
% Logical array approach ;0.0060
% 06/01/01 S. J. Chaprnan Original code Corno pode ser visto, o uso de matrízes log1cas acelera a execuçao do codigo em um
% fator 20!
% Define variables:
% a Array of input values

% b Logical array to serve as a rnask
% ii, jj Loop índex
% averagel Average time for calculation 1
% average2 Average time for calculation 2
% rnaxcount Nurnber of times to loop calculation Sempre que possível, utilize matrizes lógicas como máscaras para selecionar para
% rnonth Month (mm) processamento os elementos de uma matriz. Se as matrizes lógicas forem utilizadas no
lugar dos laços e das construções i f, seu programa será muito mais rápido.
% year Year (yyyy)
% Perforrn calculation using loops and branches.
rnaxcount 1; % One repetition
tic; % Start tirner 4.3.2 Criando o Equivalente a Estruturas if / else com Matrizes Lógicas
for jj = 1:rnaxcount
a = 1:10000; % Declare array a Matrizes lógicas podem também ser utilizadas para implementar urna construção
for ii = 1: 10000 i f/ e 1 se dentro de um conjunto de laços for. Conforme vimos na última seção, é pos-
if a(ii) > 5000 sível aplicar uma operação sobre elementos selecionados de uma matriz utilizando uma
a(ii) = sgrt(a(ii)); matriz lógica como máscara. É também possível aplicar um conjunto distinto de operações
end sobre os elementos não selecionados da matriz, simplesmente adicionando o operador de
negação (~) à máscara lógica. Por exemplo, suponha que queiramos calcular a raiz
end
quadrada dos elementos de uma matriz bidimensional cujo valor seja maior que 5 e cal-
end
cular o quadrado dos elementos restantes na matriz. O código para essa operação, uti-
averagel = (toc)/maxcount; % Calculate average time
lizando laços e ramificações, é
% Perform calculation using logical arrays.
for ii = l:size{a,1)
maxcount = 10; % One repetition
:(o_Lij 1: size (a, 2)
tic; % Start timer
if a(ii,jj) > 5
for jj = l:rnaxcount a ( i i, j j ) sqr t {a {i i, j j ) ) ;
a= 1:10000; % Declare array a
else
b = a > 5000; % Create mask a(ii,jj) a(ii,jj)'2;
a(b) = sgrt(a(b)); % Take square root end
end end
average2 (toe) /maxcoun t; % Calculate average time end
·-,
160 1 Programação em MATlAB® para Engenheiros

o código vetorizado para essa operação é


--t 9. ires = O;
Capítulo 4 Laços 1 161

for indexl = 1:10


b = a > 5; for index2 = indexl:10
a(b) = sqrt(a(b) ); if index2 == 6
a(-b) = a(~b) .A2; .;
continue;
end
O código vetorizado é enormemente mais rápido que a versão baseada em laços e
ramificações. 1 ires= ires+ 1;
end
end
10. Escreva as declarações MATLAB para calcular os valores da função

:j·---
Teste 4.1 /(t) = sin t para to~~ t tal que sin t > O
O caso contrano
Este teste apresenta uma verificação rapida cfô seuentendimento dos --;;-~~cit~s apre- para -61t < t < 61t com intervalos de 1t/l0. Faça isso duas vezes: uma vez uti-
sentados nas Seções de 4.1 a 4.3. Se você tiver problemas com o teste, releia as seções, -~ lizando laços e ramificações e outra utilizando código vetorizado.
pergunte ao seu professor ou discuta o material com um colega. As respostas podem ser
encontradas no final do livro.
Examine os laços for abaixo e determine quantas vezes cada laço será executado. 1.
1. for index = 7:10 1.J
. _ -·._ 4.4 Exemplos Adicionais
2. for j j = 7:-1:10 i',
1,._-_
.·-
1-
.•.·.
. •
3. for index = 1:10:10
Exemplo 4. 7 - Ajustando uma Linha para um Conjunto de Medidas com Ruído
4. for ii -10:3:-7
A velocidade de um objeto em queda na presença de um campo gravitacional constante
: ' \
5. for kk [O 5 ; 3 3] é dada pela equação
_ií:•._t·•-.:·._·.··
. '/'
Examine os laços a seguir e determine o valor em ires no final de cada um. v(t) =at + v 0 (4.3)
i_.g:_
•·.
11"·· onde v(t) é a velocidade a qualquer instante t, a é a aceleração da gravidade e v 0 é a
6. ires = O;
velocidade no instante O. Essa equação advém da física elementar - qualquer calouro de
for index = 1:10 um curso de física a conhece. Se desenharmos a velocidade versus o tempo para o objeto
ires= ires+ l; em queda, nossos pontos de medida (v,t) devem seguir uma linha reta. Entretanto, o
end mesmo calouro do curso de física sabe que, se formos ao laboratório e tentarmos medir
7. ires = O; a velocidade versus o tempo de um objeto, nossas medidas não seguirão uma linha reta.
for index = 1:10 Elas poderão se aproximar disso, mas nunca se alinharão perfeitamente. Por que não?
ires= ires+ index; Porque nunca conseguimos efetuar medidas perfeitas. Existe sempre algum ruído nas
end medidas que as deixa distorcidas.
Em muitos casos em ciência e engenharia, temos conjuntos de dados com ruídos
8. ires O; como esse, e desejamos estimar a linha reta que "melhor se ajuste" aos dados. Esse
for indexl = 1:10 problema é conhecido como problema da regressão linear. Dado um conjunto d_e_ me-
fo~ index2 = indexl:10 didas (x;y1 com~ruído e que aparentemente seguem uma linha reta, como podemos
if index2 6 encontrar a equação da reta
break;
y=mx+b (4.4)
end
ires= ires+ 1; que "melhor se ajuste" às medidas? Se pudermos determinar os coeficientes de regres-
end são m e b, poderemos utilizar essa equação para prever o valor de y para um dado x uti-
end lizando a Equação (4.4) naquele valor de x.
162 1 Programaçio em MATLAB® para Engenheiros
1 Capítulo 4 Laços 1 163

Um método-padrão para determinar óS coeficientes de regressão me b é o método


dos mínimos quadrados. Esse método recebe o nome de mínimos quadrados porque produz
t O primeiro grande passo do programa é ler o número de pontos a
serem lidos. Para isso, solicitamos ao usuário essa informação por meio da
a reta y = mx + b, para a qual a soma dos quadrados das diferenças entre os valores y função input. A seguir, lemos os pares (x,y) um por vez, utilizando uma função
observados e os previstos é a menor possível. A inclinação da reta de mínimos quadra- input dentro de um laço for. Cada par de valores será colocado em uma
dos é dada por matriz ( [ x y] ), e a função retornará essa matriz para o programa solicitante.
Note que um laço for aqui é apropriado, pois sabemos a priori quantas vezes o
(:E xy) - (:E x)y
m= (4.5) laço será executado.
(:E x 2 ) - (:E x)x O pseudocódigo para esses passos é apresentado a seguir.
e o ponto de interseção da reta de mínimos q1.J.adrados é dado por Apresente mensagem que descreva o objetivo do programa
n_points f-- input('Forneça o número de pares [x y]: ');
b=y-mx (4.6) for ii = l:n_points
temp f-- input ( 'Forneça [x' y]: ');
onde x(ii) ~ ternp(l) _,_._ __
:E x é a soma dos valores de x, y(ii) f-- temp(2);
:E x 2 é a soma dos quadrados dos valores de x, end
:E xy é a soma dos produtos dos valores correspondentes de x e y, A seguir, precisamos acumular as estatísticas requeridas para o cálculo. Essas
x é a média dos valores de x, estatísticas são as somas Ex, :Ey, :Ex2, e :Exy. O pseudocódigo para esses passos é
y é a média dos valores de y. Zere as variáveis sum_x, sum_y, surn_x2 e sum_xy
for ii = l:n_points
Escreva um programa que calcule a inclinação m e o ponto b de interseção do eixo sum_x f-- sum_x + x ( ii)
y para a reta de mínimos quadrados de um dado conjunto de pontos (x,y) medidos com sum_y f-- surn_y + y ( ii)
ruído. Os pontos devem ser lidos a partir do teclado, e tanto os pontos individuais como sum_x2 f-- sum_x2 + x(ii)A2
a reta de mínimos quadrados precisam ser desenhados. sum_xy f-- sum_xy + x ( ii) * y ( ii)
end
Solução
Depois, precisamos calcular a inclinação e a interseção da reta de mínimos
1. Estabeleça o problema quadrados. O pseudocódigo para esse passo é simplesmente a versão em MATLAB
Calcule a inclinação me a interseção b de uma reta de mínimos quadrados das equações (4.4) e (4.5).
que melhor se ajuste a um conjunto de dados de entrada composto por X - bar f-- sum_x/n_points
um número arbitrário de pares (x,y). Os dados (x,y) de entrada são lidos y_bar f-- sum_y/n_points
a partir do teclado. Desenhe os pontos de entrada e a reta sobre um slope f-- (sum_xy-sum_x * y_bar)/(sum_x2-sum_x * x_bar)
mesmo diagrama. y_ int f-- y_bar-slope * x_bar
2. Defina as entradas e saídas Finalmente, precisamos apresentar os resultados e o diagrama. Os pontos
As entradas requeridas para esse programa são o número de pontos a serem de entrada devem ser desenhados com marcadores circulares e sem uma linha de
lidos, mais os pares de pontos (x,y). conexão, e a reta ajustada deve ser desenhada como uma linha cheia com es-
As saídas desse programa são a inclinação e a interseção da reta de míni- pessura de dois pixels. Para fazer isso, precisamos primeiro desenhar os pontos,
mos quadrados, o número de pontos utilizados para o ajuste e um diagrama ajustar o hold on, desenhar a reta ajustada e ajustar o hold off. Adicio-
naremos títulos e legendas para completar o diagrama.
com os dados de entrada e a curva ajustada.
4. Transforme o algoritmo em declarações MATLAB
3. Descreva o algoritmo
O pn:>gnuna_MATLAB_é apresentado a seguir
Esse programa pode ser quebrado em seis grandes passos:
%
Obtenha o número de pontos de entrada % Purpose:
Leia os valores de entrada % To perforrn a least-squares fit of an input data set
Calcule as estatísticas solicitadas % to a straight line, and print out the resulting slop~
Calcule a inclinação e a interseção I' % and intercept values. The input data for this fit
Escreva a inclinação e a interseção % is input from the keyboard.
Desenhe os pontos de entrada e a curva ajustada
i----- %
164 1 Programaç5o em MATLAB" para Engenheiros Capitulo 4 laços 1 165

% Record of revisions: slope (sum_xy - sum_x * y_bar) ./ ( sum_x2 - sum_x * x_bar);


% Date Programrner Description of change y_int y_bar - slope * x_bar;
%
% Tel1 user.
% 01/03/99 s. J. Chapman Original code
disp('Regression coefficients for the least-squares line:');
% fprintf(' Slope (m) %8.3f\n', slope);
% Define variables: fprintf(' Intercept (b) %8.3f\n', y_int);
% ii Loop index fprintf(' No of points %8d\n', n_points);
% n_points Number ininput [x y] points
Slope of the line % Plot the data points as blue circles with no
% slope
sum_x % connecting lines.
% Sum of all input X values
plot (x,y, 'bo');
% sum_x2 Sum of all input X values squared
_....,,_______ . --· ho_,al_,,,d._,_o,,.n..,:'------
% sum_xy Sum of all input X * y values
% Create the fitted line
1 . %
%
sum_y
temp
Sum of all input y values
Variable to read user input xmin min(x);
% X Array of x values xmax max(x);
x_bar Average x value ymin slope * xmin + y_int;
:1 %
% y Array of y values ymax slope * xmax + y_int;
!! % y_bar Average y value % Plota solid red_ line with no markers
I,, % y_int y-axis intercept of the line plot ( [xmin xmax) , [ymin ymax] , 'r-' , 'LineWidth' , 2) ;
disp('This program performs a least-squares fito~ an '); hold off;

1:i·
disp('input data set to a straight line.'); % Add a title and legend
i.!
n_points = input('Enter the number of input [x y) points: '); title ('\bfLeast-Squares Fit');
% Read the input data xlabel('\bf\itx');
for i i 1:n_points ylabel('\bf\ity');
temp input('Enter [x y) pair: , ) ; legend('Input data','Fitted line');
x(ii) temp(l); grid on
y(ii) temp(2);
5. Teste o programa
end
Para testar esse programa, tentaremos um conjunto de dados simples. Por
% Accumulate statistics exemplo, se todos os pontos no conjunto de dados efetivamente seguirem
sum_x O; uma linha reta, a inclinação e a interseção resultantes deverão ser pre-
sum_y O; cisamente a inclinação e a interseção dessa linha reta. Assim, o conjunto
sum_x2 O; de dados
sum_xy O; [1.1 1.1]
for i i 1:n_points [2.2 2.2]
sum_x sum_x + x(ii); [3. 3 3. 3]
sum_y sum_y + y ( ii) ; r4-;1rL4T
sum_x2 sum_x2 + x(ii)A2; [5.5 5.5)
sum_xy sum_xy + x(ii) * y(ii); [6. 6 6. 6]
end (7.7 7.7]
% Now calculate the slope and intercept. deverão produzir uma inclinação 1,0 e uma interseção 0,0. Se executarmos
1;
x_bar sum_x / n_points; o programa com esses valores, os resultados serão como os apresentados
y_bar = sum_y / n_points; a seguir:
166 1 Programaç5o em MATlAB® para Engenheiros Capllulo 4 Laços 1 167
!i
' ~ Calculando à mão a resposta, fica fácil mostrar que o programa dá as respostas
! i This program performs a least-squares fit of an corretas para nossos dois conjuntos de dados de teste. Os dados de entrada com
l l input data set to a straight line . ruído e a reta ajustada de mínimos quadrados resultante são apresentados na
.j Enter the number of input [x y] points: 7
Enter [x y] pair: [1.1 1.1]
Figura 4.1.

Enter [x y] pair: [2.2 2.2]
Enter [x y] pair: [3. 3 3.3]
Enter [x y] pair: [4.4 4.4]
Enter [x y] pair: [5.5 5.5]
1
'

Esse exemplo ,utiliza diversos recursos de desenho introduzidos no Capítulo 3. Ele


utiliza o comando hold para múltiplos diagramas sobre os mesmos eixos, a pro-
Enter [x y] pair: [6. 6 6. 6] priedade LineWidth para ajustar a espessura da reta ajustada de mínimos quadrados
Enter [x y] pair: [7. 7 7.7] e seqüências de comandos que apresentam o,título em negrito e as legendas dos eixos
Regression coefficients for the least-squares line:
Slope {m) 1.000
Intercept (b) = 0.000 •
No of points = 7
Exemplo 4.8 - OVôo da uma Bola
Vamos agora acrescentar ruído a essas medidas. O conjunto de dados passará Se assumirmos que a resistência do ar é desprezível e ignorarmos a curvatura da Terra,
1 a ser uma bola lançada ao ar, de qualquer ponto da superfície da Terra, seguirá um percurso
"
1ni< de vôo parabólico {Figura 4.2a ). A altura da bola em um instante t depois do lançamento
[1.1 1.01]
ici
[2 .2 2.30] é dada pela Equação {4.7)
,íl
11
[3. 3 3. 05]
i' [4 .4 4.28]
,f Ajuste de mlnlmos quadrados
[5.5 5.75] ,;
e
[6.6
[7. 7
6.48]
7.84] 7 V
Se executarmos o programa com esses valores, os resultados serão
» lsqfit 6

This program performs a least-squares fit of an
input data set to a straight line. 5 V
~
Enter the number of input [x y] points: 7
Enter [x y] pair: [1.1 1. 01]
4
Enter [x y] pair: [2.2 2.30]
Enter [x y] pair: [3. 3 3.05]
Enter [x y] pair: [4.4 4.28] 3
/
Enter [x y] pair: [5.5 5.75] -- - - -~ -- / 1
o Dados de entrada 1
- . 1 --
Enter [x y] pair: [6 .6 6.48] 2 r 1

Enter [x y] pair: [7.7 7.84]


Regression coefficients for the least-squares line: 1 /
- 2 3 4 5 6 7 e
1 1
i Slope {m)
Intercept (b)
1. 024
-0.120
X

No of points 7 Figura 4.1 Dados com ruído e uma reta ajustada de mínimos quadrados.
168 1 Programação em MATLAEJIP para Engenheiros Capítulo 4 Laços 1 169

y Se a bola for lançada com uma velocidade inicial v 0 e um ângulo de 0 graus


com relação à superfície da Terra, os componentes horizontal e vertical da velo-
cidade serão

Vxo + V 0 COS 0 (4.9)

1 Assuma que a bola seja inicialmente lançada da posição (x"'y0 ) = (0,0), com
velocidade inicial v 0 de 20 metros por segundo e ângulo inicial de 0 graus. Escreva
{4.10)

um programa para desenhar a trajetória da bola e determine a distância horizontal


~ percorrida antes de ela tocar novamente o 'solo. O programa deve desenhar as tra-
Origem Impacto X
_ __,..___·,.,tórias·tla bola para todos-us~ângmmrc:le-s'-i.85", vanando de 10° em 106 , e defer-
{a)
!i minar a distância horizontal percorrida para todos os ângulos de 0° a 90°, variando de
1° em 1°. Finalmente, ele deve determinar o ângulo 0 que maximiza a distância per-
yt corrida pela bola, e desenhar essa trajetória em particular com uma cor diferente e
uma linha mais espessa.
'
'''
' Solução
'''
vy
'
r'------,.v Para resolver esse problema, precisamos determinar urna equação para o tempo que a bola
'' leva para retornar ao solo. Em seguida, podemos calcular a posição (x,y) da bola uti-
'' lizando as equações (4.7) a (4.10). Se fizermos isso várias vezes entre O e o tempo que a
' bola retoma ao solo, poderemos utilizar esses pontos para desenhar a trajetória da bola.
'''
'' O tempo em que a bola permanece no ar após ser lançada pode ser calculado pela
'
'' Equação (4.7). A bola tocará o solo no tempo t, para o qual y(t) =O.Lembrando que a
'
D--'ª--•: -- -- --------------------- • bola parte do nível do solo (y(O) = O), e resolvendo para t, temos
X
vx
{b)
(4.7)
1

i Figura 4.2 (a) Quando uma bola é lançada para cima, ela segue uma trajetória parabólica. (b)
Os componentes horizontal e vertical de um vetor velocidade v a um ângulo 0 com
a horizontal.
li
1

f
O= (v yo
t + 2.
2
g t2) t
1 (4.7) portanto, a bola estará no nível do solo no instante t1 = O (quando a lançamos) e no
instante
onde y0 é a altura inicial do objeto acima do solo, vYº é a velocidade vertical inicial do
objeto e g é a aceleração devido à gravidade da Terra. A distância horizontal percorrida (4.11)
pela bola como função do tempo após o lançamento é dada pela Equação (4.8):

x(t) = X0 + vxo t (4.8) Para o problema tratado, sabemos que a velocidade inicial v0 é de 20 metros por
segundo, e que a bola será lançada com ângulos variando de 0° a 90°, de 1° em 1°.
onde x0 é a posição horizontal inicial da bola no solo e vxo é a velocidade horizontal ini- Finalmente, um livro de física elementar nos diz que a aceleração devida à gravidade
cial da bola. da Terra é de 9,81 metros por segundo ao quadrado .

.:;,:.
170 1 Programação em MATlA~ para Engenheiros Capitulo 4 Laços 1 171

Agora, apliquemos nossa técnica de projeto a esse problema.

l
---- Vepoii.Çprecisamos escrever uma tabela de percursos. O pseudocódigo
1. Estabeleça o problema i. para esse passo é:
O problema pode ser bem apresentado assim: calcule a distância percorrida por Escreva o cabeçalho
uma bola quando ela é lançada com uma velocidade inicial v0 de 20 mls e ângulo inicial for ii = 1: 91
e. Calcule essa distância para todos os ângulos entre O" e 90°, variando de 1° em 1°. theta +- ii - l;

1
escreva theta e a distância (range);
Determine o ângulo e que resulta na distância percorrida máxima para a bola. Desenhe
end
a trajetória da bola para ângulos entre 5° e 85°, com incrementos de 10". Desenhe a tra-
jetória de máximo percurso em cor diferente e com uma linha mais espessa. Assuma que A distância máxima percorrida pode ser obtida pela função max. Lembre
1 não existe resistência do ar. que essa função retorna o valor máximo e sua posição. O pseudocódigo para
I' esse passo é:
i1l 2. Defina as entradas e saídas [maxrange índice] +- max(rabge);
Com essa definição do problema, não precisamos de dados de entrada. Co- ------EsB-Feva a di1Ywnci-a··máx±ma---(Tange) e C5-angillo (=indice-1);
nhecemos o valor de v0 e de e, portanto não precisamos fornecê-los. As saídas
Vamos utilizar laços for aninhados para calcular e desenhar as trajetórias.
,,
-~ para esse programa serão uma tabela que mostra a distância percorrida pela
Para que todos os diagramas apareçam na tela, precisamos desenhar a primeira
bola para cada ângulo e, o ângulo e para o qual essa distância é máxima e um
trajetória e aplicar hold on antes de desenhar as outras trajetórias. Após dese-
diagrama das trajetórias especificadas.
nhar a última trajetória, precisamos aplicar hold off. Para efetuar esses cálcu-
3. Projete o algoritmo los, vamos dividir cada trajetória em 21 intervalos de tempo e determinar as
Esse programa pode ser quebrado nos seguintes grandes passos: posições x e y da bola para cada intervalo. Em seguida, vamos desenhar essas
posições (x,y). O pseudocódigo para esse passo é:
Calcule a distância percorrida pela bola para 0 variando
for ii = 5:10:85
entre O e 90°
Escreva urna tabela de distâncias percorridas % Determina velocidades e tempo máximo para o ângulo·
Determine a distância percorrida máxima e a apresente theta +- ii - 1;
Desenhe as trajetórias para 0 variando entre 5 e 85° vxo +- vo * cos(theta*conv);
vyo +- vo * sin(theta*conv);
Desenhe a trajetória de percurso máximo
max_time +- -2 * vyo / g;
Como sabemos o número exato de vezes que os laços serão repetidos,
Inicia as matrizes x e y
laços for são apropriados para esse algoritmo. Vamos agora refinar o pseudo-
for j j 1: 21
código para cada um dos grandes passos. time<- (jj-1) * max_time/20;
Para calcular a distância máxima percorrida pela bola para cada ângulo, x(time) +- vxo * time;
vamos primeiro calcular as velocidades iniciais horizontal e vertical, usando as y(time} <- vyo * time+ 0.5 * g * timeA2;
equações (4.9) e (4.10). Depois, vamos determinar o tempo para a bola retornar end
à Terra, utilizando a Equação (4.11). Finalmente, vamos calcular a distância per- plot(x,y} com linhas verdes finas
corrida, utilizando a Equação (4.7). O pseudocódigo detalhado para esses passos Aplica "hold on" depois do primeiro diagrama
é apresentado a seguir. Note que precisamos converter todos os ângulos para end
radianos antes de utilizar as funções trigonométricas! Adiciona os títulos e legendas dos eixos
Crie e inicie urna matriz para os valores Para finalizar, precisamos desenhar a trajetória de percurso máximo com
for ii = 1: 91 cor diferente_e linhamais..te~s4pnce,,.s,,.sa<l.------------
theta +- ii - l; vxo +- vo * cos(max_angle*conv);
vxo +- vo * cos(theta*conv); vyo +- vo * sin(max_angle*conv);
vyo +- vo * sin(theta*conv}; max_tirne +- -2 * vyo / g;
max_tempo +- -2 * vyo / g; Inicia as matrizes x e y
percurso(ii) +- vxo * max_tempo; for jj = 1:21
end time+- (jj-1) * max_time/20;
172 1 Programação em MATlAEJS para Engenheiros
1 Capitulo 4 laços 1 173

x(jj) +-- vxo * time; % Calculate maxirnurn ranges


y(jj) +-- vyo *time+ 0.5 * g * timeA2; for ii = 1 :91
end theta = i i - l;
plot(x,y) com linha vermelha grossa vxo = vo * cos(theta*conv);
hold off vyo = vo * sin(theta*conv);
4. Transforme o algoritmo em declarações MATLAB
O programa MATLAB resultante é apresentado a seguir.
% Script file: ball.m
1 .
rnax_time = -2 vyo / g;-
range (ii) = vxo * max_time;
end
% Write out table of ranges
%
fprintf ('Range versus angle theta:\n');
% Purpose:
for i i = 1:91
% This program calculates the distance trave_led by a ball th@ta - ii -l--;--- - ---- -- - --------------·--·
% thrown ata specified angle ªtheta• anda specified fprintf(' %2d %8.4f\n',theta, range(ii));
% velocity •vo• from a point on the surface of the Earth, end
% ignoring air friction and the Earth's curvature. It
% Calculate the maximum range and angle
% calculates the angle yielding maximum range, and also
[maxrange index] = rnax(range);
% plots selected trajectories.
maxangle = index - 1;
%
fprintf ('\nMax range is %8.4f at %2d degrees.\n', ...
% Record of revisions:
maxrange, maxangle);
% Date Programmer Description of change
% % Now plot the trajectories
% 12/10/98 S. J. Chaprnan Original code for ii = 5:10:85
% % Get velocities and max time for this angle
% Define variables: theta = ii;
% conv Degrees to radians conv facto 1 vxo vo * cos(theta*conv);
% gravity Accel. dueto gravity (m/sA2) vyo = vo * sin(theta*conv);
% ii, jj Loop index max_tirne = -2 vyo / g;
% index Location of maximum range in array % Calculate the (x,y) positions
% maxangle Angle that gives maximum range (deg) x zeros (1, 21);
% maxrange Maximum range (m) y = zeros(l,21);
% range Range for a particular angle (m) for j j = 1: 21
% time Time (s) time= (jj-1) * max_time/20;
% theta Initial angle (deg) x(jj) vxo * time;
% traj_time Total trajectory time (s) y(jj) = vyo *time+ 0.5 * g * timeA2;
% vo Initial velocity (rn/s) end
% vxo X-component of initial velocity (m/s) plot (x,y, 'b');
% vyo Y-component of initial velocity (m/s) if ii == 5
% X X-position of ball (m) hold on;
% y end ·- - ---··-------·- - - - - - - - - - - - - - - - - -
Y-position of ball (m)
end
% Constants
% Add titles and axis labels
conv = p i / 180;
g = -9.81;
% Degrees-to-radians conversion factor
% Accel. dueto gravity
_.,
~:-
title ('\bfTrajectory of Ball vs Initial Angle \theta');
xlabel ('\bf\itx \rm\bf(meters) ');
VO = 20; % Initial velocity

J
ylabel {'\bf\ity \rm\bf(meters) ');
% Create an array to hold ranges axis ( (O 45 O 25] l;
range= zeros(l,91); grid on;
-

'
t
t\ r
ili
~
17 4 1 Programação em MATLA~ para Engenheiros 1
.•. Capllulo 4 Laços 1 175
... 1

1 % Now plot
vxo vo *
the max range traj ectory
cos(maxangle*conv);
t -----43
44
40 .ms4
40.7499
1 vyo = vo * sin(maxangle*conv); 45 40.7747
max_time -2 * vyo / g; 46 40.7499
47 40.6754
% Calculate the (x,y) positions
48 40.5514
x zeros(l,21);
y = zeros (1,21);
for jj = 1:21
time= {jj-1) * max_time/20;
x(jj) vxo * time;
1 49
50

85
40.3779
40.1553

7.0805
86 5.6747
y{jj) = vyo *time+ 0.5 * g * timeA2;
87 4.2621
end
88 2.8443
plot(x,y, 'r', 'LineWidth',3.0);
89 1. 4230
hold off
90 0.0000
A aceleração da gravidade no nível do mar pode ser obtida de qualquer livro Max range is 40.7747 at 45 degrees.
de física. Ela vale 9,81 m/s2, em direção ao solo.
O diagrama resultante é mostrado na Figura 4.3. A saída do programa está
5. Teste o programa de acordo com nosso cálculo à mão para os ângulos calculados com precisão de
Para testar o programa, vamos calcular à mão as respostas para alguns ângulos quatro dígitos nesse mesmo tipo de cálculo. Note que o percurso máximo ocorreu
e comparar os resultados com a saída do programa. com ângulo de 45°.

2Vy0
0 V10 = V0 COS 0 V10 = V0 Sin 0 l2 =- X= Vzof2
g Trajectory oi bali vs initial angle 9
Oº 20 m/s Om/s Os Om
5º 19,92 m/s 1,74 m/s 0,355 s 7,08m
40° 15,32 m/s 12,86 m/s 2,621 s 40,15 m
45° 14,14 m/s 14,14 m/s 2,883 m/s 40,77 m

Quando o programa ba 11 é executado, é produzida uma tabela de ângulos


e distâncias com 91 linhas. Para economizar espaço, vamos reproduzir apenas
uma parte dessa tabela.
» ball
Range versus angle theta:
o 0.0000
1 1. 4230
2 2.8443
3 4.2621
4 5.6747
5 7.0805
x(meters)
40 40.1553
41 40.3779
42 40.5514 Figura 4.3 Trajetórias possíveis para a bola.

:'i~•..
176 1 Programação em MATIA~ para Engenheiros Capítulo 4 Laços 1 177
,,
- ·1'
' Esse exemplo utiliza diversos recursos de desenhos apresen1a.dos hó Capífü1o 3. Comandos e Funções
Ele utiliza o comando axis para ajustar os dados exibidos, o comando hold para break Interrompe a execução de um laço e transfere o controle
múltiplos diagramas sobre os mesmos eixos, a propriedade LineWidth para ajustar a para a primeira declaração após o final dele.
espessura da linha correspondente à trajetória de percurso máximo e seqüências de continue Interrompe a execução de um laço e transfere o controle
comandos para criar o título e as legendas para os eixos x e y. para o início dele, para a próxima iteração.
Esse programa, entretanto, não foi escrito da maneira mais eficiente, pois temos laço for Repete um bloco de.declarações durante um número espe-
diversos laços que poderiam ser substituídos por declarações vetorizadas. Você será cificado de vezes.
solicitado a escrever um programa ball .m melhorado no Exercício 4.11 deste capítulo. logical Acrescenta o atributo logical a uma matriz numérica.
tic Reinicia o contador de tempo.
toe Retorna o tempo desde a última chamada de tic.
4.5 Resumo laço while Repete um blocó de declarações até que uma condição de
.----------teste-se--tome-9-{falso.-\-).--------------
Temos dois tipos básicos de laços no MATLAB: o laço while e o laço for. O laçowhile
é utilizado para repetir um trecho de código quando não sabemos a priori quantas vezes
o laço precisa ser repetido. O laço for é utilizado para repetir um trecho de código
quando sabemos a priori quantas vezes o laço deve ser repetido. Podemos escapar de
qualquer tipo de laço a qualquer momento, utilizando declarações break.
.1 4.6 Exercícios
4.1 Escreva as declarações MATLAB para calcular y(t) na equação
y(t) = {-3t +5
2 t 2! 0
4.5.1 Resumo de Boas Práticas de Programação 11 3t + 5 t
2 <o
para valores de t eritre -9 e 9, em intervalos de 0,5. Utilize laços e ramifi-
As seguintes orientações devem ser seguidas na programação utilizando construções de :Í cações para esses cálculos.

I,
ramificação e laço. Se elas forem seguidas consistentemente, seu código conterá menos
bugs e será mais fácil de depurar e de entender para outras pessoas que talvez precisem
trabalhar com ele no futuro.
t

~i
4.2 Reescreva as declarações para resolver o Exercício 4.1 utilizando vetorização.
4.3 Escreva as declarações MATLAB para calcular e imprimir os quadrados de
todos os inteiros pares entre O e 50. Crie uma tabela composta pelos inteiros
~
e seus quadrados, com legendas apropriadas para cada coluna.
1. Sempre tabule os blocos de código dentro das construções while e for para
4.4 Escreva um arquivo M para avaliar a equação y(x) = x2 - 3x + 2 para todos os
que elas sejam mais fáceis de ler.
valores de x entre 0,1 e 3, em intervalos de 0,1. Faça isso duas vezes, uma com
2. Utilize um laço while para repetir trechos do código quando você não souber laços for e uma com vetores. Desenhe a função resultante utilizando uma
a priori quantas vezes o laço deve se repetir. linha vermelha espessa e tracejada.
!' 3. Utilize um laço for para repetir trechos do código quando você souber a priori
4.5 Escreva um arquivo M para calcular a função fatorial N!, conforme definida
quantas vezes o laço deve se repetir.
no Exemplo 4.2. Observe o caso especial do O! Seu programa deve também
4. Nunca tente modificar os valores de um índice de um laço for dentro do laço.
indicar um erro se N for negativo ou não for um número inteiro.
5. Sempre inicie todas as matrizes utilizadas em um laço antes de executá-lo. Essa
prática aumenta muito a velocidade de execução do laço. 4.6 Examine as declarações for abaixo e determine quantas vezes cada laço será
6. Se for possível implementar um cálculo por meio de um laço for ou de vetores,
executado.
sempre implemente o cálculo com vetores. Seu programa será muito mais rápido. a. for ii -32768:32767
7. Sempre que possível, utilize matrizes lógicas como máscaras para selecionar h for ii 32768:32767
para processo os elementos de uma matriz. Se matrizes lógicas forem utilizadas ~ for kk 2:4:3
d; --for--jj--=--onesi•-<.--,-Ec-1.----------------·
em vez de laços e construções i f, seu programa será muito mais rápido.
4. 7 Examine os laços for a seguir e determine o valor de ires no final de cada
um, e também o número de vezes que cada laço é executado.
4.5.2 Resumo do MATLAB a. ires = O;
for index = -10:10
O resumo abaixo lista todos os comandos e funções MATLAB descritos neste capítulo, ires= ires+ 1;
com uma breve descrição de cada um. end
178 1 Programação sm MATLAB" para En(JBnhelros
Capitula 4 Laços 1 179

b. ires =··O;
for index = 10:-2:4
4]lJ-O qüe pode sedeito.para que ~ã- matri~-Il.Umérica se comporte como más-
cara lógica para operações vetoriais? Como podemos remover o atributo logi-
if index == O cal de uma matriz numérica?
continue;
end 4.11 Modifique o programa ball do Exemplo 4.8, substituindo os laços for
internos por cálculos vetorizados.
ires= ires+ index;
end 4.12 Modifique o.programa ball do Exemplo 4.8 para ler a aceleração da gravi-
e. ires = O; dade em locais específicos e calcular o percurso máximo da bola para
for index = 10:-2:4 essa aceleração. Após modificar o programa, execute-o com aceleraçéH:?s de
if index == O -9,8 m/ s2, -9,7 m/ s2 e -9,6 m/ s2• Que efeito provoca a redução na atração
break; gravitacional sobre o percurso da bola? Que efeito provoca a redução na
end atração gravitacional sobre o ângulo ótimo 8 de lançamento da bola?
ires= ires+ index; 4.13 Modifique o programa ball do É~emplo 4.8 para ler a velocidade inicial de
end --~- lançamento da bola. Após modificar o programa, execute-o com velocidades
d. ires= O; iniciais de 10 m/ s, 20 m/ se 30 m/ s. Que efeito provoca a alteração da veloci-
for indexl = 10:-2:4 dade inicial v0 no percurso da bola? Que efeito tem isso sobre o ângulo ótimo
for index2 == 2:2:indexl 8 de lançamento da bola?
if index2 == 6 4.14 O programa lsqfi t do Exemplo 4.7 solicitava ao usuário o número de pon-
break tos antes de fornecer os valores. Modifique o programa para que ele leia urna
end quantidade arbitrária de valores utilizando um laço while e pare de ler
ires= ires+ index2; dados quando o usuário pressionar a tecla Enter sem digitar nenhum valor.
end Teste seu programa utilizando os mesmos dois conjuntos de dados utilizados
end no Exemplo 4.7. (Dica: a função input retorna uma matriz vazia ( []) se um
usuário pressiona Enter sem fornecer dados. Você pode usar a função
4.8 Examine os laços while abaixo e determine o valor de ires no final de cada isempty para testar se uma matriz é vazia e parar de ler os dados quando
um, e também o número de vezes que cada laço é executado. uma matriz vazia for detectada.)
a. ires = 1; 4.15 Modifique o programa lsqf i t do Exemplo 4.7 para ler os valores de entrada
while mod(ires,10) ~= O de um arquivo ASCII chamado inputl. dat. Os dados no arquivo devem
ires= ires+ l; ser organizados em linhas, com um par (x,y) em cada linha, conforme
end mostrado a seguir:
b. ires = 2; 1.1 2.2
while ires<= 200 2.2 3.3
ires= ires"2;
end Teste seu programa utilizando os mesmos dois conjuntos de dados utilizados
c. ires = 2; no Exemplo 4.7. (Dica: utilize o comando load para ler os dados e colocar em
while ires> 200 uma matriz inputl, depois armazene a primeira coluna de inpi.;tl na
ires= ires"2; matriz x e a segunda coluna na matriz y.)
end
4.16 Função de Ajuste de Mínimos Quadrados do MATI.,AB. O MATLAB contém
4.9 Qual o conteúdo da matiz arrl após a execução dos seguintes conjuntos de uma função-padrão para calcular o ajuste de mínimos quadrados a um poli-
declarações? nômio. A função polyfi t calcula o ajuste de mínimos quadrados de um
a. arrl = [1 2 3 4; 5 6 7 8; 9 10 11 12); conjunto dedados-a-um-poliHônào de grau N.
mask = mod(arrl,2) == O; p(x) = ªnXn + ªn-lxn-1 + ... + a1x + ªo (4.12)
arrl(mask) = -arrl(mask); onde N pode ser qualquer valor maior que ou igual a 1. Note que, para N == 1,
b. arr 1 = [ 1 2 3 4 ; 5 6 7 8 ; 9 1 O 11 12 ] ; o polinômio é uma equação linear, com inclinação igual ao coeficiente a1 e
arr2 = arrl <= 5; interseção no eixo y igual ao coeficiente a0 • A forma dessa função é
arrl(arr2) = O; p = polyfit(x,y,n)
arrl(~arr2) = arrl(~arr2) ."2; onde x e y são vetores com os componentes x e y, e n é o grau.
180 1 Programação em MATLABS' para Engenheiros Capitulo 4 Laços 1 181

Escreva um programa que calcule o ajuste de mínimos quadrados de onde


um conjunto de dados a uma linha reta, utilizando polyfi t. Desenhe o
i0 voltagem no diodo, em volts
resultado produzido pelo programa que utiliza o polyfit junto com o resulta-
v0 corrente no diodo, em amps
do produzido pelo 1 sqf i t para os dados do Exemplo 4.7.
10 = perda de corrente no diodo, em amps
4.17 O programa doy, no Exemplo 4.3, calcula o dia do ano associado a um mês, dia q = carga de um elétron, 1,602 x rn-19 coulombs
e ano. Aquele programa não verifica se a data fornecida pelo usuário é válida. k = constante de Boltzmann, 1,38 x 10-23 joule/K
Ele aceita valores absurdos para meses e dias, e os cálculos com esses valores T = temperatura, em kelvins (K)
produzem resultados desprovidos de significado. Modifique o programa para
A perda de corrente I0 do diodo é de 2,0 µA. Escreva um programa que calcule a
verificar os valores fornecidos antes de utilizá-los. Se as entradas forem invá-
corrente através do diodo para todas as voltagens de-1,0 V a +o,6 V, com inter-
lidas, o programa deve informar ao usuário o que está errado e encerrar a exe-
valos de 0,1 V. Repita esse processo para as seguintes temperaturas: 75 ºF, 100 ºF
cução. O ano deve ser um número maior que zero, o mês precisa ser um número
entre 1 e 12 e o dia deve ser um número entre 1 e um máximo que dependa do e 125 ºF. Crie um diagrama da corrénte como função da voltagem aplicada, com
------a&-€UFVa5-are-as-três diferentes-temperaturas-apareeen<lo em eores d±fetentes.
mês. Utilize uma construção swi tch para implementar os limites para o dia. 11'
4.18 Escreva um programa MATLAB para avaliar a função
. ;,
1
.... ~
4.21 Tensão em um Cabo. Um objeto de 200 libras deve ser pendurado na ponta
de um eixo rígido horizontal com 8 pés de comprimento e peso desprezível,
1
y(x) = ln 1-x conforme mostrado na Figura 4.5. O eixo está afixado na parede por um pivô
e é suportado por um cabo de 8 pés de comprimento preso um pouco acima
para qualquer valor de x fornecido pelo usuário, onde ln é o logaritmo natu- na parede. A tensão nesse cabo é dada pela equação
ral (logaritmo na base e). Escreva o programa com um laço while, a fim de
que o programa repita o cálculo para cada valor legal de x fornecido para o T= W. lc. lp (4.14)
programa. Quando um valor ilegal de x for fornecido, encerre o programa. a✓ lp2-d 2
(Qualquer x ~ 1 é um valor ilegal.) onde T é a tensão no cabo, W é o peso do objeto, lc é o comprimento do cabo,
4.19 Números de Fibonacci. O n-ésimo número de Fibonacci é definido pelas lp é o comprimento do eixo e d é a distância no eixo que indica o ponto
equações recursivas abaixo: de afixação do cabo. Escreva um programa para determinar a distância d
f(l) = 1 para afixar o cabo no eixo, minimizando a tensão no cabo. Para isso, o
f(2) = 2 programa deve calcular a tensão no cabo em intervalos regulares de 1 pé, de
f(n) = f(n -1) + f(n - 2) d = 1 até d = 7 pés, e localizar a posição d que produza a tensão mínima. O
programa deve também desenhar a tensão do cabo como função de d, com
Portanto, f (3) = f(2) +f(l) = 2 + 1 = 3, e assim por diante, para números maiores.
títulos e legendas apropriadas para os eixos.
Escreva um arquivo M para calcular e imprimir o n-ésimo número de
Fibonacci para n > 2, onde n é fornecido pelo usuário. Utilize um laço while
para efetuar o cálculo.
.~.

l·t·
li.
l
i::;
.

Figura 4.4 Um diodo semicondutor.

4.20 Corrente Através de um Diodo. A corrente que flui através do diodo semi-
condutor mostrado na Figura 4.4 é dada pela equação
-ri-. _•-· d

W= 200 lb

(4.13)
~1-_
~._
Figura 4.5 Um peso de 200 libras suspenso por uma barra rigida, suportada por um cabo.
'~ i
1 ., ,

~ ·ÍI
'l
182 1 Programação em MATlA~ para Engenheiros
Capitulo 4 Laços 1 183

4.22 Crescimento de Bactérias. Suponha que um biólogo efetue um expe-rf:rrierifo Escreva um programa MATLAB que aceite um número arbitrário de nú-
11 de medida da taxa de reprodução assexuada de um tipo específico de bac- meros positivos e calcule a média harmônica dos números. Utilize qualquer
li térias em diferentes meios de cultura. O experimento mostra que no Meio A método que você preferir para ler os valores de entrada. Teste seu programa
as bactérias se reproduzem uma vez a cada 60 minutos, e uma vez a cada 90 calculando a média harmônica dos números 10, 5, 2 e 5.
li minutos no Meio B. Assuma que uma única bactéria seja colocada em um
meio de cultura no início do experimento. Escreva um programa para calcular 4.27 Escreva um único programa que calcule as médias aritmética, rms, geomé-
e desenhar o número de bactérias presentes em cada cultura em intervalos de trica e harmônica para uma coleção de números positivos. Utilize o método
três horas, do início do experimento até completar 24 horas. Faça dois desenhos, que você preferir para ler os dados de entrada. Compare esses valores para
um com eixos xy lineares e um linear-log (semilogy). Como se comparam as seguintes coleções de números:
as quantidades de bactérias nos dois meios após 24 horas? a. 4, 4, 4, 4, 4, 4, 4
4.23 Decibéis. Os engenheiros freqüentemente medem a razão entre duas me- b. 4, 3, 4, 5, 4, 3, 5
didas de potência em decibéis, ou dB. A equação da razão entre duas medidas c. 4, 1, 4, 7, 4, 1, 7
de potência em decibéis é --~~d.-1, 2, 3, 4, 5, 6, 7~-

(4.15)

onde P 2 é a potência medida e P 1 é uma medida de referência. Assumindo


que a potência de referência Pi seja de 1 watt, escreva um programa para cal-
cular o nível de decibéis correspondente a potências entre 1 e 20 watts, em
intervalos de 0,5 W. Desenhe a curva dB versus potência em escala log-linear.
4.24 Média Geométrica. A média geométrica de um conjunto de números de Xi até
x 11 é definida como a raiz n-ésima do produto dos números
média geométrica= -:.}x 1 x2 x3 .. :-x" (4.16) TMEF

Escreva um programa MATLAB que aceite um número arbitrário de valores


positivos e calcule a média aritmética e a média geométrica dos números. Figura 4.6 Um sistema eletrônico composto de três subsistemas com TMEFs conhecidos.
Utilize um laço while para receber os números fornecidos e encerre o
fornecimento com um número negativo. Teste seu programa calculando as
médias aritmética e geométrica dos números 10, 5, 2 e 5. 4.28 Tempo Médio entre Falhas. A confiabilidade de um equipamento eletrônico
4.25 Média RMS. A média de raíz quadrada (rms) é outra maneira de calcular uma é em geral medida em termos do tempo médio entre falhas (TMEF)- o tempo
média para uma coleção de números. A média rms de uma série de números é médio que o equipamento pode operar antes de ocorrer uma falha. Para sis-
a raiz quadrada da média aritmética dos quadrados dos números temas grandes compostos de diversos equipamentos eletrônicos, é usual
determinar o TMEF de cada componente e então calcular o TMEF global para
média rms = ✓
-l 'ix?
N
(4.17) o sistema a partir das taxas de falhas individuais. Se o sistema for estruturado
N i=l como na Figura 4.6, cada componente precisa estar em ordem para que o sis-
Escreva um programa MATLAB que aceite um número arbitrário de valores tema todo funcione, e o TMEF global pode ser calculado por
positivos e calcule a média rms dos números. Solicite ao usuário o número de
1
valores a serem fornecidos e utilize um laço for para ler os números. Teste TMEFsis= (4.19)
seu programa calculando a média rms dos números 10, 5, 2 e 5. 1 1 1
- - - + - - - + ... + - - -
~~-~~- -TMEF 1 TME~ TMEFn
4.26 Média Harmônica. A média harmônica é ainda outra maneira de calcular uma
média para uma coleção de números. A média harmônica de uma coleção de Escreva um programa para ler o número de componentes em série de um sis-
números é dada pela equação tema e o TMEF de cada componente, e então calcule o TMEF global para o
sistema. Para testar seu programa, determine o TMEF para um radar com-
N
média harmônica = (4.18) posto de uma antena com TMEF de 2.000 horas, um transmissor com TMEF
1 1 1 de 800 horas, um receptor com TMEF de 3.000 horas e um computador com
- + - + ... +
Xi X2 XN TMEF de 5.000 horas.

.~=.·
Capítulo 5
Funções Definidas
pelo Usuário ··---~---------

No Capítulo 3, aprendemos a importância de um bom projeto de programa. A técnica


básica empregada é o projeto top-down. Nesse projeto, o programador inicialmente
estabelece o problema a ser resolvido e os dados de entrada e de saída. Em seguida,
descreve o algoritmo a ser implementado pelo programa em linhas gerais, e aplica
decomposição para quebrar o algoritmo em subdivisões lógicas denominadas subtarefas.
Então, o programa quebra cada subtarefa até conseguir pequenas tarefas, cada umà das
quais simples e de fácil entendimento. Finalmente, as tarefas individuais são transfor-
madas em código MATLAB.
Embora tenhamos seguido esse processo de projeto em nossos exemplos, os resul-
tados têm sido restritos, pois tivemos de combinar em um programa maior o código
final MATLAB gerado para cada subtarefa. Não tivemos a oportunidade de codificar,
verificar e testar cada subtarefa independentemente antes de combinar as subtarefas no
programa final.
Felizmente, o MATLAB tem um mecanismo especial projetado para facilitar o
desenvolvimento e a depuração de subtarefas independentemente, antes de construir
o programa final. É possível codificar cada subtarefa como uma função separada, e cada
função pode ser testada e depurada independentemente das outras no programa.
Funções bem-projetadas reduzem enormemente o esforço requerido em um grande
projeto de programação. Dentre os benefícios das funções bem-projetadas, ternos:
1. Teste Independente das Subtarefas
Cada subtarefa pode ser escrita como uma unidade independente. A subtarefa pode
ser tesfaâaseparaâamente para garantir o bom funcionamento antes de combiná-la
no programa maior. Esse passo é conhecido como teste unitário. Ele elimina uma
fonte importante de problemas antes mesmo de construir o programa final.
2. Código Reutilizável
Em muitos casos, a mesma subtarefa básica pode ser requerida em várias partes
de um programa. Por exemplo, pode ser preciso ordenar uma lista de valores
em ordem ascendente muitas vezes dentro de um programa, ou mesmo em
186 1 hogramação em MATLAfJ/9 para Engenheiros
1 Capítulo 5 Funções Definidas pelo Usuário 1 187

outros programas. Podemos projetar, codificar, testar e depurar urna função diretamente pela Janela de Comandos. Arquivos de script compartilham o espaço de
para a ordenação, e então reutilizar essa função toda vez que a ordenação for trabalho da Janela de Comandos, assim, qualquer variável definida antes de o arquivo
necessária. Esse código reutilizável tem duas vantagens principais: reduz o de script iniciar a execução é visível para ele, e as variáveis por ele criadas permanecem
esforço total de programação requerido e simplifica a depuração, já que a no espaço de trabalho após o término da execução do arquivo. Um arquivo de script não
função de ordenação precisa ser depurada somente urna vez. tem argumentos de entrada e não retoma resultados, mas os arquivos de script podem
3. Isolamento de Efeitos Colaterais Indesejados se comunicar entre si pelos dados deixados no espaço de trabalho.
As funções recebem dados do programa, que as invoca por meio de urna lista de Em contraste, urna função MATLAB é um tipo especial de arquivo M executado
variáveis denominada lista de argumentos de entrada, e retoma os resultados em um espaço de trabalho independente. Ela recebe dados de entrada por meio de uma
para o programa por meio de urna lista de argumentos de saída. As únicas lista de argumentos de entrada, e retoma resultados por uma lista de argumentos de
variáveis do programa que podem ser vistas pela função são aquelas na lista de argu- saída. A forma geral de uma função MATLAB é
mentos de entrada, e as únicas variáveis da função que podem ser vistas pelo programa function [outargl, outarg2, ... ) = fnarne (inargl, inarg2, ... )
são aquelas na lista de argumentos de saída. Isso é muito importante, pois os erros -%"·· Hl comentário
acidentais de programação dentro de urna função podem somente afetar as % Mais um comentário
I' variáveis dentro da função onde ocorreu o erro.
QJ.lando um programa grande é escrito e liberado para uso, ele precisa ser mantido. (Código executável)
A. mani-1tenção de programas envolve consertar bugs e modificar o programa para lidar
1::om cih:unstâncias novas e inicialmente não previstas. O programador que modifica (return)
um pratrama durante a manutenção freqüentemente não é a pessoa que originalmente
A declaração function deter~ina o início da função. Ela especifica o nome da função
(J escre""eu. Em um programa mal-escrito, é comum que o programador que modifica
e as listas de argumentos de entrada e de saída. A lista de argumentos de entrada aparece
1:fetue l-\ma alteração em uma região do código e essa alteração provoque efeitos cola-
entre parênteses após o nome da função, e a lista de argumentos de saída aparece entre
terais il\desejados em partes totalmente diferentes do programa. Isso ocorre porque
homes l:le variáveis são reutilizados em partes diferentes do programa. Quando o pro- colchetes à esquerda do sinal de igual. (Se existir somente um argumento de saída,
gramaclor altera os valores em algumas das variáveis, eles são acidentalmente captu- os colchetes são dispensáveis.) ·
rados e utilizados em outras partes do código. A lista de argumentos de entrada é uma lista de nomes que representam os valores
O uso de funções bem-projetadas minimiza esse problema pela ocultação de dados. que serão passados por quem ativou a função. Esses nomes são chamados argumentos
As variliveis no programa principal não são visíveis para a função (exceto aquelas na lista soltos. São marcadores para os valores efetivamente passados pelo ativador quando a
de arg1-1mentos de entrada) nem podem ser acidentalmente modificadas por algo que função é invocada. Similarmente, a lista de argumentos de saída contém uma lista de
Qcorra <::!entro da função. Assim, erros ou alterações nas variáveis da função não podem argumentos soltos que são marcadores para os valores retomados para o ativador
acidenfalmente provocar efeitos colaterais indesejados em outras partes do programa. quando a função termina a sua execução.
Uma função é invocada utilizando o seu nome em uma expressão, juntamente com
uma lista de argumentos efetivos. Uma função pode ser invocada pela digitação do seu
nome diretamente na Janela de Comandos, ou pela inclusão do seu nome em um arquivo
de script ou em outra função. Quando a função é invocada, o valor do primeiro argu-
Quebre em funções grandes tarefas no programa, sempre que isso for útil para os mento efetivo passa para o primeiro argumento solto, e assim por diante, para cada par
import<:1.ntes benefícios do teste independente dos componentes, da reutilização e do argumento efetivo/ argumento solto.
isolam/.'into de efeitos colaterais indesejados. A execução começa no topo da função e pára quando encontra uma declaração
return ou o final da função. Como a execução é encerrada de qualquer maneira no
final da função, a declaração return não é na realidade obrigatória na maioria das
funções, e porisso é .usada.raramente Cada item na lista de argumentos de saída-pr.e-
cisa aparecer à esquerda de pelo menos uma declaração de atribuição na função.
Quando a função termina, os valores armazenados na lista de argumentos de saída são
5.1 ltitrodução a Funções MATLAB retomados para o ativador e podem ser utilizados em outros cálculos.
As linhas iniciais de comentários em uma função têm um objetivo especial. A
Todos ~s arquivos M vistos até aqui foram arquivos de script. Arquivos de script são primeira linha de comentário depois da declaração de função é a linha de comentário
simpletlmente coleções de declarações MATLAB armazenadas em um arquivo. Quando um Hl. Ela deve sempre conter um resumo - de uma linha - do objetivo da função. A
arquivC) de script é executado, o resultado é o mesmo de executar todos os comandos importância especial dessa função decorre de ela ser encontrada e exibida pelo comando
188 1 Programaçlo em MATLA89 para Engenheiros
1
.. :r- Capltulo 5 Funç6es Definidas pelo Usuário 1 189
·····--
1
lookfor. As linhas de comentários que vão da linha Hl até a primeira linha em bran- % Get input data.
co ou a primeira declaração executável são exibidas pelo comando help e pela Janela disp ( 'Calcula te the distance between two points:');
de Ajuda. Elas devem conter um resumo breve de como utilizar a função. ax input ( 'Enter X value of point a: ');
Um exemplo simples de função definida pelo usuário é apresentado abaixo. A ay input ( 'Enter y value of point a: ,);
função dist2 calcula a distância entre os pontos (x 1, y1) e (x:z, y2) em um sistema de bx input ( 'Enter X value of point b: ,);
'.
,,. coordenadas cartesianas. by input('Enter y value of point b: ');
''
1
function distance = dist2 (xl, yl, x2, y2) % Evaluate function
1' % DIST2 Calculate the distance between two points result = dist2 (ax, ay, bx, by);
% Function DIST2 calculates the di-s.tance between
% two points (xl,yl) and (x2,y2) in a Cartesian % Write out result.
% coordinate system. fprintf{'The distance between points a and bis %f\n' ,result);
%
% Calling sequence:
% res = dist2(xl, yl, x2, y2) » test_dist2
% Define variables: Calcula te the distance between two points:
% xi x-position of point 1 Enter X value of point a: 1
% yl y-position of point 1 Enter y value of point a: 1
% x2 x-position of point 2 Enter X value of point b: 4
% y2 y-position of point 2 Enter y value of point b: 5
% distance Distance between points The distance between points a and bis 5.000000
% Record of revisions:
% Date Programmer Esses resultados estão corretos, conforme podemos verificar com cálculos à q,.ão
Description of change
simples de efetuar.
% =====--=== ===-------===----=---
% 12/15/98 S . J. Chapman• Original code A função dis t2 também dá suporte ao subsistema de ajuda do MATLAB. Se digi-
tarmos "help dist2", os resultados serão:
% Calculate distance.
distance = sqrt((x2-xl) .A2 + {y2-yl) ,A2); » help dist2

Essa função tem quatro argumentos de entrada e um argumento de saída. Um arquivo DIST2 Calculate the distance between two points
de script simples que utiliza essa função é apresentado a seguir. Function DIST2 calculates the distance between
two points (xl,yl) and {x2,y2) in a Cartesian
% Script file: test_dist2.m coordinate system.
%
% Purpose: Calling sequence:
% This program tests function dist2. res = dist2(xl, yl, x2, y2)
%
De maneira similar, se digitarmos "lookfor distance", obteremos o resultado
% Record of revisions:
% Date Programmer Description of change » lookfor distance
% =======-=====--====== DIST2 Calculate the distance between two points
% 12/15/98 S. J. Chapman Original cede MAHAL --Mahal-anooi-s--d-i-s-l'.-irRee--,----------------
% DIST Distances between vectors.
11
% Define variables: NBDIST Neighborhood matrix using vector distance.
,I % ax x-position of point a

1,
NBGRID Neighborhood matrix using grid distance.
% ay y-position of point a fir NBMAN Neighborhood matrix using Manhattan-distance.
% bx x-position of point b
% by y-position of point b Para observar o comportamento do espaço de trabalho antes, durante e após a exe-
% result Distance between the points ---
cução da função, vamos carregar a função dist2 e o arquivo de script test_dist2 no
'
:0.a
190 1 Programação em MATLA~ para Engenheiros
1
... Capítulo 5 Funções Definidas pelo Usuário 1 191

f
1
1(';.

1
%
% Purpose:
% This program tests function dist2. lxl 8 double auay
lxl 8 double auay
% Recard of revi3ions: llcl 8 double a,tay
Date Programrner Description of change lxl 8 double auay

12/15/98

% Define variables:
S. J. Chaprnan Original code
f .

t"1al!"""'-

ax
ay
bx
by
result
x-position of point a
y-position of point a
x-position of point b
y-position of point b
Distance between the points
i (a)

% Get input data.


di8p('Calculate the
ax = input ( • Ente r X
distance
value of point a: .
between two points: ');
);
input ( • Ente r y
input ( • Enter x
input (•Ente r y
value of
value of
value of
point a:
point b:
point b:
.
') ;
);
');
lxl 8 double auay
% Evaluate function lxl 8 double auay
result = di8t2 (ax, ay, bx, by); lxl 8 double anay
lxl 8 double auay

distance between points a and bis lf\n',reeul.t);

(b)

Figura 5.1 Arquivo M test_dist2 e função dist2 carregados no depurador, com pontos de
inspeção antes, durante e após a chamada da função.

depurador MATLAB, e ajustarmos os pontos de inspeção para antes, durante e após a


chamada da função (ver Figura 5.1). Quando um programa pára no ponto de inspeção llcl 8 double attay
lxl 8 double actay
antes da chamada da função, o espaço de trabalho fica como mostra a Figura 5.2(a). Note
lxl 8 double array
que as variáveis ax, ay, bx e by estão definidas no espaço de trabalho. Quando o pro-
lxl 8 double atray
grama pára no ponto de inspeção dentro da chamada da função, o espaço de trabalho
fica como mostra a Figura 5.2(b). Note que as variáveis xl, x2, yl, y2 e distance estão
definidas no espaço de trabalho, e que as variáveis definidas no arquivo M ativador
desapareceram. Quando o programa pára no ponto de inspeção após a chamada da
função, o espaço de trabalho fica como mostra a Figura 5.2{c). Observe que as variáveis (e)
originais estão de volta, com a variável resul t adicionada para conter o valor retor-
nado pela função. Essas figuras mostram que o espaço de trabalho da função é diferente Figura 5.2 (a) O espaço de trabalho antes da chamada da função. (b) O espaço de trabalho
do espaço de trabalho do arquivo M ativador. durante a chamada da função. (e) O espaço de trabalho após a chamada da função.
192 1 Programação em MATIAS® para Engenheiros 1 Capítulo 5 Funções Definidas pelo Usuário 1 193

5.2 Passagem-de variãveis-enfMAn~B: ____


t y
O Esquema de Passagem por Valor
Os programas MATLAB se comunicam com suas funções utilizando um esquema de
passagem por valor. Quando ocorre uma chamada de função, o MATLAB faz uma cópia
dos argumentos e os passa para a função. Essa cópia é muito significativa: mesmo se a
função modificar os argumentos de entrada, ela não afetará os dados originais no ati-
vador. Isso ajuda a prevenir efeitos colaterais indesejáveis em que um erro na função
possa modificar de maneira não intencional as variáveis no programa ativador.
Esse comportamento é ilustrado na função a seguir. Essa função tem dois argumentos
de entrada: a e b. Durante os cálculos, ela modifica os dois argumentos de entrada.
function out = sample(a, b)
fprintf{'Exemplo durante: a %f, b %f %f\n' ,a,b);
a = b(l) + 2*a;
b=a.*b; Figura 5.3 Um ponto P em um plano cartesiano pode ser localizado por suas coordenadas
out =a+ b(l); retangulares (x,y), ou por suas coordenadas polares (r,0).
fprintf ('Exemplo durante: a = %f, b = %f %f\n', a,b);

Um programa de teste simples para chamar essa função é apresentado abaixo.


a=2;b [64]; •
fprintf('Exemplo antes: a= %f, b = %f %f\n',a,b); Exemplo 5.1 - Conversão de Retangular para Polar
out = sample(a,b};
fprintf{ 'Exemplo depois: a = %f, b = %f %f\n' ,a,b); A localização de um ponto em um plano cartesiano pode ser expressa por coordenadas
fprintf{ 'Exemplo depois: out %f\n' ,out); retangulares (x,y) ou coordenadas polares (r,0), conforme mostrado na Figura 5.3. A
relação entre esses dois conjuntos de coordenadas é dada por estas equações:
Quando esse programa é executado, os resultados são
X= r COS 0 (5.1)
» test_sample
Exemplo antes: a 2.000000, b 6.000000 4.000000 y = r sin e (5.2)
Exemplo durante: a 2.000000, b 6.000000 4.000000
Exemplo durante: a 10.000000, b = 60.000000 40.000000 r = ✓ x2 + y2 (5.3)
Exemplo depois: a 2.000000, b = 6.000000 4.000000
Exemplo depois: out = 70.000000 e= tan- 1 lL (5.4)
X

Note que a e b foram modificadas durante a execução da função sample, mas essas
mudanças não tiveram efeito sobre os valores no programa ativador. Escreva duas funções, rect2polar e polar2rect, que convertam coordenadas de
Usuários da linguagem C devem estar familiarizados com o esquema de passagem retangular para polar, e vice-versa, com o ângulo 0 expresso em graus.
por valor, pois C utiliza esse esquema para os valores escalares passados para funções.
Entretanto, C não utiliza o esquema de passagem por valor para matrizes, assim, uma Solução
modificação indesejável para uma matriz solta em uma função C provoca efeitos cola- Vamos agora -aplicar-nossa-abordagem-padrão para resolução de problemas, ·e-assim
terais no programa ativador. O MATLAB é uma melhoria nesse sentido, pois utiliza a criar essas funções. Note que as funções trigonométricas do MATLAB utilizam radianos,
passagem por valor tanto para escalares como para matrizes.1

melhor das duas abordagens: ele analisa cada argumento de cada função e determina se a função mo-
A implementação da passagem de argumentos em MATLAB é na realidade mais sofisticada do que difica ou não o argumento. Se a função modifica o argumento, o MATLAB o copia. Se a função não
essa discussão sugere. Conforme apontado acima, a cópia associada com a passagem por valor ocupa modifica o argumento, o MATLAB simplesmente aponta o valor existente no programa ativador. Essa
bastante tempo, mas protege contra efeitos colaterais indesejáveis. O MATLAB na realidade utiliza o prática acelera o programa e preserva a proteção contra efeitos colaterais!
194 1 Programação em MATLAIJIII para. Engenheiros 1 Capitulo 5 FunçfJlls Definidas pelo Usuário 1 195
--··t·
então precisamos converter·cle graus parfl:acliãhos, · e· vice-versa, ri.à resolução desse !is "1focora--oI·-:{evisions:
probleni.a. A relação t:,ásica entre graus e radianos é % Date Prograrnmer Description of change
180° = 1t radianos (5.5)
% -----=-=-=-==========
% 09/19/00 S • J. Chapman Original cede
1 1. Estabeleça o problema x r * cos{theta * pi/180);
Uma descriç30 sucinta do problema é: y r * sin(theta * pi/180);
Escreva uma fanção para converter uma localização em um plano cartesiano, expressa
em coordenadas retangulares, nas coordenadas polares correspondentes, com o ângulo 8 O código MATLAB para a função rect2polar aparece a seguir.
expresso em grllus. Escreva também uma função para converter uma localização em um function [r, thetal = rect2polar(x,y)
plano cartesiano, expressa em coordenadas polares, com o ângulo 8 expresso em graus, %RECT2POLAR Convert rectangular to polar coordinates
nas coordenadas retangulares correspondentes. % Function RECT2POLAR accepts,. the rectangular coordinates
2. Defina as entradas e saídas % Cx. y) and conver.ts_.them. .in.to.__the._:polar-..coor.dinateS------
As entradas para a função rect2polar são a localização retangular (x,y) de um % {r,theta), where theta is expressed in degrees.
ponto. As saídas da função são a localização polar (r, 0) do ponto. As entradas %
da função poJ.ar2rect são a localização polar (r, 0) de um ponto. As saídas da % Calling sequence:
função são a localização retangular (x,y) do ponto. % [r, theta] = rect2polar(x,y)
3. bescreva o algoritmo % Define variables:
Essas funções; são muito simples, então podemos escrever diretamente o % r ~ength of polar vector
i,seudocódigo para elas. O pseudocódigo para a função polar2rect é % theta Angle of vector in degrees
% x x-position of point
~ +- r * cos(theta * pi/180)
% y y-position of point
~ +- r * sin{theta * pi/180)
% Record of revisions:
() pseudocódigo para a função rect2polar utiliza a função atan2, pois
% Date Programmer Description of change
a.quela função opera nos quatro quadrantes do plano cartesiano. (Procure essa
%
função nos sistemas de ajuda do MATLAB!)
% 09/19/00 S • J. Chapman Original code
t- +- sqrt( x.A2 + y .A2)
theta +- 180/pi * atan2(y,x) r sqrt( x.A2 + y .A2 )
theta = 180/pi * atan2(y,x)
4. 'I'ransforme o itlgoritmo em declarações MATLAB
O código MA1LAB para a função polar2rect é este: Observe que essas duas funções incluem informação de ajuda, por isso fun-
cionarão apropriadamente com o subsistema de ajuda do MATLAB e com o
fUI1ction [x, Yl = polar2rect(r,theta) comando lookfor.
%POLAR2RECT convert rectangular to polar coordinates
% function POLAR2RECT accepts the polar coordinates 5. Teste o programa
% (r,theta), where theta is expressed in degrees, Para testar essas funções, vamos executá-las diretamente pela Janela de Co-
% 3nd converts them into the rectangular coordinates mandos do MATLAB. Vamos testá-las utilizando o triângulo 3-4-5, familiar
% (~,y). para a maioria das pessoas desde o curso secundário. O ângulo menor do triân-
% '. gulo 3-4-5 é de aproximadamente 36,87°. Vamos também testar a função nos
Jt
% Càlling sequence: T- quatm~uadr.antes.do.plano cartesiano para garaRtH EJ:Ye as eew1ersões estejam
% (x, y] ~ polar2rect(r,theta) "'·
; corretas em todos os pontos.
% D~fine variables: 1 » [r, theta] = rect2polar(4,3)
:7
% r Length of polar vector # r
% theta Angle of vector in degrees 1 5
% x x-position of point theta
% y y-position of point 36.8699
·1

:'~;-. L------------------=-==::::========================-----
196 1 Programação em MATLAIJ" 1w,1 111v1111h6iros Capitulo 5 Funções Definidas pelo Usuário 1 197

» [r, th.eta] ~ rect2polar(-~,3) para o maior) ou descendente (do maior para o menor). Por exemplo, suponha que você
r seja um zoólogo estudando uma grande população de animais e queira identificar os
5 5% da população com os maiores animais. A forma mais direta de abordar esse proble-
theta ma seria ordenar em ordem ascendente os tamanhos de todos os animais na população
143.1301 e pegar os 5% de valores mais altos.
» [r, th.eta] '= rect2polar(-~,-3) Ordenar dados em ordem ascendente ou descendente parece ser uma tarefa fácil.
r Afinal, fazemos isso o tempo todo. Para nós é simples ordenar os dados {10, 3, 6, 4, 9)
5 na ordem (3, 4, 6, 9, 10). Como fazemos isso? Primeiro, varremos os dados de entrada
theta (10, 3, 6, 4, 9) para encontrar o menor valor na lista, (3), depois varremos os dados
-143.1:301
restantes {10, 6, 4, 9) para encontrar o menor valor seguinte, (4), e continuamos até que
» [r, th.eta] '= rect2polar(4,-3)
toda a lista esteja ordenada.
r Na realidade ordenar ode ser uma tarefa bastante difícil. Com o crescimento da
5
quantidade de valores a serem ordenados, o tempo requerido para executar essa tarefa
theta
simples descrita acima cresce rapidamente, pois precisamos varrer o conjunto de dados de
-36.8699
entrada uma vez para cada valor colocado em ordem. Para conjuntos de dados muito
» [x, y] = POlar2rect(S,36.~699)
grandes, essa técnica demora muito para ser considerada prática. Pior: como vamos
X
ordenar os dados se houver números em demasia que não caibam todos na memória
4.oooo
do computador? O desenvolvimento de técnicas eficientes para ordenação de grandes
y
3.oooo
conjuntos de dados é uma área ativa de pesquisas e assunto de disciplinas acadêmicas
» [x, y] = POlar2rect(5,143,1301} por si só.
X
Nesse exemplo, vamos nos confinar ao algoritmo mais simples possível para
-4.QOOO ilustrar o conceito de ordenação. Esse algoritmo muito simples é denominado orde-
y nação por seleção. Ele é simplesmente uma implementação em computador da
3.oooo matemática mental descrita acima. O algoritmo básico para a ordenação por seleção é
» [x, y] = POlar2rect(5,-144.1301) apresentado a seguir.
X
1. Percorra a lista de números para localizar o menor valor nela. Coloque esse
-4.QÜÜÜ
valor no começo da lista, trocando-o com o valor que estiver originalmente
y
nessa posição. Se o valor na frente da lista já for o menor não faça nada.
-3.QÜÜÜ
2. Percorra a lista de números da posição 2 até o final para localizar o próximo
» [x, y] = POlar2rect(5,-36,a699)
menor valor na lista. Coloque esse valor na posição 2 da lista, trocando-o com
X
o valor corrente nessa posição. Se o valor na posição 2 já estiver nessa posição,
4.oooo
não faça nada.
y
-3.QÜÜÜ
3. Percorra a lista de números da posição 3 até o final para localizar o terceiro
»
menor valor na lista. Coloque esse valor na posição 3 da lista, trocando-o com
o valor atual nessa posição. Se o valor na posição 3 já estiver nessa posição, não
Essas fu11ções ªparentemer1te funcionam corretamente em todos os quadrantes faça nada.
do plan() cartesiano. 4. Repita esse processo até a penúltima posição da lista ser alcançada. Após
• processar_a_pen_última posição da lista a ordenação estará completa
Note que, se estivermos ordenando N valores, o algoritmo de ordenação requer
N-1 percursos por meio dos dados para completar a ordenação.
• Esse processo está ilustrado na Figura 5.4. Corno temos cinco valores para
ordenar no conjunto de dados, vamos percorrer quatro vezes os dados. No pri-
Exemplo 5.2 - Or~enand() Dados
meiro percurso pelo conjunto de dados, o valor mínimo é 3, então o 3 é trocado
Em muitas aplicações Científicas e de engermaria, é necessário ordenar um conjunto de com o 10, que ocupa a posição 1. A segunda passada procura o valor mínimo

--
dados de entrada para que os números fic1uem todos em ordem ascendente {do menor nas posições de 2 a 5. O mínimo é 4, então o 4 é trocado com o 10, que ocupa a
198 1 Programaç5o em MATLAEJ1'} para Engenheiros Capítulo 5 Funções Definidas pelo Usuário 1 199

posição 2: A terceirapassada prorura o~valor mínimo nas pósiçõés de 3 a 5. O Desenvolva um programa para ler um número arbitrário de valores
mínimo é 6, que já está na posição 3, então nenhuma troca é efetuada. Final- numéricos da Janela de Comandos, ordenar os dados em ordem ascendente,
mente, a quarta passada procura o valor mínimo nas posições de 4 a 5. O mínimo utilizando uma função de ordenação separada, e escrever os dados ordenados
é 9, então o 9 é trocado com o 10 na posição 4, e a ordenação está completa. na Janela de Comandos.
2. Defina os dados de entrada e de saída
Os dados de entrada são valores numéricos digitados pelo usuário na Janela de
Comandos. A saída são os dados ordenados escritos na Janela de Comandos.
O algoritmo de ordenação por seleção é o algoritmo de ordenação mais fácil de en- 3. Descreva o algoritmo
tender, mas ele é computacionalmente ineficiente. Ele nunca deve ser aplicado a grandes Esse programa pode ser quebrado em três grandes passos:
conjuntos de dados (por exemplo, conjuntos com mais de 1.000 elementos). Ao longo dos Leia os dados de entrada~ coloque-os em uma matriz
anos, os cientistas de computação têm desenvolvido algoritmos de ordenação muito Coloque os dados em ordem ascendente
mais eficientes. As funções sorte sortrows d~finidas no MATLAB são extremamente Apresente os dados ordenados
eficientes e devem ser utilizadas em situações reais.
1: O primeiro passo é ler os dados. Precisamos solicitar do usuário o número de
'l valores a serem fornecidos, e então ler os dados. Como saberemos quantos va-
1

lores serão lidos, um laço for é apropriado para a leitura dos dados. O pseudo-
Vamos agora desenvolver uin programa para ler um conjunto de dados da Janela código detalhado é este:
de Comandos, ordená-los em ordem ascendente e exibir o conjunto ordenado de dados. Solicite do usuário a quantidade de valores
A ordenação será efetuada por uma função separada definida pelo usuário. Leia a quantidade de valores
Pré-aloque uma matriz de entrada
for ii = l:número de valores
3 3 3
Solicite o próximo valor
3
Leia o valor
10 4 4 4 end
A seguir, precisamos ordenar os dados utilizando uma função separada. Preci-
6 6 6 saremos passar nval s -1 vezes pelos dados, buscando o menor valor remanes-
cente a cada vez. Utilizaremos um ponteiro para localizar o menor valor de
4 4 9
cada passada. Encontrado o menor valor, ele será trocado com o topo da lista se
ainda não estiver lá. O pseudocódigo detalhado é apresentado a seguir:
9 9 10

i
Troca
i
Troca
i
Sem Troca
i
Troca
for ii = l:nvals-1
% Encontre o valor mínimo de a(ii) a a(nvals)
iptr f - ii
for j j = ii+l to nvals
Figura 5.4 Um exemplo que demonstra o algoritmo de ordenação por seleção. if a(jj l < a(iptr)
iptr f - j j
end
end
Solução %"iptL"agora-aponta para o menor valor, assim troque"a(iptr)
Esse programa precisa ser capaz de solicitar do usuário os dados de entrada, ordenar % e a(ii) se iptr ~= ii.
esses dados e apresentar os dados ordenados. O processo de projetar a solução desse if ii ~= iptr
problema é apresentado a seguir. temp f - a ( i i)
a ( ii) f - a ( iptr)
1. Descreva o problema a(iptr) f - temp
Ainda não especificamos o tipo dos dados a serem ordenados. Se os dados end
forem numéricos, então o problema pode ser apresentado da seguinte maneira. end
200 1 Programação em MATlAEfl' para Engenheiros Capítulo 5 Funções Definidas pelo Usuário 1 201

O passo final é apresentar os valores ordenados. Não precisamos refinar o O programa para ativar a função de ordenação por seleção é apresentado a
pseudocódigo para esse passo. O pseudocódigo final é a combinação de ler, seguir.
1
'1'
!1!
ordenar e apresentar o resultado.
% Script file: test_ssort.m
liiij 4. Transforme o algoritmo em declarações MATLAB %
O código MATLAB para a função de ordenação por seleção é apresentado a seguir. % Purpose:
function out = ssort{a) % To read in an input data set, sort it into ascending
%SSORT Selection sort data in ascending order % order using the selection sort algorithm, and to
% Function SSORT sorts a numeric data set into % write the sorted data to the Command Window. This
% ascending order. Note that the selection sorte % program calls function "ssort" to do the actual
% is relatively inefficient. DO NOT USE THIS % sorting.
% FUNCTION FOR LARGE DATA SETS. Use MATLAB's %
% "sort" function instead. % Record of revisions:
% Define variables: % Date Programmer Description of change
% a Input array to sort %
% ii Index variable % 12/19/98 S. J. Chapman Original code
% iptr Pointer to min value %
% jj Index variable
% Define variables:
% nvals Number of values in "a"
% array Input data array
% out Sorted output array
% temp Temp variable for swapping % ii Index variable
% nvals Number of input values
% Record of revisions:
% sorted Sorted data array
% Date Programmer Description of change
% % Prompt for the number of values in the data set
% 12/19/98 s. J. Chapman Original code nvals input('Enter number of values to sort: ');
% Get the length of the array to sort % Preallocate array
nvals = size{a,2); array = zeros{l,nvals);
% Sort the input array
for ii = 1:nvals-1 % Get input values
for ii = 1:nvals
% Find the minimum value in a(ii) through a(n)
iptr = ii; % Prompt for next value
for jj = ii+l:nvals string= ['Enter value ' int2str(ii) ,l;
if a(jj) < a(iptr) array(ii) = input{string);
iptr jj
end
end
end % Now sort the data
% iptr now points to the minimum value, so swap a{iptr) sorted = ssort(array);
% with a{ii) if ii -= iptr.
if ii -= iptr % Display the sorted r_e_s_u_l_t_.______________
temp = a ( ii) ; :Eprintf{ '\nsorted-ctata: \n, l ;
a(ii) = a(iptr); for ii = 1:nvals
a{iptr) = temp; fprintf(' %8.4f\n',sorted(ii));
end end
end 5. Teste o programa
% Pass data back to caller Para testar esse programa, vamos criar um conjunto de dados de entrada e exe-
out = a; cutar o programa. O conjunto de dados deve conter uma mistura de valores
202 1 Programação em MATLA8'3 para Engenheiros Capttulo 5 Funções Definidas pelo Usuário 1 203

-····-··-· -········ - - - - í i i i - -
positivos e negafü,:~~ e ~lo menos um valor duplicado para verificar se o pro- • nargchk Essa função retorna uma mensagem de erro se uma função for
grama funciona corretamente nessas circunstâncias. chamada com muitos ou poucos argumentos.
» test_ssort • errar Exibe mensagem de erro e interrompe a execução da função que
o produziu. Essa função é utilizada quando os erros de argu-
Enter nurnber of values to sort: 6
mentos são fatais.
Enter value 1: -5
Enter
Enter
Enter
value 2:
value 3:
value 4:
4
-2
3
1 • warning Exibe mensagem de aviso e continua a execução da função. Essa
função é utilizada quando os erros de argumentos não são fatais
e a execução pode continuar.
Enter value 5: -2 • inpu tname Essa função retoma o nome atual da variável que corresponde a
Enter value 6: o um número de ar~ento em particular.
Sorted data: ·---tr---,ai;rtanÇÕles-:nargtr.re-rra:rg<::>ucpodem ser usadas somente dentro de uma funçao
-5.0000 definida pelo usuário. Quando ativadas, elas retomam respectivamente o número de
-2.0000 argumentos de entrada e de saída. A função nargchk gera uma cadeia de caracteres
-2.0000 que contém uma mensagem-padrão de erro se uma função for chamada com muitos ou
0.0000 poucos argumentos. A sintaxe dessa função é
3.0000
4.0000 message = nargchk(min_args,max_args,num_args);
O programa fornece a resposta correta para nosso conjunto de dados de teste.
onde min_args é o número mínimo de argumentos, max_args é o número máximo de
Note que ele funciona para números positivos e negativos, bem como para argumentos e rnun_args é o número efetivo de argumentos. Se o número de argu-
números repetidos. mentos estiver fora dos limites admissíveis, uma mensagem-padrão de erro é gerada.
• Se o número de argumentos estiver dentro dos limites aceitáveis, uma cadeia de carac-
teres vazia é gerada. ·
A função errar é uma maneira-padrão de exibir uma mensagem de erro e inter-
romper a função definida pelo usuário, provocando um erro. A sintaxe dessa função é
5.3 Argumentos Opcionais errar ( 'rnsg' ) , onde rnsg é uma cadeia de caracteres com uma mensagem de erro.
Quando errar é executada, ela interrompe a função em andamento e retorna o con-
Muitas funções MATLAB dão suporte a argumentos de entrada e de saída opcio-
trole para o teclado, exibindo a mensagem de erro na Janela de Comandos. Se a cadeia
nais. Por exemplo, já vimos chamadas da função plot com a quantidade de argu-
de caracteres da mensagem estiver vazia, errar não faz nada, e a execução da função
mentos variando entre dois e sete. Por outro lado, a função max admite um ou dois
continua. Essa função opera bem junto com nargchk, que produz uma cadeia de ca-
argumentos de saída. Se houver somente um argumento de saída, max retoma o racteres de mensagem quando ocorre um erro e uma cadeia de caracteres vazia quando
valor máximo em uma matriz. Se houver dois argumentos de saída, max retoma o valor não ocorre um erro.
máximo e a sua localização na matriz. Como as funções MATLAB podem saber A função warning é uma maneira-padrão de exibir uma mensagem de aviso
quantos argumentos de entrada e de saída estão presentes, e