Vous êtes sur la page 1sur 255
PROGRAMAGAO EM WATLAB PARA ENGENHEIROS Stephen J. Chapman \| Programacao em MATLAB® Engenhetros Stephen J. Chapman BAE SYSTEMS Australia ‘Tradugio Técnica: Flavio Soares Correa da Silva PRD em Inteligéncia Artificial pela University of Edinburgh, livre-docente e professor associado do Depto. de Ciénciada = Computacio, Instituto de Matematica e Estatstica da USP THORIFON. Gerente Editoria: ‘adison Pereira Editora de Desenvolvimento: Eugenia Pssat rodutora Editorial: ‘Ada Santos Seles Produtora Gréfie: Patricia La Rosa © Copyignt 2002 by Brookale 28 ection © Copyright 2003 para a Lingua Portugues adquido por Fonera Thomson tearing ida, ums divisto a Thomson tearing, inc. Thomson Learing™ @ una marca reistads aqu uileada sb beenga. Impresso no Bras Printed in rae. 1234 050803 ua Tap, 114~ 30 andar Pereizes CEP 0235-000 Sto Paula ~ SP Tel: (17) 3665-9900 Fx: (11) 3665.9991 sec@thomsonieatning com br rr thomsonlearing com br songson. Titulo Original: MATLAB® Programming for Engineers Tradugio Técnica: Fis Soares Corea da iva Copidesque: Glauco Per Damas eos 0s ets resenades Nenhuma part deste iro odes ser reproduridasejam (as fore os melas tempregados sem a pernssie, por esto, da Editors, as infratores apicamse as sanceesprevstas nas stiges 102, 104, 106 e 107 de (29.610, 619 oe ‘evereko 1998 Revisso: Fernanda Ameida Unie e Mana Alice da Costa, Composig Segmento & Co, Producdes Grafica Uc capa: ui Prods Visual e Assessor Lida Dados internacionais de Catalogagée na Publicaczo (cr) (Camara Brasileira do Livro, 5, Brasil CChapenan, Stephen J Programacao em MATLAB® pars engenheces/ Stephen J. Chapman eal téene Fo Soares (Corea da Sha,» S30 Pale Ponsa Thomson Leaning, 2003 Titulo original MATLAB proaramming for engines IS8h-25.221-0325.9 1. Analse nameca— Processoment de doe 2. MATLAB L Thu, 03-1935 coD-st9.a0285513 Indices para catslogo sistematice: | Anise numésce: Apicacs0 deMATLAB 519.40285513 2. MATLAB : Aplagao em fans numérica $¥9.402855123 Este livro é dedicaio a minha esposa Rosa, pds 25 anos maracilhosos juntos. Sumario Pretécio xv 1 Introdugao ao MATLAB 1 a 12 13 ‘Vantagens do MATLAB 1 Desvantagens do MATLAB 3 O Ambiente MATLAB 3 13.1 A Area de Trabalho MATLAB 4 132 AJanela de Comandos 4 133. AJanela de Histérico de Comandos 7 134 OEspago de Lancamento 7 135 AJanela de Edigio/Depuragao. 8 13.6 Janela de Figuras 9 137 OEspaco de Trabalho MATLAB 10 138 ONavegador do Espago de Trabalho 11 ‘ 139 Obtendo Ajuda 13 13.10 Alguns Comandos Importantes 14 1.3.11 O Caminho de Busca MATLAB 15 Utilizando 0 MATLAB como Prancheta de Rascunhos 16 Resumo 18 15.1 Resumodo MATLAB 19 Exercicios 19 viii 1 Preramapto em WATLAg® para Enpeoeios 23 24 25 26 27 28 29 210 2a 2az 213 2a 245 22.1 Iniciando Varidveis em Expressées de Atribuigio 25 222. Iniciando com Expresses de Atalho 27 223. Iniciando com Fungées Predefinidas 28 224 Iniciando Variaveis com Entrada pelo Teclado 29 Matrizes Multidimensionais 31 23.1 Armazenando Matrizes Multidimensionais em Meméria 32 232 Acessando Matrizes Multidimensionais com um Unico Subscript 33 Submatrizes 34 24.1 AFungio end 35 242 Utilizando Submatrizes no Ledo Esquerdo de uma Declaragio de Atribuiggo 35 243 Atribuindo um Escalar a uma Submatriz 37 Valores Especiais 37 Exibindo Dados de Saida 39 26.1 Alterando o Formato-Padrio 39 262 AFungio disp 40 263. Saida Estruturada Usando a Fungio fprintt 40 Arquivos de Dados 42 Operagdes com Escalares e Matrizes 44 28.1 Operagdes com Escalares 45 282 Operagdes com Matrizes 45 Hierarquia de Operacdes 48 Eung6es Predefinidas MATLAB 51 2.10.1 Resultados Opcionais 51 2.102 Utilizando Fungdes MATLAB com Matrizes como Entrada 52 2.103 Fungdes MATLAB Comuns Introdugio a Diagramas 52 2.11.1 Utilizando Diagramas xy Simples 54 2.112 Imprimindo um Diagrama 55 2.113 Diagramas Maltiplos 56 2414 Cores de Linhas, Estilos de Linhas, Estilos de Marcadores e Legendas 56 2.115 Escalas Logaritmicas 58 Exemplos 59 Depurando Programas MATLAB. 67 Resumo 69 2.14.1 Resumo de Boas Priticas de Programagio 69 2.142 Resumo do MATLAB 70 Exercicios 72 Expressdes de Ramificagdo e Projeto de Programa 79 31 32 33 Introdusio a Tée Uso de Pseudocs Operadores Relacionais e Légicos 85 33.1 Operadores Relacionais 85 332 Nota de Atencio a Respeito dos Operadores icas de Projeto Top-Down 79 333 Operadores Légicos 88 334 Fungies Logicas 90 34 Ramificagées 92 341 A€strutura if 92 342 Exemplos de Utilizagdo de Estruturas if 94 343 Notas a Respeito do Uso de Estruturas if 100 344° A€Strutura switch 102 345 AEstrutura cry/catch 104 35 Caracteristicas Adicionais de Diagramas 106 35.1 Controlando os Limites nos Diagramas dos Eixos xe y 106 35.2 Desenhando Muiltiplos Diageamas sobre os Mesmos Eixos 109 35.3 Criando Maltiplas Figuras 109 354 Subdiagramas 110 355 Controle Avangado de Linhas Desenhadas 111 35.6 Controle Avangado de Cadeias de Texto 113 357 Diagramas Polares 113 358 Anotando e Armazenando Diagramas 121 3.6 Notas Adicionais a Respeito da Depuragio de Programas MATLAB 123, 3.7 Resumo 126 3.7.1 Resumo de Boas Praticas de Programagio. 127 37.2 ResumodoMATLAB 127 38 Exercicios 128 Lagos 135 41 OLagowhite 135 42 OlLasofor 141 421 Detalhes de Operagio 148 422 As Expresses break e continue 152 423. Lagos Aninhados 153 43° Matrizes Logicas e Vetorizagio 155 43.1 Almportincia das Matrizes Légicas 432. Criando o Equivalente a Estruturas if /e: 44 Exemplos Adicionais 161 45 Resumo 176 45.1 Resumo de Boas Priticas de Programagio 176 452. Resumo do MATLAB 176 46 Exercicios 177 com Matrizes Légicas 159 « Fungdes Definidas pelo Usuario 185 5.1 Introduio a Fungdes MATLAB. 186 5.2 Passagem de Varidveis em MATLAB: O Esquema de Passagem por Valor 192 33 Argumentos Opcionais 202 8.4 Compartilhando Dados pelo Uso de Meméria Global 207 55. Preservando Dados Entre Chamadas de uma Fungio 215, 5.6 FungOes de Fungdes 220 5.7 Subfungdes e FungGes Privadas 224 5.8 Resumo 226 | Programapso em MAILAW™ para Engentwiras ‘Sumicio | 581 Resumo de Boas Pritcas de Programagio 226 73. Matrizes Estruturas. 30 582 _Resumodo MATLAB 227 731 Criando Estruturas 304 59. Exercicios 228 732. Adicionando Campos a Estruturas 306 733 Removendo Campos de Estruturas 307 6 Dados Complexos, Dados de Caracteres eTipos Adicionals de Diagramas 239 734 Usando Dados em Matrizes Estruturas 308 61 Dados Complexos. 239 735. AsFuncies getfielde set field 309 6:11 Varidveis Complexas 241 736 Usando a Fungio size com Matrizes Estruturas 310 612 Usando Nuimeros Complexos com Operadores Relacionais. 242 737 Aninhando Matrizes Estruturas 310 613 Fungdes Complexas. 242 738 Resumo das Fungies structure 311 6.14 Colocando Dados Complexos em Diagramas 246 7A Resumo 312 ; 62 Fungées de Cadeias de Caracteres 230 7.4.1 Resumo de Boas Priticas de Programacio 313 62.1 Fungdes de Conversio de Cadeias de Caracteres 250 74.2 Resumo do MATLAB 313 6.22 Criando Matrizes Bidimensionais de Caracteres 250 75 Exercicios 314 , 623. Concatenagio de Cadeias de Caractees 251 . | ) 624 Comparasio de Cadeins ce Caracteres 252 8 Fungées de Entrada/Saida 317 625. Busca/Substituiglo de Caracteres Dentro de uma Cadein. 254 81 “A Funcio textread 317 | €26 Conversio para Maldscula e Miniseuls 256 82. Mais Informag6es sobre os Comandos oad e save 319 | 627 Conversbes de Numero para Cadeia de Caracteres 256 83 Uma Introducio ao Processamento de Arquivos MATLAB 321 628 Conversbes de Cadeia de Caracteres para Niimero 258 84 Abrindo e Fechando Arquivos 322 £29. Rewme 258 841 AFungio fopen 323 ais 264 842 AFuncéo fclose 326 85 Fungdes de E/S Binérias 326 851 AFungio fwrite 326 852 AFungdo fread 327 8.6 Fungdes de E/S Estruturadas 330 861 AFungio fprintf 330 8.62. Entendendo as Especificagdes de Conversio de Formato 332 863 Como as Cadeias de Caracteres de Formato Sio Utilizadas 334 63. Matrizes Multidimensi 6A Diagramas Bidimensionais Adicionais 266 6.4.1 Tipos Adicionais de Diagramas Bidimensionais 266 642 Fungoes para Diagramas 271 643 Histogramas 272 65 Diagramas Tridimensionais 274 65.1 Diagramas Tridimensionais deLinha 274 1 ce oo Diagrams dimensional deSpeie Malia eCurvede Nive 276 set Reece nee i ‘esumo 8.6.5 AFungao fget1 339 6.6.1 Resumo de Boas Préticas de Programagio 280 B66 Afunio fgets 309 j 662 _Resumo do MATLAB 280 87 Comparando Fungées de E/S Bindtias eEstruturadas 339 67 Exerefios 281 88 Posicionamento de Arquivo e FungBes de Estado. 345 881 AFungio exist 343 7 Matrzes Esparsas, Matrizes Celulares e Estruturas 225 882 APungio terror 347 : 7A Mattizes Esparsas 285 883 Aungo feor 348 ‘ 71. OTipode Dados sparse 287 884 AFungio fte1l 348 72. Matrizes Celulares 292 885 AFungio frewina 348 | 7.2.1 Criando Matrizes Celulares 294 . 8.8.6 AFungio fseck 348 722 Usando Chaves |) como Constntores de Cétulas 295 89. Fungioutimport 354 x 723. Vendo o Contedido de Matrizes Celulares 296 8:10 Resumo. 356 724 Estendendo Matrizes Celulares. 296 8.10.1 Resumo de Boas Pritcas de Programagao 357 / 725. Apagando Células em Matrizes 298 810.2 Resumo do MATLAB 357 726 Usando Dados em Matrizes Celulares 298 11 Exercicios 358 72.7 Matrizes Celulares de Cadeias de Caracteres 299 728 Almportancia das Matrizes Celulares 300 9 Graficos de Controle 361 72.9 Resumo das Fungées da Matriz. cell 303 9.1 O Sistema de Gréficos MATLAB 361 10 1 roymayan en mnreny para engerneias 92 93 94 95 96 97 98 99 9.0 on 92 943 Controles de Objetos 363, Examinando e Modificando Propriedades de Objetos 363 93.1 Modificando Propriedades do Objeto no Momento da Criagio 363, 932 Modificando Propriedacies de Objetos apés a Criagio 364 Usando set para Listar Valores Possiveis de Propriedades 370 Dados Definidos pelo Usuario 372 Localizando Objetos 373 Selecionando Objetos com o Mouse 375 Posigio e Unidades 373 98.1 Posigies de Objetos figure 378 9.82 Posigdes de Objetos axes e uicos 983. Posigdes de Objetos text 379 Posigbes de Impressio 382 Propriedades Default e de Fabrica 383 Propriedades de Objetos Graficos 385 Resumo 385 9.12.1 Resumo de Boa Pratica de Programagio 386 9.122 Resumo do MATLAB 386 Exercicios 387 Interfaces Gréficas de Usuérios 389 10.1 102 103 104 10; 106 ‘Como Funciona uma Interface Gréfica de Usuério 389 Criando e Exibindo uma Interface Grifica de Ususrio 390 10.21 Espiando Por Trés dos Panos 100 10.22 A Fstrutura de uma Subfungiade Retorno 402 1023 Adicionando Dados de Aplicagio a uma Figura 403 1024 Algumas Fungoes Uteis 404 Propriedades de Objetos 404 ‘Componentes da Interface Grifica de Usuétio 405 104.1 Campos de Texto 407 1042 Caixas de Edigio 407 1043 Quadros 407 1044 Botses 407 10.45 Chaves 409 10.46 Caixas de Verificasio e Marcadores 409 1047 Menus Dinamicos 412 1048 Caixas de Listagem 412 1049 Réguas 415 Caixas de Didlogo 420 105.1 Caixas de Didlogo de Erro e de Aviso 421 1052 Caixas de Dislogo de Entrada 421 1053 As Caixas de Dislogo uigettileevisetfile 422 Menus 423 106. Suprimindo o Menu-Padrio 26 10.62 Criando seus Préprios Menus 427 10.63 Teclas de Aceleragao e Mneménicos de Teclado 428, 10.64 Criando Menus de Contexto 28 Somivio | xiil 10.7 Dicas para Criar Interfaces Grificas de Usuério Eficientes 434 10.7 Dicas de Ferramentas 434 1072 Peode 435 10.73 Melhorias Adicionais 437 108 Resumo 441 10.8.1 Resumo de Boas Praticas de Programacio 443 1082 Resumo do MATLAB 443 109 Exercicios 444 Apéndice A Conjunto de Caracteres ASCII 447 ‘Apéndice B Respostas para os Testes 449 indice Remissivo 463, Prefacio MATLAB (que abrevia MATrix LABoratory ~ Laboratdrio de Matrizes) é um programa de computador de uso especifico, otimizado para executat célculos centificas e de engenharia. Ele nasceu como um programa para operagies mateméticas sobre matrizes, ‘mas ao longo dos anos transformou-se em um sistema computacional flexivel capaz de resolver essencialmente qualquer problema técnico. (© programa MATLAB implementa a linguagem MATLAB, e oferece uma ampla biblioteca de fungSes predefinidas para que a programacio técnica se torne mais fécil e eficiente. Essa variedade extremamente ampla de fungdes 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éenicos tipicos. Esta obra ensina 0 MATLAB como uma linguagem de programacio técnica, ‘mostrando aos estudantes como escrever programas limpos, efftientes ¢ bem-docu: ‘mentados. Ela nao tem a pretensio de ser uma descrigio completa de todas as centenas de fungdes MATLAB. Em vez disso, ensina como usar 0 MATLAB como uma lingua- ‘gem, e como localizar qualquer funcio desojada através dos recursos de ajuda on-line do MATLAB, (Os primeiros seis capitulos sio feitos para servir como texto para um curso de “In- trodugio a Programacio/Resolugio de Problemas” para estudantes calouros de enge- mharia. Esse material deve se adequar folgadamente para um curso de nove semanas com trés horas por semana. Os capitulos restantes cobrem t6picos avangados como entrada/saida e interfaces graficas de usudrios. Esses capitulos podem ser cobertos ‘em cursos mais longos, ou usados como referéncia por estudantes de engenharia ‘ou engenheiros que utilizem 0 MATLAB como parte de seus cursos ou atividades AVL | Programagéo em MATLAB® para Engenhenas Esta edigdo &especifieamente devotada is versdes 6.0 ¢ 6.1 do MATLAB. Embora a linguagem MATLAB basica tenha se mantido constante desde a versio 50, as ferra- rmentas integradas, as anelas e o subsistema de ajuda mudaram drasticamente. Adicio- ralmente, um paradigma completamente novo para projetos de interfaces graficas de ‘usuério MATLAB foi introduzido na de 6.0. Os usuarios que trabatham com versdes do MATLAB anteriores & de 6.0 precisam estar conscientes que a descrigio do desenvolvie ‘mento de interfaces grificas de usuario no Capitulo 10 nao serve para eles, O livio também cobre as melhorias pequenas, porém importantes, na prépria lin- ‘guagem, como a introdugao da expresso cont inue. ‘As Vantagens do MATLAB para Programagao Técnica MATLAB apresenta muitas vantagens, em comperago com linguagens de computador ‘convencionais, para resolugio de problemas técnicos. Dentre elas, temos: 1, Facilidade de Uso MATLAB € uma linguagem interpretada, assim como muitas verses de Basi. Como Basic, 6 muito fécil de usar. O programa pode ser usado como prancheta de rascunhos para avaliar expresses digitadas em linha de comando, ou para executar programas grandes previamente escritos, Programas podem ser escri- tos e modificados com facilidade usando o ambiente de desenvolvimento inte- grado embutido, bem como depurados usando o depurador MATLAB, Por ser muito fécil de usar, a linguagem é ideal para uso educacional e para desen- volver rapidamente protstipos de novos programas, Muitas ferramentas de desenvolvimento de programas sio fornecidas para tomar o programa facil de usar. Dentre elas, temos um editor/depurador, lum navegador de espaco de trabalho e muitos programas de demonstracio. 2, Independéncia de Plataforma MATLAB tem suporte em muitos sistemas computacionais diferentes, propor. cionando, em grande medida, uma independéncia de plataforma, No momento de preparagio deste livro, a linguagem tinha suporte em Windows 9x/NT/2000 em diversas versdes de UNIX. Programas escritos em uma plataforma fun- cionam em todas as outras, earquivos de dados escritos em qualquer plataforma poclem ser lidos transparentemente em todas as outras. Como resultado, pro- {gramas escritos em MATLAB podem migrar para novas plataformas quando as necessidades do usuario se alteram, 3. Fungies Predefinidas MATLAB ver completo, com uma grande biblioteca de fungies predefinidas que proporcionam solugbes testadas e empacotadas para muitas tarefas técnicas bésicas. Por exemplo, suponha que vocé esteja escrevendo um programa que precise calcular a estatistica associada ccm um conjunto de dados de entrada Na maioria das linguagens, voc? precisaria escrever suas préprias sub-rotinas ou fungdes para implementar 03 cileulos como média aritmética, desvio padrio, mediana etc. Essas e centenas de outras fungbes s20 construfdas jana linguagem MATLAB, tornando seu trabalho muito mais fel Prtécio Além da grande biblioteca de fungées construfda na linguagem basica MATLAB, existem muitas outras caixas de ferramentas especializadas dispo- niveis para ajudar a resolver problemas complexos em areas especificas. Por exemplo, um usuario pode comprar caixas de ferramentas-padrio para resolver problemas em processamentos de sinais, sistemas de controle, comu- nicagoes, processamentos de imagens ¢ redes neurais, dentre muitas outras. 4. Diagramas Independentes de Dispositivos Diferente de outras linguagens de computador, MATLAB tem diversos coman- dos para imagens ¢ desenhos integrais. Os desenhos e as imagens podem ser exibidos em qualquer dispositive grafico suportado pelo computador onde est funcionando o MATLAB. Esse recurso toma o MATLAB uma ferramenta notavel para visualizar dados téenicos, 5. Interface Grafica de Ususrio MATLAB jinclui ferramentas que permitem que um programador corstrua interativamente uma interface grafica de usuario (GUI, do inglés Graphica! User Interface) para seu programa. Com esse recurso, 0 programador € capaz de pro- jetar programas sofisticados para analise de dads que podem ser operados por ‘usudrios relativamente inexperientes. 6. Compilador MATLAB: A flexibilidade e a independéncia de plataforma do MATLAB sfo propor- cionadas pela compilagao de programas MATLAB em um pseudocédigo inde- ppendente de dispositivo, e pela interpretacio das instrugées do pseudocSdigo em lempo de execucio. Essa abordagem é semelhante 2 usada na linguagem de programagio Visual Basic, da Microsoft. Infelizmente, 0 programa resultante por vezes pode ser lento, pois o cédigo MATLAB 6 interpretado em vez decom: pilado, Indicaremos aspectos que tendem a reduzir a velocidade da execusio de programas, quando 0s encontrarmos. Um compilador MATLAB separado esté disponivel. Ele pode compilar lum programa MATLAB como um executivel verdadero que executa mais ripido ‘que o cédigo interpretado. Essa é uma grande forma de converter um programa de protstipo MATLAB em um executdvel apropriado para venda e distribuicio Caracteristicas deste Livro Muitas caracteristicas deste livro t@m por objetivo enfatizar a mancira apropriada de escrever programas MATLAB. Essas caracteristicas devem ser iteis para um estudante aprendendo a usar 0 MATLAB e para quem ja trabalha com esse programa. Dentre las, temos: 1. Enfase na metodologia de projetos top-down CO livzo apresenta uma metodologia de projets top-down no Capitulo 3, eentio a utiliza de forma consistente no sew decorter. Essa metodologia encorja 0 cestudante a pensar a respeito do projeto apropriado de um programa anes de | Progranagte om MATLAB are Egos iniciar a codificagao. Ela enfatiza a importancia de definir claramente o proble- ‘maa ser resolvido e os dados requeridos de entrada e saida antes de iniciar qualquer outra atividade. Uma vez definido apropriadamente 0 problema, ensina o estudante a aplicar o refinamento passo a passo para subdividir a tarefa ‘em sublarefas menores, ¢ implementat as sublarefas como sub-rotinas ou fangdes separadas. Finalmente, a metodologia utilizada ensina a importancia de efetuar testes em todos 08 estégios do proceso, tanto testes unitdrios das rotinas componentes como testes exaustivos do produto final 0 processo formal de projeto ensinado no livro pode ser assim resumido: Estabelega claramente 0 problema que vocé esté tentando resolver. ‘* Defina os dados de entrada requerides pelo programa e os dados de saida produzidos por ele + Desereva 0 algoritmo que vocé pretende implementar no programa. Esse passo requer projeto fop-ioum e decomposigao passo a passo, fazendo uso de pseudocsdigo ou de diagramas de fluxo, ‘+ Transforme o algoritmo em sentengas MATLAB, ' Teste o programa MATLAB. Nesse passo estio incluldas os testes unitirios de fungdes espectficas e 0 teste exaustivo do programa final, com diferentes conjuntos de dados. 2, Bnfase em fungBes O livro enfatiza 0 uso de fungGes para a decomposigio ligica de tarefas em subtarofas menores, Ele ensina as vantagens das fungies para ocultar dados. Enfatiza também a importancia dos testes unitérios das fungSes antes de com- bind-las no programa final. O livro mostra ainda os erros comumenteefetuados com fungies ¢ como evitélos, 3, Enfase em ferramentas MATLAB © livro ensina 0 uso apropriado das ferramentas pré-construidas MATLAB para facilitar a programagio e depuragio de programas, As ferramentas tratadas sio o Espaco de Langamento, o Editor/Depurador, o Navegador do Espago de Trabalho, o Navegador de Ajuda e ferramentas de projeto de GUI 4. Notas de boa pritica de programagio As notas enfatizam as boas priticas de programagio & medida que so apre- sentadas, para a conveniéncia do estudante. Além disso, as boas priticas de programagio aprosentadas em um capitulo sdo resumidas no seu final. Apre sentamos a seguir uma nota de boa prittca de programacio, Boa Pratica de Programagao Sempre destaque com tabulagio 0 corpo de uma construgdo if, com dois ou mais cespagos, para melhorar a legibilidade do cédigo. Priicio | xix 5. Notas de erros de programagio Essas notas enfatizam erros comuns que podem ser evitados. Apresentamos a seguir uma nota de erros de programacio, Sempre verifique se os seus nomes de varveis nao se repetem nos primeiros 31 carac- teres. Se isso nao ocorrer, o MATLAB néo conseguird diferenciar as varidveis, EATS 6. Bnfase nas estruturas de dados No Capitulo 7, temos uma discusséo detalhada a respeito das estruturas de dados MATLAB, incluindo matrizes esparsas, matrizes de células e matrizes de estruturas. O uso apropriado dessas estruturas de dados ¢ ilustado nos os sobre Grificos de Apoic e Interfaces Graficas de Usudrios. Caracteristicas Pedagdgicas- Os primeizos seis capitulos deste livro sio projetados especificamente para uso em ccursos de Introdugio 4 Programagio e a Resolugao de Problemas. Deve ser possivel cobrir esse material confortavelmente em um curso de nove semanas, com trés horas semanais. Se 0 tempo for insuficiente em algum programa particular de engenharia, 0 Capftulo 6 poders ser eliminado; os capitulos remanescentes ainda assim ensinario 0 fundamentos de programagao e uso do MATLAB para resolugio de problemas. Essa caracteristica deve ser atraente para 0s proessores de engenharia pressionedos para compactar cada vez mais material dentro de um curriculo finito Os capitulos seguintes tratam de material avangado que seré stil para estudantes © engenheiros ao longo de suas carreiras. Vie material inclui recursos avangados de entrada/saida e 0 projeto de interfaces gralw ss de usuarios para os programas. O livro inclui diversas caracteristicas jn njcladas para dar suporte 3 compreens30 do estudante.* Estdo incluidos 15 testes, sistribuidos a0 longo dos capitulos. As respostas a todas as perguntas esto apres: nladas no Apéndice B.Os testes podem ser usados como autotestes de compreensic Alim disso, temos aproximadamente 140 exercicios de final de capitulo. As boas prilias de programacéo so apresentadas em todos os capitulos em quadros de Boa Priti de ProgramacSo, e os ertos comuns so apresentados em notas de Erros de Prograni,io. O material de final de capitulo é com- posto por Resumos de Boas Priticas de Mugramagio e Resumos de Comandos FungOes MATLAB. * NIE: Hi no final do tivo, um encart de fgur pelt de cada igara que no péde se exbido lords, Eas sustram alga pono especial a ree tons de cine Agradecimentos Quero agradecer a minha esposa, Rosa, e a nossos filhos Avi, David, Rachel, Aaron, Sarah, Naomi, Shira e Devorah, por serem pessoas t20 agradveis ¢inspirarem todos os ‘meus esforcos. Stephen J. Chapman Capitulo 1 Introdugao ao MATLAB MATLAB (que abrevia MATrix LABoratory ~ Laborat6rio de Matrizes) é um programa de computador especializado e otimizado para célculos cientificas e de engesharia, Inicialmente, era projetado para cflculos com matrizes; ao longo dos anos, transformou-se em um sistema computacional flexivel, capaz. de resolver essencialmente qualquer problema técnico. (© programa MATLAB implementa a linguagem de programagio MATLAB, junta: mente com uma grande biblioteca de fungoes predefinidas que tornam as tarefas de programagao téenica mais féceis eficientes. Este livro apresenta a linguagem MATLAB ‘e mostra como utilizé-la para resolver problemas técnicos tipicos. MATLAB é um programa muito grande, com uma rica variedade de funsGes. Até ‘mesmo a versio bdsica do MATLAB, sem ferramentas adicionais, 6 muito mais rica que outras linguagens de programacio técnica. Existem mais de 1.000 fungées no produto MATLAB, e as ferramentas adicionais ampliam esses recursos com muito mais fungoes fem diferentes especialidades. Este livro nao pretende apresentar ao leitor todas as fangdes MATLAB, Em vez disso, o usuério aprende os furdamentos de como escrever, depurar e otimizar bons programas MATLAB, juntamente com um subconjunio das fungSes mais importantes. Outro aspecto igualmente importante é que o programador aprende a utilizar as ferramentas do préprio MATLAB para localizar a fungdo adequa. da a um proposito especifico a partir da enorme gama de opsdes disponiveis. 1.4. Vantagens do MATLAB MATLAB tem muitas vantagens, em comparagao com linguegens computacionais con- vencionais, para resolver problemas técnicos. Dentre elas, temos: 2 | Provan em MATLAB ar gees 1 Facilidade de Uso MATLAB € uma linguagem interpretada, assim como diversas versbes de Basic. ‘Como 0 Basic, ele é muito cil de usar. C programa pode ser usado como pran- cheta de rascunhos para avaliar expressées digitadas em linha de comando, ou pode ser utilizado para executar programas grandes escritos previamente. Os programas podem ser facilmente escritas e modificados no ambiente integrado de desenvolvimento, e depois depurados por meio do depurador MATLAB, Como a linguagem € muito fécil de usar, ele € ideal para o desenvolvimento rapido de protétipos para novos programas. Diversas ferramentas para desenvolvimento de programas sio fornecidas, 0 que failta o uso do programa. Dentre elas, temas um editor/ depurador integrado, sum navegador do espago de trabalho e diversos programas de demonstragio. 2 Independéncia de Plataforma MATLAB tem suporte em diferentes sistemas computacionais, 0 que propor ciona independéncia de plataforma. No momento da preparagio deste livro, a linguagem tem suporte em Windows 95 /98/ME /NT/2000 e diferentes versses de UNIX. (Versdes mais antigas do MATLAB eram disponiveis para computa- dores Macintosh ¢ VAX, as quais ainda sio utilizadas em diversos locais) Programas escritos em qualquer plataforma so executados nas outras plata- formas, e arquivos de dados escritos em qualquer plataforma podem ser lidos transparentemente nas outras. Com iso, programas escritos em MATLAB podem migrar para novas plataformas cas0 0 usuidrio precise da mudanca. 3. Fungies Predefinidas MATLAB vern completo, com uma grande biblioteca de fungSes predefinidas, ue representam solugGes testadas e empacotadas para diversas tarefas técnicas basicas. Por exemplo, suponha que vocé esteja escrevendo um programa para calcular as estatisticas relacionadas com um conjunto de dados de entrada, Na ‘majoria das linguagens, vocé precisaria escrever suas proprias sub-rotinas ou fungSes para implementar os célculos de média aritmética, desvio-padrao, me- diana, ete. Essas e centenas de outras fungOes fazem parte da linguagem MAT- LAB, assim facilitando o seu trabalho, ‘Alem da grande biblioteca de funcées presentes na linguagem MATLAB. bisica, diversas ferramentas especificas estéo disponiveis para ajudar a resolver problemas complexos em dreas especificas. Por exemplo, um usudrio pode adquirir ferramentas-padrao para resolver problemas em Processamento de Sinais, Sistemas de Controle, Comunicasies, Processamento de Imagens ¢ Redes Neurais, além de outros. Fxistem :ambém muitos programas MATLAB dle uso livre, que sio contribuigées de usudrios compartilhadas por meio da pagina WWW do MATLAB, 4 Desenhos Independentes de Dispositives Diferente da maioria das linguagens de computador, MATLAB tem muitos co- ‘mandos para desenhos e imagens. Os desenhos e imagens podem ser apresen- tados em qualquer dispositivo de saida grifica suportado pelo computador que executa 0 MATLAB. Esse recurso torna 0 MATLAB uma ferramenta excepeional Para visualizagao de dados téenicos, Captus 1 imoarzoz0 areas | 3 5 Interface Grafica de Usuério | MATLAB tem ferramentas que permitem a um usudrio construir interativa- rmente uma interface grafica de usudrio (GUL, do inglés Graphical User Interface) para seus programas. Com esse recurso, 0 programador pode projetar pr gramas sofisticados de andlise de dados, os quais podem ser operados por Usuarios relativamente inexperientes. 6 © Compilador MATLAB A flexibilidade ea independéncia de plataforma do MATLAB resultam da com- pilagao de programas MATLAB em um e6digo independente de dispositiva denominado peode, e da interpretacio em tempo de execusao das instrugdes em peode. Essa abordagem € similar & adotada pela linguagem Visual Besic da Microsoft. Infelizmente, os programas resultantes podem as vezes se tornar Tentos, pois 0 cédigo MATLAB é interpretado em vez de compilado. Indicaremos fos aspectos que tendem a tornar a execugio de programas mais lenta quando os encontrarmos. Existe um compilador MATLAB separado. Ele pode compilar um pro- .grama MATLAB como um programa efetivamente executavel, que é mais répido que o cédigo interpretado. Essa & uma boa forma de converter um programa protétipo MATLAB em um programa executavel que pode ser vendide e dis- tuibuido a usudtios. 1.2. Desvantagens do MATLAB MATLAB tem duas desvantagens principais. Primeiro, ele é uma linguagem interpretada, por isso pode ser mais lento que linguagens compiladas. Esse problema pode ser dimi ruido pela estruturacio apropriada dos programas MATLAB e pelo uso do compilador MATLAB para compilar o programa final MATLAB para distibuigdo e uso geral A segunda desvantagem 6 0 custo: uma cépia completa do MATLAB é de cinco a dex vezes mais cara que um compilador convencional C ou Fortran, Esse custo rela vamente alto é mais do que compensado polo tempo reduzido requerido para um engenheiro ou cientsta criar um programa —o que torna o MATLAB eficaz para empresas. Ele pode ser muito caro, entretanto, para a compra individual. Felizmente, existe uma versio de estudante mais barata do MATLAB, que é uma excelente ferramenta para estucantes que queiram aprender a linguagem. A versio de estudante do MATLAB é essencialmente idéntica & versio completa 1.3. 0 Ambiente MATLAB A unidade fundamental de dados em qualquer programa MATLAB é a matriz. Uma ‘matriz é uma colegio de valores de dados organizados em linhas e colunas, determi nada por um nome tinico. Valores individuais de dados em uma matriz podem ser aces- sados por meio do nome da matriz seguido de indices entre parénteses que identificam @ linha e a coluna de um valor particular, Até mesmo escalares sio tratados como matrizes em MATLAB ~ eles sio simplesmente matrizes com apenas uma linha e uma coluna. Aprenderemos a criar ¢ a manipular matrizes MATLAB no Capitulo 2. _ 4 Pregramapto am uatAg® para Empntois Na execugio do MATLAB podem ser exibidasjanelas de diferentes tipos, as quais aceitam comands ou exibem informagdes. Os ts tipos mais importantes de janelas ‘io Janela de Comandos, onde podem ser colocados comandas; Janela de Figuras, que exibem desenhos e graficos; e Janelas de Edigio/Depuragio, que permitem a um usuario eriar e modificar programas MATLAB. Vamos ver exemplos desses tréstipos de janelas na presente segio. ‘Além disso, o MATLAB pode exibir outras janelas de auxiio e que possbilitam a0 usuario examinar 0 valor de varidveis definidas em meméria, Vamos examinar aqui algumas dessas janelas adicionais, e examinar as outras quando discutiemos como depurar programas MATLAB 1.3.1 A Area de Trabalho MATLAB Ao iniciar o MATLAB Versio 6, aparece uma janela especial denominada area de tra- balho MATLAB. A configuragio inicial da rea de trabalho MATLAB € exibida na Figura 1.1. Ela integra diversas ferramentas para gerenciar arquivos, varidveis ¢ apli- cagbes dentro do ambiente MATLAB As principais ferramentas presentes na drea de trabalho MATLAB, ou que podem ser acescadas a partir dela, sio as seguintes: * Janela de Comandos * Janela de Hist6rico de Comandos * Espago de Langamento * Janela de Edigdo/Depuragio * Janela de Figuras *+ Navegador do Espaco de Trabalho e Editor de Matrizes + Navegador de Ajuda + Navegador do Diret6rio Corrente ‘Vamos discutir as fungbes dessas ferramentas em segies posteriores deste capitulo, 1.3.2 A Janela de Comandos (O lado direito da érea de trabalho MATLAB contém a Janela de Comandos. Um usué- tio pode inserir comandos interativos pelo marcador de comands (>), na Janela de ‘Comandos, ¢ eles serio executados de imediato, Um exemplo de célculo interativo simples 6 seguinte: suponha que vocé queira calcular a érea de um circulo com raio de 2,5 m. Iso pode ser feito pela janela de coman- dos MATLAB, digitando: >> area = pi * 2.592 19.6350 apts vaio aouaTias | & ‘OEspago de Langament. tobe una anore de se contol permite ecueiagso, Disparao gue um sui veriique fdorsvapes e feramentas —Mavegader de ou modiqueo dretéto ‘ra cata produto ‘Nua corrente Seen: se eee fice ce Poneto bonnie Adanela de Hitrico 0 Navegador fe Camandos exbe 05 comandos anteriores Diretiio 0 Navegador a Arado Corrante bees arqutes Trabalho ede as vars bo dretéiacarente——defnidas na rea de tabato Figura 1.4. érea de trabalho MATLAB. A aparéneia exata da janela pode deri igeirzmente fem diferentes tipos de computador. © MATLAB calcula a resposta assim que a tecla Enter é pressionada, e armazena 0 resultado em uma variavel (na realidade, em uma matriz 1 x 1) denominada area. O contedido dessa varidvel é exibido na Janela de Comandos, conforme mostrado na Figura 1.2, ea varidvel pode ser usada em outros céleulos, (Note que x é predefinido no MATLAB, por isso podemos simplesmente usar pi sem antes termos de declarar set valor como 3.141592... ‘Se uma declaragio é muito extensa para ser digitada em uma tinica linha, ele pode ser complementada em linhas sucessivas digitando reticéncias (..) no final de cada 6 | Prosramagso em aULAB pra Eger: Figura 1.2 Janela de Comandos fica mais & direta na étea de trabalho. Os usustios podem inserir comandos e ver as respostas al linha, ¢ ento continvando na linha seguinte. Por exemplo, as duas expresstes a seguir Sio idénticas: ML = 14 2/2 44/36 1/4 1/5 4 1/67 mlel+ 121s ia. 41/5 + 1/6 Em vez de digitar comandos diretamente na Janela de Comandos, uma série de comands pode ser colocada em um arquivo, ¢ 9 arquivo inteiro pode ser executado, quando digitamos seu nome na Janela de Comandios. Esses arquives so denominados arquivos de scripts. Arquivos de scripts (e fungSes de scripts, como veremos) sio tam- bbém chamados arquives M, por terem uma extensio de arquivo * .m" Casa ioaupozonaruse | 7 Figura 1.3 AJanela de Histérico de Comandos, mostrando dois comandos sendo apagadis. 1.3.3 A Janela de Histérico de Comandos A Janela de Histérico de Comandos exibe uma lista dos comandos que um usuario inseriu na Janela de Comandos. 4 lista de comandos anteriores pode se estencler a exe cugies anteriores do programa. Os comandos permanecem na lista até serem apagados. Para reexecutar qualquer comando, simplesmente clique duas vezes sobre ele com 0 botdo esquerdo do mouse, Para apagar um ou mais comandas da Janela de Histérico de Comandos, selecione os comandos e clique sobre eles com 0 botdo direito do mouse Surgird um menu, que permitird ao usuario apagar os itens (ver Figura 1.3). 1.3.4 0 Espago de Langamento © Bspago de Langamento 6 uma ferramenta especial que agrupa referéncias a docu _mentacio, demonstragies e ferramentas relacionadas para o proprio MATLAB e para finaris oo Denos | fatcurcenenisestory | fiockapece fares Eb siine (cor bssees) Oreos rece es) bgicore ses ne $b edaarasn comater Heh sugat Frocessing Tootbor dh seantarten Tonthow Launen pag_[ Workspace J Figura 1.4 © Espago de Langamento. cada conjunto de ferramentas que vocé adquire. A informacio é organizada por pro- duto, com todas as referéncias listadas abaixo de cada produto ou conjunto de ferra- mentas. Pessoas diferentes irdo adquirir produtos diferentes, portanto, 0 contetido exato dessa janela varia de instalagdo para instalagio. ‘A Figura 14 mostra o Espago de Langament> com referéncias expandidas para MATLAB bésico. Ao clicar duas vezes sobre um desses itens, voce pocle obter ajuda para usar o MATLAB, executar os programas de demonstracio, acessar as ferramentas- padrio fornecidas com o programa ou visitar a pagina WWW do MATLAB na Internet 1.3.5 A Janela de Edigéo/Depuragao Uma Janela de Edigio/Depuragao é usada para criar novos arquives M ou modificar os jd existentes. Uma Janela de Edicao/Depuracio 6 criada automaticamente quando vocé ctia um novo arquivo M ou abre um. Vocé pode criar um novo arquivo M selecionando “File/ New /M-file” no menu da area de trabalho, ou clicando sobre o icone C} na Barra de Ferramentas. Vocé pode abrir um arquivo M selecionando “File/Open” no menu da frea de trabalho ou clicando sobre o icone ina Barra de Ferramentas. A Janela de Edigio/Depuracio é essencialmente tum editor de textos de progra- mas, com caracteristicas da linguagem MATLAB destacadas por cores diferentes. ‘Comentarios em um arquivo M aparecem em verde, variéveis e mimeros, em preto, cadeias de caracteres, em vermelho, e palavras-chave da linguagem, em azul, Um exem- plo de Janela de Edigao contendo um arquivo M simples é exibido na Figura 1.5. Esse arquivo calcula a drea de um circule, dado o sew raio, e exibe o resultado. saloLx| oe eee OeGelsoeo (Af! 00/609 08) mPa E Fou 15 AJanela de Edigio/Depuragio, exibindo o arquivo czic_area m. Uma vez gravado o arquivo M, ele pode sor executado ao digitarmos seu nome na Janela de Comandos. Para 0 arquivo M da Figura 1.5, os resultados $30 » cale_area The area of the circle is 19.635 ‘AJanela de Edigdo /Depuragao também funciona como depurador, conforme vere- ‘mos no Capitulo 2 1.3.6 Janela de Figuras Ua Janela de Figuras ¢ usada para exibie gréficos MATLAB. Uma figura pode ser a representacio gréfica bidimensional ou tridimensional de dados, uma imagem ov uma GUL Um arquivo de script simples que calcula e desenha a fungi seno (x) é mostrada a seguir: & sincxm: Bese arquivo M calcula e desenha a % funggo seno{x) para 0 <= x <= 6. 0.2 y = sinix) plot ix, yi Se.esse arquivo for gravado com o nome sin_x.m, um usurio poderé executé-lo digi- tando *sin_x* na Janela de Comandos. Quando 0 arquivo de script for executado, 0 10 | Progam MATAR gra gees “=1513) EER Wow Fest Tone Wann Hep Joeualrar7|eee o| os o| 02 22] 04 os} Figura 1.6 Desenho MATLAB de seno (x) versus x MATLAB abriré ume Janela de Figuras e desenhard a fungSo seno (x) dentro dela. O desonho resultante é exibido na Figura 1.6 1.3.7 0 Espago de Trabalho MATLAB Uma declaragao da forma z= 10 ccria uma varidvel denominada z, armazena 0 valor 10 nessa variavel e a grava em uma parte da meméria do computador denominada espago de trabalho. Um espaco de tra- balho é a colegio de todas as variaveis e matrizes que podem ser usadas pelo MATLAB quando um comando, arquivo M ou fungao em particular esta em execugao. Todos os ‘comandos executados na Janela de Comandos (e todos os arquivos de script executados a pattir da Janela de Comandos) compartitham um espago de trabalho comum, para que eles possam compartihar varidveis. Conforme veremos neste livro, as fungdes MATLAB diferem dos arquivos de script, pois cada fungio tem seu préprio espago de trabalho separado. " Uma lista de todas as variaveis e matrizes no espaco de trabalho corrente pode ser gerada por meio do comando whos. Por exemplo, apés executar 0s arquivos calc_area e sin_x, 0 espago de trabalho contém as seguintes variéveis: >» whos Nane Size Bytes Class area bd 8 double array radius 1xl 8 double array et 1x32 64 char array x 1x61 488 double array ¥ 1x61 488 double array id total is 156 elements using 1056 bytes CO arquive de script calc_area criou as variveis area, radius e string, eo arquivo de script s in_x criow as varidveis x e y. Observe que todas as variaveis estao no mesmo ‘espaco de trabalho. Se dois arquivos de script forem executados sucessivamente, 0 segundo arquivo de script poders usar varidveis criadas pelo primeiro, ( contetido de qualquer variavel ou matriz pode ser determinado pela digitacio do nome apropriado na Janela de Comandos. Por exemplo, 0 conteddo de string pode ser obtido da seguinte forma: >» string string = ‘The area of the circle is 19.635 ‘Uma varivel pode ser apagada do espago de trabalho usando o comando clear. Esse comando tem a seguinte forma: clear varl var2 onde var € var? sio os nomes das variéveis a serem apagadas. O comando clear variables, ou simplesmente clear, apaga todas as varidveis do espaco de trebalho corrente, 1.3.8 0 Navegador do Espago de Trabalho (© contesido do espaco de trabalho corrente pode também ser examinado por meio do Navegador do Espaco de Trabalho baseado em GUI. Na configuragio bésica, 0 Nave- gador do Espaco de Trabalho aparece no canto superior esquerdo da érea de trabalho, Por meio dele, temos uma apresentagio gréfica da mesma informago dada pelo co- ‘mando whos, € 0 que é apresentado 6 atualizado dinamicamente cada vez que tmuda 0 contetido do espaco de trabalho. © Navegador do Espaco de Trabalho também permite que um ustrio modifique o contetido de qualquer varidvel no espago de trabalto, ‘Uma tipica Janela do Navegador do Espaco de ‘Trabalho ¢ exibida na Figura 1.7. Como vocé pode ver, ela exibe a mesma informacio que o comando whos. Clicat duas vezes sobre qualquer variavel na janela aciona o Editor de Matrizes (Figura 1.8), que Permite que 0 usuario modifique a informagdo armazenada em uma varidvel, — Figura 1.7 4 > [iaveen Fad Workspace ‘ONavegador do Espaco de Trabalho, ana ora RATS] | soe Fw , x Tat Ts a eee eee 0 ase Figura 1.8 © Fiditor de Matrizes € acionado clicando duss vezes sobre uma varidvel no Navegador do Espaco de Trabalho. O Efitor de Matrizes permite que 0 ususrio rodifique os valores contidos em uma varidvel ou matriz, Capitula t dnteodupdo ao MATLAB | 13, #9 +a) 1" Seisicina [© Finding Functions and Properties 2 Bevan Bien TP eStecre sence Becwecsaor Printing the Documentation Figura 1.9 © Navegador de Ajuda Uma ou mais variaveis podem ser apagadas do espago de trabalho pela selecio com o mouse e utilizagao da tecla Delete, ou clicando com o botio direito do mouse e selecionando a opgao de apagar. 1.3.9 Obtendo Ajuda Vocé pode obter ajuda no MATLAB de trés maneiras. © métode preferido € utilizar 0 Navegador de Ajuda. Vocé pode iniciar 0 Navegacor de Ajuda selecionando 0 fcone de Ajuda localizado na barra de ferramentas, ou digitando he1pdesk ou help na Janela de Comandos. E possivel também obter ajuda navegando pela documentagio do MATLAB, ou voc’ pode procurar os detalhes de um comanda em particular. © Navegador de Ajuda € mostrado na Figura 1. Existem também duas formas baseadas em linhas de comando para obter ajuda. A Primera forma é digitar help ou hep seguido de um nome de fungSo na Janda de Comandos. Se voce digitar somente help, 0 MATLAB exibiré uma lista de possiveis S6picos de auda na Janela de Comandos, Se uma fungio especfica ou nome de conunto de ferramentas for acrescentado, seré apresentada ajuda para aquela fancio ot con- junto de ferramentas especitio. ‘Asegunda maneira de obter ajuda 6 0 comando Look for. Ele difere do comando help, pois este procura por un nome de funcéo que case perfeitamente com 0 forne- cido, enquanto 0 comando lookfor pesquisa informagao resumida e répida para cada fanggo. Assim, 0 comando Looktor é mais lento que o help, mas aumenta a chance de fomnecer informagio util. Por exemplo, suponha que vocé esteja procurando uma fungio para inverter uma matriz. 0 MATLAB nao tem uma funcio chamada inverse, assim, 0 comando help inverse no encontrar nada. Por outro lado, 0 comando lockfox inverse apresentard os seguintes resiltados: >» lookfor inverse INVHILB Inverse Hilbert matrix. ACOS. Inverse cosine. ACOSH Inverse hyperbolic cosine ACOT Inverse cotangent ACOTH Inverse hyperbolic cotangent ACSC Inverse cosecant. ACSCH Inverse hyperbolic cosecent ASEC Inverse secant ASECH Inverse hyperbolic ASIN. Inverse sine. ASIN Inverse hyperbolic sine. ATAN Inverse tangent. ATAN2 Four quadrant inverse tangent. ATANH Inverse hyperbolic tangent. ERFINV Inverse error function. INV Mat PINV Pseudoinverse. IFFT Inverse discrete Fourier transform IPT? Two-dimensional inverse discrete Fourier transform. IFFIN N-dimensional inverse discrete Fourier transform. IPERMUTE Inverse permute array dimensions Com essa lista, podemos verificar que a funcio de interesse se chama inv. 1.3.10 Alguns Comandos importantes Se vocé esté iniciando no MATLAB, algumas demonstragdes podem ajudar a fornecer luma idéia de seus recursos. Para executar as demonstragdes fornecidas ro MATLAB, digite demo na Janela de Comandos, ou selecione “demos” do Espago de Langamento. (© contesido da Janela de Comandos pode ser esvaziado a qualquer momento usando o comand cic, eo contetide da Janela de Figuras corrente pode ser esvaziado fa qualquer momento usando 0 comando cl. As varidveis no espaco de trabalho podem ser esvaziadas com 0 comando clear. Conforme jé visto, o contetido do espago de trabalho persiste entre execugSes de comandos e arquivos M separados, por iss0 & possivel que os resultados de um problema tenham efeitos sobre 0 outro que vocé tenta resolver, apr hmeOOR ae TORN NS Para evitar essa possibilidade, uma boa idéia ¢ usar 0 comando clear no inicio de cada célculo independente, Outro comando importante 6 o abort. Se um arquivo M der a impressao de estar executando por tempo demasiado, ele pode conter um lago infinito e nunca temminar. Nesse caso, 0 usuario pode recuperar 0 controle digitando control-c (abreviade como sc) na Janela de Comandos. Esse comando € digitado pressionando a tecla Control e digitando “c” a0 mesmo tempo. Quando o MATLAB detecta um *c, ele interrempe 0 programa em execucio e devolve um marcador de comandos. ponto de exclamagao (1) € outro caractere especial importante. Seu uso especial 6 enviar um comando para o sistema operacional do computador. Qualquer caractere depois do ponto de exclamacio ser enviado para o sistema operacional e executado como se tivesse sido digitado na linha de comando do sistema operacional. Isso permite a inclusdo de comandos de sistema operacional diretamente em programas MATLAB. Finalmente, voc? pode acompanhar tudo o que for feito durante uma sessio MATLAB por meio do comando diary. A forma desse comando é diary nome do arquivo ‘Ap6s digitar esse comando, uma cépia de todos os dados de entrada e da maioria dos dados de saida digitados na Janela de Comandlos € ecoacdla no arquivo didtio, Bsa é uma excelente ferramenta pata recriar eventos quando algo sai errado durante uma sessd0 MATLAB. O comando diary off suspende a entrada de dados no arquivo de idtio, eo comando diary on reiniciaos dados de entrada 1.3.11. 0 Caminho de Busca MATLAB OMATLAB utiliza um caminho de busca para encontrar os arquivos M. Os arquivos M do MATLAB sio organizados em diretrios em seu sistema de arquivos. Muitos desses diretérios de arquivos M sao fornecidos junto com 0 MATLAB, e os usudrios podem adicionar outros. Se um ustario insere um nome diante do marcader do MATLAB, 0 interpretador MATLAB tenta encontrar o nome da seguinte forma 1. Ele procura pelo nome como uma variével. Se ele for uma variavel, o MATLAB exibe 0 contetido corrente da variavel. 2. Ele verifica se o nome é uma fungio ou comando predefinido.Se for, o MATLAB executa a fungio ou comando. 3, Ble verifica se o nome é um arquivo M no diretério corrente, Se for, o MATLAB executa a funcio ou comando. 4. Ble verifica se o nome é um arquivo M em qualquer diret6rio no caminto de ‘busca, Se for, o MATLAB executa a fun¢ao ou comando. Observe que 0 MATLAB verifica primeira os nomes de varidveis, portanto, se vocé definir uma varidvel com 0 mesmo nome de uma funcio ou comando MATLAB, 16 | Pograrto em MATA para Engetros aquela fungio ou comando se tornard inacessivel. Esse ¢ um erro comum cometide por ‘usudrios novatos, Erros de Programagao Nunca use uma varivel com nome igual ao de uma fungio ou comando MATLAB. Se ‘voc fizer isso, aquela funcio ou comando ficaré inacessivel. Além disso, se houver mais de uma fungi ou comando com © mesmo nome, 0 primeiro encontrado no caminho de busca sera executado, e os outros permanecerio inacessiveis. Iss0 6 um problema comum para novatos, pois as vezes cles criam arquivos M. com nomes iguais aos de fungGes MATLAB-padrao, o que toma esses arquivos inacessiveis, Erros de Programagao Nunca erie um arquivo M com nome igual ao de uma funcio ou comando MATLAB, OMATLAB contém um comando especial (hich) para ajudara descobrir qual ver- io de um arquivo esté sendo executada, e onde ele estélocalizado. Isso pode ser util para descobrir conflitos de nomes de arquivos. O formato desse comando which nome da fungao, onde nome da funcdo é o nome da fungao que voct esta tentando localizar. Por exemplo, a fungio de produto cartesiano cross .m pode ser localizada asin: > which crose D: \Mat 1abRi2\toolbox\matlab\ spec: n\eross.in caminho de busca do MATLAB pode se: analisado e modificado a qualquer ‘momento pela selegio do Caminho de Busca no Espago de Langamento, ou digitando edittpath na Janela de Comandos. O Caminho de Busca esta apresentado na Figura 1,10. Ele permite que 0 usuério acrescente, remove ou modifique a ordem dos diretsrios no caminho. Outras fungdes relacionadas com caminhos so: + edapath —_Adiciona um diretério ao caminho de busea do MATLAB. + path Exibe 0 caminho de busca do MATLAB. + path2re —Adiciona o diretdrio correate ao caminho de busca do MATLAB. «empath Remove um diretsrio do caminho de busca do MATLAB, 1.4 Utilizando o MATLAB como Prancheta de Rascunhos Em sua forma mais simples, o MATLAB pode ser usado como prancheta de rascunhos para efetuar cdlculos matemticos. Os célculos slo digitados diretamente na Janela de Comandos, usando os simbolos +, -,”, / e para soma, subtragao, multiplicagio, divisio Captus 1 necyzo zones | 17 CED 0) x! -Alenanges the oot nme esr naowen curios. | e ove Ton =n eoboematebons 1 aoboraabang 21 Ztobasmatebelt [So wares 2ctocratanenn |Somsrateizoototmatsbepectin [So marane1zoonoematanmann [So waraee1 mooboematsbstae [So mstate12eotosmatabaio |Somateoe12wopoemarcbovan [So watste12abotmatebetn |Enowstseetotboematatisparin 4 sme _| cow | newt | _ ovat ie Figura 4.10 A Ferramenta de Caminhos. € poténcia, respectivamente. Apés digitar uma expressio, o resultado ¢ automat ‘mente calculado e exibido. Por exemplo, suponha que queiramos calcular 0 volume de ‘um cilindro de raio r ealtura A drea do circulo na base do clindro é dada pela equacio A=nt ay 0 volume total do cilindro é al a2) Se 0 1aio do cilindro & de 0,1 m e a altura é de 0,5 m,o volume do cilindro pode ser obtido usando as declaragSes MATLAB (as entradas do usuario so apresentadas em negrito > A= pi * 0.12 0.0314 >VveaAt OS 0.0187 Observe que pi € predefinido com o valor 3,141592... Observe também que ¢ valor armazenado em A foi preservado pelo MATLAB e reutilizada no célculo de V. oe ‘ 18 | Pogamagde om M49" para Ergenteres Neste teste, faremos uma verificagdo répida da sua compreensio dos conceitos apre- sentados no Capitulo 1. Se vocé tiver dificuldades com o teste releia as segGes, consulte seu professor ou discuta 0 material com um colega. As respostas estao no Apéndice B. 1. Qual € a fungio da Janela de Comandos MATLAB? E a da Janela de Edi- Bo/Depuraglo? E a da Janela de Figuras? 2. Liste as diferentes maneiras de obter ajuda no MATLAB. 3. O que é um espaco de trabalho? Como voce pode determinar 0 que esté arma- zenado em um espaco de trabalho MATLAB? 4, Como vacé pode limpar 0 contetido de um espaso de trabalho? 5. A distancia percorrida por uma bola em queda livre 6 dada pela equagio. t+ at atates Use 0 MATLAB para calcular a posigio da bola no tempo !=5 8 se x)= 10m, v= 15 m/sea=-981 m/s? 6, Suponha que x= 3 ey = 4. Use o MATLAB para avaliar a seguinte expressio: 2p ow As questies abaixo devem auxilid-lo a familiarizar-se com as ferramentas MATLAB. (Ge tiver uma versio do MATLAB anterior 3 6.0, vocé pode sentir certa dificuldade ‘com algumas questies, pois algumas ferramentas sio diferentes em versées mais antigas do MATLAB.) 7. Execute os arquivos M calc_area.m ¢ sin_x.m na Janela de Comandos. Depois, utilize o Navegador do Espago de Trabalho para determinar quais va- ridveis estio definidas no espaco de trabalho corrente 8, Use 0 Editor de Matrizes para examinar ¢ modificar 0 contetido da variavel x ro espaco de trabalho. Entio, digite o comando plot (x.y) na Janela de Comandos. O que acontece com os dados exibidos na Janela de Figuras? Neste capitulo, estudamos os tipos basicos de janelas MATLAB, o espaco de trabalho e como obter ajuda online. A drea de trabalho MATLAB surge quando iniciamos 0 pro- grama. Ela integra muitas das ferramentas do MATLAB em um dinico local. Dentre fessas ferramentas, temos a Janela de Comandos, a Jancla de Histérico de Comandos, © Espago de Langamentos, 0 Navegador do Espaso de Trabalho, o Editor de Matrizes apts 1 ineoauto ao usrias | 19 ‘0 mostrador do Diretsrio Corrente. A Jancla de Comandos & a janela mais importante: nla, todos os comands sio digitados e os resultados sio apresentados. A Janela de Edigio/Depuragio é usada para criar ou modifcar arquivos M. Ela exbe 0 contetdo do arquivo M com uma codificagio de cores por fungio: eomentério, palavras-chave, cadeias de caracteres, e assim por diante. ‘AJanela de Figuras ¢ uilizada para exbir gréficos. Um usudrio MATLAB pode obter ajuda por meio do Navegador de Ajuda cu das fangbes de ajuda em linha de comando help e look for. O Navegador de Ajuda possibilita acesso total a documentagio MATLAB. A funcio de linha de comando help apresenta ajuda sobre fungSes especificas na Janela de Comandos. Infelizmente vvect precisa saber 0 nome da fungSo para obler ajuda sobre ela. A funcio Locke for procura uma cadeia de caracteres na primeira linha de comentirios de todas as fungbes MATLAB e exibe os casamentos Quando um usuario digita um comando na Janela de Comandos, 0 MATLAB pro- cura o comandlo nos diretérios especificados no caminho MATLAB. O MATLAB exccuta « primeire arquivo M no caminho que casa com o comando, e qualquer outro arquive M com 0 mesmo nome nunca é encontrado. A Ferramenta de Caminho pode ser usada para adicionar, remover ou modificar dretdrios no camino MATLAB, 1.5.1 Resumo do MATLAB O resumo abaixo lista todos os simbolos especiais MATLAB descritos neste capitulo, juntamente com uma breve descrigSo de cada um. Simbolos Espec + Soma = Subtragio + Maltiplicagao 1 Divisa 1.6 Exercicios 11. As seguintes declaragies MATLAB desenham a fungio y(x) = 2e-2 para o inter- valo 0x10, x = 0:0.1:10; y= 2 * exp( -0.2 * x); plot (x,y) Utilize a Jancla de Ediggo MATLAB para criar um novo arquivo M, digite essas declaragées no arquivo e grave o arquivo com o nome test} .m. Execute o programa digitando o nome test I na Janela de Comandos. Que resultado vocé obtémn? 1.2. Obtenha ajuda a respeito da funcio MATLAB exp usando: (a) 0 comando “help exp” digitado na Janela de Comandos e (b) 0 Navegador de Ajuda, 20 13 14 18 18 Ww 18 1 Pramopto em MANAB® pera Expres Utilize 0 comando Look or para determinar como obter o logaritmo base 10 de ‘um ntimero em MATLAB. Suponha que «= 1 v «3, Avalie as expresses a seguir usando 0 MATLAB: au * 30 2» b, wae 2 {= dae 3 Utilize o Navegador de Ajuda do MATLAB para encontrar o comando necessério para mostrar o diretério corrente MATLAB, Qual ¢ 0 diretério corrente quando ‘© MATLAB 6 iniciado? Utilize o Navegador de Ajuda do MATLAB para descobrir como criar um novo diretério de dentro do MATLAB. Crie um novo dizetério, denominado myniewdir, s0b o diretério corrente, Coloque esse nove diretério no topo do caminho MATLAB. Modifique o diretério corrente para my cione as seguintes linhas: wudiix. Abra uma Janela de Edigio e adi- % Create an input array from -2*pi bs -2epispi/10:2*pi; to 2¢pi 4 calculate Iein(t) | % = abs (sin(t}): % Plot result plot(t,x); Grave o arquivo com 0 nome test2..me execute-o digitando test? na Janela de ‘Comendos. O que acontece? Feche a Janela de Figuras e retorne ao diret6rio original do inicio do MATLAB. Digite “test2” na Janela de Comandos. O que acontece, e por qué? Capitulo 2 MATLAB Basico Neste capitulo, vamos apresentar alguns elementos bésicos da linguagem MATLAB. No final, vocé deve ser capaz de escrever programas MATLAB simples, porém funcionais. 2.1 Varidveis e Matrizes ‘A.unidade fundamental de dados, em qualquer programa MATLAB, 6a matriz. Matriz ‘uma colegio de valores de dados organizados em linhas ecolunas, conhecidos por um nome nico (ver Figura 21). Valores individuais de dados em uma matrz si acessados por meio do nome da matriz, seguido de indices entre parénteses que identificam 2 linha e a coluna do valor particular. Mesmo os escalares 630 tratados como matrizes NO MATLAB ~ cles sfo simplesmente matrizes com somente uma linha e uma colina, Matrizes podem ser classificadas como vetores ou matrizes propriamente ditas, © termo “vetor” geralmente descreve uma matriz.com somente uma dimenslo, enquanto © termo “matriz" costuma ser usado para descrever matrizes com duas ou mais di- rmensies. Neste texto, vamos usar 0 temo vetor na discussio de matrzes unidimen- slonais,€ 0 termo matriz na discussio de matrizes com duas ou mais dimensdes. Se "uma diseussio em particular se apicar aos dois tipos de matrzes,usaremos também 0 termo genérico “matriz" © tamanho de uma matriz é especificado pelo niimero de linhas e de colunas, sendo 0 niimero de linhas apresentado antes. O niimero total de elementos da matei2 sez4 0 produto do msimero de linhas e o mero de colunas. Por exemple, os tamanhos das matrizes a seguir si: INI: No original em ings temo genic ary, fend temo mai eservado para mateizes com das cu main dimensdes Nesta traducio, explcitaremos quand estvermosfalando de matnizes em eral ou de matizes com necestariamente dis o4 mais dimens. | 22 | Proganacio om MATAR? para Enenteros nha 1 —> nha 2—> Lita 3—> inna 4—$> | fiiid Colt Col.2 Col. Cold COL mmatiz are Figura 2.1 Uma matriz é uma colegio de valores de dados organizados em linhas ¢ colunas Amatri2 ar exibida aqui é composta por 20 elementos, organizados em quatro linhas cinco colunas. O elemento destacado nessa matrix seria identificado como arr (3,2) Mati. Tamanho - 12 = ]34] Esse éumamatrie 3 +2.que contin 6 elementos 56. b=[123 4] Esse Guma mate 14 conhecida comoum vetorlinks: contém & lementos 1 e-|2 Essa 6 uma matriz 31, conhecida come vetorcoluna contém 3 elementos. a Elementos individuais na matriz sio identificados pelo nome da matriz, seguido da linha e da coluna do elemento em particular. Se a matriz é um vetor linha ou co- luna, somente um indice é requerido. Por exemplo, nas matrizes acima, a (2,1) = 3 eci2) = 2 Uma varidvel MATLAB 6 uma rogi3o de memoria que contém uma matriz, conhecida por um nome especificado pelo ususro. O contetido de uma matriz pode ser utilizado ou modificado a qualquer momento pela inclusao de seu nome em um co mando MATLAB apropriado. apts 2 arias sisco | 28 (Os nomes das varidveis MATLAB precisam iniciar com uma letra, seguida de qualquer combinacio de letras, mimeros e o simbolo de sublinhado (_). Somente os primeizos 31 caracteres sio significativos; se mais do que 31 caracteres forem utilizados, fs caracteres restantes serio ignorados. Se duas varidveis forem declaradas com dife- renga somente no 32? caractere, o MATLAB as trataré como a mesma variavel. Certifique-se de que os nomes de variiveis sejam tnicos nos primeiros 31 caracteres, Caso contririo, o MATLAB nio poder diferenciar as varidveis. ‘Ao escrever tum programa, ¢ importante escolher nomes com significado para as variaveis. Nomes com significado tomam um programa muito mais ficil de ler e man- ter, Nomes como dia, mes e ano sio claros até mesmo para alguém que vé o programa pela primeira vez. Como os espacos ndo podem ser usados em nomes de varidveis, MATLAB, o caractere de sublinhado pode ser usado para criar nomes com significado. Por exemplo, taxa de cimbio pode ser representada como taxa_de_canbio, Basic ran Programagao: Sempre use nomes descritivos e féceis de lembrar para suas variaveis. Por exemplo, uma taxa de cimbio poderia ser chamada de taxa_de_cambio. Essa pritica tomard seu programa mais claro e fécil de entender. F tamlsém importante incluir um dicionério de dados no cabecalho de qualquer programa que vocé escrever. Um dicionario de dados lista a defini de cada varidvel Usada em um programa. A definigio deve incluir uma descrigio do conteido © as unidades de meclidas usadas, Um diciondrio de dados pode parecer desnecessério enquanto 0 programa esté sendo escrito, mas é de grande vlor quando vocé ou outra pessoa precisa voltar para 0 programa posteriormente, [lbs Pratica de Programagag: 2 rie um dicionatio de dados para cada programa, a fim de tomar mais fécil a ‘manutengio dos programas. Be 7 ‘Allinguagem MATLAB é sensivel & capitalizagao, o que significa que letras mais culas e minisculas nio so a mesma coisa. Assim, as Varldveis name, NAME e Nane S80 diferentes no MATLAB. Vocé precisa ser cuidadoso no uso de capitalizagio ao em- \ 24 | Powranagso om MATLAe® gre Eger: pregar uma varidvel. Embora nao seja requerido, éusual utilizar caixa baixa para nomes de variaveis ordindtias. Boa Prética de Programagao Verifique se vocé capitaliza uma variével exatameate da mesma forma cada vez que ela € usada. Uma boa pritica é usar sempre caixa baixa em nomes de varidveis. s tipos mais comuns de varisveis MATLAB so Gouble e char. Variéveis do tipo double sio escalares ou matrizes de 64 bits com ntimeros de dupla precisio e ponto flutuante, Elas podem representar valores reais, imaginérios ou complexos. O3 Componentes reais © imaginérios de cada varidvel podem ser nimeros positivos ou negativos, variando de 10° a 10%, com 15 a 16 digitos decimais de precisio. S40. tipo numérico principal de dados no MATLAB. Uma varidvel do tipo double € criada automaticamente quando um valor numérico ¢ associado a um nome de varidvel. Por exemplo, a declaracio a seguir cria uma variavel de nome var contendo um elemento tinico de tipo double, e armazena © valor complexo (1 + i) nela. var = 14 i; sie Nels tip cha sh compass por eae xmas com valores 16 its, cada uma representando um nico carsetere Maries dese tipo of usadas para Cadel de caracteres.Sio cradas automaticamente quando um Caractere nice ou uma cada de caacteres io assoiados a um nome de varvel. Por exemple, deca rao abaixo cia uma varavel do tipo char com come coment armazeng a cada topecticada ela, Uma ver executada a declarajio, coment serd uma mattis de caracteres de 1x26, comment = ‘Isso é uma cadeia de caracteres’; Em linguagens como C, o tipo e o nome de cada varidvel precisam ser declarados explicitamente em um programa antes de usar a varidvel. Essas linguagens sio chamadas de tipos fortes. Em contraste, MATLAB & uma linguagem tipos fracos, Varidveis podem ser criadas a qualquer momento simplesmente associando valores a elas, e 05 tipos de dados associados 8 varidvel determinam o tipo de variavel criada, 2.2 Iniciando Varidveis no MATLAB Variaveis MATLAB sio criadas automaticamente cuando iniciadas. Existem trés formas comuns de iniciar uma variével em MATLAB: 1, Associar dados 8 variavel em uma declarasio apropriada, 2. Fornecer dados a variavel pelo teclado, 3. Ler dados de um arquivo. opiate? KaAB isco | 25 ‘As duas primeiras maneiras serdo discutidas aqui; a terceira abordagem seré discutida na segio 27. 2.2.1 Iniciando Varidveis em Expressées de Atribuigao ‘Aforma mais simples de criar e iniciar uma varidvel & associar um ou mais valores em uma declaragio de atribuigio. Uma declaracao de atribuigao tem a forma geral var = expressao onde var 0 nome de uma varidvel e expressdo é uma constante escalar, uma matriz ‘ou a combinacio de constantes, outras variaveis e operagées matemsticas (+, ~ etc). valor da expressao é calculado por meio das regras normais da matematica, ¢ 0 resul- tado 6 armazenado na variavel. Exemplos simples de variaveis iniciadas com decla- ragies de atribuiggo sio: var = 40%i; var2 = var / 5; array = (123 4); x= diy =2 O primeito exemplo cria um escalar do tipo double e armazena o nimero imagindrio 49i nele. O segundo exemplo cria uma variavel escalar var? e armazena o resultado da expressio var /5 nela.O terceiro exemplo ria uma varivel array e armazena nela um vetor linha de quatro elementos. O tiltimo exemplo mostra que declaragbes muitiplas de atribuigfo podem ser colocadas em uma mesma linha, desde que elas sejam sepa- zadas por virgula ou ponto-e-virgula, Observe que, se alguma das varidveis jd existisse durante a execugio da declaragi0, os contetidos anteriores seriam perdidos. Conforme mostra 0 terceiro exemplo, variéveis podem também ser iniciadas com ratrizes de dados. Essas matrizes sio construidas com 0 uso de colchetes ((}¢ ponto- e-virgula. Todos os elementos de uma matriz sio listados por linha. Em outras palavras, 0s valores de cada linha sio listados da esquerda para a divita, com a linha de cima primeito ea linha de baixo por tltimo. Valores individuais em uma linha sio sepacados por brancos ou por virgulas, eas linhas séo separadas por ponto-e-virgula ou noxas i has. As expressGes a seguir so todas matrizes sintaticamente corretas que podem ser usadas para iniciar uma varidvel GB.) Essa expressio cria uma matriz 1 x 1 (um escalar) {que contém 0 valor 34. Os colchetes nio sio reces- Essa expressio cria uma matri2 1 3 que contém 0 vetorlinha [123] Essa expressio cria uma matriz 3 x 1 com 0 vetor wl] 28 | Pramas om MATLAB gre Egenies (8. 2, 35 4, 5, 6] Blan expresi a una mati 23 gue contin mate 23] ree aa fae eps ia una mati 23 que conn 63a rts [2 23] Ott ce pera tbe cnr 45 6 m Tin a primeira linha da matriz, a Essa expressio cria uma matriz vazia, que nio con- tém linhas nem colunas, (Observe que iss0 nao é a ‘mesma coisa que uma matriz com zeros.) Observe que o niimero de elementos em cada linha de uma matriz precisa ser 0 ‘mesmo. O niimero de elementos em cada coluna também precisa ser 0 mesmo. Uma expressio como (235; 451 ¢ legal, pois a linha 1 tem trés elementos ea linha 2 tem somente dois elementos. Sree tronanett (© mtimero de elementos em todas as linhas de uma matriz precisa ser o mesmo, ¢ 0 nti- mero de elementos em todas as colunas também. Tentar definir uma matriz com ruimeros diferentes de elementos nas linhas ou nas colunas produziré um erro quando a declaracio for executada, MATE RR As expresses utilizadas para iniciar matrizes podem incluir operagbes algébricas a totalidade ou partes de matrizes previamente definidas. Por exemplo, as declaragbes de atribuicio a= (0 167)7 b= (a(2) 7 aly definirdo uma matriz a = (0 8) eumamatrizb = [8 7 0 8] Nem todos 0s elementos de uma matriz precisam estar definidos quando el criada, Se um elemento especifico da matriz estiver definido e um ou mais elementos antes dele ndo, 03 elementos anteriores sero automaticamente criados e iniciados com ‘0 valor zero. Por exemplo, se c nao foi previamente definido, a declaragio (2, 3) 000 oo pela especificagio de um valor para um elemento adiante do tamanho definido, Por exemplo, suponha a matriz d = [1 2}. Entdo, a declarac3o ai = 4; produsirda matiiee = [ De maneira similar, uma matriz pode ser estendida produzirdamatrizad - [1 20 4]. apie? marutssisco | 27 © ponto-e-virgula no final de cada declaragio de atribuigio anterior tem uma fungio especial: ele suprime o eco autematica de valores que ocorre normalmente quando ‘uma expressio ¢ avaliada em uma declaracao de atribuigéo. Se uma declaragio de atribuigdo & digitada sem 0 ponto-e-virgula, os resultados da declaragao sio automati ‘camente exibidos na Janela de Comandos. Des (1, 2 3) 4 5, 6) 203 45 6 Se um ponto-c-virgula é colocado no final da declaragio, 0 eco desaparece. O eco éuma forma excelente para verificar rapidamente o seu trabalho, mas ele atrasa seriamente a execugdo de programas MATLAB. Por essa razo, normalmente suprimimos 0 eco 0 tempo todo. [Ecoar os resultados de célculos, entretanto, uma étima técnica pritica de depuragio, Se voce nao esta seguro a respeito dos resultados de uma declaracio de atribuigao espe- ‘ifca, simplesmente nao coloque o ponto-e-virgula na declaragao: os resultados sero exibidos na Janela de Comandos assim que a declaracao for executada. [Be Pratica de Propramagao Use um ponto-e-virgula no final de todas as declaragées de atribuigéo MATLAB para suprimir 0 eco de valores atribuidos na Janela de Comandos. Isso acelera muito a exe- custo dos programas. Be fia Pratica de Programagao Se for preciso examinar of resultados de uma declaragao durante a depuracio ée um. programa, voce pode remover o ponto-e-virgula daquela declaragéo para que seus resultados sejam ecoados na Janela de Comandos. B 2.2.2 Iniciando com Expresses de Atalho E simples ciar pequenas matrizeslistando explicitamente cada termo na matri, mas 0 {que torre se a maria contivercentenas ou mesmo milhares de elementos? Nao & pr co escrever separadamente cada elemento da matrz! {© MATLAB tem uma notagio especial de atalho para esas ccunstancias, i zando 0 operador dois-pontos. O operador dois-pontos especifica uma série de valores | | | A { j ui £8 | Programazdo em MATLAG® pare Engeabeiras pela especificagio do primeiro valor na série, o passo de incremento e o tiltimo valor na série. A forma geral de um operador dois-pontos é prim: incr:1timo onde prim ¢ 0 primeiro valor na sériv, incr ¢ o passo de ineremento e tiltimo & 0 GL timo valor na série. Se o incremento for um, ele pode ser omitido. Por exemplo, a expresso 1:2:10 € um atalho para um vetor-linha de 1 x 5 com os valores 1, 3, 5,79. > x = deaet0 1305 7 8 Com a notagao de dois pontos, uma matriz pode ser iniciada com 05 cem valores Ei, 2k, ow Reda seguinte maneita: ig” i ‘saint angles = (0,01:0,01:1) * pir Expresses de atalho podem ser combinadas com 0 operador de transposigio (’) Para iniciar vetores coluna e matrizes mais complexas, O operador de transposiga0, ‘roca linhas e colunas de qualquer matriz & qual ele seja aplicado. Assim, a expressao, f= [ieaye; .gera um vetor linha de quatro elementos {1 2 3 4], e depois transpée esse vetor no vetor 1 coluna de quatro elementos £ = De maneira similar, as expressdes, 3 4 get hs [g's produzem a matrizh = 2.2.3 Iniciando com Fungées Predefinidas Matrizes também podem ser iniciadas por meio de fungées predefinidas do MATLAB, Por exemplo, a fungao zeros pode ser usada paracriar uma matriz de zeros do tamanho desejado, Existem muitas formas de fungao zeros, Se a fungao tiver um tinico argu- mento escalar, ela produziré uma matriz quadrada wtilizando 0 argumento tinico como Ontimero de linhas e de colunas da matriz. Se a funcio tiver dois argumentos escalares, © primeiro argumento seré o namero de linhas eo segundo argumento sera o nimero de colunas. Como a fungao 91 2e retoma dois valores com onntimero de linhas e de colu- ‘nas na matriz, ela pode ser combinada com a fungio zeros para gerar uma matriz de Capito 2 NATLABBisico | 28 zeros com 0 mesmo tamanho de outra matriz, Alguns exemplos de uso da fungio zeros sio apresentados a seguir a = zeros(2); b = zeros (2,3); c= 2; 3 4); d= zeros (size(c)]; Tabela 2.1 Fungdes MATLAB Uteis para Iniciar Varidveis Fuga Propésito _ per03(n ‘Gera uma matin nde 20s, zeros(n,m) (Gera uma matin xm de 208 rerosisize! (Gera uma matiz de 2ers do mesmo tamanho que ar onesin} Gera uma matriz nn de ans one (Gera uma mati a m de uns ones (size(ers!) Gera uma matriz de uns do mesmo tamanho que sr. Gera uma matric identidade nx 0, Gera uma mitra identidade n= [Retoms o comprininto de um vetor ou a dimensfo malor de uma mati bid ‘mensional dengeniazr) size(are) Retoma dois valores, especificande o mimero de inhas ¢ ode colunas em ar Essas expresses geram as seguintes matrizes: eefool Lo es) “Gal so bal ‘De maneira similar a fungao ones pode ser usada para gerar matrizes que contém uns, e a fungi eye pode ser usada para gerar matrizes identidade, nas quais os ele- ‘mentos da diagonal principal sio uns e os outros elementos sio zeros. A Tabela 2.1 apre- senta uma lista de fungdes MATLAB comuns e tteis para iniiar variaveis 2.2.4 Iniciando Variéveis com Entrada pelo Teclado Também 6 possiveliniciar uma variavel com dados digitados diretamente pelo teclado. Essa opcio permite que um arquivo de script solicite ao usuério a entrada de valores durante a execusio. A funcio input exibe um marcador na Janela de Comandos ¢ espera o usudrio digitar uma resposta, Por exemplo, considere a seguinte expressio: my_val = input (‘Enter an input value:'); (ee 1 rrogramagao em MALLALS™ para tagenneiras: Quando essa expressdo € executada, o MATLAB escreve a cadeia “Enter an input value: e espera a resposta do usuario, Se o usuério fornece um tinico mimero, 0 nniimero pode ser digitado, Se o usurio fornece uma matriz, ela precisa ser cercada por colchetes. De qualquer maneira, o que for digitado serd armazenado na varidvel \ my_val quando a tecla Enter for pressionada, Se apenas a tecla Enter for pressionada, ‘uma matriz vazia serd criada e armazenada na varidvel. i Sea fungio input tiver @ caractee "3" como segundo argumento, os dados de \ entrada serio devolvidos para 0 usuéria coms uma cadeia de caracteres Assim a | cexpressio > inl = input (‘Enter data: )) Enter data: 1.23 armazena o valor 1.23 em ind ea expressio » 4nd = input (‘Enter data: ‘,/8/); Enter data: 1.23 armazena a cadeia de caracteres “1.23 em in2, Este teste apresenta uma verificagio répida do seu entendimento dos conceitos apre- sentados nas Sesdes 2.1 ¢ 2.2. Se vocé tiver problemas com o teste, releia as segdes, per- ‘gunte ao seu professor ou discuta 0 material com um colega. As respostas podem ser fencontradas no final do live. 1. Qual a diferenga entre uma matrz e um vetor2 2. Responda as questéesseguintes considerando a mattis abaixo 11-32 34 06 © =[06 11-06 31 1308 55 00 2, Qual o tamanho de c? b. Qual o valor de-o12,3)? . Apresente os indies de tados os elementos cujo valor sia 06 : 3. Determine o tamanho das seguintes matizes, Verfque suas respostasciando { as matrizesno MATLAB e usando ocomando whos ou Navepador do Bape de Trabalho. Observe que as vltimas matrizes podem depender das definigoes de. * ‘matrizes definidas anteriormente neste exercicio, Capitulo? MATLAB Bésico | 31 4, Qual o valor de w(2,11? 5. Qual o valor de x (2,1)? 6. Qual o valor de y (2,1)? 7. Qual o valor de v (3) apés a execugio da expressio (g)? Lina 1 —> : Linhia 1 —> ] Lintia 4—> 7 ‘una A$» fit Colt Gol2 Gol 3 Cold Cah. 5 a2 (Lin, icol} (0) Mate Bicimensional i1in) (@) Matrz Unigimensional Figura 2.2 Representagées de matrizes uni e bidimensionais. 2.3 Matrizes Multidimensionais Conforme vimos, as matrizes MATLAB podem ter uma ou mais dimensSes. Matrizes unidimensionais podem ser visualizadas como uma série de valores colocados em uma coluna, com um tinico indice para selecionar os elementos individuais da matriz (Figura 2.2a), Essas matrizes sio titeis para descrever dados que so fungSes de uma veridvel independente, como uma série de medidas de temperatura efetuadas em intervalos fixos de tempo. Alguns tipos de dados sao fungdes de mais do que uma variavel indepencente. or exemplo, podemos medir a temperatura em cinco localidades diferentes e quatro momentos diferentes. Nesse caso, nossas 20 medidas poderiam ser logicamente 32 Pramagdo am NATLAP oa Enpntirs agrupads em cinco colunas, cada uma contendo quatro medidas, sendo cada coluna reservada para uma localizagio (Figura 22b). Nesse caso, usamos dois indices para acessar Um dado elemento na matri2: 0 primeio indice para selecionar a linha e © segundo para selecionar a coluna. Essas matrizes sio denominadas matrizes bidimen- sionais. © ntimero de elementos em uma matriz bidimensional seré o produto dos _nimeros de linhas e de colunas na matriz. (© MATLAB permite a criagio de matrizes com tantas dimensdes quanto necessrio para um dado problema. Essas mavrizes tém um indice para cada di- mensio, ¢ um elemento individual é selecionado pela especificagio de um valor para cada indice. O mimero total de elementos namatriz sera o produto do valor maxi- mo de catia indice. Por exemplo, as duas expresses seguintes criam uma matriz ¢ de2x3*2: b> e(:,t/2)2(1 23; 45 61; p> b(s,t-2)507 8 9; 10 12 121; >> Whoa © Meme Size Bytes Class. ‘ 2x3x2 96 double array Essa mattiz. contém 12 elementos organizados (2 x 3 x 2), e seu contetido pode ser exibido como o de qualquer matriz. 8 2003 56 8 9 a2 2.3.1 Armazenando Matrizes Multidimensionais em Meméria Uma matriz multidimensional com m linhas e n cclunas conteré m x n elementos, e esses elementos ocupario m x n localizagbes sucessivas na meméria do computador. Como esses elementos sio organizados na meméria do computador? O MATLAB sempre aloca os elementos da matriz.em ordem de coluna ~ ou seja,aloca a primeira coluna na ‘meméria, depois a segunda, depois a terceira, e assim por diante, até que todas as colu ras tenham sido alocadas. Na Figura 23, temos esse esquema de alocagio de meméria [para uma Matriz 4 3 a. Como podemos Ver, o elemento a (2,2) &efetivamente o quinto elemento alocado na meméria. A ordem de alocacio desses elementos na meméria sera importante quando discutirmos enderegamento ce indice tinico, na proxima seco, ¢ as fungdes de E/S de baixo nivel, no Capitulo 8. (O mesmo esquema de alocacio se aplica a matrizes com mais de duas dimensdes, © primeira indice da matriz € incrementado mais répido, o segundo inclice, menos EE ~ Capita 2 maTLAB Bisco | 33 “épido, ¢ assim por diante; 0 ltimo indice ¢ o incrementado mais lentamente. Por esp, em una mati 2» 2* 2, elementos seam aleados na seguintecrdem (LAA), QA1), 2,1), 21, (1.2) (2A2, (1,22), (2.2.2). 2.3.2 Acessando Matrizes Multidimensionais com um Unico Subscript ‘Uma das peculiaridades do MATLAB 6 que ele permite que um usudrio ou pro- gramador trate uma matriz multidimensional como se ela fosse uma matriz Ghidimensional cujo comprimento é igual ao ndmero de elementos na matriz multi- Gimensional. Se uma matriz multidimensional for enderegada por meio de uma tinica dimensao, os elementos serdo acessados na ordem em que foram colecados Por exemplo, suponha a declaragdo de uma matriz de elementos 4 x 3 a ay an aaa ay) a02) (2,2) 13,2) 214.2) aia) (2,3) 203.3) re} ac43) @ © Figuea 2.9 (c) Valores de dados para a matiz 2. (b) Organizagio dos valores na meméra para a mate a 2 34 | Proparasio om MATLAB? pore Engenios seas (223; 45 6; 789; 1042 12) 12 3 4 5 5 7 8 8 10001 aa Ovalor de a (51, entio, sera 2, que € 0 valor do elemento a1, 2), pois a (1,2) foi alo- cado em quinto lugar na meméria Em circunstancias normais, vocé nunca deveria utilizar esse recurso do MATLAB. © enderecamento de matrizes multidimensionais com um indice tinico € uma receita para confusio. Boa Prética de Programagao Sempre utilize 0 niimero apropriado de dimensies ao enderecar uma matriz multi- dimensional. 2.4 Submatrizes E possivel selecionar e utilizar subconjuntos de matrizes MATLAB como se fossem matrizes separadas. Para selecionar uma parte de uma matrz, simplesmente inclua uuma lista de todos os elementos a serem selecionados entre parénteses apds 0 nome da matriz, Por exemplo, suponha que a matriz arri seja definida da seguinte arrt = (1.1 -2.2 3.3 -4.4 5.9); Entdo, arri (3) € simplesmente 33, are2( (1 arri(1:2:5) éamatriz (1.13.3 5.5] Para uma matriz bidimensional, dois-pontos podem ser usados como indice para selecionar todos os valores daquele indice. Por exemplo, suponha que 41) &a matriz (1.1 -4.4) & arr2 6 (12 123 Essa declaragio criaria uma matriz arr2 contende os valores | -2 -3 -4 345 Com essa definigéo, a submatriz arr? (1, :) seria (1 2 3],easubmatriz arr2 ( “i _-4+—- i | ape? ware Bisico | 35 2.4.4 AFungao ena © MATLAB tem uma fungéo especial denominada end, muifo til para criar indices de matrizes. Quando utilizada no indice de uma matriz, a fungdo end re torna o valor mais alto admitido para ele. Por exemplo, suponha que a matriz arr3 seja definida como arg = 112345678 Entéo, arr3(5:end) seriaamatriz (5 § 7 8],earr3 (end) seria valor 8. valor retornado por end é sempre o ualar mais alto de um dado indice. Se end aparece em diferentes indices, ele pode retomnar diferentes valores na mesma expressdo, Por exemplo, suponha que a matriz 3 4 ara seja definida como: area = (123 4; 567 8 9 10.11 121; 678 10 112, meiro end retornou o valor 3, enquanto o segundo end retornou o valor 4! Acxpressio arr4 (2: send) retomariaa mati Observe queo pi 2.4.2 Utilizando Submatrizes no Lado Esquerdo de uma Declaragao de Atribuigao E também possivel utilizar submatrizes no lado esquerdo de declaragdes de atribuigéo para atualizar somente alguns valores da matriz, desde que a forma (0 imero ce inhas ‘ede colunas) dos valores atribuidos case com a forma da sulbmatriz, Seas formas nio casarem, ocorrerd um erro, Por exemplo, suponha que a matriz 3 x 4 arr4 seja defi- rida como: oo arrd = (1.23 4; 5678; 9 10 12 12) arrd = 1 2 a 4 5 6 8 9 1 mB Entao, a seguinte declaracio de atribuicio ¢ legal, uma vez que as expresses nos dois, lados do sinal de igual tém a mesma forma (2 x 2) p> arrd(2:2,(1 4]) = (20 24; 22 23) 20002 3 22 6 7 23 9 10 a 2 30 | Progamapso em MATLAB psro Engenbcas Observe que os elementos (1,1), (14), (1) © 24) da matriz foram atualizados. Contrastando com iso, a express seguir € legal, pois os dois lados nfo tem a >> arr5(1:2,1:2) = [3 4) 22? Bm una stribuigdo A(matriz,matriz) nhas em B 0 mimero de elementos em A matriz precisam ser os mesmos. B, 0 mimero de 1i com linha de indice Erros de Programagao Para declaragdes de atribuigéo com submatrizes, as formas das submatrizes em ambos os lados do sinal de igual precisam casar. © MATLAB geraré tum erro se elas nao casarem, Existe uma diferenga importante, no MATLAB entre atribuir valores a uma submatriz e atribuir valores a uma matriz. Se valores sio atribuidos a uma submattiz, somente aqueles ‘ualores so atualizados e todos os outros valores na matris permanecem inalterades, Por outro lado, se valores sio atribuidos a uma matriz, todo 0 contetido da matrizé apagado e substtuido pels ‘novos valores, Por exemplo, suponha que a matriz 3x 4 arr4 seja definida como: p> arrd = [1.23 4; 5 67 8 9 10 11 12) 12 3 4 5 6 7 8 9 i ul 4 Entio, a seguinte declaragio de atribuigio substitui os elementos especificados de are >> arrd(1:2,{1 4]) = (20 21; 22 23] area 2 2 3 2 22 8 3 9 wm um BD Contrastando com isso, a seguinte declaracio de atribuigio substitui todo o conteido de axed por uma mattiz 2% 2: >> arré (20 21) 22 23] Boa Prética de Programagao Diferencie corretamente a atribuigio de valores a uma submatriz ea uma matriz. 0 MATLAB tem comportamentos diferentes nesses dois casos. fapinle2 wares isco | 37 ~2:4.3 Atribuindo um Escalar a uma Submatriz Um valor escalar no lado direito de uma declaragao de atribuigéo sempre casa com a forma especificada no lado esquerdo. O valor escalar ¢ copiado em todos os elementos cespecificados no lado esquerdo da declaragao. Por exemplo, assuma que a matriz 3x 4 ard seja definida como: arrd = (12345678; 9 10111 esse caso, a expresso abaixo atribui o valor um a quatro elementos da matriz: b> arra(1:2,1:2) = 2 ares = i i 3 4 i 1 1 8 59 1 ou 2.5 Valores Especiais (OMATLAB tem diversos valores especiais predefinidos, que podem ser usados 2 qual- «quer momento, sem terem sido iniciados antes. Uma lista dos valores predefinidos mais comuns é dada na Tabela 22. “ Esses valores predefinidos so armazenados em varidoeis ordindrias, portanto, podem ser sobrescritos ou modificados por um usudtio. Se um novo valor for atribuido a uma das variaveis predefinidas, ele substituird 0 valor fornecido em todos 0s cilculos poste- riores. Por exemplo, considere as seguintes declaracées que calculam a circunferéncia de um cfrculo com raio de 10 em: 2% pit 10 pi = 3. circ2 = 2 * pi * 10 Tabela 2.2 Valores Especiais Prodefinidos Fungio Pepto _ Pi Artazena x com 15 digo sigalfeatives CContim o valor (0), [Ese simbolo representa um infinite de méquina. E usualmente gerado como resultado de divisio por. Nan Esse simbolo signifies No Niimero. le € 0 resultado de uma operasio matemstics infin da, como a dvi de zero por 2670, Essa varisvel especial cntémn a data ea hors correntes na forma de um veto linha d 6 ele rmentos,cotendo ano, més, da, hora, minute esegund, ave Contéma data correnteem formato de cadcia de caracteres, como 24 fepe Ese nome do varivel abrevia epson. Fle representa 3 mente cferenga entre dois mimeros que pode ser representada no computador. tock ‘ane Uma varidvel espacial usada para armazena o resultado de uma expresso, caso ese revllado ‘io soja expictamenteatibuide a ovea vars 38 | Prparapse om MATA ar genes [Na primeira declaraclo, pi tem valor fornecido de3,14159... entdo ciel vale 62,8319, aque é a circunferéncia correta. A segunda declaragao redefine pi para 3, entio, na ter ceira declaragio, circ2 vale 60. Modificar um valor predefinido no programa criow ‘uma resposta incorreta e introduziu um erro sutile dificil de encontrar. Imagine tentar Iocalizar a origem de um erro oculto como esse em um programa de 10,000 linhas! Erros de Programagéo Nunca redefina o significado de uma varidvel predefinida no MATLAB. Essa é uma receita para o desasize, produzindo erros sutise dificeis de encontrar. Este teste apresenta uma verificagao répida do seu entendimento dos conceitos apre- sentados nas seges de 2.3 a 2.5. Se vac® tiver problemas com o teste, releia as secses, pergunte a0 seu professor ou discuta 0 material com um colega. As respostas podem ser encontradas no final do livro. 1. Assuma que a matriz c seja definida como abaixo e determine o contesido das seguintes submatrizes: 11-32 34 06 c=]06 11 -06 34 13°06 «55 00. a c(2,2) b. c(:,end) © c(1:2,2:ena) dd. c(6) fe e(dzena) f c(1:2,22 B ctl 4), he c((2 21,13 31) 2. Determine o contetido da matriz a apds aexecugio das seguintes declaragées: aa= (123; 456; 78 91; a((3 1,2) = all 31s boas (123; 45 6:78 9); (1 3)y2) = al (2 2.2): ea-023; 4567891; a((2 2).2) 3. Determine o contetido da matriz a apds a execugio das seguintes declaragées: aa = eyel3,3) b= (1231; (2.2) = B: | | Capita? MATAB Bisco | 39 ba » ea = eye(3,3): p- (789 (3,2) = b((3 1.2) da = eye(3,3) b= (7 8 3); a(3,t) = (13 2 2N5 ae ee Se 2.6 Exibindo Dados de Saida Bristem muitas maneiras de exibir dados de safda no MATLAB. A mais simples € uma jé vista ~simplesmente nao escreva o ponto--virgula no final da declaragao ¢ eles sero ecoados na Janela de Comandos. Iremos agora explorar algumas outras maneiras de exibir dados. 2.6.1 Alterando o Formato-Padrao Quando dados so ecoados na Janela de Comandos, valores inteiros sfo sempre ‘exibidos como inteiros, e outros valores so impressos com um formato-padrio. © for- ‘mato-padrao para 0 MATLAB exibe quatro digitos depois do ponto decimal, e pode ser exibido com notagao cientifica com um expoente se 0 mimero for muito grande ow ‘muito pequeno. Por exemplo, as declaragbes x = 100.11 y = 1001.1 2 = 0,00010011 produzem a saida 400.1200 ye 1.0011e+003, 1.0014e-004 Esse formato-padrao pode ser alterado com 0 uso do comando format, O comando format altera o formato-padrio de acordo com os valores dados na Tabela 23. 40 | ProgamassoomMATLAg pr egeacns Tabela 2.3 Formatos de Exibigdo de Saida Cote? warasaicico | 41 trolar a maneira como 0s valores slo exibidos. A forma geral dessa fungio, quando uti- lizada para exibir dados na Janela de Comandos, & fprinté (format, data) onde format & uma cadeia de caracteres descrevendo a maneira como os dados deve set exibidos e data & composto por um ou mais escalares ou matrizes para exibigao. A cadeia de caracteres format contém texto a ser apresentado, mais caracteres especiais descrevendo o formato das dados. Por exemplo, a fungio fprinté(‘o valor de pi = $f \h’,pi) Comando de Formato Resutads Example Torat shore 4 digos dedmais(ormato-padrio) 12.3457 format long 1 digits decimais 32.34567890122457 format short © digits mais expoente 2 ,2346e+001 format short ¢ Sigs nototal com ou sem expoente 12.346 format long © 15 digitor mais expoente 1,23456785012345764001 format long @ 1Scigtos no total, com ou sem expoente_12.3456789012346 format bani ats Format hex ———_exibigio hexadecimal de bits s028b0fca32€707a format xa ‘azio aproximada enteineios paquenos 1090/81 format suprime lnhesadicionais format reatabelece as lias adicionais ceibe somenteo sina! do nimero formato-padrio pode ser modificado para exibir mais digitos significativos, forgar a exibigdo em notagao cientifca, exibir dados com dois digitos decimais ow entio eliminar linhas adicionais para que mais dados sejam visiveis por vez na Janela de Comandos. Faga alguns experimentos com os comandos da Tabela 23, 2.6.2 AFunpéo disp (Outra maneira de exibir dados é a fungio disp. Elaaceita uma matriz como argumento «cexibe o valor da matriz na Janela de Comandos. Sea matriz for do tipo char, a cadeia de caracteres contida na matriz 6 exibida Essa fungio ¢ freqientemente combinada com as fungdes nun2str (que converte uum niimero em cadeia de caracteres) ¢ int 2st (que converte um inteiro em cadeia de caracteres) para criar mensagens exibidas na Janela de Comandos. Por exemplo, as de- claragBes MATLAB a seguir exibem “O valor de pi=3.1416" na Janela de Comandos. A | primeira declaraglo cria uma matriz de caracteres que contéin a mensagem, ea segunda declaragio exibe a mensagem. disp 1/0 valer de pi (str); © nunestr(pi) 2.6.3 Safda Estruturada Usando a Fungo fprinté I ‘Uma forma ainda mais flexivel de exibir dados € a fungao fprint £. Essa fungio exibe ‘um ou mais valores juntamente com texto relacionado e permite ao programador con- apresenta “O valor de pi = 3.141599°, seguido de uma mudanga de linha, Os caracers %fsio denominados earaceres de conversio;indicam que um valor na lista de dacios deveria ser apresentado em formato de ponto flutuante naquele local da cadcia de formatagio. Caracteres como o \n sio denominadoscaractres de escape. O caractere \n indica que uma mudanga de linha deve ser inclu, para que o texto seguinte inicie em uma nova la, Existem muitos tips de caracteres de conversio de escape que podem ser usados em uma fungéo fprint®. Alguns sfo apresentados na Tabela 24 € tuma lista completa pode serencontrada n0 Capitulo 8. também possivel especifiaralargura do campo de exibgio de um niimero ¢ 0 riimero de casas decimais a serem exibidas. Iso é feito especificando se alargura'e a precisio depois do sina ¢ e antes do f. Por exemplo, a fungio fprinté (0 valor de pi = 86.2£ \n’, pi) exibe “0 valor de pi = 3.14%, seguido de uma mudanca de linha. Os caracteres de converséo %6.2£ indicam que o primeiro item de dados na fungio deveria ser apre- sentado em formato de ponto flutuante e um campo com seis caracteres de largura, incluindo dois digitos depois do ponto decimal. A fungao fprinté tem uma limitaggo bastante significativa: ela somente exibe a pongo real de wm valor complexo. Essa limitagao pode levar a resultados enganosos quando 6s célculos produzem respostas complexas. Nesses casos, é melhor usar a funglo disp para exibir respostas. Tabela 2.4 Caracteres Especiais Comuns em Cadoias de Caracteres de Formatagdo parao fprint£ Caractres de Formatagdo Retulades x uibe valor como inti. te Exe valorem formato exponencia. se ibe valor em formato de ponte Mutat 3 Exibe valorem formato de pontoflutuante ou expanencial 0 que for maiscuto we Muda detiaha 42 | Propamagso om MATA” pare Emeoeios Por exemplo, as seguintes declaracées caleulam um valor complexo x ¢ exibem esse valor utilizando fprintt e disp: x=2* (1 = 28i)83; str = (‘disp: x = * numastr(x)); disp(str) : fprintf(*fprintf: x = #8.4£\n",x1; (s resultados impressos por essas declaragoes sio captta2 maragisico | 43 Por exemplo, suponha que a matriz x seja definida como (1.23 3.14 6.28; -5.1 7.00 07 Ocomando “save x.dat x -a |Z x.aat com os seguintes dados: 7 produziré um arquivo denominado $1 2s00000e+000 -5.100000064000 3.1400000e-000 7,0000000e+000 5.2800000e+000 0000000e+000 Esses dados estdo em um formato que pode ser lido por planithas ou programas escritos fem outras linguagens, o que facilita 0 compartilhamento de dados entre programas MATLAB e outras aplicagdes, disp: x 14k fprintf: x = -22.0000 Note que tangio tprine® 1gnorow a Parke imagindria da resposta: A fungio fprint£ exibe somente a parte real de um niimero complexo, que pode pro- duzir resultados enganosos quando se trabalha cem valores complexos ER RET 2.7 Arquivos de Dados Existem muitas maneiras de carregar e gravar arquivos de dados no MATLAB. A maio- ria delas sera vista no Capitulo 8. Por enquanto, vamos apenas considerar os comandos Loade save, os mais simples de usar © comando save grava dados do espago de trabalho MATLAB corrente em um. arquivo de disco. A forma mais comum desse comando é save filename varl var2 var} onde £3 1ename € o nome do arquivo no qual as variéveis sio gravadas, e varl, var2 etc,, sio as varidveis gravadas no arquivo. A extensio-padrio de nome de arquivo € “mat”, e esses arquivos de dados sio chamados arquivos MAT. Se nenhuma variével for especificada, todo o contetido do espaco de trabalho sera gravado, O MATLAB grava 0s arquivos MAT em um formato compacto especial, que reserva muitos detalhes, incluindo o nome e o tipo de cada variavel, o tamanho de ‘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 so tuma boa forma de trocar dados entre computadores se ambos utilizam o MATLAB. Infelizmente, o arquivo MAT tem um formato que nio pode ser lido por outros pro= gramas. Se os dados precisam ser compartilhadss com outros programas, a opcio “ascii precisa ser especificada, e 0s valores de dadas serio escritos no arquivo como cadeias de caracteres ASCII separadas por espages. Entretanto, informagdes especiais ‘como nomes e tipos de variaveis sao perdidas quando gravamos os dados em formato ASCII, ¢ 0 arquivo resultante de dados fica muito maior. oe | = Se dados precisam ser compartilhados entre o MATLAB e outros programas, grave 0s = dados MATLAB em formato ASCII Se os dados forem usados apenas pelo MATLAB, grave-os em formato de arquivo MAT. Le © MATLAB nao determina a extensio dos arquivos ASCII, mas é melhor para 0 usuério quando uma convengao de nomes consistente 6 utilizada. Uma extensio “dat” uma escotha comum para arquivos ASCH. Grave os arquivos de dados ASCII com uma extensio de arquivo “dat”, para dife- rencié-los dos arquivos MAT, que tém uma extensao de arquivo “nat” © comando 1oad € 0 oposto do comando save. Ele carrega dados de um arquivo de disco para o espago de trabalho corrente do MATLAB. A forma mais comum desse comando é lead Filenane onde Fi'Yenane € 6 nome do arquivo a ser carregado, Se o arquivo for um arquivo MAT, todas as varidveis no arquivo serio recuperadas, com os nomes e tipos idénticos aos anteriores. Se uma lista de varidveis for incluida no comando, somente essas varidveis sero recuperadas. (MATLAB pode carregar dados criados por outros programas em formato ASCII, ‘com dados separados por espagos em branco. Ele examinara cada arquivo para deter- minar se ele é um arquivo MAT ou um arquivo ASCII e tratar os dados de acordo. O MATLAB pode ser forgado a tratar um arquivo como ASCII quando especificamos a = = 44 | Praanagso om MATAR pr Ergetsies oppo ~ascii na dedlaragio Load. O contetido de um arquivo ASCH seré convertido em uma matriz MATLAB, com o mesmo nome do arquivo de onde foram carregados 05 dados. Por exemplo, suponha que um arquivo de dados ASCII com o nome x.dat con- tenha os seguintes dados: 1.23 5.1 3.14 6.28 7.00 0 Ocomando “load x.dat” criaré uma matriz 2x 3 denominada x no espago de tra- alho corrente, contendo 0s valores de dados. Captue2 wAaeisce | 45 de expression no local var iable_name. Por essa razdo, o sinal de igual é chamado de operador de atribuigdo. Uma declaragio como die iia; 1ndo faz 0 menor sentido em Algebra usual, mas faz sentido perfeitamente no MATLAB. Ela significa: pegue o valor corrente armazenado na variavel ii, some um a esse valor ‘earmazene o resultado de volta na variével ii. 2.8.1 Operagdes com Escalares Este teste apresenta uma verificacio répida do seu entendimento dos coneceitos apre- sentados nas Seqdes 2.6 e 2.7. Se voce tiver problemas com o teste, releia as segbes, per- Bunte ao seu professor ou discuta o material com um colega. As respostas podem ser encontradas no final do livro. 1. Como vocé faria 0 MATLAB exibir todos os valores reais em formato expo- nencial com 15 digitos significativos? 2. O que fazem os seguintes conjuntos de declaragdes? Qual a saida de cada um deles? a radius = input(‘Enter circle radius:\n"): area = pi * radius*2; str = ("The area is ‘ num2str(area)]; disp(ste}: b. value = int2stripi); disp({‘The value is’ value ‘1'1)7 3. O que faz 0 seguinte conjunto de declaragbes? Qual a safda dele? value = 123.4567e2: {printf (‘value = te\n’,value) ; fprintf (‘value - ¥£\n‘,value); fprint£(‘value = tg\a’/value) ; fprintf(‘value = ¢12,4f\n", value); 2.8 Operagdes com Escalares e Matrizes CAtelos so expeicados no MATLAB com uma dearasio de atibuigo, cj forma geral variable name = expression: A declaracio de atribuicio calcula o valor da expressio & direita do sinal de igual, ¢ atribui 0 valor & varidvel esquerda desse sinal. Observe que o sinal de igual néo significa igualdade no sentido usual da palavra. Em vez disso, significa: ermazene o valor de escalares, matrizes, parénteses e operadores aritméticos. As operagbes aritméticas- padrao entre dois escalares so dadas na Tabela 25. Parénteses podem ser usados para agrupar termos sempre que desejado. Quando so usados parénteses, as expressbes dentro deles so avaliadas antes das expresses que esto fora. Por exemplo, a expressio 2 * ((8+2) /5) €avaliada conforme mostrado a seguir a+ ((892)/5) = 2-8 (10/5) a2 2.8.2 Operagdes com Matrizes OMATLAB dé suporte a dois tipos de operagées entre matrizes, conhecidos como operagses intr pou here penis tsp ete mos oe Sint canes seen opone¢ eta od slant neon " Ta)ce. [a a]euoers [oe doesn tins Poreenplnses- |} 3) eb [-t S]ientoash = [2 3] Ctmerve gue pan que peri foren one inh edl de sis pss man, Cc onto MATLAD rs unanssgen es eles est ates patent een ath exc sopraio fren una mas em nay 9a Go xa sora eas{} 2] entioase-[5 6 Goatees onsenentn damatte Prownplee-[! 2} ones [2 §] Tabela 2.5. Operagbes Artméticas entre Dois Escalares Operagto Soma ae ase Subtragio ane Mutipliagto axe ate Divisio : are Expoente e arp 7 48 | Ponarassoem BATA pu Eereias = Em contrat, aperages maticiasseguem as regras normais da algebra linear | F por exemplo, multiplicagio de matrizes. Na dlgetra lineas,o produtoc = ax bé | Sefinido pela equageo i: ® = efi = Dali, kb A) Te a : orexemplo,sea =[1 2]e b «[-1 3],entioa x» = [-1 seve | |S voraremplosen = [J t]e» «[3 j]emion «> -[ ]-onene |Z que, para que a multiplicagao de matrizes funcione, 0 niimero de colunas na matriz a pre- isa ser igual ao numero de linkas na matriz (O MATLAB usa um apts? aTAB Bisco | 47 tiplicacio estrutural como matricial so aplicdveis para duas matrizes quadradas de ‘mesmo tamanho, mas as respostas s4o totalmente diferentes. Cuidado para especificar ‘exatamente o que voo® quer! ‘Cuidado para diferencar entre operagiesestraturase matics em seu cidigo MATLAB. E especialmente comum confurdir mulipicago estutural com muliplicagdo matricial operaiee muir, Nos cas em gu ope estas ¢ opus maccale |) << tém definigdes distintas, o MATLAB utiliza um onto antes do simbolo para indicar Exemplo 2.1 ‘uma operagio estrutural (por exemplo, .*). Uma lista de operagées estrututais e matri- x in Ciais € apresentada na Tabela 2.6, Assuma que a, b, © ed sio definidas como a segui a [i 9] »- [43] 21 o1 Operag6es Estruturais ¢ Matrciais Comuns e+] acs Forma MATLAB Comestrios 2 ‘Soma Estrutural arb ‘Soma de matvzes estrutural éidntica 8 matricial Qual € 0 resultado das seguintes expresses? Subtragio Estrutural a-b Subtracio de matrzes estrutural 6 déntica & matricial aarp ease Multplicagio Estatural a .* bb Multipicago elemento a elemento de ae b As duas ba.tb fasd ‘matrizes prodsam ter a mesma forma, cu usa delas cavb gala serum ecale date hata Multplicagio Matidal =a + Multiplicagio das mates a ¢ © msimero de cokunas ‘era preinser igual a0 de lnhas em Solugso Divisso a Dirsta Estutural 8 ./ b Divisioclmewoa-ementodeaeb: a(i3) / btir3) [AS duns mates preci ter 8 mesma frm ou un dels precise unex | Divisioelemevoaciementodeseb: b(i.3) / atts). | [As das mazes precsum tera mesma frm ou uma | dels precisa er um esas DiviséodEsquenda Estratural a. b Divisio Matical Dieta a / Divisio maeidal efinda por a * inv (b), onde inv (b) © 6 oinversodamatriz : Divisio Maria Eoquerda 9 \ Divisso maul definda por inva) * b, onde inv ta a €oinversodamatrr 2 Expoente Fstatul 24D Bipoenicclemnoaelementodeaeb: a(i,4) * bliyd Usudrios novatos freqiientemente confundem as operagdes estruturais com as ‘matriciais. Em alguns casos, a substituicio de uma pela outra produz uma operagao ile- gal, €o MATLAB apresenta uma mensagem de erro. Em outros casos, as duas operages sto legais, ¢ 0 MATLAB executa a operacio errada e produz um resultado etrado. O problema mais comum ocorre quando se trabalha com matrizes quadradas, Tanto mul- Bebiiietici ppm .. Multiplicagao estrutural elemento a elemento: a .* b Soma estrutural ou matrciatia « b « [2 2] tratural g2 ‘Multiplicagio matricial: 2 * b {2 2] ‘Multiplicagéo matricial: a * © = [3] ssa operagio€ legal, pois a eb tém mimers diferentes de colunas. Multiplicagéo estrutural: a .* ¢ = Li 4 | Multiplcagiomatiaba + a = [5 9], 4B | Proyamagio am NATLAB par Eaters ‘A diviso matricial & esquerda tem uma importincia especial que d ‘especial que deve ser enten- dida. Um conjunto 3 x 3 de equagées lineares simultaneas tem a forma Mh + Baka Mysty™ B, inde 2 NATAB Asico | 49 Tabela 2.7 Hierarquia de Operagées Artméticas Procedtacia ‘Operapto _ 1 (0 contevdo de todos os parnteses &evaiado, a parti dos partnteses mais internos ‘em diego aos mais exernes. 2 “Todos os xpoentes sh avaliados da enquerda para a dreita 3 “Todas as mulipicagdese dvises so avaliadas,tablhando da esquerda para & iret, ‘ “Todas as somasesubtagies si avaliadas,trablhando da esquerda para a drei ‘ara climinar a ambigiiidade da avaliagio das expresses, o MATLAB estabeleceu uma yk, + gk, + ary by 1 Bayh Maate + ty by que pode ser expressa como AceB @2) [fs a =| [i] = ~ ondea= [or ae ash aft fel =} My A Ass, 5, 33. A-equacio 2.2 pode ser resolvida para x usando élgebra xeAtB 23) Como 0 operador de divisio Como oopeador de dvisio exqueria XB dfiido como inv(n) 8,0 perador le divisio & esquerda resolve um sistema de equagdes simultineas com uma tinica declaragio! " comme ins 2.9 Hierarquia de Operagoes Fregiientemente, mi i operagbes aritméticas sdo combinadas em uma tinica expres- ‘io, Por exemplo, considere a equagio para a distincia percorrida por um objeto ini- calmente em repouso e sujeito a uma aceleragio censtante. distance = 0.5 * accel * time * 2 Existem duas multiplicagées e um expoente nessa expressio. Em uma expressdo como ssa, 6 importante saber a ordem de avaliagao dos operadores. Se o expoente for ava- liado antes da multiplicagio, essa expresso serd equivalente a m distance = 0.5 * accel * (time * 2) ‘Se a multiplicagio for avaliada antes do expoerte, essa expresso serd equivalente a distance = (0.5 * accel * time) * 2 Essas duas equagdes tém resultados distintes, e precisamos ser capazes. sas dus Pi spazes de distingui-las tested babaaloiel 4 ~ série de regras governando a hierarquia, ou a ordem em que as operagbes sio avaliadas fem uma expressdo. As regras em geral seguem as regras normais da algebra, A ordem de avaliacao das operagiesaritméticas € dada na Tabela 27. Sennen me Example 2.2, [As variveis a,b, ce foram iniciadas com os seguintes valores and be2 ‘vali as seguintes decaragdes de atribuigio MATLAB. a-3 a. saida = atbectd; b. saida = at (bec) *d; © saida = (a*b)+ (cd); d.saida = a*bed; fe, safda = a*(bsd: Solugto ‘a, Expressio a avaliar: saida - atbycta: Com 0s valores: safda = 3*245*3; Primeiro, avalie as multiplicagées e divisoes, da esquerda para a direta: saida = 6+5*3; saida - 6415; ‘Agora, avalie as somas: saida = 21; b. Expressio a avaliar eaida - at (bec) *d: Com 0s valores: paida = 3*(205)*3: rimeiro os paréntses —gataa = 3473; ‘Agora, avalie as multiplicagdes e divisdes, da fesquerda para a direita: saida = 21*3; saida = 63; c. Expresso a avaliar: saida = (a*b)+(e*a); Com 0s valores: saida = (3*2)+(5*3); Primeiro os parénteses: saida = 6415; Agora as somas: safda - 217 50 | Proanneso em MATAR” para Enea d. Expressio a avaliar: saida = a*bsd; Com 08 valores: saida = 3*283; Avalie os expoentes da esquerda para adireita: caida = 9*3; saida = 729; e. Expressio a avaliar: sada = a* (bea); Com 0s valores: Primeiro os parénteses: Agora 0 expoente: saida = 34(293); saida = 3°68 safda - — Como portent Ver FORA Ae EXECS 8s OPETAGTES TTT eit easel no resultado final de uma expressio algébrica. importante que qualquer expressio em um programa seja ti clara quanto pos sivel. Qualquer programa de valor deve ser nio 86 escrito, mas também mantido e smodificado quando necessrio, Vacé deve sempre perguntar a i mesmo: "Vou entender com faclidade essa expressfo quando voltar a ela daqui a seis meses? Outro progra- ‘mador poderia olhar 0 meu cédigo e entender com faciidade o que estou fazendo?” Se hhouver qualquer civida em sua mente, use parénteses adicionais na expresso para tomé-la.o mais claro possivel. rary Use parénteses quando necessétio para tornar suas equagies claras eféceis de entender, Parénteses usados em uma expressdo devem ser balaneados, ou seja, deve existr tum muimero igual de parénteses abertose fechados na expressio, E um emo ter mais parénteses de uim tipo que do outro. Erros desse ipo, geralmente tipogrdficos, sio apturados pelo interpretador MATLAB quando ocomando é executad, Por exemplo, a expressio @easra produz um erro quando é executada, ue Este teste apresenta uma verificagdo répida do seu entendimento dos conceitos apre- sentados nas SegSes 28 e 2.9. Se vocé tiver problemas com o teste, releia as segdes, per- gunte ao seu professor ou discuta o material com um colega. As respostas podem ser cencontradas no final do livro, fae seed jit abaieef el Ai apnps joa wee MuTussisico | 51 1. Assuma que a, b, ce d sio definidas conforme a seguir e calcule os resultados ddas seguintes operagbes se elas forem legais, Se uma operacio for ilegal, cvpliqae mesa [a] e-E) ¢ “a a result = a .* cr beresult = a * (c cli © result = a .* [e cl: dresult + a+b tc: e result = a+b .* ¢ 2. Resolva para x a equagio Ar= B, onde A = 2.10 Fungae finidas MATLAB Na matemética, uma fungio é uma expressio que aceita um ou mais valores de entrada e calcula um tinico resultado a partir deles. Calculos cientificos e téenicos em geral requerem fungSes mais complexas do que soma, subtracio, multiplicagio, divisio e expoente, conforme discutido até aqui. Algumas dessas fungSes so muito comuns e usadas em diferentes disciplinas téenicas. Outras so mais raras e especificas de um. problema ou pequeno niimero de problemas. Exemplos de fungdes muito comuns $30 as fungGes trigonomeétricas, logaritmicas e raizes quadradas. Exemplos de fungdes mais, raras s4o as fungSes hiperbdlicas, fungSes de Bessel, e assim por diante. Uma das grandes forcas do MATLAB é que ele ver com uma incrivel variedade de fungdes rontas para uso. 2.10.1. Resultados Opcionais Diferente das fungbes matemsticas, as fungdes MATLAB podem devolver mais de um resultado para o programa que as ativa. A fungio max é um exemplo de funcio desse tipo. Essa funcio normalmente retoma o valor maximo de um vetor de entrada, mas ela também pode retomar um segundo argumento contendo a localizagio no vetor de entrada onde o valor méximo foi encontrado. Por exemplo, a declaraa0 iz maxval = max ({1 ~5 6 ~3}) relorna 0 resultado maxval = 6. Entretanto, se duas varidveis forem forecidas para armazenar resultados, a funcio retornaré o valor maximo ¢ a localizagio desse valor. (maxval index) = max ({1 -5 6 -3]) produz os resultados maxval - 6 ¢ index ~ 3. 52 | Proramipioom MATLA® pare Experts 2.10.2 Utilizando Funges MATLAB com Matrizes como Entrada ‘Muitas fungées MATLAB sao definidas para uma ou mais entradas escalares e produ- zem uma saida escalar. Por exemplo, a declaragio y = sin (x) calcula o seno de xe ‘armazena o resultado em y. Se essas fungSes recebem uma matriz com valores de entrada, las caleulam uma matriz. com valores de safda calculados elemento a elemento. Por exemplo,sex = [0 pi/2 pi 3*pi/2 2*pi],adeclaragio y = sin(x) produzo resultado y = [0 1 0 -1 0] ak self ooh rani son FungOes MATLAB Comuns Dose bela 2, ? anger Mates 2.10.3 Fungdes MATLAB Comuns ‘Algumas das fungSes mais comuns e titeis do MATLAB sio apresentadas na Tabela 2.8. Elas serio usadas em muitos exemplos e exercicios. Se tiver de localizar uma fun¢ao especifica que nao esteja nessa lista, vocé pode pescuisar alfabeticamente ou por assunto usando 0 Navegador de Ajuda do MATLAB, Observe que, diferente de outras linguagers de computador, muitas fungies MATLAB operam corretamente com entradas tanto reais como complexas. As fun- es MATLAB calculam automaticamente a resposta correta, mesmo se o resultado for imagindrio ou complexo. Por exemplo, a fungéo sart (~2) produzird um erro em linguagens como C ou Fortran. No MATLAB, 0 céleulo correto seré efetuado, pro- duzindo a resposta imaginaria. > sqrt (-2) Cemerterrs 2.11 Introdugao a Diagramas (Os recursos amplos e independentes de dispositives do MATLAB sio uma de suas ca- racteristicas mais poderosas. Fles facilitam 0 desenho de quaisquer dados em qualquer ‘momento, Para desenhar um conjunto de dados, simplesmente erie dois vetores con- tendo 0s valores de x e de y a serem desenhados, ¢ use a fungio plot. Por exemplo, suponha que queiramos desenhar a fungio y = 2° ~10x +15 para va- lores de x entre 0 e 10. Sao suficientes trés declaragies para criar esse desenho. A. primeira declaracio cria um vetor de valores de x entre 0 e 10, por meio do operador dois-pontos. A segunda declaracio calcula os valores de y usando a equagao (note que estamos utilizando operadores estruturais, para que a equacio seja aplicada a cada valor de x, elemento a elemento). Finalmente, a terceira declaracao cria o desenho. x = 0:1 y= x.92 - 10.4% + 15; plot (x,y tai) Glas coon) Catia co's, com o ela em rains angiecx) Reta inguode fae do valor comps ratios asinoxd Cala si, om rela em rai acanxd Cala tas, com ead em ais scandyix) Coteus ta (2) are guazo unrated rl (eta em - rato ere =< costo Cala cor, om xem dings. exon) Caine reaix) Cate logan natura og Ivatue, index! = mete) Retomna 0 valor mikimo do vetor x, ¢opcionalment a locslzagio desse valor Lvatue, index} = min() Retoma o valor minimo do veto se opeonaimente a localizagio desse valor nodix.y) Fungo resto (oa fungio mélo. sinix) Clout sins com xem radians, sactx) CCaloula a riz quadrada dex tan per CCaleula tan , com xem radianos Rungées de Arredondamento cei ‘Aredonda x para 0 inteo mais proximo em dirego a male infnte: cellist) = feceil(-3) = 3 Econ) ‘Arredooda x para o intro mais prximo em dire 30 sero: £4(3.1) wdefixeday = 3 floor 1x) ‘Arredonda x para o inteiro mais prdximo em dieslo 4 menos infinite: floor(3.1)'= Se fleor{-3.21 = round) ‘Arredonda x para ointeiro mais primo, FungBes de Convers de Caracteres char) CConverte uma matrz de riimeros em uma cadeia de caracteres, Para ci socteres ASCH a matric deve moter merce < 127. ‘Converte uma cadela de caracteres em urna mati de rimer, doubietx! anezeee bo) ‘Convert x em uma cade de earacteres que representa mimero como umgete 60 ‘Convert em um cadeia de caracteres que representa o ero com um ponto decimal se ‘Convert uma cada de caracters#em mero ams) 54 | Progamacso em MAMAS pa Czeees Figura 2.4 Diagrama de y =3?-10r+ 15 de0 a 10, Quando a fungéo plot ¢ executada, 0 MATLAB abre uma Janela de Figuras e cexibe 0 deserho nessa janela. O desenho produzido por essas declaragses é apresentado 1a Figura 24, 2.11.1 Utilizando Diagramas xy Simples Conforme vimos acima, é muito fécil desenhar no MATLAB, Qualquer par de vetores pode ser desenhado um contra o outro, desde que os vetores tenham 0 mesmo comprimento, Entretanto, o resultado nao é um produto acabado, pois nao temos titulos, legendas para os eixos ou linhas de grade, ‘Titulos e legendas para os eixos podem ser adicionados ao desenho com as fungSes title, xlabel e ylabel. Cada fungio é acionada com uma cadeia de caracteres que conte o titulo ou a legenda corespondent. Linhas de grade podem ser adiconadas ou removidas do desenho com o comando grid: grid ‘on ativa as linhas de grade, © Grid off apaga as linhas de grade. Por exemplo, as declaragies a seguir geram um desenho da fungio y = x*-10x +15 com titulos, legendas e linhas de grade. © desenho resultante esté na Figura 25, x = 0:1220, Y= x92 = 10.8 6 15; plot (x,y): title ("Plot of y = x.*2 - 10.#x + 154); captele2 MUTLARBésico | 8B Pltoty annie 19 p -s| oe 0 Figura 2.5 Diagrama de y~= x? 10x + 15 com titulo, legendas ¢linhas de grade. 2.11.2. Imprimindo um Diagrama ‘Uma ver criado, um diagrama pode ser impresso por meio do comando print, clicando sobre o icone de impressio na Janela de Figuras ou selecionando a opgéo de menu “File/ Print” na Janela de Figuras. A forma do comando print & print Sem 0 nome do arquivo, ese comarvo envia uma cpa da figura corente para a immpresora. Com um nome de argu especiicadoo comando imprime uma copia da figura content no arquivo eopecticao, Pe Exstem muitas ope diferentes-que-copeticam o-formato-de-safda enviado para um arquivo ou porta impresora Un opsio mato importante é ati Eos opeto expectica que a sfda serd uma imagem no formato TIFF—do inglés Tagged image Fe Format, Como esse formato pode ser importado pra todos ox procetadores de texto importantes para PC, Mac ou UNIX, esa 6uma boa manera de incluir desenhos MATUAB em um documento, O seguintecomando cra uma imagem TIFF na figura Corrente ea armazena em um arquivo denominadony_inage tif print -dtifé my_image.tit 56 | Paparapt em MATA pra Embers ‘Também é possivel criar imagens TIFF selecionando “File/Export” na Janela de Figuras 2.11.3. Diagramas Miltiplos # possivel desenhar miitiplas fungBes sobre o mesmo grifico,simplesmente incuindo sais de um conjunto de valores (x1) na fango de desenho. Por exemplo, suponha que queiramos desenhar a fungao ) = sin 2x e sua derivada ino mesmo desenho, A dat vada des) sin 2x6 4 - Gp NDE eee ea Para desenhar as duas fungSes sobre os mesmos eixos, precisamos gerar um conjunto de valores x e os valores y correspondentes a cada fungio, Para desenhar as fungSes, podemos entio simplesmente listar os dois conjuntos de valores (x,y) na fungao de desenho, conforme mostrado a seguir, x = 0:pi/100:2pi yl = sin(2*x) ¥2 = 2c08 (24x) + Plot (x.yLex-¥2) 7 (O diagrama resultante 6 exibico na Figura 2.6. 2.11.4 Cores de Linhas, Estilos de Linhas, Estilos de Marcadores e Legendas MATLAB permite que um programador selecione a cor de uma linha a ser desenihada, estilo da linha e o tipo de marcador para pontos de dads na linha. Isso tudo pode ser selecionado pelo uso de uma cadeia de caracteres de atributo apés os vetores x e y na fungao plot. ‘A cadeia de caracteres de atributos pode ter até trés componentes. O primeiro es- pecifica a cor da linha, o segundo, o estilo do marcador, €o ultimo, o estilo da linha. Os ‘aracteres para as diferentes cores, marcadores ¢ esilos de linhas sao apresentados na Tabela 29. (Os caracteres de atributos podem ser misturados em qualquer combinagio, e mais, de uma cadeia de caracteres de atributos pode ser especificada se mais de um par de vetores (xy) for incluido em uma mesma chamada da fungao plot. Por exemplo, as seguintes declarages desenhardo a funcio y= x2 -10x + 15 com uma linha pontilhada vermetha e incluirao os pontos de dados como cireulos azuis: x = O:1:10; Y= X92 ~ 10.4% + 15; Plot (x.y, 'E==",x,y, “BO? ~ nh mnt ial a «4 ye ° t z z Figura 2.6 Magenta ‘Cieule © Gano x x r Vemeho + Mais 5 Verde : Asterisco > Amul Quadrado Bronce a Losango k Preto v “Tingulo (pontand para bite) - tragic tapontante pares) t < Tiinguloepontando para a enquenda) > Tringulo(apontando pars adits) P Pentégono » Hexdgono = Sem mareador Contale2 wuriazassco | 87 7 Diagrama de fi) = sin 2x efx) = 20s 2x sobre os mesmos elxos Sélido Pentithado Ponto trage ‘Traced Sem linha 5B | Poganagso em MATLAB po trgenare Legendas podem ser criadas por meio da fungdo Legend. A forma bisica dessa fungio € legend(‘stringl’, ‘string2’,..., pos) onde stringl, stzing? ete. sdo os rotulos assaciados is linhas desenhadas, pos é tum inteiro que especifica onde colocar a legenda. Os valores possiveis para pos sio ddados na Tabela 2.10.0 comando legend off move tuma legenda existente ‘Um exemplo de desenho completo é apresentado na Figura 2.7, e as declaragées Para produzir esse desenho sio apresentadas a seguir. Elas desenham a fungio fx) = sin 2: e sua derivada sobre os mesmos eixos, com uma itha pretasolida para fx) ¢ uma linha vermetha trcejada para sua derivada. O desenhoinelui um titulo, rotulos para os cos, ‘uma legenda e linhas de grade. | { Coote? MaTLAB ais | 89 x= Uspi/10070Bi yl = sin(2*x); ¥2 = 2*cos(2*x) ; plot (x, yh, “k-" ,¥2, 3 title (Plot of f(x) = sin(2x) and its derivative’); xlabel (/x"); ylabel(*y")5 legend (*£(x)",*d/ax £(x)') grid on; 2.11.5 Estalas Logaritmicas # possivel desenhar dados em escalas logartmicas e em escalas lincares.Existem quatro combinagoes possiveis de escalaslineaes elogarimicas nos eos x ey, e cada comb nago é produizda por uma funsio separada, 1. A fungio pot desenha os dados em xe y sobre cixos lineares 2. A fungdo semi Lox desenha dados em x de forma logartmica e em y de forma linear 3. A fungio semi logy desenha dados em x de forma linear e em y de forma loga- ritmica. 4. A fungio loglog desenha os dados em xe y sobre eixos logaritmicos. Tabela 2.10 Valores de pos no Comando Legend hea Escola automitica da “melhor” posigi ennimo confito com os dado) a Canto superior diet (fut) 2 Canto superior exquerdo Canto inferior eaquerdo Canto inferior drsito Adieita do desenho Figura2.7 Um desenho completo com titulo, rétulos nos eixos,legenda, grade e mltiplos estos de linha. ‘Todas essas fungées tém a mesma seqiiéncia de chamada a tinica diferenca € 0 tipo de ceixo utilizado para desenhar os dados. Exemplos de cada desenho sio exibidos na Figura 28. __ 2A2_Exemplas (Os exemplos a seguir ilustram a resolugio de problemas com o MATLAB. a a Exemplo 2.3 ~ Converséa de Temperatu ‘Construar tim” programa MATLAB que Teia uma temperatura de entrada em graus Fahrenheit, converta essa temperatura para um valor absoluto em Kelvins e escreva 0 resultado, Solugao ‘A relacdo entre temperatura em graus Fahrenheit (‘F) e temperatura em kelvins (K) pode ser obtida de livros de fisca. Ela € GO| Poranersoemuaria pars Engnteiae Conta 2 AUTADBiico | 61 > 101 we unser Sa script file? tenp_conversion ra % % Purpose: 20 % To convert an input temperature from degrees Fahrenheit to nos % an output temperature in kelvins. ® 0 & Record of revisions: . : Date Progranmer Description of change ‘Bes ° Se" 10 10 TEs 12/01/98 J. Chapman Original code . re Et petine variable: a 1 es ‘Temperature in degrees Fahrenheit = ak —fenperatan — Es scoapt the sor for the input temperature, 1! 1! ‘ 1 10° 02 46 @ 10 Figura2.8 Comparagio entre deserhos linear, semilog x, semilog ye loglog, Tin Kevns) = ($1 a '8)-220) + 27038 es) 0 lis de ice tami os do valores de exemple nas dua exces de tmpert fm, podamoe war para veicara oper de nase propa Do dees Ponto de ebuligio da dgua Ponto de sublimacio do gelo seco 212 °F -110 #F 373,15 K 194,26 K "Nosso programa precisa efetuar os seguintes passos: 1. Pedir para o usudrio digitar a temperatura de entrada em °F; 2. Lera temperatura de entrada; 3, Catcular a temperatura em kelvins usando a equagio (2.5); 4, Escrever o resultado e termina. Usaremos a fungao input para obter a temperatira em graus Fahrenheit e a fungSo Eprinté para escrever o resultado. O programa resultante é apresentado a seguir” * NT: Os comentiros ¢ as mensagens do programa foram mantidos como no original em ingle, para respeitar a aora de cdigo do autor. eet sr nse 4 lz t £ temp_f = input (‘Enter the temperature in degrees Fahrenheit: ‘ % Convert to kelvins. temp_k = (5/8) * (temp_f - 32) + 273 % write out the result. fprint£("%6.2f degrees Fahrenheit temp_£, temp_k) + 86.26 kelving.\n", Para testar o programa completo, vamos executé-lo com os valores de entra- dda conhecidos e dados acima. Observe que as entradas do usuario aparecem em negrito no texto a segui > temp_conversion Enter the temperature in degrees Fahrenheit: 212 212.00 degrees Fahrenheit = 373.15 kelvins. > ‘temp_conversion Enter the temperature in degrees Fahrenheit: -110 110.00 degrees Fahrenheit = 194.26 kelvins. (Os resultados do programa coincidem com os valores do livro de fisica, < eee Nesse programa, ecoamos os valores de entrada e escrevemos os valores de safda juntamente com as unidades. Os resultados desse programa s6 fazem sentido se as uunidades (graus Fahrenheit ¢ kelvins) forem incluidas com seus valores. Como regra geral, a8 unidades associadas a um dado de entrada devem ser sempre apresentadas, junto com a solicitaggo de valor, ¢ as unidades associadas a qualquer dado de saida ever ser apresentadas junto como valor. ‘Sempre inclua as unidades apropriadas junto com os valores que vocé ler ou escrever em um programa. 62 | Prana em MATAR para Eneoies © programa do exemplo anterior exibe muitas boas praticas de programagio que descrevemos neste capitulo. Ele tem um diciondrie de dados que define o significado de todas as varidveis no programa, e também usa nomes descritivos de varidveis, e lunidades apropriadas sao associadas a todos os valores apresentados, > Exemplo Elétrica:Transterdncia de Carga Méxima Na Figura 29, temos uma fonte de voltagem V = 120 V com resisténcia intema R, de 50.0, ssuprindo uma carga de resisténcia R,, Encontre o valor da resistencia de carga R, que resultard na poténcia maxima possivel fornecida pela fonte para a carge. Quants po- téncia serd fomecida nesse caso? Desenhe também a poténcia fornecida para a carga Capt 2 Marsico | 63 3. Calera pon omecida pra carga para cds valor dR { Desenhar potenciafomecs pur scp prs nda valor de ye dteminar O valor dani eran dpe ce poten eee © programa MATLAB fin ete Script file: cale_power.m . * & Purpose: & To calculate and plot the power supplied to a load as % a function of the load resistance. 8 con fangio de vesie ees Record ot Tevisionsy — : Date Programer Description of change Solugio : : Nesse programa, precisamos variar a resisténcia da carga R, e computar a poténcia ‘ 32/01/98 S. J. Chapman Original code fomecida pars a carga para cada valor de RA potéciafornetida pare a resistencia da Soe _ opr edue tases t Define variables: 8 pels equas ay amps Current flow to load (amps) PL= PR, (26) * pl Power supplied to load (watts) ‘ , Ben Resistance of the load (ohms onde cores fomecida para a carga. A conte frnecida pars a carga pode ser bors Internal resistance of the power source (ohms) ccaleulada pela lei de volts =~ Voltage of the power source (volts) voy + In "2a (27) % Set the values of source voltage and internal resistance Ror Re*R, } volts = 120; (© programa precisa executar os seguintes passos: re = 50; 1. Criar uma matiz de valores possves para a resstincia da carga R,.Amatiz |f % Create an array of oad resistances varia R, de até 100 em pasos de 12 Pon Tihoo, 2. Calcla a corente para cada valor de |} catcutate the current flow for each resistance $ ames volte ./ (ree tl by 4s calculate the pover supplied to the load TH pl = (amps 67 2) .* rly F & Plot the powor versus load resistance plot tri,pl): : Carga Fors de voragem Figura 2.9 Uma fontede voltagem com uma voltagem V e uma resistencia intema R, suprindo uma carga de resistindia R,. Kati isn title('Plot of power versus load resistance’); xlabel (‘Load resistance ) (chms)'); ylabel( "Power (watts)"1; grid on; Quando esse programa & executado, o desenho reaultante é o mostrado na Figura 2.10. Com esse desenho podemos verificar que a poténcia maxima é fornecida para a carga quando a resisténcia da carga é 500. A poténcia fornecida para a carga com essa resistencia é de 72 watts < —<—_—_ 84 | Popanapto em MATAR ar Exgntvies Powe (wats) aptle2 Marae Biico | 8B Decaimanta do carbona 16 a a a {ed resetanoe ft) Figura 2.10 Desenho da poténcia fornecida para a carga versus resistencia da carga Observe 0 uso dos operadores estruturais.*,e./ nesse exemplo, Esses opera- dores garantem o célculo das matrizes amps ¢ p1 elemento a elemento. » Exempio 2.5 tagdo de Carbono 14 Um isétopo radioativo de um elemento é uma forma do elemento que nio é estivel. Em ver disso, ela decai espontaneamente para outro elemento por um certo perfodo. O e1d_date Enter the percentage of carbon 14 remaining: 50 The age of the sample is $729.9097 years ORC Handbook of Chemistry and Physics estabelece que a meia-vida do carbono 14 de 5.730 anos. A saida do programa, portanto, esté de acordo com ele. < 13_Depurando Prog —__— Existe um antigo ditado que estabelece que as tinicas certezas so a morte e o Imposto de Renda. Podemos adicionar uma terceira certeza a essa lista: se vocé escrever um programa de tamanho significativo, ele nfo funcionaré na primeira vez que vocé tentar utilizé-lol Erros em programas recebem o nome de bugs, e 0 processo de localizar & climinar bugs € denominado depuragio. Quando escrevemos um programa e cle no funciona, como podemos depuré-lo? ‘Trés tipos de erros ocorrem em programas MATLAB. O primeiro tipo & 0 erro sin- titico. Erros sintaticos sio erros em uma declaragdo MATLAB, como erros tipogréficos ‘ude pontuagSo. Sia detectadas pelo compilador MATLAB na primeira vez que & exe- ccutado um arquivo M. Por exemplo, a declarasio xe ears ars contém um erro sintético, pois os parénteses nao est3o balanceados. Se essa declaragio estiver em um arquivo M denominado test.m, a seguinte mensagem aparecers quando test for executado: > teat (y +3042) Missing operator, comma, or semi-colon, Error in on line 2 4: \book\matlab\chap2\test.m ( segundo tipo de erro é 0 erro em tempo de execusio. Fle aparece quando uma ‘operacio matemsticailegal ocorre durante a execugdo do programa (por exemplo, tentar dividir por 0) Esses erros levam o programa a retornar Tn£ ou NaN, que s2o entdo uti= lizados em outros edleuloa. Os resultados de um programa contendo edlculos que usam In£ ou NaN sio em geral invalidos. ( terceiro tipo de erro 6 0 erro Iégico. Ocorre quando 0 programa compila e exe cuta com sucesso, mas produz a resposta errada. (Os erzos mais comuns efetuados durante a programacio sio os tipagrifies. Alguns cerros tipograficos criam declaragOes MATLAB invalidas. Eles produzem erros sintsticos que sio capturados pelo compilador. Outros errostipogréficos ocorrem em nomes de va- rlveis, Por exemplo, as letras em alguns nomes de varidveis poclem ser transpostas, ot 68 | Poxanacso om MATAR? para Enews tama letra incoreta pode ser digitada. O resliado ser uma nova varével eo MATLAB Simplesmente criard a nova varidvel quando ela for referenciada pela primeira vez. O MATLAB ndo pode detecar esse tipo de erro Eros ipograficos podem também prodizit eros gic. Por exemplo, se as vardveis volt e vel? forem usadas para velocidades no programa, uma delas poder ser nadvertidamenteusada em higar da outra em algum porto, Voce precisa verifiar esse ipo de erro inspecionando manualmente ocSdigo. “As vezes um programa inicia a execugdo, mas erros em tempo de execuséo ou eros ligicos ocorem durante ela, Nesse caso, exist algo errado com os dados de entrada, (ou com a estruturalogica do programa. primeiropaso para localiza esse tipo de bug, dleve ser verifier os dads de entrada do programa. Remova o ponto-evirgula das decla rages de entrada, ou adicione declaragbes de saida para verficar se os dados de entra da sio aqueles que voct espera ‘Se os nomes de varisveis -dadosde entrada estio-cor- retos, vce esta provavelmente diante de um erro lgico. Voce deve veriiar eada uma de suas decaragies de atribuigio 1. Se uma declaragio de atribuicio é muito longa, quebre essa declaragZo em decla- ragGes de atribuigio menores. DeclaragGes menores sao mais féceis de verificar 2. Verifique a colocagdo dos parénteses em suas declaragées de atribuigo. Um erro muito comum € ter as operagdes em uma declaragao de atribuigao avalia- das na ordem errada, Se vocé tem duivides quanto a ordem de avaliagio das variaveis, adicione conjuntos de parénteses para tornar claras as suas inten¢des. 3. Verifique se voc? iniciou todas as variéveis adequadamente. 4. Confira se todas as fungGes utilizadas esto com unidades corretas. Por exemplo, 2 entrada nas fungGes trigonomeétricas precisa ser em radianos, nao em graus. Se voc¢ ainda obtiver a resposta errada,adicione decaragSes de sada em varios pontos do programa para ver os resultados dos cdculos intermedidrios. Se puder loca Tizaro ponto com os cilculos errcos, voce stberd onde procurar problema, 0 qu seré 95% da batalha, Se ainda assim ndo conseguir encontrar o problema, explique a un clega ou a seu professor o que voce esta fazendo, e deixe que eles olhem seu cédigo. E muito comum {fur uma pessoa veja apenas o que ela espera ver quando verifics © proprio ebdigo Sutra pessoa pode frequentemente encontrar deprssa um erro que voc® no percebeu, Para reduzir 0 esforgo de depuragao, verifique se durante o projeto do seu programa 1. Iniciow as variéveis. 2. Utilizou parénteses para tornar claras as fungSes nas declaragées de atribuicko. Ma a (© MATLAB tem uma ferramenta especial de depuragio denominada depurador simbslico. Um depurador simbélico é uma ferramenta que permite acompanhar a exe: SS FRAT Captus 2 suas atsico | 69 cucio do seu programa declaragio a declaracio ¢ examinar 0 valor de cada varidvel a cada passo ao longo do caminho. Depuradores simbélicos possibilitam verificar todos os. resultados intermedirios sem a necessidade de inserir muitas declaragées de saida em seu cédigo. Aprenderemos a usar 0 depurador simbdlico do MATLAB no Capitulo 3 2.14 Resumo [Neste capitulo, introduzimos dois tipos de dados: double e char. Também introduzimos as declaragdes de atribuigio, os calculos aritméticos, as fungdes intrinsecas, as decla- ragGes de entrada/saida ¢ os arquivos de dados, =e orem de avatingao das expreSSOeS MATCAB segue uima hierarquia Ha, com i ‘operagées de nivel mais alto avaliadas antes das operagbes de nivel mais baixo. A hierarquia das operagies esté resumida na Tabela 211 A linguagem MATLAB inclui um miimero extremamente grande de fungies pre- definidas para awxliara resolver problemas. Ess lista de fungbes & muito mais rica do que a lista de fungSes encontrada em outras linguagens, como Fortran ou C, ¢ inclu recursos para desenhar que s80 independentes de dispositvos. Algumas das fungSes intrinsecas mais comuns estio apresentadas na Tabela 28, e muitas outras sero intro- dluzidas ao longo do livzo. Uma lista completa de todas as funges MATLAB pode ser acessada através do Navegador de Ajuda 2.14.1 Resumo de Boas Préticas de Programagao ‘Todo programa MATLAB deve ser projetado para que outra pessoa familiarizada com ‘© MATLAB possa entendé-lo com facilidade. Isso ¢ muito importante, pois um bom pro- ‘grama pode ser utilizado por muito tempo. Nesse periodo, as condligdes irao mudar, € ‘0 programa precisaré sofrer modificagSes para refletir essas mudangas. As modificagbes, poderio ser feitas por outra pessoa além do programador original. O programador que fizer as alteragSes precisaré entender programa original muito bem antes de tentar modificé-lo, Tabela 2.11 Hierarquia de Operagdes Precedtncla Operayto 1 (0 conteido de todos on partnteses€ avai, de dentro para fora 2 (Os expoentes sie avaindos, ds esquerda para a diet 3 ‘As multipicagiesedivisdes sf avaliads, da esquerda para a dita, 4 ‘As somas esubteages so avaladas, da esquerda para a drei muito mais dificil escrever programas claro e bons para entender e manter do aque simplesmente escrever programas. Pra isso, um programador deve desenvolver TO |. Praamapso en MATAR pre genes ) it 4. Qualotamanho eo valorde array (1 31,end)? input fla win marcadore 1é um valor do teclado. # +s 5 2 intzotr CConverte em uma cadeia de caracteres de interes 22 Os nomes de varvels MATLAB a seguir si legais ou ilegais? Por qu i va | Bo length(arr) evolve o comprimento de um vetor ou a maior dimensio de [E & Do_you_know_the_way_to_san_jose ‘uma matriz bdimensional - wel aoe load Carrega os dados de um arquivo. = © What’ sup Log (x) Calcula o logaritmo natural de x. = 2.3 Determine o tamanho ¢ o contetido das matrizes a seguir. Observe que as tiltimas. loglog ‘Gera unt desento log-log. = —"atetzas poder depenter das detigoes das malrizes anteriores dent deste Lookfor Procura um termo que case na descrigéo de fungdes de uma £ mesmo exercicio. linha do MATLAB. 4 aa = 1:2:5; imax (x) Retoma 0 valor méximo no vetorx¢,opcionaimente,alocai- = Eb La’ a" ragho dese valor : eek min (sx) Retorna o valor minimo no vetor x,¢, opcionalmente, alocalizae |= dds as Qi; ‘lo dese valor. ew = [zorosti.3) ones(3,1)" 3:5°1; pozia.m Engi ea, msl (Ebb aya Bi 412i; ian epresentacao de “néo-um-niimero”. | yuma que a matriz array seja definida conforme mostrado, e determine unzeer (x) Cenvera em na ends de orton, FE 24 Assuma que mati array! oj deine conforme mosrao,¢ dt ones (n,m) Gera uma matriz de uns. “contetido das sabmattizes a seguir ee Reeantc eines Fr Lt 0.0 24 -3.5 6.0 plot Gera um desenho ay linear i array1 =| 0-9 11 -6.6 2.8 3.4 print Inpeime uma Janela de Figur. § 2.2 Ge 0.3 ok 1.3 round (x) ‘Arredonda x para o inteiro mais préximo. = ate . * pave “Ammazena os dados do esporo de trabalho em um arquivo. Z a arrayl(3,:) semilogx Gera um desenho log-linear z Db. arrayl(:,3) semilogy Gera um desenho linear log Ee arrayiii2:3,0 3 41) sin(x) Calcula 0 seno de x, com x em radianos. rs @. arrayl({1 1).: size ‘Captura o ntimero de linhas e de colunas de uma matriz. “28 Assuma que o valor inicial de value seja 10x, Determine o que seré impresso Calla a riz quadrada de um numero. pels dedavagbes abaixo ” " " Converte uma cadeia de caracteres em um ntimero. fe isp ({'value = * nundstr(value)}) Calcul a tangente de x, com 2 em radianos, : pee (Uvaiue 7 mangoes tvareel)) ‘Adiciona um titulo a um desenho. \: foeueeethe a " Adicona wie a um iE fprint({‘value = te\n' value); [i fprint£({'value = tE\n',value) fprinté({ ‘value = &g\n’ value; i fprintf({‘value = $12.4f\n".valuel: - 2.6 Considere a,b, ced definidas conforme a seguir, ¢calcule os resultados das seguintes 2.15 Exercicios = ‘operagBes caso elas sejam legais. Se uma operagio for il lique o motivo. 2.41 Responds as seguintes perguntas a respeito da matriz abaixo. = erase eperato fe gal expla 110.0 2.1 -3.5 6.0 le a- [23] >= (2 4] arcayr . | 00 Ut -66 208 314 £ 1 2 02 21 0.1 0.3 -0.4 1.3 e+ [3] € = eye(2) 1a 5.1 0.0 1.1 0.0 2. m 29 2.40 an 1 Prgranagso em MATAB® para Engen a. result = b. result. ©. result. d. result. fe. result f result & result apna? marApsisico | 75 screva um programa para calcular a distancia entre quaisquer dois pontos (x1, y1) © (x2, y2) especificados pelo usuario, Utilize boas praticas de programacio em seu programa, Use-o para calcular a distancia entre os pontos (2, 3)¢ (8, ~5) oot Avalie cada uma das seguintes expresses: “ all /5+6 e127) bts 5) +6 cis 2 ~ — > — dse2e3 e3 8 (293) £342) 93 & round(-11/5) + 6 he ceil(-11/5) « 6 i, floor(-11/5) + 6 Use o MATLAB para avaliar estas expressies: a. GS-4 +63) b. cos (12) Resolva o seguinte sistema de equagbes simulkineas para x: 2.0 % + 5.0% + 1.0 X, 4 3.0 x + 4.0 Ky 2.0 X ~ 1.0 X, = 5.0 x, ~ 2.0 x) + 6.0 x “1.0% + 6.0 - 40x, -5.0x+3.0 K 4.0 X + 3.0% - 6.0 x, - 5.0 x, - 2.0% “3.0% + 6.0) + 4.0 x, + 2.0 x, - 6.0 x 2.0% + 40x + 4.0 x4 @O K+ 50 Posisio e Velocidade de uma Bola. Se uma bola estaciondria é langada da altura hh, acima da superticie da Terra, com velocidade vertical t, a posigio e a veloci- dade da bola como fungao do tempo serio dadas pelas equagées he 1 1 @10) w= st) en conde g & aceleragio da gravidade (-9,81 m/s), € a altura acima da superticie da Terra (assumindo auséncia de alrito do at) e » € o componente vertical da velocidade. Escreva um programa MATLAB que solicite ao usuario a altura ini da bola em metros ea velocidade da bola em metros por segundo, depois desenhe a altura e velocidade como fungio do tempo. Nao deixe de incluir a6 legendas apropriadas no seu desenho, A distancia entre dois pontos (x1, y1)e (x2, y2)em um plano de coordenadas carte- sianas 6 dada pela equagio sng hy d=V@l-xaP +l 12) Figura 2.12. Distincia entre dois pontos em um plano cartesian, 2.42 Decibéis. Os engenheiros freqtientemente medem a razio entre duas medidas de poténcia em decibés, ou dB. A equacSo para a razio entre duas medidas de potén- cia, em decibéis, é 0 I Le eB, di 13) conde P, é nivel de potencia medido eP, €um nivel de poténcia de referencia a Assuma que o nivel de potencia de refeéncaP,seja de um miliwate excreva tum programa que aceite como enrada uma poténcia Pea converta em dB com relafo ao nivel de referncla de 1 mW. (Os engenheto em uma unidade ee Peal para niveis de poténcia em dB com respetto& referencia de Im dBm) Urata rts de progam programa ve ®. Escreva um programa que cre um cesenho da potencia em watt ests potécia em dBm com reagio a medida de referencia de 1 mW. Cie desenios near em eye loglinesr 2.13 Co.Seno Hiperbli ‘A fungo de co-senahiperblico 6 definida pela equacio ae ei) z Escreva um programa qu calcul oco-sno hiperbsico de um valor x fornecido pelo usuirio, Uizeo programa para calcular 6 co-eno hiperolio de 30. Com parearesposta do seu programa com a respastaproduzida pela fangao cosh (¥) Guat €o menor valor admitide para esa fanedo? Qual 9 valor de correspon dente a esse valor? Iti nT a My ii i 76 | Perarario en MATAB para Erpntees 2.14 Energia Armazenada em uma Mola: A fora requerida para comprimir uma mola linear é dada pela equacio Fake a5) onde F € a forga em newtons ek ¢ a constante da mola em newtons por metro. A ‘nergia potencial armazenada na mola comprimida é dada pela equagao 1 padi e216) onde E é a energia em joules. A informacio a seguir diz respeito a quatro molas. Foe ®) (Constante da Mola (N/m) Determine a compressio de ada mola ¢ a energa potencal armazenada em cada ona dla. Qual ola tern tas energiapotercal armazenada? 2.18 Receptor de Rédio, Uma versio simplifcada da parte frontal de um receptor de tide AM €apresertada ra Figura 21a. Esse ecepor€ composto por um cielo fue conti tim restr Ry une capactor Ce um indtorL onactates em sie © Heuto €conecado a uma antena externa ealerrado conorme moot a igure 1 citcuto permite que ordi slecione uma elagdoespectice dente as aque trarentem ra fava AM, Na freqhtnc de ressondncia do ccaito, essere mente todo o sina! V, de antena val ato resistor que representa 0 resto do dio, Em outs pelaves,o tao tecebe Seu sinal els forte na equncia de ressonincia. A freqiénca de ressondncia do citeiteindutor-capacior@ dade pela equagio 1 he ear) ‘onde L é a indutancia em henrys (H) eC é a capacitancia em farads (F). Escreva um programa que calcule a freqiiéncia de ressondincia desse aparelho de rédio, dados valores especificos para L e C. Teste seu programa pelo eéleulo da frequiéncia do ridio quando L = 0,1 mH e C = 0,25 nF. 2.16 Receptor de Rédio. A voltagem através da carga resistiva, na Figura 2.13, varia como fungao da freqiiéncia, conforme a Equazio (218). y, a8) onde @ = 2nfe fé a freqiiéncia em hertz, Assuma que L= 0,1 mH, C=0,25 ak, R= 50G2e V,~ 10 mv. apie? waraDetsico | 77 Desenhe a voltagem na carga resistiva como funcio da freqiiéncia. Em qual fre- aiiéncia temos 0 pico de voltagem na carga resistiva? Qual a voltagem na carga com essa freqiigncia? Essa freqiiéncia também é chamada freqiiéncia de ressondncia fy do circuito. b, Sea freqiigncia mudar para 10% acima da freqiéncia de ressonancia, qual ser ‘a voltagem na carga? Quio seletivo sera o receptor de rédio? c._ Em quais freqiiéncias a voltagem na carga caira para a metade da voltagem na freqléncia de ressondncia? 2.17 Suponha que dois sinais sejam recebidos na antena do ridio descrita no problema anterior. Um sinal tem poténcia de 1 Va uma freqiiéncia de 1.000 kHz, eo outro sinal tem poténcia de 1 Va 950 kHz. Quanta poténcia serd fornecida pelo primeiro sinal para a carga resistiva R? E pelo segundo sinal? Expresse a razo, em decibéis, entre a potéricia fornecida pelo sinal um ea poténcia fornecida pelo sinal dois. Qual a melho- ria ou supressdo do segundo sinal, comparado com o primeiro? 2.18 Raio de Curva de Aeronaves. Um objeto movendo-se em uma trajet6ria circular, ‘com velocidade tangencial constante v,é apresentado na Figura 214. A aceleragio radial requerida para o objeto se mover na trajetéria circular & dada pela equacio 219) onde a éa aceleragio centrfpeta do objeto em m/s?, v6 velocidade tangencial do ‘objeto em m/s e r 0 raio da curva em metros. Supondo que o objeto seja uma aeronave, responda as seguintes questées sobre ela: a. Suponha queaacronave est ou seja 85% da velod- dade do som. Se a aceleragio centripeta for de 2g, qual ver 0 raio da curva da ‘eronave? (Nota: para ese problema, vocé pode assumir que Mach 1 = 340 m/s, 1g = 981 m/s*) 'b, Suponha que a velocidade da aeronave aumente para Mach 1,5. Qual 0 raio da «. Desenteo aio da curva como fungio da velociade da acronave para velo dads entre Mach 05 e Mach 20, assumindo que aaceleraglo permaneca em? g, TB | Prarangete em MATLAS® pare Expats 4. Suponha que a aceleragao maxima suportada pelo piloto seja de 7 g. Qual o ‘menor raio da curva da aeronave a Mach 15? e. Desenhe 0 raio da curva como fungio da aceleragao centripeta para aceleragSes entre 2g e 8 g, assumindo uma velocidade constante de Mach 0,5. Figura 2.14 Um objeto deslocando-se em movimento crcilar uniforme com aceleragio cen- tripeta a men i a th tows td [g |= FS aii inert 3 Capitulo Expressées de Ramificacao e Projeto de Programa No capitulo anterior, desenvolvemos diversos programas MATLAB completos e furt- Maior gue = Maior que ou igual « Menor que Menor que ou igual a Algumas operacdes relacionais ¢ seus resultados sio apresentados a seguir. Operagio Resultado 3 1 3 1 3 ° 3 ° 4 1 . 1 ‘A tltima operacio relacional produz 1 porque os caracteres sio avaliados em ordem alfabética, COperadores relacionais podem ser usados para comparar umm valor escalar com uma [3 G]e > =O.cnoa expressio a > b produricé oresutado [1 ©] Operadoresrlaconais podem também ser wados para compar ‘matriz. Por exemplo, se a doas matrizes desde que ambas tenham 0 meno tamasho. Por exemple, se a= [1o]en=[ 2S] enion expresios > 'b produziré o resultado [1 0] Seas mateizestverem tamanhos diferentes, um erro seré produzido. Lt Observe que, como cadeias de caracteres sio na realidade matrizes de caracteres, ‘operadores relacionais podem comparar duas cudeias de earacteres somente se elas tiverem 0 mesmo comprimento. Se elas tiverem comprimentos distintos, a operacio de comparacio produzird um erro. Vamos aprender uma forma mais geral de comparar cadeias de ca- racteres no Capitulo 6. © operador relacional de equivalincia ¢ escrito com dois sinais de igual, enquanto operador de atribuicéo ¢ escrito com um tinico sinal de igual. Esses operadores so ‘muito diferentes, e programadores novatos fregiientemente os confundem. © simbolo uma operacéo de comparagio que retorna um resultado I6gico, enquanto o sim- bolo = atribui o valor da expressao & direita do sinal de igual 8 variével A esquerda desse eae ionat aia a are Gone EES antaiea Sree ce Rarieasioe Proto de Frgama | 87 sinal. Um erro muito comum de programadores novatos é usar um sinal de igual tinico para tentar efetuar uma comparacio. Cuidado para nio confundir o operador de equivaléncia relacional (==) com a decla- ragio de atribuigao (=). Na hierarquia de operagées, operadoreé relacionais sio avaliados depois de todos tre yas OAS EXPTESBOES SOBUINTES SHO" equivalentes— (ambas sio verdadeiras e produzem um valor 1: Te3eaeu 432224 3.3.2 Nota de Atencio a Respeito dos Operadores © operador de equivaléncia (=) retorna 1 quando os dois valores comparados sio iguais, e 0 quando sio diferentes. De maneira similar, o operador de no equivaléncia (-=)retoma 0 quando 0s dois valores comparados sao iguais, e 1 quando sio diferentes, Esses operadores so, de maneira geral, bons para comparar cadeias de caracteres, mas podem as vezes produzir resultados surpreendentes quando dois valores numéricos sio comparados. Devido a erros de arredondamento durante céleulos computacionais, dois ntimeros teoricamente iguais podem ser ligeiramente diferentes, levando um teste de igualdade ou de desigualdade a falhar. Por exemplo, considere os dois seguintes riimeros, que deveriam ser ambos iguais, 200: a=; be (i Como esses ntimeros sao teoricamente 0 mesmo, a operagao relacional a produzir um 1. Na realidade, o resultado desse célculo no MATLAB é , deveria sas or » b= sin(pd); > aad ° © MATLAB reporta que a € b sdo diferentes em decorréncia de um ligeiro erro de arredondamento no calculo de sin (pi), que leva o resultado a ser 1,246 x 10-16 em vex de exatamente zero. Os dois valores teoricamente iguais diferem ligeiramente de- vido ao erro de arredondamento! Em vez de comparar dois nimeros para ver a igualdade exata, vocé deve ajustar seus testes para determinar se dois mimeros sio aproximadamente iguais, com uma fs} BB | Propane om MATAl® pare Enereiros Captain Bessie oo Riese Peto de Prone | 89 precisdo“qui Teve em conta os erfos de aredondamento esperados para os niimeros gute Tabela 3.3. Tabelas-Verdade para Operadores Logicos comparados. O teste Se ‘enadas . ow ou excuse a » abe (a= b) < 108-16 Di hah fi rah “4 1 oo 0 0 0 1 0 4 ¢ 1 1 1 produz a resposta comet, apesar dos eros de aredondamentono ciclo de a eb 2 ; : 1 a . 1a 1 1 0 ° Cuidado ao testar a igualdade de valores numéricos, pois erros de arredondamento oder fazer curas Variaveis que deveriam sor iguaisfalharem no teste de igualdade. Em vex disso, teste para ver se as varidveis sio gusse iguais dentro de un ero de mati Porexemplo se a =[1 ©] e > = 0, eno a exmssio ad apmsenad arredondamento esperado para o seu computador po, ayer e pressdo ath apres ST o resultado {° 3} Operadores légicos podem também ser usados para comparar duas matrizes, desde que as duas tenham 0 mesmo tamanho. Por exemplo, se 10 11) enta i resentaré o resultado [1 1 a=[} oS} en [3 dj entio a expressio ai apresent ntado [2 1] ‘Se as matrizes tiverem tamanhos diferentes, um erro seré produzido. Na hierarquia de operagbes, os operadores légicos slo avaliados depois de todas 4 operagdes aritméticas ¢ relaconais. A ordem de avaliagao dos operadores em uma expressio é dada a seguir, | eo ‘Oeics pox Ser weds pra Compara un Valor GaTar com am 3.3.3 Operadores Logicos Operadores légicos s30 operadores com um ou dois operandos I6gicos que produzem ‘um resultado légico. Existem és operadores légicos bindrios ~ E, OU e OU exclusiva € um operador unério ~ NAO. A forma geral de uma operacio légica bindria é I iararanita 1 op ty 8 forma geral de uma operacio liga undra & 7 1. ‘Todos 05 operadores aritméticos sao avaliados primeiro, na ordem descrita oph, anteriormente. onde I ¢ p sio expressies ou variéveis, e op é um dos operadores légicos mostrados na Tabela 3.2, Se a relagdo entre Ie fy expressa pelo operador for verdadeira, a operacio z retoma um valor 1; caso contrario, a operagao retorna um valor 0. Os resultados dos operadores esto nas tabelasverdade apresentadas na Tabela 33, i 3. Todos os operadores ~ s80 avaliados. que mostram o resultado de cada operagao para todas as combinagies possiveis de ely ‘Nas operagbes 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 €0, ¢ 0 resultado de -061, 2. Todos os operadores relacior da esquerda para a direita, >) 24) <, <=) SSoavaliados, 4. Todos os operadores & sio avaliados, da esquerda para a direita, 5. Todos os operadores | sio avaliados, da esquerda para a direita? 5 Assim como acontece com os operadores aritméticos, os parénteses podem ser usados para mudar a ordem-padrio de avaliacio, Exemplos de operadores ligicos & Tabela 3.2 Operadores Logicas FZ seus resultados sio-dados no Exemptss—— Oaneor ' . Eligico |= 7 Nota: Antes do MATLAB 6, os operadores & e | tinham precedéncia igual, e eram avaliados da es- ' OU Ligico z ‘querda para a deta em ordem de ocoertncs.A partir do MATLAB 6 os passow » sr avaliado antes OU excusvo igco [Zo Asm, uma expres como aibic sei ava dfn no MATLAB S31 ou anterior no 1AO igo MATLAB 60 ou posterior. Cuidado! Por garanta, sempre use pardnteses para indcar a ordem dese ja de avaliagd de uma expreeeio, 90 | Prgamacto on MATLAB pare Enperios > rescence areerman Exemplo 3.1 Considere que as seguintes variéveis so iniciadas com os valores mostrados, e calcule o resultado das expresses especificadas. value} = -10 Expressio Légica Ad nom oe Caple 3 Sgesses te Ranviapfoe Pate ae Pogara | 91 Bote teste apresenta uma verificagdo répida do seu entendimento dos conceitos apre- sentados na Segio 3.3. Se vocé tiver problemas com o teste, releia as segSes, pergunte a0 seu professor ou discuta 0 material com um colega. As respostas podem ser encontradas no final do livro, Assuma que a, b, c e d sejam conforme dado, e avalie as seguintes expresses: b= -2; ~vainel valuel | value2 valuel & value? valuel & value2 valuel & (value? ~(valuel & value) eee aenararnneerneeenee sensi | values) 1 0 1 value 1 1 0 O operador - é avaliado antes dos outros operadores I6gicos. Portanto, os pa- rénteses na expressio (f) do exemplo anterior so necessarios. Sem esses parénteses, a cexpressio (f) teria sido avaliada na ordem (~valuel) & value}. 3.3.4 Fungdes Légicas © MATLAB tem diversas fungdes légicas que retomam 1 quando a condigao testada for verdadeira e 0 quando a condigao testada for falsa. Essas fungdes podem ser uusadas com operadores relacionais e légicos para controlar a operagio de ramifi- ceagdes ¢ lagos. Algumas das funsées légicas mais importantes sio dadas na Tabela 3.4 Tabela 3.4 Fungdes Légicas do MATLAB Fangio a Devolve Ise for uma mati de carateres, 0, ca contririo, Avempty a) Devolve 1 sea for uma matrz vazl, 60, caso contréio, sintia) Devolve 1 seo valor de for infinits (int), €0, caso contri, senan (a) Develve 1 se 0 valor de a for at (aio um mimeo) 0 caeo contri. ismumericta) __Devolve1 se a for uma matiz mumétia, e030 contri. aia aa a a a TT DRI Hreoriedfn aioe Assuma agora que a, b, ¢ ed sejam conforme dado. Explique a ordem de avaliagio de cada uma das seguintes expresses, especifique os resultados em cada caso: asa © = 10; bear a=0; 10. atbr2 > ate Md tbsa 2. (dt bl aa Assuma que a, b, c € d sejam conforme dado, e avalie as seguintes expressbes: a = 20; b= 2; c= 0; a= "Test"; 13. ising (a/b) 14. ising (a/c) 15. a > b & ischar(a) 16. isempty(c} a 92 |. Pagarapsoem MATLAB para Ergntvies 3.4 Ramificagbes ‘Ramificagdes so declaragdes MATLAB que nos permitem selecionar e executar segies especificas de cédigo (denominadas blocs) esaltaroutras secBes do céigo. Sto varia- Bes da construgio 1 f, da construgio switch e da construgio try/catch. 3.4.1 A Estrutura if Aconstrugio if tem a forma it_exprcontrotet1 —_____ Declaracao 1 Declaracao 2 | Bloco1 assis oxpe_coitrole.2 teclasacso oviaraeae | Boo 2 ase Declaracdo 1 Dociaracao | Bloco3 onde as expressées de controle controlam a operagio da construcio if. Se expr_con- erole_t é diferente de zero, o programa executa as declarages no Bloco I e salta para 2 primeira declaragdo executdvel depois de end. Caso contrério, o programa verifica estado de expr_controle_2. Se expr_controle_2 diferente de zero, o programa executa as declaragGes no Bloco 2 e salta para a prmeira declaragdo executével depois de end. Se todas as expressdes de controle sio zerc, 0 programa executa as declaracées no bloco associadas com a cldusula ¢1 se. Pode haver qualquer nimero de clausulas eee: £ (0 ou mais) em uma construcio if, mas pode haver no méximo uma cldusula ele. A expressao de controle em cada cldusula seré testada somente se as expresses de controle em todas as cléusulas acima dela forem avaliadas como zero. Quando uma das expressdes € diferente de zero € 0 bbloco correspondente ¢ executado, © programa salta para a primeira declaragio execu- tavel depois de end. Se todas as expresses de controle sio zer0, 0 programa executa as declaragGes no bloco associadas coma cldusula ee. Se ndo existir uma cldusula else, ‘ execusio continua depois de end sem executar qualquer parte da construgio Lf. Note que a palavra chave enc no MATLAB, nessa construgio, & completamente dife- rente da fungio end do MATLAB que usamos no Capitulo 2 para retornar o valor mais. alto de um indice dado. O MATLAB diferencia esses dois usos de end pelo contexto em ‘que aparece a palavra em um arquivo M. Na maioria das circunstincias, as expressies de controle sfo uma comibinago de operax ores relacionais ¢ Idgicos. Conforme aprendemos ro inicio do capitulo, 0s operadores relacionais e ldgicos produzem 1 quando a condigio correspondente é verdadeira e 0 at al mailman Ha Adaesdibe te Peso HP Caplule3 Grasses ae Ramiescie Peto de Prngame | 98 ‘quando a condigao correspondente éfalsa. Assim, quando um operador é verdadeiro, 0 resultado é diferente de zero e o bloco correspondente é executado, Como tum exemplo de construgio if, considere a solugio da equagio quadratica da forma attbrte=0 @1) Assolugéo dessa equagio é 4 Vee eo 2) SO termo b= ac 6 conhecide como discrininante da-equagio. Se bt ~dac> 0, hé-duas raises — reaisdistntas para a equagio quadritica. Seb? 4ac =O, hi uma dnicaraizrepetida para a equagio. Se b ~ 4ac < 0, hé duas raizes complexas para a equacio quadrética. Suponha que queiramos examinar 0 discriminante de uma equagio quadrética e dizer a um usuario se a equagio tem duasraizes complexas, duasraizes reas idénticas ou duas raizes distntas reais. Em pseudocédigo, essa constragio adotaria a forma if (bA2 - arate) < 0 Escreva que a equagao tem duas ra{zes complexas. elseif (b*2 - 4*atc) w= 0 Escreva que a equaggo tem duas raizes reais idénticas. else Escreva que a equacdo tom duas rafzes reais distintas. end ‘As declarages MATLAB para fazer isso $30 if (bt2 ~ dtatc) < 0 isp(“Essa equacao ten duas ra{zes complexas.); elseif (b*2 - dtate) == 0 disp(‘Essa equagio ten duas rafzes reais id@nticas. else disp(‘Essa equagio tem duas rafzes reais distintas.’); end Lembre-se de que 0s operadores relacionais retomam um valor diferente de zero (1) quando o teste é verdadeiro, por isso um teste verdadeiro provocard a execucio do loco de eédigo correspondente. Para facilitar a leitura, os blocos de cédigo com uma construgio if sio em geral tabulados em dois ow trés espagos; mas Isso nz Verdade no € estritamrente requerido, Sempre tabule o corpo de uma construgio if em dois ou mais espacos, para faclitar a legibilidade do cédigo. EEE ESET 94 | Praams;so em METAB pre Ege F possivel escrever uma construgio i completa em uma tnica linha, separando as partes da construglo por virgulas ou ponto-e-virgula. Assim, as duas construgies a seguir si0 idénticas Canine Saresses oe RamieapioeProstoae Popana | 95 discriminante. £ razosvel, portant, implementar esse algoritmo com uma cons- trusio if de tts ramificagées. O pseudoadigo resultante é Solicite eo usuério os coeficientes a, bec: Leia a, bec if xo discriminante © b'2- 44a tc ¥ = abs (x); if diseriminante > 0 end x1 © ( -b + sqrt(discriminante) } / (2 * a) e x2 © (-b ~ sqrt(discriminante) } / (2 * a) Escreva que a equacao tem duas rafzes reais distintas. x < 0; y = abs(x); end Escreva as duas raizes elseif discriminante =» 0 Entretanto, isso deve ser feito somente para pequenas construcies. Deby 2 al 3.4.2 Exemplos de Utilizagao de Estruturas if ‘Vamos agora analisar dois exemplos de uso das construgbes if. > SS Exemplo 3.2 ~ Equaydo Quadrética Projete e escreva um programa para resolver as raizes de uma equacio quadritica, inde- pendentemente do tipo. Solugio ‘Vamos seguir os pass0s de projeto apresentados anteriormente no capitulo, 1. Estabelega 0 problema ‘A apresentacao do problema para este exemplo é muito simples. Queremos es- crever um programa para resolver as raizes de uma equacio quadratic, indepen- dentemente de serem raizes reais distintas, reais repetidas ou raizes complexas. 2. Defina as entradas e safdas As entradas requeridas para esse programa sio os coeficientes a, b e ¢ da equagio quadritica axttbrtc=0 ep A saida do programa serao as raizes da equacéo quadratica, independente- mente de serem raizes reais distintas, reais sepetidas ou complexas, 3. Projete o algoritmo Essa tarefa pode ser quebrada em trés sees, cujas fungies sio entrada, proces- samento e saida, Leia cs dados de entrada Calcule as ratzes Escreva as rafzes ‘Agora, quebramos as segdes acima em partes menores e mais detalhadas. Existem trés possiveis maneiras de calcular as raizes, dependendo do valor do Escreva que a equagdo tem duas raizes reais idénticas Escreva a raiz repetida. “parte_real © -b / (2 * a) parte imag « sqrt (abs (discriminante) } / (2 * al Escreva que a equacio tem duas rafzes complexas. Escreva as duas raizes. end 4. Transforme o algoritmo em declaragies MATLAB (O eédigo final MATLAB € conforme a seguir. Script file: calc_roots.m Purpose ‘This program solves for the roots of a quadratic equation of the form atx"2 « bx + c= 0. Tt calculates the answers regardless of the type of roots that the equation possesses. Record of revisions: Date Programe: Description of change 12/04/98 S$. J. Chapman Original code Define variables: a == Coefficient of x2 term of equation > == Coefficient of x term of equation c Constant term of equation iscriminant of the equation imag part of equa’ real_part -~ Real part of equation (for complex roots) x1 -- First solution of equation (for real roots) x2 == Second solution of equation (for real roots) % Prompt the user for the coefficients of the equation disp (‘This progrean solves for the roots of a quadratic’); disp (‘equation of the form AYX*2 + BX 6 C= 0.) 96 | Proganacso em AUTLAB® pre genes = input (‘Enter the coefficient A: ‘I; b = input (‘Enter the coefficient B: '); € = input (‘Enter the coefficient ¢: "); ® calculate discriminant discriminant = b2- 4 * a * c & Solve for the roots, depending on the value of the discriminant if discriminant > 0 there are two real roots, so... xl + (-b + sart (discriminant) ) / (2 tan x2 = ( -b = sqrt (discriminant) ) / (2 * a); disp (This equation has two real roote:’); Eprincé (xl = 8f\n", x1); Eprintl (/x2 = 8f\n") x2); elseif discriminant == 0 % there is one repeated root, so xl=(-b) /(2* a); disp (‘This equation has two identical real roots;’1; fprinté ("x1 = x2 = ¥£\n’, x1); else & there are complex roots, so realpart = (-b) /(2* a); imag_part = sqrt ( abs ( discriminant ) ) / disp ("This equation has complex rocts:"}; fprintf (‘x1 = $f 41 ¥f\n’, real_part, imagpart ); fprintf ("x1 + $f -i 4f\n’, real_part, imagupart ); Catan end 5. Teste o programa A seguir, vamos testar o programa utilizando dados reais. Como existem trés possiveis caminhos pelo programa, precisamcs testar todos os rs caminhos antes de termos certeza de que o programa esté funcionando apropriadamente. A par- tir da Equacio (32), € possivel verificar as solugSes para as equagoes a seguir. x2+5246=0 tear + 4=0 +2 +590 xe2and x=-3 x=2 xe1s2 Se esse programa for executado tx@s vezes com os coeficientes acima, 05 re- sultados serao como os mostrados (0s dados fornecidos pelo usuério aparecem em negrito): » calc_roote This program solves for the roots of a quadratic equation of the form A‘K"2 + BPX + C= 0 Enter the coefficient A: 1 Enter the coefficient B: 5 Enter the coefficient C: 6 T ft tT 3 i I £ Cape 3 Eases ob Ramiicapiow Projet de Pogame | ST ‘This equation has two real roots: 2.000000 2 = ~3.000000 » calc_reots This program solves for the roots of a quadratic equation of the form A‘K2 + BYX + C= 0 Enter the coefficient a: 1 Enter the coefficient B: 4 Enter the coefficient C: 4 This equation has two identical real roots: x1 = x2 = -2,000000 ‘This program solves for the roots of a quadratic Enter the coefficient A: 1 Enter the coefficient B: 2 Enter the coefficient c: 5 This equation has complex roots x1 = -1,000000 +4 2.000000 x1 = -1,000000 -i 2.000000 (© programa dara as respostas corretas para nossos dados de testes em todos (0 trés casos possiveis. < » Exemplo 2.3 - Avaliar uma Fungo de Duas Varlavels Escreva um programa MATLAB para avaliar uma fungio f(r y) para quaisquer dois va- lores x € y especificados pelo usudrio. A fungio fixy) 6 definida assim: x+y x20andy20 a jety x20andy<0 JOM") ay x<0andy20 x+y x funxy Enter the Enter the ‘The value x coefficient: 2 y coefficient: -3 of the function is x coefficient: -2 y coefficient: 3 of the function is 7 x coefficient: -2 y coefficient: -3 of the function is 73 (programa dard as respostas corretas para nossos valores de teste em todos os quatro casos possiveis. < 3.4.3 Notas a Respeito do Uso de Estruturas i£ A construgio if é muito flexivel. Ela exige uma dedaracio if ¢ uma declaragio end No meio, pode ter qualquer niimero de cldusulas elsei, e pode também ter uma cldusula else. Com essa combinacio de caracteristcas, 6 possivel implementar qual- quer construgio desejada de ramificagdo, Adicionalment, construgies i podem ser aninhadas. Duas construgées if sio aninhadas se uma delas se posicionainteiramente dentro de um tinico bloco de cédigo da outra. As duas construgées if a seguir estio apropriadamente aninhadas. iE xo ity <0 end, end O interpretador MATLAB sempre associa uma dada declaragio end com a decla- ragdo if mais recente, assim, o primeiro ond fecha a declaracio if y < 0, enquanto © segundo end fecha a declaragao if x > 0. Isso funciona bem para um programa escrito apropriadamente, mas pode levar o interpretador a produzir mensagens de lerros confusas se o programador preparar um cédigo erréneo. Por exemple, suponha gue tenhamos um programa de grande porte com uma construcio deste tipo: if (test1) if (cest2) | = apie presses Raritasfoe Preto de Prana | 101 if (test) end end end Esse programa contém trés construgdes if aninhadas que podem se espalhar por centenas de linhas de cédigo. Agora, suponha que a primeira declaragio end seja = acidentalmente removida durante uma sessio de edigio. Quando isso ocorre, 0 interpretador. cia automaticamente 0 segundo end com a construcao if (test3) mais comaif (test2) do meio. Quando o int pretador atinge o fim do arquivo, le se dé conta de que a primeira construsio if (test) néo foi fechada e gera uma mensagem de erro dizendo que falta umn end. Infelizmente, ele nio pode dizer onde o problema ocorre, da a necessidade de voltar € procurar manualmente em todo o programa para localizaro ero, Eas vezes possivel implementar um algoritmo usando miltiplas clfusulas etseit ou declaragées if aninhadas, Nesse caso, uum programador pode escolher 0 estilo que melhor Ihe aprouver. Exemplo 3.4 ~Distribuigo de Notas Usando Suponha 0 desenvolvimento de tum programa para ler uma nota de aluno numérica € associar uma letra a ela, segundo a tabela a seguir: nota > 95 A 95 2 nota > 86 B 86 2 nota > 76 C 16 2 nota > 66 D 66 2 nota > OF Escreva uma construgdo if para distribuir as notas conforme deserito acima usando (a) miltiplas cléusulas e12ei£ eb) construgdes if aninhadas Solugio a. Uma possivel estrutura com o uso de cldusulas elseif é nota 5 9 disp(’A nota & elseif nota > 86 disp(‘A nota é eleeif nota > 76. disp("A nota é elseif nota > 66. disp("A nota é 102 | Propane am NUTLAe para pets disp(‘a nota é F.* end 'b. Uma possivel estrutura com 0 uso de construsées if aninhadas é if nota > 95.0 disp(/A nota 6 A. if nota > 86.0 disp(‘A nota 6 8. else if nota > 76.0 ”: disp(’A nota 6c.) else if notd > 66.0 disp(‘A nota é D. else disp(‘A nota 6 F."); end end end —— Deve ficar claro, pelo exemplo acima, que, se houver muitas opgSes mu- tuamente exclusivas, uma construgao if nica com muiltiplas cléusulas if sera mais simples do que uma construgéo if aninhada, Para ramificagBes com muitas opgées mutuamente exclusivas, utilize uma tinica construgSo if com miltiplas cldusulas ese, preferencialmente a construgées if aninhadas ed 3.4.4 AEstrutura switch A construgio switch € outa forma de construsio de ramifcagio, Ela permite que un Frogramaor setesone sm boc de igo em parla ser execatad, ct ase no ‘alor de um nico into, caractere ou expresso logica, A forma gerald uta cone, trugdo switch é: » “Bs ® } Bloco switch (expr_switch) case expr_case, Declaracao 1 Declaracao 2 1 | ao a lod Eeste oe Ramage rte Programa | 108 } Bloc? J son 3 Seo valor de exp switch for igual aexpr.case1, 0 primeiro bloco de ciigosers exceu- «doe o progr sataré para a primelra decarasao apés 0 final da consmugao svi teh De mancira similar, seo valor de expr switch for igual aexpr_cese_2, 0 segundo bloco de cédigo sera executado e o programa saltars para a primeira declaragto apo inal da constragio switch, A mesma ida se aplica os outros caos na construgi © bloco de c6igo otherwise € opcional. Se ele estiver presente, seréexecutado sempre que o valor de expr_owi tch estiver fora do coberto por todos os seletores de casos. Se ele ni estiver presente eo valor de expr_witch nto for coberto pelos seletores de casos, rnenhum dos blocos de oédigo serd executado. O pseudocddigo para o constrator de ‘casos é idéntico& sua implementagdo em MATLAB. Se muitos valores de expr_switch provocarem a execugio do mesmo cédigo, sserd possivel incluir todos esses valores em um tinico bloco por meio de chaves, con- forme ilustrado a seguir. Se a expresséo casa com alguma das expresses na lst, © bloco serd executado. case case_expr_2, Declaracko 1 Declaracao 2 otherwise, Declaraco 1 Declaracao 2 end switch (expz_switch) case (expr_case_l, expr_case_2, Declaracae 1 Bloco 1 } Blown A switch _expre cada uma das case_expr podem ser valores numéricos ou de cadeias, de caracteres. Note que no maximo um bloco de cédigo pode ser exeeutada. Aps.a execucio de tum bloco de cédigo, a execugio salta para a primeira declaragio executivel depois da declaragio end. Assim, se a expressio switch casar com mais de uma expressio case, somente a primeira serd executada. Vamos analisar um exemplo simples de construgdo switch. As declaragSes abaixo determinam se um inteiro entre um e dez é par ou impar e imprimem uma men- sagem apropriada. Com isso, ilustramos © uso de uma lista de valores como seletores de casos, e também 0 uso do bloco otherwise. expr_case_3), otherwise, Declaracao 1 Declaragao 2 end) 104 | Pagano em MATAG par Engetere switeh (valor) case (1, 3, 5, 7, 9), disp(‘0 valor & impar.*) case (2, 4, 6, 8, 10), disp(’0 valor & par.'); otherwise, disp(‘0 valor é invélido.’) end 3.4.5 A Estrutura try/catch A construgo try/catch € uma construgio de ramificagio especial para capturar erros. Normalmente, quando um programa MATLAB encontra um erro durante a execucio, © programa aborta. A construcdo try/catch modifica esse comporta- mento-padrao. Se ocorrer um erro em uma declaragao no bloco try dessa construcio, ‘em vez de abortar o programa executard 0 cédigo dentro do bloco cat.ch e continuardé ‘aexecugao. Com isso, um programador pode manipular erros dentro do programa sem rovocar a parada do programa. ‘A forma geral de uma construgio try /catch é Declaracdo 2 } Blo ty Decterecte 2 } Bloc cach end Quando uma construgio try/catch for alcangada, as declaragbes no bloco try sero executadas. Se nao ocorrerem err0s, as declaragBes no bloco catch serao ignoradas e a execugio continuaré a partir da primeira declaracio depois da cons- ‘trugio. Por outro lado, se um erro ocorrer no bloco ty, 0 programa interromperd execusio das declaragdes naquele bloco e executaré de imediato as declarag3es no bloco catch, Um programa de exemplo que contém uma construgio try/catch € apresen- tado a seguir. Ele cria uma matriz e solicita que o usuério especifique um elemento da ‘matriz para ser exibido. O usuério fornece um muimero de indice e o programa exibe 0 elemento correspondente da matriz. As declaragées no bloco try serio sempre execu- tadas nesse programa, enquanto o bloco catch seré executado somente se ocorrer um erro no bloce try. etme Ravin se Capinie3 Sesstes ob Ramicaetoe Peto ae Pregame | 108 & Inicia a matriz as (1-3 251; try % — Tenta exibir um elemento index = input (‘Fornega 0 indice do elemento a ser exibido: *); disp( ('a(’ int2str(index) ‘) = ' numastr(a(index))] ); catch % Se chegarmos aqui, ocorreu um erro Aisp( (‘fndice ilegal: * int2str(index}} } end Ao executar esse programa, os resultados slo: — » try_cateh Fornega o indice do elemento a ser exibido: 3 aQ) =2 » try_catch Forneca 0 indice do elemento a ser exibido: 8 indice ilegal: 8 ste teste apresenta uma verificagdo répida da sua compreensio dos conceitos apresen- tados na Seco 3.4. Se vocé tiver problemas com o teste, releia as segies, pergunte ao seu professor ou discuta o material com um colega. As respostas podem ser encontradas no final do livro. Esereva declaragdes MATLAB para as fungées descritas a seguir, 1. Se x é maior que ou igual a zero, escreva o valor da raiz quadrada de x na va- ridvel sqrt_xe imprima o resultado. Caso contrério, imprima uma mensagem de erro sobre o argumento da funcio de raiz quadrada e coloque 0 valor zero em sqrt_x. 2. Uma variavel denominada fun 6 calculada como nunerador /denominador. Seo valor absoluto de denominador for menor que 1.0E-300, escreva “Erro de divisao por zero”. Caso contrério, calcule e imprima o valor de fun, 3. O custo por milha de um veiculo alugado é § 0,50 para as primeiras 100 milhas, $.0,30 para as 200 milhas seguintes e $ 0.20 para todas as milhas além das 300 primeiras. Escreva declaragdes MATLAB para determinar o custo total eo custo ‘médio por milha para um dado numero de milhas (armazenado em uma va- ridvel distancia). Examine as declaragbes MATLAB abaixo. Flas estio corretas ou incorretas? Se cestiverem incorretas, onde esté 0 erro? 4, 4£ volts > 125 isp(/WARNING: High voltage on line.‘); if volts < 105 Gisp(*WARNING: Low voltage on line.’ else disp(*Line voltage is within tolerances.”); end color = ‘yellow’; switch ( color ) case ‘red’; disp(’Stop now!"); case ‘yellow’, disp(*Prepare to stop.’) case “green’, disp("Proced through intersection."); otherwise, disp('Tilegal color encounterea.’ end 6. if temperature > 37 disp(‘Hunan body tomperature exceeded.'); elseif temperature > 100 disp("Boiling point of water exceeded."); end —_— 3.5 Caracteristicas Adicionais Esta secio descreve os recursos adicionais para os diagramas simples bidimensionais apresentados no Capitulo 2. Esses recursos nos pematem controlar os intervalos dos Valores de x e y apresentados no diagrama, colocat diagramas multiplos um sobre 0 ‘outro, criar miltiplas figuras, criar muiltiplos diagramas em uma figura e proporcionar ‘maior controle sobre lithas € textos no diagrama. Aprenderemos tambéin como erat diagramas polars. 3.5.1 Controlando os Limites nos Diagramas dos Eixos xe y © padrio é exibir os diagramas com eixos x e y de dimensdes suficientes para mostrar todos os pontos de um conjunto de dados de entrada Entretanto, por vezes € util exibit somente um subconjunto de dados que seja de inteesse particular, Iso pode set feito pelo comando/fangio axis (veja a Nota sobre a relagio entre comandos e fungBes MATLAB). Algumas formas do comando/fungio asi sio apresentadas na Tabela 35, As \tontname (tome da~ tonto} = especfica o nome da fonte 2 ser utiizada — # \fontsize(tananho da. fonte) ~especifica 0 tamanho da fonte. (000) ~0s caracteres dentro das chaves so em subscrito. G00) — 0s caracteres dentro das chaves s80 em sobrescrito. Uma ver 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. ‘Simbolos mateméticas e letras gregas podem também fazer parte de cadeias de texto, Eles sio criados pela insercio de sequéncias especiais na cadeia de texto. Essas seqiiéncias sao um subconjunto das seqiiéncias especiais com suporte pela linguagem ‘TX. Uma amostra dos cédigos possivels esté na Tabela 36 a seguir. O conjunto com- pleto de possibilidades est incluido na dacumentacio on-line do MATLAB. Se um dos caracteres especiais \,{ |, _ou, * precisar ser apresentado, ele deve ser pprecedido por uma barra invertida. (Os exemplosa seguir lustram o uso de modificadores de corrente ecaracteres especiais. Cadeia de caracteres Resultado \tau_(ind} versus \omega_{(\itm} “gs ETSUS Oy \theta varia de D\circ até 90\circ 8 variade 0” até 90" \beiB}_ its) By 3.5.7 Diagramas Polares © MATLAB tem uma fungao especial chamada polar, que desenha dados usando coordenadas polares. A forma basica dessa funcio é polar(theta,r) onde theta é uma matriz de angulos em radianos e x € uma matriz.de distancias. Isso 6.til para desenhar dados que si0 fungies intrinseces de-urr-angute-— > Exemplo 3.5 ~ Microfone Cardiside ‘A maioria dos microfones para uso em palcos de teatro ¢ direcional. So construidos ‘especificamente para ampliar os sinais recebidos do cantor posicionado a frente do microfone e suprimir o ruido da audiéncia que esté atrés. A148 | Pragamapio em MATUEB pre genes Tabela 3.6 Alguns Simbolos Matematicos e Letras Gregas Seqitncia de ‘Seqiénca de Seqléncla de Garacteres_Simbolo Cancieres—_Simbolo Caraceres—_Simbolo \alpha a Vint J beta s \eong \gamma y \Gamme r {sion - data 5 \Deta a \intty - \ epsilon . \pm 2 eta 1 Veg < \theta . sea > Mamda a Vtamda a ne . \mu ” propio « Ane ¥ \aw + ei * vw 1 ere . phi . Metuightarrow ho e Vefarow sigma . Sigma z \rightarrow \eau : \wparow 7 ome ® omega a \downarow © ganho de um microfone desse tipo é fungio do Angulo segundo a equacio Gano = 2g(1 + cos 9) @3) em que g 6 uma constante diferente para cada microfone e 8 0 angulo entre 0 eixo do microfone e a fonte sonora. Assumindo que g seja 0,5 para um dado microfone, desenhe um diagrama polar do ganho do microfone como fungio da diregio da fonte sonora Solugio Precisamos calcular o ganho do microfone versus 0 angulo e desenhar esse ganho uti- lizando um diagrama polar. O cédigo MATLAB para isso é: Script file: microphone.m Purpose: This program plots the gain pattern of a cardioid : . . ‘ % microphone . Crptula3 Exresses te Famiasdo0 Preto 6 Popara | 118 % Record of revision: & Date Progranmer Description of change a % 12/10/98 Ss. J. Chapman Original code . & Define variables: aig <= Microphone gain constant ® gain -+ Gain as a function of angle % theta -- Angle from microphone axis (radians) % calculate gain versus angle 9 = 0.5; theta = O:pi/20:2*piz— oe gain = 2*g*(1rcos (theta) ); 8 Plot gain polar (theta, gain, 'r-"); title (/\bfcain versus angle \theta’); (© diagrama resultante esté na Figura 3.7. Note que esse tipo de microfone ¢ chamado de cardidide, pois seu ganho apresenta a forma de um coracio. a ) . Exemplo 3.6 ~ Engenharia Elétrca: Resposta de Froqiéncia Um filtzo de passagem baixa simples* é apresentado na Figura 38. Esse circuito é com- posto por um resistor e um capacitor ligados em série, ea razo entre a voltagem de saida V, e a voltagem de entrada V, é dada pela equagio 1 V, T+ pm jRC um Fitro de Passagem Balxa Vv, 4) ‘onde V, uma votagem de entrada em senside com freqiéncafRéa resisténciaem ohms, C€a capacitancia em farads ej 6V1 (os engenheios eletricitasutlizam jem vez de para pois a letra tradicionalmente reservada para a corrente em um circuto) ‘Assuma que a resistencia R~ 16 kOe a capacitincia C= 1 HF, e desenhe a ampli tude e a resposta de freqiéncia desse filtro ‘Solugdo ‘A resposta de anipliade de um ito €arazio entre amplitude da voltagem de s a amplitude da voltagem de entrada, e a esposta de fase do filtro €adiferenga entre 2 fase da Vollagem de sada ea fase da vollagem de entrada. A forma mas simples de Caleular a amplitude ea resposta de fase do filtro €avaliar a Equag (2.4) para diversas * NIT Ese tipo de filtro &comumentechamado de flo peeadize plas proisionas da Sea 116 | Prganscso om MATLAB® par Expats Capea Sressns de Remiapfoe PretodePogare | ANT scala lineares: Utlizarémos um diagrama logllog para a resposta de amplitude e um. iagrama seni logx para a resposta de fase do filtro, Vamos apresentar as duas res- Postas como dois subdiagramas de uma mesma figura. (© cédigo MATLAB para criare desenhar as respostas¢ apresentado a seguir. q % Script file: plot_filter.m : : = 4 bate Progranmer - o Oe ==== e : { R = 16000; $16 k ohms Figura 3.7 Ganho de um microfone cardi. Create array of input frequencies £ = 1:2:1000; @ calculate response i res = 1./ (1+ j*2*piverntc ); eo ® Calculate amplitude response = amp = abs(res); i * Calculate phase response f phase = angle(res); Figura 3.8 Um cicuito simples para um filtro de passagem baixa, * create plote 6a resposta de amplitude do filtro, e 0 diagrama do angulo da Equagio (34) versus a xlabel (‘Frequency tae) freqiiéncia ¢ a resposta de fase do filtro. ylabel { ‘Output Como a frequéncia e a resposta de amplitude de um filtro podem variar bastante, grid ons 6 usual desenhar esses dois valores em escalas logaritmicas. Por outro lado, a fase varia sobre uma faixa bastante limitada, assim, costuma-se desenhar a fase do filtro usando subplot {2/274} 7 . loglog( £, amp}; freqiiéncias diferentes. O diagrama da magnitude da Equacio (34) versus a freqliéncia title (‘Amplitude Response"): put Ratio"); subplot {2,1,2); 118 | Poramacso am MATLAB par krgoneras semilogx( £, phase ); title(’Phase Response’); xlabel ("Frequency (#2)"): ylabel (‘Output-Input Phase (rad)‘); grid on; As respostas de amplitude e de fase resultantes esto na Figura 3.9. Note que esse cit- cuito recebe o nome de filtro de passagem baixa, pois as freqiiéncias baixas recebem pouca atenuagio, enquanto as freqiiéncias mais altas séo fortemente atenuadas. < 3 purpura _e 2" ‘oF oF o i Frewarey LA “a * 7 e 8 Prctncy 8) Figura 3.9 Respstas de amplitude ede fate do ccuitode filtro de passer bac. . Exemplo 3.7 ~ Termodinamica: Lei dos Gases Ideais Em um gfs ideal, todas as colisdes entre moléculas séo perfeitamente elisticas. Podemos considerar as moléculas de um gs ideal como bolas de bilhar perfeitamente rigidas que colidem e ricocheteiam sem perda de energia cinética. cen afk A | le2 Besse de Raise Prieto rogama | 119 Tin gi ideal pode ser caacierizado por tris quantidades: pessio absoluta (P) volume (V) ¢ temperatura absolut (1, relasio enre ess quantidades em um gés ideal 6 conhecida como Lei dos Gaces Ideas: Pv. RT @5) onde P € a pressio do gs em kilopascais (kPa), V 6 0 volume do gas em litros(L), n é0 niimero de moléculas do gés em unidades de mol (mol), R é a constante universal dos {gases (8,314 L*kPa/mol K)e T é a temperatura absoluta em kelvins (K). (Nota: 1 mol = 6,02 x 10°? moléculas.) CConsiderando que uma amostra de um gés ideal contém um mol de moléculas & temperatura de 273 K, responda as questdes seguintes. ar Como varia o Volume dese és 3 medida que a pressio varia de um para 1.000kPa? Desenhe a pressio versus o volume para esse gas, utilizando um con- junto apropriado de eixos. Utilize uma linha cheia vermelha com espessura de dois pixels. , Suponha que a temperatura do gis aumente para 373K. Nesse caso, como varia ‘© volume do gés com a pressio? Desenhe a pressdo versus 0 volume para esse ‘g4s, utilizando os mesmos eixos da parte (a). Utilize uma linha tracejada azul ‘com espessura de dois pixels. Inclua um titulo em negrito e legendas para os eixos xe y do diagrama, bem como legendas para cada linha. (3s valores que queremos desenhar variam por um fator 1.000. Um diagrama linear ordindrio desses no 6 adequado, desenharemos 0s dados em uma escalaloglog. "Note que precisamos desenhar duas curvas sobre © mesmo conjunto de eixos. Precisamos utilizar 0 comando hold on depois do desenho do primeiro diagrama, € hold of depois de completar 0 desenho. Precisamos também especifcar a cot 0 estilo ‘ea espessura de cada linha, eespecificar que os ritulos precisam estar em negrito, Um programa que calcula 0 volume do gs como fungio da presslo e cra 0 dia- sgrama apropriado € apresentado a seguir. Note que os recursos especiais que controlam © estilo do desenho esto apresentados em negro, % Script file: ideal_gas.m Purpose This program plots the pressure versus volume ideal gas. Date Programmer Description of change 07/17/00 S.-J. Chapman : : . 3 % Record of revisions: . . ® original code . 120 | Praranato om MATAR? para Expats & Define variables son == Number of atoms (mol) top Pressure (kPa) eR ideal gas constant (L kPa/mol X) sot Temperature (K) ev + volume (L) a Initialize oR? Rn & Moles of atons R= 8.314; & Ideal gas constant T= 273; % Temperature (K) create array of input pressures. Note that this changes in volume at low pressures. 0.1:1000; % calculate volumes ve (nt RAT) Create first plot figure (1) ; loglog( P, V, ‘r-', "binewiaen’, 2); title(*\bfVolume vs pressure in an ideal xlabel(*\bfPressure (kPa) ‘); ylabel(/\béVolume (1)") grid on: hold on; 4 Now increase temperature D+ 373; © Temperature (K) % Calculate volumes ve @tR*T ./ % Add second line to plot Figure(1) loglog( P, V, ‘b= hold off; +, “imewiatn’, 2): ‘t ada legend Legend(*T = 273 Kt, *T = 373 KY; ® % array must be quite dense to catch the major . Pe as’): (0 diagrama resultante de volume versus pressio est na Figura 3.10. | {amt nane \ A RATT a ule 3 Eres oe Riferioe Protec Progama | 124 ‘Volume ve Preeure nan teal Gas Pressure kPa) Figura 3.10 Pressio versus volume para um gés ideal 3.5.8 Anotando e Armazenando Diagramas ‘Tendo criado um diagrama pelo programa MATLAB, um usuario pode editar e anotar ‘ diagrama utilizando as ferramentas disponiveis na GUI da barra de ferramentas para diagramas, Na Figura 3.11 temas as ferramentas disponiveis, que permitem adicionar linas,flechas e textos. Quando o botio de Edigio ( I))€selecionado na barra de ferra- ‘mentas, as ferramentas de anotacio e edigio ficam disponiveis para uso. ‘Adicionalmente, quando 0 botio de EdicSo esta liberado, a selegio de qualquer linha ou texto na figura seleciona esse objeto para edigéo. Ao clicar duas vezes na linha ou no texto, surge uma jancla de propriedades que permite a modificagao de qualquer uma ou de todas as ceracteristicas do objeto” Figura 3:12 apreserta a Figura 3.10 apés «2 edigfo que modifica a linha azul para uma linha tracejada com espessura ce trés pixels € adiciona uma flecha e um comentétio. ‘Apés a edigio e a anotagio do desenho, vocé pode guardar 0 diagrama em um arquivo de forma modificével utilizando o item de menu “File/Save As” da Janela de Figuras. O arquivo de figura resultant (+ .£1g) cantém todas as informagies necessé- rias para recriara figura e as anotacées a qualquer momento no futuro, | i | LAI 120-1 rovenesconuara ia conve Figura 3.11 As ferramentas de edigio na barra de ferramentas de Figuras. Este teste apresenta uma verificacao répida do seu entendimento dos conceitos apre- sentados na Segio 3.5. Se voce tiver problemas com 0 teste, eleia as segs, perguuite a0 seu professor ou discuta o material com um colega. As respostas podem ser encontradas no final do livto. 1. Escreva as declaragdes MATLAB para desenhar o sin x versus cos 2x de 0a 2x em intervalos de x/10. Os pontos devem ser conectades por uma linha vermelha ‘com espessura de dois pixels, e cada ponto deve ser identificado com um mar- cador circular azul com seis pixels de didmetro. 2. Utilize as ferramentas de edigao de Figuras para modificar para quadrados pre- {0s 0s marcadores do desenho anterior. Acrescente uma flecha e uma anotacio indicando 0 ponto x = x no diagrama, Escreva a cadeia de texto do MATLAB que preduz as seguintes expressdes 3. f(a) = sin 8 cos 26 4. Plot of E22 versus x Capale 3 Exvesses te Ramicaptoe Preto Programs | 123 1 10 1 10 Pressure 08) ye: Vol = 30 Lat 100 4, Figura 3.12 A Figura 3.10 aps a modificacio da linha azul ea insergfo de uma anotagio uti- lizando as ferramentas de edigio presentes na barra de ferramentas de Figuras Escreva as expressées resultantes das seguintes cadeias de texto: 5. \tau\it_tad 6 ‘\DE\ie: LINC 2) eB 2) \emlunitss \bime(2) em) * 7. Como vocé exibe o caractere de barra invertida (\) em uma cadeia de texto? ee f 3.6 Notas Adicionais a Respeito da Depuragdo de Programas MATLAB E muito mais fécil cometer erros na preparagdo de um programa que contém ramifi cagoes e lagos que na preparacio de programas seqienciais. Mesmo passando por todo © processo de projeto, um programa de qualquer tamanho quase certamente conterd erros quando for utilizado pela primeira vez. Suporha que tenhamos construido o pro- {grama e descoberto, durante os testes, que os resultados contém erros. Como podemos encontrar e corrigir 0s bugs? 2A | Prramscso em MATAB® po Engunis Figura 3.13 Uma janela de Edigdo/Depuragio com um programa MATLAB carregado, ‘Quando comegamos a utilizar lagos e ramificaydes, a melhor maneira de localizar uum erro € pelo depurador simbélico do proprio MATLAB, Esse depurador ¢ integrado a0 editor MATLAB. ara utilizar © depurador, primeiro abra 0 arquivo a ser depurado, utilizando a selegdo de menu “File/Open” da Janela de Comandos MATLAB. Quando 0 arquivo é aberto, ele & colocado no editor ¢ a sintaxe & automaticamente codificada com cores. Comentirios aparecem em verde, varidveis e nuimeros aparecem em preto, cadcias de caracteres aparecem em vermelho e palavras reservadas da linguagem aparecem em azul. A Figura 3.13 exibe um exemplo de Janela de Edicio/Depuragdo com o arquivo cale_roots.m. Digamos que nosso interesse seja determinar o que acontece quando o programa 6 executado. Para isso, podemos criar um ou mais pontos de interrupgio, clicando com 0 botio direito do mouse e nas linhas de interesse e escolhendo a opcio “Set/Clear Breakpoint”. Quando um ponto de inverrupsao € criado, um ponto ver- metho aparece 4 esquerda da linha que contém 0 ponto de interrupslo, conforme exibido na Figura 3.14, ei an em) 14 9 a a rae Caniuled Serestes ee aratesioe Pte de Frans | 125 Figura 3.14 A janela apés a criagio de um ponto de interrupgio. Note o ponto vermelho & ‘esquerda da linha que contém 0 ponto de interrupgio. Depois de criado o ponto de interrupcio, exceute 0 programa da maneira usual, digitando calc_roots na Janela de Comandos. O programa iré executar até atingir 0 primeiro ponto de interrupcao e parar nele. Uma flecha verde aparecerd sobre a linha Corrente durante 0 processo de depuracio, conforme exbido na Figura 3.15. Assim que 6 ponto de interrupcao for atingido, o programador poderé examinar e/ ou modificar ‘qualquer variével no espaco de trabalho, dgitando o nome da variével na Janela de Comancdos. Quando 0 programadorestver satisfeito com o programa naquele porto, poderd seguir em frente linha por linha utilizando a tela F10, ou seguir até 0 préximo Ponto de inferrapgac ublizaids a eela FS. E sempre possvel examinar os valores de qualquer varidvel em qualquer ponte do programa Outra caracteristia muito importante do depurador esté no menu de Pontos de Interrupgio ("Breakpoints”), Esse menu tem dois itens: “Stop if Error” ¢ “Stop if Warning Se ocorrer em um programa um erzo que provoque a sua interrupsio ou gere mensagens de erro, 0 programador poderé ativar esses itens e executar 0 programa. O programa id exeeutar até o ponto do erro ou da mensagem de aviso e para, permitindo Figura 3.15 Uma flecha amarela aparecerd sobre a linha corrente durante 0 processo de depuracio. a0 programador examinar os valores das varidveis e verificar com exatido o que est causando o problema. ‘Quando um bug ¢ encontrado, o programador pode utilizar © Editor para corrigir © programa MATLAB e armazenar a versio modificada no disco, Note que todos os pontos de interrupgao podem ser perdidos quando o programa é armazenado no disco, por isso eles precisam ser criados novamente antes que a depuragio continue. Esse Drocesso se repete até o programa ficar (ao menos aparentemente) livre de bugs. ‘Ocupe um pouco de tempo agora para se familiarizar com 0 depurador ~ esse é tum investimento que vale muito a pena. 3.7_Resumo No Capitulo 3, apresentamos os tipos bésicos de ramificagies no MATLAB e as opera ‘Ges relacionais e I6gicas utilizadas para controlé-los. O tipo principal de ramificacio é a construgao if, Essa construgao é muito flexivel. Fla pode ter tantas cldusulas eleei £ quanto necessério para construir qualquer teste desejado. Além disso, as construgbes i £ fal dg lo Se i ifsc Capinia3 Sessies ae Raina e Pte de Progama | 127 ~ podem ser aninhadas para produzir testes mais complexos. Um segundo tipo de rami- ficagio € a construgio switch. Ela pode ser usada para selecionar altemativas mu- tuamente exclusivas especificadas por uma expresso de controle. Um terceiro tipo de ramificagio 6 a construgio txy/catch, usada para capturar erros que possam ocorrer durante a execucio. Neste capitulo, tivemos também informagies adicionais sobre diagramas. O co- mando axis permite que 0 programador selecione intervalos de dados x e y para desenhar. O comando old permite que desenhos posteriores sejam colocados sobre os anteriores de tal forma que os elementos possam ser adicionados a um grafico paulati- namente, © comando figure permite que 0 programador crie e selecione mltiplas Janelas de Figuras, para que um programa possa criar diagramas miltiplos em janelas separadas, O comando subplot permite que o programador criee selecione mltiplos _desenhos em uma tinica Janela de Figuras.— ‘Aprendemos também a controlar caracteristicas adicionais de nossos desenhos, como espessuras de linha e cores dos marcadores. Essas propriedades podem ser con- troladas com pares ‘ PropertyNane’ , valor no comando de desenho apés produzir tum diagrama com dados. Cadeias de texto em diagramas podem ser melhoradas por modificadores de cor rente e seqiiéncias de caracteres. Modificadores de corrente permitem que um progra- mador especifique propriedades como negrito, itilico,sobrescrito, subscrito,tamanho e tipo de fonte, Seqiiéncias de caracteres permite que o programador inclua caracteres especiais como simbolos mateméticos e letras gregas na cadeia de texto (© depuradorsimbslico do MATLAB facilita muito a depuracio de cédigo no MATLAB. Vocé deve investir um pouco de tempo para se familiarizar com essa ferramenta. 3.7.1 Resumo de Boas Priticas de Propramagéo ‘As préximas orientagSes devem ser seguidas em programagSes que contenham cons- trugdes de ramificacio e de lagos. Seguindo-as consistentemente, seu cdigo deverd conter menos bugs, ficar mais fil de depurare se tornar mais féil de entender para terceiros que precisarem trabalhar com ele no futuro. 1. Seja cuidadoso nos testes de igualdade com valores numéricos, pois os erros de arredondamento podem levar duas varidveis que deveriam ser iguais a falhar no teste de igualdade. Em vez disco, teste se as varidveis sio quase iguais, con- siderando um erro de arredondamento esperado para o computador que voce utilizar 2. Siga os passos do processo de projetar programas para construir programas MATLAB confidveis eféceis de entender 3. Sempre use tabulagio nos blocos de addigo das construgbes if e switch, para que eles se tornem mais legiveis. 3.7.2 Resumo do MATLAB O resume a seguir lista todos os comandos e fungbes do MATLAB apresentados neste capitulo, junto com uma breve descrigéo de cada item. 128 | Prpanayso am muag® para Engen: ‘Comandos e Funsées axis () Ajusta os limites em x e y para os dados desenhados. (#)Captura os limites em x e y dos dados desenhados. (€) Ajusta outras propriedades dos eixos. figure Seleciona uma Janela de Figuras para ser a Janela de Figuras corrente. Sea Janela de Figuras selecionada no cexistir, ela serd automaticamente criada. hola Permite que comandes multiplos de desenho escrevam. uns sobre os outros. Lf construct Seleciona um bloco de declaragSes para executar se uma ‘condigdo especificada for satsteita, ischar ia) Devolve 1 se a for uma matriz de caracteres, ¢ 0, caso contratio, isempty(a) Devolve 1 se a for uma matriz vazia, €0, caso contrério. ising (a) Devolve 1 se o valor de a for infinito (Inf), e 0, caso contrério. isnan(a) Devolve 1 se 0 valor de a for NaN (ndo um niémero), € 0, caso contririo, Devolve I se a for umamatriz numérica, e0, caso contrério. polar ria um diagrama polar Seleciona um subdiagrama na Janela de Figuras corrente. Se o subdiagrama selecionado nao existt, ele € auto- ‘maticamente criado, Se o novo subdiagrama entrar em conflito com um sistema de eixos previamente exis- tente, eles sio apagados automaticamente, Seleciona um bloco de declaragSes para executar, a partir de um conjunto de opgées mutuamente exclusivas & com base nos resulados de uma expressio tinica, exy/eacch construct Uma construgéo especial utilizada para capturar erros. Ela executa 0 cédigo no bloco ery. Se ocorrer um erro, a execugdo ¢ imediaramente interrompida e transferida para o cédigo na construcio catch, isnumeric(a) subplot switch construct 3.8 Exercicios 3.1 A fungio tangente é definida como tan 9 = sin 0 / cos @. Essa expresso pode ser avaliada para obter a tangente se a magnitude de cos @ nio se aproximar demais de 0. (Se o cos @ for a avaliagao da equagao para tan @ produziré 0 valor no numérico Inf.) Assuma que @ seja dado em graus e escreva as declaragées MATLAB para avaliar a tan 0, desde que a magnitude de cos @ seja maior que ou igual a 10!.Se a magnitude de cos @ for menor que 10%, escreva uma mensagem de erro. 3 Bresso Famticasdee Prato ae ogame | 129 3.2 As declaragGes a seguir devem alertar um usudrio sobre leituras de um ter mémetro perigosamente altas (0s valores esto expressos em graus Fahrenheit). Elas estio corretas ou incorretas? Se estiverem incorretas, explique 0 erro e as corr. if temp < 97.5 disp(‘Teaperatura mu elseif temp > 97.5 disp(‘Tenperatura normal’); elseif temp > 99.5 disp (‘Tenperatu elseif temp > 103.0 ——-disp( ‘temperatura perigosamente alta’}+ end baixa’); Ligeiramente alta’); 3.3 O custo de enviar um pacote por correio expresso & de $ 10,00 para o primeiro quilo e $ 3,75 para cada meio quilo ou fragio acima de um quilo. Se 0 pacote ppesar mais que 35 quilos, uma taxa de peso adicional de § 10,00 € adicionada 20 custo. Nenhum pacote com mais de 50 quilos 6 aceito. Escreva um progra- ‘ma que aceite o peso de um pacote em quilos e calcule o custo de enviar © pacote, Inclua o caso dos pacotes acima do peso. 3.4 No Exemplo 33, escrevemos um programa para avaliar a funcio fy) para quaisquer dois valores especificados pelo usudrio para x e y, com a fun¢io {flayy) definida como segue. x+y x200y20 x+y x200y<0 Mty x<0ey20 x+y xcdey<0 © problema foi resolvido com uma tinica construgdo if de quatro blocos de ‘digo para calcular f(x,y) para todas as combinagies possiveis de xe y. Rees- creva 0 programa funxy utilizando construgies if aninhadas, de maneira que a construcio mais externa avalie o valor de x e a mais interna avalie 0 valor de y. fey)- 3.5. Escreva um programa MATLAB para avaliar a fungio 1 yee in ppara qualquer valor de x especificado pelo usudrio, sendo x um mimero <1 (observe que In & 0 logaritmo natural, ou sea, 0 logaritmo na base e). Utilize luma estrutura if para verficar se 0 valor passado para o programa ¢ legal Seo valor de x for legal, caleule y(x). Caso contréro, escreva uma mensagem de erro apropriada e encerve o programa 3.6 Escreva um programa que permita que um usudrio forneca uma cadeia de caracteres que contenha um dia da semana (“segunda-feira’,“terga-eira” etc.) e utilize uma construgdo switch para converter o dia em um niimero corres ppondente, de maneira que 0 domingo seja considerado o primeiro dia da semana 130 | Pooramagioem MATA9® para Enurlos 37 38 39 3.10 € 0 sébado seja considerado o ultimo dia da semana. Imprima o miimero de dia resultante. Lembre-se de considerar caso de um nome ilegal de dia da ‘semana! (Nota: no se esqueca de utilizar a opgio ‘s’ na fungio input para ‘que 0s dads de entrada sejam considerados cadeias de caracteres.) Lei dos Gases Ideais. A Lei dos Gases Ideas foi deinida no Exemplo 37. Assuma que o volume de I mol dessegés sja 10 Le desenhe a pressio do pis ‘como fungio da temperatura quando a temperatura varia de 250 a 400 kelvins ‘Que tipo de desenho (linear, semilogx et.) €0 mais apropriado para esses dads? Padrio de Ganho de Antena. O ganho G de uma certa antena de microondas pode ser expresso como funcéo do angulo pela equagio G(@)=Isine4e | for ses % 2 ‘onde @ émedido em radianos a partir das bordas da antena e sinex= sin x/x. Desenhe essa fungio de ganho em um diagrama polar, com o titulo “Ganho da Antena versus 0 ” em negrito. @6) Refragio. Quando um rai de luz passa de uma regio com indice de refragio 1m para uma regido com indice de refracio diferente ny ele & desviado (ver Figura 3.16), O angulo de desvio é dado pela lei de Snel nm sin 6, =m in 6p en onde 6 0 ingulo de incidéncia da luz na primeira regio © 4 60 Angulo de incidéncia da luz na segunda rego. Uslizndo a lei de Snel, possvel pr ver o Angulo de incidéncia de tm raio de luz na Regiao 2 se 0 angulo de incidéncia@ na Regizo I eos indices de refragiom,e forem conhecidos. A equagio para efetuar esses cilculos & ) @8) Escreva um programa para calcular o angulo de incidéncia (em graus) de um. raio de luz na Regido 2, dados o Angulo de incidéncia 6, na Regido 1 e os Indices de refragSo 1, © n. (Nota: se m, > my ento, para alguns Angulos @,, a Equagio 3.8 ndo terd solugdes reais, pois o valor absoluto da quantidade ( sino) serd maior que 1.0. Quando isso ocorrer, toda a luz seré refletida de volta para a Regio 1 ¢ nenhuma luz passaré para a Regi3o 2. Seu pro- sgrama deve ser capaz de reconhecer trata: apropriadamente essa condigéo.) (O programa deve também criar um diagrama que mostre o raio incidente, a fronteira entre as duas regides e o raio refratado do outro lado da fronteira ‘Teste seu programa com os dois seguintes casos: (a) my = 1,0, 1p = 1,7 € 8 = 45%; @)my= 17, m= 1,00 0 = 48°, ‘Assuma que a fungo complexa f(t) seja definida pela equagio J) = 05-025) 10 Desenhe a amplitude e a fase para a fungio f com 0S F< 4 i fi Cape presses de Rliarfoe Preto de Programe | 181 Regito 1 s! Indie de rtagao m, 020, © Figura 3.16 Um raio delux é desviado quando passa de um melo para outro, (a) Seo raio de luz an passa de uma regiio com indice de refracio mais baixo para uma regiso com indice derefragéo mais alto,o raio de luz se desvia para a vertical. (8) Se o rato de luz passa ‘de uma regio com indice de refrago alto para uma regio com indice de relracio mais baixo, 0 raio de luz se desvia para a horizontal Fillro de Passagem Alta. Na Figura 3.17, temos um filtro simples de passa- gem alta, composto por um resistor e um capacitor. A razio entre a voltage, de saida V, ea voltagem de entrada V, é dada pela equacio Vo _ _ fee fRC V1 jae ARC 4) Assuma que R= 16kQe C= 1 UF. Calcule e desenhe as respostas de ampli- tude e de fase desse filtro como fungio da freqiiéncia. 182 | Propanagsoom MATAB® para Eunos Figura 3.17 Um dircuito de filtro de passagem alta simples 3.2 A Espiral de Arquimedes. A espiral de Arquimedes é uma curva descrita em coordenadas polares pela equacio r=ko @.10) onde r a distincia de um ponto a origem e @ € 0 angulo desse ponto em radianos com relaglo & origem. Desenhe a espiral de Arquimedes para 0 =< 6 S6r, com k= 0,5. Coloque legendas apropriadas no desenho. 3.13 Poténcia de Safda de um Motor. A poténcia de saida produzida por um motor rotativo é dada pela equagao Paty. Om en) onde trip €0 torque induzido no eixo, em Newton-metros, a, € 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 equacio @, = 188,5(1 92) rad/s €.0 torque induzido no eixo seja dado por ‘yo = We?! Nm, Desenhe o torque, a velocidade e a pottncia fornecida versus o tempo para 055 10s. Coloque as legendas apropriadas com os simbolos typ € @y. Crie dois desenhos, um com a poténcia em escala linear e outro com a poténcia de saida em escala logaritmica. © tempo deve ser apresentado sempre em. scala linear. 3.14 Desenho de Orbitas. Quando um satélite gira em torno da Terra, a drbita do satéite forma uma elipse com a Terra em um dos pontos focais. A érbita do satélite pode ser expressa, em coordenadas polares, como re? 8.12) Tees 8 aes ie Captle3 Exgassies Ramis e Peto se Parra | 133 onde re @ sao a distancia e 0 Angulo do satélite medidos a partir do centro da ‘Terra, p 6 um pardmetro que especifica o tamanho da érbita e € é€ um para- metro que representa a excentricidade da drbita, Uma érbita circular tem excentricidade e igual a 0. Uma érbita eliptica tem excentricidade 0 < € < 1 Se € > 1, 0 satélite segue uma trajetéria hiperbilica e escapa do campo gra- vitacional da Terra. Considere um satélite com parametro de tamanho p = 1.000 km. Desenhe a Grbita desse satdlite se (2) €= 0; (6) €= 0,25; (c)€= 05. Quio préximo cada uma dessas rbitas chega da Terra? Compare os trés desenhos que voc® criou. oct ¢ capaz de determinar qual significado do parimetop,observando aaa aR le coe Capitulo 4 Lagos Lagos sio construgdes MATLAB que nos permitem executar uma seqiiéncia de decla- rages mais de uma vez. Existem duas formas bésicas de construgio de lagos: lagos while e lagos for. A principal diferenca entre esses dois tipos de lago é como a repe- tigdo 6 controlada. O oSdigo em um lago whi le é repetido uma quantidade indefinida de vezes até que alguma condicio especificada pelo usudrio seja satisfeita, Em con- taste, o cédigo em um lago Ear é repetido uma quantidade determinada de vezes, ¢ 0 iiimero de repeticées & conhecido antes do inicio do ago 1 O Lago while Um lago white ¢ um bloco de declaragées que se repete indefinidamente, enguanto ‘uma condigdo for satisfeita. A forma geral de um lago whi le & while expresso | soci end Se a expresso for diferente de zero (verdadeira), 0 bloco de cédigo sera executado & © controle retomard para a declaragio while. Se a expressio ainda for diferente de 270 (verdadeira), as declaragSes serdo executadas novamente. Esse processo se repe- tird até que a expressio se tome zero (falsa). Quando 0 controle retornar para a decla- ragdo while e a expressio for zero, 0 programa executaré a primeira declaragdo depois de end. 136 | Progamacic em MATAB® pee Engels O pseudocédigo correspondente a um lago while é while expr end ‘Vamos agora mostrar um exemplo de programa para anélise estatistica imple- ‘mentado copn tum lago whi Le. > re Exemplo 4.1 ~ Anilise Estatistica E muito comum, em ciéncia ¢ engenharis, trabalharmos com grandes conjuntos de ruimeros, 0s quas s4o medidas de alguma propriedade em particular na qual estamos interessados. Um exemplo simples seriam as natas da primeira prova deste curso. Cada nota seria uma medida de quanto um estudante em particular aprendeu no curso até 0 momento. 'Na maior pate do tempo, ndo estamos interessados em observar tio de perto cada uuma das medidas efetuadas, Em ver disso, queremos sumarizar os resultados de um conjunto de medidas por meio de uns poucos nsimeros que nos indiquem bastante a respeito do conjunto de dados como um todo. Dois desses nimeros sio a media (ou mnétiaartmética) desvi-padrio de wm conjunto de medidas. Amédia aitmética de um Conjunto de rsimeros € definida como geld Pl (aay onde x, 6 a amostra ide N amostras. Se todos os valores de entrada forem apresentados em uma matriz, a média de um conjunto de ntimeros poderd ser calculada diretamente a partir da Equacio (4.1) ou pela funcio mean predefinida no MATLAB. ( desvio-padrao de um conjunto de mimeros é definido como (4 a NOW=1) vee O desvio-padtrio é uma medida do espathamento das medidas; quanto maior o desvio- ppadrao, mais espalhados serio os pontos no conjunto de dados, Se todos os valores de entrada estiverem disponiveis em uma matrz, o desvio-padréo de um conjunto de niimems poderd ser calculado diretamente a partir da EquagSo (4.2), ou utilizando a fungio sta, predefinida no MATLAB. Para este exemplo, vamos calcular a média ¢ 0 desvio-padrio diretamente a partir das equagSes (4.1) e (4.2), em vex de utilizar as fungdes predefinidas. Implemente um algoritmo que leia um conjunto de medidas e calcule a média e 0 esvio-padrdo do conjunto de dados de entrada, =r = mae mie apties tgos | 137 Solugéo Esse programa precisa ser capaz de ler um niimero arbitrério de medidas, e entdo cal- cular a média e 0 desvio-padrao dessas medidas. Vamos utilizar um lago 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- mar 0 programa que nao hé mais dados a serem fornecidos, Por enquanto, vamos assumir que todas as medidas de entrada sio positivas ou zero, e utilizar um valor ‘negativo como indicador de que néo hi mais dados a serem fomecidos. Se um valor nega- tivo for fornecido, o programa interromperd a leitura dos valores de entrada e calcu lard a média e 0 desvio-padrao do conjunto de dados. Estabelesa o problema — Como vamos assumir que os mtimeros de entrada precisam set positivos ou zero, uma apresentagao apropriada do problema seria: calculea media e desvio- pairio de um conjunto de medidas, assumindo que todas as medidas sdo positions ou zero € que ndo sabemos quantas medidas esto incluidas no conjunto de dados. Ur valor negativo indica o final do conjunto de medidas. 2. Defina os dados de entrada e de saida Os dados de entrada requeridos por esse programa sio um ntimero desconhe- ido de mimeros positivos ou iguais a zero. Os dados de safda desse programa so a média e o desvio-padrao do conjunto de dados de entrada. Adicio- rnalmente, exibiremos o nimero de pontos fornecides ao programa, uma ve que essa é uma verificagao util da correcio dos dados de entrada. 3. Projete 0 algoritmo Esse programa pode ser subdividido em trés passos principais. Acumule 0s dados de entrada Calcule a média e 0 desvio-padrao Escreva a média, o desvio-padrao e 0 minero de pontos O primeiro passo do programa é acumular os dados de entrada. Para isso, temos de solicitar a0 usudrio os niimeros. Quando os niimeros forem forne- cidos, precisaremos registrar o ntimero de valores fornecidos, a soma e a soma dos quadrados desses valores. O pseudocédigo para esses passos é Inicio n, solic: sum_x @ sumx2 com valor 0 a0 usudrio o primeiro nimero Leia o primeiro x while x >= 0 nened sum_x2 © sumx2 + x°2 Sclicite ao usudrio 0 pré Leia © préximo ninero end Note que precisamos lero primeiro valor antes do lago while iniciar, para que esse lago tenha um valor a ser testado durante a primeira execugio, |. Prgramagto em MATLAB pra genres Depois, precisamos calcular a média e o desvio-padréo, © pseudocsdigo para esse passo so as verses MATLAB para as equagdes (4.1) ¢ (4.2). xbar © sumx Jn stddey © sqrt ((n*sumx2 - sumxe2) / (n*(n-1))) Por fim, precisamos eserever os resultados. Zscreva 0 valor da média x_bar Escreva 0 valor do desvio-padrao std_dev Escreva © numero de dados de entrada n 4. Transforme o algoritmo em declaragies MATLAB O programa MATLAB é apresentado a seguir: % Script file: state_t.m . % Purpose: @ To calculate mean and the standard deviation of an input data set containing an arbitrary number % of input values. 8 % Record of revisions: * date Programmer Description of change e % 12/05/98 S.J. Chapman Original code : 8 Define variables: son ‘The number of input samples & std_dev -- The standard deviation of the input samples & sumx ‘The sum of the input values % sumx2 -- The sum of the squares of the input values ex An input data value % xbar ~~ The average of the input samples % initialize suns. 0; sumx = 0; sumx2 = 0. $ Read in first value xX = input(‘Enter first value X Wnile loop to read input values. while x >= 0 % Accumulate ume: eum_x2 = eum x2 + x12; % Read in next value x = input (‘Enter next valu end "ys Captate 4 tagoe | 198 % Calculate the mean and standard deviation xbar = sumx / n; stddev = sqrt( (mn * sumx2 - sumx'2) / in * (nl)} J; % Tell user. {printf ('The mean of this data set is: $f\n', x bar); fprint£(*The standard deviation i Sé\n", std_dev); fprintf (The number of data points is: tf\n', n); 5. Teste o programa Para testar esse programa, vamos calcular & mio as respostas para um conjunto simples de dados, e entdo comparar as respostas com os resultados do pro- _Brama, Se utilizarmos os valores de entrada 3, 4¢ 5, a médiae odesvio-padréo. ‘Quando fornecermos esses valores a0 programa, teremos estes resultados: » state 1 Enter first value: 3 Enter next value: 4 Enter next value: 5 ber next value: 1 The mean of this data set is: 4.000000 The standard deviation is: 1.000000 The nunber of data points is: 3.000000 © programa fornece as respostas corretas para nosso conjunto de dados de teste. ee Nesse exemplo, no conseguimos seguir 0 processo de projeto completamente. Isso deixou o programa com uma falha fatal! Vooé a identificou? A falha est em nia haver testado a programa completamente com todos os tipos posstocis de entrada, Observe novamente o exemplo, Se nao fornecermos nenhum niimero Ou entdo somente um niimero, estaremos dividindo por zero nas equacées acima! Oerro de ivisio por zero provocard avisos de divisio por 2er0, e 08 valores de sada serio NaN. Precisamos modificar 0 programa para detectar esse problema, informar ao usuario qual é 0 problema e encerrar apropriadamente, ‘Uma versio modificada do programa - stats_2 -é apresentada a seguir. Nessa versio, verificamos se temos dados de entrada em quantidade suficiente antes de efetuar 140 | Praamacso om mMArLA8® gare Enters 0s cfleulos, Se ndo tivermos, 0 programa apresenta uma mensagem de erro intligente © encerra 0 processamento. Teste o programa modificado. % Script file: stats_2.m Purpose: To calculate mean and the standard deviation of an input data set containing en arbitrary number of input values. Record of revisions: Date Programmer Description of change 12/05/98 s. 1. 12/06/98 s. J. Chapman 3. Chapman original code Correct divide-by-0 error if 0 or 1 input values given. Define variables a ‘The nunber of input samples stddev -- The standard deviation of the input samples sum ‘The sun of the input values sum_x2 ne sum of the squares of the input values x An input data value xbar ‘The average of the input samples Initialize sums = 0; sumx = 07 aumx2 = 0: Read in first value = input (‘Enter first value: ® ® ' * : ® ® . e a a 2 ‘ a . ® ® . 2 8 . + ® While loop to read input w: a 8 Accumulate suns while x A ned; SUM_X2 = sum xX? + ¥*2; & Read in next value x = input (‘Enter next value: ‘); end % Check to see if we have enough input data. ifn < 2% Insufficient information ALep(/At 104 it 2 values must be entered!’); eu % There is enough information, so % calculate the mean and standard deviation xbar = cumx / ni; tddev = sqrt( (n * sumx2 sumxr2) / (n * (n-L)) 5 (aptalod Lagos | 141 % Tell user fprinté ("The mean of this data set is: $£\n’, bar); fprintf (‘The standard deviation is: $f\n’, std_dev); fprintf(*The number of data points is: $f\a", n); end Observe que a média e 0 desvio-padrio poderiam ter sido calculados com as fungdes predefinidas do MATLAB mean e etd se os valores de entrada fossem armazenados em um vetor e esse vetor fosse passado para as funcBes. Em wm exercicio no final deste capitulo, voct serd solicitado a criar uma versio do programa que utilize as fungdes MATLAB-padrai 42 O Lago for Olago fox executa um bloco de declaragSes durante um ntimero especificado de vezes. Ele tem a forma for indice = expr Beclaracao 1 oe Corpo Declaracao end onde indice é a variével do lago (também conhecida como fndice do lago) e expr éa expresso de controle do laco. As colunas em expr so armazenadas uma por vez na varidvel indice e o corpo do lago 6 executado. Por essa razio, 0 lago & executado uma vez para cada coluna em expr. A expressio em geral adota a forma de um vetor em notagio abreviada primeiro: incremento:i1t ino. ‘As declaragées entre a declaragao for e a declaragio end so conhecidas como o corpo do lago, Elas so executadas repetidamente durante cada passagem do lago for. ‘Aconstrugao de lago for funciona conforme descrito a seguir. 1. No inicio do lago, 0 MATLAB gera a expressio de controle 2. Na primeira passagem pelo laco, 0 programa associa a primeira coluna da expressio a variavel de lago {ndice, e o programa executa as declaragbes no corpo do lago. 3. Ap6s a execugio das declaragdes no corpo de lago, 0 programa associa a préxi- ma coluna da expresso a variavel de lago indice, e o programa executa as declaragdes no corpo do lago novamente. 4. O passo3 € repetido enquanto houver colunas adicionais na varidvel de controle ‘Vamos analisa alguns exemplos espeiRos para eSlarecer MeThOF a OperaGho do lago for. Primeizamente, vamos considerar 0 seguinte exemplo for ii = 1:10 Declaragae 1 Declaracdo n end 142 | Pagamscis am MATLAB para Egos Nesse caso, a expressio de controle gera uma matriz 1 x 10, por isso as declaragdes de 1 an serio executadas dez. vezes. O indice de lago ii serd 1 na primeira vez, 2 na segunda, e assim por diante. O indice de lago sera 10 na tiltima passagem pelas decla- ragbes. Quando o controle é devolvido para a declaragio for depois da décima pas- sagem, nio hé mais colunas na expresso de controle; a execucio é transferida para a primeira declaracio depois da declaracio end. Note que o indice do lago i permanece com 0 valor 10 apés 0 término da execugao do lago. Segundo, considere o exemplo a seguir. Nesse caso, a expressio de controle gera uma matriz 1 x 5, por isso as declaragées de 1 an serio executadas cinco vezes, O indice de lago ii serd 1 na primeira vez, 3 na segunda, eassim por diante. O indice de lago sera 9 durante a quinta etiltima passagem pelas declaragées. Quando o controle € devolvido para a declaracio for depois da quinta passagem, nao hé mais colunas na expressao de controle; a execugio é transfe- rida para a primeira declaracio aps a declaragio end. Note que 0 indice do lago ii [permanece com o valor 9 apés o término da execugio do lago. Terceiro, considere o exemplo abaixo, for ii = (59 7) Declaracao 2 Declaracao n end ‘Aqui, a expressdo de controle é uma matriz 1 » 3 explicitamente apresentada, por isso as declaragées de 1 a n sero executadas trés vezes, com o indice do lago valendo 5 na primeira vez, 9 na segunda ve2 e 7 na tiltima, A varidvel de indice ii permanece com ‘valor 7 depois que 0 lago termina sua execusao. Por siltimo, considere este exemple: for ii = [1 2 374 5 6) Declaragao 1 Declaracto n Nesse caso, a expressio de controle € uma matriz 2 x 3, por isso as declaragdes de 1 an serio executadas trés vezes. O indice do lago ii receberé 0 vetor-coluna ih na primeira ver, [2] na segunda e[3] na tercera, Esse exemplo ilustrao fio de que lum indice de lago pode ser um vetor. [04m poe -A-fungae fatorial ¢ definida como —— Ned emt te ania soe apts 4 isos | 143 ‘© pseudocédigo correspondente a um lago for se assemelha ao préprio lago, for indice = expressao Declaragao 1 Declaracao n end > Exemplo 4.2 ~ A Fungo Fatorial Para ilustrar a operagio de um lago for, varios utilizar um laco desses para calcular a 0 a ze NEew+ (ed) tana) * 438264 (O cédigo MATLAB no céleulo de N fatorial para valores positives de N seré nfactorial = 1 for ii = lin nfactorial = n_factorial * ii; end Suponha que queremos calcular o valor de 5! Se n vale 5, a expressio de controle do lag for sero vetorlinha [1 2 3 4 5]. Fsse laco seré executado cinco vezes, com a vari vel 44 assumindo os valores 1, 2,3, 4¢ 5 nas passagens sucessivas. O valor resultante de n_factorial seré1x2%3x4%5= 120, < es Eremplo 43 ~Calelandoo Dia do Ano Oia do ano ¢ mimero de dias (incuindo o dia presente) desde o inicio de determi- nado ano Fle vara de 1 a 365 para anos ordinate de 1 a 366 para anos bissetos Ercreva um programa MATLAB que aceite wn da, méseanoecalculeo dia do ano cor respordentea ess data Solugéo Para determinar o dia do ano, esse programa precisa somar o niimema de dias em cada ‘més anterior ao més corrente, mais o mimero de dias passados no més corrente. Um lago for serd utilizado para efetuar essa soma. Como o ntimero de dias varia para cada més, € preciso determinar o niimero correto de dias a serem adicionados em decorrén- Gia de cada més. Uma construgio switch seré ulizada para determinar o nimero apropriado de dias a serem adicionados em decorréncia de cada més. ‘Durante um ano bissexto, um dia a mais precisa ser adicionado ao dia do ano para qualquer més corrente depois de fevereiro. Esse dia a mais contabiliza 0 dia 29 de 144 | Pogamagio am MATLAB ra Egos fevereiro do ano bissexto. Portanto, para calcular corretamente o célculo do dia do ano, precisamos determinar quais anos séo anos bissextos. Segundo o calendatio gregoriano, (8 anos bissextos sio determinados pelas seguintes tegras a 1. Anos divisiveis por 400 sio bissextos. 2. Anos divisiveis por 100 mas ndo por 400 nac so bissextos. + 3. Anos divisive por d mas ndo pot 100 sdo bisextos i 4. Nenhum outro ano é bissexto a Utiizaremos a fungéo soa (de méilo) para determinar se um ano € divisivel por onto, Seo restltado de nod for Zero, ano sera civve, ? ‘Um programa para calcularo dia do ano € apreentado a seguir. Note queo pros = jgrama soma o niimero de dias de cada més até o més corrente, e que ele utiliza uma construggo switch para determinar o mtimero de dias em cada més, & Script file: doy.m Purpose: ‘This program calculates the day of ye to a specified dat for constructs. corresponding Tt illustrates the use switch and ot a aia Record of revisions: Date Programmer Description of change original code “4 J. Chapman aay day_of_year as Loop index Day (4a) Day of year month year - Month (mm) year (yyy) % Get day, month, and year to convert disp(’This program calculates the day of year given the’); disp(‘current date.’}; month = input (‘Enter current month (1-12): '); day = input (‘Enter current day(1-31);"); year = input(‘Enter current year(yyyyi: ’); $ Check for leap year, and add extra day if necessary if mod(year,400) == 0 leap day = 1; elseif mod(year,100) =. 0 leap_day = 0 elseif mod (year, 4) leap_day = 1 leap_day end % Years divisible by 400 are leap years 8 Other centuries are not leap years & Otherwise every 4th year is a Leap year 0 & other years are not leap years Intrinsic» Caputo pos | 145; % calculate day of year by adding current day to the days in previous months day_of_year = for if = Limon: % Add days in monthe from January te last month switch (ii) case {1,3,5,7,8,10,12), day_of_year = day_of_year + 31; case (4,6,9,11), day_of year = case 2, — day_of_year ~ day_of_year + 28 + leap day; end day_ot_year + 30; end @ Tell user. Eprint£ ("The date $24/824/%4a is day of year td.\n', month, day, year, day_of_year); Utilizaremos os seguintes resultados conhecidos para testar o programa: 1. © ano 1999 nao é bissexto; 1* de janeiro precisa ser 0 dia do ano 1 31 de dezembro precisa ser 0 dia do ano 365. 2. O.ano 2000 ¢ bissexto; I* de janeiro precisa sero dia do ano 131 de dezembro precisa ser 0 dia do ano 366. 3. © ano 2001 nao é bissexto; 1° de margo precisa ser 0 dia do ano 60, pois janeiro tem 31 dias, fevereiro tem 28 dias e 1" de margo é 0 dia corrente. Se esse programa for executado cinco vezes com as datas fornecidas, os resultados » doy This program calculates the day of year given the current date. Enter current month (1-12): 2 Enter current day(1-31) 1 Enter current year(yyyy): 1999 The date 1/1/1999 is day of year 1. » doy ‘This program calculates the day of year given the current date ee (1-12): 42 Bnter current day(1-31): 32 Bnter current year(yyyy): 1999 The date 12/31/1999 is day of year 365 fer current month 146 | Pagano em MATLAB par Epes » doy ‘This program cé current date. culates the day of year given the Enter current month (1-12): 2 Enter current day(i-31): 1 Enter current year(yyyy): 2000 ‘The date 1/1/2000 is day of year 1. » doy ‘This program calculates the day of year given the current date Enter current month (1-12): 12 Enter current day(1-31): 32 Enter current year (yyy: 2000 ‘The date 12/31/2000 is day of year 366. > doy ‘This program calculates the day of year given the current date. Enter current month (1-12): Enter current day(1-31): 1 Enter current year(yyyy): 2002 ‘The date 3/1/2001 is day of year 6) programa fornece as respostas corretas para nosias datas de teste nos cinco casos testados. < eR RE Exemplo 4.4 ~ Andlise Estatistica Implemente um algoritmo que leia um conjunto de medidas € calcule a média e 0 desvio-padrao do conjunto de dados de entrada, considerando que cada valor no con- junto de dados pode ser positivo, negativo ou zero. Solugao Esse programa precisa ser capaz de ler uma quantidade arbitréria de medidas e calcular a média e o desvio-padeio delas. Cada medida pode ser positiva, negativa ou zero. ‘Como desta vez nio podemos utilizar um valor de dados como marcador, vamos solictar que o usuario indique o nimero de valores de entrada e entio utilizar um laco for para ler esses valores. O programa modificado que permite 0 uso de qualquer valor de entrada é apresentado a seguir. Avalie a sua operagio pelo célculo da média e do desvio-padrio para os cinco valores de entrada dados: 3,-1,0, 1 e-2. & seri file: stats_3.m inane me ¥ = ‘ a ; i = t ses rbocar ms 44 inmpenen Capt tages | 147 % Purpose: % To calculate mean and the standard deviation of 8 an input data set, where each input value can be & positive, negative, or zero. ® & Record of revisions: a Date Programe: Description of change 2 % 12/08/98 S. J. Chapman Original code 8 & Define variables: eu => Loop index yn ————=="The aunber Of Input Samples 4 stddev -- The standard deviation of the input samples % sumx -- The sum of the input values % sumx2 -- The sum of the squares of the input values tox -- An input data value % xbar ~~ ‘The average of the input samples e Initialize sume fum_x = 0; sumx2 = 0; % Get the number of points to input n= input ("Enter number of points: '}; % check to see if we have enough input data. ifn<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 = iin % Read in next value x = input ('Enter value: ‘); % Accumulate suns. Sumx2 = sunx2 + x12; end & Now calculate statistics xbar = sumx / ni; std_dev = eqze (x *-SuHCXZ = SURZ) 7 TTI) % Tell user fprintf(’The mean of this data set is: 8£\n', x bar) fprint£ (‘The standard deviation is: t£\n‘, stddev; fprint£ ("The number of data points is: ${\n", n); ena 148 | Propanucsn em MATAD® pra Engenteos 4.2.1 Detalhes de Operagao ‘Agora que jé vimos exemplos de um lago for em operagio, precisamos examinar alguns detalhes importantes necessérios para usé-lo apropriadamente. 1. Nao 6 necessério tabular 0 corpo de um lago for, conforme apresentado nos ‘exemplos acima. O MATLAB reconhece o lago mesmo quando todas as decla- ‘ages iniciam na coluna um. Entretanto, 0 cSdigo ficaré muito mais legivel se © corpo do laco for estiver tabulado, por isso voc’ deveria sempre tabular 0 corpo de um lago. FY TT ‘Sempre tabule o corpo de um laco for com dois ou mais espagos, para melhorar a legi- bilidade do oédigo. aa TH 2. O indice do lago para um lago for nunca deve ser modificado dentro do lag. A va- ridvel de indice é freqiientemente utilizada como um contador dentro do laco, ‘e modificar seu valor pode provocar erros estranhos e dificeis de encontrar. O ‘exemplo abaixo deveria iniciar os elementos de uma matriz, mas a declaracéo “ii = 5" foi inserida acidentalmente no corpo do Iago. Como resultado, somente a(5) € iniciada, recebendo os valores que deveriam ir para a(1), (2), eassim por diante. for ii = 1:10 ie 5) % Brrot alii) = end Nunca modifique o valor de um indice de lago no corpo do laco. rte sine aT 3. Aprendemos, no Capitulo 2, que podemos estender uma matriz existente pela simples alocagdo de um valor a um elemento de indice mais alto. Por exemplo, a declaracio arr = li define uma matriz de quatro elementos que contém os valores [1 2 3 4).Se a declaracio arr(e) = nae Capito Lagos | 149 for executada, a matriz serd automaticamente estendida para oito elementos, com os valores (12 3 4 0 0 0 6)-Infelizmente, cada vex que uma matriz 6 estendida, 0 MATLAB precisa (1) criar uma nova matriz, (2) copiar 0 con- texido da matriz antiga para a nova, (3) adicionar o novo valor & matriz e (4) apager a matriz antiga. Esse processo consome bastante tempo para matrizes grandes. ‘Quando um lago for armazena valores em uma matriz anteriormente indefinida, o Iago forga o MATLAB a passar por todo esse process0 cada vez que © laco € executado. Por outro lado, se a matriz for pré-alocada com seu valor maximo antes de iniciar a execucio do lago, nenhuma cSpia precisaré acontecer ¢ 0 cédigo sera executado muito mais depressa. O fragmento de c6- digo a seguir mostra como pré-alocar uma matriz antes de iniciar ol square = zeros(1,100); for ii = 1:100 square (ii) Sempre pré-aloque as matrizes utilizadas em um lago antes de executar o lago. Essa pritica aumenta significativamente a velocidade de execusao do laco. = 2 4. f sempre possivel efetuarediculos uilizando lagos for ou vetoes. Por exer: plo o fragmento de cSdigo abaixo calcula os quadrados, as raizes quadradas ¢ 8s raizes cubicas de todos os interos entre 1¢ 100, tlizand um lago for. for ii - 1:100 square (ii) = i192; equare_root (ii) = iiM(1/2) cube_root (ii) = ii*(1/3); end (© fragmento de cédigo a seguir efetua os mesmos célculos com vetores. ii = 1:20; square © ii.*2 square_root = ii.4(1/2) cube_root (HiT it. (173 Apesar de esses céleulos produzirem as mesmas respostas, eles ndo so equiva- lentes. A versio com o lago for & mais de 15 vezes mais lenta que a verso com 0 vetor! Isso ocorre devido & necessidade de a declaragio no lago £or ser inter pretada e executada uma linha por vez pelo MATLAB, durante a execugao de cada passo do lago. De fato, o MATLAB precisa interpretar e executar 300 linhas separadas de cédigo. Em contraste, 0 MATLAB precisa interpretar e executar 180 | Paparacis om MATLAB par Egos somente quatro linhas de eédigo na versio com 0 vetor. Como 0 MATLAB é projetado para implementar declaragSes scbre vetores de forma muito efi- Cente, esse modo é muito mais répido, A desvantagem das declaragGes com vetores 6 que mais meméria seré necesséria, pois algumas matrizes intermeditérias terdo de ser criadas. Isso 6 em geral uma penalidade bastante pequena; os eélculos com vetores si0 quase sempre melhores que os célculos com lagos for. No MATLAB, o processo de substtuir lacos por declaragées com vetores é conhecido como vetorizagio. A vetorizacéo pode promover melhorias dristicas em desempenho para muitos programas MATLAB, ‘Se for possfvel implementar um célculo por meio de um lago for ou utilizando vetores, sempre implementeutilizando vetores. Seu programa ficard muito mais répido. EERE SE > Exemplo 4.5 ~ Comparando Lagos e Vetorizagao Para comparar a velocidade de execugio de declaragies com lagos e com vetores, efetue ‘e cronometze os trés conjuntos de eAlculos a seguir. 1. Calcule os quadrados de cada inteiro de 1 a 10.000 utilizando um lago for, sem antes iniciar a matriz de quadrados. 2. Caleuleos quadrados de cada inteiro de 1 a 10.000 utilizando um lago for, com 2 funglo zeros para pré-alocar a matriz de quadrados. 3. Calcule os quadrados de cada inteiro de 1 a 10.000 utilizando vetores. Solugéo Esse programa precisa calcular os quadrados de inteizos de 1 a 10.000 para cada uma das trés maneiras descritas, cronometrando a execuso em cada caso. A contagem de tempo pode ser efetuada pelas fungbes tic e toc do MATLAB. ‘Afungio tic zera o contador de tempo, ¢a fungio toc retorna 0 tempo transcor ido em segundos desde a tiltima chamada da fungio tc. ‘Como 0s relégios de tempo real em muitos computadores tém uma granularidade de medida pouco precisa, pode ser necessério executar cada conjunto de instrucées nuiltiplas vezes para obter uma medida média de tenpo vélida, Um programa MATLAB para comparar a velocidade dessas trés abordagens é apresentado a seguir & Script file: timings.m 3 % Purpose % This program calculates the tine required to - Fin a POR MLR T EHR E RHEE EEE HED Sa a ei AAT be stirs array, array. 3. Using Record of revisions: Date Programmer 12/08/98 s. J. Chapman Define variables year o+ Year (yyy) Capt apos | 184 calculate the squares of all integers from 1 to 10,000 in three different ways: 1. Using a for loop with an uninitialized output 2. Using a for loop with a pre-allocated output Description of change ii, 55 Loop index averagel —-—- Average time for calculation 1 average2 ~~ Average time for calculation 2 average} =~ Average time for calculation 3 maxcount = Number of times to loop calculation square -- Array of squares leap_day ~~ Extra ay for leap year month == Month (am) % Perform calculation with an uninitialized array % "square". This calculation is done only once & because it is so slow. maxcount = 1; ® One repetition tier & start timer for jj = 1:maxcount clear square Clear output array for ii = 1110000 square(ii} = iis; & calculate square end end averagel » (toc) /maxcount; % Calculate average tine % Perform calculation with a pre-allocated array % “square”. This calculation is averaged over 10 & loops. maxcount = 10; e tie: 8 for~33-2-1:maxcount— clear square a square = zeros(1,10000); for ii = 1:10000 square(ii) = di2; 3 end end average? = (toc)/maxcount: & one repetition Start timer Clear output array Pre-initialize array calculate square calculate average time 152 | Propanagio wm MATLAB” pore Eres % Perform calculation with vectors. This calculation & averaged over 100 executions maxcount = 100; % one repetition tier % Start timer for jj = 1:maxcount clear square % Clear output array Ai = 1:10000; 3 Set up vector square = 11.92; ® Calculate square end average} = (toc)/maxcount; Calculate average time & Display results fprint€|‘Loop / uninitialized array = $8.4£\n", average) ; fprintE|'Loop / initialized array = %8.4£\n", average2); fprint£|'Vectorized ~ ea.at\n', average3) ; (Quando esse programa ¢ executado com © MATLAB 6 ¢ um Pentium de 733MHz, 0s resultados sio » timings op / uninitialized array = 2.9640 Loop / initialized array = 0.1002 Vectorized = 0.0018 Como voct pode verificar, o uso apropriado’de valores iniciais e célculos vetorizados pode fazer uma diferenga incrivel para a velocidade de seu cédigo MATLAB! < 4.2.2 As Expresses break @ continue Duas declaragées adicionais podem ser utilizadas para controlar a operagio dos lagos while e for: as declaragées break e continue. A declaracio break encerra a exe- ‘cugZo de um lago e passa 0 controle para a préxima declaragao logo apés o fim do lao; a declaracio cont inue termina a passagem corrente pelo lagoe retorna o controle para 0 inicio do laco. ‘Se uma declaragéo break for executada no corpo de um lago, a execugio do corpo serd interrompida e 0 controle seré transferido para a primeira declaragio executdvel depois do lago. Um exemplo de declaracdo break em um lago for € mostrado a seguir. or ii = 1:5 if ii ae 3; break; fprinte(*ii = 8a\n" ii); disp('Fim do lago!"): =r ae Tatar = capita s Lagor | 158 ‘Quando esse programa é executado, a saida é Fim do lago! Note que a declaragio break foi executada na iteragdo quando ii era3, eo controle foi transferido para a primeira declaragao executdvel depois do laco, sem executar a decla- ragio fprintt, Se uma declaragao continue for executada no corpo de um lago, a execugao da passagem corrente pelo lao serd interrompida e o controle retorard a0 inicio do lago. “A varidvel de controle no lago for assumiré 0 seu préximo valor, e 0 ago sera executado— rnovamente. Um exemplo de declaragio cont inue em um lago for & mostrado a seguir. ass 3 for ii = if ii ak; end fprinté ("ii = end disp(’Fim do 1ago!’); Ba\n" iid: (Quando esse programa é executado, a saida é » test_continue fied Abs 2 lie 4 iiss Fim do lago! Observe que a declaragio cont inue foi executada naiteragdo quando ii era 3, € 0 con- trole foi transferido para o inicio do lago sem execular a declaragio fprint As declaragées break e continue funcionam em lacos while e em lagos £or. 4.2.3 Lagos Aninhados Um lago pode estar completamente dentro de outro Lago. Nessa condigdo, eles sio denominados lagos aninhados. O exemplo abaixo mostra dois lagos for aninhados que calculam ¢ eserevem o produto de dois inteiros. product = ii * ji; fprint£("8d * td = Bd\n’, ii, jj,product); end end 158 | Proyanucsn em Maree para Eneenies Nesse exemplo, 0 lago for extemno associara tim valor 1A varlivel de indice ii, eo lago for interno entio serd executado. O lago for intemo serd executado trés vezes com a varidvel de indice 3 adotando os valores 1, 2 e 3. Quando o lago for interno estiver completo, olago for extemo associaré um valor 2 a variavel de indice ii, e olago for interno seré executado novamente. Esse processo se repetird até que o lago For extemno tenha sido executado trés vezes, ¢ a saida resultante sera Note que o lag for interno & executado completamente antes de a varidvel de indice do lago for externo ser incrementada ‘Quando 0 MATLAB encontra uma declarao enc el associa cada decaragio com acons- trgdo mais interna correntemente emt aberto. Portanto, a primeira declaragio ond acima fecha o lago “for 33 = 1:3*,ea segunda fecha lago “for ii = 1:3". Esse fato pode produirerros dificeis de encontrar se uma declaragio end for acidentalmente apagada dentro de uma construgio de lago aninhado. Se 0s laos fox estiverem aninhades, eles devemt Yer varidoes de indice de ag distntas. Se cles tiverem a mesma variéve de indice de lag, 0 ago interno modificaré 0 valor do {nee de lago ajustado pelo ago externo ‘Quando uma declaragio break ou cont inue aparece dentro de um conjunto de lagos aninhados, a declaragéo break se refere ao lago mats inferno que a contém. Por exemplo, considere o programa a seguir for ii 2:3 for 33 if break: end 1:3 a product = ii * 337 fprinte (‘sd * 8 ond fprinté (‘Fim do lago interno\n’}; end Eprinté (‘Fim do lago externo\n‘} Sa\n’ ii, 33 product) ; Seo contador do lago interno 33 for igual a3, a declaragio break serd executada, 1550 levard programa a abandonar o lago mais interno. O programa imprimir “Fim do apie apos | 185 lago interno", 0 indice do lago externo serd incrementado em 1 ea execugio do lago mais. interno recomesard. Os valores de saida resultantes serio beast 1e2-2 Fim do lago interno 2tle2 24224 Fim do Jago interno at1-3 362-6 Fim do 1ago interno Bim do. lago_externo 4.3. Matrizes L6gicas e Vetorizagao No Capitulo 2, mencionamos que o MATLAB tem dois tipos de dados fundamentais: numérico e cadeia de caracteres. Dados numéricos contém atimeros, enquanto cadeias de caracteres contém caractetes. Além desses dois tipos de dados, o MATLAB contém um terceiro (“por assim dizer”) tipo de dados: o tipo de dados I6 O tipo de dados “ligico” nio é efetivamente diferenciado no MATLAB. Em vez disso, ele € uma matriz numérica-padrio com uma propriedace especial "Igica" acres- centada, Matrizes Igicas sio criadas por todos os operadores relacionais e logicos. Elas podem ser diferenciadas das matrizesordindrias pela ocoreéncia do modificador (lo- gical) em seguida a elas, por meio do comando whos ou do Navegador de Espico de ‘Trabalho. Por exemplo, considere as seguintes dectaragoes: » 1123745 6:70 9): ssas declaragSes produzem duas matizes a e b. A mariz a € uma matriz numérica 123 que contém os vals [: 5 ‘| a mati b€ uma mabe numsca especial om a 789 000) propriedadeWicaatvada, que coniém os valores | 0 0 1 |, Ao executar 0 comando ‘whos, 0s resultados so como os exibidos cador (logical) assocado a ela » whos Nae Size bytes Class a 3x3 72 double array > 3x3 72 double array (logical) Grand total is 18 elements using 144 bytes 186 | Pagamapso en MATAB® pare Eneosros E também possivel adicionar a propriedade légica a. uma matriz, utilizando a fungao Logical. Por exemplo, a declaragio.c = logical (a) colocard os valores da ‘matriz a na matriz c, associando a propriedade l6gica & matriz: = © = logical(a) 1 2003 a5 7 89 > whos Name Bytes Class a 3x3 12 double array > 3x3 72 double array (logical) c 2a 72 double array (logical) Grand total is 27 elements using 216 bytes ‘A propriedade l6gica pode ser removida de uma matriz por meio de quase qual- quer operagio aritmética sobre ela, Por exemplo, s¢ adicionarmos zero & matriz.c, os valores permanecerdo inalterados mas a propriedade I6gica serd perdida. 1 20 3 4 5 6 7 8 3 » whos Name Size Bytes Class a aa 72 double array > 33. 72 double array (logical) © 3x3 72 double array Grand total is 27 elements using 216 bytes 4.3.1 Almportincia das Matrizes Logicas As matrizes ldgicas tém uma propriedade especial muito importante: podem servir como mascara para operagies eitméticas. Mascara € uma matriz. que seleciona os elementos de ‘outra matriz. para utilizar em uma operagdo. A operacao especificada serd aplicada sobre os elementos selecionados, mas no sobre os autros elementos. Por exemplo, suponha que as matrizes a ¢ b sejam conforme definido na segio anterior. No caso, a declaragao a(b) = sqrt (a(b)) produziré a raiz quadrada de todas os elementos para os quais a matriz légica b sea diferente de zero, e manterd inal terados os outros elementos. apes | 187 > a(b) = sart(a(b)) 0000 2.0000 «3.0000 4.0000 5.0000 2.4495, 2.6458 2.8284 3.0000 Essa é uma maneira bastante répida e inteligente de efetuar operagSes sobre subcon- juntos de uma matriz sem a necessidade de lagos ou ramificagbes, (Os dois fragmentos de cédigo a seguir calculam a raiz quadrada de todos os ele- ‘mentos de uma matriz a cujo valor é maior que cinco, mas a abordagem vetorizada é ‘muito mais répida que a abordagem baseada-em lagos. We Rom - ~~ for ii = i:size(a,1) 7 - I for §J we 1eaize(a,2) t if aGiai) > 5 : a(ii,53) © eare(atis, 33001 ; end 5 end HE ena bas ab) = wart (atb)); iF re Exomplo 4.6 ~ Utilizando Matrizes L6gicas como Méscaras de pte, ara comparar as velocidades de execucio de lagos ¢ ramificagbes com cédigo vetori- zado, utilizando uma matriz l6gica, vamos executar e cronometrar os dois conjuntos de cileulos a seguiz. 1. Criar uma matriz.com 10.000 elementos. A matriz deve conter os valores f, 2. 10,000. Calcular a raiz quadrada de todos os elementos cujos valores sejam ‘maiores que 5.000, utilizando um lago for e uma construgio if. Criar uma matriz. com 10.000 elementos. Fla deve conter os valores 1, 2. 10.000. Caleular a raiz quadrada de todos 0s elementos cujos valores sejam maiores que 5,000, utilizando uma matriz légica ‘Solugéo se prograina proces Gar tia mati que Coatenha os intel de Ta 10.000 e caicalara riz quadtada de cada valor mafor que 5.000, uilizando cada uma das duas mareiras descritas acima {Um programa MATLAB para comparar a velocidade das duas abordagens €spre- sentado a seguir: 8 Script file ’ logicall.m Wnt Grif 158. | Programapao em MATLAB® para Engeaneiros: i Capitulo Lagas | 159 Purpose: Display results ‘This program calculates the time required to fprinté (‘Loop / if approach = aa.ae\n’, calculate the square roots of all elements in averagel) ; array a whose value exceeds 000. This is done fprintf (‘Logical array approach aa.48\n", in two different ways: average?) ; 1, Using a for loop and 1 construct. ‘Quando esse programa é executado pelo MATLAB 6, em um computador Pentium II 2. Using @ logical array. de 733 MHz, os resultados sio os seguintes: Record of revisions - » logical Date Progranter Description of change j Loop / if approach = 0.2200 Logical array approach = 0.0060 96/01/01 5. J. Chapean Original code Como pode ser-visto-o-uso-de-matrizes 1ogicas aceleTa'# exec GIO US Caio eM Ue i fator 20! Define variables: < a Array of input values . e e . . ® e e 2 2 a 2 : e . . . . 8 : ® ~ maxcount Number of times to loop calculation Sempre que possivel, utilize matrizes légicas como méscaras para selecionar para % Perform calculation using loops and branches lI maxcount % Gne repetition i tics % Start timer 4.3.2 Criando o Equivalente a Estruturas if /e1ee com Matrizes Légicas for 33 = 1:maxcount ‘a = 1120000; % declare array Matrizes Iigicas podem também ser utilizadas para implementar uma consirugi for i = 1:10000 ‘£/else dentro de um conjunto de lagos Sor. Conforme vimos na tltima seg80,€ pos- Te ality > 5000 sivel aplicar uma operagio sobre elementos selecionados de uma matrz utilizando uma ality © ogre ta(iiy)s matrizligica como mascara E também possvel aplicar um conjunto distinto de operages ena sobre os elementos no selecionados da matriz, simplesmente adicionando o operador de ene negagio (-) & méscara l6gica. Por exemplo, suponha que queiramos calcular a raiz enn quadrada dos elementos de uma matriz bidimensional cujo valor seja maior que 5 ecal- or gol = (toc) /maxcount; ¥ Catevlate average time cular 0 quadrado dos elementos restantes na matrz. O eédigo para essa operas, uli & Perform calculation using arrays. UE. lizando lacos e ramificagses, é hs 20 ans sa for jj = lisizela.2) ee for jj = l:maxcount if a(it.jj) > 5 cio) ageetacb))s 3 fake omare root = on ® calculate average time end 160 | Prozanapso em MATLAg® exe Eoeaeiae (© c6digo vetorizado para essa operagio & bass atb) = sqrt(a(b)): a(-b) = a(-b).*2: 0 cédigo vetorizado é enormemente mais répido que a versio baseada em lagos e ramificages. Este teste apresenta uma verificagio répida do seu entendimento dos conceitos apre- sentados nas Segies de 4.1 a 4.3, Se voce tiver problemas com o teste, releia as segbes, pergunte 20 seu professor ou discuta o material com um colega. As respostas podem ser encontradas no final do livro, Examine os lagos for abaixo e determine quantas vezes cada lago serd executado. 1, for index = 7:10 2. for jj = T:-t:10 3. for index = 1:10:10 4 for ii = -10:3 5. for kk = 31 Examine os lagos a seguir e determine o valorem ires no final de cada um. 6 ires = 0; for index = 1:10 ena 7. ixes = 0) for index = 1:10 izes = izes + index; end 8 ires = 0; for indext = 1:10 for index? = index1:10 Af index2 == 6 break; end ires « ires + 1; end end yt ra [pos nama oii ag em rose) no Hens beni Caples Lagos | 161 9. izes 20; for indexl = 1:10 for index2 = indexi:10 if index2 -- 6 continue; end end end 10. Escreva as decaragées MATLAB para calcula os valores da fungio ~ fsin# para todo tal que sin #>0 ‘ 10- [peta para Gr <1 < 6x com intervalos de n/10. Faga isso duas vezes: uma vez uti- lizando lagos e ramificagSes e outra utilizando c6digo vetorizado, 508 ig SS 4.4, Exemplos Adi > Exomplo 4.7 ~ Ajustando uma Linha para um Conjunto de Medidas com Ruldo Avelocidade de um objeto em queda na presenga de um campo gravitacional constante 6 dada pela equasio ott 43) onde u(t) é a velocidade a qualquer instante f, a 6 a accleragio da gravidade e v, € a velocidade no instante 0. Essa equagao advém da fisica elementar ~ qualquer calouro de lum curso de fisica a conhece. Se desenharmas a velocidade versus o tempo para o objeto em queda, nossos pontos de medida (v,t) devem seguir uma linha reta, Entretanto, 0 ‘mesmo calouro do curso de fisica sabe que, se formes ao laboratério e tentarmos medir a velocidade versus o tempo de um objeto, nossas medidas no seguirio uma linha reta, Elas poderdo se aproximar disso, mas nunca se alinhario perfeitamente, Por que no? Porque nunca conseguimos efetuar medidas perfeitas. Existe sempre algum rufdo nas medidas que as deixa distorcidas. Em muitos casos em ciéncia e engenharia, temos conjuntos de dados com ruidos como esse, e desejamos estimar a linha reta que “melhor se ajuste” aos dados. Esse problema ¢ conhecide como problema da regressio linear. Dado um conjunto de me- didas (%y) com rufdo e que aparentemente seguem uma linha reta, como podemos ‘encontrar a equacio da reta mx +b (aay que “melhor se ajuste” as medidas? Se pudermos determinar os coeficientes de regres- so m eb, poderemos utilizar essa equacdo para prever o valor de y para um dado ¥ uti- lizando a Equacio (44) naquele valor de x. 162 | Pegramagioem MATAR pas Ergnteas Um método-padrao para determinar os coeficientes de regressio m eb € 0 métedo dos minimos quadrados. Esse método recebe o nome de minimos quadrados porque produz a reta y= mx +, para a qual a soma dos quadrados das diferengas entre os valores y ‘observados e os previstos & a menor possivel. A inclinagio da reta de minimos quadra- dos é dada por 43) € 0 ponto de intersegdo da reta de minimos quadrados ¢ dado por ba y-mz 46) onde 2x 6a soma dos valores de x, E x76 soma dos quadrados dos valores de x, Eay € a soma dos produtos dos valores correspondentes de x e y, 3 6a média dos valores de x, 17 6 média dos valores de y. Escreva um programa que calcule a inclinagio m e o ponto b de intersegio do eixo para a reta de minimos quadrados de um dado conjunto de pontos (x,y) medidos com ruido. Os pontas devem ser lidos a partir do teclado, ¢ tanto 0s pontos individuais como a reta de minimos quadrados precisam ser desenhados. 1, Estabeleca o problema Calcule a inclinagao m e a intersecio b de uma reta de minimos quadrados que melhor se ajuste a um conjunto de dados de entrada composto por ‘um niimero arbitrario de pares (x,y). Os dados (z,y) de entrada sio lidos 4 partir do teclado, Desenhe os pontos de entrada e a rela sobre um ‘mesmo diagrama. 2. Defina as entradas e saidas ‘As entradas requeridas para esse programa sio o miimero de pontos a serem lidos, mais os pares de pontos (xy). ‘As saidas desse programa sio a inclinajdo e a intersecio da reta de mini- ‘mos quadrados, 0 ntimero de pontos utilizados para o ajuste e um diagrama ‘com os dados de entrada e a curva ajustada. 3. Descreva o algoritmo Esse programa pode ser quebrado em seis grandes passos: Obtenha © niimero de pontos de entrada Leia os valores de entrada Calcule as estatisticas solicitadas Calcule a inclinac&o e a intersecao Escreva a inclinacéo e a intersecio Desentie os pontos de entrada e a curva ajustada | I ae vn en [1] 194 | npn et conn 4 tapes | 163 primeiro grande passo do programa é ler o niimero de pontos a serem lidos. Para isso, solicitamos a0 usuario essa informacio por meio da fungio input. A seguir lemos os pares (xy) um por ver, utlizando uma fungéo input dentro de um lago for. Cada par de valores seré colocado em uma rmatriz((x 1), € a fungio retomaré essa matriz para o programa soliitante. Note que um lago for aqui é apropriado, pois sabemos a priori quantas vezes © lag seré executado, (© pseudocédigo para esses passos € apresentado a seguir Apresente mensagem que descreva 0 objetivo do programa npoints © input (‘Fornega o niimero de pares [x yl: "7 for ii = lin points temp © input (*Forneca (x! y]:"); eG} em temp (1 yi) © temp(2); end A seguir, precisamos acumular as estatisticas requeridas para o cdlculo. Essas cestatisticas s50 as somas Ex, Iy, Ex, e Exy. O pseudocddigo para esses passos & Zere as varidveis cum x, sumy, sumx2 ¢ sum xy for ii = I:n_points sumx @ sumx + x(ii) sumy © sumy + ylii) SUR? © SURX2 + x(1i) 92 sum_xy © sumxy + x(ii)* y(ii) end Depois, precisamos calcular a inclinagio ea intersecSo da reta de minimos quadrados.O pseudocédigo para esse pass €simplesmente a versio em MATLAB das equagies (4.4) € (45). xbar © sum_x/n_points yobar © sumy/n_points Slope © (sum xy-sunx * yb yLint © ybar-slope * x bar Finalmente, precisamos apresentar os resultados eo diagrama. Ox pontos No of points 7 Exemplo 4.8 - 0 VOo de uma Bola Vamos agora acrescentar nuido a essas medidas, O conjunto de dados passaré Seassumirmos que a resistencia doar €despreziveleignorarmos a curvatura da Tera ttn fee ke Suan ets oer green gc ST, Mon sees ete ate ene rom samen om er rome ca ken ceraeeeabto gue (5.5 5.75) — i cariniren mnrnoe ‘Se executarmos 0 programa com esses valores, os resultados serao F » legfit er S, Slope (m) 1.024 2 a « . 6 7 . Intercept (b) 0.120 * 168 |. Prwramagso em MUATAg® para Engeanis capt s Lges | 169 Se a bola for langada com uma velocidade inicial v, e um angulo de 0 graus com relagio a superficie da Terra, os componentes horizontal e vertical da velo- cidade serio "t typ +05 €08 0 a9) 249 +% sin 0 410) Assuma que a bola seja inicialmente langada da posigéo (x,y) ~ (0,0), com velocidade inicial v, de 20 metros por segundo e angulo inicial de @ graus. Escreva, ‘um programa para desenhar a trajetdria da bola e determine a distancia horizontal, percorrida antes de ela tocar novamente o’solo. O programa deve desenhar as tr. jetdrias da bola para todos os-angulos de Sa 85%, vartando de 10° em 10", © dete minar a distancia horizontal percorrida para todos os angulos de 0° a 9", variando de T° em 1°. Finalmente, ele deve determinar o Angulo @ que maximiza a distincia per- corrida pela bola, e desenhar essa trajetéria em particular com uma cor diferente € uma linha mais espessa 4) eo amr md “ i“ ongem Tmpscie x = Sara aT TA Para resolver esse problema, précisamos determinar uma equagio para o tempo quea bola leva para retornar ao solo. Em seguida, podemos calcular a posigio (zy) da bola uti- lizando as equacbes (4.7) a (4.10). Se fizermos isso varias vezes entre 0 e 0 tempo que a bola retora ao solo, poderemos utilizar esses pontos para desenhar a trajetria da bola. (O tempo em que a bola permanece no ar apés ser langada pode ser calculado pela Equacio (4.7). A bola tocaré o solo no tempo f, para 0 qual y(t) = 0. Lembrando que a bola parte do nivel do solo (y(0) = 0), ¢ resolvendo para t, teinos | f Wm wet tett Se an |, Fgura 4.2. (@) Quando uma bola ¢ lancada para cima, ea segue uma trajtdria parabsica.(b) | (Os componentes horizontal e vertical de um vetor veloeidade va um angulo 8 com lin horizontal. OOF Itt gf 1 o=(oeted se) 1 YON Yo+ Mot * 3e # a7 portanto, a bola estard no nivel do solo no instante t, = 0 (quando a langamos) e no instante | onde y,é altura inicial do objeto acima do solo, »y éa velocidade vertical nical do | objeto e.g €aaceleragio devido 8 gravidade da Terra. A distancia horizontal percorrda pela bola como fungio do tempo apds o langamento é dada pela Equagio (4.8) an) x)=, +8 8) Para o problema tratado, sabemos que a velocidade inicial v,€ de 20 metres por segundo, e que a bola sera lancada com angulos variando de 0” a 90°, de 1° em 1°. Binalmente, um livro de fisica elementar nos diz que a accleragio devida & gravidade dda Terra é de 9,81 metros por segundo ao quadrado. onde x, € a posigao horizontal inicial da bola no soloe 2, €a velocidade horizontal ini- | cial da bol. * 170 |, Prvanapto am MATLAB para Engst Agora, apliquemos nossa técnica de projeto a esse problema. 1. Estabelega 0 problema (© problema pode ser bem apresentado assim: calcule a distancia percorrida por uma bola quando ela élangada com uma velocidadeinicial v, de 20 mls ednguloinical 6. Calcule essa distancia para todos os Angulos entre 0° e 90°, variando de 1° em 1 Determine o éngulo ® que resulta na distancia percorrida méxima para a bola, Desenhe ‘a trajetbria da ola para Angulos entre 5° e 85°, com incrementos de 10°, Desenhe a tra- jetéria de maximo percurso em cor diferente e cam uma linha mais espessa. Assuma que lio existe resistencia do ar. 2, Defina as entradas e saidas Com essa definigio do problema, ndo precisamos de dados de entrada. Co- hecemos o valor de v, e de 8, portanto nio precisamos fornecé-los. As saldas ppara esse programa sero uma tabela que mostra a distancia percorrida pela, bola para cada angulo 6, 0 angulo 8 para o qual essa distancia 6 maxima e um diagrama das trajetérias especificadas, 3. Projete o algoritmo Esse programa pode ser quebrado nos seguintes grandes passos: calcule a distancia percorrida pela bola para @ variando entre 0 © 90° Escreva uma tabela de distancias percorridas Determine a distancia percorrida méxima e a apresente Desenhe as trajetérias para @ variando entre 5 e 85° Desenhe a trajetéria de percurso méximo ‘Como sabemos o mimero exato de vezes que os lagas serio repetidos, lagos for sSo apropriados para esse algori'mo. Vamos agora refinar o pseudo- cédigo para cada um dos grandes passos. Para calcular a distancia maxima percorrida pela bola para cada angulo, vamos primeiro calcular as velocidades iniciais horizontal e vertical, usando as equagées (4.9) (4.10). Depois, vamos dete:minar o tempo para a bola retornar Terra, utilizando a Equagao (4.11). Finalmente, vamos calcular a distancia per- corrida, utilizando a Equacio (4.7). O pseudocédigo detalhado para esses passos 6 apresentado a seguir. Note que precisamos converter todos os Angulos para radianos antes de utilizar as fungbes trigorométricast Crie ¢ inicie uma matriz para os valores for di = 1:91 theta © i - 1; vxo © vo * cos(theta*conv) ; vyo & ve * sin(theta*conv) : max_tempo © -2 * vyo / gi percurso(ii) «© vxo * max_tempo; end i oer ea Ta a Caples Laos | 171 ‘Depois, precisamos escrever uma tabela de percursos. © pseudocédigo para esse passo é: Escreva © cabecalho for ii = 1:91 theta © ii - 17 escreva theta e a distancia (range); end AA distancia méxima percortida pode ser obtida pela fungio max. Lembre ue ssa funo retoma o valor masimo esta posiio. © pseudocédigo para esse passo| Imaxrange indice] © max(rahge) ; -Escreva a distancia méxima—trangey)@ o-angulo(=tndiceI) 7 ‘Vamos utilizar lagos for aninhados para calcular e deserihar as trajet6rias, Para que todos os diagramas aparecam na tela, precisamos desenhar a primeira trajetdria e aplicar hold on antes de desenhar as outras trajetGrias, Apés dese- nhar a tiltima trajet6ria, precisamos aplicar hold of. Para efetuar esses céleu- los, vamos dividir cada trajetéria em 21 intervalos de tempo e determinar as pposigdes x e y da bola para cada intervalo. Em seguida, vamos desenhar essas posigdes (x,y). O pseudocsdigo para esse passo é: for ii = 5:10:85 4 Determina velocidades © tempo maximo para o Sngulo theta © ii - 1; vxo € vo * cos (theta*conv) : vyo © vo * sin(thetatcony} ; max_time © -2 * vyo / g: Inicia as matrizes x e y for jj = 1:21 time © (J3-1) * max_time/20; x(time) vxo * time; yitime) # vyo * time + 0.5 * g * timesa; end plot (x,y) com 14 Aplica “hold on’ depois do prineiro diacraa end Adiciona os titulos @ legendas dos eixos has verdes finas Para finalizar, precisamos desenhar a trajetéria de percurso maximo com cor diferente ¢ linha mais espessa. xo © vo * cos(max_angle*conv) ; vyo © vo * sin{max_angletcony) ; maxtime © -2* vyo / gi: Inicia as matrizes xe y for jj = 1:22 time © (JJ-1) * max time/20; ie 12 | Prramagto vm MATAB® para Enero: apt yas | 178 Script file: ball.m % Write out table of ranges Eprinté (‘Range versus angle theta:\n‘); for ii = 1:91 : “theta—-ii-—1y fprintf(* $24 88.4f\n’,theta, range(ii}); end % calculate the maximum range and angle (maxrange index) » max(range) maxangle = index - 1; fprintf (‘\nMax range is t®.4f at t2d degrees.\n maxrange, maxangle) ; 4 Now plot the trajectories Purpose ‘This program calculates the distance traveled by a ball thrown at a specified angle “theta* and a specified velocity ‘vo" from a point on the surface of the Earth, ignoring air friction and the Earth's curvature. It calculates the angle yielding maximum range, and also plots selected trajectories. x(jj) © vxo * time; = % Calculate maximum ranges YU) ye + time + 0.5 + 9 * cimer2s ferns ten en theta’ sit = 15 Flot(xy) on inka vernetha grosea Wao = Yo * cooithetatcon) fota cee Wie = vo * sunttnetavcon 4 Transforme o algoitmo em declaragdes MATLAB H ictine = <2 70 / gr O progama MATLAB rent €apsnado a pu ens x iE | a Ta en oT Record of revisions: Date Programmer Description of change 12/10/98 S$. J. Chapman Original code for ii = 8 % Get velocities and max time for this angle Define variables theta = ii; conv “= Degrees to radians conv factor i veo = vo * cos(thetatcony) + gravity = ecel. due to gravity (m/s*2) a vyo = vo * sin(thetatcony) + ii, Gi -- Loop index I max_time = -2 vyo / a7 index -- Location of maximum range in array ie % calculate the (x,y) positions maxangle =~ Angle that gives maximum range (deg) IE x = zeros (1,21); maxrange =- Maximum range (m) iF Y = zeros(1,21); range -- Range for a particular angle (m) iE for $j = 1:21 tine 2 Time (3) i tine = (jJ-1) * max tine/207 theta © anitial angle (deg) ir x(33) = vo * time; traj_time =~ Total trajectory time (s) E G3) = vyo * time + 0.5 + g * cine a Tr Tittlal velociey (ave) é ona x0 -- X-component. of initial velocity (m/s) = plot (x.y, "B's vyo <= y-component of initial velocity (n/s) i if id oe 5 * ~~ X-position of ball (m) hold on; a ¥ =- Y-position of ball (m) e om Oe a © constants . & nad titles and axis labels Sey 5B, OP | Rearvesatoniaaians (Ganversion facsor title (‘\bfTrajectory of Ball vs Initial Angle \theta’); 338 § Becels due fo ge xdabel(’\E\ite \rm\bf (eters) "): ylabel (/\bE\ity \rm\bé (meters) "); axis ((0 45 0 25)}7 grid or % create an array to hold ranges range = zeros(1,91) ena TA | Praamecso em Maras pr gears & Now plot ‘the-max range trajectery vxo = vo * cos (maxangle*conv) ; vyo = vo * sin(maxangle*conv) ; maxtime = -2 * vyo / gi % Calculate the (x,y) positions x = zeros(1,21); y = zeros (1,21) for jj = 1:21 time = (jj-1) * max_time/20; x(jj) = vxo * time: y() = vyo * time + 0.5 * g * timer; ead plot (x.y, ‘x’, "Linewidth',3.0): hold off A aceleragio da gravidade no nivel do mar pode ser obtida de qualquer livro de fisica. Ela vale 981 m/s?, em diregao ao solo. 5. Teste 0 programa Para testar 0 programa, vamos calcular 3 mio as respostas para alguns angulos e comparar 0 resultados com a saida do programa, e Nyg= He 08 © 4 a ae Nah m/s Omis Om 5° 19,92 m/s 174 m/s 0.355 s 708m 40° 15,32 m/s 1286 m/s 26215 405m rc Wldm/s 1414 m/s 2,883 m/s 407 m ‘Quando o programa bali é executado, é produzida uma tabela de angulos € distincias com 91 linhas. Para economizar espaco, vamos reproduzir apenas ‘uma parte dessa tabela, > ball Range versus angle theta: ° 0.0000 1 114230, 2 2.8483 3 4.2621 4 5.6747 5 7.0805 40 40.1553 41 40.3779 42 40.5514 4s abs 58 44 40.7499 450 40.7747 46 40.7499 47 40.6754 48 40.5514 49° 40.3779 50 40.1553 85 7.0805 86 5.6747 87 412621 . 88 2.8483, _ - — 39 1.4230 30 ‘9.0000 Max range is 40.7747 at 45 degrees © diagrama resultante € mostrado na Figura 43. A saida do programa esté de acordo com nosso céleulo& mao para os anguloscalclados com precsio de “quatro dpitosnesse mesmo tipo decilculo, Note que o percurso maim ccorret om angulo de 4°. < “ajar of bal vital ang a "7 — Figura 43. Trajetérias possivels para a bola. TB | Programagio em MATLAB® para Engetwres Esse exemplo utiliza diversos recursos de desenhos apresentados no Capitulo 3. Ele utiliza 0 comando axis para ajustar os dados exibidos, 0 comando hold para -nultiplos diagramas sobre os mesmos eixos, a propriedade LineWidth para ajustar a espessura da linha correspondente a trajetdria de percurso maximo e seqiiéncias de ‘comandos para eriar o titulo e as legendas para os eixas xe y. Esse programa, entretanto, no foi escrito da maneira mais eficiente, pois temos diversos lagos que poderiam ser substituidos por declaragGes vetorizadas. Voct ser solicitado a escrever um programa ball .m melhorado no Exereicio 4.11 deste capitulo. 4.5 Resumo ‘Temos dois tipos basicos de Lagos no MATLAB: o laga while eo laco for. O lago whi 1 E.utilizado para repetir um trecho de eédigo quandonio sabemos a priori quantas vezes © laco precisa ser repetido. O lago for é utilizado para repetir um trecho de eédigo quando sabemos a priori quantas vezes o lago deve ser repetido. Podemos escapar de qualquer tipo de lago a qualquer momento, utilizando declaragées break. 4.5.1 Resumo de Boas Praticas de Programagao As seguintes orientagées devem ser seguicas na programagao utilizando construgées de amificagio e lago. Se elas forem seguidas consistentemente, seu cSdigo contera menos bugs e sera mais facil de depurare de entender para outras pessoas que talvez precise trabalhar com ele no futuro. 1. Sempre tabule os blocos de c6digo dentro das construgées while e for para que elas sejam mais faceis de ler. 2. Utilize um lago whi Le para repetirtrechos do eédigo quando voc® nao souber 4 priori quantas vezes o lago deve se repetir. 3. Utilize um lago for para repetir trechos do cédigo quando vocé souber a priori {quantas vezes o lago deve se repetir. 4. Nunca tente modificar os valores de um indice de um lago for dentro do lago. 5, Sempre inicie todas as matrizes utilizadas em um lago antes de executé-lo, Essa pritica aumenta muito a velocidade de execucio do laco. 6. Se for possivel implementar um céleulo por nneio de um lago for ou de vetores, sempre implemente o céleulo com vetores. Seu programa sera muito mais répido. 7. Sempre que possivel, utilize matrizes ldgicas como méscaras para selecionar para processo os elementos de uma matriz, Se matrizes logicas forem utilizadas ‘em vez de lacos e construgSes if, seu programa sera muito mais répido. 4.5.2 Resumo do MATLAB © resumo abaixo lista todos os comandos e fungdes MATLAB descritos neste capitulo, com uma breve descrigio de cada um, ‘tn regen inde es oes an reo se co cot = & Capiule 4 tagos | 177 ‘Comandas e Fungées, break Interrompe a execucio de um lago ¢ transfere 0 controle para a primeira declaracio apds o final dele. continue Interrompe a execucio de urn lago e transfereo controle para o inicio dele, para apréxima teragio. lago for Repete um bloco de declaragSes durante um nsmerocspe- Cificado de ves. togical ‘Acresenta 0 ateibuto logical a uma matriz numérica the Reinicia 0 contador de tempo. toe Retoma o tempo desde a skima chamada de tic. Iago wh Repete um blocd de declaragées até que uma condigio de "Teste se tome (flso}. ee Exercicios AA Ezcrova as declaragdes MATLAB para calcular (na equagto n= (3845 20 pees eco para valores de f ertre -9 e 9, em intervalos de 0.5. Utilize lagos e ramifi- cagies para esses célculos. Reescreva as declaragées para resolver o Exercicio 4.1 utilizando vetorizagio, Escreva as declaragSes MATLAB para caleular e imprimir 0s quadrados de todos os inteiros pares entre 0 ¢ 50. Crie uma tabela composta pelos inteiros ‘seus quadrados, com legendas apropriadas para cada coluna. 44 Escreva um arquivo M para avaliar a equagio y(x) = x? - 3x + 2 para todos os, valores de x entre 0,1 €3, em intervalos de 0,1. Faga isso duas vezes, uma com lagos for e uma com vetores, Desenhe a fungi resultante utilizando uma linha vermelha espessa e tracejada. 4.5 Escreva um arquivo M para calcular a funcio fatorial NI, conforme definida ro Exemplo 4.2. Observe o caso especial do 0! Seu programa deve também indicar um erro se N for negativo ou néo for um niimero inteio. 4.6 Examine as declaragdes For abaixo e determine quantas vezes cada lago seré executado. a. for ii = -32768:32767 b. for ii = 32768:32767 © for kk = 2:4:3 d.-for-3j-w-onest57 —_—— ~ 4.7 Examine 0s lagos for a seguir e determine o valor de ies no final decada ‘um, e também o niimero de vezes que cada lago é executado. aires = 0; for index - -10:10 ies = ires + 1; 49 YTB |. Prpamapic om MATLAB® pa Egeaors bires =-0; for index if index continue; end 101-224 o end ires = 0; for index = 10:-2:4 ies + index; if index «= 0 break: end ires = ires + index; end d. izes for index = 10:-2:4 for index? == 2:2:indexl Lf index2 == 6 break end end end ires + index2; Examine 0s lagos whi 1e abaixo e determine o valor de ires no final de cada um, ¢ também o niimero de vezes que cada lago € executado. aires = 1; while mod(ires,10) -= 0 ires = ires + 1; end bires = 2; while ires <= 200 ires = irest2; end ires = 2; while ires > 200 ires = ires*2; end Qual o contesido da matiz arr1 apés a execugio dos seguintes conjuntos de declarasaes? aarrl = (123 4; 5678; 910 41 12); mask = mod(arr1,2) == 0; arri(mask) = ~arri (mask): barrl = [123 4; $678; 910 11 121; arr? = arrl <= 5; arri(arr2) = 0 arri(-arr2) = arri(-arr2).+2 omnes q = T a ¥ i £ £ apn | 179 4.10°O que pode ser feito para que uma matriz numérica se comporte como més- an cara l6gica para operagSes vetoriais? Como podemos remover o atributo logi- cal de uma matriz numérica? Modifique 0 programa ball do Exemplo 48, substituindo os lagos for internos por calculos vetorizados. 4.12 Modifique o programa ba11 do Exemplo 48 para ler a aceleragio da gravi- 413 dade em locais especificos e calcular 0 percurso maximo da bola para essa aceleragio, Apds modificar programa, execute-o com aceleragbes de -98 m/s, 9,7 m/s? -9,6 m/s2. Que efeito provoca a redusao na atragio gravitacional sobre o percurso da bola? Que efeito provaca a reducio na atragio gravitacional sobre 0 angulo étimo 6 de lancamento da bola? Modifique o programa bali do Exemplo 48 para ler a velocidade inicial de ~Tanigamiento da bola. Apds modificar o programa, execute-o com velocidades 4 416 iniciais de 10 m/s, 20 m/e 30 m/s. Que efeito provoca a alteraio da veloc dade inicial v, no percurso da bola? Que efeito tem isso sobre o Angulo timo 6 de langamento da bola? © programa 1scfit do Exemplo 47 soictava ao usuario o niimero de pon- tos antes de fomecer 0 valores. Modifique o programa pars que ele lia uma quantidade arbitréria de valores utilizando um lago while e pare de ler dados quando o usuatio pressionar a tecla Enter sem digtar nenhum valor. Teste seu programa utlizando os mesmos dois conjuntos de dados utlizados no Exemplo 47. (Dict: @fungSo input retorna uma matriz vazia ([)) se um uusudtio pressiona Enter sem fornecer dados. Vocé pode usar a fungi isenpty para testar se uma matriz 6 vazia e parar de ler os dados quando ‘uma matriz vazia for detectada.) Modifique o programa 1satit do Exemplo 47 para ler os valores de entrada de um arquivo ASCII chamado input dat. Os dades no arquivo devem ser organizados em linhas, com um par (sy) em cada linha, conforme ‘mostrado a seguir: 42 2.2 22 33, Teste seu programa utlizando os mesmos dois conjuntos de dados utilizados ro Exemplo 47. (Dia utilize 9 comando load para ler os dadosecolocar em luma matriz input, depois armazene a primeira coluna de input! na smatriz x ea segunda coluna na matiz 7.) Fungio de Ajuste de Minimos Quadrados do MATLAB, O MATLAB contém uma fungio-padrio para calalaro ajuste de minimos quadrados am poli némio. A funcio poly#t ealewla 0 ajuste de minimos quadrados 4e urn Conjunto de dados- a emr-potinémigrde gra Pi) mage a8 +o 12) onde N pode ser qualquer valor maior que ox igual 1. Note que, paraN= 1, © polindmio & uma equsgio linear, com inclinago igual ao coeficiete 6 € intersegao no eixo y igual a0 coeficiente mA forma desea Fungso € p= polyfitix,y.n) inde x ey 830 vetores com os componentes x yen €0 gra 180 | Prptmagso om MATLAB pre Ege Escreva um programa que calcule 0 ajuste de minimos quadrados de ‘um conjunto de dados a uma linha reta, utilizando polyéit. Desenhe 0 resultado produzido pelo programa que utiliza o polyfit junto com o resulta- do produzido pelo 1eq£it para os dados do Exemplo 47. 4.17 O programa doy, no Exemplo 43, calcula o dia do ano associado a um més, dia e ano, Aquele programa nao verifica se a data fornecida pelo usuario é valida le aceita valores absurdos para meses e dias, ¢ 0s célculos com esses valores produzem resultados desprovidos de significado. Modifique o programa para verificar os valores forecidos antes de utilizé-los. Se as entradas forem invé- lidas, 0 programa deve informar ao usuérioo que estd errado e encerrar a exe ccucio. O ano deve ser um ruimero maior que zero, 0 més precisa ser um niimero entre 1¢ 12 €0 dia deve ser um nimero entre 1 e um maximo que dependa do ‘més. Utilize uma construgio switch para implementar os limites para o dia. 4.18 Escreva um programa MATLAB para avaliar a fungio) 1 yey =n para qualquer valor de x fornecido pelo usuétio, onde In é 0 logaritmo natu- ral (logaritmo na base e). Escreva o programa com um lago whe, a fim de {que © programa repita o célculo para cade valor legal de x fornecido para o programa. Quando um valor ilegal de x for fornecido, encerre o programa, (Qualquer x 2 1 é um valor ilegal.) 4.19 Naimeros de Fibonacci. © n-Gsimo ntimero de Fibonacci é definido pelas equagies recursivas abaixo: fay=t $Q)=2 f(t) = fn) + f(r -2) Portanto,f(3)=/(2)+f(l) =2+ 1 =3,¢ assim por diante, para ntimeros maiores Escreva um arquivo M para calcular e imprimir 0 n-ésimo mimero de Fibonacci para n > 2, onde n 6 fornecido pelo usuério. Utilize um lago whi le para efetuar o célculo. =|le “4 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 44 é dada pela equagso (413) 421 Figura 4.5 Captte 4 isgor | 181 voltagem no diodo, em volts orrente no diode, em amps perda de corrente no diodo, em amps carga de um elétron, 1,602 x 10-1 eoulombs k = constante de Boltzmann 138 x 10° joule/K T = temperatura, em kelvins (K) [A perda de corrente , do diodo 6 de 2.0 A. Esreva um programa que calculea corrente através do diodo para todas as voltagens de 1,0 V a +06 V, com inter ‘alos de 0,1 V. Repita esse processo para as seguintes temperaturas: 75°F, 100°F © 15°F, Cie um diagrama da corrente como fungio da vltagem aplicac, com as curvas para a tts diferentes temperaturas aparecendo encores diferentes ‘Tensio em um Cabo. Um objeto de 200 libras deve ser pendurado na ponta de um eixo rigido horizontal com 8 pés de comprimento e peso desprezivel, conforme mostrado na Figura 4.5. O eixo estd afixado na parede por um pi 6 suportado por um cabo de 8 pés de comprimento preso um poucoacima nna parede, A tensio nesse cabo é dada pela equacio Wiles (414) aVip-& onde T é a tensdo no cabo, W é 0 peso do objeto, Ic 0 comprimento do cabo, Ip 6 0 comprimento do eixo e d ¢ a distincia no eixo que indica o ponto de afixagio do cabo. Escreva um programa para determinar a distincia d para afixar 0 cabo no eixo, minimizando a tensio no cabo. Para isso, 0 rograma deve calcular a tensio no cabo em intervalos regulares de 1 pé, de = 1 até d=7 pés, e localizar a posigio d que produza a tensdo minima. O programa deve também desenhar a tensio do cabo como fungio de d, com titulos e legendas apropriadas para 08 eixos. [Um peso de 200 libras suspenso por uma barra rigida, suportada por um cabo. 182 | Prranucae om MATLA® pera Enonteros 422 423 424 425 Crescimento de Bactérias. Suponha que um bidlogo efetue um experiimiento de medida da taxa de reprodugio assexuada de um tipo especifico de bac- térias em diferentes meios de cultura. O experimento mostra que no Meio A as bactérias se reproduzem uma vez a cada 60 minutos, ¢ uma vez a cada 90 minutos no Meio B. Assuma que uma vinica bactéria éeja colocada em um. ‘meio de cultura no inicio do experimento. Esereva um programa para calcular ce desenhar o nimero de bactérias presentes em cada cultura em intervalos de tnés horas, do inicio do experimento até completar 24 horas. Faca dois desenhos, ‘um com eixos xy lineares e um linear-log (semi logy). Como se comparam. ‘as quantidades de bactérias nos dois meios apés 24 horas? Decibéis. Os engenheitos freqiientemente medem a razdo entre duas me: didas de poténcia em decibvis, ou dB. A equacao da razdo entre duas medidas de poténcia em decibéis é B= 10 log, (415) onde P; & a poténcia medida e P, é uma medida de referéncia. Assumindo que a poténcia de referéncia P, seja de 1 watt, escreva um programa para cal- cular o nivel 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. Média Geométrica. A média geométrica de um conjunto de miimeros de x; até x, € definida como a raiz-n-ésima do produto dos niimeros média geométrica = Y/x, x3 X5 (4.16) Escreva um programa MATLAB que aceite um ntimero arbitrdrio de valores positivos e calcule a média aritmética e a média geomeétrica dos mimeros. Utilize um lago while para receber os alimeros fornecidos e encerre 0 fomecimento com um nvimero negativo. Teste seu programa calculando as médias aritmética e geométrica dos ruimeros 10, 5, 2€ 5. Média RMS. A méia de ric quarada ems) 6 outra mantra de calclar uma trédin par ina coop de rtmaros, Arméua ym de urn os de meres ¢ a iz quadeada da mei nti dos quadtados dos mesos ie médiarms = 5 5x? (47) Escreva um programa MATLAB que aceite um ntimero arbitrétio de valores positivos ecalculea média rms dos mimeros. Solicite ao usudrio o ruimero de valores a serem fornecidos e utilize um lago for para ler os niimeros. Teste seu programa calculando a média rms dos ntimeros 10, 5,25. Média Harménica. A media harmdnica 6 ainda outra maneira de calcular uma ‘média para uma colegio de ntimeros, A média harmdnica de uma colegio de niimeros é dada pela equagio média harménica = (418) Flgura 4.8, Captule «ise | 188 Escreva um programa MATLAB que aceite um nimero arbitrétio de ni _meros positivos e calcule a média harménica dos niimeros. Utilize qualquer meétodo que voc® preferir para ler os valores de entrada. Teste seu programa caleulando a média harménica dos niimeros 10, 5,25. 4.27 Escreva um tinico programa que calcule as médias aritmética, mms, geomé- trica e harménica para uma colegio de nimeros positives. Utilize o método que vocé preferir para ler os dados de entrada. Compare esses valores para as seguintes colegbes de niimeros: a AAAS b43,45,4.3,5 eC ALA7417 A234 5,67 - ‘Um sistema eletrinico composto de tréssubsistemas com TMEFs conhecidos, 4.28 Tempo Médio entre Fathas. A confiabilidade de um equipamento cletrénico ‘em geral medida em termos do tempo médio entre falhas (TMEF) ~0 tempo :meédio que 0 equipamento pode operar antes de ocorrer uma falha, Para sis- temas grandes compostos de diversos equipamentos eletrénicos, & usual programa final. Felizmente, 0 MATLAB tem um mecanismo especial projetado para faciltar 0 desenvolvimento e a depuracio de subtarefas independentemente, antes de construir ‘programa final. E possivel codificar cada subtarefa como uma funga0 separada, e cada fungio pode ser testada e depurada independentemente das outras no programa, -FungSes bem-projetadas reduzem enormemente o esforgo requerido em um grande projeto de programagio, Dentre os beneficios das fungbes bem-projetadas, temos: 1. Teste Independente das Subtarefas ‘Cada subtarefa pode ser escrita como uma unidadle independente. A subtarefa pode ‘ef testada soparadamente para garantir o bom funcionamento antes de combind-a zo programa maior. Esse passo 6 conhecido como teste unitario. Ele elimina uma fonte importante de problemas antes mesmo de construir 0 programa final 2. Cédigo Reutilizével Em muitos casos, a mesma subtarefa bisica 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 emt 486. | rogama;so wm Marae” para Engensivos ‘outros programas. Podemos projetar, codificar, testar e depurar uma fungdo ppara a ordenasio, e entio reutilizar essa fungio toda vez que a ordenagao for necesséria, Esse cédigo reutilizével tem duas vantagens principais: reduz 0 tesforgo total de programacio requerido e simplifica a depuracio, jé que @ fungio de ordenacio precisa ser depurada somente uma vez. 3. Isolamento de Efeitos Colaterais Indesejados {As fungdes recebem dados do programa, que as invoca por meio de uma lista de variaveis denominada lista de argumentos de entrada, e retorna os resultados para o programa por meio de uma lista de argumentos de saida. As sinicas ‘arifoeis do programa que podem ser vistas pela fungto so aquelas na lista de argu: ‘mentos de entrada, a tnicas varidves da funda que podem ser vistas pelo programa so aquelas a lista de argumentos de saida, Isso & muito importante, pois os erros acidentais de programagio dentro de uma fungao podem somente afetar as variaveis dentro da fungdo onde ocorreu 0 erro. Quando um programa grande é escrito lberado para uso, ele precisa ser mantido, ‘A mantitencio de programas envolve consertar bugs e modifica o programa para lidar ‘com cifeunstincias novas ¢ inicialmente lo previstas. O programador que modifica lum programa durante a manutencio freqientemente nao é a pessoa que originalmente © escreveu, Em um programa mal-escrito, € comum que o programador que modifica tfetue Kina alteragio em uma regiio do cédigo e essa alteragdo provogue efeitos cola- terais idesejados em partes totalmente diferentes éo programa. Isso ocorre porque rnomes Mle varidveis slo reutilizados em partes diferentes do programa. Quando 0 pro- ‘gramador altera os valores em algumas das varidveis, eles s30 acidentalmente captu- rados ¢ uilizados em outras partes do cédigo. (© uso de fungées bemprojetadas minimiza esse problema pela ocultagio de dados. ‘As varigveis no programa principal nio slo visiveis para a fung3o (exceto aquelas na lista de argumentos de entrada) nem podem ser acidentaimente modificadas por algo que ‘ocorra dentro da fungio. Assim, eros ou alteragdes nas variaveis da fungao nao podem acidenfalmente provocar efeitos colaterais indesejados em outras partes do programa. Quebre em fungées grandes tarefas no programa, sempre que isso for itil para os importantes beneficios do teste independente dos componentes, da reutilizagao e do isolaménto de efeitos colaterais indesejados. ESE SR 5.1. Ihtrodupdo a Fungdes MATLAB Todos 6s arquivos M vistos até aqui foram arquivos de script. Arquivos de script sto simplemente colegdes de declaracies MATLAB armazenadas em um arquivo. Quando wm arquivs de script € executado, 0 resultado é 0 mesmo de executar todos os comandos Caple Fonges Otis pol usuio | 187 diretamente pela Janela de Comandos. Arquivos de script compartilham 0 espago de trabalho da Janela de Comandos, assim, qualquer variével definida antes de 0 arquivo de script iniciar a execugao é vistvel para ele, e as varidveis por ele criadas permanecem ‘no espaco de trabalho aps o término da execucio do arquivo. Um arquivo de script no tem argumentos de entrada e ndo retorna resultados, mas os arquivos de script podem se comunicar entre si pelos dados deixados no espaco de trabalho. Em contraste, uma fungio MATLAB ¢ um tipo especial de arquivo M executado ‘em um espago de trabalho independente. Fla recebe dados de entrada por meio de uma lista de argumentos de entrada, ¢ retora resultados por uma lista de argumentes de ssafda, A forma geral de uma fun¢io MATLAB é function foutarg1, outarg2, ...] = fname (inargl, inarg2, ...) eH) comentario — a % Mais um conentério (Cédigo executével) (eeturn) A declaragio funct ion determina o inicio da fungéo. Fla especifica o nome da funcio eas listas de argumentos de entrada e de saida. A lista de argumentos de entrada aparece entre parénteses apés o nome da funcio, ea lista de argumentos de saida aparece entre colchetes a esquerda do sinal de igual. (Se existir somente um argumento de safda, os colchetes sio dispensiveis.) ‘Alista de argumentos de entrada ¢ uma lista de nomes que representam os valores que serio passados por quem ativou a fungio, Esses nomes sio chamados argumentos soltos, Si marcadores para os valores efetivamente passados pelo ativador quando a fungio € invocada, Similarmente, a lista de argumentos de saida contém uma lista de argumentos soltos que sio marcadores para os valores retornados para o ativador quando a fungio termina a sua execusio. ‘Uma fungao é invocada utilizando 0 seu nome em uma expressio, juntamentecom ‘uma lista de argumentos efetivos. Uma funcao pode ser invocada pela digitagao do seu nome diretamente na Janela de Comandos, ou pela inclusdo do seu nome em um arcuivo de script ou em outra fungio. Quando a fungio ¢ invecada, © valor do primeiro argu- ‘mento efetivo passa para o primeiro argumento soto, e assim por diante, para cada par argumento efetivo/ argumento solto. ‘A execugio comesa no topo da fungio e para quando encontra uma declaragdo return ow 0 final da fungio. Como a execucio é encerrada de qualquer maneira no final da fungio, a declaragio return nao é na realidade obrigat6ria na maiorie das fungSes, e por isso é usada raramente. Cada item na lista de argumentos de saida pre- isa aparecer & esquerda de pelo menos uma declaragio de atribuigio na funcéo, ‘Quando a fungdo termina, os valores armazenados na lista de argumentos cle safda so retomados para o ativador e podem ser utilizados em outros cileulos ‘As linhas iniciais de comentarios em uma fungio tém um objetivo especial. A primeira linha de comentario depois da declaragio de funcio é a linha de comentirio HL. Ela deve sempre conter um resumo ~ de uma linha ~ do objetivo da fungio. A importncia especial dessa funcio decorre de ela ser encontrada ¢ exibida pelo comando 1 Prgamagto en MATLAB pre Engeaias Captains Furres Olas ol Usuio | 189 ookfor. As linhas de comentérios que vio da linha H1 até a primeira linha em bran co ou a primeira declaragio executével sio exibidas pelo comando help e pela Janela de Ajuda. Elas devem conter um resumo breve de camo utilizar a fungio. ‘Um exemplo simples de funsio definida pelo usuério é apresentado abaixo. A fangio dist? calcula a distancia entre os pontos (x, ¥,) € (% y;) em um sistema de coordenadas cartesianas. @ Get input data, Gisp(‘Calculate the distance between two points:’) ax = input (‘Enter x value of point a: ") ay = input (‘enter y value of point ns bx = input (‘Enter x value of point oY: by = input (‘Enter y value of point 4 function distance = dist2 (x1, yl, x2, y2) 4 Evaluate function 1 a a ae fet {'Drst® calculete the dlacance between too poinea Peoule saise? (er ay, be, bys $ function DISH? coleulates the distance Between renee Gis ox tsp pointe (el-y2) y Eprints (the distance between points ¢ and b is 86\n! result): : _ sntnen . md ese mquiVs de spr eee; aes dS 56 % Calling sequence: ie ‘Quand a pt tad lt Breen Gaston, yl, x2, 92) Bw test ateta 4 Detine variables: IE Gateutate the aiscance between two points 2 2 Lpocieien Se pein: 2 Eater x value of point bs 4 t Hacance 2: Bisvance’betresn points Tos elcance betenen pote 9 nd 9 Se s.c00%0 & Record 9f revisions: FF cae minds eto contin, conor podanos vie om bo ogee Srogrenmer Description of change 1 simp : i sma : Sova t2 amb dl supote osubsitema de ajuda do MATLAB. Se dig % 12/15/98 S. J. Chapman’ Original code \p ‘A fungio di.st2 também dé suporte 20 subsistema de ajuda do M: Sedigt tarmos “help dist2”, os resultados serdo: & Calculate distance. distance = sqrt ((x2-x1} .*2 4 (y2-yi).42)7 » help dist? ssa fungo tem quatro agumentos de entrada eum argumento de sada, Um arquivo DIST2 Calculate the distance between two points sm fun tem quatro arguments de ntada ¢ um argument pe Function DIst2 calculates. the distance between two pone {x1yyi) and (2sy2) in a cartesian 4 script file: test _dist.n i coordinate oysten ‘ carting sequence: * purpose: : t "this program tests function dist. E res = dist2(x1, yl, x2, y2) ‘ ® ———_Demaneira similar, se digitamos “lookfor distance”, oberemos o resultado § Record of revisions ‘ * pate Programmer Description of change ' » lookfor distance : : : : oe Diste Calculate the distance between two points co 12/15/98 S$. J. Chapman Original code = MAHAL Mahalanobis distance. ————_—_. ‘ F Drs? Distances, between vectors & betine variables: NUDIsT Neighborhood matrix using vector distance: Bax == x-position of a le NEGRID Neighborhood matrix ueing grid distance. tay -- y-position of a bag NBMAN Neighborhood matrix using Manhattan-distance. & bx -> x-position of b z 2 by =. y-position of b = Para observar o comportamento do espaco de trabalho antes, durante e apds a exe- $ resait “2 Bistance between the points t casio da angio, vemos caregaa Fangio dist2 arquivo de spt cost. iet2 Mo 190 | Proyamapsoem MATLAB? sus Ergenteres disp(‘Celculete the distance between two pointes"); 7 value Sf point Femuies aise? (en aye bey by)? Ef] trcinee ome sistance between point Figura 1 ArquivoM test_diet? e fungio dist2 carregados no depurador, com pontos de Iinspecdo antes, durante e apés a chamadada fungi. depurador MATLAB, e ajustarmos os pontos de inspecio para antes, durante e apés a chamada da fungao (ver Figura 5.1). Quando um programa para no ponto de inspesao antes da chamada da funeio, o espago de trabalho fica como mostra a Figura 5.2(a). Note ‘que as varidveis ax, ay, bx e by estio definidas no espago de trabalho. Quando pro ‘grama pra no ponto de inspego dentro da chamada da fungio, 0 espago de trabalho fica como mostra a Figura 5.2(6). Note que as variaveis x1, x2, y1, y2 e distance esto definidas no espaco de trabalho, e que as varidveis definidas no arquivo M ativador desapareceram. Quando o programa péra no ponto de inspeco apés a chamada da fungio, 0 espaco de trabalho fica como mostra a Figura 5.2(c). Observe que as varidveis originais estio de volta, com a varidvel result adicionada para conter 0 valor retor- nado pela fungao. Essas figuras mostram que o espace de trabalho da fungio é diferente do espago de trabalho do arquivo M ativador. el em mo cetera em Figura 6.2 aptate§ rugs Oetinas polo euiio | 194 Ber loa lente ater Be Int fo femtae seep er Ina |e fertue acer i Bu Joao Yente war Ea jit fo faraie arene En la fs fate ater Be imate eeey (@) © espago de trabalho antes da chamada da fungi. (b) © espago de trbatho durante a chamada da fungao, c) © espago de trabalho apds a chamada da fancio, 192 | Proganapio am MATLAB par Egos 5.2 Passagem de Varidveis em MATLAB: Esquema de Passagem por Valor (Os programas MATLAB se comunicam com suas fungSes utilizando um esquema de passage por valor. Quando ocorre uma chamada de fungdo, o MATLAB faz uma cépia dos argumentos e os passa para a funcio, Essa c6pia é muito significativa: mesmo se a fun¢io modificar os argumentos de entrada, ela nio afetard os dados originais no ati vador. Isso ajuda a prevenir efeitos colaterais indesejéveis em que um erro na funcio possa modificar de maneira nio intencional as varidveis no programa ativador. Esse comportamento ¢ ilustrado na fungSo a seguir, Essa fungio tem dois argumentos de entrada: a e b. Durante os calculos, ela modifica as dois argumentos de entrada, function out = sample(a, b) fprint£(‘Bxemplo durante: a = $f, b= $f 8£\n",a,b); a= bU1) + 2tar beat b out = a+ BU); fprint£(/Bxemplo durante: a = &f, b = $f €£\n",a,b) Um programa de teste simples para chamar essa fungio é apresentado abaixo. a= 2 b= (64 fprint£(“Bxemplo out = sample(a,b); fprintt(‘Bxemplo fpeint£(‘Exemplo antes: a = tf, b= tf *£\n",a,b); depois: a depois: out SE, b= tf B£\n a,b); £\n" out): Quando esse programa é executado, 0s resultados sic progr » test_sample Exemplo antes: a = 2.000000, b = 6.000000 4.000000 durante: a = 2.000000, b = 6.000000 4.000000 durante: a = 10,000000, b = 60.000000 40.000000 depois: a = 2.000000, b - 6.000000 4.000000 Bxemplo depois: out = 70.000000 Note que a ¢ b foram modificadas durante a execucio da fungio sample, mas essas rmudangas no tiveram efeto sobre os valores no programa ativador. Usudrios da linguagem C devem estar familiarizados com o esquema de passagem por valor, pois C utiliza esse esquema para os valores escalares paséados para funbes. Entretanto, C ndo utiliza o esquema de passagem por valor para matrizes, assim, uma modificasao indesejével para uma matriz solta em uma fungio C provoca efeitos cola- terais no programa ativador. O MATLAB € uma melhoria nesse sentido, pois utiliza a ppassagem por valor tanto para escalares como para matrizes.) "A implementagéo da pasagem de argumentos em MATLAB é na realidade mais sofsticada do que esa discuss sugere Conforme apontado acima, a <6pinesocida com a passagem por vale ops bastante tempo, mas protege contra leit clatrais indeseives. O MATLAB na residade wliza © ' i i i : i t i é E Ponies Capule Frye nts plo tsa | 198 Figura 8.3 Um ponto P em um plano cartesiano pode ser localizado por suas coordenadas retangulares (xy), ou por suas coordenadas polares (8) » _ Exemplo 5.1 ~ Conversio de Retangular para Polar A localizagio de um ponto em um plano cartesiano pode ser expressa por coordenadas teangulares (2) 0 eoordenadas polars (8) contorme moneade fa Fgura 83-8 Tago entre ears dois conjnton de urdenades da pr ests equasbe xoreos6 6) yersing (62) reveey (63) tani 6) Escreva duas fungies, rect2polar e polar2rect, que convertam coordenadas de retangular para polar, e vice-versa, com o Angulo @ expresso em graus. Solugdo ‘Vamos agora aplicar nossa abordagem-padrio para resolugto de problemas, € assim criar essas fungies. Note que as funsbes trigonométricas do MATLAB utilizam radianos, melhor das duas abordagens el nals cada argument de cada fang e determina sea fungo mo- ifn ou nio 6 argumento Se afungio modifica o arguments, © MATLAB o copia, Sea fungio no ‘modiin 0 angumento, © MATLAB simplesmente apontso valor exstente no programa ativador Es priticaacelerao programa e preserva protegso contra efeitos clatersis 194 |. Posremacéo em MATAR® pus Engentcas Cale 5 Fg cetinas pol sur | 195; ‘entio precisamos converter de graus para radianos, ¢ vice-versa, na resolugio desse problema, A relagao bdsica entre graus e radianos € Record oF ¥Evisions: Programmer Description of change 180° = m radianos 65) 1. Estabelega o problema Uma descrigso sucinta do problema é: Escreva uma fiengdo para converter uma localizapdo em um plano cartesiano, expressa emt coordenadas retangulares, nas coordenadas polarescorrespondentes, com o angulo 8 expresso ena grus. Escreva também uma funeio para converter wma localizagio em wn plano cartesiano,expressa em coordenadas polares, com o ngulo 8 expresso em graus, nas coordenadas retangulares correspondentes.. 2. Defina as entradas e saidas 4 tijsouimateoe npn . . Date ' ’ 99/19/00 S. J. Chapman original code x «Ft cos(theta * pi/180); y = © * sin(theta * pi/180); (© cédigo MATLAB para a funglo rect 2polar aparece a seguir, function [r, theta] = rectapolar(x,y) SRECT2POLAR Convert rectangular to polar coordinates % Function RECT2POLAR accepts: the rectengular coordinates _% (x.yl and converte them into the polar coordinates ——— ‘As entradas para a fungio rect 2pol.ar sie a localizacio retangular (xy) de um % (r;theta], where theta is expressed in degrees pponto. As safdas da fungio s3o a localizacio polar (r, 8) do ponto. As entradas ‘ da fungio polar2rect sio a localizagio polar (7, 8) de um ponto. As saidas da & calling sequence: fungio sao a localizagéo retangular (x,y) de ponto. % le, theta) + rect2pelar(x.¥) 3. Desereva o algoritmo % Define variables: Essas fungBes sG0 muito simples, entio podemos escrever diretamente 0 eo ~~ Hength of polar vector pseudocédigo para clas. O pseudocédigo para a fungio polaz2rect é % theta =~ Angle of vector in degrees x @ £ © cositheta * pi/190) tos = Nrposition of point y @ x * sin(theta * pi/180) y -~ y-position of point i" % Record of revisions © pseudocédigo para a fungéo rect 2polar utiliza a fungdo atan2, pois bs Aaquela fungio opera nos quatro quadrantes do plano cartesiano. (Procure essa fobs Programmer Description of change fungao nos sistemas de ajuda do MATLAB!) seenananes ae S 09/13/00 8. J, Chapman Original code Be sart( x42 + y 82) theta © 180/pi * atan2(y,x) 4. Transforme o algoritmo em declarages MATLAB cédigo MATLAB para a fungo polar2rect € este: function (x, ¥] = polar2rect(r, theta) POLARQRECT Convert rectangular to polar coordinates @ Function POLARZRECT accepts the polar coordinates (r, theta), where theta is expressed in degrees and converts them into the rectangular coordinates bey) calling sequence ete bent ros sqrt( x24 y 112) theta = 180/pi * atan2(y,x) Observe que essas duas fungdes incluem informagio de ajuda, por isso fun (x, thetal » rectapoler(-4,3) para 0 maior) ou descendente (do maior para © menor). Por exemplo, suponha que voce seja um zodlogo estudando uma grande populagdo de animais e queira identificar os 5 5% da populacio com os maiores animais. A forma mais direta de abordar esse proble- meta rma seria ordenar em ordem ascendente os tamarthos de todos os animais na populagio ae pegar 08 5% de valores mais altos » (x, thetal + rectzpolar(-4,-3) ‘Ordenar dados em ordem asoendente ou descendente parece ser uma tarefa facil. re 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 thee ot (10, 3, 6, 4, 9) para encontrar © menor valor na lista, (3), depois varremos os dados Ain nH free restantes (10, 6, 4, 9) para encontrar o menor valor seguinte, (4), e continuamos até que toda a lista estjaordenada, [Na realidade, ordenar pode ser uma taefa bastante dif. Com o crescimentn da “ates TP qishtdadedewaloe seem ordenados,o tempo requeio pare exectr en ela 5 simples descrita acima cresce rapidamente, pois precisamos varrer 0 conjunt los de mee 5699 ples descrit spidamente, pois pi junto de dadas dé » (x, thetal © rectapolar(4,—3) entrada uma vez para cada valor colocado em ordem. Para conjuntos de dados muito = fer i > Polerarect (5136-4699) | grandes ease tania demora mut para ser considerada pea, Pio como vamon ooo = ordenar os dados se houver miimeros em demasia que no caibam todos na meméria 4 do computador? O desenvolvimento de ténicas efcientes para ordenagio de grandes Ys yo00 |= conjuntos de dados ¢ uma érea atva de pesquisase assunto de disiplinas académicas > bx, ¥) = Polarzrect (5/143, \E porsiss. » bey] = Polarzrect ( s302) ie esse exemplo, vamos nos confinar ao algoritmo mais simples possivel para 4.0000 ilustrar o conceito de ordenagio. Esse algoritmo muito simples € denominado orde- _ |= nagdo por selesio. Ele é simplesmente uma implementagio em computador da 3.0000 rmatematica mental descrita acima. O algoritmo basico para a ordenacio por seecio & » tx, yl = Polardrect (5,~143.1301) apresentado a seguir 1. Percorra a lista de niimeros para localizar o menor valor nela. Coloque esse ~4,0000 | Calor no coego da Ita, tocando con valor que ever orignimente vo ooo | nesta posto Seo valor a feted ita foro manor no fage nada - E 2. Percora alsa de nimeree da posigo 260 fina pare localiza 0 prixino > ta, ¥) * potararect(5,-36,8699) F Inenor ala ist, Coloyue ee elena pain 2a ta tocando om veo | @ rc ra io Se erro 2 stern YS jo00 Ta. Peron lista de nimeros da posgio 3 até ofr para lcaizaroteeiro > ‘enor valor na lit, Coloqe ete valor na posgio 3 a ists, tocando com . 0 valor atualnesa posi, So valor na poigho 3 estivernesa posi, no ssas funs8es aparentemente funcionam cocretamente em todos os quadrantes faca nada, P r x pe do plano eaten ‘ 4. Repita ese proceso até a penitina posgfo da lta ser alangads,ApSs processar a peniitima posicio da lista-a anlenagia estard completa. Note que, se estivermos ordenando N valores, 0 algoritmo de ordenagio requer [N-1 percursos por meio dos dados para completar a ordenagio. sce processo esta ilustrado na Figura 54. Como temas cinco valores para ordenar no conjunto de dados, vamos percorrer quatro vezes os dados. No pri- :meiro percurso pelo conjunto de dados, o valor minimo & 3, entdo 03 6 rocado ‘com 0 10, que ocupa a posigao 1. A segunda passada procura 0 valor minimo nas posiges de 2a 5.0 minimo € 4, entdo 0 4 6 trocado com o 10, que ocupa a Exomplo 5.2 ~ Orfenands Dados Em muitas aplicas®es cientificas e de engenharia, é necessério ordenar um conjunto de dados de entrada Para que os miimeros fiquem todos em ordem ascendente (do menor rary a ee ee i i i / i i 198 | Progaraceo om meres por Ege Posigdo 2: terceira passada procura o valor minimo nas posigées de 3 a 5.0 minimo é 6, que jd est na posigao 3, entio nenhuma troca é efetuada, Final- ‘mente, a quarta passada procura o valor minimo nas posigées de 4 a, O minimo €9, entio 0 9 é trocado com o 10 na posigio 4, ea ordenagio esté completa, © algoritmo de ordenagio por selegdo 6 0 algoritmo de ordenagio mais fécil de en- tender, mas ele é computacionalmente ineficiente. Ele nunca deve ser aplicado a grandes conjuntos de dados (por exemplo, conjuntos com mais de 1.000 elementos). Ao longo dos anos, os cientistas de computagio tém desenvolvido algoritmos de ordenacio muito mais eficientes, As fungSes sort e sor trows definidas no MATLAB sao extremamente eficientes e devem ser utilizadas em situagbes reais. ES ‘Vamos agora desenvolver um programa para ler um conjunto de dados da Janela de Comandos, ordené-los em ordem ascendente e exibir 0 conjunto ordenado de dados. ‘A ordenagio serd efetuada por uma fungio separada definida pelo usuario. =a — Se 4 EDEN EL LE . Figura 8.6 Um exemplo que demonstra o algoritma de ardenasto por selesio. Solugao Esse programa precisa ser capaz de solicitar do usuério os dados de entrada, ordenar esses dados e apresentar os daclos ordenados. O proceso de projetar a solugdo desse problema ¢ apresentado a seguir. 1. Descreva 0 problema Ainda no especificamos 0 tipo dos dados a serem ordenados. Se os dados forem numéricos, entéo o problema pode ser apresentado da seguinte maneira, Captains Funes otis elo lsutio | 199 Desenvolva um programa para ler um numero arbitrério de valores numérico da Janela de Comandas, ordenar os dados em ordem ascendente, ttilizando uma fungao de ordenagao separada, e escrever os dados ordenados na Janela de Comandos, . Defina os dados de entrada e de saida (Os dados de entrada sao valores numéricos digitados pelo usurio na Janela de ‘Comandos. A saida sao 0s dados ordenados escritos na Janela de Comandos. Descreva o algoritmo Esse programa pode ser quebrado em trés grandes passos: Leia os dados de entrada ¢ coloque-os em uma matriz ordem ascendente dados ordenados ‘Apresente os primeiro passo ¢ ler os dados. Precisamos solicitar do usuario o muimero de valores a serem fornecidos, ¢ entio ler os dados. Como saberemos quantos va~ lores serdo lidos, um lago for € apropriado para alleitura dos dados. © pseudo- digo detathado é este: Solicite do usuério a quantidade de v Leia a quantidade de valores Pré-aloque una matriz de entrada for ii = 1:mimero de valores Solicite © préxino valor Leia © valor end A seguir, precisamos ordenar 0s dados utilizando uma fungio separada, Preci- 1 vezes pelos dads, buscanlo o menor valor remanes- izaremos um ponteiro para localizar © menor valor de ‘cada passada. Encontrado 0 menor valor, ele erd trocado com o topo da lista se ainda nio estiver lé. O pseudocédigo detalhado é apresentado a seguir: 4d = Linvals-1 % Encontre o valor minimo de a(ii) a a(nvale) iptr © ii for jj = ii+1 to nvals if a(j) < aliptr) iptr © 35 end end % iptr agora aponta para_osencr valor—assim-troque a(iptr) $e alii) se iptr ~= it. if ii -= iper tenp © ati) aii) © aliptr) a(iptr) © teap end 200 | Proamagsaem MATAbe pee Emereins © passo final é apresentar os valores ordenados. Nao precisamos refinar 0 pseudoosdigo para esse passo. O pseudocédigo final é a combinagao de ler, ‘ordenar e apresentar o resultado. 4. Transforme o algoritmo em declaragées MATLAB ‘Océdigo MATLAB para a funcio de orclenacio por selecio é apresentado a seguir. function out = ssortia) SORT Selection sort data in ascending order Date Description of change Programmer % Function SSORT sorts a numeric data set into & ascending order. Note that the selection sorte 8 is relatively inefficient. Do NOT USE THIS FUNCTION FOR LARGE DATA SETS. Use MATLAB’ Ss @ “sort” function instead @ Define variables: . aoa Input array to sort ea Index variable % iper Pointer to min value 853 Index variable a nvals Nunber of values in “a” & out, Sorted output array % temp —--- Temp variable for swapping @ Record of revisions: a e * 32/18/98 Original code 4 Get the length of the array to sort avals = size(a,2: © sort the input array for ii - l:nvals-1 8. J. Chapman» % Find the minimum value in a(ii) through a(n) iptr = dir for jj = iist:nvals if a(j) < aliptr) iptr = 33 end end 3 iptr now points to the minimum value, so swap a(iptr) @ with alii) if ii 2 iptr. Le ii == sper temp = a(iids ail = alipte); a(iptr) = temp; end end Pass data back to caller out = a; {oon a {aT apa F z i aptlos Fangs cntinas plo satin | 201 (© programa para ativar a fungéo de ordenagdo por selegio € apresentado a seguir. % Script file: test_ssort.m a © Purpose: % To read in an input data set, sort it into ascending % order using the selection sort algoziths, and to % write the sorted data to the Comnand Window. This % program calls function "ssort* to do the actual & sorting. % - ‘© Record of Yevisiona: a pate Progranmer Description of change e . co 8 12/19/98 S. J. Chapman original code ® & Define variables: & array Input data array eu Index variable % nvais Nunber of input values % sorted -- Sorted data array t Prompt for the number of values in the data set vals = input ("Enter nunber of values to sort: ‘1; % Preallocate array array = zeros(1,nvals); % Get input values for ii = linvals % Prompt for next value string = [‘Enter value ‘ int2etr(ii) array(ii) = input(string) ; end @ Now sort the data sorted = ssort (array); & Display the so: esult fprint£("\nsorted data:\n') for ii = l:nvals fprinté(’ $8.4£\n",sorted(ii)): end 5. Teste o programa Para testar esse programa, vamos criar um conjunto de dados de entrada e exe- ‘cutar 0 programa. O conjunto de dados deve conter uma mistura de valores 202 | Prgarapso em MATAB® para Engentios positivos e negativos e pelo menos um valor duplicado para verificar se 0 pro- ‘grama funciona corretamente nessas circunstancias. > teat_saort Enter Enter value Enter value Enter value Enter value number of values to sort: 6 Enter value Enter value Sorted data: 5.0000 2.0000 2.0000 0.0000 3.0000 4.0000 Q programa fornece a resposta correta para nosso conjunto de dados de teste. Note que ele funciona para niimeros posiivos e negativos, bem como para riimeros repetidos, < 5.3. Argumentos Opcionais Muitas fungées MATLAB dao suporte a argumentos de entrada e de saida opcio- nais. Por exemplo, jé vimos chamadas da fun¢do plot com a quantidade de argu- ‘mentos variando entre dois e sete. Por outro lado, a fun¢o maxx admite um ou dois, argumentos de saida. Se houver somente um argumento de saida, max retorna 0 valor maximo em uma matriz. Se houver dois argumentos de saida, max retorna o valor maximo ¢ a sua localizagéo na matriz. Como as fungSes MATLAB podem saber quantos argumentos de entrada e de saida esto presentes, e como elas ajustam 0 seu comportamento? Existem oito fungdes especiais que podem ser utilizadas pelas fungdes MATLAB para obter informagSes sobre os argumentos opcicnais e informar sobre erros nesses argumentos. Seis dessas fungOes s20 apresentadas aqui; as duas restantes serio apre- sentadas no Capitulo 7, apés estudarmos 0 tipo de dados matriz de células, *nargin ssa fungio retoma 0 niimero de argumentos de entrada uti- lizados na chamada da funcio. snargout Essa fungdo retorna o niimero de argumentos utilizados na ‘chamada da fungio. apie S Fuge cnr ptotesiro | 208 “narachk Essa fungao retorna uma mensagem de erro se uma funcio for chamada com muitos ou poucos argumentos. "error Exibe mensagem de erro e interrompe a execusdo da fungéo que © produziu. Essa funcio ¢ utilizada quando os erros de argu- rmentos sio fatais. "warning Exibe mensagem de aviso e continua a execucio da funcio. Essa fungao € utilizada quando os erros de argumentos néo sao fatais ea execugio pode continuar. Essa fungio retorma o nome atual da variavel que correspende a ‘um niimero de argumento em particular. inputns ‘As fungGes nargine margout podem ser usadas somente dentro de Una HINGES definida pelo usuario. Quando ativadas, elas retornam respectivamente o niimero de argumentos de entrada e de safda. A fungSo nargchk gera uma cadeia de caracteres que contém uma mensagem-padrdo de erro se uma funcio for chamada com muitos ou oucos argumentos. A sintaxe dessa funcio é S:max_args, numargs) ; message = nargchic(min_ai ondemin_args é onimero minimo de argumentos, nax_args 6 0 niimero maximo de argumentos e mun_args é 0 niimero efetivo de argumentos. Se o muimero de argu- ‘mentos estiver fora dos limites admissiveis, uma mensagem-padrio de erro é gerada Seo mimero de argumentos estiver dentro dos limites aceitaveis, uma cadeia de carac- teres vazia é gerada. A fungéo error é uma maneira-padrdo de exibir uma mensagem de erro e inter- romper a fungio definida pelo usuério, provocando um erro. A sintaxe dessa funcio é error (‘msg’), onde mag é uma cadela de caracteres com uma mensagem de erro, Quando error € executada, ela interrompe a fungio em andamento e retorna 0 con- trole para o teclado, exibindo a mensagem de erro na Janela de Comandos. Se a cadeia de caracteres da mensagem estiver vazia, exror no faz nada, ea execugio da fungio continua. Essa fungio opera bem junto com nazgehk, que produz uma cadeia de ca- racteres dle mensagem quando ocorre um erro e uma cadeia de caracteres vazia quando ‘A fungio warning € uma maneira-padrio de exibir uma mensagem de aviso ue inclui a fungio e ruimero da linha onde ocorreu o problema, mas permita que a execugio tenha continuidade. A sintaxe dessa funcéo é warning (‘mag’), onde meg 6 uma cadeia de caracteres que contém uma mensagem de aviso. Se warning é exe- cutada, ela exibe uma mensagem na Janela de Comandos.e apresenta.o nome da fungdo e o niimero da linha que geraram o aviso. Se a cadeia de caracteres da men- sagem estiver vazia, warning ndo faz nada. Em quaisquer das situagées, a exceugdo dda fungao tem continuidade, A fungio inputname retorna 0 nome do argumento utilizado na ativasio de uma fungio. A sintaxe dessa fungio é nome = inputnane(argno) 7 204 | Prgamagso om MATAR? pre gees onde argno é miimero do argumento. Se 0 argumento for uma variével, seu nome € exibido. Se o argumento for uma expressio, essa fungio retorna uma cadeia de carac- teres vazia. Por exemplo, considere a fung30 function myfun(x,y,2) nome = inputname (2) ; disp({‘0 segundo argumento tem o nome ‘ nome]); (Quando essa fungio € ativada, o resultado é » myfun(cachorro, gato) © segundo argunento tem o nome gato » myfun(1,2+gato) © segundo argumento tem o nome ‘A fungio inputnane é stil para ex erros e de avisos. rnomes de argumentos em mensagens de > Exempla 5.3 — Utiizando Argumentos Opeionais, ‘Vamos ilustrar © uso de argumentos opcionais pela criagio de uma fungio que aceita ‘um valor (xy) de coordenadas retangulares e produz uma representagio equivalente em coordenadas polares, composta por uma grandeza e um angulo em graus. A fungao projetada para dar suporte a dois argumentos de entrada, xe y. Entretanto, se somente ‘um argumento for fornecido, a fungao assume que o valor de y é zer0 e segue em frente ‘com 0s célculos. A funcio normalmente retorna a grandeza e o angulo em graus, mas, se apenas um argumento for fornecido, ela retorna somente a grandeza. A fungio é apresentada a seguir. function Imag, angle} = POLAR_VALUE Converts polar_value(x,y) (ey) to (e-theta) Function POLAR_VALUE converts an input (x,y) value into (r,theta), with theta in degrees It illustrates the use of optional arguments iables: ‘ ® . ® & Define 8 e 8 angle =~ Angle in degrees msg, -- Error message mag Magnitude x Input x value ey Input y value (optional) & Record of revieions: e pate Programmer Description of change 8 - - ® 12/16/98 $. 3. Chapman Original code Tee F aA bs a) ania Fangs Dt elotviio. | 205 % Check for a legal number of input argunents. mag = nargchk(1,2/nargin); error (msg); % Tf the y argument is if nargin < 2 v=o end missing, set it to 0. 8 Check for (0,0) input argunents, a warning message. Oeyend and print out if x msgs ‘Both x and y are zero: angle is meaninglessi+;———— warning(mag); end t Now calculate the magnitude. mag = sqrt(x.t2 + y.42)1 % If the second output argument is present, % angle in degrees S£ margout «2 angle = atana(y,x) calculate * 180/pir ‘Vamos testar essa funcio ativando-a repetidamente pela Janela de Comandos. Primeiro, ‘vamos tentar ativar a fungio com poucos ou com muitos arguments. » [mag angle] = polar_value 22? Error using ==> polar_value Not enough input arguments » (mag angle] = polar_value(1,-1,1) 22? Error using ==> polar_value Too many input arguments A funglo apresenta as mensagens de erro apropriadas nos dois casos. Agora, vamos tentar ativar a fungio com um ou dois argumentos de entrada. » (mag angle] = polar_value(1) mag = 1 angle = > (mag angie] = mag polar_value(1,-1) 4142 angle = 45 206 | Prepamapso en MATAB® para Ergenteies ‘A fungio apresenta as respostas corretas nos dois czsos. A seguir, vamos tentar ativar a fungao com um ou dois argumentos de saida. » mag = polar_value(1,-1) mag = 1.4142 » (mag angle] = polar_value(1,~1) mag 1.4142, angle =45 A fungio apresenta a resposta correta nos dois casos. Para finalizar, vamos tentar ativar a fungio com x e y iguais a zero. » (mag angle] = polar_value(0,0} Warning: Both x and y are zero: angle is meaningless! > In d:\book\matlab\chapS\polar_value.m at line 32 nag ° angie = ° [Nese caso, a fungio exibe a mensagem de aviso, mas a execugio ndo ¢ interrompida. < NT Observe que uma fungio MATLAB pode ser declarada para ter mais argumentos de sada que aqueles efetivamente usados, ¢ isso nZo caracteriza um erro. A fungio no precisa verificar nargout para determinar se um argumento de safda esté presente. Por ‘exemplo, considere a seguinte fungao: function [z1, 22 zl- x+y; w= -¥: junk (x.y) Essa fungio pode ser ativada com sucesso utilizando um ou dois argumentos de saida. > a = junk(2,1) 3 lab} Sunk(2,1) 3 1 it fee Tianna {ust 1 aaa i ante 5 Fetes nie el usio | 207 O motivo de verficar nazgout em uma fungio ¢ prevenir trabalho inti. Se um resul- tado nio seré aproveitado, por que calculé-lo? Um programador pode acelerar a ope- racio de um programa ao evitarcélculos desnecessérios. ste teste apresenta uma verificagio répida do seu entendimento dos conceitos apre- sentados nas Segbes 5.1 a 5.3. Se vocé tiver problemas com o teste, releia as secGes, pengunte ao seu professor ou discuta o material com um colega. As respostas podem ser encontradas no final do livro. Ty Oia as diferengas entre um arquivo de sriptewina fungio? 2. Como funciona o comando de ajuda para fungbesdefinidas pelo usudro? 3. Qual aimportanca da inha de comenttio Hi em uma fangio? 4 (© que é um esquema de passagem por valor? Como isso contribui para um bom projeto de programa? 5. Como uma fungio MATLAB pode ser projetada para ter argumentos opcionais? Para as questdes 6 ¢ 7, determine se as ativagdes de fungio sio ou ndo corretas. Se elas contiverem erros, especifique o que esta errado. = testi (6) 6 out, testl (xv) res = sqrt(x.42 + y.*2); test2 (12); function res = test2(x,y) error (nargchk (1, 2,nargin) } if nargin == 2 res = sqrt(x.*2 + y.*2); end 7. ont 5.4 Compartithando Dados pelo Uso.de- Meméria Global Ja vimos que os programas trocam dados com as fungies utilizando listas de argu- ‘mentos. Quando uma fungio é ativada, cada argumento € copiado, ea c6pia éutilizada pela fungio, ‘Além da lista de argumentos, as fungdes MATLAB podem trocar dados entre sie com 0 espago de trabalho bésico, utilizando a meméria global. Meméria global é um tipo especial de meméria que pode ser acessado de qualquer espaco de trabalho. Se 208 | Progranssto.em WATAR® pare Ege ‘uma variével for declarada como global env uma funcio, ela serd colocada na meméria local, nao no espago de trabalho local. Se a mesma varidvel for declarada como global ‘em outra funsd0, essa variavel se referira a mesma localizagio de meméria que a variavel da primeira fungio. Cada arquivo de script ou fungio que dedlarar a varidvel como global tera acesso aos mesmos valores de dados, assim, a memsria global proporcionerd ‘uma maneira de compartlhar dados entre fungées. ‘Uma variavel global 6 declarada por uma declaragéo global. A forma de uma declaragdo global é global varl var? var3 onde vari, var2, var3, e assim por diante, sio as varidveis colocadas na meméria global. Por convenio, as varidveis globais so deciaradas com letras maitisculas, em- ‘bora isso ndo seja requerido pela linguagem. Declare as variaveis globais com letras todas maiisculas, para facilitar que elas sejam diferenciadas das varidveis locais. Cada variével global precisa ser declarada como global antes de ser utilizada pela primeira vez em uma fungio. E um erzo declarar uma variével como global depois de cla ter sido criada no espaco de trabalho local, Para evitar esse erro, costuma-se declarar as variéveis globais imediatamente apés os comentérios iniciais e antes da primeira declaragio exceutavel de uma fungio. Declare as varidveis globais imediatamente apés os comentétios iniciais e antes da primeira declaragao executavel de cada fungio que as utiliza As varisveis globais s20 especialmente viteis para compartilhar grandes volumes de dados entre muitas fungSes, pois 0 conjunto de dados como um todo nao precisa ser copiado cada vez que uma funcio é ativada, O lado ruim de utilizar a meméria global para troca de dados entre fungées € que elas se tomam especificas a um conjunto de dados determinado. Uma funcio que troca dados utilizando argumentos de entrada pode ser reutilizada simplesmente pela sua ativacio com angumentos distintos, mas ‘uma fungio que troca dados utilizando a meméria global precisa ser modificada para funcionar com um conjunto de dados diferente. foot ne eo fi emo som apts § Fp cane eto esto | 200 ‘As vativeisglobas também si tel para compartilar dados ocultos entre un grupo de fungées relacionados, mantendo-osinvsivels para o programa ativador ‘Vocé pode utilizar a meméria global para transmitir dados em grande quantidad: entre fungdes dentro de um programa Exempla 5.4 ~ Gerador de Nimeros Ales E impossivel efetuar medidas perfeitas no mundo real Sempre existe algum rude de medida associado a cada medida, Esse fato é uma consideracio importante no proto de sistemas para controlar a operagio de dispositivos reais como avides,refinaras ec. Um bom projeto de engenharia precisa considerar esses eros de medida, para que o ruido nio leve a comportamentos instéveis (como quedas de avibes ou explosies de efinaras!) (s projetos de engenharia so em sua maioria testados com simulages da operacio dio sistema antes de sua construgio, As simulagdes envolvem a criagio de modelos mate- réticos do comportamento do sistema ea alimentagio desses modelos com dados realis- tas. Se os modelos respondem corretamente aos dados de entrada simulados, poderos ter confianga razodvel que o sistema real responder4 corretamente aos dados reais. (Os dados de entrada simulados fornecidos para os modelos precisam ser cor- rompides com ruidos de medida simulados, ou seja, uma seqiiéncia de mimeros aleatérios acrescentados aos dados ideais. O ruido simulado é em geral produzido por tum gerador de nsimerosaleatrio. ‘Um gerador de mtimeros aleatsrios € uma fungdo que retorna um ntimero distinto ¢ aparentemente aleatério cada vez que ela € ativada. Como os miimeros so na reali- dade gerados por um algoritmo deterministic, eles somente aparentam ser aleatérios? Entretanto, se 0 algoritmo utilizado for complexo o suficente, os ruimeros serio leatrios osuficiente para uso na simulagio. ‘Um algoritmo gerador de riimeros aleatéros simples ¢ apresentado abaixo2 Ele se fundamenta na imprevisibilidade da fungo médulo aplicada a niimeros grandes. Considere a seguinte equacio: gem mod (B12 1 284 1456) 66) 2 Por este motivo, algunas pessoas se referem 2 essa fungSes como getaenet de mires peu sleatirin 2 Ese algortmo é uma adaptago da dicussfo encontrada no Capitulo 7 do lvro Numerical Recipes The Art of Scenic Programing, de Press, Fanwery, Teukolsky e Weteing. Cambridge University Pres, 1986, 210 | Prgamapso wm MATAR” pra Engen: ‘Ascuma que n, soja um inteiro nio negativo. Devido a fungio médulo, ry, seré um ‘vimero de 0a 134.455. Esse valor pode ser utilizado como ne realimentado na equacio para produzir um novo miimero rj, também no intervalo de 0 a 134.455. Esse pro- ‘cesso pode ser repetco indefinidamente para produzir uma série de niimeros no inter- valo [0,134455]. Se ndo tivéssemos informagdo prévia a respeito dos mimeros 8.121, 28.411 e 134.456, seria impossivel adivinhar a ordem em que esses valores de m se- riam produzidos. Além disso, existe uma probabilidade igual (ou uniforme) de aps- recimento de qualquer ntimero dado na seqiéncia. Devido a essas propriedades, a Equacio (56) pode servir de base para um gerador de niimeros aleatérios simples com distribuigio uniforme. ‘Vamos agora utilizar a Equacio (5.6) para projetar um gerador de miimeros aleatérios cuja sada seje um mimero real no intervalo (00, 1.0} Solugdo ‘Vamos escrever uma fungdo que gere um nimero aleatério no intervalo 0 < ran < 1,0 cada vez que € ativada, O ntimezo aleatério serd baseado na equagio Bese onde 7, 6 um ntimero de 0 a 134.455 produzido pela Equagio (5.6). ‘A’seqiiéncia particular produzida pelas equagtes (5.6) e (5.7) dependeré do valor inicial de 1, (conhecido como semente) na seqiiéncia. Precisamos fornecer a0 usustio ‘uma maneira de especificar 7, para que a seqiiéncia possa mudar cada vez.que a funcao for ativada. ram en 1. Estabelega o problema Escreva uma fungo random0 para gerar e setornar uma matriz. ran que con- tenha um ou mais ntimeros com uma distribuicio de probabilidade uniforme no intervalo 0 < ran < 1,0, baseada na seqilincia especificada pelas equagbes (6.6) e (7). A fungao deve ter um ou dois argumentos de entrada (n € m) que especifiquem o tamanho da matriz a ser retornada. Se houver somente um argumento, a funcio deve gerar uma matriz quadrada de tamanho n x_n. Se hhouver dois argumentos, a fun¢io deve gerer uma matriz de tamanhon x n. (© valor inicial da semente n, seré especificado pela ativagio de uma fungio denominada seed. 2. Defina as entradas e saidas TTemos duas fungGes nesse problema: randon0 ¢ seed. A entrada da fungio seed 6 um inteiro que serve como ponto de partida para a sequiéncia, Essa fungZo no tem dados de saica. A entrada da funco random0 so um ou dois. inteiros que especificam o tamanho da matriz de mimeros aleatérios a ser gerada, Se somente um argumento n for fornecido, a fungao deveria gerar ‘uma matriz quadrada de tamanhon xn, Se os dois argumentos » e m forem, 4 Anotasio (0.0, 10) indica que ointervalo de nimerosaleabirios va de 0 10, inelaindo 0 mimero (0, mas excluindo o nero 19. 5 ¥ i i i Wepre Captlo 5 Funes nine po nao | 214 fomecidos, a fungio deve gerar uma matriz de tamanho nx m. A saida dessa fungio é a matriz de valores aleatérios no intervalo (0,0, 1,0). 3. Projete o algoritmo (© pseudoeddigo para a fungio zandom0 function ran = randomd ( n, m } Verifica a validade dos argumentos Se m ndo for fornecido, m © n ia uma matriz de sa{da com a funcao “zeros” for ii = I:ntmero de linhas for jj = l:iimero de colynas D & mod(8121 * ISBED + 26421, 134456) ran(ii,jj) © TSEBD/134456 end end conde o valor de ISEED fica na meméria global para ser regravado a cada ati- ‘vagao da fungao, O pseudocédigo da funsio seed ¢ trivial. function seed ( new_seed ) new_seed « round ( new_seed ) ISEED € abs ( new_seed ) A fungdo round é utilizada para 0 caso de o usuério nao fornecer um inteiro, 2 fungéo de valor absoluto & utilizada para 0 caso de 0 usudrio fornecer um valor negativo. © usudrio no precisa saber que somente inteiros positives 380 somentes validas. A varidvel ZSEED fica na memséria global para ser acessada pelas duas fungdes. 4. Transforme o algoritmo em declaragbes MATLAB A fungio randon0 é apresentada a seguir. function ran = randon0(n,m) SRANDOMO Generate uniform random numbers in (0,1) Function RANDOMO generates an array of uniform random numbers in the range [0,1). The usage random0(n) random0 (1,m) -+ Generate ann x n array Generate an n x m array Define variables: — —_ ub Index variable ISEED Random nuber seed (global) 53 ndex variable By Number of columns msg Error message a Number of rows ran Output array BAZ | Prepancesoem MATAR? pas Enemies % Record of revisions: Progranmer : Date Description of change % 12/16/98 S. J. Chapman Original code % Declare global values global TSzED % Seed for random number generator % Check for a legal number of input arguments. msg = nargchk(1,2,nargin) ; error (msg): % If the m argument is missing, set it ton. nargin < 2 end © Initialize the output arzay ran = zeros(n,m); % Now calculate random values for ii = iim for jj = lim ISEED = mod(B12i*ISEED + 28411, 134456 ); ran(ii,J3) = ISEED / 134456; end end ‘A fungio seed é apresentada a seguir. function seed (new_seed) ESEED Set new seed for function RANDOMO % Function SEED sets a new seed for function RANDOM). The new seed should be a positive integer. Define variables: ISEED ~~ Random number eed (global) new_seed -- New seed Date Programner Description of change 12/16/98. 3. Chapman Original code Declare global values global IsezD % Seed for random number generator % check for a legal number of input arguments. mag = nargchk|t,1,nargin) error (sg): ‘ ® ® . . & Record of zevisions: 2 ® : * & save seed new_seed - roud(new_seed) + TSEED = abs (new_seea) : Caples Fores eta peo Usutro | 243 . Teste os programas MATLAB resultantes Se os mimeros gerados por essas fungSes forem niimeros aleatérios uniforme- mente distibuidos no intervalo 0S ran < 10, a méaia deve ficar pelo de 5, € 0 desvio-padrio deve ficar perto de = Adicionalmente, seo intervalo de 0 a I for dividido em faixas de mesmo tama- rho, o ntimero de valores aleat6rios em cada faixa deve ser aproximadamente ‘o mesmo. Um histograma é um diagrama do miimero de valores em cada faixa, A fungio MATLAB hist cria e desenha um histograma a partir de um conjun- to de dados de entrada. Utilizaremos essa fungdo para verficar a distribuicio dos niimeros aleatérios gerados por randon0. Para testar os resultados dessas funcSes, vamos efetuar os seguintes testes: 1. Ativar seed com new_seed ajustada para 1024 2. Ativar random0 (4) para verificar se 0s resultados aparentam ser aleatrios, 3. Ativar random0 (4) para verificar se os resultados mudam com novas ativagbes, 4, Ativar seed novamente com new_seed ajustada para 1024. 5. Ativar randon0 (4) para verificar se 0s resultados so iguais aos do tem 2 ‘cima. Isso permite verificar se a semente foi ejustada apropriadamente. 6, Ativar random0 (2,3) para verificar se os dois argumentos de entrada estio sendo usados corretamente. 7. Ativar randoni (1, 20000) e calculara média e 0 desvio-padrio do con- junto de dados resultante,ulizando as fungies MATLAB mean e sta ‘Comparar os resultados com 05 © = 8, Criar um histograma dos dados do item 7 para verificar se mimeros aproximadamente iguais de valores ocorrem em cada faixa ‘Vamos efetuar esses testes interativamente, verficando os resultados um a um, > seed (10: » random0 (4) 0.0598 1.0000 0.0905 0.2060 012620 0.6432 0.6325 0.8392 016278 0.5463 0.7551 0.4554, 0.3177 0.9105 9.1289 0.6230, » random0 (4) 0.2266 0.3858 0.5876 9.7880 0.8415 0.9287 0.9855 0.1314 0.0982 0.6585 0.0543 0.4256 0.23870. 71530-2608 0.8827 —— (1024) » random0(4) 0.9598 1.0000 0.0905 9.2060 0.2620 0.6432 0.6325 0.8392 0.6278 0.5463 0.7551 0.4554 0.3177 0.9105 011289 0.6230 214 |. Programogéo wn MATABS para Eourlos » randon0 (2,3) 0.2266 0.3858 0.5876 0.7880 0.8415 0.9287 » arr = random0(1,20000) » mean (arr) 0.5020 » std(arr) 0.2881 hat (arr, 10); title(‘\beHistograma da saida da funclo random0’); xlabel ( ‘Faixa’) ylabel (‘Quant.") Os resultados desses testes so aparentemente bons, por isso a fungio deve estar funcionando. A média do conjunto de dades foi de 0,5020, que é bem ppréximo do valor te6rico de 0,5000, ¢ 0 desvie-padrio do conjunto de dados foi cde 0,2881, que é bem préximo do valor tedrico de 0,2887. O histograma é apre- sentado na Figura 5.5, e a distribuigdo dos valores aleatérios é aproximad: mente uniforme pelas faixas uence 8 Falta Figura 5.5 Histograma da sada da fungio randeno. 5 Foye Cts ote usiea | 216 Temos no MATLAB duas fungées predefinidas que geram valores aleat6rios com AistribuigGes distintas: = rand © randn Gora valores aleatérios com distribuigio uniforme. Gera valores aleatérios com distribuigio normal. ‘As duas sio muito mais répidas e mais “aleatérias” que a fungio simples construida anteriormente. Se voc® precisar realmente de ntimeros aleatérios em seu programa, uti- lize uma dessas fungBes. As fungies rand e randn tém as seqiéncias de ativas duas fungoes) fo abaixo (iguais para as + rand ~Gera um tinico valor aleatério cand (n) ~ Gera uma matriz n x n de valores aleatérios = rand (n,m) ~Gera uma matriz.n x m de valores aleatsrios 5.5 Preservando Dados entre Chamadas de uma Fungo Quando termina a execugéo de uma fungio, o espaco de trabalho especial criado para fangio é destruido e 0 conteido de todas as varidvels locais na fungi desaparece Quando a fungio for ativada novamente, um novo espago de trabalho seré ado © todas as variveislocis etomario para seus valores bésces. Esse éo comportamento geralmente desevel, pois ele garante que as fungdes MATLAB se comporiem de ‘manera similar sempre que ativadas. [As vezes, no entanto, pode ser vil preservar alguma informacio local entre at- vagies de uma fungio. Por exemplo, hé a possibilidade de querermos criar um conta- dor para o nimero de vezes que uma fungio foi ativada, Se esse contador for destruido cada vez que a fungio encerrar sua execugio, a contagem nunca passaré de 1! Desde a versio 5.1, 0 MATLAB inclui um mecanismo especial para permit que varidveis lca seam preservadas entre aivacdes de uma fungSo. A meméria persise tente é um tipo especial de meméria que pode ser acessado somente de dentro da fungio, mas fea preservado entre ativages da funcio. ‘Uma varidvel persistente€ declarada com a declarasio perstetent. A forma de uma declaragio persistent é persistent varl var? var} onde vari, vard, var’ etc. sio as varidveis gravadas na meméria persistente. Utilize a memria persistente para preservar os valores de variaveis locais a uma fungS0 entre ativagies da fungio. 216 | Proyamagso em MATLAg® gra genes > Exemplo 5.5 ~_Médias Mévels Por vezes & desejavel calcular estatisticas méveis sobre conjuntos de dados & medida que 0s valores so fornecidos. As funcies MATLAB predefinidas mean e std poderiam, efetuar essas tarefas, mas precisariamos fornecer todo o conjunto de dados a elas para recalcular os valores cada vez que novos dados fossem fornecidos. Um resultado melhor pode ser obtido escrevendo uma fungio especial que acompanhe as somat6rias méveis ‘e somente precise do ultimo valor para calcular a média corrente e 0 desvio-padrao. ‘A média aritmética de um conjunto de ntimeros é definida como 18 ready, 68) ‘onde x, é uma amostra i extrafda de N amostras. © desvio-padrio de um conjunto de niimeros é definido como 69) NW-D) O desvio-padrio avalia 0 espalhamento das medidas; quanto maior esse desvio, mais espalhados sd0 05 pontos do conjunto de dados. Se pudermos acompankar 0 niimero de valores N, a soma dos valores Ex e a soma dos quadrados dos valores E22, pode- remos calcular a média e 0 desvio-padrao a qualquer momento utilizando as equaes 68) e659), Escreva uma fungio para calcular a média e o desvio-padrao méveis de um con- junto de dados que esté sendo fornecido. Solugdo ssa fungio precisa aceitar valores de entrada um po: vez e atualizar as somas de N, 2x || e232, as quais serdo utilizadas para calcular a média eo desvio-padrio méveis. Ela pre- cisa armazenar as somat6rias méveis em meméria persistente para que as somatdrias seam preservadas enrechamadas, Finalmente, precisa exis um mecanismo para 1. Estabelesa 0 problema Cie uma fungio para calcular a média eo desvio-padréo méveis de um conjunto de dados A medida que novos valores sio fomecidos. A funcio precisa também incluir um recurso para reiniciar as somatdrias méveis quando necessério, 2. Defina as entradas e saidas Existem dois tipos de entrada requeridos pela fungi: 1. Acadeia de caracteres ‘reset ' para reinicar as somatsrias méveis como zero. 2. Os valores numéricos do conjunto de dados de entrada fornecidos um para cada ativagao da fungéo. waiterE TT 0S Furres etnies eo utr | 247 As saidas dessa fungio so a média e 0 desvio-padrio dos dados forecidos para a funcio até enti. 3. Projete o algoritmo Essa fungio pode ser quebrada em quatro passos principais, Verifique se hd un niinero apropriado de axgunentos Verifique se foi fornecido um ‘reset’, © nesse caso reinicie as somatérias case contréric, adicione © valor corrente as sonatérias néveis calcule ¢ retorne a média ¢ 0 desvio-padréo méveis, caso tenhan sido fornecides dados en quantidade suficiente Retorne eeros se ndo houver dados suficientes. © pseudoesdigo detalhado para esses passs é Verifique se hé um niin ‘reset’ apropriado de argunentos nenel sux © sumx 4 x Sum_x2 © sum_x2 + x02 end % Caleule média e desvio-padrio ifn. 0 ave © 0 std 0 elseif n == 1 ave © un x std © 0 else ave © cumx / a std © sqrt ((n*sum x2 ~ sumx2) / (nt (n-1)}) end 4, Transforme o algoritmo em declaragBes MATLAB. A fungio MATLAB final é apresentada a seguir. function [ave, sta] = runstats(x) SRUNSTATS Generate running ave / std deviation & Function RUNSTATS generates a running average and standard deviation of a data set. The values x must be passed to this function one at a time. A call to RUNSTATS with the argument ‘reset’ will reset the running sums : ’ 2 2 21B | Progranagto wm MATAR pra Egos % Define variables a ave ~ Running average some Error message bon Number of data values esta -- Running standard deviation % sum -- Running sum of data values ® sum x2 Running sum of data values squared box + Input value % Record of revisions: . Date Programm Description of change ' & 12/16/98 ss. J. Chapman & Declare persistent values persistent a % Number of input values persistent oun x & Running sum of values persistent sun_x2 & Running sum of values squared & Check for a legal number of input arguments. msg = nargchk(1,1,nargin) error (msg); original code ¥ If the argument is ‘reset’, reset the running suns if x == ‘reset’ n=O; sunx = 0 sum_x2 else ne=nedy sumx2 = gum x2 + x92; end) & calculate ave and sd ifn -- 0 ave = a; std = 0 elseif ne 1 etd = 0; else ave = sumx / ni std = sqrt ((n*sumx2 - sumxt2) / (n¥(n-1))); end 5, Teste o programa Para testar essa fungdo, precisamos criar um arquivo de script que reinicie runstats, lela os valores de entrada, ative runstats e exiba as estatisticas méveis. Um arquivo de script apropriado é apresentado a seguir. Captains Fes Oia ea sro | 219 Script-fite: test_runstats.m Purpose; To read in an input data set and calculate the running statistics on the data set as the values are read in. The running stats will be written to the Comnand Window Record of revisions Date Programmer Description of change S. J. Chapran original code 12/16/98 Define variables: array -- Input data array ave =~ Running average std -- Running standard deviation ii -- Index variable nvals ~~ Number of input values std <+ Running standard deviation @ First reset running sung [ave std] = runstats(‘reset’); % Prompt for the number of values in the data set avals = input(‘Enter number of values in data set: '}; ut values Linvals 8 Prompt for next value string - [‘Enter value ’ int2str(ii) ‘: "I x = input(string); Get running st [ave std] = runstats(x); stice % Display running statietice fprint£( ‘Average = %8.4f; std dev = %8.4f\n',ave, sta); end Para testar essa funcio; vamos calcular tmio-as-estatisticas méveis para ‘um conjunto de cinco ntémeros, e comparar 0s célculos & mao com os resultados do programa, Se um conjunto de dados for criado com os seguintes cinco valo- res de entrada 30, 20, 30, 40, 28 as estatisticas méveis calculadas & mio serdo 220. | Proyansonm MATAR® pare Enemas Valor ™ i i Média Desvio 30 1 30 0 3.00 0000 20 2 50 130 250 0707 30 3 a0 zo 267 osr 40 4 20 380 3.00 0816 28 5 48 296 ons 561 ‘A safda do programa de teste para o mesmo conjunto de dados é » tet_runstate Enter number of values in data set: 5 Enter value l: 3 Average = 3.0000; std dev = 0.0000 Enter value 2:2 Average = 2.5000; Std dev = 0.7071 enter value 3: 3 average = 2.6567; Std dev = 0.8774 Enter value 4: 4 Average = 3.0000; std dev = 0.8165 Enter value 5: 2.8 Average = 3.9600; Std dev = 0.7127 portanto, os resultados conferem com a precisio mostrada com relagéo aos dados calculados & mio. 5.6 Fungdes de Fungies Fungies de fungies sio funcSes com argumentos de entrada que incluem nomes de coutras fungdes. Os nomes de fungdes passados para a funcio de fungio sio em geral utilizados durante a execugio da fungao. Por exemplo, o MATLAB contém uma fungio de funcéo denominada £2ero. Essa fungio localiza um zero da fungao passada para ela. Por exemplo, a decla- 10 F2er0(‘cos", [0 pi)) localiza um zero da fungio cos entre 0 e m, € Ezero(*exp(x)-2", (0 1]) localiza um zero da funcéo exp x) -2 entre 0-e 1. Ao cexecutar essas declaragies, 0 resultado é » fzero(‘coa’, {0 pil) 5708 » £xer0( ‘exp (x)~ 0.6932, +, f0 21) a A ave a ef z Captla §Fvpes tn pto muro | 224 ‘AS flingGes-chave para a operagio das fungbes de fungSes slo duas fungdes espe- ciais do MATLAB, eval e feval. A funcio eval avala un cadeia de caracteres como se cla tivesse sido digitada na Janela de Comandos, ea fungio feval avalia wma fungi com um determinado nome para um valor de entrada especifico. ‘A fungio eval avalia uma cadeia de caracteres como se cla tivesse sido digitada na Janela de Comandos. Essa fungao fornece as fungdes MATLAB uma oportunidade de construir declaragdes executaveis durante a execusio. A forma da fungao eval é eval (string) Por exemplo, a declaragio x = eval (‘sin (pi/4)*) produz.o resultado » x © eval(/sin(pi/4)’) 0.7071 Tabeta 5.1. FungGes de Fungdes MATLAB Comuns Wome da Fungio—_Deserigio smintnd ‘Minimiza uma fungio de uma vaidvel f20r0 Encontra un zero de uma fungfo de uma varie uaa Integra sumericamente uma tango. ezplot ‘Deserha com simplicidade uma fungio. fplot DDesenha uma fungo pelo nome Um exemplo onde uma cadeia de caracteres & construfda e avaliada utilizando a fungi eval é apresentado a seguir: (exp(* nundetr (x) ") = 1415 res = eval (str); Nesse caso, str contém a cadeia de caracteres “exp (1) conseguir 0 resultado 17183, ‘A funcio feval avalia uma fugio com um determinado nome definido por um arquivo M para um determinado valor de entrada. A forma geral da fungio feval é 1", que eval avalia para feval (fun, valor) Por exemplo, a declaracio x" = fevar{ sin"; pI747 produz o resultado feval(‘ein’,pisa) 0.7071 Algumas das fungdes de fungies mais comuns do MATLAB estdo na Tabela 5.1 Digite help nome_éa_funeao para aprender a utilizar uma dessas fungbes. 222 | Progranogéo em MATLAB era Engen: > Exemplo 5.6 ~ Criago de uma Fungo de Fungao rie uma fungio de fungio que desenhe o diagrama de qualquer fungao MATLAB de ‘uma sinica varidvel entre um valor inicial e um final. Solugio Essa fungo tem dois argumentos de entrada, 0 primeiro contendo 0 nome da fungao a ser desenthada e o segundo contendo um vetor com 2 elementos indicando 0 intervalo de valores a serem desenhados. 1, Estabelega 0 problema CCrie uma funcao para desenhar qualquer fungio MATLAB de uma tinica va~ ridvel entre dois limites especificados pelo usuario. 2. Defina as entradas e saidas “Temos duas entradas requeridas para essa funcéo: 1, Uma eadeia de caracteres que contém o nome de uma funcio. 2, Um vetor com dois elementos que contém o primeiro eo ultimo valores para » quickplot (‘sin’) 22? Error using ==> quickplot Not enough input arguments. » quickplot (‘sin’, [-2*pi 2*pil,3) 222 Error using =-> quickplot Too many input arguments. 224 | Provan em MATLAB® para Enentoes » quickplot(‘ein’,-2*pi) 22? Error using ==> quickplot Incorrect nunber of elements in xlim >» quickplot (‘sin’, {-2*pi 2*pil) Altima atvagio da fangio estava corres, € 0 resultado € 0 diagrama da Figura 56 ee < 5.7. Subfungdes e Fungdes Privadas Existe a possibilidade de colocar mais de uma func3o em um tinico arquivo. Se mais de uma fungao estiver presente em um arquivo, a primeiza fungao 6 uma fungao normal, e fs outras sio subfungdes ou fungbes intemas. As subfungSes sf0 como as fungies ‘comuns, mas s6 podem ser acessadas por outras fungbes do mesmo arquivo. 08) Figara 6.6 Desenho de sin x versus x gerado pela fungio quickplot exemple abaixo define uma fungio mystats eduas subfungSes, moan emedian. {A fungao mystat's pode ser ativada por outra fungio MATLAB, mas as fungbes nean fe median podem ser ativadas somente por outras fungBes do mesmo arquivo. function (avg, med] = mystate(u) SMYSTATS Calcula média e mediana utilizando fungces internas stints tf ed ren ie feet Capito Fes Onde eto Unsrio | 225 a= Length(u); avg = mean(u.n) ; med = median(u,n); function a = mean(v,n) % calcula média a = sum(v)/nz function m = median(v,n) ’ calcula mediana. w = sort (vi: if rem(n,2) == 1 m= winet)/2); else m= (w(n/2) sw (n/241))/27 end Fungées privadas sio fungbes que residem em subdiretéros com o nome especial private. Elas io visiveis somente para as fungBes do diretério-pai.Por exemple, con- sidere 0 diretério cesting np caminho de busca do MATLAB. Um subdiretsrio de testing denominado private pode conter fungbes que somente podem ser ativadas pelas fungdes no diretério testing. Como as fungSes privadas sio invisveis fora do diretdro-pai, elas podem utilizar 08 mesmos nomes de fungGes em outros dretirios, Isso € ttl se voc® quiser crar sua propria versio de uma funsio em particular e pre- servar a original em outro diret6rio. Como © MATLAB procura as fungbes privadas antes das fungdes-padrio de arquivos M, ele encontraré uma fungio privada com 0 rome test..m antes de uma fungio nao privada com o nome test. \Voct pode criar seus préprios diretérios privados simplesmente criando um sub- diretério chamado private sob o diretério que contém as suas funcbes. Nao coloque esses diretdrios privados em seu caminho de busca. ‘Quando uma fungio é ativada de dentro de um arquivo M, 0 MATLAB primeiro verfica 0 arquivo para ver sea fungio €uma subfungio. Se no for, ele veifca se existe uma fungio privada com 0 mesmo nome. Se a fungio no for privada, o MATLAB veri fica o carninho de busca-padrio para encontrar a funsio. Se voct tiver fungBes MATLAB espectfcas que devem sor utilizadas somente por coutras fungiese nunca devem ser ativadas diretamente pelo ususrio,considere a opgio de oculté-as como subfungSes ou como fungSes privadas, Ocultar as fungBes evita seu uso acidental e também conflits com outras fungSes publicas com o mesmo nome. Utilize subfungaes e fungSes privadas para ocultar as fungies MATLAB especificas que deveriam ser ativadas somente por outras fungSes. Ocultar as fungbes evita seu uso aci- dental, ¢ também conflitos com outras fungbes publicas com 0 mesmo nome. 226 | Praqaracso om MATE ar Enger No Capitulo 5, apresentamos uma introduglo 3c fungSes definidas pelo usuério. FungSes so arquivos M especiais que recebem dados como argumentos de entrada ¢ retomam resultados como argumentos de saida, Cada fungio tem seu espago de trax batho independente. (Os arguments so transmitidos 3s fungGes por um esquema de passagem por valor, o que significa que o MATLAB copia cada argumento e passa uma c6pia para a fungio. Ae6pia € importante, pois a fungéo pode medificarlivemente seus argumentos de entrada sem afetar os argumentos no programa ativador. ‘As fungSes MATLAB dao suporte a quantidades varidveis de argumentos de entrada e de safda. A fungio nargin indica 0 nimero de argumentos de entrada ut- lizados em uma fungio, ea fungio nargout indicao mimero de argumentos de safda fem uma atvagio de funcio. (Os dados podem também ser compartlhados, entre fungBes MATLAB, pela colo- ‘ago deles na meméria global. Varidveis plobais so declaradas pela expressio global. Essas varidveis podem ser compartilhadas por todas as fungBes que as declaram. Por convencio, os nomes de variéves globais so escritos com letras maiisculas Dados internos a uma fungio podem ser preservados, entre chamadas da funcio, pela colocagio dos dados na meméria persistent. Variéveis persistentes sio declaradas com a expressio persistent: Frungdes de fungbes 30 fangSes MATLAB com argumentos de entrada que incluem nomes de outras funcdes. As fungdes cujos nomes Sio passados para a fungio de fungao sao normalmente utlizadas durante a execugSo dessa fungi, Alguns exer- plos si0 fungies para edlculo de raizes e desenhos de diagramas de outras fungoes Subfungies S80 funges adicionais colocadas em um tinico arquivo. Séo acessiveis somente a partir de outras fungSes no mesmo arquivo. FungSes privadas sio fungSes colocadas em um subdiretério especial denominado private. Elas so acessiveis somente a fungbes no diretsrio-pa. Tanto subfungies como fungGes privadas podem ser tilizadas para restringi 0 acesso a fungbes MATLAB, 5.8.1 Resumo de Boas Praticas de Programagao As seguintes recomendagées devem ser seguidas quando se trabalha com fungées MATLAB. 1. Sempre que possivel, quebre tarefas grancles no programa em fungBes menores e faceis de entender. 2. Declare varidveis globais com letras maisiscalas, para que elas sejam facilmente diferenciadas das variaveis locais. 3. Declare variaveis globais imediatamente apss 0s comentérios iniciais e antes da primeira declaragio executivel em cada fungio que as utilize, 4. Vocé pode utilizar a meméria global para passar grandes quantidades de dados entre fungies dentro de um programa, 5, Utilize a meméria persistente para preservar os valores das varidveis locais dentro de uma fungao entre chamadas da fungao. ment n — jot san et eid acti m4 jt Hemant viet: A Cant Freee dts pel Ubtrio | 227 6. Utilize subfungbes e fungoes privadas para ocultar fungSes MATLAB especi- ficas que devem ser ativadas somente por outras fungSes. Ocultar as fangBes evita seu uso acidental e também conflitos com outras fungies puiblicas de 5.8.2 Resumo do MATLAB resumo a seguir apresenta todos 05 comandos ¢ fungies MATLAB descritos neste capitulo, junto com uma breve descriglo de cada um, Comandos e Fangdes error Exibe mensagem de erro e interrompe a execugio da fungio que 0 produziu, Essa fungio é utilizada se os cerros de argumentos forem fatais. eval ‘Avalia uma cadeia de caracteres como se ela tivesse sido digitada na Janela de Comandos. explot -Fungao simples para desenhar diagramas de fungées. feval CCalcula o valor de uma fungio fz) definida por um arquivo ‘Me para um valor especifico de x. Emin Minimiza uma fungio de uma variével. splot Desenha uma fungio pelo nome. fzero Encontra um zero de uma funcio de uma variével Declara variaveis globais. Calcul edeserha um histograma de um conjunto de dados. Retorma 0 nome da variével que corresponde a um niimero de argumento em particular nargchk Retorna uma mensagem de erro-padrio se uma funjio for ativada com poucos ou com muitos argumentos nargin Retoma o nimero de argumentos de entrada utilizados na ativagio de uma funcio. nargout Retorna o miimero de argumentos de sada utilizados na ativagio de uma funsao, Declara varidveis persistentes. Integra numericamente uma funsio. persistent quad Gera valores aleatérios com distribuigio uniforme, Gera valores aleat6rios com distribuicio normal Interrompe a execugio de uma fungio e retorna o cantrole parao ativador, warning Exibe uma mensagem de erro ¢ continua a execusio da fungdo. Essa funcio é utilizada se os erros dos argu: ‘mentos ndo forem fatais e a execugio puder continua. 228 | Programogso wm MATLa® gra Egos 5.9 Exercicios 54 52 56 87 (Qual a diferenga entre um arquivo de script e uma fungio? Quando uma fungio é ativada, como os dados passam do ativador para a fungdo, e como sio 0s resultados da fungio retornados para 0 ativador? (Quais as vantagens e desvantagens do esquema de passagem por valor uti- lizado no MATLAB? Modifique a fungio de ordenacio por selegio desenvolvida neste capitulo para que ela aceite um segundo argumento opcional, que pode ser ‘sobe’ ou *aesce’, Seo argumento for ‘ sobe’ , ordene os dados de forma ascendente. Se o argumento for ‘desce", ordene de forma descendente. Se o argumento rio estiver presente, orciene de forma ascendente. (Verifique o caso de argu- ‘mentos invalidos, e inclua informago apropriada de ajuda em sua funcio.) Escreva uma fungio que utilize a fungo randon0 para gerar um valor aleatério no intervalo[-1,0, 1,0). Tome random0 uma subfungao da sua nova fungio. Escreva uma fungio que utilize a fungio randon0 para gerar um valor aleat6rio no intervalo (inf, sup.|, sendo inf. e sup. argumentos de ativacio, Tome randomd uma fungdo privada ativada por sua nove fungio. Simulacio de Dados. Fregientemente¢ stil poder simular um dado justo. Fsceva uma fungio MATLAB dacos que mle um dado justo, retomando tuminteir aleatério entre Te 6 cada ver que for ativada. (Dia: ative randon0 para gerar un niimero aleatoro. Divide os valores possiveis de saida de Panded em seis intervals iguas e etoreo mimero do intervalo dentro do ‘qual um valor aleatério cai.) Densidade de Tréfego Rodovisrio. A funcio randon0 produz um mimero com distribuigio de probabilidade uniforme no intervalo [0,0 , 10). Essa fangdo 6 apropriada para simular eventos aleat6rios se cada saida tiver uma probabilidade igual de ocorréncia. Entretanto, em muitos eventos a probabili- Gade de ocorzéncia nio é igual para todos eles, e uma distribuicio de proba- bilidades uniforme néo é adequada para simular esses eventos. Por exemplo, quando engenheiros de tréfego estudaram o ntimero de vveiculos que passavam por uma dada localizacio em um intervalo de tempo de comprimento t, eles descobriram que a probabilidade de k veiculos pas- sarem durante aquele intervalo era dada pela equacso ay OF E ssa distribuigdo de probabilidades ¢ corhecida como distribuigio de Poisson; cla ocorre em muitas aplicacies em ciéncias e engenharia, Por exemplo, 0 ruimero de chamadas & para uma mesa de distribuigdo telefdnica em um intervalo de tempo t,o ncimero de bactéries kem um determinado volume t de Hiquido e 0 nimero de falhas k de um sistema complicado em um intervalo de tempo t tim distribuigbes de Poisson, PK, para 120,230, ek = 0,1, 2 10) 5a 5.10 Ban 5.12 Canin Frees Oris eo Uso | 229 [Escreva uma funglo para avaliar a distribuigao de Poisson para quaisquer k, te, Teste sua fungio caleulando a probabilidade de 0, 1,2. 5 veiculos assando por um ponto em particular em uma via em um minuto, dado que 2. vale 1,6 por minuto para essa via. Desenhe a distribuiggo de Poisson Parat=1eh=L6, Escreva ts fungoes MATLAB para calcular seno,co-seno e tangente hiperbslice, =e oghts) = LE, tanhyey @ MEE sinha) = “5, cosh(x)= £5, tanh(e) = =e Uilize suas fungBes para desenhar a forma das fungBes seno,co-seno e tan- gente hiperbslicos Produto Vetorial. Escreva uma fungao para calcular o produto vetorial de dois vetores, Vj e V>. Vix Va= Vy Var~ Vaud i+ VaVea~ VeaVen) j + VasVya~ Vea) k onde V; = Vy i+ Vj j+VakeVi= Vigi t+ Vyaj + Vik: Note que essa fungio retorna uma matriz real como resultado, Utilize a fngio para caleular 0 pro- duto vetorial dos vetores V, = [-2, 4, 0.5] e V; = (05,3, 2) Ordenacio com Arraste. Freqdentemente é titi ordenar uma matriz arr? em ordem ascendente e ao mesmo tempo arrastar uma segunda matriz arr? [Nesse caso, cada vez que um elemento da matriz arr1 troca de posigio com ‘outro elemento de az, os elementos correspondentes de arr? também tro- ‘cam de posicio. Ao final da ordenagio, os elementos da matriz arr] ficam ‘em ordem ascendente, enquanto os elementos da matriz. arr? inicialmente associados a elementos particulates da matriz arr1 continuam associados a les. Por exemplo, suponha as seguintes duas matrizes: Elemento ack amd 1. 6 1 2. 1 ° 3 2 10 Apés a ordenagio da matriz arr, arrastando junto a matriz arr2, 0 con- tetido das duas matrizes deve ser Elemento ark ana 1 1 ° 2 2 10. 3 6 1 Escreva uma funglo para ordenar uma matriz real em ordem ascendente € arrastar unto uma segunda matriz. Teste a funcio com as seguintes matrizes de nove elementos: ast, UM, -8& I, -23, 0 5 4, -2ly b= (-31, lol, 36, -17, 0, 10, “8, “1, “11; Utilize 0 Navegador de Ajuda para encontrar informagies sobre a fuga padrio do MATLAB cortrows e compare o desempenho de sortrows com a fungao de ordenacio com arraste do exercicio anterior. Para fazer isso, crie duas c6pias de uma matriz com 1.000 * 2 elementos que contém valores 280 | Paganapéo wm sures? gra Engenteos Figura 5.7 aleatériog, eordene a coluna I de cada matriz enquanto arrasta a chluna 2 uti= lizando as duas fungdes. Determine os tempos de execugo de cada funsio de ordenagio, utilizando tic e toc, Como se compara a velocidade da sua fungio com relagio a fungio-padrio sortrows? wo Ge 6 ie) Dois navios nas posigdes (x,y) € (Yl tespectivamente. O navio 1 esté apon- tando para 8, € 6 navio 2, para 8 5.13 Na Figura 5.7, temos dois navios no ocean. O navio I est na posicio (2,43) apontando para 8;. O navio 2 esté na posicio (x, ya), apontando para Gy ‘Suponha que o navio 1 faga contato por radar com um objeto a distancia rye Angulo ¢,. Fscreva uma fungao MATLAB para calcular a distancia r, ¢ 0 Angulo 6; de visio do objeto pelo navio 2 5.14 Minimos e Méximos de uma Fungio. Escreva uma fungla que tente localizag os valores maximos e minimos ée uma fungio arbitraria f(x) dentro de um intervalo. A fungdo deve ser passada a fungdo como um argumento, além de ter os seguintes argumentos de entrada: Prim_val O primeizo valor de x ult_val ~~ Oultimo valor dex Passos == O niimero de passos de busca Func O nome da fungio A fungio deve ter os seguintes argumentos de saida’ xnin =~ O valor de x no qual o minimo foi encontrad Min_value ~~ O minimo encontrado de f(x) max O valor de x no qual 0 maximo foi encontracly Max_value ~~ O maximo encontrado de f(x) Verifique se existe uma quantidade valida de argumentos de entrada ¢ se as, do MATLAB tém suporte apropriado, “9m eon tw cones in l= i Cantos Fuge Dts elo so | 231 5.18 Escrevar um programa de teste para a fungio gerada no exerccio anterior. 0 ‘programa deve passar 3 funglo de fungao a funga0 definida pelo usudriof(x)= 25-5: + 5-2, e encontrar 0 minimo e o méximo com 200 passos no intervalo “1Sx$3.0s valores resultantes de minimo e maximo devem ser impresos. 5.16 Derivada de uma Fungio. A derivada de uma fungio continua f(x) € deiinida pela equagio a f+ ax)-f(e) feo = im on) Em uma fungio amostrada, a definigdo se toma pay ead Led 12) onde Ax =x) —; Assuma que um vetor vect contém neanp amostas de uma fungio espagadas de dx, Escreva uma fungio que calcule @ dervada dese vetorutlizando a Equagio (5.12)-A fungio deve verficar se dx é maior {que zer0 para prevenir errs de divisdo por zero na fungio. Para verificar sua fungo, vou? deve gerar um cojunto de dados cua deri- vada ej conhecida ecompararo resultado da fungio com a resposta comet. Uma boa escotha para una fungio de teste € sin (2), Bo cilculo elements sabemos ae (ns) = ors Gee mvt dena so 10 vl dso sin 2) iniciando com x = 0¢ utlizando um passo Ax de 0,05. Caleule a derivada do vetor com a sta funcio e compare os resultados com a resposta correta. Quio proxima ficou a sua fungio do calculo da resposta correta para a derivada? 5.17 Derivada na Presenga de Ruido. Vamos agora explorar os efeitos de ruido de entrada na qualidade de uma derivada numérica, Primeizo, gere um vetor de entrada com 100 valores da fungo sin (1), iniciando com x = 0,e uilzando ‘um passo Ax de 0,05, como no problema anterior. Depois, utilize a fungio random para gerar um pequeno rufdo com amplitude méxima de 20,02 € adicione o ruido aleatsrio as amostras em seu vetor de entrada (ver Figura 58). Note que a amplitude de pico do rufdo é somente 2% da amplitude de pico do sinal, pois o valor maximo de sin (x) ¢ 1. Agora, calcule a derivada da fungio utilizando a fungio desenvolvida no problema anterior. Quio proxima do valor teérico ficou a sua derivada? 5.18 Ajuste Linear de Minimos Quadrados, Desenvolva uma funcio para caloulara inclinagio m e a intersegao b da linha de minimos quadrados que melhor se ajuste a um conjunto de dados de entrada. Os pontos de entrada (x,y) dever ser passados para a fungio utlizando duas matrizes de entrada, xe y. (As equacoes que descrevem a inclinagao e a intersegio da linha de minimos quadrados estio ro Exemplo 47 do capitulo anterior) Teste a sua fungi utilizando um progra- ‘ma de testes eo conjunto de dados de entrada com 20 pontos dado na Tabela 52. 5.19 Coeficiente de Correlagio do Ajuste de Minimos Quadrados. Desenvolva ‘uma fungio para calcular a inclinag3o m eo ponto de intersecéo b da linha fungdes help € look ‘minimos quadrados que melhor se ajuste a um conjunto de dados de 282. | Propansdo om MATAB® para Enpeaios Figura 8.8 (@ Disgrama de sin (2) como funcio de x sem rufdo, (b) Diagrama de sin (x) como fungio de x com ruide aleatério uniforme exja amplitude de pico & de 2%. entrada, e também o coeficiente de correlagao do ajuste. Os pontos de en- trada (x.y) so fornecidos para a fungdo utilizando duas matrizes de entrada, x @ y. As equagdes que descrevem a indlinagdo ¢ a intersegao da linha de ‘minimos quadrados so dadas no Exemplo 4.7, e a equasio para o coeficiente de correlacio é 615) = Tae ETT aR 5.20 5.21 CanleFage Otis pl Unaiio | 233 Tabela 5.2 Dados para Testar a Fungao de Ajuste de Minimos Quadrados do Ex. 5.18 x 1 ™ 7 491 $18 n 098 oz ae a9 2 039 ws 2 mn 6 069 396 262 “615 « 308 426 37% 562 5 ot 575 as 30 6 360 6s ss 205 v 453 77 201 28 0, B 53 7 028 a6 9 48 975 108 os 20 4 1035 em que Ex 6a soma dos valores de x. E ya soma dos valores de y. 5x? €a soma dos quadrados dos valores de x. 5 y? 6a soma dos quadrados dos valores de y. E xy € a soma dos produtos dos valores correspondentes de x e de 1 €o niimero de pontos incluidos no ajuste. ‘Teste a sua funcio utilizando um programa de teste e 0s 20 pontos de entrada do problema anterior. © Problema do Aniversério. Considerando um grupo de n pessoas em uma sala, qual a probabilidade de duas ou mais fazerem aniversério no mesmo dia? Podemos determinar a resposta para essa pergunta por simulagao. Escreva uma fungio para calcular a probabilidade de duas ou mais de » pes- soas terem a mesma data de aniversério, sendo m um argumento de entrada, (Dice: para fazer isso, a fungio deve criar uma matriz de tamanho m e gerar n aniversérios no intervalo de 1 a 365 aleatoriamente. Ela deve entio verificar se alguns dos m aniversérios sio idénticos. A funcio deve efetuar esse experi- ‘mento pelo menos 5.000 vezes e calcular a fracSo das vezes em que duas ou ‘mais pessoas tiveram a mesma data de aniversério.) Escreva um programa de teste para calcular e imprimir a probabilidade de duas ou mais das pes- soas apresentarem a mesma data de aniversério, para n= 2,3, . 40. Utilize a fungio randomd para gerar um conjunto de trés matrizes com ni ‘meros aleatérios. As trés matrizes devem ter 100, 1.000 ¢ 2.000 elementos, respectivamente, Utilize entéo as fungdes tic e toc para determinar o tempo, necessario para a fungdo ssort ordenar cada ume das matrizes, Qual a taxa de crescimento do tempo como fungio do ruimero de elementos a orcenar? (Dica:utilizando um computador répido, voce precisaré ordenar cada matriz. muitas vezes ¢ calcular 0 tempo médio para superar o erro de quantifcacéo do rel6gio do sistema.) Probabliade do ocatnc aoe Figura 5.9 Uma distribuigio de probebilidades normal 5.22 Distribuigio Gaussiana (Normal). A fungio randon0 retomna uma variével aleatéria Uniformemente distribuida no intervalo [0, 1), 0 que significa que temos igual probabilidade para qualquer niimero no intervalo ocorrer em, ‘uma dada ativagio da fungio. Outro tipo de distribuigio aleatsria é a dis- tribuigdo Gaussiana, em que 0s valores aleat6rios assumem a clissica forma de sino mostrada na Figura 59. Uma distribuicio Gaussiana com média de 0,0 e desvio-padrio de 1,0 é denominada distribuigéo normal padronizada, e a probabilidade de qualquer valor ocorrer na distribuigio normal padronizada 6 dada pela equasao Pa)= a ewe ery Podemos gerar uma varidvel aleatdria, com distribuigdo normal padronizada, partindo de uma variavel com distribuicio uniforme no intervalo [-1, 1) 1. Escotha duas variéveis aleat6rias uniformes x ¢ x: no intervalo [-1, 1), tais que 2} +33 <1. Para fazer isso, gere duas variaveis aleat6rias uniformes no intervalo [-1, 1) verifique se a soma de seus quadrados é menor que 1.0. Se for, use os valores. Caso contrétio, tente novamente. 2, Nesse caso, cada um dos valores ! es? nas equagBes a seguir serdo varid- veis aleatsrias com distribuigio normal ta Capitala § Funpdes Denis pelo Usuivie | 235 In €0 logaritmo natural (log na base @). Escreva uma fungio que retome um, valor aleatério com distribuicio normal sempre que ativada. Teste sua fungi ‘btendo 1.000 valores, calculando o desvio-padrio e desenhando tum histo- ‘grama da distribuigéo. Quo préximo de 1,0 ficou o desvio-padrao? 5.23 Forga Gravitacional. A forca gravitacional F entre dois corpos com massas m, ‘em, 6 dada pela equagio pe omits 6.18) onde G 6 a constante gravitacional (6,672 x 10"" N m? / kg2), m, e m, S80 as rmassas dos corpos em quilagramas er é a distincia ent os dois corpos. Escreva uma fungio para caleular a forga gravitacional entre dois corpos dadas as suas massas € a distincia entre eles. Teste @ sua fongio deter rminando a forsa sobre um satlite de 800 kg em srbita a 38.000 km da sup fice da Terra. (A massa da Terra é de 598 = 10 hg) 5.24 Distribuigio de Rayleigh. A distribuigao de Rayleigh ¢ outra distribuicio de ‘timeros aleat6rios que aparece em diversos problemas praticos. Um valor aleatério com distribuigéo de Rayleigh pode ser criado pela raiz.quadrada da soma dos quadrados de dois valores aleatsrios com distribuigéo normal, Em outras palavras, para gerar um valor aleatério r com distribuigio de Rayleigh, pegue dois valores aleat6rios com distribuigdo normal (ny € 13) € cefetue o seguinte célculo: res 1. Crie uma fungdo rayleigh (n,m) que fornesa uma matriz nx m com _iimeros aleatdrios com distribuicio de Rayleigh. Se somente um argumento for dado (rayleigh (n) ],a funeio deve fomecer uma matrizn nde riimeros aleatérios com distribuigio de Rayleigh. Projete a sua fangio ‘com verificagio de argumentos de entrada e com documentacio apropria- da para o sistema de ajuda do MATLAB. b. Teste a sua fungio criando uma matriz com 20.000 valores aleatérios com istribuigo de Rayleigh e desenhando um histograma da distribuicéo, (Qual a apartncia da distribuigio? ¢ Determine a média ¢ 0 desvio-padrio da distribuigio de Rayleigh z 19) 286 | Pregramajto om MATAR pr Engels @ C) Figura 5.10 (c) Um receptor de radar tipico, (2) Ruido térmico com méidia de saida de 10 volts do detector 0 ruido pode cruzarolimiar de deteccio. () Distribuigio de probabli- dade do ruido a partir do detector. 5.25 Taxa de Alarme Falso Constante (CFAR - Constant False Alarm Rate). Um receptor simplificado de radar € apresentado na Figura 5.102. Quando um sinal € recebido, ele contém a informagao desejada (retorno do alvo) e o ruido térmico, Apés 0 passo de detcecio, gostariamos de separar o retomo do alvo € 0 ruldo térmico, Podemos fazer isso polo ajuste de um nivel de limiar e tentio declarando que vemos um alvo toda vez que o sinal ultrapassa esse limiar. Infelizmente, pode ocorter de o ruido ultrapassar o limiar de detecgao ‘mesmo sem um alvo presente. Se isso ocorrer, vamos indicar 0 pico de rufdo como um alvo, eriando um alarme faso. O limiar de detecgao precisa ser ajustado to baxo quanto possivel para dtectar vos om sina rao, mas wraevitar alarmes falsos. la S Fates nts plo sutso | 237 Figura 8.10. (Continua Apés a detecsio por video, 0 ruido térmico no receptor apresenta uma distribuigdo de Rayleigh. Na Figura 5.10, temos 100 amostras de rufdo com distribuigio de Rayleigh e amplitude média de 10 volts. Note que ocorreria ‘um alarme falso mesmo se o limiar de detecgio fosse 26! A distribuigio de probabilidade dessas amostras de ruido é apresentada na Figura 5.10c, Limiare3 de detecgao sio em geral calculados como um miitiplo do rruido médio. Se 0 ruido muda, o limiar de detecgio também muda para man- ter 08 alarmes falsos sob controle. Isso é conhecido como deteccio da taxa de alarme falso constante (CFAR). Um limiar de deteccio ¢ tipicamente medido cem decibéis. A relagio entre o limiar em dB eo limiar em volts é Limiae (volts) = Ruta Médto (wots) 108 6.20) <8 - 20050( gus Meso) 6a ‘A taxa de alarmes falsos para um dado limiar de detecgio € calculada como simero de Alarmes Falsos ‘4 “Niimero Total de Amostras 62) Escreva um programa para gerar 1.000.000 de amestras de rudo aleatsrio com amplitude média de 10 volts e distribuigio de ruido de Rayleigh Determine as taxas de alarme falso quando 0 limiar de detecgio é ajustado 288 | Pagans en MATLAB gore Engerers 5.26 para5,6,7,8,9, 10, 11, 12 13 dB acima do rufdo médio. A que nivel deve ser ajustado o limiar para atingir uma taxa de alarme falso de 10-7 Probabilidade de Detecsio (P,) versus Probabilidade de Alarmes Falsos (P,.) A poténcia do sinal retornadio de umalvo de radar geralmente flutua no tempo. O alvo seré detectado se a poténcia do sinal exceder o limiar de deteegio para uma dada visada, A probabilidade de o alvo ser detectaclo pode ser calculada como Niimero de Detecgies do Alvo Pe~ Total de Vissdas 623) Suponha que um radar especifco aponte repetidamente para uma dirego. Em cada visada,o intervalo entre 10 km €20 km é dividido em 100 amostras independentes (deriominadas feizas). Uma dessa faixas contém um alvo cuja amplitude tem distibuigio normal com amplitude média de 7 volts edesvio- padio de I volt. Todas as 100 faixas contém ruido de sistema com amplitude smédia de 2 volts e distribuigio de Rayleigh. Determine a probebilidade de detecgio do alvo P, ea probabilidade de alarme falso Py, para uma visada com limiares de deteegio de 80, 90,95, 100,105, 11,0, 15 e 120 dB. Qual limiar vocé usaria para detecgio com esse radar? (Dict: efetue o experimento diversas vezes para cada imiar ecalcule a média dos resultados para deter- ‘minar probabilidades vilidas.) 2 Capitulo 6 Dados Complexos, Dados de Caracteres e Tipos Adicionais de Diagramas No Capitulo 2, aprendemos alguns dos tipos fundamentais de dados do MATLAB: double ¢ char. © MATLAB inelui varios tipos adicionais de dados, e aprenderemos ‘um deles neste capitulo. O tipo adicional de dados que vamos discutir 60 suporte do MATLAB para dads complexos. Vamos também aprender mais como usar o tipo de dados char e como estender as matrizes do MATLAB para mais de duas dimensdes. © capitulo termina com uma discussio Sobre tipos adicionais de diagramas disponiveis no MATLAB. 6.1. Dados Complexes ‘Niimeros complexos so ntimeros com um componente real e um imagindrio. Ocorrem, em muitos problemas em ciéncias ¢ engenharia. Por exemplo, s20 usados em engenharia létrica para representar voltagens de corrente alternada, correntes e impedancias. As equagSes dferenciais que descrevem o comportamento da maioria dos sistemas elétricos ‘e mecainicos também originam niimeros complexos. Como eles sao tio amplamente dis- tuibuidos, é impossivel trabalhar como engenheizo sem um bom entendimento do uso ‘da manipulagio de ntimeros complexos. ‘Um nuimero complexo tem a forma geral cnatbi (61) onde ¢é um niimero complexo, ae b sio ntimeros reais ei € YI. O mimero a é chamado parte rel, € b & chamado parte imagindria do mimezo complexo ¢. Como um niimero complexe tem dois componentes, pode ser colocado em um diagrama como um ponto 240 | Provamacio em MATLAB® poe Exeter: x0 mapinaio ° Taney Eh reat Figura 8.1 Representando um ndimero complexo em coordenadas retangulares. em um plano (Figura 6.1). 0 eixo horizontal do plano 6 0 eixo real, e 0 eixo vertical do plano é o eixo imaginario, por isso qualquer mimero complexo a + bi pode ser representado como um tinico ponto @ unidades ao lorgo do eixo real e b unidades a0 longo do eixo imaginério. Diz-se que um mimero complexo representado dessa maneira esté em coordenadas relangulares, uma vez. que 0s eixos real e imaginério definem os lados de um retingulo. ‘Um ntimero complexo também pode ser represertado como um vetor de compri- mento ze &ngulo @, apontando da origem do plano até o ponto P (Figura 6.2). Diz-se que um niimero complexo representado dessa maneira est em cvordenadas polares, cuathinzce {As relagdes entre os termos de coordenadas retangular e polar a,b, 2 @ so x imaginério Eno res Figura 6.2 _Representando um niimero complexo em coondenadas polares. Cantae§ Once Consens, ace de Caractere Tons Adonis Diagrams | 241 a=zcos@ 62) bezsind (63) (64) 5) (© MATLAB usa coordenadas retangulares para representar mimeros complexos. Cada ruimero complexo consiste em um parcde niimeros reais (a). O primeironimero (@) € a parte real do nimero complexo, e 0 segundo ntimero (b) é a parte imaginaria do riimero complexo, Se os niimeros complexos ¢; € ¢; forem definidos como ¢; =, + byi e cy = a, + yi, a soma, a subtragio, a multiplicagao e a divisio de c, e cp serio definidas como ete (+a) + + by 66) ane = (a) +0, byi 7 6% Cy = (ayy ~ byba) + (ayby + byay)i (68) Gata tbe | byte ash) a ates 9) (Quando dois ntimeros complexos aparecem em uma operagio binaria, MATLAB realiza as somas, as subtragies, as multiplicagSes ou as divisbes necessérias entre os dois itimeros complexos, usando versdes dessas formulas. ag + bp 6.1.1 Varidveis Complexas ‘Uma variével complexa 6 criada automaticamente quando um valor complexo é desig nado para um nome de varidvel. 0 modo mais fécil de criar um valor complexo é usar 0s valores intrinsecos de i ou 3, ambos definidos como ¥=1.Por exemplo, a dedaragio a seguir armazena o valor complexo 4 + i3 na varidvel c1, mela a ana 4.0000 + 3.00001 A fungio isreal pode ser usada para determinar se uma matriz é real 03 com- plexa, Se algum elemento de uma matriz tiver um componente imaginario, a matriz serd complexa e isreal (array) dard 0. 242 | Proramigio em WATAB® pure Engontsos 6.1.2 Usando Nameros Complexos com Operadores Relacionais F possivel comparar dois mimeros complexos com 0 operadorrelacional = para verse sa0 iguats um a0 outro, e para compari-los com o operador ~= para ver se ni sio iguais um ao outro. Ambos os operadores produzem os resultados esperados. Por exemplo, sec, = 413 ec," 4~ 3, entio a operagiorelacional cy == c, produ Oe a ope- ragio relacional cy ~= ¢ produ Entretanta, comparagies com os operadores >, <, >= 03 <= no produzem os resultados esperaios. Quando miimeros complexos si0 comparados com esses operadores rela- Cionais, apenas as partes reais dos rsimeros si0 comparadas. Por exemplo, se cy = 4+ (3 +18, entio.a operagiorelacionalc, > cy produ 1, embora a magnitude de c, sei realmente menor que a magnitude de ¢, Se alguma vez precisarmos comparar dois nimeros complexos com esses ope- radores,provavelmente estaemos mais interessados na magnitide total do mtimero do {que na magnitude apenas de sua parte real, A magritude de um nimero complexo pode sercalculada com a fungGo intrinseca abs (ver a segio seguinte, ou diretamente a Equasio 6.) lel Ve (64) Se compararmos a magnitude de ¢ € ¢y 0s resultados sero mais razosves. abs (4) > labs (c,) produz 0, uma vez que a magnitude de c; € maior que a magnitude de ¢,. Erros de Programagao Seja cuidadoso quando usar 05 operadores relacionais com ntimeros complexos. Os ope: adores relacionais >, >=, < e <= 86 comparam as partes reais de ntimeros complexos, néo suas magnitudes, Se voe® precisar desses operadores welacionais com um ntimero com plexo, provavelmente sera mais sensalo comparar as magnitudes totais em lugar de apenas os componentes reais. 6.1.3 Fungdes Complexas (© MATLAB inclu muitas fungSes que permitem célculos complexos. Elas classificam-se em trés categorias gerais: 1. Fungdes de Conversio de Tipo Essas fungdes convertem dados do tipo dade complexo em tipo de dado real (Goubte). A fungio zeal converte a parte real de um ruimero complexo no tipo de dado double e despreza a parte imaginéria do ntimero complexo. A fungdo imag converte a parle imaginfria de um niimero complexo em um rnuimero real Captains Gado Conpies, one Cazcteese Tos Adonis Dagraras | 243 Tabela 6.1. Algumas Fung6es que Suportam Nameros Complexos fu Deseigdo enj(e) __Computa o canjugado complexe de um nimeno «See = + Dy, ello eoaje) = «bi esl {c) __Retorna a parte real de um ndmero complexoc sag(c) __Retorna a parte magindela de um aero complexo Sereal(c) _ Retoma verdadero (1) senha elemento da maeizctver qualquer componenteimag rir. Portanto,~ 1228) (c) retorna verdadele (1) se uma mate fr complxa abated Retorna a magnitude do nsmero complexo¢ (cl Reloma 0 angulo do nimera compleso c, computado « partir da expressio tan2 (image) real (el) 2. Valor Absoluto e Fungies de Angulo Essas fungGes convertem um niimero complexo em sua representagio pola. A fangfo aids (c) calcula 0 valor absoluto de tim miémero complexo usando @ equagio absle) = at BE onde ¢=4-+bi, A fungio angie (c) calcula 0 Angulo dem nimero comotexo usando a equasio angel (c atan? (imag (c} real (c}) produzindo uma resposta na faixa -n < @ Exempla 6.1 ~ A Equaedo Quadratica (Revista) A disponibilidade de niimeros complexos freqiientemente simplifica os célculos ne- cessérios & solugao de problemas. Por exemplo, quando resolvemos a equagao quadré- tica no Exemplo 3.2, foi necessério tomar txés ramificagies separadas no programe, dependendo do sinal do diseriminante. Com mtimeros complexos disponiveis, a raiz, quadrada de um ntimero negative nao apresenta nenhuma dificuldade, e por essa 1a20 podemos simplificar muito esses célculos. Escreva um programa geral para resolver as raizes de uma equagao quadtritica, independentemente do tipo, Use varigveis complexas de maneira que nenhuma ramifi cago seja necessiria, com base no valor do discriminante. 244 | Proyamagio em MATLAB® pare Engenbeiros Solugao 1, Estabeleca o problema Escreva um programa que resolva as raizes de uma equagio quadritica, sejam las raizes reais distintas, raizes reais repetidas ou raizes complexas, sem pre- cisar de testes sobre o valor do discriminante. 2. Defina as entradas e saidas As entradas necessarias para esse programe sio 0s coeficientes a, be ¢ da ‘equacio quadrética attbete=C jy A saida do programa serio as rafzes da equacio quadrética, sejam elas reais, repetidas ou complexas. 3 Descreva o algoritmo Essa tarefa pode ser subdividida em trés seqGes principais, cujas fungoes sio entrada, processamento e saida. Ler os dados de entrada calcular as raizes Escrever as raizes Agora, quebramos cada uma dessas segbes principais em pedagos menores, ‘mais detalhados. Nesse algoritmo, o valor do discriminante nao é importante na determinaglo de como prosseguit. O pseudocédigo resultante é: Solicitar ao usudrio os coeficientes a, bec Ler a, bec discriminantes © b*2-4t atc x1 © (--b + sqrt(diseriminante)) / x2 © ( -b 4 sqrt (diseriminante)) / Imprimir ‘As raizes dessa equagéo sk Imprimir ‘xl = *, real(xi), ‘+ i", imag(xl) Imprimir ‘x2 =‘, real (x2), ‘+ i %, imag (x2) 4, Transforme o algoritmo em declaragBes MATLAB Este & 0 eddigo final do MATLAB: 8 Script file: calc_rocts2?.m . & Purpose % This program solves for the roots of a quadratic equation 3 of the form atx"? « btx + c= 0. Tt calculates the answers % regardless of the type of roots that the equation possesses. : & Record of revisions: a Date Programmer Description of change 2 . a @ 12/06/98 S. J. Chapman Original code ‘ apiio6 Oaaos Contos, acs Cuaceres # Tips Adonis Dagramas | 245 8 Define variables: soa Coefficient of x*2 term of equation sob Coefficient of x term of equation aoc Constant term of equation % discriminant -- Discriminant of the equation eon First solution of equation 8 Second sclution of equation & Prompt the user for the coefficients of the equation disp (This program solves for the roots of a quadratic '); disp (‘equation of the form A*K*2 + BYX + C= 0. ); a = input (‘Enter the coefficient A. b = input ("Enter the coefficient 8: © = input (Enter the coefficient C: % Calculate discriminant Giscriminant = bt2- 4 * a cy % Solve for the roots x1 = (-b + sqrt(discriminant) ) x2 = ( -b ~ sqrt (discriminant) ) % Display results disp (‘The roots of this equation aze:'}; fprinté (1x1 = ($f) +i (8E)\nt, veal (el), imag(xt)}; fprinté (1x2 = (8£) +4 (8E)\nt, xeal(x2), imag(x2)1; oat VC2* ads 5. Teste o programa Em seguida, precisamos testar 0 programa usando dados de entrada reais. Vamos testa esos nos quaiso discriminant € mai que, menor que e igual ze, paa tor certeza que o programa ets funcionando coretamente em todas as circunstincias, Da Bquacio 31 6 posivel vericar a solucio das seguintes equages: 4546-0 e2exe3 adrede0 x=2 2424580 xe e2i ‘Quando 0s coeficentesacima sio wentados no programa, os resultados s30 » cale_rootez This program solves for the roots of a quadratic equation of the form A‘*2 + BPX 4 C= 0 Enter the coefficient A: 1 Enter the coefficient B: 5 Enter the coefficient c: 6 ‘The roots of this equation are: x1 = (-2.000000) + i (0.000000) x2 = {-3.000000) + i (0.000000) 246 | Programe em MATLAR® pare Engentias Capla§ Osr Conpons, Cass oe Crctees2 Tes Asinas Blaprames | 247 » cale_roote2 Digrame de Fungto Comper versus Tampe This program solves for the roots of a quadratic , equation of the form AtK"2 + BK + C = 0. Enter the coefficient A: 1 | Enter the coefficient B: 4 Enter the coefficient c: 4 oe ‘The roots of this equation are: x1 = (-2,000000) + i (0.000000) | x2 = (-2.000000) + i (0.000000) » cale_roots2 ‘This program solves for the roots of equation of the form A‘K*2 + BEX + C Enter the coefficient A: 1 Enter the coefficient B: 2 Enter the coefficient Cc: 5 ‘The roots of this equation are: : x1 = (-1.000000) + i (2.000000) x2 = (-1.000000) + i (-2.000000) m0 & ladatic 2g (© programa dé as respostas corretas para nassos dados de testes em todos os 7 ee 8 wo eM trés casos possiveis, Note quio mais simples esse programa € comparado a0. | " solucionador de raiz quadrética, encontrado no Exemplo 32. Oso de dados | do tipo complexo simplificou muito nosso programa, | Figura 6.8 Diagrama de yt) ~e-82 (cos ¢+sin 1 usando o comand plot (ty < “ i | 6.1.4 Colocando Dados Complexos em Diagramas Se tanto a parte real como a imaginéria da fungio forem de interesse, 0 usustio tem | vias opgdes. Ambas as partes podem ser dispostas no diagrama como uma funsio do Dados complexos tém componentes real e imaging, e fazer diagrames de dados com- tempo no mesmo exo, usando a seguinte declaracio (Figura 6.4): plexos com MATLAB um pouco diferente de fazer diagramas com dados reais. Por exemplo, considere a fungio t= O:pi/20:4*pi; Y= exp(-0.2¢e) .* (cos(e}eitsin(e}): y(t) = e02' (cos t +i sin t) (6.10) plot(t, real(y),’b-'); hold on: plot (t, imag(y),‘x--")1 title(‘\bEDiagrana de Functio Conplexa versus Tempo’): Se essa fungio for colocada em um diagrama como comando plot convencional, | 86 05 dados reais sordo dispostos no diagrama ~ a parte imagindria sera ignorada [As seguintes declaragies produzem o diagrama apresentado na Figura 6.3, junta- mente com uma mensagem de aviso de que a parte imagindria dos dados esté sendo* xlabel (\bE\iEE}; ignorada: ylabel (“\bé\ity (eI . Jegend (‘real", ‘imagindrio’} } t = O:pis20:4%piz hold off; Y= exp(-0.2*t) .*{cos (t)+itsin(t)); i plot (t.y) Alternativamente, a parte real da fungio pode ser dispasta no diagrama versts @ title(’\bfpiagrana de Funcdo Complexa versus Tempo"): parte imaginéria. Se um tnico argumento complexo for fornecido para a funsdo plot, : xlabel (/\bfvite"); ela automaticamente gera um diagrama da parte seal versus imaginaria, Veja Segui a ylabel {*\bf\ity(t) ") declaragio para gerar esse diagrama; o resultado aparece na Figura 6.5 Yo 248 | range trees i i lagrama de Fung Conplecs varus Tempo Fig 14 Diagrama das partes rwale imaginsria de y() versus tempo, arora Fungo compat 4 i i a Figura 6.8 Diagrama da pa eal versus imaginéria de y). a | Captle§ des Conpiees, Cas de Caracas ps Adin de Dagramas | 249 t= O:pis20:4% y= exp(-0.24t) .*(cos(t) +i*sin(tl); plot (y,"b=")) title(’\bEDiagrama de Func#o Complexa versus Tempo’); xlabel (\bfParte Real’); ylabel(/\bfParte Imaginéria‘); Finalmente, a fungéo pode ser disposta em um gréfico como um diagrama polar, ‘mostranclo magnitude versus angulo. A declaracao para gerar esse diagrama é mostrada a seguir; 0 resultado esta na Figura 6.6 t = 0:pi/20:4*piz y+ exp(-0.2"t). polar(angle(y),abs(y))7 title(/\béDiagrama de Pungao Complexa’) (cos (t)+itsinit)): iagrama de Fungo Complexa 270 Figura 6.6 Diagrama polar da magnitude de y(t versus ngulo. 250 | Poganazéo em Alia para Engonoias 6.2 FungGes de Cadeias de Caracteres Uma cadeia de caracteres MATLAB ¢ uma matriz do tipo char. Cada caractere é arma- zenado em dois bytes de meméria, ‘Uma varidvel de caracteres 6 automaticamente criada quando uma cadeia de ca- racteres 6 designada para ela. Por exemplo, a declaragio str = ‘This is a test’; cria uma matriz de caracteres de 14 elementos. A saida de whos para essa matriz é » whos str Name Size Bytes str ad 28 Grand total is 14 elem clase char array s using 28 bytes Uma fungdo especial ischar pode ser usada para conferir a matriz de caracteres. Se uma variavel for uma matriz de caracteres, ischar retorna um valor verdadeiro (1). Se nao for, ischar retorna um valor falso. ‘As subsegdes seguintes descrevem as fungSes titeis do MATLAB para manipular cadeias de caracteres 6.2.1 Fungdes de Conversao de Cadeias de Caratteres Variaveis podem ser convertidas do tipo de dados de caracteres para 0 tipo de dados double, usando a fungio double. Assim, a fungio double (str) dé o resultado > x = double(str) Columns 1 through 12 b4 104 105 115 32 108 115 32 97 Colums 13 through 14 5 116 32 126 101 Variveis podem ser convertidas do tipo de dades double para o tipo de dados de caracteres, usando a fungio char. Assim, a fungio char (x) dd o resultado > 2 = char(x) This is a test 6.2.2 Criando Matrizes Bidimensionais de Caracteres E possivel criar matrizes bidimensionais de caracteres, mas todas as linhas de tal matriz Alevent ter exataniente 0 mesmo comprimento. Se uma das linhas for mais curta que a outra, @ matriz de caracteres seré invalida e produzira um erro. Por exemplo, as seguintes declaragdes sao ilegais porque as duas linhas tém comprimentos diferentes: ‘stephen J. Chapman’; ‘Senior Engineer']; captte§ ses Comps, dacs de Cantos e Ty: Aan ae Bsgares | 251 (© modo mais fécil de produzir matrizes bidimensionais de caracteres € com a fungio char. Essa fungio automaticamente acerta todas as cadeias de caracteres para o com- primento da maior cadeia de caracteres de entrada, » name = char(’stephen J. Chapman’, ‘Senior Engineer’) Stephen J. Chapman Senior Engineer Matrizes bidimensionais de caracteres também podem ser criadas com a fungio strveat, descrita na proxima seo, [Bi Prética de Programagao Use a fungio char para criar matrizes bidimensionais de caracteres sem se preocupar fem acertar cada linha para 0 mesmo comprimento, E possivel remover qualquer edpaco extra de uma cadeia de caracteres quando ele é extnldo de uma mattiz por melo da funglo deblank. Por exemplo, as delaragbs a seguir removem a segunda linha de una maiz nane e compart os resultados com ¢ femaremoqao dos espa. » line2 Line? = Senior Engineer » line2 trim = deblank(name(2,:)) Line2_trin Senior Engineer » size(1ine2) le > size(1ine2_trim) name (2, 6.2.3 Concatenagdo de Cadeias de Caracteres. A fungdo strcat concatena duas ou mais cadeias de caracteres horizontalmente, igno- tando quaisquer espagos no final, mas preservando os espagos dentro da cadeia de ca- racteres. Por exemplo, a declaracao » result = streat(/string 1 ',’string 2’) result = String 1string 2 produzo resultado ’String Istring 2° 252 | Proyaragso om MATLAB? poe Frente A fungio strvcat concatena duas ou mais cadeias de caracteres verticalmente, automaticamente completando a cadeia de caracteres para gerar uma matriz bidimen- sional valida. Essa fungio produz o resultado » result = strvcat(/Long String 1‘, ‘String 2/) sult Long string 1 6.2.4 Comparagio de Cadeias de Caracteres Cadeias e subcadeias de caracteres podem ser comparadas de varias maneiras. 1 Duas cadeias de caracteres ou partes de duas cadeias podem ser comparadas ‘quanto & igualdade. © Dois caracteres individuais podem ser comparados quanto a igualdade, © Cadeias de caracteres podem ser examinadas para determinar Se cada caractere € uma letra ou um espago em branco, 6.2.4.1 Comparando Cadeias de Caracteres Quanto a Igualdade ‘oct pocle usar quatro fungies do MATLAB para comparar duas cadeias de caracteres como um todo quanto a igualdade. Sao elas: strom __Determina se duas cadeias de caracteres sdo idénticas, = strompi —Determina se duas cadeias de caracteres so idénticas, igno- rando a caixa (caractere minuisculo ou maitisculo). Determina se os primeiros n caracteres de duas cadeias de ca- racteres sio idénticos. Determina se os primeiros n caracteres de duas cadeias de ca- racteres so idénticos, ignorando a caixa (caractere mindsculo ou maitisculo) = strnemp A fungio stzcno compara duas cadeias de caracters,incluindo qualquer espagos no omegoos no final, eretoma I (verdadeio) se a edelas de aracteres form ianteas! Caso contri, retora 0. A fungao stronoi 6 igual a stren, excelo que ignora a aha das ltras (sto tata "2" como igual a AS ‘A fungao stencnp compara os primciros ncamacteres de duas cadeas de cara ters, inciuindo quaisguerespagos no eomeyo ou no fal, eretorna 1 (Verdadeito) os Caracteres fem identicos. Caso contri retorna 0. A fangao strnenps € igual @ Scene, exceto que ignora a casa da eas Para entender essa anges, consiee estas das cadeas de cracteres: str = *hello'; str2 = ‘Hello’; str3 = ‘help’: " Cuidado: o comportamento dessa Fangio € diferente do comportamento da fungio Programadores em podem sr enganados por eso ciereng Captte§ Das Compens, Ont de Carteese Ties Adonis de Daparas | 253 As cadeias de caracteres str e stx2 ndo sao idénticas, mas diferem apenas na caixa (maiiscula e mintiscula) de uma das letras, Portanto, strcmp retorna 0 (falso), enquanto strempi retorna 1 (verdadeiro). » © = stremp(ate1, str2) ° > ¢ = strempi(stri, str2) ‘As cadeias de caracteres str e str3 também nao sio idénticas, e tanto strcmp como strempi retornam 0, Entretanto, 0s trés primeiros caracteres de str e str3 sfoidén- ticos, por isso, invocar etenemp com qualquer valor até 3 retorna 1 » © = etrnemp(stri, str3,2) 1 6.2.4.2 Comparando Caracteres Individuals Quanto @ Igualdade e Desigualdade Vocé pode usar operadores relacionais do MATLAB em matrizes de caracteres para testar, quanto & igualdade, um caractere de cada vez, contanto que as matrizes que voce esta comparando tenham iguais dimensdes, ou que uma sea um nimero real, Por cexemplo, vocé pode usar 0 operador de igualdade (==) para determinar quais carac- teres em duas cadeias so iguais >a = ‘fate; > b= ‘cake’; » result = a == b result, o1ad ‘Todos os operadores relacionais (>, >=, <, <=, caracteres correspondentes. ‘Ao contrario de C, MATLAB nao tem uma funcio intrinseca para definir uma relagdo “maior do que” ou “menor do que” entre duas cadeias de caracteres tomadas como um todo. Vamos criar tal funcio em um exemplo no final desta seo, comparam os valores ASCII dos 6.2.4.3 Categorizando Caracteres em uma Cadeia de Caracteres H& duas fungSes para categorizar caracteres em uma base caractere-por-caractere, em, ‘uma cadeia de caracteres. = isletter determina se um caractere é uma letra "= isepace determina se um caractere é um espago em branco (espago, tab ou nova linha). 254 | rreganaeze om ATAD® para Egerios Por exemplo, vamos criar uma cadeia de caracteres chamada mystring, mystring = ‘Room 23a; Afungio islet ter examina cada caractere da cadeia, produzindo um vetor de saida do mesmo comprimento de mystrina, com lem cada localizagio correspondente @ tum caractere, » a = isletter(mystring) 11110001 (0s primeiros quatro elementos ¢ owiltimo em a sio 1. (verdadeiro), porque os caracteres correspondentes em nystring so letras. ‘A fungio isspace também examina cada caractere da cadeia, produzindo um vetor de saida do mesmo comprimento de mystzing, com I em cada localizacao cor- respondente a um espago em branco. > a = isspace(mystring) 90001000 © quinto elemento em a € 1 (verdadeito), porque 0 caractere correspondente em mystring € um espaco. 6.2.5 Busca/Substituigao de Caracteres Dentro de uma Cadeia O MATLAB fornece varias fungOes para localizar e substituir caracteres em uma cadeia de caracteres. Considere uma cadeia chamada test, test = ‘this is a testi"; Afungio £indst retorna em uma cadeia mais longa a posigio inicial de todas as ‘ocorréncias da mais curta de duas cadeias de caracteres. Por exemplo, para encontrar todas as ocorréncias da cadeia de caracteres “is em test, » position = findstr(test, ‘is’) position = 36 Accadeia ’ is” ocorte duas vezes em test, comogando nas posigdes 3¢ 62 ‘A fungio stenatch € outra fungio de combinacio. Olha para os caracteres do comego das linkas de uma matriz. de caracteres 2-D e retorna uma lista das linhas due comegam com a seqiéncia de caracteres especifcada. A forma dessa fungio & result = strmatch(str, array) 2 Uma nova fungto st ine fl adiionada ao MATLAD,a partir da versio 6.1 (Edigio 121), Fssafungio luplica em grande parts 2 Gincionaidade de Findaes e hbo € compativel com verses anteriores 40 MATLAB. Par enquanto, meomendo que nio sjausoda. Uma desrigio da fungio stfna poderd Ser cencontraga na dacumentagio ali do MATLAB, se vot estver usando a versio 6.1 ou posterior Capte§ Ones Comper Caso de Cractms Ts Adc de Dagamis | 255 Por exemplo, suponha que se crie uma matriz de caracteres -D com a fungio strvcati array = strveat(‘maxarray’, ‘min value’, ‘max value’); Ento, a declaragdo a seguir retomara o mimero de linhas de todas as linhas que ‘comegam com as letras "max". » result = strmatch(/max’, array) result 1 3 A fungio strrep realiza uma operagio-padrio de localiza-e-substiti. Encontra todas as ocorréncias de uma cadeia de caracteres dentro de outra ¢ as substitui por uma terceira cadeia de caracteres. A forma dessa funcio & result = strrep(str, srch,rep1) onde str a cadeia de caracteres que esté sendo conferida, srch é a cadeia de carace teres a ser localizada e rep1 € a cadeia de caracteres de substituigso. Por exemplo, » result = strrep(test, ‘test’, ‘pest’) result = This is a pest: A fungio strtok retorna os caracteres antes da primeira ocorréncia de um ca- ractere delimitante em uma cadeia de caracteres de entrada. Os caracteres delimitantes, iniciais so 0 conjunto de caracteres de espago em branco. A forma de strtok é [token, remainder] = strtok(string, delim) onde string é a cadeia de caracteres de entrada, delim € 0 conjunto de caracteres delimitantes (opcional), token é 0 primeiro conjunto de caracteres delimitados por um caractere em del ime remainder € 0 resto da linha. Por exemplo, >» (token, remainder] = strtok(‘Thie is a tes token = This remainder is a test! Vocé pode usar a fungio strtok para separar uma sentenca em palavras. Por exemplo, 0 cédigo a seguir separa cada palavra em uma matriz de caractores input_string e as coloca em uma linha separada le matrz de caracteres a11_words. function all_words - words (input_string) remainder = input_string; all_words = 1" while (any (remainder) ) (chopped, remainder] = strtok(renainder all_words = strveat (al1_words, chopped) ; end 256. | Posranagso em MATLAB pr ogee: 6.2.6 Conversao para Maliscula e Mindscuta As fungdes upper e lower convertem todos os caracteres alfabéticos de uma cadeia de ‘caracteres em letras maiisculas ou mindsculas (Caixa Alta ou Caixa baixa), respectiva- mente, Por exemplo: » result = upper(/This is test 11°) result Tats Is 7) > result result = sig test 2! Note que os caracteres alfabéticos foram convertidos para a caixa correta (maitiscula ou, ‘miniiscula), enquanto 0s ntimeros e a pontuagio nao foram afetados. 6.2.7 Converstes de Nimero para Cadeia de Caracteres O MATLAB contém diversas fungdes de conversio de cadeia de caracteres para rnime- ico, que transformam valores numéricos em cadeias de caracteres. J4 vimos duas dessas fungSes, nun2etr e int2str. Considere um escalar x. 5317; Por padréo, o MATLAB armazena 0 niimero x come uma matriz double 1 x 1 con- tendo 0 valor 5317. A fungdo int2str (inteiro para cadeia de caracteres) converte esse scalar para uma matriz. char Ix4 contendo a cadeia de caracteres "5317 » x = 5317; > y = intaete (x); > whos Name Size Bytes Class * aed 8 double array . y 1x 8 char erray \ Grand total ie 5 elements using 16 bytes A fungio nundstr oferece maior controle sobre o formato da cadeia de caracteres de saida, Um segundo argumento opciona ajusta o mimero de digitos da eadeia de ca- TQ___tetees de sido expecta um formato pare ser uizado, Por exerplo pum2str (pi, 7) 93 pun2etr (pi, *%10.5e") 94000 apie tian Complore, Dias ae Caacteese Tes AcioalséeDapanas | 257 Tanto int2scr como numdstr sio titeis para colocar legendas em gréficos Por ‘exemplo, as linhas abaixo usam nun2str para legendas automsticas do eixo x de um diagrama. function plotlabel (x,y) 2) num2str (min (x)); = num2ste (marc (2e)) “value xlabel (0% € from‘ etri * stra): Existem ainda fungdes de conversao para transformar valores numéricos em cadeias de caracteres que representam um valor decimal em outra base, como a binétia oua hexadecimal. Por exemplo, a fungao dec2hex converte um valor decimal em uma cadeia de caracteres com a representagio correspondente em hexadecimal. dec_num = 4035; hex_num = dec2hex (dec_num) hex_nun C3 Outras fungdes desse tipo so hex2nun, hex2dec, bin2dec, dec2bin, base2dec € dec2base. O MATLAB tem ajuda on-line para todas essas fungbes, ‘A fungdo MATLAB mat 2str converte uma matriz.em uma cadeia de caracteres que o MATLAB pode processar. Essa cadeia de caracteres é uma entrada wt parauma fungao como eval, que avalia as cadeias de caracteres de entrada como se elas tivessem sido digitadas na linha de comandos do MATLAB. por exemplo, se defi- nirmos a matriz a como has 23,456) 1 2 3 4 5 6 a fungéo mat2str retoma o resultado > b = mataetria) b 123; 456) Finalmente, 0 MATLAB tem uma fungdo especial sprint £ que € idéntica & Eprintf, apenas que a saida vai para uma cadeia de caracteres em vez da Janla de Comandos. Essa fungao oferece controle completo sobre a formatacao da cadeia de ca- racteres. Por exemplo > str = eprintf(/the value of pi = %8.6£.",pi) str The value of pi = 3.141593 Essa fungio é extremamente ttl para criar titulos e legendas complexos para diagramas. 258 | Provan em MATLAB? gaa Engereias 6.2.8 Conversées de Cadeia de Caracteres para Wimero OMATLAB converte para a forma numérica cadeias de caracteres com muimeros, usando ‘a fungio eval. Por exemplo, a cadeia de caracteres a, com os caracteres ‘3.141592', pode ser convertida na forma numérica pelas seguintes declaragées: >a = 13.14159277 > b = eval(a) b= 3.1416 > whos Name Size Bytes Class a 1x8 16 char array > axl 8 double array Grand total is 9 elements using 24 bytes Cadeias de caracteres podem ser convertidas para a forma numérica por meio da fungio sscanf. Essa fungdo converte uma cadeia de caracteres em um ntimero, de acordo com um caractere de conversio de formato. A forma mais simples dessa fungio é value = sscanf(string conde string 6. cadeia de caracteres a ser analisada e format especifica 0 tipo decon- versio a ocorrer. Os dois especificadores de conversdp mais comuns pata sscan€ sio “2a, para decimais, e “$g’, para niimeros com virgula flutuante. Essa fangio seré vista em mais detalhes no Capitulo 8. £ extremamente til na criagéo de ttulos come plexos e de nomes para diagramas. (Os seguintes exemplos ilustram 0 uso de oscant: » valuel = escanf(*3.141593", /%9/) valuel 3.1416 » value2 = sscanf(’3.141593", "%a") valued = 3 6.2.9 Resumo As fungdes comuns do MATLAB para cadeias de caracteres esto resumidas na Tabela 6.2 Cape 6 ose Comex, Ones Se Crcerese Teas Acoso Dagames | 259 Tabela 6.2 Fungdes Comuns do MATLAB para Cadeias de Caracteres Categoria Rago ‘sega char (2) Convartenimeros nas valores de faracteres conespondentes.Q) Cia sma matis 2D de caracteres partir dleuma série de cadeias de canctare, double Canvertecarateres no cigs ni smérioscorespendentes, Danks Cri uma cade de expegs, deblank Remove espagos do fina Sschar — Retoma verdadeiro () para uma mati de casceres Letter Retoma verdadeiro (1) para leas do abet, espace Retoma verdadero (1) para expago tm brane. Operages com Cadetas de Carat treat Coneatenacadeas de arate steveat — Concatena cade de earactores ver. ticalmente stron —Retoma verdadero (1) se duas ca dein de caracesforem idntca. ‘ees Retoma verdadero (1) se duas co deias de caraceres forem idénticas, Ignorando acai cmp Retonna verdadeiro (1) se 08 prt Ineltos n caaceres de Guas eadeas de caracteres foram dénteoe Sstevionpi Reta verdadio (1) ¢ 0 prmeiros peaacens de cuss cdi de crac ‘es oram iden, grorando#caba findste — Loaalznuma ele decaractrs de trode outa etefind — Loealizaumacadei de arsctes den trode otra (Verso 6.10 posterior). eersust Justia cadeia de carateres Localza pares para 9 adela de cx eters Subsital uma cadeia de carstres por out ecetck Localize um simbolo ma cadeia de peer Converte a cada de caracteres emt Tetras matdscuas rower CConverte a cade de coractees erm Tetras mindssile (continu) A 260. | royamagio om MATLAB pa Engen Fungéo Descrigao ‘continua Gnezeer Convert intezo em cadela de ea Converte nimero em eadela de ex Converte maiz em cadela de cx lspcinté —Esceve dados formatados na caeia de caracteres Caractere para Némero [eradoubis Converte cadeia de earacteres para ‘um valor double. Essa fungio énova hho MATLAB 3) arun Converte cadeia de caracteres em secant Lé dados formatados de uma cadeia de caracteres Conversto de Wimero go Base hevanim Convert cadeia de earactere hex decimal EEE em double hroxldoc Convert eadela de caracteres hex ‘decimal em intel decimal Gocthex Converte cada de earaceres dees mal em hexadecimal, Dbingdoc Conwverteeadeia de caractees bing Fos em inti decimal Gecdbin Convert inteiro decimal em eadela de caracteresbinaros base2dec Convertecadsia de caracteres de base ‘Bem intro decimal, Sccdbare Convert inteio decimal em cadela de caractres de base > Exempla 6.2 ~ Fungo de Comparagaa de Cadeias de Caracteres Em, a fungio stzmep compara duas cadeias de caracteres ce acordo com a ordem de seus caracteres na tabela ASCII (chamada ordem lexicogréfica dos caracteres), ¢ retorna~1 se a primeira cadeia de caracteres for lexicograficamente menor que a segunda cadeia de ca- racteres, 0 se as cadeias de caracteres forem iguais e +1 se a primeira cadeia de caracteres, for lexicograficamente maior que a segunda cadeia. Essa furigSo € extremamentevtil para ‘propésites como colocar cadeias de caracteres em ordem alfabstica ‘Crie uma nova funcio c_strcmp em MATLAB que compare duas cadeias de carac- teres de modo semelhante & fungao de Ce retorne resultados semelhantes. A fungao deve ignorar espagos no final ao fazer suas comparagbes, Note que a fungao deve ser capaz de lidar com a situago em que as duas cadeias de caracteres tém comprimentos diferentes. Captute aces Copies. Cas Cacctems ps A Solugao 1. Estabelega 0 problema Escreva uma fungio que compare as duas cadeias de caracteres style str2e retorne os seguintes resultados: = -1 _sestri for lexicograficamente menor que str? © 0 sestri for lexicograficamente igual a str? = +1 sectri for lexicograficamente maior que ¢tx2 ‘A fungdo deve funcionar corretamente se str e str? ndo tiverom mesmo ‘comprimento, e a fungao deve ignorar espagos em branco no final. 2. Defina as entradas e saidas As entradas necessérias para essa fungdo sio as duas cadeias de caracteres, strLe str2. A safda dessa fungao serd -1, 0 0u 1, como apropriado, . Descreva o algoritmo Essa tarefa pode ser quebrada em quatro segSes principals Verifique as cadeias de caracteres de entrada Ajuste as cadeias de caracteres para igual compriments Compare caracteres do comago ao fim, procurande a primeira diferenca Retorne © valor baseado na primeira diferenga Agora vamos quebrar cada uma das segdes principais acima em pedages me- noes, mais detalhados. Primeiro, devemos verificar se os dados passados para a fungao estdo corretos. A funcio deve ter exatamente dois angumentos, © 05 argumentos devem ser, ambos, caracteres. O pseudocSdigo para essa etapa & & Verifica a quantidade de argumentos de entrada. msg = nargchk(2,2,nargin) error (sg) @ Verifica se os argumentos so cadeias de caracteres, if algum argunento nao é cadeia de caracteres, error(‘strl e str2 precisam ser cadeias de caracteres') else (coleque © eédigo aqui) end A seguit, devemos ajustar as cadeias de caractores para comprimentos iguais, O modo mais facil de fazer isso € combinar ambas as cadeias de carac- teres em uma matriz 2-D, usando strvcat. Note que essa etapa efetivamente faz a fungao ignorar espagos em branco no final, porque ambas as cadeas de caracteres so ajustadas para o mesmo comprimento, O pseudocédige para essa etapa & % Ajusta cadeias de caracteres. strings = strvcat(stri,str2) Agora, devemos comparar cada caractere, até encontrarmos uma diferenca, ¢ retornar 0 valor baseado nessa diferenca. Uma maneira de fazer isso € usar ‘operadores relacionais para comparar as duas cadeias de caracteres, criando uma matriz de 0's e 1's. Podemos entio procurar o primeira um, que corres 262 | Pregamaydc om MATAR? pore Enenbeos ponder & primeira diferenca entre as duas cadeias de caracteres. O pseu docédigo para essa etapa é 2 Compara cadeias de caracteres. Giff = strings(1,:) ~= strings(2,+) if sum(aiff) == 0 * Cadeias casam result = 0 else % Identifica primeira diferenca ival = find(aiff) if strings(1,ival(1)) > strings (2, ival(1)) 4, Teansforme o algoritmo em declaragdes do MATLAB Estes sio os eédigos MATLAB finais: function result = c_etremp(strl,str2) ‘ac_sTRCMP Compare strings like C function ‘stremp” % Function C_STRCMP compares two strings, and returns & a -1 of strl < str2, a0 if strl == str2, anda S41 if stri > str2 & Define variables aife Logical array of string differences msg or message sult Result of function zl First string to compare 22 Second string to compare strings Padded array of strings Record of revisions: Date Progranner Description of change 05/18/99 s. J. Chapman Original code % Check for a legal number of meg = nargehk(2,2,nargin) error (msg): © argumen % Check to see if the arguments are strings if -lisstr(strl) & isstr(str2)) error(‘Both strl and str? must both be strings!"| % Comparece string: Gift = strings(1,:) = if sum(diff}) == 0 Captlo 6 sos Compe. Orso de Cractmse Toe Aco Bsramas | 269 & Strings match, so ret: result = 0 else % Find firet difference between str: Hind (dite); js(1,ival(1)) > strings (2, ival (1)) 1: 5. Teste 0 programa Em seguida, devemos testar a fungio usando varias cadeias de caracteres, eromp( ‘String 1", ‘String 1") = cetromp(’string 17, /string 1") tromp( ‘String 1", ‘String 2") result “1 » result = ¢ etromp(’string 1’, string 0”) result = >» reault = result ol eromp( ‘string’, ‘etr’) (© primeiro teste retorna zero, porque as duas cadeias de caracteres sio idén- ticas. O segundo teste também retoma zero, pois as duas cadeias sao idénticas, ‘exceto quanto aos espagos em Branco no fim, e 0s espagos em branco so ignorados, O terceiro teste retomna -1, porque as duas cadeias diferem primeiro na posicio B,e'1" < ’2” nessa posigio, O quarto teste retoma 1, porque as duas cadeias, diferem primeiro na posigio 8, ¢ ‘1’ > 0° nessa posigio, O quinto teste retorna 1, pois as duas cadeias de caracteres diferem primeiro na posigio 1, € vst < ‘5? na seqiéncia da tabela ASCII Essa fungio parece estar funcionando adequadamente, < Este teste apresenta uma verificagio rdpida do seu entendimento dos conceitos apresen- tados nas Segbes 6.1 e 6.2. Se voce tiver problemas com o teste, reeia as segbes, pergunte a0 seu professor ou discuta o material com um colega. As respostas podem ser encon- tradas no final do livro. 264 | Pogamio am sro” gra Enereiros 1. Qual o valor de resu2t nas declaragoes seguintes? @) x = 12 + its; ye 5 ~ i*3; result «x > y; (by x 12 4 8s; y = 5 - i813; result = abs(x) > abs(y); (x= 124 its; y= 5 ~ int; result = real(x) - imag(y); 2. Se array for uma matriz complexa, 0 que a fungio plot (array) faz? 3. Como vocé pode converter um vetor do tipo de dados char em um vetor do tipo de dados double? Para as questies 4 a I, determine se essas declaragdes estdo corretas. Se estiverem, 0 ‘que é produzido por conjunte de declaragées? 4. strl = ‘This is a test! ': Line, too."; 5. ea: line 2"; strcati(stri,str2); 6. ‘This is a test! ‘this ([strl, ‘this is a test ‘This line, too.’ stri,str2); ‘this is a test! This line, too. res = strnemp(stri,str2,5); 9. strl = ‘This is a t . res ~ findstr(serl,"5"); 10. stri = ‘This is a test! " str (4:7) = upper(str1(4:7)) : ML strl - ‘This way to the egres str2 = ‘This way to the egret. res emp (Seri, str2); 6.3. Matrizes Multidimensionais Desde a Versio §.0, ¢ MATLAB dé suporte a matrizes com mais de duas dimensdes, [Essas matrizes multidimensionais so muito titeis para apresentar dads que intrinseca- ‘mente tom mais de duas dimensSes, ou para apresentar miiltiplas versoes de conjuntos de dados 2-D. Por exemplo, medidas de pressao e velocidade em um volume tridimen- sional so muito importantes em estudas como aerodindmica e dindmica dos fluids. Esses tipos de dreas usam naturalmente matrizes mulidimensionais, Capita § ios Cones, Osas a Caactoese Tia Adonis ce Dayamms | 265 “Matrizes multidimensionais sio uma extensio natural das matrizesbidimensionais, Ca- da dimensio adicional é representada por um indice adicional usado para localizar os dados. E muito facil criar uma matriz multidimensional. Elas podem ser criadas atribuin- do-se valores diretamente em declaragies de atribuicgéo ou usando-se as mesmas fungbes usadas para criar matrizes de uma ou duas dimensdes. Por exemplo, suponha ‘uma matriz bidimensional criada pela declaragio de atribuigio paet12345678) oa 2 3 4 5 6 7 8 Essa € uma matriz.2 x 4, com cada elemento localizado por dois indices. A matriz pode ser estendida para tomar-se uma matriz tridimensional 2 » 4 x 3, com as seguintes declaragdes de atribuigdo: ete2) = (9 20 42 42) 23 24 45 162; v2.3) = [47 1819 20, 21 22 23 24) 2 3 4 5 6 7 8 als.2,2) 5 a2 13 i516 ro) « lye 1920 BL 22328 Elementos individuais dessa matriz. multidimensional podem ser localizados pelo nome da matriz seguido por trés indices, ¢ subgrupos dos dados podem ser eriados uusando-se o operador vingula, Por exemplo, o valor de a (2,2, 2) € > 0(2,2,2) ia eovelora(t,1,:) € » atl ans(: a ans(i,:,2) = ) Matrizes multidimensionais também podem ser criadas pelas mesmas fungdes de outras matrizes. Por exemple: > D = ones(4,4,2) 1 1 1 1 266 | Pegamepio em MALA9® po Enerterae 1 1 a 1 1 a 1 11 1 i 1 randn(2,2,3) 0.1253 012877 1.1892 0.0376 0.1867 0.7258 Ontimero de dimensbes em uma matriz multidimensional pode ser encontrado pela, fungie ndims, e o tamanho da matriz pode ser encontrado por meio da fungao si ze. » ndime(c) 3 » size(c) 2 2 3 Se vocé estiver escrevendo aplicagbes que precisam de matrizes multidimensionais, veja o Manual do Usudrio do MATLAB para mais detalhes sobre o comportamento de varias fancies do MATLAB com matrizes multidimensionais. Boa Pratica de Programagao Use matrizes multidimensionais para resolver problemas naturalmente multivaridveis em natureza, como aerodindmica e fluxo de fluidos. 6.4. Diagramas Bidimensionais Adicionais Nos capitulos anteriores, aprendemos a criar diagramas lineares, log-log, semilog ¢ po lares. O MATLAB suporta muitos tipos adicionais de diagramas que Voce pode usar para apresentar seus dados. Esta secio apresentard a voce algumas dessas opgbes de diagramas adicionais, 6.4.1 Tipos Adicionais de Diagramas Bidimensionais ‘Alem dos diagramas bidimensionais que jé vimos, o MATLAB suporta muitos outros dia- gramas mais especializados. De fato, 0 Navegador de Ajuda do MATLAB lista mais de 06 Dados Conley Gian ce acterece Tips Adcom oe Oapanae | 267 20 tipos de diagramas bidimensionais! Exemplos incluem diagramas de haste, diagra- ‘mas de escadas, diagramas de barras, diagramas de pizza e diagramas de radar. Um diagrama de haste € um diagrama no qual cada valor de dado € representado por um mar- cador e uma linha que conecta os marcadores verticalmente em relagio a0 exo x. Um diagrama de escada € urn diagrama no qual cada ponto de dados é representado por uma linha horizontal e pontos sucessivos sao conectados por linhas verticals, produzindo um feito tipo degraus de escada. Um dingrama de barras 6 um diagrama no qual cada ponto representado por uma barra vertical ou horizontal. Um dingrama de pizza é um diagra- ma representado por “fatias de pizza” de tamanhos variados. Finalmente, um diagrama de radar é um tipo de diagrama polar no qual cada valor é representado por uma setz cujo comprimento é proporcional ao seu valor. Esses tipos dle diagramas estdo resumidos na Tabela 63, e exemplos de todos os diagramas aparecem na Figura 6.7 Diagramas de escada, haste, barra vertical, barra horizontal e radar sio todos semelhantes a plot e sio usados da mesma maneira, Por exemplo, 0 cédigo seguinte produz o diagrama de haste apresentado na Figura 6.70: x= (12345 61; y=(268785) stem(x,y) : title(*\bfexanple of a stem Plot’): xlabel (‘\bf\itx'}; ylabel ("\bé\ity") axis({0 7 0 10]}; Diagramas de escada, barra e radar podem ser criados substituindo-se stem, no cédigo acima, por stairs, baz, barh ou compass. Os detalhes de todos esses diagramas, ineluindo qualquer parametro opcional, podem ser encontrados no sistema de ajuda on-line do MATLAB. Tabela 6.3 FungOes Adicionals de Diagramas Bidimensionals Fangio Desergao — — barony) ssa fungio cia um diagrama de barras vets, com os valores de x usados para rotula enda barra eos valores de y usados para determina a altura da Bars barony Essa fungio era um dlagrama de barra horizons, com os valores de x usados para rotular cada barra os Valores de y usados para determinar © comprimento 01 zontal da bars Essa fungi cla tm diagram polar, com uma toa saindo da origem em diroio 2 cada ponto (2). Note que as localizagoes dos pontos a serem representados no di ‘rama sto especfcadas em coordenadas eartesianss, no em coordenadas polars. pievay Essa funglo cela um diagrama de plaza. Determina a porcentagem da pizza ila pie(rexplode) que coresponde 2 cada valor de, e representa pedages de puzz2desse amino ‘A matriz opconal explode conto sos pag indvidats #30separados ow no do restated pez ssa funglo era um dagrama de pres, com cada degrau da escadacenralizade em tum ponte (9). 1 de haste, com um marcador em cals pont zg} € uma re, dese pont ate a ino 268 | Pogamaeso em arag® para Enereras aptle& uses Conpiees, Daas de Caceres Tipe Aca oe Dararss | 269 example de um Digrara de He Example de un Darams de Boras @ C) $e i i ; — / fl 1 o Figura 6.7 (Continuagio) Tipos adicionais de diagramas 2D: (¢)iagrama de barra verticais (id) Figura 6.7. Tipos adicionais de diagramas 2D: (2) diagrama de haste; (b) diagrama de escada. dliagrama de barras horizontais, 210. | Programas om MAT AD pare Enenteros Figura 6.7. (Continuapio)Tipos adicionais de digramas 20: () di de radar, rama de pizza; () diagrama Capile 6 nis0e Campin, cos ob Cvactee Tips Aas de Oagrmas | 271 A fungio pie comporta-se de modo diferente dos outros diagramas anteriormente descritos. Para criar um diagrama de pizza, um programado: passa uma matriz x que contém os dados a serem representados no diagrama, e a fungao p-e determina a por- ‘centagem da pizza total que cada elemento de x representa. Por exemplo, se a matriz x for [1 2 3-4}, entio pie calculard que o primeiro elemento, x (1), €1/10, ou 10% da pizza, 0 segundo elemento, x (2), 2/10, ou 20% da pizza, e assim por diante. A funcéo, ‘entio, representard no diagrama essas porcentagens como fatias de pizza ‘A fungio pie também suporta um parémetro opcional, explode. Se estiver pre- sente, explode é uma matriz logica de I's e 0's, com um elemento para cada elemento nna matriz. x. Se um valor em explode for 1, entao a fatia de pizza correspondente é desenhada um pouco separada da pizza, Por exemplo, o cédigo a seguir produz.o dia- grama de pizza da Figura 6.7e. Note que a segunda fatia da pizza ests “separads” gata = [1037566 explode = [ 010 0 0); pie (data, explode) + title(*\bfexemplo de um Diagrama de Pizza’); legend (*Um", "Dois", "Trés", ‘Quatro’ ,"Cinco"): 6.4.2 Fungdes para Diagramas Em todas as diagramas anteriores, criamos matrizes de dados e passamos essas ma- trizes para a fungio de diagrama. O MATLAB também inclui duas fungdes que repre- sentam diretamente uma fungio em diagrama, sem a necessidade de criar matrizes de dados intermedidrias: ezplot e fplot ‘ezplot toma uma das seguintes formas: fun): fun, (xmin xnax) }: fon, (emin xnax], figure Em todos os casos, fun é uma cadeia de coracteres que contém a expressio funcional a ser avaliada. O parimetro opcional [xmin xmax) especifica a faixa da fungao a repre sentar no diagrama. Se estiver ausente, a funcio seré representada entre ~2n ¢ 2t. O parimetro opcional £igure especifica o ntimero da figura sobre a qual a funcao deve ser representada. or exemplo, as declaracbes a seguir constroem o diagrama da fungio f(x) = sin (xix entre ix € 4x. A saica dessas declaragies € apresentada na Figura 6.8. Lot 'sin(x) /x!, [-4*pi 4*pil) title(’Plot of sin x / x‘); grid on; A fungio fplot ¢ semelhante a ezplot, s6 que mais sofisticada. Os dois primeiros argumentos so 0s mesmos para ambas as fungbes, mas £pot tem as seguintes vantagens 1. Afungio Eplot € adeptatioa, 0 que significa que caleula e mostra mais pontos de dados nas regies em que a funcao a ser representada no diagrama esta mudando mais rapidamente. O diagrama resultante € mais preciso em locali- zacbes em que © comportamento da funcio muda subitamente, 212 | roanagio em MATLAB pr peters wf} | Tf . | ' | a0 5 ° 3 0 Figura 6.8 A fungio sin ix) /x, representada em diagrana com a fungio ezplot. 2. A funcio Eplot suporta 0 uso de comandos TX em titulos e em rétulos de ‘eixos, enquanto a fungio ezplot ni. Em geral, vocé deve usar fplot preferivelmente, em relasio a ezplot, sempre que fizer diagrama de funcbes, As fungGes ezplot e fplot sio exemplos das “fungoes de fungdes”, descritas no Capitulo 5. Boa Pratica de Programagéo Use a fungio fp1ot para representar fungies em diagramas diretamente, sem precisar criar matrizes de dados intermedirias. 6.4.3 Histogramas ‘Um histograma é um diagrama que mostra a disteibuipio de valores em um conjunto de dados. Para criar um histograma, a faixa de valores em um conjunto de dados é divi- dida em grupos regularmente espacados, e o nlimero de valores de dados que caem em ula § Ones Conse, Dns o Cazares Ts Adios Dagames | 273 cada grupo é determinado. A contagem resultante pode, entio, ser representada em um diagrama como fungdo do ntimero do grupo. ‘A funglo-padrdo do MATLAB para histograma é hist. A forma dessa fungio é a seguinte: hise(y) tly mbins) hist (y,x); [n,xout] = histty, ‘A primeira forma da fungdo cria e constr6i um histograma com dez. grupos igualmente espagados, enquanto a segunda forma cria e constréi um histograma com nbins ‘grupos jgualmente espacados. A terceira forma da funcao permite que o usudtio especi- fique os centros dos grupos a serem usados em uma matriz x; a fungéo cria um grupo centrado em torno de cada elemento da matriz. Fm todos os trés casos, a funcio cria € constrdi o histograma. A tiltima forma da fungdo cria um histograma e retorna os centros dos grupos na matriz xout e a contagem de cada grupo na matriz n, sem real- ‘mente criar um diagrama. Por exemplo, a declaracéo a seguir cria um canjunto de dados com 10,000 valores aleatérios gaussianos e gera utn histograma dos dados usando 15 grupos igualmente cespacaclos. O histograma resultante é apresentado na Figura 69. y = randn(10000,1); hist (y,15); 2.500, LaLa | z Figura 6.9. Um histograma, TA | Prararagso em MATAB® pa Egeneias O MATLAB também inclu uma fungio rose paracriar e construir um histograma sobre eixos radiais E especialmente itil para a distribuigdo de dados angulares. Voce deverd usar essa fungio em um exercicio do fim do capitulo 6.5. Diagramas Tridimensionais (© MATLAB inclui também uma rica variedade de diagramas tridimensionais, que podem ser titeis para representar certos tipos de dados. Em geral, diagramas tridimen- sionais sio uiteis para representar dois tipos de dados. 1. Duas varigveis que slo funcBes da mesma variével independente, quando voce deseja enfatizar a importancia da variavel independente. 2. Uma tinica varidvel, que é uma fungao de duas varidveis independentes. 6.5.1 Diagramas Tridimensionais de Linha ‘Um diagrama de linha tridimensional pode ser criado com a fungdo plot 3. Essa funglo € exatamente como a funcio bidimensional pot, exceto que cada ponto é representado por valores x, ye z, em vez de apenas valores xe y. A forma mais simples dessa fungio é plot (x,y.2) onde x, y € 2 so matrizes de tamanhos iguais que contém a localizago de cada ponto a ser representado. A fungo plot 3 suporta todas as mesmas opcdes de tamanho de linha, estilo de linha e cor de pict; vocé pode usé-la imediatamente, empregando 0 conhecimento adquirido nos capitulos anteriores. Como exemplo de um diagrama de linha tridimensional, considere as seguintes Fungées: X(t) = €°82' cos 2¢ y(t) = 0-92 sin 2t uy Bssas fungbes poderiam representar as oscilagdes de cesgaste de um sistema mecanico ‘em duas dimensées, de modo que x e y juntos representam a localizagao do sistema em tum dado tempo. Note que x e y sao ambos fungées da mesma varidvel independente t Poderiamos criar uma série de pontos (ry) e tepresenté-los em um diagrama usando a fungio bidimensional pio: (Figura 6.102), mas, se fizéssemos isso, a impor- tincia do tempo sobre o comportamento do sistema nio ficaria evicente no grafico. AS dleclaragdes a seguir criam o diagrama bidimensional da localizacao do objeto apresen- tado na Figura 6.10a, Nio é possivel, a partir desse grifico, dizer quio rapidamente as oscilages esto parando. t= 020.1210; X= exp(-0.2%t) .* cosi2tel: y = exp(-0.24t) .* sini2ech; —__ ~ Cane § dos Compleay, Dies Caactaree Ts Asis ee Carns | 275 plot (x,y) title(*\bEDiagrama de Linha Bidimensional") ; xlabel (' \bEx') ; ylabel ("\bEy"): [Em vez disso, poderiamos representar as varidveis com plot3 para preservar a informagio do tempo, bem como a posigdo bidimensional do objeto. As declaragies seguintes eriardo 0 diagrama tridimensional das Equagbes 6.11, e 0:0.1:10; exp(-0.24t) .* cos(2*tl: ¥ = exp(-0.2%t) .* sin(2tth; plots (x,y, t) 5 title("\bfDiagrana de Linha Tridimensional’); xlabel ("\bfx") ylabel (‘\béy"); zlabel ("\bftempo") axis square; grid on; Diagrams de Linh censor Figuta 6.10 (c) Um diagrama de linha bidimensional mostrando 0 movimento no espaso (xy) cle um sistema mecinico, Esse diagrama nao revela nada sobre o comportamento do tempo do sistema, (@) Um diagrama de linha tridimensional mostrando 0 movi mento no espago (ry) tersus o tempo para o sistema mecinico. Esse diagrama mostra claramente o comportamento do tempo do sistema, 216 | Proramazso em san” po Enero ‘tga de Lona Taiensions 7 wy + | Figura 6.10 (Continuagé grafico resultante € apresentado na Figura 6.10b. Note como esse diagrama enfatiza a dependéncia do tempo das duas varidveis x y. 6.5.2 Diagramas Tridimensionais de Superficie, Malha e Curva de Nivel Diagramas de superficie, malha e curva de nivel sio maneicas convenientes de repre- sentar dados que sao fungio de duas varidveis independentes. Por exemplo, a terpera- tura em um ponto é uma funcio tanto da localizacao leste-oeste (x) como da localizacSo rorte-sul (y) do ponto. Qualquer valor que seja uma funcio de duas variéveis indepen- dentes pode ser representado em um diagrama de superficie tridimensional, de malha ow de curva de nivel. Os tipos mais comuns de diagramas esto resumicos na Tabela 64, € ‘exemplos de todos os diagramas sio apresentadios na Figura 6.112 Para construir diagramas usando uma dessas fungies, 0 usudrio deve erar ts ma teizes de igual tamanho. As trés matrizes devem conter os valores de x, ez de todos 0s Pontos a serem representados. Como um exemplo simples, suponha que queiramos epre- sentar os quatro pontos (-L-11), (1-12) (1,11) e (110). Para wepresent-ls, devemos Pe ne rilecTi ale [ia] > HE& muita varagSesdesss tipo béscos de dagramas. Consule 2 documentario do Sistems de Ajuda do MATLAB para uma descrigso completa dela. criar as matrizes x = Captule Sas Carpenters eps Adina de sgamas | 27 A matriz x contém os valores de x associados a todos os pontos do diagrama; a matriz y contém os valores de y associados a todos os pontos do diagrama; a matriz 2 contém todos os valores de z associados a todos os pontos do diagrama. Essas matrizes sio, ‘enti, passadas para a fungdo de construgao do diagrama. Tabela 6.4 Fungdes Selecionadas de Diagramas de Malha, Superficie e Curva de Nivel Fangio ~_Deserigio sash. ¥2 ssa fangio via um diagrama de maths ou tela de arame, onde x 6 uma matiz ‘dimensional que contém 08 valores de x de todos os ports a serem represen: ‘ads, y€ uma matee bidimensionl que conti os valores dey de toot o¢ pontos 2 serem representados 2 é uma mati bidimensionl que contém os valores de 2 de todos os pontos a serem representados surf ix.y.2) ssa fanglo cla um diagrama de superficie. As matrizes x y ez tim o mesmo sigaiiado do diagrama de malha contourli,y,2} Essa fang cr um diagrama de curva denivel, Atmatrizesxyez témomesmo signifade do diagrarna de malha fr 08 ‘ yan on i ca y Hh ° LTS (al Figura 6.11. (2) Um diagrama de matha da fung0 esse diagrama aparece no enca 218 | Pregansctoem wATAB? para Eoentehos + ‘ C Figura 6.11 (Continuagio)(b) Um diagrama de superficie da mesma fungSo.(c) Um diagrama de curva de nivel da mesma fungio, Vers6es coloridas desses diagramas aparecer no L aplae§ cave Conlon, Cave Cosco Tes conse d Dspamie | 279 A fungio neshar 4 do MATLAB torna mais facil a criagdo das matrizes x e y ncessdrias a esses diagramas. A forma dessa fungio é [x y] = meshgrid( xstart:xine;xend, ystart:yinctyend); onde xstart:xinc:xend especifica os valores de x a serem incluidos na grade e ystart:yinc:yend especifica os valores de y a serem incluidos na grade. Para criar um diagrama, usamos meshgr id para criar as matrizes de valores xe y, depois avaliamos a fungdo a ser representada em cada uma das localizagies (xy). Finalmente, usamos as fungies mesh, surf ou contour para criar o diagrama, Por exemplo, suponha que queiramos criar um diagrama de malha da fungio atey) = eA snste97 12) no intervalo -4 Sx $4 ¢~4 Sy <4, As declaragées a seguir criatio 0 diagrama, que é apresentado na Figura 6.1la [ery] = meshgrid(-a:0.2:4,-4:0.2:4)7 2 = exp(-0.5*(x.*24y-42)) mesh (x,y.2) 2 xlabel ("\bEx"] ylabel (‘\bfy"}; zlabel("\bEz"1: Diagramas de superficie e de curva de nivel podem ser criados substituindo-se a funcio nesh pela fungao apropriada, 6.6 Resumo O MATLAB suporta niimeros complexos como uma extensio dos dados tipo double, Esses niimeros podem ser definidos usando i ou 3, ambos predefinidos como Y=. O uso de nimeros complexos € direto, exceto que os operadores relacionais >, >=, eratb 2 ° oo o oo o 0 o 0 4 Cn) ° nr) ° oo 0 . 4 0 ° ar) o . 8 ° ° 0 2 2 0 9 6 0 0 ° ° 0 0 1 80 00 oo ° ° a ° 0 82 0 0 oo oa oo 0 0 2 ° 0 0 ° 0 Cn) o ar) 2 a0 o ° a) ° an) o 20008 ° 0 0 ° o 9 6 0 0 2 © proceso de multiplicar essas duas matrizes esparsas juntas requer 1.900 multipli- cages e somas, mas a maioria dos termos que esto sendo adicionados e multiplicados é zer0, de modo que foi, em grande parte, um esforgo desperdigado. Esse problema piora rapidamente a medida que a matriz, cresce. Por exemplo, suponha que vamos gerar duas matrizes esparsas 200 x 200 a e b, como a seguir. a= 5 * eye(200); b= 3 * eye(2col; Cada matriz. contém 20.000 elementos, dos quais 19800 sio zeros! Além disso, multi- plicar essas duas matrizes juntas requer 7.980.000 somas e multiplicagées! FFica claro que armazenar e trabalhar com matrizes esparsas grandes, cujos ele- mentos si0 em sia maioria zeros, é um sério desperdicio de meméria do computador e Captwe7 Moira Eigse Metrie Ceaarese Eettvas | 287 dle tempo de CPU. Infelizmente, muitos problemas do mundo real criam naturalmente matrizes esparsas, por isso precisamos de uma forma eficiente para resolver problemas que os envolvam. ‘Um sistema grande de enengia elétrica 6 um excelente exemplo de um problema do mundo real que envolve matrizes esparsas. Sistemas grandes de energia elétrica podem ter uma centena ou mais de barramentos elétricos nas instalagées de geraco e nas subestagies de transmissao e distribuigdo. Se desejarmos saber as voltagens, as cor- rentes ¢ 0s fluxos de energia do sistema, devemos primeiro determinar a voltagem em cada barramento. Para um sistema de 1.000 barramentos, isso envolve a solucio simul- tinea de 1.000 equagies para 1.000 desconhecidos, o que é equivalente a inverter uma ‘matriz com 1,000,000 de elementos, Resolver essa matriz requer milhdes de operagies de pontos flutuantes! Entretanto, cada barramento em um sistema de energia estd provavelmente conec tado, em média, a apenas trés outros barramentos, de modo que 996 das 1.000 termos de cada linha da matriz serdo zeros, e a maioria das operagdes envolvidasna inversdo da ‘matriz serd soma e multiplicagio de zeros. O céleulo das voltagens e das correntes nesse sistema de forca seria muito mais simples eeficiente se os zeros pudessem ser ignorados 1no process0 de solugao. 7.1.1 0 Tipo de Dados sparse © MATLAB tem um tipo de dados especial projetado para trabalhar com matrizes esparsas, O tipo de dados sparse difere do tipo de dados double pozque apenas os elementos nio-2ero de uma matriz sio alocados em localizagdes ce memoria. O tipo de dados sparse grava, na realidade, trés valores para cada elemento néo-zero: 0 valor do elemento e 0s ntimeros de linha e coluna onde o elemento esté localizado. Embora trés valores devam ser gravacios para cada elemento nao-zero, essa abordagem & muito mais cficiente em termos de memria do que a alocacio de matrizes inteiras para matrizes cesparsas, Para ilustrar 0 uso de matrizes esparsas, vamos criar uma matriz.de identidade 10% 10. > a = eye(10) 1 00 0 o 8 0 oo a oe a o 1 @ oo oo 9 9 @ o ooo 1 oo 9 9 90 0 0 oo 0 1 o 9 oo © 6 o o 0 0 o@ 2 0 0 @ oe @ o 0 > a 0 1 9 a o 4 ar) nd 0 ot 0 0 0 oo o 9 0 9 90 1 o o oe rn 0 o Oo 21 0 0 0 oO 0 o 0 a 0 @ 4 Se essa matriz for convertida em matriz esparsa usando a fungdo sparse, os resul- tados serio 288 | Pioganacto em wane para Eneateies sparse (a) (a (2,2) G.3) aay (5,5) (6.6) (7) (aa) (3.9) (10,10) 1 1 Note que os dados na matriz esparsa so uma lista de enderegos de linha e coluna, seguidos pelo valor do dado nao-zero naquele ponto. Essa é uma forma muito eficiente de armazenar dados, contanto que @ maior parte da matriz seja zero; se existirem muitos elementos nio-zero, isto pode ocupar ainda mais espaco que a matriz completa, devido & necessidade de armazenar os enderegos. ‘A fungio issparse pode ser usada para estabelecer se uma determinada matriz de caracteres 6 esparsa ou ndo. Se uma matriz de caracteres for esparsa, issparse (array) retorma 1 © poder do tipo de dados sparse pode ser visto considerando-se uma matri2.z 1.000 x 1.000, com uma média de quatro elementos néo-zero por linha. Se essa matriz for armazenada como uma matriz completa, vai requerer 8.000.000 de bytes de espaco. Por outro lado, se for convertida em matriz esparsa, 0 uso de meméria caira drasticamente. » zessparse(z); » whos Name Size Bytes Cla: z 1000x1000 8000000 double a ze 1000x1000 «51188 sparse array Grand total is 1003932 elements using 8051188 bytes 7A1.1 Gerando Matrizes Esparsas O MATLAB pode gerar matrizes esparsas por conversio dle uma matriz completa em ‘uma matriz esparsa com a funcio sparse, ou por geragio direta de matrizes esparsas com as fungSes MATLAB cpeye, eprand e sprandn, que so as equivalentes es parsas de eye, rand e randn. Por exemplo, a expressio a = speye(4) gera uma maatriz esparsa 4 = 4 > a = speye(4) Capito 7 is expanses nuns Ceuarese tates | 209 Acexpressdo b = £411 (a) converte a matriz esparsa em matriz. completa > b= full(ay > o 7.1.4.2 Trabalhando com Matrizes Esparsas Quando uma matriz é esparsa, elementos individuais podem ser adicionados a ela ou removidos dela usando-se declarag3es de atribuices simples. Por exemplo, a seguinte declaragio gera uma matriz esparsa 4 x 4 ¢ depois adiciona outro elemento nao-zer0 a ela > a = speye(4) aa 1 (2,2) a B,3) 2 a4) 1 = a(2)1) = -2 aa a 2 1 i © MATLAB permite que matrizes completas e esparsas sejam liviemente mistu- radas e usadas em qualquer combinagio. O resultado de uma operagio entre uma ‘matriz completa e uma matriz esparsa pode ser uma matriz completa ou uma matriz, esparsa, dependendo de qual resultado é mais eficiente, Essencialmente, qualquer téc- nica de matriz disponivel para matrizes completas esté também disponivel para matrizes esparsas, Algumas das fungdes de matrizes mais comuns so apresentadas na Tabela 7.1. » Exemplo 7.1 ~ Resolvendo Equagdes Simulténeas com Matrizes Esparsas, Para ilustrar a facilidade com que matrizes esparsas podem ser usadas no MATLAB, resolveremos 0 seguinte sistema simultineo de equagdes com matrizes completas ¢ cesparsas: 290 | Progamigio em aATLAB” para Engenteos Captle7 zs Expres, Mins Clues Extras | 291 } 10%, + 0.0% + 10x, + 00x, + 00x, + 20% + 00x, 1.0% = 3.0 — & Record of revisions: 0x, +108, + 003, + On, + 00% + 0.0%, + 00%, + 0054-20 yo pate Progranner Description of change 1 | 05x, + 00x, + 2.0x5 + 0x, + 0.0x5 + 0.0% 4 ~ LOx; + 0.0% = -1.5 $ 10/14/98 S.-J. Chapman Original code | 00x, + 0.03, + 00x; + 20%, + 0.0%, + LOx, + Ux, + 0.0%5= 10 5 i 00x, + 00x; + 10x, + 10x, + 10x, + 00%, + U0; + 0.0%, = -20 § Define variables: ee tam , a Coefficients of x (full matrix ‘ 00x, + 00x; + 00%5 + 10%, + 0.0%, + LOx, + 10x, + 0.0%, = 10 28 Contticienta Gf 2 (agasee matron) 05x, + 00x, + 00s, + 00x, + 0.0x5 + 00%, + 10x, + 00x, = 1 sb Constant coefficients (full matrix) 0.0r, + 1.0%, + 00x, + 00x, + 0.0%5 + 00%, + 0.0%, + 1.0% = 1.0 a bs Constant coefficients (sparse matrix) ax Solution (full matrix) sxe Solution (sparse matrix) Tabela 7-1 Fungdes Comuns do MATLAB para Marios Esparsas % Define coefficients of the equation atx = b for Categoria Fangio Deseo % the full matrix solution. a= 1.0 0.0 1.0 0.0 0.0 2.0 0.0 -2.0; (Gra matrizes export epoye Cen uma mattis identi esparsa. oo Slo Ole elk lb alo ale ales ‘sprand Cea uma enti expars ue contin vores sletirioe 015 0.0 2.0 0:0 0:0 0.0 -1.0 0.0, istbaigosuiformement. 010 9:0 0.0 2.0 0.0 1:0 0:0 0.0; | ‘eprandn Cris uma maiz espana que ontém valores aletérios 0.0 9.0 110 1.0 4:0 0.0 0:0 0.0; sistbuidosaormalmente 010 9:0 019 1.0 9.0 1.0 0:0 0.0; Fongies de conversio parse Convert wma marie complet em uma mati spar : 5 9.0 0.0 0.0 0.0 9.0 1.0 0.0; completa para espars yi ‘Coaverte uma matriz esparsa ern uma matriz completa, 0.0 2.0 0.0 0.0 0.0 0.0 0.0 1.015 : ‘snd Loaiza nde vloee slementoenko-zto na matt be [ 3.0 2.0 1.5 1.0 2.0 2.0 2.0 2.01% Thbatando cam one __——_‘Niimere de clement ero mati § Define coetticients of the equation atx = b for mates eparsas—ponzeros Retna um velor de colina que contém os elementos nio-zero de ase eperselaye sea _ - bs = sparse (b); meme at two slocado pea clementog nSozero % Solve the system both ways * spores Subst elementosnfoto de mii pasa por um, Giep (Full matrix solution:'); xe a\b : fepslloe Aloca espago para uma mates exparsa Relora 1 (verdadero) pan mati para disp (/Sparse matrix solution:") -Aplie fanso par elemestos do zero de matriz xs = a8\be Visalonpadcto de eepasidade como um diagrara % show workspace po I Hee disp("Workspace contents after the solutions:") | whos, | Solugao ‘Quando esse programa for executado, 0s resultados serio [| Para resolver esse problema, vamos criar matrizes completas dos coeficientes da equaclo |e. depois, converté-as na forma esparsa, usando a fungio sparse, Em seguida, vamos resolver @ equagao das duas formas, comparando os resultados ¢ a meméria necesséria. ¥ ‘Segue-se 0 programa para executar esses calculys. Script file: simul.m ‘This program solves a system of 8 linear equations in & unknowns (a*x = b], using both full and sparse matrices ® 8 8 Purpose: . ® 8 Sparse matrix solution - ttle | ay 9.5000 | ey 2/0000 124 tl! GD 0.5000 20 ‘| eta 4 mca do 6.) =15000 aos 4 | 1 6 1.0000 wy) 0.7500 Workspace contents after the solutions: | { Name Size Bytes Class | a axe 12 double array Bret aa] t as ex 276 sparse array > ext 64 double array bs ext 104 sparse array x ext 64 double array = xs oxi 92 sparse array : Figura 7.1 Os elementos individuals de uma matriz celular podem apontar para matrizes Grand total Ss 115 elements using 1112 bytes reals, matrizes complexas,cadeias de caracteres, outras matrizes celulares ou até {As respostas so as mesmas em ambas as solugdes. Note que a solucio esparsa no imatrizes vaziss. contém uma solugdo para x, porque esse valor é zero, e zeros nio sdo carregados em csp ae e'te oes ma pine nate vrcloceicsee a imal espago que a forma completa. sso acontece porque a represertafioesparea deve fe nach oindles cs vores da atin,‘ ea € eos eee que ; wate dents scuna saneesaesee < a cxonia te vente 7.2 Matrizes Celulares fatty ata) 1 (ma cllr€ uma te MATLAS ee careers con batarn Ce ee ete naa ean ack go nae cane 7 teres e outra, ainda, uma matriz de niimeros complexos (Figura 7.1) Em termos dle programacdo, cada elemento de uma matriz celular 6 um apontador para outra estrutura de dados, ¢ essas estruturas de dados podem ser de diferentes, tipos. A Figura 72ilustra esse conceto, Matrizes celular si0 Gtimas manciras de cole- tar informagdes sobre tum problema, uma vez que toda a informacao pode ser mantida junta e acessada por um tnico nome. ae ‘Mateizes colulares usam chaves | | em lugar de panénteses ( ) para selecionar ¢ pats] apresentar 0 contetido de células. Essa diferenca se deve ao fato de matrzescelulares con- terem estruturas de dados, em vez de dados. Suponha que a matriz celular a seja definida como mostra a Figura 72. Ent3o, o contetida do elemento a (1,1) é uma estrutura de Fgura 7.2. Cada clemento de uma mati ela contém um qportador para outa estrutura de dados que contém uma matriz 3 x 3 de dados numéricos, e uma referéncia a a (1,1) diadose clus diferentes da mesma maria celular apontam para diferentes pos mostra 0 contetido da célula, que 6 a estrutura de dades. deestruturas de dados, ae a 294 | Pogamayso om MATA@® pra Engentees » a(a,a) [3x3 double] Em contraste, uma referncia a a(1, 1} mostra ocomtleido da estrutura de dass con tia na cfu > ala) 13047 200 6 05 4 Em resumo, a notagio a (1,1) se refere ao contetido da eélula a (1,1) (que é uma estrutura de dados), enquanto a notaso a{1, 1) se refere ao contedido da estrutura de dados de dentro da eélula. Erros de Programagao Tenha cuidado para nao confundir ( ) com | } em matrizes celulares. So operagdes muito diferentes! 7.2.4 Criando Matrizes Celulares Matrizes celulares podem ser criaclas de duas formas: © Usando dectaragies de atribuicio. © Préalocando uma matriz celular usando a fungio cel. O jeito mais fécil de criar uma matriz celular 6 aribuir diretamente estruturas de dados a células individuats, uma célula de cada vez. Frtretanto, pré-alocar matrizes celu- Tares 6 mais eficiente, pois vocé pode pré-alocar matrizes celulares realmente grandes. 7.2.1.1 Alocando Matrizes Celulares com 0 Uso de Dectaragdes de Atribuigao ‘oct pode atribuir valores a matrizes celulares, uma célula de cada vez, usando decla ragoes de atribuicio. Ha duas maneiras de atribuir dados a células, conhecidas como indexagio de contetido c indexasio de eélula, Indexagio de conteido envolve a colocagao de chaves “||” em toro de subscritos de células, juntamente com o contetido da célula em notagio comum. Por exemplo, a seguinte declaragio cria a matriz celular 2 % 2 da Figura 7.2: ape 7 tras Ears, Mis Claes eas | 295 allay “1,206; 054) a{1,2) = ‘Esta é una cadeia de texto.'; a{2,1) = (344*4 -5; -10*i 3 ~ 4*i); a(2.2) = Us Esse tipo de indexagao define o contesido da estrutura de dados conta em wma célule Indexagio de célula envolve a colocagao de chaves “{ )" em torno dos dados a serem armazenados em uma célula, juntamente com subscrites da célula em notagio de subscritos cour. Por exemplo, a seguinte declaracio cria a matriz celular 2 * 2 da Figura 7.2: ati) = (13-77 2067050) a(1,2) = (‘Esta é una cadeia de texto.) a(2)1) « ({3e4*i S$; -10%4 3 - a*ily; (2,2) = (0): Esse tipo de indexagio cria uma estrutura de dados que contém os dados especifcados, depois atribui essa estrutura de dados a uma célula, Essas duas formas de indexagio sio completamente equivalentes, e podem ser livremente misturadas em qualquer programa Erros de Programagao Néo tente criar uma matriz.celular com 0 mesmo nome de uma matriz numérica exis: tente, Se voc’ fizer isso, o MATLAB assumiré que voc estd tentando atribuir 0 con- tetido celular a uma matriz comum e gerard uma mensagem de erro, Assegure-se de Limpar a matriz numérica antes de tentar criar uma matriz celular com 0 mesmo nome. 7.2.1.2 Pré-alocando Matrizes Celulares com a Fungao cel ‘A fungio cel permite pré-alocar matrizes de células vazias do tamanho especificado. Por exemplo, a seguinte declaragdo cria uma matriz celular 2 % 2 vazia: a = cell(2,2) Uma vez criada a matriz celular, voc’ pode usar declaragies de atribuicio para preen- cher as células com valores 7.2.2 Usando Chaves {} como Construtores de Células E possvel definir muitas células rapidamente colocando-se todo o contesdo celular entre um vnico par de chaves. Celuiasindividvais de uma linha si0 separadas por vi gulas e lias sfo separadas por ponto-e-virgulas, Por exemplo, a seguinte declaragio ria uma matriz celular 2 «3 b= 4(2 21, 47, [2:4]; 3-4*1, "Hello", eye(3)> 296 | Pogameysoom MATLAB? ps Engeneios 7.2.3 Vendo o Conteiida de Matrizes Celulares (© MATLAB mostra a estrutura de dados em cada elemento de uma matriz celular de ‘uma forma condensada, que limita cada estrutura de dados a uma unica linha. Se a estru- tura de dados inteira puder ser apresentada na tinica linha, ela ser. Caso contrario, um resumo serd apresentado. Por exemplo, as matrizes celulares a e > sa0 apresentadas como [3x3 double) [1x22 char [2x2 double] c >be bs (1x2 double} 17] (2x1 double] [3.0000- 4,0000i) ‘Hello’ — (3x3 double} Note que 0 MATLAB est mosirando as estruturas de dados completas com chaves ou apéstrofos, ndo o contetido das estruturas de dados. Se voeé quiser ver o contedido completo de uma matriz celular, use a fungio cel 1disp. Essa fungio mostra o conteiido da estrutura de dados em cada edlula. >» celldisp(a) aa.) 10307 20 6 0 5 1 (2,1) 3.0000 + 4.00003 — -5.0000, 0 -10/0000i © 3.0000 ~ 4.00003 aca) Esta é uma cadeia de te a(2,2) = H Para uma apresentacio grifica de alto nivel da estrutura de uma matsiz celular, use a fungao cel plot. Por exemplo, a fungo cellplot (b) produz o diagrama apresentado na Figura 7.3. 7.2.4 Estendendo Matrizes Celulares ‘Se um valor for designado a um elemento de uma matriz celular que ndo existe no mo- mento, o elemento ser automaticamente criado, e quaisquer células adicionais neces- sérias para preservar a forma da matriz serio autometicamente criadas, Por exemplo, suponha que a matriz a seja definida como uma matriz celular 2 * 2, de acordo com a Figura 7.1, Se a declaragao a3 for executada, a matriz celular ser automaticamente estendida para 3 X 3, como mostra a Figura 7.4 Figura 7.3 Figura 7.4 Captle 7 Metnes Eps, Mies Cobos Esaues | 297 ‘Acestrutura da matrz celular» 6 apresentada como uma série aninhada de caixas pela fungio cei Iplot. (© resultado de designar um valor para 2{3,}, Note que quatro outras cdulas ‘vazias foram criadas para preservar a forma da matsiz celulae 298 | Proganagzo mn MATLAB? para Ergonteios 7.2.5 Apagando Células em Matrizes Para apagar uma matriz celular inteira, use 0 comando clear. Subconjuntos de células podem ser recortados designando-se uma matriz. vazia para eles. Por exemplo, assuma que a seja a matriz celular 3 * 3 definida anteriormente. [3x3 double] [1x22 char) o (2x2 double] a 0 no a ic I possfvel recortar a tercoira linha intra com a declaragio >a = 0 [3x3 double} [1x22 char) 1 [2x2 double] 1 o 7.2.6 Usando Dados em Matrizes Celulares Os dados dentro da estrutura de dados de uma matriz celular podem ser usados a qualquer tempo por meio da indexacio de contetido ou da indexagao de célula. Por exemplo, suponha que uma matriz celular c seja definida como © = ({1 2:3 41, ‘dogs’; ‘cate’, i} (© contetido da matriz armazenado na célula ¢(1, 1) pode ser acessado como » o(a.2) 34 0 contetido da matriz na eélula 2,1) pode ser acessado como » 0(2,2) Subconjuntos do contetido de uma eélula podem ser obtidos concatenando-se 0s dois conjuntos de subscritos. Por exemplo, suponha que quiséssemos obter o elemento (1,2) da matriz armazenada na célula ¢ (1, 1) de uma matriz celular c. Para fazer isso, uusarfamos a expressio c (1, 1} (1,2), que diz: selecione o elemento (1,2) do contetido da estrutura de dados contida na célula c(1, 1 » 6(1,1)(1,2) ple? Uses Espns. ces Ceres Etats | 299 7 .7 Matrizes Celulares de Cadeias de Caracteres Matas vezes 6 conveniente armazenar grupos de cadeias de caracteres em uma matsiz celular, em vez de armazené-los em linhas de uma matriz de caracteres-padrio, porque cada cadeia de caracteres em uma matriz celular pode ter um comprimento diferente, enquanto todas as linhas de uma matriz de caracteres-padrdo precisam ter compri- mentos idéntios. Ese fato significa que eadeias de caractres em matrizescelulares nab pre- cisum ser completadas com espagos em branco. Muitas fungbes da GUI do MATLAB wsam matrizes celular exatamente por essa £420, como veremos no Capitulo 10. “Matrizes celulares de cadeias de caracteres podem ser criadas de duas formas. As cadeias de caracteres individuais podem ser inseridas na matriz com chaves ou, alter nativamente, a funcio cellstr pode ser usada para converter uma matriz de carac- teres 2-D em uma matriz celular de cadeia de caracteres O seguinte exemplo cria uma matriz celular de cadeias de caracteres, inserindo as cadeias de caracteres na matriz celular uma de cada vez, e mostra a matriz cdlular resultante. Note que as cadeias de caracteres individuais podem ser de diferentes comprimentos. colistring(1) = ‘stephen J. Chapman’; cellstring(2} = ‘wale’ cellatring(3) = ‘SSN 999-99-9999"; cellstring “Stephen J. Chapman’ ‘Male’ vives *98N 999-99-9999" ‘A fungdo cel str eria uma matriz celular de cadeias de caracteres a partir de ‘uma matriz de caracteres 2-D. Considere a matriz de caracteres > data = (‘Line 1 gata = Line 1 Additional Line +y*Additional Line’) ssa matriz de caracteres 2 X 15 pode ser convertida em uma matriz celular de cadeias de caracteres com a fungio cellist: celletr(data) ‘bine 1 ‘additional Line’ pode também ser convertida de volta em uma matriz de caracteres-padrio usando a fungio char. > mewdata = char(c) newdata = Line 1 Additional Line — 300 | Mogamigsc em MATLAB” pare Enenias 7.2.8 A Importancia das Matrizes Celulares Matrizes celulares sio extremamente flexiveis, uma vez. que qualquer quantidade de {qualquer tipo de dados pode ser armazenada em cada célula. Como resultado, matrizes, Celulares so usadas em muitas estruturas de dados intemnas do MATLAB. Devemos entendé-las para usar muitas caracteristicas da GUI do MATLAB, que estudaremos no Capitulo 10. ‘Além disso, a flexbilidade das matrizes celulares torna-as caracteristicas regulares de fungdes com niimeros varidveis de argumentos de entrada e argumentos de said. Um argumento de entrada especial, varargin, esté disponivel nas fungoes MATLAB dlefinidas pelo usuario, para suportar nuimeros variaveis de argumentos de entrada, Esse argumento aparece como o iltimo item em uma lista de argumentos de entrada e retorna ‘uma matriz celular, de modo que um nico argumento modelo de entrada pode suportarqual- quer mirmero de argumentos reais. Cada argumento real torna-se um elemento da matriz celular gerada por varargin. Quando usedo, varargin deve ser o ultimo argumento de entrada de uma fungS0, apés todos os argumentos de entrada necessérios. Por exemplo, suponha que estejamos escrevendo uma funcio que pode ter qual- quer nmero de argumentos de entrada. Essa funcio pode ser assim implementada: function testl (varargin) disp({'There are ' int2str(nargin) ‘ arguments. ‘) @isp(’The input argunents are:'); disp (varargin) : ‘Quando essa fungio for executada com mimeros variéveis de argumentos, os resul- tados serio » testi ‘There are 0 arguments. ‘The input arguments are » best (6) There are 1 argunents. The input arguments are: 16) » testi (1, ‘teat 1°, [1 273 41) ‘There are 3 arguments. The input argunents are [1] ‘test 1° (2x2 double} ‘Como vocé pode ver, os argumentos tornam-se elementos de uma matriz celular na fungio. Veja a seguir um exemplo de fungio que usa ntimeros varisveis de argumentos. A fungio plotline aceita um ntimero arbitrério de vetores de linhas 1 x 2, com cada vvetar contendo a posigio (x.y) de um panto a colocar no diagrama. A fungo gera um diagrama de uma linha conectando todos os valores (x.y). Note que essa fungao também aceita uma cadeia de caracteres de especificagao de linha opcional, c passa essa espe ficagao para a fungio plot. Capulo Soros Epes Marae Causes eEdtes | 301 function plotline (varargin) SPLOTLINE Plot points specified by (x,y) pairs Record of revisions: Date Programmer Description of change 10/20/98 s. J. Chapman Original code jeck for a legal .number of input arguments We need at least 2 poi msg = nargchk(2, Inf,nargin); error (msg) ; % Function PLOTLINE accepts an arbitrary number of 8 [x,y] points and plots a line connecting them. % In addition, it can accept a line specification % string, and pass that string on to the plot function & Define variables Bou => Index variable 8 iG + Index variable % linespec =~ String defining plot characteristics % ass -- Error message % varargin Cell array containing input argu a x -- % values to plot soy -- y values to plot ® 8 3 2 : a plot a lin @ Initialize values 33 = 0; linespec = 1"; & Get the x and y values, making sure to save the line ® specification string, if one exists. for ii = linargin 8 Is this argumei % specification? if ischar (varargin(44)) % Save line specific nespec = varargin( an [x.y] pair or the line else @ This is an (x,y) pair. Recover the values. fi = 33+ x(ij) = varargin(4i) (1); y(33) = varargin(ii}(2); end % Plot function. if isempty (Linespec) plot (x,y) else lot (x,y, 1inespec) ; end 302 | Progam er MATLAB pra Egan Quando essa fungdo for chamada com os argumentos a seguir, o diagrama resul- tante serd apresentado na Figura 7.5. Teste a fungao com nuimeros diferentes de argu- mentos e veja por si mesmo como ela funciona, plotline({0 0}, (1.1), (2 4), (3 9], ‘ken: Hi também um argumento especial de saida, verargout, para suportar ntimeros varidveis de argumentos de saida. Esse argumento aparece como o sitimo item em uma lista de argumentos de safda e retorna uma matriz celular, por isso um sini argument ‘modelo de said pode suportar qualquer niimero de argumentos reais. Cada argumento real torna-se um elemento da matriz celular gerada por varargout. ‘Quando usado, vararaout deve ser oiltimo amgumento de saida de uma funcio, apds todos os argumentos de saida necessérios. O ntimero de valores serem armazenados em varargout pode ser determinado a partir da funcio naxoout, que specifica 0 nimero de argumentos de saida reais para uma dada chamada da fungéo. Por exemplo, suponha que estujamos eserevendo ama fungio que retoma valores aleat6rios em qualquer mimero de argumentos de saida. Nossa fungio pode detectar 0 niimero de argumentos reais usados durante qualquer chamada especitica com a funcio nargout,e pode armazenar esse mimero de valores como elementos de matria celularem varargout. Figura 7.5 0 diagrama produzido pela fungio plot ine Copia? soto pares tstraeeCauaes Extn function (nvals,varargout] = test2 (mult) $ nvale is the number of random values returned 8 varargout contains the random values returned nvals = nargout - 1; for L:nargout-L varargout{ii) = randn * mult; end Quando essa fungao é executada, os resultados sio os seguintes: » testa(4) “1 » [a bc a) = testa(4) 3 > 1.7303 6.6623 . 0.5013, Baga Fiitica de Programagao Use os argumentos de matrizes celulares varargin e varargout para criar fungdes que suportam niimeros varidveis de argumentos de entrada e de sada wanen 7.2.9 Resumo das Fungdes da Matriz ce. As fungSes comuns MATLAB que suportam matrizes celulares estio resumidas na Tabela 72 Tabeta 7.2 Fungdes Comuns do MATLAB para Matrzes Celulares Fang Deseig cell redefine a estrtura de uma mati celles cellaiep Most 0 conteido de una mati celui, celiplot Constr um diagrams de vena mati clue cellser —Converteuma mates de aracteres 2-0 em uma matiz celular de cadlas de caracores, cha CConverte uma mati celular de eins decaracteres em uma mateiz de caractres 2D, ‘AVLLVIN ou sopep so xeBou199 eed a z0dwT Tn oxduny ovju> 9 “XINA oP no sM@opulyy op vidos ap ssoSuny se opueZt| ‘0'L 0'0 wesZord o wos oxmnbue ajanbe opus] 9 “epenua ap souetper ira sossaidxo soqnug onenb sayuinias so pte (© asa], ‘Sopundas 9 soynunu ‘Snes wo So|-gHaAUOD 2 “ODsIp Wo epeRLE ap sopep ap onmbue wn ap soueypes wo soynug 29] exed wurexSoud wn eaamsg ‘ommuqur wn wo sopunas gg 2 nex um W9 soynuTUs 99 ‘o[R2sI9 wn WD vee Tz 0¢ FS inbre ajanbeu aseq woo eurexBoud 0 aynoax2 9 epenua ap sopep ap sabe 90 anboyoo *wuresBoud 0 a360} ered SorouIN ‘9 epenua ap oajnbre wn ap sazoyva ap vupnigTe ‘ued wuesosd ajanbe anbypoyy soup ap oyunfuo> sojnbep seippuu se sen} apepnuenb ewn spjnoje> exed gy], IW eusesoid umn Sowsassi2sa Z2'} O}19X9 ON “SEERA, ap saiue o sequl 80> ox so[ea souztn 8 1 sopep 2p Guivap Soyer souous 0» oreus 162e90| 9 epeaIy 2p sOpep (mI trl ap soutut ap onunkuos an sy eed eueasoad wn ea2dsy ‘ejaqaa ens ap seunjoo seu sepeud corde sepuafoy se anbojo-)*, son, opeurmousp vpyes ap oamnbue wn Wo ‘189 498 aaap eager Y ‘SOUR aoup souNord SOP seu epeD ¥ oqULISaAUT OP ‘cunyny 20]e4 0 ejaqey Cun Wo 19491559 9 1e}n9|e 97 une somNf ap wxEy LUN sonewatag wed conten we oRteuetos | ggg ee A 304 | Proraagio om MATLAB era Enemies 7.3 Matrizes Estruturas ‘Uma matriz 6 um tipo de dados no qual ha um nome para toda a estrutura de dados, mas elementos individuais na matriz 8 sao conhecidos por nuimeros. Portanto, 0 quinto elemento da matriz.chamada ar seria acessado por ar (5). Note que todos os ele- smentos individuais de uma mateiz devem ser do mesmo tipo (numérico ou caracter). ‘Uma mutrz celular também é um po de dados ro qual hi um nome para toda a estrutura de dados, e os elementos individuais da matsiz si apenas conhecidos por rtimeros. Entrotanto, 0s elementos individuais da matrizelularpadem ser de tipos diferentes. Em contrast, uma estrutura éum tipo de dados no qual cada elemento individual ece- bbe um nome. Os elementos individuais de ura estrutura so conhecidos como campos, e cada campo ce uma estritura pode ter um tipo diferente. Os campos individuaissio enderecaios pela combinagéo do nome da estutura com o nome do campo, separados por um pont ‘A Figura 76 mostra uum exemplo de estrutura chamada etucent. Essa estrutura fem cinco campos, chamados name, addr, city, s:ate e zip. O campo chamado “name seria enderecado por student -name ‘Uma matriz estrutura é uma matriz de estrutures, Cada estrutuza da matri2 tem ‘denticamente 03 mesmos campos, mas os dados armezenados em cada campo podem diferiz. Por exemplo, uma classe pode ser descrta por una mateiz da estrutura student, ‘© nome do primeiro estudante sera enderecado por student (2) -nane, a cidade do segundo estudante seria enderecada por student (2) .city, e assim por diante 7.3.1 Criando Estruturas. Estruturas podem ser criadas de dois modos: + Um campo de cada vez, usando declaragbes de atribui # Todos de uma vez, usando a funcéo struct. 7.3.1.1 Construindo uma Estrutura com Declaragdes de Atribuigao Voce pode constrair uma estrutura, um campo de cada vez, usando declaragdes de atribuigao. Cada vez que dados s40 designados para um campo, esse campo € auto- maticamente criado. Por exemplo, a estrutura apresentada na Figura 7.6 pode ser cria- da com as seguintes declaragdes: student name=/John Doe’; > student addri=/123 Main Street’; » student .citys"Anytown’; student .zipe’71211" tudent name: ‘John Doe’ addrl: 1123 Main Street’ ity: ‘Anytown’ state: “LA' zip ‘Um segundo estudante pode ser incluido na estrutura adicionando-se um subs- «tito & estratura name (antes do ponto), ule? Mavies Evrae, Mate Cabos Etats | 305 | hate 7.6 Exemplo de estrutura, Cada elemento da estrutura ¢ chamado campo, e cada campo ¢ enderesado por nome. » student (2).name=/Jane Q. Public’ studes 1x2 struct array with fields adaz1 student agora uma matriz 1 x 2. Note que, quando uma matriz estrutura tem mais de um elemento, s6 os nomes dos campos so apresentados. O conteido de cada elemento pode ser apresentado digitando-se o elemento separadamente na Janela de Comandos. — 308 | Prranoyio em UATA@® pare Enenteos » student (1) name: ‘John Doe’ addrl: ‘123 Main Street city: ‘Anytown’ state: ‘LA’ zip: "73211" » student (2) name: ‘Jane Q. Publ. adarl: [ city: ( zip: Note que todos os campos de uma estrutura serdo criados para cada elemento da matric sempre que esse elemento for definido, mesmo que nao tenha sido iniciado. Os campos nao i Ciacios conterio matrizes vazias, que poderdo ser iniciadas mais tarde com declaragées de atribuigio. (Os nomes dos campos usados em uma estrutura podem ser recuperados a qual- quer tempo usando-se a funco fieldnanes. Essa furcio retoma uma lista dos nomes clos campos em uma matriz celular de cadeias de caracteres e é muito ttil para trabalhar com matrizes estruturas em um programa. 13.4.2 indo Estruturas com a Fungo struct ‘A fungio struct permite que voce faca pré-alocacio em uma matriz de estruturas. A forma basica dessa fungio é structure_array = struct (fields) onde fields é uma matriz de cadeias de caracteres preenchida ou uma matriz celular que contém os nomes dos campos das estruturas. Com essa sintaxe, a fungio struct inicia toclos os campos da matriz.com uma matriz. vazia “Também é possivel iniciar os campos a medida que eles sio definidos. Essa forma da fungio é Larray = st t('fielai’, val, ‘fiela2",val2, ‘onde os argumentos sio nomes de campos e seus valores 7.3.2 Adicionando Campos a Estruturas ‘Se um novo nome de campo for definido para qualquer elemento em uma matriz estru- tura, o campo seré auomaticamente adicionado a todos os elementos da matriz, Por exemplo, suponha que adicionemos algumas notas de exames ao registro de Jane Public, Capa? isan spres, Wate Clue Esttvas | 307 » student (2) .exame student = 1x2 struct array adel city state zip {90 82 h fields: 1H agora um campo chamado exams em todos os registros da matriz, conforme mostrado a seguir. Esse campo serd iniciado para student (2) e serd uma matriz vazia para todos (0s outros estudantes, até que declaragdes de atribuiclo apropriadas sejam feitas, » student (1) nane: ‘John Dos’ addrl: '123 Main Street’ city: ‘Anytown’ state: ‘LA’ . zip » student (2) name: ‘Jane Q. Public’ adari: () city: state: (] zip: exams: [90 82 88) 7.3.3 Removendo Campos de Estruturas ‘Um campo pode ser removido de uma matriz estrutura pela fungio rmfield, A forma dessa fungio é struct? = rmfield(s ict _array, ‘field") onde struct_array ¢ uma matriz estrutura, ‘ Fie14’ 6 campoaser removidoe stu o nome de uma nova esteutura com aquele campo removido. Por exemplo, podemos remover o campo ‘3p’ da matriz estrutura stucent com a seguinte declaracao » etu2 = rfield(student, ‘zip’) stu2 = 1x2 struct a adér1 y with fields: ‘308 | Proramapso em mArLo® pare expoaras 7.3.4 Usando Dados em Matrizes Estruturas ‘Agora, vamos assumir que a matriz estrutura student tenha sido estendida para ineluir trés estudantes, ¢ que todos 0 dados tenham sido preenchidos como mostra a Figura 7.7. Como devemos usar os dados nessa matriz estrutura? ‘A informagio em qualquer arquivo de qualquer elemento da matriz pode ser aces- ‘sada nomeando-se o elemento da matriz, seguido por um ponto e pelo nome do campo, » student (2) .addrt P. 0, Box 17 » atudent (3) exams 65 ata (Qualquer item individual com um campo pode ser acessado adicionando-se um subs- Grito apés o nome do campo, Por exemplo, o segundo exame do terceiro estudante é > student (3) -exans (2) a (Os campos em uma matriz estrutura podem ser usados como argumentos em. qualquer fungao que suporte esse tipo de dados. Por exemplo, para caleular as médias de exames de student (2), poderiamos usar a fungéo » moan(student (2) exams) 86.6667 (rear) BE hs Dow oe nee ‘agen at atta ae 18Main sie 0 Boxt Ta Scame Se 89 anyon — LY Nowe’ — LY ee Yr Lees ao s5 00 ose LEP iese4any Figura 7.7 A matriz student com tiés elementos ¢ todos os campos preenchides. Capa? Mates esusas Auries Corer Etats | 309 Infelizmente,ndo podemas obter os valores de um dado campo através de muiltiplos elementos ao mesmo tempo. Por exemplo, a declaracio student. name nfo tem sentido eleva a um erro. Se quisermos obter os nomes de todos os estudantes, devemos usar olago for, for ii = 1:length(student) disp (student (ii) -nane); end Da mesma forma, se quisermos obter a média de todos os exames para todos os esti. dantes, néo podemos usar a fungéo mean (student .exans). Em vez. disso, pre ssamos acessar os exames de cada estudante separadamente e construir uma lista de todos 0s exames, examlist = (); for ii» 1:length(student) exam_list = [examlist student (ii) exams]: mean (exam_list) 7.3.5 As FungGes getfielde setfiela Duas fungdes MATLAB estao disponiveis para tomar matrizes estruturas mais féocis de usar em fungoes definidas pelo usudrio, A fungio get field obtém os valores atuais armazenados em um campo, ¢ a fungio set field insere um novo valor em um campo. A cstrutura de get field £ = getfield(as yy, {array_index}, "field’, (fiel |Lindex}) onde fie1d_index € opcional e array_index é opcional para uma matriz estrutura 1x LA chamada da fungio corresponde a declarac: € ay (array_index) . field(field_index); mas pode ser usada mesmo se o programador néo souber os nomes dos campos na ‘matriz estrutura, no momento em que o programa for escrito Por exemplo, suponha que precisemos eserever uma funcio para ler e manipular dados em uma matriz estrutura desconhecida. Essa funcio poderia determinar os romes dos campos da estrutura usando uma chamada para fieldnanes ¢, depois, ppoderia ler os dados usando a fungao get field. Para lero oédigo de enderegamento postal zip do segundo estudante, a fungi seria » 2ip = getfield(student, (2), /2ip") zip = 68888 ~ 310. | Progameso om AATAD® para Enero: De modo semelhante, um programa poderia modificar valores em uma estrutura usando a fungio set iel4. A estrutura da fungio set field é £ = setfield(array, (array_index}, ‘field’, (field_index}, value) onde £ éa matriz estrutura de safda, £ie1d_index é optional e array_index € opcional para uma matriz estrutura 1 x 1, A chamada da fungao corresponde & declaragao ay (arvay_index) .field(field_index = value); 7.3.6 Usando a Fungo size com Matrizes Estruturas Quando a fungio size 6 usada com uma matriz estrutura, retoma o tamanho da propria matriz.estrutura, Quando a fungio size é usada com um campo de um ele- ‘mento em particular em uma matriz estrutura, retornao tamanho desse campo, em vez, do tamanho da matriz inteira, Por exemplo: > size(student) » size(student (1) .name) 18 7.3.7 Aninhando Matrizes Estruturas Cada campo de uma matriz estrutura pode ser de qualquer tipo de dados, incluindo uma matriz celular ou uma matriz estrutura. Por exemplo, as seguintes declaragdes definem uma nova matriz estrutura como um campo na matriz student, para conter informagies sobre cada aula em que o estudante esté inscrito: student (1) -class(1)-nane = student (1) .class(2) -name class (1) -instr :elass (2) -instr “cose 2021° “PHYS 1001" ‘Mr, Jones ‘Mrs. smith student Depois que essas declaragées forem preenchidas, student (1) conterd os dados a seguir. Note a técnica usada para acessar os dados nas estruturas aninhadas, » student (1) ame: ‘John Doe’ addrl: /123 Main Street’ city: ‘Anytown’ state: ‘LA’ zip: "71211" exams: [80 95 84] class: [1x2 struct) Cape? Metres Eyaas Mies Ctuzeseintuas | 311 » student (1) .class Ix? struct a instructor y with fields: Tabela 7.3 Fungdes MATLAB Gomuns que Suportam Estruturas Dose Retoma uma lista de nomes de campos em uma mati elar de cadeias de evacteres ‘Obtém 0 valor atual de um campo. Remove o campo de uma matrix estrutura Coloc nave valor ennui campo, redefine uma mati ett, » student (1) .clase(1) name: “COSC 2021" instructor » student (1) .c1: instructor: ‘wr. smith’ » student (1) .class(2) PHys 1001 7.3.8 Resumo das FungGes structure As funges MATLAB comuns que suportam estruturas esto resumidas na Tabela 7:3. Este teste fornece uma répida verificacio para ver se voc@ entendeu os conceitos introdu- Zidos nas Segbes 7.1 a 7.3. $e voc® tiver dificuldades com o teste, releia a secio, pergunte a seu professor ou discuta 0 material com um colega. As respostas sio encontradas no fim do livro. 1. O que é uma matriz. esparsa? Em que difere de uma matriz completa? Como voct pode converter uma matriz esparsa em uma matriz.completa, e vice-versa? 2. O que é uma matriz celular? Em que difere de uma matriz comum? 3. Qual a diferenga entre indexacio de conterido ¢ indexagao celular? I a B12 | Provanario em MATAR pare Exgentees 4, O que é uma estrutura? Em que difere de matrizes comuns e matrizes celulares? 5, Qual o propésito de varargin? Como funciona? 6, Dada a definigdo da matriz a a seguir, 0 que seré produzido em cada um dos con- juntos de declaragbes? (Nota: algumas dessas declaragoes podem ser ilegais. Se isso acontecer, explique por qué.) a(1,1) = (123; 45 6; 78 9); (1,2) = (‘Comment Line’); a(2,1b = dr (2,2) = a(l,t) ~ a(2/1b(2,2)5 (a) aca.) (b) a{1/1) (©) 2a(2.2) (@) a(aay (e) a(2.2) () 2(2,3) = (t-17; 17) (g) a(2,2} (2,2) 2. Dada a definigio da matriz b a seguir, 0 que ser produzido em cada um dos con- juntos de declaragbes? (Nota: algumas dessas declaragbes podem ser ilegais. Se isso ‘acontecer, explique por qué.) b(L).a = -2teye(3); biz) 1b = ‘Element 1; bU}le © (2 317 BQ).a = Ohi1).c [ty 27-3) BA) es b(2)ib = ‘Blenent 277 bi)ie = (10 all: @) ba).a ~ BO). (@) strnemp(b(1) .b,b(2).b, 6) (©) mean (b(1) <) (a) mean (b.c) (@) b (bay Matrizes esparsas s20 matrizes especiais nas quails mem6ria s6 é alocada para elementos nio-zero. Trés valores so gravados para cada elemento ndo-zero: um niimero de linha, um nvimero de coluna e o proprio valor. Essa forma de armazenamento & muito mais cficiente que matrizes completas comuns para a situagdo em que apenas uma pequena fragio dos elementos ¢ nio-zero. O MATLAB inclui fungGes e calculos intrinsecos para ‘matrizes esparsas, de modo que podem ser livres ¢ transparentemente misturadas com matrizes completas. Matrizes cclulares sao matrizes cujos elementos sdo eulas, contéineres que podem ter coutras matrizes MATLAB. Qualquer tipo de dads pode ser armazenado em uma célula, ineluindo matrizes estruturas e outras matrizes celulars. Elas sio um modo muito flex vel de armazenar dados, e si0 usadas em muitas fungées internas da GUI do MATLAB. ante 7 somes espns, Moraes Ceres Etutvae | 313 Matrizes estruturas sao um tipo de dados no qual cada elemento individual recebe ‘um nome. Os elementos individuais de uma estrutura séo conhecidos como campos, € cada campo de uma estrutura pode ter um tipo diferente. Os campos individuals sio enderecados combinando-se o nome da estrutura com o nome do campo, separados por uum ponto. Matrizes estruturas sio titeis para agrupar todos os dados relativos 2 uma [pessoa em particular ou coisas em uma tinica localizagao, 7.4.1 Resumo de Boas Praticas de Programagao Aseguinte regra deve ser seguida: 1. Use os argumentos de matriz celular varargin e varargout para criar fungSes que suportem néimeros varisveis de argumentos de entrada e saida. 7.4.2 Resumo do MATLAB (Oseguinte resumo lista todos os comandos e fungdes MATLAB descrites neste capitulo, juntamente com uma breve descrigio de cada um. ‘Comandos e Fungées cell Define uma estrutura de matriz celular. celldisp Mostra as contetidos de uma matriz celular cellplot Faz um diagrama de uma matriz celular celistr Converte uma matriz de caracteres 2-D em uma matriz celular de cadeias de caracteres. Retorna uma lista de nomes de campos em uma matriz celular de cadeias de caracteres. getfield — Obtémo valor atual de um campo. full Converte uma matriz esparsa em uma matriz completa, ane Nedmero de elementos nio-zero da matriz, nonzeros _Retorna um vetor de coluna que contém os elementos no-zeros cde uma matriz ax Quantidade de armazenamento alocado para elementos nao- zero da matriz fieldnanes enfield Remove um campo de uma matriz esteutura, setfield —_Coloca novo valor em um campo. opal ‘Aloca espago para uma matriz esparsa, sparse Converte uma matriz completa em uma matriz esparsa, speye ria uma matriz de identidade esparse spfun “Aplica fungSo a elementos nio-2ero da matrz, spones Substitui elementos nao-zero de matriz esparsa por um. sprand ria uma matriz esparsa aleat6ria uniformemente distribuida sprandn Cria uma matriz esparsa aleatéria distribuida normalmente. sprintf Escreve dados formatados para a cadela de caractores. spy Mostra padro esparso como um diagrama. | 314 | Pogamgto om MATA@® pos Ergeanevas 1A 12 13a 18 7.5 Exercicios Escreva uma fungio MATLAB que aceite uma matriz celular de cadeia de caracteres e classique em ordem ascenden‘e de acordo com a ordem lexico- Brifica do conjunto de caracteres ASCII. (Voce pode usar a funcao c_stremp do Capitulo 6 para comparacio, se quiser) Escreva uma fungo MATLAB que aceite uma matriz celular de cadeia de caracteres¢ classifique em ondem ascenderte de acordo com a ordem afb fica. (sso implica que voc® deve ratar “A’ € '2” como a mesma letra) rie uma matriz esparsa 100 x 100 a na qual cerca de $% dos elementos con- tenham valores aleatérios distribuidos normalmente, e todos 08 outros ele- ‘mentos sejam zero (use a fungéo sprandn para gerar esses valores).A seguir, cestabelega que todos 0s elementos da diagonal da matriz sejam 1, Em seguida, defina uma matriz de coluna esparsa com 100 elementos b, ¢ inicie essa ‘matriz com 100 valores distribufdos uniformemente, produzidos pela funcéo ran, Responda as seguintes questdes sobre essas matrizes: 1. Crie uma matriz completa a_fu1 a partir da matriz esparsa a. Compare a meméria necesséria para armazenar a matriz completa e a matria esparsa. Qual & mais eficiente? >. Facaum diagrama da distribuigio de valores na matriz a, usando a fungio spy. Crie uma matriz completa b_fuL a partir da matriz esparsa b. Compare a meméria necesséria para armazenar a matriz completa e a matria esparsa. Qual é mais eficiente? . Resolva o sistema de equagées a * x = b para x usando ambas as matrizes, completa e esparsa. Como os dois conjuntos de respostas se comparam? Mega o tempo para as duas solugdes. Qual é mais répida? Crieuma ago que ace qqur amen de args mms en tea aaa sod oo: ments mtd or anumente ne Tse un fang pasando por a 0 quay axgumenios = 0,0 [3] 2 103 St ifean 5-2 120 Mofque fungi do evercdo anterior de modo que ele pose acts matte zes numéricas comuns ou matrizes celulares com valores numéricos. Teste bill=f1 5 ajenti=[ 4 Cape? Maries Evass, Mois Cldoes xnsuas | 315 7.6 Crie uma matriz estrutura que contenha todas as informagdes necessérias para construir um diagrama de um conjunto de dados. No minimo, a matriz estrutura deve conter os seguintes campos: _x-data (um ou mais conjuntos de dados em oélulas separadas) ‘y-data (um ou mais conjuntos de dados em células separadas) linear, semilogx e assim por diante titulo do diagrama rétulo do eixo x rétulo do eixo y faixa de x a colocar no diagrama faixa de y a colocar no diagrama ‘Vocé pode acrescentar campos adicionais que aumentem sew controle sobre o diagrama final Depois de criar essa matriz estrutura, crie uma fungio MATLAB que aceite uma matriz. dessa estrutura e produza um diagrama para cada estru- tura da matriz, A fungio deve aplicar caractoristicas iniciais inteligentes se alguns campos de dados estiverem faltando. Por exemplo, se 0 campo plot_title for uma matriz vazia, a funglo nao deve colocar um titulo no grifico. Pense cuidadosamente sobre as caracteristicas iniciais adequidas antes de comecar a eserever a sua funcio! ‘Para testar sua funcio, cria uma matriz estrutura que contenha os dadlos para trés diagramas de trés tipos diferentes e passe aquela matriz estrutura para a sua funcio. A funcio deve construir corretamente diagramas para todos os conjuntos de dados, em trés janelas diferentes de figuras. Capitulo 8 Fungoes de Entrada/Saida No Capitulo 2, aprendemos como carrogar e gravar dados MATLAB utilizando os comandos loade save, e como exibir dados formatados utilizando a funcio Eprint£ No presente capitulo, vamos aprender mais a respeito dos recursos de entrada /saida (EJS) do MATLAB. Primeiro, vamos estudar textread, uma fungdo muito ttl acres- centada ao MATLAB desde a versio 53. Depois, vamos ocupar um certo tempo exami nando os comandos load e save, Finalmente, vamos examinar outras opgbes de E/S disponiveis no MATLAB, (5 leitores familiarizados com C consideratio boa parte desse material familiar. Entretanto, tome cuidado, pois existem diferencas sutis entre fungoes MATLAB e C que podem engané-lo 8.1 AFungéo textread Ocomando text read é novo: faz parte do MATLAB desde a versio 53. Foi projetedo para ler arquivos ASCII formatados como colunas de dados, em que cada coluna pode ter um tipo diferente. Esse comando é muito itil para importar tabelas de dados pre>a- radas com outras aplicagées. ‘Aforma do comando textread é larbrer textread (arquivo, formato,n) onde arquivo é 0 nome do arquivo a ser aberto, formato é uma cadeia de caractores que contém uma descriggo do tipo de dados em cada coluna e n & 0 rtimero de linhas a serem lidas. (Se n nao for incluido, 0 comando IE até o fim do arquivo.) A cadeia de 4 | 318 | Proramuete am sATAD® pore Emons caracteres de formato contém os mesmos tipos de descritores de formatos da fungio fprinté. Note que a quantidade de argumentos de saida precisa casar com 0 ntimero de colunas sendo lidas. Por exemplo, suponha que o arquivo test input .dat contenha os seguintes dados: James Jones 0+ 3.51 22 vee Sally Smith A+ 3.28 23 No Esses dados poderiam ser lidos para uma série de metrizes com a seguinte fungio: (first, last, blood textread | ‘tes! pa, age, answer) put.dat","%s ts ts tf td ts! Quando esse comando ¢ executado, o resultado é » [firet,last,blood,gpa,age,answer] =... textread(‘test_input.dat’,"%s ‘ws %s XE Nd %8") ‘sally’ last ‘gones’ Essa funcio pode também pular linhas selecionadas se adicionarmos um asterisco a0 descritor de formato correspondente (por exemple, #5). Por exemplo, a declaragao fa seguir Ié somente o primeiro nome, 0 tiltimo nome e o gpa do arquivo: » [firet,last,gpal = --- textread(*test_input.dat’, "ts Me “ts SE Ata %H8") first = ‘games’ “sally last sgones “smith Capes FunpesdeEnradvsuids | 319 3.5100 3.2800 A fungio textread é muito mais itil e flexivel que o comando Load, O conando oad assume que todos os dados no arquivo de entrada sejam de mesmo tipo ~ ele do dé suporte a diferentes tipos de dados em diferentes colunas. Adicionalmente, ele armazena todos 0s dados em uma tinica matriz. Em contraste com isso, a fungio textread permite que cada coluna vA para uma varidvel distinta, © que é muilo mais conveniente quando estamos trabalhando com colunas de dados mistos ‘A funglo textread tem diversas opbes adicionais que ampliam a sua flexibiidade, Consulte a documentacio on-line do MATLAB para detalhes a respeito dessas opcoes. Boa Pratica de Programagao Utilize a fungio textread para importar dados ASCII em formato de colunas de pro- sgramas escritos em outras linguagens ou exportadas de aplicativos como planilhas. 8.2. Mais Informagées sobre os Comandos load ¢ save Ocomando save grava o espaco de trabalho do MATLAB em disco, eo comando load carrega dados do disco para o espago de trabalho. O comando save pode gravar dados em um formato especial bindrio denominado arquivo MAT, ou em um arquivo ASCIL comum. A forma do comando save é save arquivo [varidveis} fop¢ées) O comando save sozinho grava todos os dados no espago de trabalho atual pera um arquivo denominado matlab .nat no diretério corrente, Se um nome de arquivo for acrescentado, os dados serio gravados no arquivo “arquivo.mat”. Se uma Ista de varidveis for acrescentada, somente essas varidveis serdo gravadas. ‘As opgoes com suporte pelo comando save sio mostradas na Tabela 8.1 Tabela 8.1. Opgées do Comando save antes “pee Gina dados enemas dave MAT opi act Gavan dose formas ASCII septa por eps, append Adiiona as vaniveis expecficadas a um arquivo MAT j extents A Gravao arquivo MAT em um form lepivel polo MATLAB verso 4 a 4. 320. | Proyaneeio em MurLAe pre Epeonies © comando Load pode carregar dados de arquivos MAT ou arquivos ASCII ‘comuns. A forma do comando oad ¢ load arquivo fopgdes} © comando load sozinho carrega todos os dadas do arquivo matlab.mat para o cespago de trabalho cotrente. Se um nome de arquivo for acrescentado, os dados serio carregados daquele arquivo. ‘As opgbes com suporte pelo comando Load sie mostradas na Tabela 8.2. Emibora nao seja dbvio de imediato, os comandos save e Load sio os comandos de E/S mais poderosos e iteis do MATLAB. Dentre suas vantagens, temos: Esses comandos sd0 muito féceis de usar 2. Arquivos MAT sio independentes de plataforna. Um arquivo MAT escrito em ‘qualquer tipo de computador com suporte a MATLAB pode ser liclo em qual- {quer outro computador que também tenha suporte a MATLAB. Esse formato se transferelivremente entre PCs, Macs e diversas versies diferentes de Unix 3. Arquivos MAT sto relativamente eficientes na utilizagio de espago em disco, ¢ armazenam a precisio completa de cada variével ~ nao se perde preciso com a converséo de e para o formato ASCIL 4, Arquivos MAT preservam todas as informacbes a respeito de cada vatidvel do espago de trabalho, incluindo sua classe, nome e se ela é ou nio global. Todas essas informagSes sao perdidas com outros tisos de E/S. Por exemplo, suponha que o espaco de trabalho contenha as seguintes informasies: » whos Name Size Bytes Class a 10x10 800 double ans het 8 double > 10x10 800 double array ce 2x2 332 cell array string 1x16 32. char array student 1x3 2152 struct array Grand, total is 372 elements using 4124 bytes ‘Se esse espago de trabalho for gravado com ocomando save workepace.mat, ‘um arquivo chamado workspace mat seré criado. Ao carregar esse arquivo, todas as informagées serso recuperadas, incluindo o tipo de cada item e se ele €ou nao global. Tabela 8.2 Opgdes do Comando Load Ogio —__Deserigdo _ mat __‘Trataarquivos como arguivos MAT (apeio basica quando a extensio do arquivo é nat). LL _Trataarguivos como arquivos ASCI separa 0 do arquiva nio € mat) os por espagos (ope bisa, quando a extn canis 8 Fgtee ob Ewieaits | 321 ‘Uma desvantagem desses comandas ¢ que o formato de arquivo MAT s6 vale para MATLAB, e no pode ser utilizado para compartilhar dados com outros programas. A opsio ascii pode ser utilizada para compartilhar dados com outros programas, mas presenta sérias limitagoes. f i ‘A menos que voct precise trocar dados com programas que no estejam em MATLAB, sempre utilize os comandos load e save para conjuntos de dados no formato de arquivos MAT. Esse formato ¢ eficientee portstil entre as implementacSes do MATLAB, ce preserva todos os detalhes de todos os tipos de dados MATLAB. SEATS © comando save ascii nio grava matrizes de células ou dados de matriz de estruturas, converte dados de cadeias de caracteres em nimeros antes de gravéclos. O ‘comando load ~ascii somente carrega dados separados por espacos com um niimero igual de elementos em cada linha, e coloca todos os dados em uma tinica variével com ‘0 mesmo nome do arquivo de entrada. Se vocé precisar de algo mais elaborado (por ‘exemplo, gravar e carregar cadeias de caracteres, matrizes de células e de estruturas em formatos apropriados para troca com outros programas), ser necessério utilizar outros comandos e fungies de E/S de arquivos, descritos neste capitulo. ‘Se o nome do arquivo e os nomes das variaveis a serem carregadas ou gravadas forem cadeias de caracteres, vocé deve utilizar as formas de fungio desses comandos. Por exemplo, o fragmento de cédigo abaixo solicita que o usuério fornega um nome de arquivo e grava o espaco de trabalho nesse arquivo: arquivo input (‘Porneca © nome do arquivo de gravacio: ‘,’8"): save (arquivo); Para utilizar arquivos dentro de um programa MATLAB, precisamos selecionar de alguma forma o arquivo desejado e ler dados dele ou escrever dados nele. O MATLAB tem um método muito flexivel para ler e escrever em arquivos, que podem estar em discos, fitas magnéticas ou em algum outro dispositive ligado a0 computador. Esse mecanismo é conhecido como id de arquivo (algumas vezes denominads fid). O id de arquivo é um nimero designado para um arquivo quando ele é aberto, e é utilizado para leitura, gravacio e operacies de controle nesse arquivo. O id de arquivo é um inteiro positive. Dois ids de arquivo estio sempre abertos ~ 0 id de arquivo 1 é 0 dispositive de saida-padrio (stdout), eo id de arquive 2 é o dispositivo de erros- padrio (stderr) no computador em que 0 MATLAB esta sendo executado. Ids de arquivo adicionais sdo designados quando arquivos sao abertos,¢ liberados quando 0s arquivos so fechados. _— SS 322 | Propanacao om MATLAB pre Engels Diversas declaragSes MATLAB podem ser usadas para controlar entrada e saida de arquivos de disco. As fungies de E/' estao resumidas na Tabela 83. Ids de arquivos sao designados para arquivos de discos ou dispositivos utilizando a declaragdo fopen, e liberados utilizando a declaragio fclose. Quando um arquivo é associado a um id de arquivo utilizando a declaragio fopen, podemos ler e escrever no arquivo utilizando as declaragbes de entrada ¢ saida do MATLAB. Quando ter- minamos de utilizar 0 arquivo, a declaragio fclose fecha © arquivo e torna o id de arquivo invalido. As declaragées frewind ¢ fseek podem ser usadas para mudar a posigdo corrente de leitura ou escrita no arquivo enquanto ele permanece abert. ‘Os dadios podem ser escritos em ¢ lidos de arquivos de duas maneiras possiveis: como dados bindrios ou como dados de caracteres formatados. Dados bindrios sio compostos pelos padrées de bits utilizados para armazenar dados na meméria do com- putador. Ler e escrever dados bindrios ¢ muito eficiente, mas um usuario nao pode ler (95 dados gravados em um arquivo. Os dados em arquivos formatados estdo traduzidos para caracteres que podem ser lidos diretamente pelo usudrio, Entretanto, as operagSes de E/S formatadas sao mais lentas e menos eficientes que as operacoes de E/S bindrias, ‘Vamos discutie os dois tipos de operagies de E/S adiante neste capitulo. Tabela 8.3 Declaragdes de Entrada/Saida do MATLAB Deseigao Categoria Fangio Carga/Gravaglo de espagode load Carregaexpago de trabalho. teabalho save Grava espaco de trabalho Abertura efechamento dearguive fopen bre arquive, fclose Fecha anguiva E/Sbinsrias ‘read Lé dados binisios de arquivo, fuelte — Excreve dadosbingios em arquivo /S formatades fecanf — Lé dados formatados de arquivo fprintt Grave dadas farmatados de arquivo. igetiLelinha da arguivo; descartaearactore de fim de linha, Egcte —_Lalinka de arquivo; preservsearactere defi de linha Posicionamento de arquivo, aeLete —Apaga arguiva, estado de arquivo, miscelines exist’ Veniicaaenlstindla de um arquivo Forror Verifies estade de ero de /5 de arquivo. foot Verifea se est no fim do arquivo, feck —Ajustaposigie do arquivo. Fell Verifies posigio do arquivo frewind Vola pra nico do arquivo, Arquivos temporiios ened Capture name de ditto emporio, ‘ompnanie Capture nomede arquivo temporsti. 8.4 Abrindo e Fechando Arquivos As fungies de abertura ¢ fechamento de arquivos Eopen e fclose sio deseritas nesta secao. Capo Fares se enanses | 323 8.4.1 AFungdo fopen A fungao fopen abre um arquivo e retomna um niimero de id de arquivo para uso com ‘arquivo. As formas bésicas dessa declarasao sao: fid = fopen (arquivo, permissao) [£ia, mensagem] = fopen (arquivo, permissac) [£id, mensagem] = fopen (arquivo, permissac, formato) onde arquivo é uma cadeia de caracteres que especifica o nome do arquivo a ser aberto, permissdo & uma cadeia de caracteres que especifica o modo de abertura do arquivo e ‘formato é uma cadeia de caracteres opcional que especifica o formato numérico dos dados no arquivo. Se a abertura for bem-sucedida, £3 conterd um inteiro positive apds a exe- ‘cugio da declaragio e mensagem seré uma cadeia vazia de caracteres. Se a abertura falhat, Eid conterd ~1 apés a execugio da declaracio e mensagem serd uma cadeia de caracteres cexplicando 0 erro. Se um arquivo for aberto para leitura e no estiver no dietério cor- rente, o MATLAB procurara pelo arquivo percorrendo o seu caminho de busca {As cadeias de caracteres possiveis para permissao sio apresentadas na Tabe a 84 Em algumas plataformas, como PCs, ¢ importante distinguir entre arquivos de texto e arquivos bindrios. Se um arquivo for aberto em modo texto, Tabola Permisto de Argo Permissdes de Arquivas do ¢open Signed ‘Abre um arquivo existent para leitura apenas felt. ‘Abre um arquivo extente para letra esr, ow ‘Apaga o conto de um arquivo existent (cra um arquivo novo) €0abne apenas pas excita. a “Apaga ocantsido de um arquivo existente (ou cra um arquivo novo) e0abre para leiturae exon s ‘Are umm arquivo existent ot cra umn arguivo novo) 6 abre apenas para ‘sets coneatenand oF dadoe no ial do aguiv, tae ‘Abre um arquivo evstnte (ou cra um arguivo nove) €@abre para letura © ‘sets, coneatenand oF dads no final do aguivo. ow Eserta sem limpera automata (comandoespil par it) a CConeatenagio no final do arquivo sen linpezs automa (comand e-pecil para fit) um t deve ser adicionado ao final da cadeia ce caracteres de permisséo (por exemplo, "rt" ou‘ r+"), Se um arquivo for aberto em modo binario, um b pode ser adicionado & cadeia de caracteres de permissio (por exemplo, ‘rb’ ). Isso no é requerido, pois os arquives so abertos no modo binério como base. Essa distingao entre arquives de texto binaries nao existe em computadores Unix, por iss0 0 t e 0 b nunca sio necessérios nesses sistemas, A cadeia de caracteres formato na fungio Lopen espesifica 0 formato numérico dos dados armazenados no arquivo. Essa cadeia de caracteres somente é necesséria na — —_ 324 | Progam om HUTLAB® par genes transferéncia de arquives entre computadores com fornatos de dados numéricos incom- ppativeis, por isso € raramente utilizada. Alguns dos possiveis formatos numéricos so apresentados na Tabela 85; verifique o Manual de Referéncia da Linguagert MATLAB para ‘uma lista completa dos formatos numéricos possiveis. Existem também duas formas dessa funclo que fornecem informagSes em vez. de abrir arquivos. A funcio fids = fopen(‘all’) retorna um vetor linha que contém uma lista com todos os ids de arquivos abertos (exceto stdout e stderr). O mimero de elementos nesse vetor & igual a0 mimero de arquivos abertos. A fungio larquivo, permissao, formato) = fopen(fia) retoma o nome do arquivo, a cadeia de caracteres de permissao e 0 formato numérico para um arquivo aberto especificado pelo id de arquivo. Alguns exemplos de funcionamento correto de fopen sao apresentados a seguir. 8.4.1.1 Caso 1: Abertura de um Arquivo de Entrada Bindrio {A fungio abaixo abre um arquivo denominado exenp1>..4at para entrada bingria apenas. fid = fopen(*example.dat’,‘r) A cadeia de caracteres de permissio é ‘r', indicando que 0 arquivo deve ser aberto somente para leitura. A cadeia de caracteres poderia ser ‘rb’, mas isso nao é neces sério, pois 0 caso default 6 de acesso bindrio. Tabela 8.5 Cadeias de Caracteres Selecionadas de Formato para £open Permissdo de Arquivo Signiticado Snative’ ov Formato numérico da maquina onde ets sendo executado o MATLAB defeult Ponto Mutuante IEEE com bytes menos significatvos no final Ponto futuante IEEE com bytes mas sigaiiatvos no final Sese-1e.164" ou ‘a" Ponto tuante IEEE com bytes menos sgniiatvos no final e ipo de dados Tanga de 64 bits iese-Le.264" o's" Ponto futuante IEEE com bytes mis sigificativos no final «tipo de dads longo deo bts. 8.4.1.2 Caso 2: Abertura de um Arquivo para Saida de Texto {As fungbes abaixo abrem um arquivo denominado oatdat para saida de texto apenas. fid ypen (Youtdat’, ‘wt") ante 8 Fagaes de rae | 925 ‘A cadeia de caracteres de permissio ‘wt’ especifica que o arquivo é um arquivo de texto novo; se ele jé exists, 0 arquivo antigo sera apagado e um novo arquivo vazio ser aberto para escrita. Essa € a forma apropriada da funcio fopen para um arquivo dsaida se quisermos substituir dados preexistentes. A cadeia de caracteres de permissdo ‘at’ especifica que queremos conca:enar dados com um arquivo de texto existente. Se ele jé existir, sera aberto e novos dados serio colocados em seguida & informagio existente. Essa é a forma apropriaca da fungdo fopen para um arquivo de saida cujos dados preexistentes nao dever ser substituidos. 8.4.1.3 Caso 3: Abertura de um Arquivo Binério para Acesso de Leitura/Escrita A fungio a seguir abre um arquivo denominado junk para entrada e saica bindrias, #id « fopen(’ junk’, ‘r+") A fung3o abaixo também abre o arquivo para entrada e saida binétias. fi = fopen(*junk", ‘ws? AAdiferenga entre a primeira e a segunda declaragio é que a primeira requer que o arquivo cexista antes de ser aberto, ea segunda apaga um arquivo preexistente, Baa Pratica de Programagao Sempre tome cuidado ao especificar as permissies apropriadas em uma declaragio open, dependendlo de voc ler ou escrever em um arquivo. Essa prética ajuda a evitar ‘erros como acidentalmente escrever por cima de arquivas de dados que deveriam ser reservados, & importante verificar se ocorreram erros apéstentar abrir umn arquivo. Se o fia for-1 0 arquivo nao péde ser aberto. Vocé deve reportar este problema a0 usuirio e permite que ele selecione outro arquivo ou abandone o programe Boa Prética de Programagao Sempre verifique o estado do sistema depois de uma operagio de abertura de arquivo, para garantir 0 seu sucesso. Se a abertura de arquivo falhay, informe o usuario ¢ fomeca ‘uma maneira de resolver 0 problema, — 826 | Progamacio em WaT.” para Expenteias 8.4.2 A Fungao close A fungio fclose fecha um arquivo. A sua forma é status = felose( status = felose(‘all’) onde £id é um id de arquivo e status € 0 resultado da operagio. Se a operacio for bem-sucedida, status receberd o valor 0, caso contrivio, receberé o valor -1 A forma status = fclose(‘all’) fecha todos os arquivos abertos, exceto stdout (fid= Ie stderr (£id = 2), Bla retorna um status igual a 0 quando todos 0s arquivos fecham adequadamente, e 1 quando isso nao ocorre. 8.5 Fungbes de E/S Bindrias As fungoes de E/S bindrias, fwri te fread, sio apresentadas nesta sesao. 8.5.1 AFungdo fwrite A fungio fri te escreve dados bindrios em um arquivo utilizando um formato especi ficado pelo ususrio, A sua forma é quant = fwrite(fid,matriz,precisso) quant = fwrite(fid,matriz, precisao, salto) onde £id 60 id de arquivo aberto com a fungio fopen, matriz 6a matriz de valores a serem escritos e quant 6a quantidade de valores escritos no arquivo. (© MATLAB escreve dados ordenados por coluna, 0 que significa que toda a primeira coluna é escrita, depois a segunda coluna eassim por diante. Por exemplo, se 56 A cadeia de caracteres opcional preci sao especifica 0 formato de saida dos dados. © MATLAB fornece suporte a cadeias de caracteres de precisio independentes de pplataforma, que sio as mesmas para qualquer computador em que funcione o MATLAB, bbem como cadeias de caracteres de precisao dependentes de plataforma, que variam de acordo com os diferentes tipos de computador. Vocé deve utilizar somente as cadeias de ca ‘actores independentes de plataforma, que sao as formas apresentadas neste livro. Por conveniéncia, 0 MATLAB aceita alguns equivalentes aos tipos de dads de C ¢ Fortran como cadeias de caracteres de precisio do MATLAB. Se voce for um progea- mador em C ou Fortran, pode considerar mais conveniente utilizar os nomes de tipos de dados da linguagem com a qual voc® for mais familiarizado, {As possiveis precisées independentes de platafonma sio apresentadas na Tabela 86. Todas essas precis6es funcionam em bytes, exceto ‘Ei tN’ € 'ubi ti’, que funcionam em bits, 12] metrics [; i} dados ei estos seuint orden 1,3 5.2.46 Conte 8 ronses oe trtaeuses | 327 Tabela 8.6 Cadeias de Caracteres de Preciséo do MATLAB Cadea de Carectres Equivaente em Precio do MATLAB Foran Sinica vena char") Caractere de 8 bits *schar’ gned char” Caractere de 8 bits com sina uchar’ unsigned char Caractere debits sem sin ante egerst Tieio de 8 bits vince’ snteger"? Inteiro de 16 bis ant32" integer" Inter de 32 bits vimcoa’ inveger*®: Inteito de 6t bite inte’ integer" Intero de 8 bite sem sinal puintt6* nteger*2 Intro de 16 bite sem sina raint32" Hveger"@” Inter de 32 bts sem sna rusntser integers” Tnteiro de 6 bits sem sina fas vealed Pont ftuante de 32 bits “foats4: realt® Ponto Nutuante de 64 bits pact Inter com sinal de N bits, 1 << 64 Inteizo sem sinal deN bits, 1 Ns 6 © argumento opcional saito especifica a quantidade de bytes no arquivo de saida entre cada escrita. Essa opsao € itil para colocar valores em certos pontos de registros de comprimento fixo. Note que, se preci so for um formato de bits como "bitN’ ou "ubitN', o salto serd especificado em bits em vea de bytes. 8.5.2 AFungao fread A fungio fread 1é dados bindrios de um arquive, com formato especificado pelo usudrio. A sua forma é (matriz, quant] = freadifid, tamanho, precis&) [matriz, quant] = fread{fid, tamanho, precisao, salto) onde £id € 0 id do arquivo aberto com a fungio Fopen, cananho € a quantidade de valores a serem lidos, natriz éa matriz que contém os dadose quant €a quantidade de valores lidos do arquivo. (Oargumento opcional tamanho especfica a quantidade de dados lidos do arquivo. Existem trés versOes para esse argumento. exatamente n valores. Depois dessa declaragio, matriz ¢ um vetor coluna que contém n valores lidas do arquivo, L@ até o final do arquivo. Depois dessa declaragio, matriz é um vetor coluna que contém todos os dados até o final do arquivo, Lé exatamente n m valores, ¢ formata os dads como uma matriz 328 | Proansete em Maria para geen Se fread aleanga o final do arquivo e a fonte de dados de entrada nio contém bits suficientes para escrever um elemento completo de matriz com a precisio especificada, Exead preenche o tiltimo byte ou elemento com bits 2ero até obter o valor completo. Se ocorrer um erro, a leitura ¢ feita até o tiltimo valor completo, (Os argumentos precisdo e tamanho tém o mesmo significado em fread e em turite, > Exemplo 8.1 ~ Esorit © arquivo de script apresentado neste exemplo eria uma matriz com 10.000 valores aleatdrios, abre um arquivo especificado pelo usuario para somente escrita, escreve a ‘matriz no disco com formato de ponto flutuante de 64 bits e fecha o arquivo. Ela entao bre o arquivo para leitura e 1é 08 dados de volta para uma matriz 100 x 100, Isso ilustra ‘0 uso de operagbes de E/S bindrias. Loitura de Dados Bindrios & Script file: binary_io.m . & Purpose: % To illustrate the use of binary i/o functions. 8 © Record of revisione: : Date Programmer Description of chi 8 " . ® 12/19/98 8. J. Chapman Original code e ® Define variables © count ~~ Number of values read / written 8 Hid = File id ® filename -- File name % 0 imarray -- Input array 8 msg ~~ Open error message ® out_array -- Output array 8 status -- Operation status % prompt for file name filename = input (/Enter file name: ‘,/s') & Generate the data array out_array = randn(1,10000) ; & open the output file for writing. (£id/meg] = fopen(filename, ‘w’) 8 Was the open successful? AE fid > 0 @ Weite the ourput data count » fwrite(fid,out_array, ‘float64'); 4 Tell user disp({int2str(count) * values written.../1) ape 8 feptes ce Eisduids | 329 % Close the file status = fclose(fid); else % Output file open failed. Display message. aispimsa) ; end, & Now try to recover the data. Open the a file for reading [£id,msg] = fopen(fitename, ‘r*); $ Was the open successful? if Lid > 0 % Read the input dai (in_array, count} @ Tell user disp {Lint2str (co fread(fid, [100 100], ‘float64’); "values read...11): 4 Close the file statue = fclose(fia); else & Input file open failed. Display message. dispinsg) ; Quando um programa é executado, 0 resultado é » binary_io Enter file nane: teatfile 10000 values written 10000 values read. Um arquivo com 80.000 bytes denominado test fi 1e foi ciado no diretério corrente, Esse arquivo tem 80.000 bytes porque contém 10.000 valores de 64 bits, e cada valor ‘ocupa 8 bytes. < ira Este teste apresenta uma verificagio répida do seu entendimento dos conceitos apre- sentados nas Segies 8.1 a 8.5. Se voce tiver problemas com o teste, releia as secies, pergunte ao seu professor ou discuta o material com uum colega. As respostas podem ser encontradas no final do livro. 1. Qual 0 motivo de a fungio textread ser especialmente ttl para leitura de dados criados por programas escritos em outras linguagens? 2. Quais sdo as vantagens e desvantagens de gravar dados em um arquivo MAT? 380 | Progansgsoam MaTLA9? pre Engeanies 3, Que funges MATLAB sio utilizadas para abrir efechar arquivos? Qual é a diferenca centre abrir um arquivo bindrio e abrir um arquivo texto? 4, Escreva as declaracies MATLAB para abrir um arquivo preexistente denominado myinput .dat de forma a poder concatenar dados novos em formato texto. 5. Escreva as declaragdes MATLAB para abrir um arquivo de entrada nao formatado bindtio denominado input .dat, somente para leitura, Verifique se o arquivo existe ‘¢ gere uma mensagem de erro apropriada caso ele nao exista, Para as questdes 6 ¢ 7, determine se as declaragées MATLAB esto corretas. Se houver cerros, especifique o que esté errado. 6 fid = fopen(‘ filet’, ‘rt'); array = freadifid, inf) felose (fia); 7. $4a = fopen(* filet’, ‘ws x = 1:10; count = fwrite (fid, x): fclose (fia); fid = fopen (/filel', ‘r'); array = fread(fid, (2 Inf]) Eclose (fia): 8.6 Fungdes de E/S Estruturadas [As fungles de E/S estruturadas so descritas nesta segao. 8.6.1 A Fungo fprinté [A fungdo fprint£ escreve dados formatados em um arquivo utilizando um formato especificado pelo usuario. A sua forma & quant = fprint£(£id, formato, vali, val2, Eprincé (formate, val1, val2, ...] LL TN. Figura 8.1 Os componentes de uma especifcasio de formato tipica Captues FumiesaeFnadysuts | 331 onde £14 6 0 id do arquivo que receberd os dados e formato &a cadeia de caracteres de formato que controla a aparéncia dos dados. Se £id nao estiver presente, os dados serdo escritos no dispositivo de saida-padrao (a Janela de Comandos). Essa € a fornia do print que temos utilizado desde o Capitulo 2. A cadeia de caracteres de formato especifica alinhamento, digitos significaivos, largura do campo € outros aspectos do formato de saida. Ela contém caracteres alfanuméricos ordindrios junto com seqiléncias especiais de caracteres que especiicam © formato exato de exibisio dos dados de saida, A estrutura de uma especificagio de formato tipico é mostrada na Figura 8.1. Um caractere % tinico sempre marca 0 inicio de uma especificaco de formato ~ se um sinal % ordindrio dever ser impresso, eledeve parecer na cadeia de caracteres de formato como %%. Depois do caractere %, © formato pode ter um sinalizador, uma largura de campo e uma especificagao de precisao, além de uma especificagio de conversio. O caractere & e a especificagio de conversio deve, sempre fazer parte de qualquer formato, e o sinalizador, a largura de campo e a especi- ficasio de precisao séo opcionais. ‘As possiveis especificagdes de conversio sio listadas na Tabela 87, e os sinali- zadores, na Tabela 8.8, Se uma largura de campo e a precisio sio especificadas em um formato, Tabela 8.7 Especticagdes de Conversdo de Formato para fprint epeciteagto __Deseigto te Caractere tio te [Notagio decimal (com sin) te Notacioexponencial(tilzando e miniscule, como em 3. 14162400) te Notagioexponencial(aiizando # masiscul, como am 3.16168-00) a Notagie de ponto fio te (mats compact dentre te ¢f 270s nfo sgnifctvos no so apreentadoe tc © mesmo que ts, mar ulizando Emaisculo [Notasio octal (em sna) CCadein de caracteres tw Notagio decimal (sem sins!) &% Notasio hexadecimal (utilizardo letras minssculas 2-£) wx Notagio hexadecimal (tiizando letras maiiscula \-F) Tab 8.8 Marcadores do Formato Marcador rgfo Sina de menos) Jusifieaexqueeda o argumento convertido em seu campo (por exemple: 5.22), ‘Seo marcadoe go esiver prevents, o argumento¢jastiseado 3 diet. . Sempre imprime um sinal de ou de = (por exemple: 645.23), ° Preenche o argumento com zeros & esquerda em vex de brancos (por exemplar 23). 382 | Prowane om MATLAD ara Scenes ‘© niimero antes do ponto decimal é a largura do campo, que é o ntimero de caracteres, utilizado para exibir o ntimero. O ruimero depois do ponto decimal a precisio, que & © nuimero minimo de digitos significativos exibidos depois do ponto decimal. ‘Além dos caracteres e formatos ordindrios, certos caracteres especiais podem ser utilizados em uma cadeia de caracteres de formato, Esses caracteres especiais esto Tistados na Tabela 89. 8.6.2 Entendendo as Especificagdes de Converséo de Formato A melhor forma de entender toda a variedade de espetificagies de conversao de formato € por meio de exemplos, Vamos agora apresentar diversos exemplos e seus resultados. 8.6.2.1 Caso 1: Exibigao de Dados Decimais Dados decimais (inteizos) podem ser exibidos utilizando a especificagao de conversio de formato ¢. O 4 pode ser precedido por um marcador e por uma largura de campo © uma especificagao de precisao. Se utilizada, a expecificagao de precisio indica 0 rnuimero minimo de digitos a serem exibidos. Se nao houver digitos suficientes, zeros & esquerda serio acrescentados a0 mimero. Tabela 8.9 Caractere Especials em Cadelas de Caracteres de Formato Senitcias speci Deseo wn Nova inka \e “Tobulagio horizontal \b Retrcesso \e tomo do caro Mt Almentaso de formultio Ww Tmprime uma barra invertida (\) Ver Imprime um apeésteofo on Imprime um snal de porcentagem (t) Fungio Resultado Comentirio. Exibe 0 rximero utilizando tantos carac- teres quanto necessério, Para o ruimero 123, tris caracteres sao exigidos. Exibe o miimero em um campo com seis caracteres de largura. A situagio default & de justificacio a dircita Exibe o niimero em um campo com seis caracteres de largura e um minimo de ‘quatro caracteres. A situagio default é de justifeago a diveita, fprinte(/d\n",123) Eprinté(*86a\n",123) fprint#(*86.42\n",123) Caps 8 Forges Ease | 333 — fprinte(*$-6.4a\n‘,123) 0123, | Bxibe o niimero em um campo com seis caracteres de largura. A justificagio & a exquerda, nt é(*8+6.48\n" 123) — Ie +0123 | Exibe o mtimero em um campo com seis caracteres de largura, um minimo de quatro caracteres e um caractore de sinal A situagio default 6 de justifcagio a direita. ‘Se um niimero nao decimal for exibiclo com a especificagio de conversio ta, aespe- cificasio seré ignorada e o ntimero sera exibido em formato exponencial. Por exemple: srinté{*86d\n" 123.4) produz o resultado 1.234000e+002. 2 Caso xibigdo de Dados de Ponto Flutuante Dados de ponte flutuante podem ser exibidos com as especificagées de conversio de for- mato $e, #£ ou &g. Elas podem ser precedidas por um marcado, uma largura de campo © uma especificagio de precisio, se desejado. Se a largura de campo especificada for muito pequena para exibir o ntimero, ela sera ignorada, Caso contritio, a largura de campo especificada serd utilizada, Fungio Resultado Eprinte(*tf\n",123.4) Exibe 0 mimero utilizando tantos 123.400000 caracteres quanto necessério, O caso default para %£ € exibir seis digitos depois do ponto decimal. Comentirio prints ("88 Ant, 123.8) = Exibe o miimero utilizando um campo com ito caracteres, com diuas posi- Bes depois do ponto decimal. O ni- mero fica justifcado a dreta no campo. fprintf("%4.2£\n", 123.4) Exibeo ntimero em um campo de caracteres. A especificacao de largura foi ignorada por ser muito pequena ‘ para exibir 0 ruimero, fprint#(/410.2e\n" 123.4) Exibe © miimero em formato expo- 1.23e+002 nencial em um campo com dex ea racteres de largura utilizando duas casas decimais. O caso default & de justifiagao a direita fprint£("€10.2E\n" 123.4 ‘O mesmo, com um = maiiseulo para oexpoente. \ | ii) 384 | Pogamapio em WAT? para Enenteies 8.6.2.3 Caso 3: xibigdo de Dados de Caracteres Dados de caracteres podem ser exibidos com as especficacies de conversio de formato ‘sc ou ts, Flas podem ser precedidas por uma especificaglo de largura de campo, se dese- jado. Se a largura de campo especificada for muito pequena para exibir o niimero, ela serd ignorada, Caso contririo, a largura de campo especificada serd utilizada. Fangio Resultado Epeinte(*8c\n",‘8") Comentério Eaibe um caractere tinico. Eprinté(/e\n", ‘etring’) Buibe a cadeia de caracteres, Eprint£(/88e\n", ‘string’) Exibe a cadeia de caracteres em um, ‘campo com oito caracteres de largura, C caso default 6 de a cadeia de ca- racteres ser justifeada a diet, Eprinté (8-8e\n!, ‘st Bxibe a cadeia de caracteres em um string campocomoito caracteres delargura, Acadeia de caracteres & justficnda & esquerda 8.6.3 Como as Cadeias de Caracteres de Formato Sao Uti ‘A fungdo fprinté contém uma cadeia de caracteres de formato seguida por zero ou ‘mais valores para imprimir. Quando a funcio fpriatf € executada, a lista de valores de saida associada com a fungio fpzintf € processada junto com a cadeia de carac- teres de formato, A funcio inicia A esquerda da lista de variaveis e a esquerda da cadeia de caracteres de formato, e varre da esquerda para a direita, associando o primeira valor na lista de safda com o primeizo descritor de formats da cadeia de caracteres de for ‘mato, e assim por diante. As varidveis na lista de seida precisam ser do mesmo tipo € estar na mesma ordem que os descritores de formato no formato; do contrario, resul- tados inesperados podem surgi. Por exemplo, se tentarmos exibir um ntimero de ponto flutuante como 123/4 utilizando um descritor $c ou 4, 0 descritor sera totalmente ignorado e o rximero sera impresso utilizando notagio exponencial. Erros de Programago : \Verifique se existe uma correspondéncia um-para-um entre os tipos de dados na fungio Eprinvé € os tipos de conversio de formato na cadeia ce caracteres de formato asso- Giada, ou seu programa produziré resultados inesperados. Copules FngaecaeEmaaesvits | 335 ‘A medida que o programa vai da esquerda para a direita pela lista de varveis de uma fungio fprint, ele também vai da esquerda para a dirt pela cadeia de carac- teres de formato associada, Cadeias de caracteres de formato sio Varridas segundo as regras abaixo. 1. Cadeias de caracteres de formato sio varridas ens ordem, da esquerda para a direta. A primeira especificagéo de conversao de formato na cadeia de caracteres 6 ass0- ciada com 0 primeiro valor na lista de safda da fungio fprint, e assim por diante. O tipo de cada especificacao de conversao de formato precisa casar com © tipo de dado exibido, No exemplo abaixo, a especificago ta & associada com a variavel a, $£ com a varlivel be $s com a varidvel c, Note que 0s tipos de especificagao precisam casar comos tipos de dades. a = 10; b= pir c = ‘Hello’; fprintf (‘outputs $4 %f ts\n',a,b,e)7 2. Se a varredura atingir o final da cadeia de caracteres de formato antes de a fungio fprint® extinguir os valores, o programa reinicia do comeco da caceia de caracteres de formato. Por exemplo, as declaragées a = (10 20 30 4017 Eprinté (‘Output produzem a saida output = 1020 output = 30 40 4a €4a\n'.a: Quando a fungéo atinge o fim da cadeia de caracteres de formato antes de imprimir a(21, ela einicia do comego da cadeia de caracteres para imprimir ai3) ea(a) 3. Sea fungio fprint£ consumir todas as variéveis antes do final da cadcia de caracteres de formate, o uso da eadeia de caracteres de formato se encera na primeira especifcagio de comversio de formato sem una varigoel correspondent, ou no final da cadeia de caracteres de formato —o que acorerprimeir. Por exemplo, as declaragBes b= 18; © = 20; Output = ¥4d\ndutpu produzem a saida a= 10; Eprintt 2é\n’ va,b.e): output = 10 output = 15.0 output = 20 output =» © uso da cadeia de caracteres de formato se encerra em 84.18, que é a primeira especifica declaragoes tage = 20) fprint£ ("Voltage = 86.2£ kV.\n‘, voltage: ‘de conversio de formato nao casada. Por outto lado, as —__ 336 | Promarso em 4ATLA9® prs Engen produzem a saida Voltage = 20.00 kv. pois temos especificagses de conversio de formato nio casadas, ¢ 0 uso do for- ‘mato se encerra no final da cadeia de caractetes de formato. > Exemplo 8.2 ~ Gerando uma Tabela de Informagoes Uma boa maneira de ilustrar o uso das fungSes fprintf é gerar e imprimir uma tabela de dados. O arquivo de script de exemplo abaixo gera as raizes quadradas, quadrados ce cubos de todos os inteiros de um até dez, e apresenta os dados em uma tabela com 0 cabegalho apropriado. % Script file: table.m 8 & Purpose: % To create a table of square roots, squares, and = cubes. 8 & Record of revisions: 8 bate grammer Description of change . = & 12/20/98 + Chapman Original code ® & Define variables 8 cube cubes sou Index variable 3 square Squares % aquare_roots -- Square roots 8 out ~~ output array % print the title of the table fprint£(/Table of Square Roots, Squares, and Cub NB\B") 7 % print colunn headings fprinté(’ Number Square Root square Cube\n’); Eprinte() ssese: sere ans @ Generate the required data ii = 1:10; square_root = sqrt (ii); square - ii.°2; cube = ii.83; % Create the outmut array out = [i square_root’ square’ & Print the data for ii = 1:10 Eprinté (/ X2d %11.4£ 46d ¥8A\n" out (LL, 1))7 cape 8 Fung ae Emnacits | 397 Quando esse programa for executado, o resultado seré > table Table of Square Roots, Squares, and Cubes Number Square Root Square Cube 1 1.0000 1 2 1.4142 4 8 3 117321 9 n 4 2.0000 16 64 5 2.2361 25 125 6 2.4495, 36 216 7 2.6458 43 543 a 2lezed 66 512 9 3.0000 at 729 10 311623 100 1000 8.6.4 AFungdo fecant A fungio Es seguinte form: .nf 1é dados de um arquivo formatados por um usuério. Ela tem a matriz = fscanf (fia, formato) [matriz, quant] = fscanf(fid, formato, tamanho) onde £14 é 0 id do arquivo de onde os dados serio lidos, formato éa cada de caracte- res de formato que controla como os dados sio lidos ematriz éa matri2 que reeebe os dados. O argumento de saida quant retorna a quantidade de valores lidos do arquivo. (O argumento opcional tananho especifica a quantidade de dados a serem lidos do arquivo. Existem trés versées para esse argumento. ta Lé exatamente n valores. Com essa declaragio, ratriz vetor coluna que contém n valores lides do arquivo, = Int Le até o final do arquivo. Com essa declaragio, natriz é um vetor coluina que contém todos os dados até o final do arquivo. = {na} LB exatamente n xm valores, ¢ formata os dados como uma mati A cadeia de caracteres de formato especifica 0 formato dos dados a serem lids. Ela pote conter caracteres ordindrios e especificagbes de conversio de formeto. A fungao fscan£ compara os dados no arquivo com as especificagoes de conversio de arquivo na cadeia de caracteres de formato, Se eles casarem, fscanf converte 0 valor € © armazena na matriz de saida. O processo continua até o final do arquivo ou até a quantidade de dados especificada em tamanto ser lida o que ocorrer primeiro ‘Se os dados no arquivo nio casarem com a especificacio de conversio de arquivo, 1 operagio de Escant é interrompida de imediato. \ 338 | roganagzo am MATAR? pra Egon: ~~ A especificagao de conversao de formato para fscant é basicamente igual a de fpeinté, As especificagies mais comuns sio mostradas na Tabela 8,10. Para ilustrar 0 uso de fscanf, tentaremos ler um arquivo denominado x.dat com os seguintes valores em duas linhas: 10.00 20.00 30.00 40.00 1, Se o arquivo forlido com a declaragio te, quanel = fecant (fia, 9); 0 a vaével «reaterdovetorctuna | 2 | e quant serdigual a4 2 2. Seo arquivo for lido com a declaracio Iz, quant] = fscanf (fia, "8", {2 217 : vo 3 sou avaridvel 2 receberd o valor 10¢ quant receberd o valor 1. Isso porque o ponto decimal em 10,00 no casa com a especificacio de conversio de formato, € scant para assim que ndo ocorre um casamento, Tabela 8.10 Especificagées de Conversdo de Formato para fscané Especlicagio ——_Deserigdo ve 12 wm caractere sno. Basa especticagio I qualquer earactere inclusive Branco, _marcadores de mudanga delinha e asim por dante sue LEN carats | um mimeo decimal (ignors os brancot) [Lum nimero de ponte utuante (ignora os brancos). [Le um nteio com sna (ignoea os brancos Luma cadeia de carateres A cada termina com brancos ou outros ca 4, Se o arquivo for lido com a declaraczo [z, quant] = fscanf (fia, "ta.ta", (2 a varidvel z receberd o vetor linha {10 0 20 0 30 0 40 Ole quant receberd 8. Iss0 porque 0 ponto decimal agora casa com a especificagao de com versio de formato, e os mimeros nos dois lados do ponto decimal sao inter- pretados como inteiros separados! Cape 8 Fogle ce Enradvics | 339 5, Tentemos agora ler o arquivo como caracteres individuais. Se 0 arquivo for lido com a declaracéo [z, quant] = Escan£(fid,"tc"); a varidvel 2 receberg um vetor com cada caractere no arquivo, incluindo todos 18 espagos e caracteres de mudanga de linha! A varidvel quant: serd igual ao niimero de caracteres no arquivo. 6, Finalmente, tentemos ler 0 arquivo como uma cadeia de caracteres. Seo arquivo for lido com a declarasao Iz, quant} = fscanf(fid,’%s"): a varidvel z receberé um vetor linha com os 20 caracteres 10.0020.0030.0040..00, equant seré 4. Isso porque a especificagio da cadeia de caracteres ignora espagos em branco,¢a fungio encontrou quatro cadeias sepa- radas no arquivo, 8.6.5 A Fungo fgee1 A fungdo Egett le a préxima linha excluindo os caracteres de fim de linha do arquivo, como se fosse uma cadeia de caracteres. A sua forma é linha = fget1 (fia) onde £id € 0 id de um arquivo de onde os dados serio lidose linha € a matrizde ca racteres que recebe os dados. Se get 1 encontra um fim de arquivo, o valor de =inha passa a ser 1 8.6.6 A Fungao fgets ‘A fungio fgets Iéa préxima linha incluindo os caracteres de fim de linha do arquivo, como se fosse uma eadeia de caracteres. A sua forma é linha - fgets(£ia) onde £id é 0 id de um arquivo de onde os daclos serio lides ¢ Linha é uma matriz de caracteres que recebe os dados. Se fgets encontra um fim de arquivo, o valor de Linha passa a ser—1 8.7. Compar ndo Fungdes de E/S Bindrias e Estruturadas Operagdes de E/S formatadas produzem arquives formatados. Um arquive formatado contém caracteres reconheciveis, niimeros, ¢ assim por diante, armazenados como texto ASCIL E facil distinguir esses arquivos, pois pademos ver os caracteres e miimeros no arquivo quando o exibimos na tela ou o imprimimos. Entretanto, para utilizar os dados { 340. | Progarsido om MATLAB para agentes de um arquivo formatado, um programa MATLAB precisa traduzir os caracteres no arquivo para o formato de dados interno utilizado pelo computador. Especificagées de conversio de formato fornecem as instrugdes para essa tradugao. Arquivos formataclos tém a vantagem de permitir que sejam vistos os dados neles contidos, e de tomar fécil a troca de dados entre diferentes tipos de programas que os utilizam. Eles apresentam, por outro lado, algumas desvantagens. Dé bastante trabalho para um programa converter um numero entre a representagao interna do computador © 05 caracteres contidos em um arquivo, Toco esse trabalho & esforgo desperdigado se formos ler os dados em outro programa MATLAB. Adicionalmente, a representagio interna de um numero em geral requer muito menos espago que a representagao corres pondente do niimero em um arquivo formatado. Por exemplo, a representagao interna de um valor em ponto flutuante de 64 bits requer 8 bytes. A representagio em caracteres, do mesmo valor seria +4. dddddddaddddddesee, que requer 21 bytes (um byte por ‘caractere). Assim, armazenar dados em formato de caracteres é ineficiente e desperdiga espago em disco. Arquivos no formatados (ou arquivos binarios) resolvem essas desvantagens a0 copiar a informacao diretamente da meméria do computador para 0 arquivo de disco sem nenhuma conversio, No MATLAB, as operagies de E/S bindrias sio muito mais répidas que as operagies de E/S formatadas, pois elas ndo requerem conversies. Adicionalmente, os dados ocupam muito menos espaco de disco. Por outro lado, dados no formatados nao podem ser examinados e intecpretados diretamente por seres, umanos. Além disso, em geral eles no podem passar de um computador para outro de tipo diferente, pois computadores diferentes tém maneiras diferentes de representar internamente valores inteiros e de ponto flutuante Arquivos formatades e nao formatados so comparados na Tabela 8.11. Em geral, ‘0 arquivos formatados sio melhores para dados que precisam ser examinados por pes: soas ou dados que padem precisar ser transportades entre diferentes programas ou. diferentes computadores. Arquivos néo formatados sdo melhores para armazenar informagBes que nio precisarao ser examinadas por pessoas e que serio criadas e uti- lizadas no mesmo tipo de computador. Sob essas circunsténcias, arquivos no forma- tados so mais répidos e ocupam menos espaco em disco. Boa Pratica de Programagao Utilize arquivos formatados pata criar dados que devem ser legiveis para pessoas ou transferiveis entre programas ou computadores de tipos diferentes. Utilize arquivos nao, formatados para armazenar com eficiéncia grandes quantidades de dados que nao pre- cisam ser examinados diretamente e que permanecerio em somente um tipo de com putador. Utilize também dados nao formatados quando a velocidade de E/S for um fator extico. te Capito Fung nraausie | 341 Tabela 8.11 Comparagdo entre Arquivos Formatados e Nao Formatados ‘Arquivos Formatados ‘rquvos Nao Formaadas Dados podem ser exibidos em dispostvos de Dados no podem ser exbidos em dlspositvos de sida sald, Dados podem ser faciimentetansportados entre Dados lo podem ser tansportados com faslidade computadoree diferentes, entre computadores com represntagbesinlemas de Exemplo 8.3 ~ Comparagéo entre E/S Formatadas e Binérias © programa exibido neste exemplo permite comparar 0 tempo requerido para ler €es- crever uma matriz com 10.000 elementos utilizando operagies de E/S formatadas e bindrias. Note que cada operacao € repetida dez vezes, ¢ 0 tempo médio é registzado. % Script file: conpare.m 8 % Purpose 8 To compare binary and formatted 1/0 operations. % This program generates an array of 10,000 random % values and writes it to disk both as a binary and & as a formatted file. s % Record of revisions: 8 bate Programmer Description of change . : . . % 12/19/98 s. J. Chapman Original code ‘ § Define variables & count Number of values read / writte s fid -- File id 8 inarray =~ Input array & msg Open error message & outarray —-- Output array & status Operation status & time ‘lapsed time in seconds sereassueasennsssesssaesesnaneaeaaaaeaeastagag, % Generate the data array SEBBEEERRSSEDDVTGGEANAGELNDNTENNRRR RRR N NETS, out_array = randn(1, 10000) ; 342. | Proagiom AATAB® sora Enemies senseaenceesseneseecetcetseececeeesszeceessees First, time the binary output operation. peaaeaneaaaasaagasssasssatecseseseasassaasesas & Reset tiner tics % Loop for 10 times for ii ~ 1:10 % Open the binary output file for writing. (£i4,msg] = fopen(‘unformatted.dat', 'w'); & Write the data count = fwrite(fid,out_array, 4% Close the file status = felose(fia); end "floated": & Get the average time time = toc / 10; Eprint£ (‘Weite time for unformatted file - $6.3£\n’, time); euvececeeeeeeteteeceeeseseecageeceetiaccessate & Next, time the formatted output operation, aunnnaennancanaceneaeacesaaanaaaaacaiaaaaaaags § Reset timer tics % Loop for 10 times for ii = 1:10 & Open the formatted output file for writing. [fid.msg) + fopen(‘ formatted dat", ‘wt'); & Write the data count = fprinté (fid, '23.15e\n", out_array) 8 Close the file statue = Eclose(fid); end % Get the average time cime = toc / fprint£ (‘Write time for formatted file = ¢6.3f\n’, time); eunneececceneecenuccecuagazaeaeecaarteecetess 8 Time the binary input operation. ‘auagagaggaaaaaaaaagasaaesesassasassessasssaaas Roset timer % Loop for 10 times for ii = 1:10 as Fungdes oo Ewresida | 343 % Open the binary file for reading. [fid,msg) = fopen|/unformatted.dat’,’r'}: % Read the data linarray, count] = fread(fid,Inf, ‘float64’); % Close the file status - fclose(fid); end 4% Get the average time time = toc / 10; fprintt (‘Read time for unformatted file - %6.2£\n’, tine); seeeesseessaceeeeeeteesttteececeassesessaaaay, % Time the formatted input operation. BeGeasaaaaaaaaaeeeeseataeeseecceeassassstaaas, % Reset timer tics % Loop for 10 times for ii ° % Open the formatted file for reading. [£id,meg) - fopen(‘unformatted.dat”,‘rt"): | Read the data [inarray, count) = fscanf(fid,“8£",ms); % Close the file status = fclose(fid): end % Get the average time time = toc / 10; fprinté (‘Read time for unformatted file = 86.3£\n", time): Quando esse programa for executado em um Pentium de 733 MHz utilizando Windows NT 2000 Professional, os resultados serao: » compare Write time for unformatted file = 0.002 Write time for formatted file = 0.132 Read time for unformatted file = 0.002 Read time for formatted file = 0.157 (Os arquivos escritos no disco <0 mostrados abaixo. D:\book\matlab\chapa-asx *-dat Volume in drive D is Data Volume Serial Number is CC1C-2FAR \ 344 | Pogamagzoem MATAR? pre Eneaeios Directory of D:\book\matlab\chaps 13/06/2001 04:24p 13/06/2001 04:24p 13/06/2001 05:26p 250,000 formatted.data 13/06/2001 05:26 80,000 unformatted.data 330,000 bytes 206,955,520 bytes free Note que tempo de escrita para o arquivo formatado foi 60 vezes maior que o ‘tempo de escrita para o arquivo nao formatado, ¢ 0 tempo de leitura para o arquivo for matado foi mais de 75 vezes maior que o tempo de leitura para 0 arquivo nao forma: tado. Adicionalmente, 0 arquivo formatado ficou trés vezes maior que 0 arquivo nao formatado. Fica claro, com base nesses resultados, que, a menos que voc® realmente necessite de dados formatados, as operagées de E/'S bindrias sao a maneira preferida para gravar dados no MATLAB. < Este teste apresenta uma verificagio répida do seu entendimento dos conceitos apre- sentados nas Segies 8.6 € 87. Se vacé tiver problemas com 0 teste releia as segdes, per jgunte ao seu professor ou discuta 0 material com um colega. As respostas podem ser encontradas no final do livro. 1, Qual a diferenga entre operagées de E/S nao formatadas (binérias) e formatadas? 2. Quando devemos utilizar E/S formatadas? Quando devemos utilizar E/S nao for- ‘matadas? 3, Escreva as declaragées MATLAB requeridas para criar uma tabela que contenha 0 seno e 0 co-seno de x para x = 0, 0,1, .., %. Coloque um titulo ¢ legendas na tabela. Para as questdes 4 ¢ 5, determine se as declaragdes MATLAB sdo corretas. Se houver, algum erro, especifique-o. 4a = 2*pir b- 6 c= hello"; Eprinte (id, ’8s 4d Sa\n".asbc); 5. datal = 1:20; dataz - 1:20; £id = fopen(*xxx", fwrite (tia, daval) : fprintf(fid, "gin" data?) ; Caple 8 Fengve cs Exiasu sees | 348 8.8 Posicionamento de Arquivo e Fungées de Estado Conforme dito anteriormente, os arquivos MATLAB sio seqienciais - eles sio ligos na ordem do primeiro registro até o tiltimo registro no arquivo. Entretanto, necessitamos as vezes ler dados mais de uma vez ou processar um arquivo todo mais de uma vez durante a execugao de um programa. Como saltar dentro de um arquivo seqiiencial? ‘A fungao MATLAB exi et. pode determinar se um arquivo existe antes de cle ser aberto, Ha duas fungdes que nos dizem onde estamos em um arquivo que foi aberto: feof e Ftell, Adicionalmente, existem duas fungdes que auxiliam a mover-se centro de um arquivo: frewind e fseek. Finalmente, 0 MATLAB inclui uma fungdo ferror com uma descriglo detalhada das causas de erros de E/S quando eles ocorrem. Vamos agora explorar essas seis fungbes, comecando por ferror, pois esta pode ser utilizada com todas as outras funcbes. 8.8.1 A Fungo exist ‘Afungio MATLAB exist verfica a existéncia de uma varidvel em tum espaco de tra balho, de uma fangio predefinida ou de um arquivo no caminho de busca do MATLAB. [As formas da fungao ferror si0 ident ident exist ("item); exist (‘item", ‘tipo’): Se ‘item’ existir,a fungio retornard um valor baseado em seu tipo. Os resultados pos- siveis esto na Tabela 8.12. ‘A segunda forma da fungio exist restringe a busca para um item de um tipo espectfico. Os tipos legais so ‘var’, ‘file", ‘builtin’ e ‘dir’ ‘A fungio exist € muito importante, pois podemos utilizé-la para verificar a existincia de um arquivo antes de ele ser reescrito por Eopen. As permissbes "w” ¢ ‘wt apagam o contetido de um arquive existente ao abri-lo. Antes de um pro- gramador permitir que open apague um arquivo, ele deve pedir uma confirmagao do usudtio, Tabela 8.12 Valores Retomads pela Fungdo ex: Valor ‘Sania Item no encontrado Item & uma vaisvel no expaco de trabalho corente tem um arquivo M ou um arquve de tipo escohecido Hem é um arquivo MEX tem é um arquivo MDL Item & uma fangio predefnid, Item & um aruivo pode. Item é um dirt, “aI 348 | orange em MATAR? pre Ergenbis > Exemplo 8.4 Abertura de um Arquivo de Saida programa a seguir captura um nome de arquivo de saida fornecido pelo usustio e verifica se ele existe. Se existir, 0 programa verificaré se o usuério quer apagar arquivo existente ou concatenar os novos dados no final do arquivo. Se 0 arquivo nao exists, 0 programa simplesmente abrird o arquivo de saida. Script £1 + output.m Purpose: ‘To demonstrate opening an output file properly ‘ais program checks for the existence of an output file. If it exists, the program checks to see if the old file should be deleted, or if the new data should be appended to the old file. Record of revisions Date Programmer Description of change 11/29/98 §. J. Chapman Original code Define variables fid File id out_filename -- Output file nane yn == Yes/No response Get the output file name filename input (‘Enter output filename: 8: POe eee Hen wEwewewenne Check to see if the file exiets. £ exist (out_filenane, ‘file’) % The file exists Aisp(‘output file already existe.’); yn = input (/Keep existing file? (y/n) *,/8'); if yn #id = fopen(out filename, ‘wt!); else id = fopen(out_filename, ‘at’); end else MPLle doesn’t exist fid = fopen(out_filenane, ‘wt"); end apts 8 Foptes ce eratvsvigs | 347 % output date fprinté(£id, “$s\n’ date); % Close file felose(fid); Quando esse programa for executado, o¢ resultados serao » output Enter output filename: 20 » type xx 29-Nov-1998 > output Enter output filename: 20% Output file already existe Keep existing file? (y/n) ¥ » type 2x 29-Nov-1998 28-Nov-1998, » output Enter output filename; 20 Output file already exis! Keep existing file? (y/n) a > type 20H 29-Nov-1998 (Arquivo inexistente) (Preserva arquivo exi ente) (Dados noves adicionados) tui arquivo existente) (© programa aparentemente esté funcionando corretamente nos trés casos. Boa Prética de Programagao Nao reescreva um arquivo de saida sem antes confirmar com 0 usudtio se as infor: mages preexistentes devem ser apagadas, 8.8.2 A Fungéo ferror Osistema de E/S do MATLAB tom diversas variaveis internas, incluindo um indicador de erros especial associaco a cada arquivo aberto. Esse indicador de erros é atualizado a cada operagao de E/S. A funcio Fer ror captura o indicador de erros eo traduz como uma mensagem em caracteres facil de entender. As formas da fungio ferror sio: mensagen = ferror (fia) mensagem = fer: {mensagen, errnum} fia, ‘2 ‘error (fia) 348 | Provan er MATLAB? pra Egencis Essa fungio retoma a mensagem de erro mais recente (e opcionalmente o rximero do erro) associada ao arquivo vinculado a0 £4. Ela podeser acionada a qualquer instante ‘depois de uma operagao de E/S para obter uma descrigéo mais detalhada do que ocorreu de errado, Se essa fungdo for acionada depois de uma operagéo bem-sucedida, a men- sagem sera‘. ." eo ntimero do erro sera 0. " ‘Oargumento ‘clear limpa o indicador de ero para um id de arquivo em particular, 8.8.3 A Fungdo feof ‘A fungio feof testa se a posigio cortente do arquivo é o fim dele. A forma da fungéo feoté eofstat = feof (fid) Essa fungio retorna 1 se @ posigdo corrente do arquivo for o fim do arquivo, e 0, caso contratio. 8.8.4 A Fungao fte11 A fungio £te11 retorna a localizagéo corrente do indicador de posigio de arquivo para © arquivo especificado por £id. A posigio € um inteiro nao negativo especificado em bytes a partir do inicio do arquivo, Um valor retomado de ~1 para a posigio indica que fa consulta no foi bem-sucedida, Se isso ocorrer, uilize ferror para determinar o ‘motivo da falha, A forma da fungio tell € posicdo - ftell (fia) 8.8.5 A Fungo frewind ‘A fangdo frowind permite que um programador ajuste 0 indicador de posicio de um arquivo para o inicio do arquivo. A forma da fungio =rewind é frewina(fid) Essa fungio nio retorna informagao de estado, 8.8.6 A Funcao fseek A fungéo Escek permite que 0 programador ajuste o indicador de posicio de um arquivo para tuma localizagao arbitréria dentro de um arquivo. A forma da fungio fseek & status - fseek(£id,deslocamento,origem) Essa fungdo reposiciona o indicador de posigao do arquivo com 0 £id dado para o byte ‘amento especificado com relagio A crigen O deslocamento € me- ee Caples Fijtos ee ewradsuce | 349 dido em bytes, com um ntimero positive indicando movimento em direg4o ao fim do arquivo e um niimero negativo indicando movimento em diregio a0 inicio do arquivo, Arigen é uma cadeia de caracteres que pode ter um dos valores abaixo. = ‘bof’ Inicio do arquivo. = ‘cof’ Posigao corrente no arquivo. = ‘eof’ Fim do arquivo, O status retomado sera zero se a operasio for bem-sucedida, ¢ -1 se ocorrer falha, Se o status retomado for -1, utilize ferror para determinar 0 motivo da falha. ‘Como exemplo de utilizagio combinada de fseek e ferror, considere as decla- ragoes abaixo. fid,msg] = fopen(’x', /5")5 status = fseek(fid,-10, bof"): £ status ~= 0 msg = ferror (fia); dispimsgi ; Esses comands abrem um arquivo e tentam austar oapontador do arquivo para 10 bytes antes do inicio da arquivo. Como isso ¢ impossivel, fseek retoma um status de 1 € error captura a mensagem de erro apropriada, Quando esses declaragbes S50 exec tadas, resultado é uma mensagem de erro informativa. Offset is bad - before beginning-of-file > Exemplo 8.5 ~ Ajuste de uma Reta a um Conjunto de Medidas com Ruido No Exemplo 47, aprendemos como ajustar um conjunto de medidas (x,y) com rufdo a ‘uma reta da forma nth (81) (© método-padrio para encontrar 0s coeficientes de regressio m eb é0 método dos mt rnimos quadrados. Esse método recebe o nome de “minimos quadrados” porque produz allinha y = mx + 5 tal que a soma dos quadrados das diferencas entre os valores obser- vados € previstos de y seja a menor possivel. A inclinago da curva de minimos qua rados € dada por (Eay)-(E xy eee 62 x)- Eur « aintersegio da reta de minimnas quadrados€ dada por beg-mi 63) ee Se 350. | Progam om MATLAB? gr Enger onde Ex 6 a soma dos valores de. Es? 6a soma dos quadrados dos valores de x Exy € a soma dos produtos dos valores correspordentes de x e de y. 3 &a média dos valores de x. 7 éa média dos valores dey. Escreva tm programa que calcule a inclinagio de mfnimos quadrados m e a inter- segdo b no eixo y para um daclo conjunto de pontos medidos com ruido (x,y) que deve constar de um arquivo de dadas de entrada. Solugéo 1. Descreva o problema Calcule a inclinacio m e a interseco b da reta de minimos quadrados com melhor ajuste para um conjunto de dados de entrada composto por um niimero arbi- teério de pares (3), Os dados de entrada (xy) rsidem em um arquivo de entrada especifcado pelo ustrio. 2. Defina as entradas e safdas ‘As entradas requeridas para esse programa sio pares de pontos (x.y), onde x € ysio quantidades reais. Cada par de pontos se localiza em uma linha separada no arquivo de entrada do disco, O numero de pontos no arquivo do disco no € previamente conhecido. {As saidas desse programa sio a inclinagio ¢ a intersesio da retaajustada dle minimos quadrados, mais 0 imero de Pontos ulizados para 0 ajuste. 3. Descreva o algoritmo Esse programa pode ser quebrado em quatro passos principais. Leia o nome do arquivo de entrada e abra esse arquivo Acumule ac estatisticas de entrada Calcule a iaclinagéo © @ intersecto Eecreva a inclinacdo © @ intersect (Os primeiros passos do programa sio ler o nome do arquivo de entrada e abrir o arquivo, Para isso, solieitamos 20 ustérig o nome do arquivo de entrada Depois de abrir o arquivo, precisamos verifcar sea abertura foi bemr-sucedida. Em seguica devemos ler o arquivo e acomperthar o mimero de Valores dados, sais as somas Es, ¥y, 3” e Exy, O pseudocddigo para esses passos & Inicie com 0 as variaveis n, sunx, sum_x2, sumy @ sum xy Solicite ao usuério © none 40 arcuivo de entrada Abra o arquivo Veritique se ocorreram erros na abertura Sf sem orros READ x, y do arquivo white not fim-de-arquive ened sunx © sumx + x cit Forges ae eweaaasids | 351 sumy © sumy + y pum x2 © sumx2 > x2 sumxy © sumxy + ty READ x, y do arquivo end (processamento adicional) end Depois, precisamos calcula a inclinagdo ea intersecao da reta de minimos quadrados. © pseudocédigo para esse passo s2o as verses MATLAB das equagies (62) € (83) x bar y_bar slope y_int « e sux / n sumy /n (oun_xy - sum xty_bar) / (sum x2 ~ sum_x*x_bar) yibar - slope * x_bar Finalmente, precisamos escrever 0s resultados. Escreva a inclinacdo ‘slope’ e a intersegéo ‘y_int’. 4. Transforme o algoritmo,em declaragdes MATLAB (O programa MATLAB final 6 apresentado abaixo. Script file: Purpose: lsafit.m ‘To perform a least-squares fit of an input data set to a straight line, and print out the resulting slope and intercept values. The input data for this fit comes from a user-specified input data file. Record of revisions: Date 12/20/98 Programmer Description of change S. J. Chapman Original code Define variables: count filename fia neg slope sum_x2 sun xy sumy number of values read Input file nae File id open error message Number of input data pairs (x,y) Slope of the line Sum of all input x values Sun of all input x values squared Sun of a]1 input x*Y values Sun of all input ¥ values 352. | Propane em MATLAB? pa Ergenteres Box An input X value & xbar Average X value e oy An input Y value & ybar Average Y value & ylint Y-axis intercept of tae line & Initialize sums n= 0; sumx = 0; sumy = 0; sumx2 = 0; sumxy % Prompt user and get the name of the input file Gisp(‘This progran performs a least-squares fit of an’); Sisp(‘input data set Line. Gisp(‘of the file containing the input (x,yl pairs: ‘ ): filename = input(' ‘, ‘s* ter the name’) © Open the input file (fid)msa] © fopen(filename, ‘rt’); % Check to see if the open failed. if fid <0 & There was an error--tell user. dispinsg) ; else % File opened successfully. Read the (x,y) pairs from & the input file. Get first (x,y) pair before the 8 loop star [in, count) Escan€(fid, "8g 897,2) while -feof (fia) x = in; y= inti; sum = sume + x7 calculate sumy = sumy + ¥; statistics Sun_x2 = sum_x2 + x.2 sun_xy = eunxy + x * 8 Get next (x,y) pair Lin,count) = fscanf (fid, RE", (1 21); calculate the slope and intercept sumx / = sumy /n = (sum_xy - sumxty_bar) / (sumx2 - sum xtx bar}; y-bar = slope * x bar; & Pell user Sprint£ (‘Regression coefficients for er Caps 8 Foie de EnindoSvte | 363 fprinté(* Slope (m) = $12.3£\n', slope) fprinté(‘ Intercept (b) = $12.3f\n",y_int); fprintf(" No of points = t124\n’,n); end 5, Teste 0 programa Para testar esse programa, vamos utilizar um conjunto de dados simples. Por ‘exemple, se cada ponto no conjunto de dados de entrada pertencer a uma reta, ‘0 resultado deverd ser uma inclinagio e uma intersecio exatamente iguais As daquela reta. Assim, 0 conjunto de dados 1 deve produzir uma inclinagdo de 1,0 e uma interseygo de 0,0. Ao colocarmos cesses valores em um arquive denominado input? e executarmos o programa, (0s resultados serio » legfit This program performs a least-squares fit of an input data set to a straight line. Enter the nane of the file containing the input (x,y) pairs input Regression coefficients for the least-squares line: Slope (m= 1,000 Intercept (b) = 0.000 No of points 7 Agora, acrescentamos algum ruido as medidas. O conjunto de dados passa a ser 1.1.02 2.2. 2.30 3.3. 3.05 a4 4.28 5.5 5.75 6.6 6.48 1.7 7.84 Se esses valores forem colocados em um arquivo input? e o programa for exe cutado, os resultados serao » Legit ‘This program performs a least-squares Fit of an input data set to a straight line. Enter the name of the file containing the input (x,y) pair: 354 | Froranacdo on MATAD® gre geass ‘Auto de Mininos Qusdratos Figura 8.2 Um conjunto de dados de entrada com ruido e a reta ajustada de minimos qua- dlrados resultante Anput2 Regression coefficients for the least-squares line Slope {m} 1.024 Intercept (b) = ~0.120 No of points = 7 Se calcularmos a resposta & mio, é fécil mostrar que o programa dé a resposta comteta para nossos conjuntos de dados de teste. O conjunto de dados de en- trada com nuido a reta resultante de minimos quadrados so exibidos na Figura 8.2 < 8.9 Fungao uiimport ‘A fungéo uiirmport é uma maneira baseada em GUI para importar dados de um arquivo ou rea le armazenagem intermedidra, Esse comando assume as formas uiinport utura = uiimport; No primeiro caso, os dados importados sio inseridos diretamente no espaco de traba tho corrente do MATLAB. No segundo, os dados sio convertidos para uma estrutura € gfavados na varidvel estrutura. apie Fugses ac Enramussics | 358 a @ o co ee [to Figu 8.3 Usilizando uiinpore: (a) O Auxiliar de Importagio depois de iniciado. (8) Ass tum arquivo de dados ter sido selecionado, uma ou mais matrizes de dados «tiadas,e 0 contetido pode ser examinado. Quando o comando ui import € digitado, o Auxiliar de Importagio é exibido em ‘uma janela (ver Figura 83 para a versio PC dessa janela), O usuario pode entio sele- cionar o arquivo ou area de armazenagem intermediaria de onde ocorrers a impottagio 0s dados especificos do arquivo, Diversos formatos diferentes recebem suporte, ¢ os dados podem ser impostados de quase qualquer aplicasio, utilizando gravagio na area de armazenagem inter- medisria. Essa flexibilidade pode ser muito itil quando se tenta levar dados para 0 MATLAB para an em MATLAB para opens Gs wo mot | sou | rae |e Figura 8.3 (Continuacio)(e) Apds a carga do arquivo, o usuario pode selecionar quais matrizes de dados se importadas para 0 MATLAB, 8.10 Resumo No Capitulo 8, apresentamos uma introdugio as operagoes de E/S de arquivos. As fungSes de E/S do MATLAB sfo bastante similares as fungSes C, mas existem dife rengas em alguns detalhes. ‘Os comandos oad e save que utilizam arquivos MAT séo muito eficientes, podem ser transportados por diferentes implemertagGes do MATLAB e preservam totalmente a precisio, os tipos de dados e o estado global de todas as variaveis. Eles devem ser utilizados como a primeira alternativa para E/S, a menos que os dados pre- ‘cisem ser compartilhados por outras aplicagdes ou Iidos por huumanos. Existem dois tipos de declaragies de E/S no MATLAB: bindrias e formatadas. As declaracdes de E/S binérias armazenam em ou Igem dados de arquivos nao forma- tados, eas declaragdes de B/S formatadas armazenam em ou léem dados de arquivos formatados. (Os arquivos MATLAB so abertos com a funcio fopen e fechados com a funga0 fclose. Leituras ¢ escrtas bindrias so efetuadas com as fungSes fread e fwrite,€ leituras e escritas formatadas so efetuadas com as fungoes Escanf e fprint?. As fungSes fgets e fget simplesmente transferem uma linha de texto de um arquivo formatado para uma cadeia de caracteres, ‘A fungio exxi st pode ser usada para determinar se um arquivo existe antes de cle ser aberto, Isso € stil para garantir que dados existentes nao sejam acidentalmente reescritos, Existe a possibilidade de movimentagio dentrc de um arquivo de disco utilizando as fungdes rewind e fseek, A fungio Frewind passa da posicio corrente do arquivo para o inicio dele, e a fungio fseek leva a posicao corrente do arquivo para um ponto 1 Funes 00 Ewes | 387 que esteja um niimero especificado de bytes adiante ou atrés de um ponto de referéncia. © ponto de referéncia pode ser a posi¢ao corrente do arquivo, o inicio do arquivo ou 0 final do arquivo. 8.10.1, Resumo de Boas Praticas de Programagao As préximas orientagdes devem ser seguidas para trabalhar com as fungies de E/S do MATLAB. 1, Utilize a fungo text read para importar dados ASCII em formato de colunas de programas escritos em outras linguagens ou exportados de aplicagdes ~ por exemplo, planithas. 2. A menos que seja necessério trocar dados com programas que ndo sejam em MATLAB, sempre utilize os comandos load e save para gravar conjuntos de dados em formato MAT. Esse formato é eficiente e pode ser transportado entre implementagdes do MATLAB, além de preservar todos 0s detalhes dos tipos de dados do MATLAB. 3. Sempre tome cuidado com a especificacio de permissées apropriadas nas decla- rages fopen, dependendo de vocé querer ler de ou escrever em um azquive. Esse cuidado ajuda a evitar erros como reescrever acidentalmente sobre arquivos de dados que precisam ser preservados. 4, Sempre verifique o estado apés uma operacio de abertura de um arquivo; para garantir que cla foi bem-sucedida. Se a abertura do arquivo falha, notifique © usuario e proporcione uma maneiza de resolver 0 problema, 5. Utilize arquivos formatados para criar dados que precisem ser legiveis para seres hhumanos, ou que precisem ser transferidos entre programas em computadores de tipos distintos, Utilize arquivos no formatados para armazenar com eficién- cia grandes quantidades de dados que nio precisem ser examinadas diretamente ce que permanegam em somente umm tipo de computador. Adicionalmente, utilize arquivos nao formatados quando a velocidade de E/'S for critica. 6, Nao reescreva um arquivo de saida sem antes confirmar se 0 usudrio deseja apagar a informagio preexistente. 8.10.2 Resumo do MATLAB (© resumo abaixo lista todas as fungées e comandos MATLAB apresentados neste capi- tulo, com uma breve descrigio de cada um. ‘Comandos e Funsdes exis Verifica a existéncia de um arquivo, Eclose Fecha arquivo, feof Teste de fim-de-arquivo, ferror Verifica 0 estado de erro de E/S de arquivo. ie fe 4 \ 358 | Progameic an eran” gaa Ener Le linha de arquivo, descartando caractere de mudanga de linha, Lé linha de arquivo, preservando caractere de mudanga de linha, Fopen Abre arquivo. Eprinté Escreve dados formatados no arquivo. fread L@ dados bindrios do arquivo. ewind Volta para o inicio do arquivo. fscant LE dados formatados do arquivo. Eseek Ajusta posigio do arquivo, ftell \Verifica posigao do arquivo. textrea uiimport e Escreve dados bindrios no arquivo. Lé dados de diversos tipos organizados em formato de colunas de um arquivo ASCIL Importa dados de um arquivo ou da area de armazenagem inter- ‘medidria utilizando o Auxiliar de Importagio 8.11 Exercicios 84 82 Qual a diferenga entre E/S bindrias e formatadas? Quais fungdes MATLAB efetuam cada tipo de E/S? ‘Tabela de Logaritmos. Escreva um programa MATLAB para gerar uma ta- bela de logaritmos na base 10 entre 1¢ 10 com passo 0,1. A tabela deve iniciar em uma nova pagina e incluir um titulo descrevendo a tabela e legendas para linha e coluna, Essa tabela deve ser organizada conforme mostrado a seguit. 83 0 x2 (000 0.01 0.079 9.114 30201322 0.342 0.362 Escreva um programa MATLAB para ler um tempo em segundos desde o ini- io do dia (esse valor deve ficar entre 0,0 e 86400,0) e imprima uma cadeia de ccaracteres que contenha o tempo na forma Hi::19¢: 5, utilizando um rel6gio de 24 horas. Utilize a conversdo de formato apropriada para garantir que 0s zeros a esquerda sejam preservados nos campos MMe SS. Verifique também ‘se o ntimero de segundo da entrada é vélido ¢ escreva uma mensagem de ‘erro apropriada para o caso de um miimero invalido ser fornecido Capito Funes ae Envadysues | 359 8.4 Accleracio da Gravidade. A accleragio devida & gravidade da Terra uma altura acima da superficie da Terra € dada pela equagio M erie onde G € a constante gravitacional (6672 10"! Nm? / kg?) M 6 a massa da Terra (5,98 X 10% ig), R & 0 raio médio da Terra (6871 km) eh altura acima da superficie da Terra. Se M for medida em kg e Re h em me-os, a aceleragio resultante ser em unidades de metros por segundo a0 quadrado. Escreva um programa para calcular a aceleraco devida & gravidade da Terra com inerementos de 500 km para alturas entre 0 km e 40,000 km acima da superticie da Terra. Imprima os resultados em uma tabela de altura versus aceleragio com rétulo apropriads, incluindo as unidades dos valores de saida, Desenhe os dados gn-G 4) 8.8 O programa no Exemplo 85 ilustrou o uso de comandos de B/S formatados para ler pares (x,y) de dados do disco. Isso poderia também ser feito uti- lizando a fungio Load ~asci i. Reescreva esse programa para utilizar Load no lugar das Fungdes de E/S formatadas. Teste seu programa reescrito para confirmar que ele dé as mesmas respostas que o Exemplo 8.5, 8.6 Reescreva o programa do Exemplo 85 para utilizar a fungio textread em vvez das fungoes de E/S formatadas. Quao difil foi utilizar textread, com- parando com utilizar Load ascii ou as funcbes de B/S formatadas? 8.7 Escreva um programa para ler um niimero arbitrétio de valores reais de um arquivo de dados de entrada especificado pelo ususrio, arredonde os valores Para o inteiro mais préximo e escreva os inteiros em um arquivo de saida specificado pelo usurio. Verifique se o arquivo de entrada existe; se no existr solicite a0 usuario que entre com outro arquivo de entrada, Se 0 arquivo de saida existr, pergunte ao usuario se ele quer apagé-lo; se ndo quiser, solicite um novo arquivo de saida, 8.8 Tabela de Senos e Co-senos. Fscreva um programa para gerar uma tabela com 0 seno € 0 co-seno de @ para 6 variando entre 0° e 90°, com incrementos de 1°. O programa deve colocar legendas apropriadas nas colunas da tabela 8.9 Céleulo de Juros, Suponha que vocé tenha uma quantia de dinheiro Pema um investimento no banco (usamos P para indicar zulor presente). Se o banco Pagar 0s juros com taxa de i% ao ano e compuser os juros mensalmente, a quantidade de dinheiro que voeé tera no banco depois de n meses serd dada pela equagio 65) ‘onde F ¢ 0 valor futuro da conta e 7 a taxa de juros mensal (0 fator extra de 100 no denominador converte a taxa de interesse de porcentagens para fragies). Escreva um programa MATLAB para ler uma quantia inicial P e ee 360 | Powanapio am MATLAB cr Enguonios 10 aa az 8.13 ‘uma taxa de juros anual i, ¢ calcular e escrever em uma tabela 0 valor futuro do investimento a cada més dos préximos cinco anos. A tabela deve ser escrita em um arquivo de saida denominado *Juros’. Coloque as legendas apro- priadas nas colunas de sua tabela Esereva um programa para ler um conjunto de inteiros de um arquivo de dados de entrada e localizar 0 maior e 0 menor valor dentro do arquivo de dados. Imprima o maior e 0 menor valor junto com as linhas onde eles foram encontiados. Assuma que voc’ nao sabe o nimero de valores no arquivo antes de lélo. Médias. No Exerccio 4.27, escrevernos um programa MATLAB para calcular a média aritmética, média rms, média geomérica e média harménica de um conjunto de niimeros. Modifique aquele programa para ler uma quantidade arbitra de valores de um arquivo de entrada e calcular as médias daqueles rimeros, Para testar o programa, cologue os seguintes valores em seu arquivo de dacos de entrada e execute o programa com base naquele arquivo: 1), 2,0, 590, 40,390.21, 47,39. Conversio de Radianos para Graus/Minutos/Segundos. Angulos sio fre- aiientemente medics em graus (), minutos(’)e segundos (*), com 360 graus em um citculo, 60 minutos em um grau ¢ 6) segundos em um minuto. Escreva tum programa para ler angulos em radians de wm arquivo de dados de entrada em disco, « conwverté-os em graus, minutos e segundos. Teste 0 Seu programa colocando os seguintes quate Angulos expressos em radianos fem um arquivo de entrada, e lendo aquele axquivo com 0 programa: 00,1, 3.141595, 60 : Crie um conjunto de dados utiizando algum outro programa em seu com- putador, como 0 Microsoft Word, o Microso!t Excel, um editor de textos etc Copie o conjunto de dados para a srea de armazenagem intermediaria v lizando as fungBes de cépia do Windows ou do UNIX, e entio utilize a fangio ui inport para carregar os dados ne MATLAB. Capitulo 9 Graficos de Controle Graficos de controle é 0 nome de um conjunto de fungdes grificas de baixo nivel que controlam as caracteristicas de objetos graficos gerados por MATLAB. Essas fungdes ficam normalmente escondidas dentro de arquivos M, mas so muito importantes para © programador, uma vez que permitem a ele ter controle fino da aparéncia dos dia~ gramas e graficas que geram. Por exemplo, é possfvel usar graficos de controle para ligar uma grade apenas para o eixo x, ou para escolher uma cor de linha como laranja, que nao é suportada pela opgio Linespec do comando plot.. Além disso, gréficos de controle permitem ao programador criar GUls para programas, como veremos no roximo capitulo. Este capitulo introduz a estrutura do sistema de gréficos MATLAB e explica como controlar as propriedades dos objetos graficos para criar uma apresentagio desejada 9.1. 0 Sistema de Graficos MATLAB ( sistema de graficos MATLAB baseia-se em um sistema hierarquico de objetos gré- ficos, cada um dos quais conhecido por um nome singular, chamado controle. Cada objeto grafico tem dacios especiais conhecidos como propriedades associadas a cle, ea modificago dessas propriedades modifica 0 comportamento do objeto. Por exemplo, uma Linha ¢ um tipo de objeto grifico. As propriedades associadas com um objeto linha incluem: dados x, dados y, estilo da linha, grossura da linha, tipo do marcador € assim por diante. A modificagio de qualquer uma dessas propriedades modifica 0 modo em que essa linha é apresentada em uma Janela de Figura. 362 | Pagano em sATAB® pre Eger: Cada componente de um grfico MATLAB 6 un objet griic. Por exemple, cada linha os eos ea cadeis de caracteres de extosdo objeto separads, com se proprio nome singular (controls) suas catacteristcs, Todos os objetos grfics so Espostos em una hierarquia com objetos pais e objetos fils, como mostra a Figure 91. Quando um objeto fiho &criago ele herda mutes das propsedades de objet gritico de mais to nivel no MATLAB 60 200 (ai) que pode sr vsto como uma tela nia de computador, © objeto riz €criado autornaticamente quando © MATLAB é inicio e st sempre presente, até que o programa sa desligado. AS propriedades assoradas com 0 objeto raz fo a8 iia, que se aplicmh a todas as Janelas MATLAB. No objeto raz podem exis uma ou mas aneas de Figura, apenas ures. Cada Figure (igure) € una janla separate na tela cd computador gue pode most dados grfices, ada Figure tem suas propia propriedades. As propredades a0 Giadas com uma Figure incuem cos mapa decors, amano do papel, orientacfo do papel ip de apotaore asim por dante Cada figure pode conterquatotipos de objets: uimenus, uicontextens uicontrotseaces, Uinenusyuicontextnenusevicontrole so objeto gion especisis para cat CUls sero desrto no proximo cpa, hes (nos $80 eis tonuma iguanas quai dados realmente cispsto, Pode haver mais de com junto de ebos em una ine figura. Cada conjunto de exes pode contertntos 2ines (linha) cadeias de cracteres ext (ext) pathos (padres) © outos objets gfcos quantos necessris para triaro diagrema de inerese Figura 9.1 A hierarquia de objetos graficos de controle aptues cincosaeconrae | 363 9.2 Controles de Objetos Cada objeto grafico tem um nome singular chamado controle. O controle é um inteico ‘ou mtimero real singular usado pelo MATLAB para identificar 0 objeto. Um controle é automaticamente devolvide por qualquer comando que crie um objeto grafico, Por ‘exemplo, 0 comando » Endl = figure; cria uma nova figura ¢ retorna o controle dessa figura na variavel lind. O controle do objeto raiz é sempre 0, ¢ 0 controle de cada figura é normalmente um inteiro positive pequeno, como 1, 2, 3, ..Os controles de todas os outros abjetos gréficos sfo mimeras arbitrérios com virgula flutuante. Hid fungSes MATLAB dispontveis para obter 0s controles de figuras, eixos e outros objetos. Por exemplo, a fungao gc retorna o controle da figura selecionada no momento, resul result, jet (und) BusyAction: ButtonDownFen Children: (1 Clipping color creat DeleteFen: EraseMode! HandleVisibility: Interruptible: Linestyle: (0017 = Figura 9.2 Captio 8 Gites oe cna | 365 ash (@) Diagrama da functo y= Cc usando a espessura de linha nical.) Diagrama d fungio apés modificagao das propriedades Linetwidt le Linestyze. 366. | rrogamagso am nA pr openers Canivind Geico se Coma | 367 NarkerEdgeColor: ‘auto’ MarkerFaceColor: ‘none Markersize: 6 rent: 2.0003, Selected: ‘oft’ lolx SelectionHighlight: ‘on’ 7 Tag: ‘* feo ai type: ‘line’ 5 eT 3] UserData: (1 Visible: ‘on! xData: [1x21 double Yoata: (1x21 double) ai tar Note que a espessura da linha atual é 0.5 pixels, o estilo da linha atual uma linha s6- lida. Pocemas mudar a espessura da linha e o estilo da linha com os comandas » set(lindl, ‘LineWidth’,4, ‘Linestyle’,*-—") L Mudorgas no Ector Oe) came ]_ ep _J mm O diagrama, apés esse comando, ¢ apresentado na Figura 9.2. ce Prpracasos aad ‘As fungSes get e set sao especialmente i ser inseridas diretamente em programas MATLAB para modificar uma figura baseada para programadores porque podem, ‘tatse ém uma entrada do usuério. Como veremos no prcximo capitulo, essas hungoes si 220 mmm oa muito usadas na programagio da GUL FER wen etext viraow He _ Para o usual final entetanto, reqentemente émais fil mudar as propriedades | [oeualtars[a es de um objeto MATLAB interativamente. © Eaitor de ropriedaes € ure frramenta braseada em GUL proetada para ese propdsto.O elitr de propredades iniciado pelo comands propedit (HandleList) propedi versio edita as propriedades da figura selecionada no momento. Por exemplo, as seguintes declaragies criam um diagrama que contém a linha y= x? na faixa entre 0.€2, e abre o Editor de Propriedades para permitir ao usuario mudar interativamente as pr0- | } A prin veri dts hing cia a proprindades dos contol atadoseasoguada | priededes da linha | | Figure (2) f x = 0:0,1:2; y = x92) Bnd = plotix.y); 4 propedit (Hndl} ; (O Editor de Propriedades invocado por essas declaragbes ¢ apresentado na Figura 93, Ele contém uma série de caixas de listagem que variam dependendo do tipo de objeto que esté sendo modificado. No exemplo de objeto linha mostrado aqui, as caixas sio "Data, “Style” e “Info”. A caixa “Data” permite ao usudrie selecionar ou modificar 0s | dados que estio sendo mostrados ~ modifica as propriedades XData, YDatae 2Datea | dda linha. A caixa “Style” controla o estilo da linha e as propriedades dos marcadores, € Figura 9.3 Bditor de Propriedades editando um objeto linha, Mudangas no estilo sio mos “Info estabelece outras informacdes diversas sobre @ objeto linha, tradas na figura a medida que o objeto ¢ editado. 368 | romano em MATLAs® pre Enemies © Editor de Propriedades também pode ser invocado selecionando-se o botio Edit (Wh ) na barra de ferramentas de uma figura e, entdo, clicando duas vezes sobre o objeto que vocé desea editar. > Exemplo 9.1 - Usando Comandos Gréticos de A fungio sinc(x) 6 definida pela equacio sing #0 siner= | x 1) ixo Nivel 1 x=0 Faga um diagrama dessa fungi de x = ajustar 0 diagrama, como a seguir Snax Sn, Use fungées de controle grafico para 1, Faga o fundo da figura em rosa 2. Use linhas de grade apenas no eixo y (sem marcas de grade no eixo x). 3. Faga 0 diagrama da fungdo como uma linha sélida laranja de trés pontos de cespessura. Solugao Para criar esse gréfico, precisamos calcular a fungio sinc x de x =-3n.a x = 3r, ¢ depois fazer o diagrama usando o comando plot. O comando plot retornaré um comando para a primeira linha, que poderemos gravar e usat mais tarde. Depois de fazer o diagrama da linha, devemos modificar a cor do objeto figura, o estado da grade dos objetos eixas e a cor e a espessura do objeto linka. Essas mo ficagdes requerem que tenhamos acesso aos controles dos objetos Eigure, axes Line. O controle do objeto Figure é obtido pela fungio gcf, 0 controle do objeto axes € obtido pela fungio gca eo controle do objeto 1 ine é obtido pela fungao plot que o criow As propriedades gréficas de baixo nivel que devem ser modificadas podem ser encontradas na documentagao do Navegador de Ajuda on-line do MATLAB, no tépico “Handle Graphics Objects’. So as propriedades de ‘Color’ da figura atual, a pro- priedade ‘voria" do objeto axes, eas propriedades ‘LineWidth’ e ‘Color’ da linha, 1. Estabeleca 0 problema Faga 0 diagrama da fungio sine x de x =-3n a x=3n usando uma figura com fundo rosa, linhas de grade apenas para o eixo ye com uma linha laranja de trés pontos de espessura. 2. Defina as entradas e safdas Nao hé entrada para esse programa, ea tniea saida é a figura especificada, 3. Descreva o algoritmo Esse programa pode ser subdividide em trés etapas principais, capita citeos ae case | 369 Modifique as propriedades necessdrias dos cbjetos gréficos A primeira etapa importante 6 calcular sine x dex = -3n ax = 3x. Isso pode ser feito com declaragdes vetorizadas, mas essas declaragdes produzirio um NaN em x= 0, uma vez que a divisio 0/0 ¢ indefirida. Devemos substituir 0 Nav com um 1,0 antes de fazer o diagrama da funcio. O pseudocédigo para essa etapa é calculate sinc(x! ~3*pi:pi/10:3*pi = sin(x) ./ x a y 4 Find the zero value and fix it up. The zero is % located in the middle of the x array. index = fix(length(y)/2) + 2 ylindex) © 1 AA seguir, devemos fazer 0 diagrama da fungio, gravando o controle da linha resultante para modificagBes posteriores. O pscudocédigo detalhado para essa etapa é undl = plot (x.y); Agora, devemos usar os comandos de controle gréfico para modificar 6 fundo da figura, a grade do eixo y ea espessura ea cor da linha. Note que 0 controle da figura pode ser recuperado com a fungS0 gc, €0 controle dos exo, coma fungio gca. A cor rosa pode ser criada com 0 vetor RGB (10.8 0.8), ea cor laranja, com 0 vetor RGB [1 0.5 0}.0 pseudocddigo detalhado para essa etapa € set (gef, ‘Color’, {1 0-8 0.8}) set (gca, ‘¥Grid’, ‘on’) setitindl, ‘Color’, {1 0.5 0), ‘Linewideh’,3) |. Transforme o algoritmo em declarages do MATLAB (O programa MATLAB final é 0 seguinte: Script file: plotsine.« Purpose ‘This program illustrates the use of handle graphics commands by creating a plot of sinc(x) from ~3% 3*pi, and modifying the characteristics of the axes, and line using the “set” function, Record of revisions Date Programmer Description of change 11/23/98 S. J. Chapman original code 310 | Poanagéo em MATAB® para Enemnevos Define variables: Hadi ~ Handle x -- Independent variable ¥ o+ sine (x) Line = -3spi:pi/10:3*pi; sin(x) «J x: Find the zero value and fix it up. The zero is located in the middle of the x array. index - fix(length(y}/2) + 1 ylindex) = 1; 8 Pl function Hndl = plot (x,y): 3 Now modify the Cigu create a pink background, % modify the axis to turn on y-axis grid lines, and % modify the line to be a 3-point wide orange line. set (gcf, Color’, [1 0.8 0.8)}: et (gea, ¥Grid’, fon"); set (Hndl, ‘Color’, {1 0.5 0], 'Linewidth’ 3); 8 e 2 a & Calculate sine (x) y a 2 8. Teste o programa ‘Testar esse programa é muito simples ~ apenas o executamos e examinamos © dliagrama resultante. O diagrama criado ¢ apresentado na Figura 9.4, e tem as, caracteristicas que desejévamos. < 9.4 Usando set para Listar Valores Possiveis de Propriedades ‘A fungio set pode ser usada para fornecer listas de valores possiveis de varidveis. Se ‘a chamada de uma funcio set contiver o nome de uma propriedade, mas nao um valor correspondente, cet retorna uma lista de todas as escolhas legais para essa pro- priedade. Por exemplo, o comando set (Hindi, 'Linestyle' } retornard uma lista de todos os estilos de linha legais com a escolha inicial entrechaves. t (Hndl, ‘Linestyle”) Ces pI=. | none 1 ssa fungdo mostra que 0s estilos de linha legais sio'~", '-=", 1:1, ‘=. @ ‘ne hum", coma primeira escolha sendo o inicial Se a propriedade ndo tiver um conjunto fixado de valores, o MATLAB diz 0 seguinte: » set (Hindl, ‘Linewiath’) A line's “LineWidth* property does not have a fixed set of property values Captaed Gates de Contato | 371 Figura 9.4 Diagrama de sine x versus x, Uma verso coloida desse diagrama aparece no encarte. A fungdo set (Hind) retomard todas as escolhas possiveis para todas as pro- priedades de um objeto. » wet (inal) color BraseMode: [ {normal} | background | xor | none } Linestyle: [ (-} be l=. tnone | Linewidth Marker: [+101 * Ix 1 square | diamond |v 1 * |< | pentagram | hexagram | {none} } Markersize kerBdgeColor: MarkerFaceColor: xData yoata abate {none} fauto) } But tondownFen Children Clipping: [ {ond 1 off 1 Createren Deleteren BusyAction: [ {queue} | cancel | HandleVisibility: [ (on) | callback | off 1 A 372 Provan em MATAg® gra Egeoeiros Interruptible: ( {on} | off | Parent Selected: [ on | off J Selectionllighlight: [ {on) | off } Tag UserData Visible: [ (on) | off } 9.5 Dados Definidos pelo Usuério Além das propriedades-padrao definidas para um objeto GUI, um programador pode definir propriedades especiais para conter dados especificos do programa. Essas pro- priedades extras so uma maneira conveniente de armazenar qualquer tipo de dados que o programador desejar associar ao objeto GUL. Qualquer quantidade de qualquer tipo de dados pode ser armazenada e usada para qualquer propésito, Dados definidos pelo usudrio so armazenades de maneira similar & das pro- priedades-padrio. Cada item de dados tem um nome e um valor. Valores de dados sio armazenados em um objeto com a funcio setappdata, e recuperados do objeto usando a fungio getappdata, A forma geral de setappdata € setappdata (Hndl, ‘DataName’ , DataValue) ; conde Hind 60 controle do abjeto no qual os dados so armazenados, ’DataName’ é0 nome atribuido aos dados e DataValue € 0 valor designado para esse nome, Note que © valor dos dados pode ser tanto um valor numérico como uma cadeia de caracteres. Por exemplo, stuponha que queiramos definir dois valores de dados especiais, um ‘com o niimero de erros que ocorreram em uma figura em particular e 0 outro com uma cadeia de caracteres com a descrigio do ultimo erro detectado. Tais valores de dados poderiam receber os nomes ‘ErrorCount’ e ‘LastError’ Se assumirmos que Hl é © controle da figura, o comando para criar esses itens de dados e inicié-los seria setappdata (HL, ‘PrrorCount’ jppdata (HL, ‘Las! Dados do aplicativo podem ser recuperados a qualquer momento usando a funcio getappdata. As duas formas de qetappdata sio value = getappdata (Hindl, ‘DataName’) struct = getappdata(sndl) ; onde Hnal ¢ 0 controle do objeto que contém os dados e “DataNiame' é o nome dos dados a serem recuperados. Se um ‘DataNate’ for especificado, o valor associado ‘esse nome de dacios sera recuperado. Se nao for especificado, todos os dados definidos pelo usuério associados aquele objeto serao recuperadas em uma estrutura. Os nomes dos itens de dados serio nomes de elementos de estraturas na estrutura recuperada. Gapte 4 carcosae Cente | 373 Tabela 9.1. Fungdes para Manipular Dados Definidos pelo Usuario Fangio __ Deseipio setappéata (ind, ‘Datatlane’,DataValuel Armazena DataValue em um item chamado “Dataviane’, dentto do objeto expecifiade pelo controle Hina Recupera dades defiides pelo usuéio da objeto especficado pelo cotrole find. A primeira forma recupera 0 valor asoiado a "Dacaame apenas € 8 segunda forma recupera todos os dads deénidos pelo usuario {ma funsioIiglea que etoms 1 se ‘OataNane’ for defnido dentro do objeto especiieado pelo cence Remove © item de dados defindes pelo win, chamado "Datstano’, do objeto espaciicad> pelo controle 8 value = getappaata inal, ct = getappdataiindl) isappdata tndl, “oatakane) sappdata inal, “DataNane’) Para o exemplo dado anteriormente, getappdata produziré os seguintes resultados: » value = getappdata (Hl, ‘Errorcount’) value « ° » struct = getappdata (i) ErrorCount: 0 LastBrror 'No error’ ‘As fungées associadas com dados definidos pelo usuio estio resumides na Tabela 9.1 re 9.6 Localizando Objetos Cada novo objeto gréfico criado tem seu préprio controle, e esse controle pela fungao que o criou. Boa Prética de Programagao Se quiser modificar as propriedades de um objeto que voc® criou, grave o controle desse ‘objeto para uso posterior com get e set. Eniretanto, as vezes podemos no ter acesso a0 controle. Suponha que tenhamos perdido 0 controle por alguma razio. Como podemos examinar e modificar 0s objetos grificos? 314 | Poganagio em SUTLAD® pas Enea, (© MATLAB fornece quatro fungdes especiais para ajudar a encontrar os con- troles de objetos. = get ——_Retorna o controle da figura atual = gca _Retorna o controle dos eitos atuais na figura atual, = aco _Retorna o controle do objeto atual. findob3 Localiza um objeto grifico com um valor de propriedade especificado, A fungdo ac retora o controle da figura atual. Se ndo existir nenhuma figura, ac£ rar wna e retomard seu controle. A fungéo gca retora o controle dos eixos atuais na figura atual, Se nenhuma figura existir ou se a figura tual existir, mas ndo contiver nenhum eixo, ‘aca criard um conjunto de exas e retornara Seu controle. A Fungo gco tem a forma HLobj » goo; HLobi = gcot fia): conde Hob} € o controle do abjeto © H_fig € o controle de uma figura. A primeira forma dessa funcio retorna o controle do objeto tual na figura atual. A segunda forma da fungio retorna 6 controle do objeto atual em uma figura especificada (0 objeto atual é definido como o diltimo objeto selecionado com o mouse. Esse objeto pode ser qualquer objeto grifico, exceto a raiz, Nao havers objeto atual em uma figura até que tenha ocorrido um clique do mouse ela. Antes do primeiro clique do mouse, a fungio gco retornaré uma matriz vazia |]. Ao contririo de act e 3c3, sco no cria objetos quando eles nio existem, ‘Uma vez que o controle de um objeto seja conhecido, podemos determinar o tipo do objeto examinando sua propriedade ‘Type’. A propriedade "Type" ser uma cadeia de caracteres, como ‘Figure’, ‘line’, ‘text’, € assim por diante. Hobj = gco: type = get (Hi_obj, ‘type’) ‘A maneira mais fécil de encontrar um objeto MATLAB arbitrario & com a fungio findob3. A forma basica dessa funcio € Endl “propertyNanel” , valuel, Esse comando comeca pelo objeto raiz ¢ procura, em toda a drvore, todos os objetos que tem os valores especificados para as propriedades especificadas, Note que multiplos pares de propriedade/ valor podem ser especificados, € Findobj $6 retornard os con- troles de objetos que coincidirem com todos eles. Por exemplo, suponha que tenhamos criado Figuras 1 ¢ 3. A fungio £indobj (/type', "Eigure' ) retornard os resultados > H£ig = findobj( ‘type’, figure’) Hig ssa forma da fungio findob; é muito itil, mas lenta, uma vez que deve procurar na drvore inteira do objeto para localizar as coincidéncas. Se vac’ precisar usar um objeto muiltiplas vezes, s6 faga uma chamada para findobj e grave o controle para reatilizar. Caples catces ae Comte | 375 Restringir 0 ntimero de objetos que devem ser pesquisados pode aumentar a velo- ‘cidade de execugio dessa fungao. Isso pode ser feito com a seguinte forma da fungi: Hndls = findobs rchHindle, ‘Propertyianel', valuel, Aqui, apenas os controles relacionados na matriz Srchiindls e seus filhos serio ppesquisados para encontrar 0 objeto. Por exemplo, suponha que desejemos localizar todas as linhas tracejadas na Figura 1. O comando para fazer isso seria undls = findobj (1, ‘Type’, ‘Line’, ‘Linestyle’,’-~ Boa Pratica de Programagao . Se possivel, restrinjao alcance de suas pesquisas com £indob§ para tomas mais répidas, 9.7 Selecionando Objetos com o Mouse ‘A fungio gco retoma o controlé do objeto atual, que € 0 tiltimo objeto selecionado com ‘o mouse. Cada objeto tem uma regio de selegio associada a ele, e assume-se que qual- quer clique do mouse nessa regiao de selesao seja um clique sobre esse objeto. Isso é ‘muito importante para objetos estreitos, como linhas ou pontos ~ a regiio de selecio permite a0 usudrio ser um pouco descuidado com o posicionamento do mouse e, ainda assim, selecionar a linha. A espessura e a forma de uma regiao de selecio variam para tipos diferentes de objetos, Por exemplo, a regizo de selegdo para uma linha é de 5 pixels, fem ambos os lados da linha, enquanto a regiao de selegéo para uma superficie, um padrio ou um objeto texto é 6 menor retangulo que pode conter o objet. ‘Axregio de selegdo para um objeto axes é a érea dos eixos mais a érea dos titulos e rétulos. Entretanto, linhas e outros objetos dentro das eixos tém uma prioridade ‘maior, de modo que, para selecionar os eixos, voo® deve clcar em um ponto dos eixos que no fique perto de linhas ou texto. Clicar sobre uma figura fora da regio dos cixos sele cionaré a propria figura. que acontece se um usustio clicar em um ponto que tem dois ou mais objetos, como a insergao de duas linhas? A resposta depende da ordem de empilhamento dos objetos. A ordem de empilhamento & a ordem em que 0 MATLAB seleciona objetos. Essa ordem € especificada pela ordem dos controles relacionados na propriedade ‘Children’ de uma figura. Se um clique ocorrer na regio de selecio de dois ou mais, objetos, aquele com a posicio mais alta na lista ‘Children’ sera selecionado. (O MATLAB inclui uma fungio chamada wait forbut tonpress, as vezes usada ‘quando objetos graficos sio selecionados. A forma dessa fungio é k = waitforbuttonpress Quando executada, essa fungio para o programa até que qualquer tecla seja press: nada ou um botZo do mouse seja clicado, A fungao retorna 0 se detectar ur clique em uum botio de mouse, ¢ 1 se detectar uma tecla pressionada, 316 | Proyamagso em MATLAB pra genes A fungio pode ser usada para fazer uma pausa em um programa até que ocorra um clique no mouse. Apés a ocorréncia do clique, o programa pode recuperar 0 con- tole do objeto selecionado usando a fungo go. > Exemplo 9.2 ~ Selecionando Objetos Graficos (© programa apresentado neste exemplo explora as propzicdades de objetos grificos e inci- entalmente mostra como selecionar abjetos usando wait forbuttonpress e gco, O pro- ‘grama permite que objetos sejam selecionados repetidamente até uma tecla ser pressionada, Script file: select_object.m Purpose: ‘This program illustrates the use of waitforbuttonpress and gco to select graphics objects. It creates a plot of sin(x) and cos(x), and then allows a user to select any object and examine its properties. The program terminates when a key press occurs. Record of revisions Date Programmer Description original code 8. J. Chapman 11/23/98 Define variables: details ~ details Bi - of sine line #2 Handle of cosine line Handle Handle of current o>ject k =+ Result of waitforbutonprese type Object type x Independent variable yl sintxl y2 cos (x) yn ~ Yes/No 8 Calculate sin(x) and cos(x) x = -3*pirpi/10:3*pi; yl = sintx) y2 = cos tx); % Plot the functions HL = plot(x yi): set (HL, ‘LineWidth’ 2); hold on; H2 = plot(x,y2); set (H2, ‘Line#ideh’ ,2, ‘Linestyle’,’: title(*\beplot of Sin Vil tytcolor’, *r") \rm\bE and cos \itx"}; Capnioa Gates de conto | 377 xlabel (*\bEVitx"); ylabel(’\bfsin \it: legend(‘sine’, hold off; & Now set up a loop and wait for a mouse K = waitforbuttonpre while k \rm\bE and cos \itx"); sosine’); ick. % Get the handle of the object Handle = gcor % Get the type of this object type = get (Handle, Type’); % Display object type disp ({‘Object type = * type *./)): 8 Do we display the details? yn = input (‘Do you want to display details? (y/n) *.'8'); if yn == ty details = get (Handle); disp(details) ; end 8 Check for another mouse click k » waitforbuttonpress; end Quando executado, o programa produz o diagrama apresentado na Figura 95. Se ioewaaasinpo Daya a ce coe x Figura 95 Diagrama de sin ve cos x 318 | Proranagi em MATLAB? pe Egeaeios Experimente clicar sobre varios objetos do diagrama e veja as caracteristicas resultantes. < 9.8 Posigdo e Unidades ‘Muitos objetos MATLAB tém uma propriedade “pos: tion’, que especifica 0 tamanho ea posigao do objeto na tela do computador. Essa propriedade difere ligeiramente para diferentes tipos de objetos, como descrito na secao sezuinte. 9.8.1 Posigdes de Objetos figure A propriedade ‘position’ de uma figura especifica a lcalizacio dessa figura na tela do computador, usando um vetor linha de quatro elementos. Os valores desse vetor sio [Lett bottom wideh height j,onde left éa extremidademais & esquerda da figura, bot tom a extremidade inferior, width é a largura e height é a altura. Esses valores de posigio, estio na unidade especifcada na propriedade ‘Units’ para o objeto. Por exemplo, posigdo e as unidades associadas com a figura atual podem ser encontradas desta maneira: » get(gcf, ‘Position’ ) 176.204 «672504 » getigef, ‘Units’) pixels Essa informagao especifica que o canto inferior esquerdo da Janela da Figura atual est 176 pixels para a direita e 204 pixels acima do canto inferior esquerdo da tela, e a figura tem 672 pixels de largura e 504 pixels de altura, Note que essa é a regiio de desenho da figura, excluindo molduras, barras de rolagem, menus e a drea de titulo da figura. ‘A propriedade “units” inicial é pixels, mas pode ser polegadas, centimetros, pontos ou coordenadas normalizadas. Pixels sao pixels de tela, que sdo as menores for: ‘mas retangulares que podem ser desenhadas em uma tela de computador. Telas de computadores tipicas tém, no minimo, 640 pixels de largura x 480 pixels de altura, € podem ter mais de 1.000 pixels em cada direcio, Como 0 muimero de pixels varia entre as telas de computador, 0 tamanho de um objeto especificado em pixels também varia. CCoordenadas normalizadas sio coordenadas na faixa entre 0 € 1, onde o canto infe- or esquerdo da tela (0,0) ¢ o canto superior direito da tela € (1,1).Se a posicav de um objeto for especificada em coordenadas normalizadas, ela apareceré na mesma posi¢a0 relativa na tela, independentemente da resolugdo da tela. Por exemplo, as seguintes declaragdes criam uma figura e a colocam no quadrante superior esquerdo da tela de ‘qualquer computador, independentemente do tamanho da tela H = figure(1) set (E, ‘units’, ‘normalized’, ‘position’, (0 .5 .5 .45]) 2 altura normalizada dessa figura éreduzida a 045 para dear espago para © titulo da Figura a barra «do menu, ambos cima da dea de desenho. ans ciicarde conse | 379 Boa Pratica de Programagao Se vocé deseja colocar uma janela em uma localizagio especifica, é mais fécil colocar a janela na localizagio desejada usando coordenadas normalizadas. O resultado seré 0 ‘mesmo, independentemente da resolusio da tela do computador. 9. 2 Posigdes de Objetos axes € uicontrol A posiglo de objetos axes e uicontrol também é especificada por um vetor de quatro elementos, mas a posicio do objeto & especificada em relagio ao canto inferior esquerdo da figura que contém 0 objeto, e nko ao canto inferior esquerdo da tela. Em geral, a pro priedade ' Position’ de qualquer objeto filho é relativa & posigio de seu pai No padrio inicial, as posigdes das objetos eixos sio especificadas em unidades normalizadas em uma figura, com (0,0) representando o canto inferior esquerdo da figura e (1,1) representando o canto superior direito 9.8.3 Posigdes de Objetos text. Ao contratio de outros objetos, 0s objetos cext. tém uma propriedade de posisio que contém apenas dois ou trés elementos. Esses elementos correspondem aos valores x, y 2 do objeto texto dentro de um objeto axes. Note que esses valores estio nas unidades ‘mostradas nos préprios eixos, ‘A posigdo do objeto texto, com respeito ao ponto especificado, é controlada pelas propriedades Hori zontalAlignwent (alinhamento horizontal) Vert icalAl ignimet {alinhamento vertical) do objeto. O Horizontalalignment pode ser (Lett 1%, @ © VerticalAlignmen pode ser Top, Cap, {Middle}, Baseline ou Bo! (O tamanho de objetos text ¢ determinado pelo tamanho da fonte e o mtimero de caracteres que esto sendo mostrados, por isso que nao hi valores de altura e largura associados a eles, > Exemplo 9.3 - Posicionando Objetos em uma Figura ‘Como mencionado anteriormente, posigées de eixos sio definidas em relagio ao canto inferior esquerdo da moldura em que esto contidas, e posigées de objetos texto so ddefinidas em eixos nas unidades dos dados mostradas nos eixos, Para ilustrar 0 posicionamento de objetos gréficos em uma figura, escreveremos um programa que criaré dois conjuntos sobrepostos de eixos em uma tinica figura O primeiro conjunto de eixos mostrard sin x aersus x e tera um texto de comentario anexo a linha apresentada. O segundo conjunto de eixos mostraré cos x versus x e tera um texto de comentario no eanto inferior esquerdo, Sa ee 380. | Proamgio am MATLAB ara Epes (Um programa para criar a figura € apresentado a seguir. Note que estamos usando a fungdo figure para criar uma figura vazia e, depois, duas fungbes axes para criar ‘5 dois conjuntos de eixos na figura. A posigdo das fungoes axes 6 especificada em unidades normalizadas na figura, de modo que o primeiro conjunto de eixos, que comeca em (0,05,0,05), fica no canto inferior esquerdo da figura, e 0 segundo conjunto de eixos, que comega em (0,45,0,45), fica no canto superior direito, Cada conjunto de cixos tem a fungdo correspondente representada sobre ele. (O primeiro objeto text 6 anexado ao primeiro conjunto de eixos na posigdo (-n, 0), que é um ponto da curva. A propriedade ‘HlorizontalAlignment’, ‘right’ ésele- cionada, por isso 0 ponto de ligagao (-n, 0) fica do lado direto da cadeia de caracteres de texto, Como resultado, o texto aparece a esquerda do ponto de ligagao na figura final, (isso pode ser confuso para programadores novos!) O segundo objeto text € anexado ao segundo conjunto de eixos na posigio (-7,5, 19), que esta préxima a0 canto inferior esquerdo doseixos. Essa cadeia de caracteres usa o alinhamento horizontal-padrao, ' Left", de modo que o ponto de ligagdo (~7.5, -0.9) fica no lado esquerdo da cadeia de caracteres do texto. Como resultado, o texto aparece & direita do ponto de ligagdo na figura final. Script file: position_ob: Purpose: ‘This program illustrates the objects. Tt creates a figure, overlapping sets of axes of axes is placed in the left corner of figure, and contains a plot of sin(x). The second set of axes is placed in the upper right corner of the figure, and contains a plot of cos(x). Then two text strings are added to the axes, illustrating the positioning of text within axes positioning of graphics and then places wo on the figure. The first set the lower Record of revisions Programmer Date Description of change 02/26/98 Original code Define variables: HL ~ Handle of sine line #2 - of cosine line Bal - of first ax: 102 -- Handle of second axes x Independent variable yi sin(x) sy n> cos(x) % Calculate sin(x) and cos (x) 2*pi:pi/10:2*pi; yi = sin(x); y2 = costx): 8 create a new figu: gure; % Create the first set of axes and plot sin(x) % Note that the position of the axes is expresse % in normalized units. Hal = axes(’Position’,[.05 .05 M1 = plot(x.y1): set (HL, ‘LineWidth’ 2); title(‘\bEPlot of ain \itx’); xlabel (’\bE\itx’ } ylabel(*\bfsin \itse'): axis((-8 8-1 1)); 5.51) & Create the second set of axes and plot cos(x) % Note that the position of the axes is e: & in normalized : axes(‘Position’,[.45 .45 .5 .51)7 Haz = H2 = plot(x,yi) set (H2, ‘LineWidth’,2, ‘Color’, 'r', "Linestyle’, *-~ title("\bEPlot of cos \itx’); xlabel (*\bE\itx"}; ylabel(*\pfsin \itx'); axis({-8 8-2 1)); & create a text % set of string attached to the line on t axes (Hal); text (pi, 0.0, ‘sin(x) \rightarrow’, ‘HorizontalAlignmen ‘ry! & Create a text string in the lower left corer & of the second axes (Ha2); text (-7.5,-0.9, Pest string 2/); set of axes. Quando executado, esse programa produz o diagrama aprese 0. Voct deve executar novamente o programa em seu computador, n ou a localizagio dos objetos que esto sendo exibidos e abservand ys 2) Coptaie9 Gareor oe Conte | 383 Tabela 9.2 Propriedades de Figuras Relacionadas com Impress Diagrama de sin x 9.5 Figura 9.6 A saida do programa position object. 9.9 Posigdes de Impressao As propriedades ‘Position’ e 'u: especificam a localizagio de uma figura na tela do computador. Hé também cinco outras propriedades que especificam a localizagao lades estao de uma figura em uma folha de papel quando & inpressa, Essas prop resumidas na Tabela 9.2 Ong Deserigao Papert Unidades para medidas do papel [Gnches) I centineters | normalized | points | Papororientation ( (portrait) | landscape | Papertosition Um vetor de posigio da forma (lett, bottom, width, nelght) mo qual todas as unidades so as mesmasespeciicadas em Paper unit Papersize Um vetor de dois elementos com otamanho do papel porexemple, [8.5 21) Paportype Estabelece 0 tipo de papel. Note que esabelecer essa proptiedade automatice- mente atusliza'apropriedade Paper Size (usleteer} I uslegel 1a} | adlecter «a5 1 ba 1 tabloid j Por exemplo, para determinar que um diagrama seja impresso no modo paisagem (landscape), em papel Ad e em unidades normalizadas, devemos estabelecer as seguintes propriedades: \d1, 'PaperType",, ‘adletter') set (Hindl, ‘PaperOriehtation’, ‘landscape’ } set (Hndl, "PaperUnits", ‘normalized’ ); 9.10 Propriedades Defaults e de Fabrica OMATLAB designa propriedades iniciais para cada objeto quando ele é criado, Se essas propriedacles nao forem as que voe® deseja, voot deve usar set para selecionar os valores desejados, Se quiser mudar uma propriedade de todos os objetos que vocé cri, esse processo pode se tomar muito tedioso, Para esses casos, o MATLAB permite que voc ‘modifique a propria propriedade inicial, para que todos os abjetos herdem o valor cor- reto da propriedade quando criados, ‘Quando um objeto grifico ¢ criado, o MATLAB procura um valor inicial para cada propriedade, examinando 0 pai do objeto. Se © pai estabelecer um valor inical, esse valor seri usado, Se ndo, 0 MATLAB examina o pai do pai para ver se 0 objeto esta- belece um valor inicial, e assim por diante, até o objeto raiz. O MATLAB usa o primeiro valor inicial que encontrar, indo para tras na drvore. Propriedades iniciais podem ser estabelecidas em qualquer ponto da hierarquia de objeto grafico superior a0 nivel no qual o objeto é criado. Por exemplo, uma cor inicial de figure estaria estabelecida no objeto root, e entio todas as figuras criadas apés esse momento teriam a nova cor inicial. Por outro lado, uma cor inicial de axes poderia set estabelecida no objeto root ou no objeto figure, Se a cor inicial de axes for esta- belecida no objeto root, serd aplicada a todos os novos eixos em todas as figuras. Se a cor inicial de axes for estabelecida no objeto Figure, seré aplicada apenas a todos os novos eixos da figura atual. ‘Valores iniciais so estabelecidos usando-se uma cadeia de caracteres que consis- tem em ‘Default’ seguido pelo tipo de objeto e o nome da propriedade. Assim, a cor 384 | Poganscio em AUTAB® para Exontos inicial da figura seria estabelecida com a propriedade ‘DefaultFigureColor', ea cor inicial dos eixos seria estabelecida com a propriedade ‘ Defaul tAxesColor’.Sio alguns exemplos de estabelecimento de valores iniciais: set (0,’DefaultFigurecolor’,*y’) Fundo da figura amarelo ~ todas as novas figuras, set (0, "DefaultaxesColor’,‘r’} —Fundo dos eixos vermelho - todos os novos eixos em todas as figuras. set (9cf, 'DefaultAxesColor’,‘r‘) Fundo dos eixos vermelho ~ todos os ceixos, 6 na figura atual ultLineStyle’,‘:') Estabelece o estilo de linha inicial para tracejado, 86 nos eixos atuas set (gca, ‘De! ‘Se voce estiver trabalhando com as propriedades de objetos existentes, é sempre ‘uma boa idéia restaurs+-los & sua condi¢io inicial depois que forem usados. Se voeé mudar as propriedades iniciais de um objeto em uma fungdo, grave os valores originais e restaure-os tates de sar da fungao, Por exemplo, suponha que desejemos criar uma série de figuras fem unidades normalizadas. Poderiamos gravar e restaurar as unidades originais da seguinte forma: saveunits = get (0, ‘DefaultPigurevnits’); set (0, ‘DefaultPigureUnits’, ‘normal ized’) GUATLAB statenente> Set (0, ‘DefaultFiguretnits’, saveunits) + Caso deseje personalizar MATLAB para usar diferentes valores iniciais todo 0 tempo, sera preciso estabelecer os padres iniciais no objeto root toda vez que abrir 0 MATLAB. A maneita mais fécil de fazer isso € colocar os valores iniciais no arquivo startup m, que é automaticamente executado toda vez que 0 MATLAB for iniciado, Por exemplo, suponha que voce sempre use papel Ad e sempre deseje uma grade em seus diagramas. Vocé poderia colocar as seguintes liahas em startup. set (0, ‘DefaultFigurePapertype’, ‘adietter’); set (0, ‘DefaultaxesxGrid’, 'on") eet (0, ‘DefaultaxesyGrid’, ‘on') set (0, ‘DefaultAxes2Grid’, ‘on"}; Hi trés valores de cadeias de caracteres especiais que séo usados com controles gréficos: ‘remove’, ‘Eactory’ e ‘default’. Se vor’ tiver um conjunto de valores iniciais para uma propriedade, o valor * rer removerd o inicial estabelecido. Por ‘exemplo, suponha que vocé tenha estabeleciclo a cor inicial de figura como amarelo. set (0, ‘DefaultPigurecolor’, "y") A seguinte chamada de fungio cancelara esse padréo inicial e restauraré o padrao ini ial anterior: set (0, ‘DefaultFigurecolor', ‘remove’ ); faoiaied Gaicosd ertmie | 385 Acadeia de caracteres ‘ factory” permite a0 usustio sobrepor tem -orariamente ‘um valor inicial e usar o valor inicial do MATLAB em seu lugar. Por exer o, a seguinte figura € criada com a cor original de fabrica, apesar da cor inicial amarebs ter sido defi nida previamente: set (0, ‘DefaultFigureColor’, Eigure( ‘Color’, ‘factory’) "ys A cadeia de caracteres ‘default’ forca 0 MATLAB a pesquisar a hierarquia do objeto até encontrar um valor inicial (defeult) para a propriedade dewjada. Usa 0 primeiro valor inicial que encontrar. Se nao encontrar tum valor inicial, va o valor ini cial de fabrica para tal propriedade. Esse uso ¢ ilustrado a seguir: @ Set default values set (0, ‘DefaultLineColor’,*k’); % root default = black set (gcf, ‘DefaultLinecolor’,‘g’); ¥ figure default = «jreen 8 Create @ line on the current axes, This line is gren Hndl = plot (randn(1,10)); set (Hndl, ‘Color’, ‘default’); suse (2) 5 % Now clear the figurés default and set th Line color to the 2 default, The line is now black. set (gcf, ‘DefaultLineColer’, ‘remove’ ) ; set (Hindi, ‘Color’, ‘default’ 9.11 Propriedades de Objetos Graficos Hi centenas de diferentes propriedades de objets gros, um nimero exagerado para discutirem detathes aqui melhor lugar para encontrar uma lista omc de pee, Priedades de objets gros €9 Navegedot de Auda, dirbuido com « MATLAB Vamos menciona algumas das propricdades mais importantes par cada lipo de jet grin, & medida que prcsarmos dele, Un conunte complete ce oprielades apresentad na documentagio do Navegador de Ajuda do MATLAB. deseo de cada ip de obo. 9.12_Resumo Cada elemento de um diagrama MATLAB € um objeto grafico, Cada obvto é identifi: cado por um controle singular e tem muitas propriedades associadas a el- que afetam ‘© modo como esse objeto é apresentado, Objetos MATLAB sio dispostos em uma hierarquia com objetos pais © objetos filhos. Quando um objeto filho é criado, herda muitas propriedades de s us pais _ 386. | Prgranepic em MATLAD? pos Eneateas © objeto grifico de mais alto nivel no MATLAB éo root, que pode ser visto como toda a tela do computador. Sob a raiz, pode haver una ou mais Janelas de Figuras. Cada igure é uma jancla separada na tela do computador, que pode mostrar dados gré- ficos, ecada figura tem suas préprias propiedades Cada figure pode conter quatro tipas de objetos: wimenus, wicontextmenus, uicontroise axes. Uimenus, uiconte,para Figura 10.6 A Srea de desenho depois de modiicadas as propriedades do botio e do campo de texto. Name da figura. A cadeia de caracteres na propriedade ane sera exibida na barra de titulo da GUI resultante quando ela for executada, Passo 4. Vamos agora gravar a drea de desenho com 0 nome MyFizetcUT. Sele- cione o item do menu “File/Save As", digite o nome 4y#irstGUT como nome do arquivo ¢ acione “Save”. Essa agio austomaticamente eria dois arquivos: MyFix fige My irstGUZ im. O arquivo de figura contém a GUI criada, © arquivo M contém 0 cédigo que carrega o arquivo de figura e cria a GUI, mais um esqueleto de fungao de chamada de retorno para cada componente ativo da GUL [Nese ponte, temos uma GUI completa, mas que ainda no faz 0 que ela foi pro- jetada para fazer. Fssa GUI pode ser ativada digitando MyFirstcUr na Janela de Comandos, conforme mostra a Figura 10.7. Ao acionar o botio nessa GUI, a seguinte ‘mensagem aparece na Janela de Comandos: MouPrineiroBotio Callback not implenented yet Uma parte doarquive M criado automaticamente pelo guide é exibida na Figura 108. Esse arquivo contém a fungio MyPirstGut e subfungies-padrio que implementam as chamadas de retorno para éada componente ativo da GUL Se a fungdo My? irstGUT for ativada sem argumentos, ela exibira a GU) contida no arquivo Wy! 301, fig. Se Catal 0 merce Gt vases | 397 a fungi0 MyFirstGUT for ativada com argumentos, ela assumiré que o primeiro argumento é o nome de uma subfungio, a qual € ativada utilizando feva, passando os ‘outros argumentos para aquela funcio. Cada fungéo de chamada de retorno cuida de eventos de um tinico componente da GUL Se ocorrer no componente da GUI uma ativagio pelo mouse (ou entraca de dados pelo teclado para Campos de Edigdo}, a fungio de chamada de retorno do on ponente seré automaticamente ativada pelo MATLAB. O nome da fungao de chamada de retorno seré 0 valor da propriedade tag do componente da GUI mais os caracteres “callback”. Assim, a fungéo de chamada de retomo para MeuPrimelroBotao receberd o nome de Meupr imeiroBotao_Cal back. Arquivos M criados pelo guide contém chamadas de retorno para cada compo: nente ativo da GUL, mas essas chamadas de retorno simplesmente exibem uma men sagem dizendo que a fungio de chamada de retorno ainda nao foi implementada, Passo 5. Agora, precisamos implementar a subfuncio de chamada de retorno para © botio. Esse fungio inclui uma variivel persistent, que pode ser utilizada para contar a quantidade de acionamentos ocorridos. Quando ocorte um acionamento do otto, © MATLAB ativa a fungdo MyFirstGUI com MeuPrimeirobotéc_callback como primeiro argumento. A funcio yFiretGUE aciona entdo a subfungdo MeuPrimeiroBotao_Cal back, como mostra a Figura 10.9. Essa fungio deve aumentar 398 | Programagdo.em MATLAB para Enpentos ne Se ow Tet Onn mapa ne Hee OF usli2en-lan | ao cor oem t€ wargin = 6 + ae ca pee acu que slvedo om argumestr. anal ttrtietaes ‘Quando stad com um es Figura 10.8 © arquivo M para MyFirstGv:, criado automaticamente por guide, em uma unidade a quantidade de acionamentos, criar uma nova cadeia de caracteres de texto que contenha a quantidade e armazenar a nova cadeia de caracteres na pt0- priedade string do campo de texto NeuPrimeiro%exto. Uma fungdo que executa ‘esses passos é mastrada abaixo: MeuPrime sBotdo_callback(h, eventdata, handle: varargin) & Declara e inicia var persistent count y (count) fel que armazena a quantidade aptulo 0 vertaes Gancas 6 Uusrias | 399 % Atualiza quantidade count = count + 1; 2 Cria novo texte str = sprinté(’Total de Ativagées: $d’, count); % Atualiza texto ft (hand MeuPrimeirotexto, ‘String’, str]? Evento orga sags do mouse 0 ato oto ata ny reste como Sgumenio teuPcinsicobe Funoto stusiza a cosie de concioes Po omieurcinetvorente al deatagtes:1 Figura 10.9 Manipulagio de eventos no programa MyPirstGUT. Quando wm usuatio aciena botio como mouse, a fungio MyFirs¢cu é ativada automaticamente com 0 argu- mento Meu?rimeiroBotke Callback. A fungio MvFirstCUT, por sua vez ativaa fungi MeuPrimeiroBatao_Cal Iback, Essa fungSo incrementa a vaiavel {count e grava.o novo valor no campo de texto da GUL 400 | Propanacdo em MATAR” px Emeaeires OEE: 101 «| staat 3 te aqu_| Figura 10.10 Programa resutante depois de trésativagées Note que essa funcio declara uma varidvel persistente count @ a inicia com 0 valor zero, Cada vez que é ativada, a fungio inerementa count em 1 e era uma nova cadeia de caracteres que contém a contagem. Entio, a funcio atualiza a eadeia de ca- racteres exibida no campo de texto MeuPrimeiroTexto. (O programa resultante é executado pela digitacio de MyFirstGUT na Jancla de Comandos. Quando o ususrio aciona o bot@o, o MATLAB automaticamente ativa a fungio MyPirstGUI com o primeiro argumento como MeuFrimeiroBotao_Callback, ea funcio MyFirstGUE ativa a subfungdo NeuPrimeirsBotao_Callback. Essa fungio incrementa a variével count em um e atualiza o valor exibido no campo de texto. A GUL resultante, depois de tés ativacdes do botdo, € mostrada na Figura 10.10. Boa Prética de Programagao Utilize guide para desenhar uma nova GUI e utilize o Inspetor de Propriedades para ajustar as propriedades iniciais de cada componente, como 0 texto exibido no compo: rente, a cor do componente ¢ 0 nome da funcio ée chamada de retorne, quando requerido. Boa Prética de Programagao Depois de criar uma GUI com o guide, edite manualmente a fungio resultante para adicionar comentarios que descrevam 0 propésito e os componentes da GUI, ¢ também para implementar a funcio das chamadas de retorno. 10.2.1 Espiando Por Tras dos Panos Na Figura 10.8, temos o arquivo M gerado automaticamente por guide para MyFiretGUr ‘Vamos agora examinar esse arquivo M mais de perto para entender como ele funciona. Captato 10 erices avers Uesos | ADT Primeiro, vamos analisar a declaragio de function. Essa fungio utiliza varagin para representar seus argumentos de entrada e varargout para representar seus argue mentos de saida, Conforme visto no Capitulo 7, a fungio vazargin pode representar um niimero arbitrario de argumentos de entrada, e a fungio varargout pode repre- sentar um nuimero variavel de argumentos de saida, Portanto, um usuario pode atzur a fungio MyPirsGUL com un miimero qualquer de argumentos. ‘Ativando sem Argumentos 0 Arquivo M Seo usuario ativar MyFirstGUr sem argumentos, o valor retornado por nargir seré zero. Nesse caso, 0 programa carregaré a GUI do arquivo de figuras MyF irs! utilizando a fungio open fig. A forma dessa fungi é fig = openfigimfilenane, ‘reuse’); onde m£ilename é 0 nome do arquivo de figuras. O segundo argumento na fungio specifica se pode haver somente uma cépia por vez da figura sendo executada, ou se rmultiplas edpias podem ser executadas. Se 0 argumento for “reuse’, somente uma pia da figura poderd ser executada. Se openfig for ativada com a opcio ‘reuse’ & 2 figura especificada jé existir, a figura preexistente serd trazida a frente da tela e reuti- lizada. Em contraste, se o argumento for ‘nex, muiltiplas cépias da figura poderio ser ativadas. Se opent ig for ativada com a opgao “new’, uma nova cspia da figura ser criada a cada vez. O padrao & a criagio de uma GUI utilizando guide com a opgio ‘reuse’, assim, somente uma cépia da figura pode existir por vez. Se voce quiser muiltiplas edpias da GUI, precisaré editar manualmente essa chamada de funsao, Depois de carregar a figura, a funcio executaré a declaragiov set (fig, ‘Color’, get (0, ‘defaultUicontrolBackgroundColor’)); Essa fungdo ajusta a cor do fundo da figura para casar com a cor de fundo basica utilizada pelo computador no qual 0 MATLAB esta sendo utilizado, Bla faz a cor da GUI casar com a cor das janclas nativas no computador Assim, uma GUI pode ser escrita fem um PC que utiliza Windows e utilizada em um computador que utiliza UNIX, € vice-versa, Ela terd uma aparéncia natural nos dois ambientes. As proximas duas declaracées criam uma estrutura que contém as chamadas para todos os objetos na figura corrente e armazenam essa estrutura como dados de apli- casio na figura, handles » guihandles (fi guidata(fig, handles) de A fungao guihandles cria uma estrutura que contém chamadas para todos os objetos na figura especificada. Os nomes de elementos na estrutura correspondem As propriedades de Tag de cada componente da GUI, eos valores sio as chamadas de cada componente. Por exemplo, a estrutura de chamada retornada em MyPirstGUE.né >» handles = guihandles(fig); handles - veel: 99.0005 402 | Progremgto em MATLAB? para Engentwiras vyFirstText. MyPirstButton 3.0021 100.0007 Existem trés componentes de GUI nessa figura~ a propria figura, um campo de texto e um botdo. A fungio guidata grava a estrutura das chamadas como dados de aplicagio na figura, utlizando a fungio setappdata estudada no Capitulo 9. (© ajuste Final dessas declaragées retorna a chamada de figura ao ativador se um argumento de saida fo: exspecficado na chamada a MyPirstGUL. if nargout > 0 varargout{1} = fig: end Ativando com Argumentos o Arquivo M Se 0 usuario ativar My?iretGUT com argumentos, 0 valor retornado por nargin seré maior que zero. Nesse caso, 0 programa trataré o primeiro argumento de chamada como nome da fungio de chamada de retomo e executaré a fungio utilizando feval Essa fangdo executard a fngao cujo nome constari em varargin(1} e passara os outros argumentos (vazargin(2}, varargin(3} et) paraa fungao, Esse mecanismo permite que as fungdes de chamada de retorno sejam subfungBes que no podem ser chamadas acidentalmente de outra parte do programa 10.2.2 AEstrutura de uma Subfungao de Retorno ‘Toda subfungio de retomo tem 0 formato-padro function varargout = Component'Tag_Callbackih, eventdata, handles, varargin) onde Componenttag é 0 nome do componente que gera a chamada de retorno (a cadeia de caracteres na propriedade 7g). Os argumentos dessa subfungao sie: = n-A chamada da figura pai # eventdata Uma matriz correntemente nio-utilizada (no MATLAB Versio 6). # handles ~ A estrutura rentes de GUI na figura, * varargin ~ Um argumento suplementar que passa todos os argumentos de ativagao adicionais para a fungao de chamada de retorno. Um programador ppodle utilizar esse recurso para informagdes adicionais, quando necessario, para a fungao de chamada de retorno. andes com todas as chamadas de todos os compo- Note que cada fungio de chamada de retorne tem acesso completo & estrutura handles, assim, cada fungao de chamada de retorno pode modificar qualquer compo: rente de GUI na figura, Fizemos uso dessa estrutura na fungao de chamada de retorno para o botio em MyPirstGUT, onde a fungao de chamada de retoro para 0 botao modi- Ficou 0 texto exibido no campo de texto. © the text field set (handles.myPirstText, ‘String’ Capitulo 10 Intertaces Graces ae Usudvios | 403 10.2.3 Adicionando Dados de Aplicagao a uma Figura E possivel armazenar informagées especfcas de aplicagSes para um programa de GUI na estrutura handles, em ver de wilizar meméria global ou persistente pare esses dados, O projeto de GUI resutante é mais robusto, pois otteos programas MATLAB rio podem acidentalmente modificar 0s dados globais de GUI e miltiplas cépias da ‘mesma GUI no podem interfer umas nas outras Para adicionar dados locais na estrutura handles, é preciso modifcar manual mente 0 arquivo M criado com guide. Um programador adiiona os dados de ap «casio a estrutura handles depois da chamada para gwinardls e antes da chemada para guidate. Por exemplo, para adicionar omtimero de ativasBes do mouse cou éstrutura handies, precisariamos modifica o programa da seguinte maneia: %Gera uma estrutura de chamadas para passar para as chanadas de xetorno handles = guihandles (fig); %Adiciona count & eatrutura. handles.count = 0 SArmazena a estr guidata (fig, handles) ; Esses dados de aplicagao serio agora passados com a estrutura handles para cada fungao de chamada de retorno, onde poderio ser utilizados. Uma versio da chamada de retorno do batio que utiliza 0 valor do contador na estrutura de dados de handles ¢ mostrada a seguir. Note que precisamos gravar @ estrutura handles com uma chamada a guidata se qualquer das informagées nela for modificada. function varargout MyFirstButtoy Callback(h, eventdat handles, varargin) %atualiza count handles.count = handles.count + 1) %orava a estrutura atualizada guidata(h, handle: ‘cria nova cadeia de caracteres str = sprintf (‘Total Clicks: 4d’, handles.count); ‘Atualiza campos de texto set (handles.MyFirstText, ‘string’, str); Boa Pratica de Programagao ‘Armazene os dados da aplicagdo da GUI na estrutura handles, assim eles ficarSoauto- ‘maticamente disponiveis para qualquer fungio de chamada de retorno. 404 | ropamopio en mre? para Enenteos Boa Pratica de Programagao - Se vocé modificar dados de aplicagio da GUI na estrutura handles, grave a estrutura ‘com uma chamada a guidata antes de sair da fungdoonde ocorreram as modificag® 10.2.4 Algumas Fungées Ut ‘Tris fungdes especiais sio utilizadas ocasionalmente no projeto de fungées de chamada de retomo: gebo, gcbf e f indob. Embora essas fungdes sejam menos necessérias nas GUls do MATLAB 6 do que nas versdes anteriores, elas ainda sio bastante titeis, e um progtamador deve certamente encontré-las. ‘A fungio gcbo (get callback object ~ captura objeto de chamada de retorno) retorna 1 chamada do abjeto que gerou a chamada de retorno, e a fungao gcbE (get callback fi. ‘gure ~ captura figura de chamada de retorno) retorna a chamada da figura que contém © objeto. Essas fungées podem ser utilizadas pela furgio de chamada de retorno para determinar o objeto e a figura que produzem a chamada de retorno, assim os objetos podem ser modificados nessa figura. A fungio £indob} procura todos 0s objetos filhos de um objeto pai, procurando aqueles que tenham um valor especitico para uma propriedade especificada. Ela re- toma uma chamada para cada objeto com as caracteristicas especificadas. A forma mais ‘comum de findobs é inal ndobj (pai priedade’ , Valor) ; onde pai é a chamada de um objeto pai (por exemplo, uma figura), ‘Propriedade’ €a propriedade examinada e ’ Valor’ €0 valor procurado, Por exemplo, suponha que um programador queira modificar o texto em um botio com a propriedade tag ajustada para “Button” quando a fungio de chamada de retomo for executada. © programadar pode encontrar 0 botdo e substitu 0 texto com as seguintes declaragoes: Bndl = findobj( gel set (undl, ‘String’ 10.3 Propriedades de Objetos Todo objeto de GUI tem uma extensa lista de propriedades que podem ser utilizadas, para ajustar o objeto. Essas propriedades sio ligeiramente diferentes para cada tipo de objeto (figuras, eixos, uicontrols ete.) Todas as propriedades para todos os tipos de objetos esti documentadas no Navegador de Ajuda, mas algumas das mais impor- tantes para os objetos figura e wicontrol sao apresentadas nas Tabelas 10.2. 10.3 ‘As propriedades de abjetos podem ser modificadas utilizando o Inspetor de Propriedades ou as fungSes get e set. Embora o Inspetor de Propriedades seja uma maneita conveniente para ajustar as propriedades durante o projeto da GUI, pre cisamos utilizar get e set para ajusté-las dinamicamente de dentro do programa ~ por ‘exemplo, em uma funcéo de chamada de retorno. Capt 10 Ieraces cries de Usuies | 405 Tabela 10.2 Propriedades importantes de Figure Pr Deserigto color Expacfcn a cor da figura O valor 6 uma cor pmedefirida come “x, 9° ot “B', ou ‘enlGo um veloe de ts clementos que especiia a composiio de vemethe, verde ea dda corer uma escala 0-1. Por exempla, a cor magenta seria specifica poe (10 3) rarece na figura. Valores possiveis sio *Tigure’ para exibir os menus bsicos ou "nore" para no exis. specifica se o sjuste bisico de menus Nene Uma cadeia de caracteres que contémn o nome que apace na barra de tio d figura, Nunbernicie Expecfea seo mmero ds figura aparece na barra de lo, Os valores posi so "on! ou “Off Position Espacica a posigio de uma figura na tela, nas unidades especificadas pela pro- priedade "unite". Esse valor asta um veto com quato elementos, no qual dois Primeirs so as poses ey do canto inferior esquerdo da figura ¢o dis element tos sguintes ao a languraealara da figura Selectiontype — Espadfica tipo de slego para a ulin simples reorna 0 tipo ‘normal’. Uma abvagio dupla retoma 0 tp0 ‘open [Existem opgdesadicionis consute a dacumentagSo line do MATLAB, do mouse na figura, Uma aivacto nas (0 name’ da figura, que pode ser ublizdo para local24a vases ‘As unidades utlizadas pare descrever a posigio da figura. Bsothaspossiveis sto ‘inenee’, 'eentinatera’, ‘normalized’, ‘points, “pixels e ‘characters’. © padedo é ‘pixels visible Especifca se a figura ¢visivl, Valores possiveissfo 'n’ o “of Windouseyie —_Especifca se a figura é normal ou modal (ver discuss sobre Casas de Dislog) Valores possiveir so “norma ou “oda 10.4 Componentes da Interface Grafica de Usuario Esta socio resume as caracteristicas bisicas dos componentes comuns de GUL Ela descreve como criare utilizar cada componente, e os tipos de eventos que cada compo nente pode gerar. Os componentes discutidos nesta segio sia! Campos de Texto Caixas de Edigéo Quadros Botdes Chaves Caixas de Verificagao Marcadores Menus Dinmicos Caivas de Listagem Réguas 408 | Provamasso em MATAR pas Ergntcas Tabela 10.3 Propriedades importantes de uicontrol Propriedade ackgroundcolor Horizonta1Al sgnment ‘rooltipsering Descrigao specific cor de fundo do objeto. 0 valor é uma cor predefinida como =" "q" 0 “b’, 04 entho um vetor com tts elementos que especifcam a com- posigio de vermetho, verde e azul da cor em wna esala 0-1. Por exemplo, a cor magenta seria espeificada como (1 0 2} specifica nome e pardmetros da fungio a serchamada quando o objeto for ativado por uma entrada de texto ou tela. [specifica se © objeto pode ow no ser seleionado, Se no pudes, ele aio responders a0 mouse ou telado, Vales possveis 0 “on” ot “of CCadsia de caractres com o Anglo da fone pata o teat a sr exbido no objet, Valores possveis lo ‘normal, ‘italic’ e “oblique: CCadeia de caracteres com o nome dafonte para o texto exibigo no objeto. ‘Um numero que especitic otamanhy da font para 9 texto exibido no objta, Por padro, otamanho da fone édeindo em pontos ‘Uma codeia de caracteres coma espessura do texto exibido no objeto. Os vale- res possveis slo ‘Light’, moreal’, "deni “bole” specifica cor de frente do objeto. ypecific alinhamento horizontal de uma cadeia de carateres de texto no objeto. Os valores possiveiesfo “2aft’, ‘center’ e ‘righ: “Tamanho msximo da propriedede value para esse objeto. “Tamanho mimo para a propriedade o para ese objeto, CChamada da igura que contém o objeto. Especifca a posigho do objeto na tla, nas unidades especificadas pela propriedade ‘units’, Esse valor seta um vetor de quatro elementos, 50 ‘qual oF dois primelsoe aio as posiges xe y do canto inferior esquerdo do objeto rea a figura que ocantén, 0s dois elementos seguintes so largura altura do objeto 0 se! do objeto, que pode ser utlizado para locali4to "specie o tent de ajuda ase exibido quando um ususriocoloeaoindicador do mouse cobre 0 objet, As undades utiizadas para descrver a posgso da figura. Valores possveis tized", lors’. As unidades-padtio slo ‘pixels a © valor corrnte de wicon Tara chaves, caixas de verfieagio e mar edores, 0 valor ax quando 0 bobo € ativado,e min quando édesaivado. Outros controle en sgeiicadas ferent para esse term. Espacifia eo objeto ¢visivel:Valoes possivessdo “on ou “ott” ape 10 irae Gates ab usanes | 407 10.4.1 Campos de Texto Um campo de texto 6 um objeto grafico que exibe uma cadeia de caracteres de texto. Voc’ pode especificar como o texto ¢ alinhado na érea de exibigdo ajustando a propriedade de alinhamento horizontal. A condligdo-padrao 6 a de centralizacao. Um campo de texto é criado com um uicontrol com propriedade de estilo ‘edit’. Um campo de texto pode ser adicionado a uma GUI com a ferramenta de texto (#!) no Editor de Desenho. Campos de texto nao criam chamadas de retorno, mas 0 valor exibido neles pode ser atualizado, em uma fungio de chamada de retoro, pela modificagéo da. pro- priedade string do campo de texto, conforme mostrado na Secio 10.2 10.4.2. Caixas de Edigao Uma caixa de edigio é win objeto gréfico que permite ao usudrio fornecer uma cadeia de caracteres de texto. A caixa de edigio gera uma chamada de retomo quando 0 usuario pressiona a tecla Enter depois de digitar uma cadeia de caracteres de texto na caixa. Uma caixa de edigéo é criada com um wicontrol eyja propriedade de estilo é ‘edit’, Pode ser adicionada a uma GUI com a ferramenta de caixa de edigao ( (F ) 1no Fito de Desenho. Na Figura 10.11@ temos uma GUI simples com uma caixa de edigio denominada “Bi tox" e um campo de texto denominado ‘TextBox’ . Quando um usudrio digita, uma cadeia de caracteres na caixa de edigio, ela automaticamente ativa a fungio ESL tBox_Cal back, mostrada na Figura 10.11b, Essa fungio localiza a caixa de edigio com a estrutura handles e recupera a cadleia de caracteres digitada pelo usuério, Ela entdo localiza 0 campo de texto ¢ exibe a cadeia de caracteres no campo de texto. Na Figura 10.12 temos a GUI logo apés a ativagao e depois de o usuario digitar a palavra “Hello” na caixa de edicéo. 10.4.3 Quadros ‘Um quadro ¢ um objeto grafico que exibe um retingulo na GUI. Voc’ pode vtilizar quadros para desenhar caixas em tomo de grupos de objetos logicamente relacionados. Por exemplo, um quadro ¢ utilizado para agrupar os marcadores na Figura 10.1 ‘Um quadro ¢ eriado com um ui cont ro} cuja propriedade de estilo € "frame Pode ser adicionado a uma GUI com a ferramenta de quadro ([—}) no Editor de De- senho. Quadros nao geram chamadas de retorno. 10.4.4 Botées Um botio é um componente que o usuirio pode pressionar para disparar ums agio specifica. O botio gera uma chamada de retorno quando o usuario o ativa com 0 mouse. F criado com um ui cont ro! cuja propriedadeé “pushbut ton’. Pode seradi- cionado a uma GUL com a ferramenta de botao ( [Hf] no Editor de Desenho. ‘A fungio MyFirs ¢GUE na Figura 10.10 ilustrou o uso de botbes. 408 | Proararag am MATLAB para opemeios “Fle Eat Layout Too’ Heb Ock) cer else |e ir | FA alm) elal: | | mel] ho Text Here as Type Ton Hee id] |s: a | @ fh, eventdata, handles, varargin) function varargout = Box Calla! % Pind the value typed into the edit box str = get (handles. £4itBox, ‘String"); @ Place the value into the text (handles. TextBox, ‘String’, str); end o Figura 10.11. (2) Desenho de uma GUI simples com uma cixa de edicSo e um campo de texto (6) A fungio de chamada de retorno para essa GUL CR, | ESIC) EehoTetHere Het [ee o o Figura 10.12 (a) A GUI producida pelo programa test_edit. (b) A GUI depois de o usuério dligitar He! 10 na caixa de ediga apa 19 verte Gates a Ustos | 409 10.4.5 Chaves Uma chave é um tipo de botio com dois estados: ligado (pressionado) e desligado (nao pressionado). Uma chave muda de estado quando ¢ ativada pelo mouse, e gera uma chamada de retorno cada vez que muda de estado. A propriedade “Value” da chave vale max (em geral 1) quando 0 botio esta ligado, e min (em geral 0) quando o botio esté destigado. ‘Uma chave € criada com um uicontrol cuja propriedade de estilo é *tosgie- ‘button’. Pode ser adicionada a uma GUI com a ferramenta de chave ( Ml) no Editor de Desenho, Na Figura 10.132, temos uma GUI simples com uma chave cujo nome € "ToggleBut ton', e campo de texto ‘TextBox’. Quando um usuétio pressiona a chave, ela automaticamente chama a fungio ToggleButton_Callback, exibida na Figura 10.13, Essa fungio localiza a chave através da estrutura handles e recupera 0 seu estado da propriedade “value. Entao, a funglo localiza o campo de texto exibe nele o estado. Na Figura 10.14, temos essa GUI logo depois de iniciada, e depois de 0 usudrio ativar a chave pela primeira vez. 10.4.6 Ce as de Verificagao e Marcadores CCaixas de verfcasio e marcadores sio essencialmente idnticos a chaves, exceto que tém formatos distntos. As caixas de verificacio © os marcadors, assim como as chaves, tm dois estados:ligado e desligado,Eles passam de um para outro com 0 uso domouse, gerando uma chamada de retorno a cada passager.A propredade ‘Va ue" & ajustada para max (em geral 1) quando ligada,e nin (em geral 0) quando desligada, Tanto caixas de verficagao como marcadores 880 exibicos na Figura 10. Una caixa de verificagio € ciada com um uicontrol cuja propriedade de estilo € ‘checkbox, e um marcador ¢ criado com um wicontrol ewja propriedade de catilo € “radicbutton’. Uma eaixa de verificagio pode ser adiionada a urna GUL com a ferramenta de cara de verificacio (BA ) no Editor de Desenko, ¢ um marcador pode ser adicionado a uma GUI com a frramenta de marcador ( @®) ) no Editer de Desenho. Caixas de verificago siotradicionalmentewilizadas para exibir opgdes ligado/des ligado,e grupos de marcadores, para seleconar dente opgSes mutuarente exclusvas ‘Na Figura 10.15e, temos um exemplo de como criar um grupo de opgdes mata: mente exclusivas com marcadores. A GUI nessa figura cia trés marcadore, denomi- nados “Option 1", “Option 2° e “Option 3°. Cada marcador uriliza a mesma fungso de chamada de rtorno, mas com um parimetro separado 'As fangbes de chamada de retorno correspondentes sio apresentadas na Figura 10:15). Quando o ustrio ativa um marcador, a fuangao de chamada de retorno corres pondente éexecutada. Essa fungio ajusta a caixa de texto para exibir a opca0 cormnt, liga esse marcadore desiga todos 08 outros marcadores, Note que a GU! utiliza um quadto para agrupar os marcadores, tomando dovie que cles foram tim conjunto, Na Figura 1016, temos essa GUI com a selecao de Option 2 410 | Progamapio em Marta pee Engeneas function varargout = ToggleButton_Callback(h, eventdata, handles, varargin) & Find the state of the toggle button state = get (hardles.Togglebutton, "Velue’); % Place the value into the text field Af state == 0 set (handles. Textsox, ‘string’, 'Off"): set (handles. TextBox, ‘String, ‘on'}; end w Figura 10.13 (@) Desenho de uma GUI simples com uma chave e um campo de texto. (8) A fungi de chamada de retomo dessa GUL alo MEN) 101 on o Figura 10.14 (2) A GUI produzida pelo programa test_togalebutton com a chave desi ‘gad. (b) a GUI com a chave ligada ple 8 Inertaces Gficas de Use | ANY © Option 2 © Options « function varargout = radiobuttonl_callback(h, eventdata, handles, varargin) set _(handles.Labell, "string", ‘Option 1"); set (handles.radiobuttopl, ‘Value’ ,1); set (handles. radiobutton?, ‘Value’, 0); set (handles.radiobutton3, ‘Value’ ,0); function varargout = radiobutton?_callback(h, eventdata, handles, varargin) set (handles.Labell, ‘String’, ‘option 2"); set (handles. vadiobuttont, ‘Value’ , 0): set (handles.radiobutton2, ‘Value’ 1); set (handles.radiobutton3, ‘Value’, 0); function varargout set set radiobutton: fallback(h, eventdata, handles varargin} (handles.tabell, ‘string’, ‘Option 37); (handles. radiobuttont, ‘Value’, 0) (handles .radicbutton2, ‘Value’ 0); (handles. radicbutton3, ‘Value’ 1}; » Figura 10.15. (<) Desenho de uma GUI simples com trés marcadores emn um quadro, mais um ‘ampo de texto para exibir a escolha corrente. (8) As fungées de chamaca de retorno para essa GUI. 412 | Proranapso em Maas” sua Enemies mE 1/2) pion © Optont © Opion? © Option a 10.18 A.GUI produzida pelo programa test_radsobut ton, 10.4.7 Menus Dindmicos Menus dindmicos sia objetos graticos que permitem zo usuétio selecionar uma dentre ‘uma lista de opgdes mutuamente exclusivas. A lista de opgbes que o usurio pode sele- cionar é especificada por uma matriz de células de cadeias de caracteres, e a proprie dade ‘Value’ indica qual dentre as cadeias de caracteres é a selecionada no momento, ‘Um menu dinamico pode ser adicionado a uma GUI com a ferramenta de menu dinamico (3 ) no Editor de Desenho. Na Figura 10.172, temos um exemplo de menu dinémico. A GUI nessa figura cria um ‘menu dinmico com cinco opsies, rotuladas como “Option 1”, “Option 2" eassim por diante ‘A fungio de chamada de retorno correspondente € exibida na Figura 10.17b, Essa fungao recupera a opgio selecionada pela verificagao do parimetro ‘Value’ do menu dindmico, ¢ cria e exibe uma cadeia de caracteres que contém esse valor no campo de texto, Na Figura 10.18, temas essa GUI apés a selecio de Option 4. 10.4.8 Caixas de Listagem CCaixas de listagem sio objetos grficos que exibem diversas linhas de texto e permitem que a ustisrio selecione uma ost mais dessas inhas. Se houver mais linhas de texto do ue couber na eaixa de listagem, uma barra de rolagem serd criada para permitir ao Usuario percorrer a caixa. AS linhas de texto que o usudrio pode selecionar sio espec- ficadas por uma matriz de células de cadeias de caracteres, e a propriedade ‘Value” indica quais sio as cadeias de caractores atualmente selecionadas. Uma caixa de listagem é eriada com um uicontrol cuja propriedade de estilo & + Listioox. Pode ser adicionada a uma GUI com a ferramenta de caixa de listagem EF) no Editor de Desenho. Caixas de listagem podem ser utilizadas pata selecionar um tinico item de uma selegao de escolhas possiveis. No uso normal da GUI, uma ativacio simples do mouse tem tim item de lista Seleciona esse item, mas ndo proveca a ocorténcia de uma acao. Erm ‘er disso, a agio espera um disparo externo, como o de um botio. Entretanto,aativagao upla do mouse leva & ocorréncia imediata da agio. Eventos com ativacao simples eat vagio dupla podem ser diferenciados pela propriedade Select ionType da figura conde ocorreram as ativagies. Uma ativagao simples de mouse coloca a cadeia de earac- teres “normal ' na propriedade Select ionType, e uma ativagso dupla de mouse coloca a cadeia de caracteres ‘open nessa mesma propriedade aptlo 19 norco Gaiess Uses | ATR function varargo = radiobuttonl_callback(h, eventdata, handles, vararcin) & Find the value of the popup menu value = get (handles, Popupl, ‘Value!); § Place the value into the text field str = (‘option * num2str(valuel]: set (handles.Labeli, ‘String’ str); 6 Figura 10.17 (a) Desenho de uma GUI simples que contém um menu dinémico ¢ um campo de texto para exibira selecdo atual. (0) As fungSes de chamada de retorno dessa GUL EMT: 10) ptona [eaene 3] Figura 10.18 A GUI produzida pelo programa test_popvp. ‘Uma caixa de listagem permite também selegSes miltiplas da lista, Se a diferenca entre as propriedades max ein da caixa de listagem for maior que um, selegbes mill plas sio permitidas. Caso contrério, somente um item pode ser selecionado da lista Na Figura 10.192 temos um exemplo de caixa de listagem de selegio simples. A GUL nessa figura cria uma caixa de listagem com oito opcées, rotuladas como “Option “Option 2” e assim por diante. Além disso, a GUI cria um botao, para efetuar a selecio, um campo de texto, para exibir a escolha selecionada, Tanto a caixa de listagem como o botdo geram chamadas de retorno. \ 414 | Provamagso em MATLAB cara Engrs © function vazargout = Buttoni_callback(h, eventdata, ... handles, varargin) % Find the value of the popup menu value = get (handles,Listboxi, 'Value’); & Update text label ‘option " nun2etr(value) J; (handles.Label1, 'String", str function varargout = Listboxl_callback(h, eventdata, ... handles, varargin} ‘ if selectiontype(1) is was a double click, update the label lontype = get (gebf, ‘Select iontype") ; % Pind the value of the popup menu value = get (handles, Listbox1, ‘Value’ % Update text label str = [Option * num2str (value) }; set (handles.Labell, ’String’ str]: ® Figura 10.19 (@) Desenho de uma GUI simples com uma caixa de listagem, um botdo © um ‘campo de texto. (b) As fangBes de chamada de retorno para essa GUIL Note que a selegao pode ocorrer pela ativacio do botio ox pela ativacio dupa de um item 9 Caixa de Tistagem Captle 19 Inersce tes oe Ustros | ANS Figura 10.20 A GUI produzida pelo programa test_1isthox. ‘As fungées de chamada de retormo correspondentes estiona Figura 10.19. Se uma selegio € feita na caixa de listagem, a fungio Li.stboxi_cal back é executada. Essa fungio Verifca se na figura que produsiu a chamada de retorn (utilizando a fungio g=b£) a ago de selegio foi de ativacio simples ou duple. Se oi ativagio dupla, a fungio captura 0 valor selocionado da caixa de listagem e escreve uma cadeia de caracteres apropriada no campo de texto. * Se obotio for seleconado, a fungio But ton1_Cal Lbackéexecutada. Bla captura o valor selecionado da caixa de listagem e escreve uma cadcia de caractees apropriada ro campo de texto, A GUI produzida pelo programa test_listbox & mostrada'na Figura 10.20, Em um dos exercicios de fim de capitulo, vocé seré solicitado a modificar esse exemplo para permitir selegdes miltiplas na caixa de listagem. 10.4.9 Réguas Réguas sio objetos grificos que permitem ao usudtio selecionar valores de um interval continuo entre valores minimo e maximo especificados, utilizando um cursor mével & © mouse. A propriedade “Value” da régua € ajustada para um valor entre min e max, dependendo da posigio do cursor. Uma régua € criada com um uicontrol cuja propriedade de estilo é ’ 1 ider Pode ser adicionada a uma GUI com a ferramenta de régua (em) no Editor de Desenho. Na Figura 10.212, temos o desenho de uma GUI simples que contém uma régua eum campo de texto. A propriedade ‘Min’ dessa régua é ajustada para zero, € a propriedade ‘vax’, para dez. Quando um usudrio empurta 0 cursor, ele automa- ticamente ativa a fungio Sliderl_Callback, mostrada na Figura 10.21b, Essa fungdo captura 0 valor da régua na propriedade *Value’ e exibe o valor no campo de texto. Na Figura 10.22, temos essa GUI com o cursor em uma posigdo intermedia dentro do intervalo. ee L 416 | Posramagio em MATAB® prs Erenteos 151) Fe Eat Layout Took Hep OcM) sO Pe ele ® function varargout = Sliderl_callb: (b, eventdata, ndles, varargin % Find the value of the slider value = get{handles.Slider1, ‘Value'); @ Place the value in the text field str = sprinté("8,2£", value); set (handles Labell, ‘String’, str): © Figura 10.21 (a) Desenho de uma GUI simples com uma négua e um campo de texto. (6) A fungi de chamada de retorno para essa GUL Figura 10.22 A GUI produzida pelo programa test_e1iser 10 mersces areas tatice | 417 Exemplo 10.1 ~ Conversdo de Temperaturas Escreva um programa para converter temperaturas de graus Fahrenheit para graus Celsius, e vice-versa, no intervalo de 0a 100°C, utilizando uma GUI para acetar dads e exibir resultados. O programa deve inctuir uma caixa de edicio para temperaturas em graus Fahrenheit, uma caixa de edicao para temperaturas em graus Celsius e uma régua para permitir 0 ajuste continuo da temperatura. O usuétio deve ser capaz de fomecer temperaturas em qualquer uma das caixas de edigdo ou pela movimentagio do carsor, € todos 0s elementos da GUI devem se ajustar aos valores correspondentes Solugio Para criar esse programa, precisaremos de um campo ¢e texto e uma caixa de edicio para a temperatura em graus Fahrenheit, outro campo de texto e uma caixa de edigdo para a temperatura em graus Celsius e uma régua. Precisaremos também de uma fungio para converter graus Fahrenheit em graus Celsius, e uma fungio para converter graus Celsius em gravis Fahrenheit, Finalmente, precisaremos escrever uma fungio de chama- da de retomno para dar suporte 3s entradas do usuario. O intervalo de valores para conversio fica entre 32 € 212°F e entre 0¢ 100°C, por- tanto, sera conveniente ajustar a régua para cobrir o intervalo 0-100 etratar 0 valor da régua como uma temperatura ém graus C. (© primeiro passo nesse processo é utilizar guide para desenhar a GUI. Podemos utilizar guide para criar os cinco elementos requeridios da GUL e localiza-ios nas posi- g6es aproximadamente corretas. Entio, podemos utilizar 0 Inspetor de Propriedades para eletuar os seguintes passos: 1. Selecionar nomes apropriados para cada elemento da GUI e armazené-los nas propriedades ‘Tag. adequadas. Os nomes serio ‘Label’, ‘Label2", ‘edit’, ‘Bdit2' e ‘Slider’ 2. Armazenar ‘Degrees Fe ‘Degrees C’ nas propriedades dduas legendas, 3. Ajustar os limites minimo e maximo da régua para 0 e 100, respectivamente 4, Armazenar os valores iniciais na propriedade String dos dois campos de edigéo e na propriedade Value da régua. Vamos iniciar a temperatura como 52°F ou 0°C, 0 que corresponde a um valor 0 na régua, 5, Ajustar a propriedade Wame da figura que contém a GUI para ‘Temperature tring das Tendo efetuado essas alteragdes, a GUI deve ser gravada no arquivo teap_conver sion, £4g, Isso produzird um arquivo de figura eum arquivo M correspondente. O arquivo M conters conectores para as tes fungbes de chamada de retorno necesaras fara os campos de edigho e 4 régua. Na Figura 1025, a GUI resullante € mostrada durante 0 processo de desenho. (© proximo passo no process €crar as fungSes para converter graus Fahrenheit em graue Celsius A angio to_c converte temperaturasde Fahrenhel pare Clsts Ela deve implementar a equaao sauce $ aus on ANB | Pramagao em MATA par gees Figura 10.23 Desenho da GUI para conversio de temperatura, (© cbdigo para essa funcio é function deg_c = to_c(des_f) % Convert degrees Fahrenheit to degrees c. deg_c = (3/9) * (deg_f - 32); A fungio to_f converte temperaturas de Celsius para Fahrenheit. Ela deve imple- mentar a equagio grau F = 10.2) 9 S (grau C) +32 © cédigo para essa fungi é function deg_t to_f\deg_c} ss Celsius to degrees Fahrenheit deg_f = (9/5) * dege + 32 Finalmente, precisamos escrever as fungdes de chamada de retomo para amarrar tudo. As fungdes precisam responder as caixas de edicio e a régua e atualizar todos os trés componentes. (Note que atualizaremos inclusive a caba de edigdo onde o usu digitou alguma coisa, assim os dados poderdo ser exibidos em um formato consistente o tempo todo e erros poderdo ser corrigidos se 0 usurio digitar um valor fora do intervalo.) Existe aqui uma complicagio adicional, pois os valores fornecidos nas caixas de edigio sio cadeias de caracteres, e queremos traté-los como mimeras, Se um usudtio digi tar 0 valor 100 em uma caixa de edigio, ele criard a cadeia de caracteres ‘100°, e nio 0 niimero 100. A fungio de chamada de retorno converte cadeias de caracteres em zimeros, para que a conversdo possa ser calculada. Essa conversio ¢ feita com a fungao str2nur, que converte uma cadeia de caracteres em um valor numérico 010 nerace Gigs de teutias | 419 function varargout - Editi callback(h, eventdata, handles, varargin) & Update all temperature values deg_f = str2num( get(h, ‘String’) 1; deg_f = max( [ 32 deg_f) ); deg_f = min( [212 deg_f] }; deg_e = to_c(deg_f): Now update the fields set (handles Edit, ‘String’, sprintf (/.1£",deg_fl): set (handles Rdit2, ‘String’, sprintf (‘%.1£",deg_cl): set (handles.Slider1, ‘Value’ ,deg_c) function varargout = Edit? Callback(h, eventdata, handles. varargin) 2 Update all temperature values deg_c = str2num( get(h, ‘String’) ); deg_e = max( {0 dege) 1; deg_c = min{ [100 degc] }; deg_f = to_f{deg_c}; % Now update the fields set (handles-Editt, ‘String’, sprinté(‘%.1£’, deg_f)}; set (handles.edit2, ‘String’, sprintf (‘8.1£",deg_c)); set (handles.Slider1, ‘Value’ ,deg_c); function varargout = S1idert_callback(h, eventdata, handles, varargin) % Update all temperature values get (h, ‘Value'}; 3 Now update eet (handle set (handles set (hand he Elelds dit, ‘String’ sprintf ("€.1£",deg_£)); ait2, ‘String’ sprintf (*8.1f",deg_c)) Slideri, ‘Value’ ,deg_ch: Figura 10.24 FuncBes de chamada de retomn para a GUI de conversio de temperatura. Adicionalmente, a fungio de chamada de retorno precisa limitar 0 usudrio a0s va- lores dentro do intervalo de temperaturas vilidas, que é 0-100 °C e 32-212 °F. As fungSes de chamada de retorno resultantes so mostradas na Figura 10.24

Vous aimerez peut-être aussi