Matlab Revisado

Embed Size (px)

Citation preview

MATLABUma Linguagem Tcnica de Computao

2. Edio

Grupo PET Engenharia Eltrica UFMS

Campo Grande MS Maio 2004

Grupo PET Engenharia Eltrica - UFMS

ndiceMatlab_________________________________________________________________1 Apresentao____________________________________________________________4 MATLAB v. 5.3_________________________________________________________51. Introduo__________________________________________________________________5 2. Noes Bsicas_______________________________________________________________6 2.1. Ajuda on-line_______________________________________________________________7 3. Lies Tutoriais______________________________________________________________8 3.1. Lio 1: Criando e Trabalhando com Vetores ___________________________________8 3.2. Lio 2: Plotando Grficos Simples___________________________________________10 3.3. Lio 3: Criando, Salvando e Executando Procedimentos_________________________11 3.4. Lio 4: Criando e Executando uma Funo____________________________________12 4. Computao Interativa_______________________________________________________14 4.1. Matrizes e Vetores_________________________________________________________14 4.2. Entrada__________________________________________________________________14 4.3. ndices___________________________________________________________________14 4.4. Manipulao de Matrizes____________________________________________________16 4.5. Criando Vetores___________________________________________________________19 4.6. Operaes com Matrizes____________________________________________________20 4.7. Operaes Aritmticas______________________________________________________20 4.8. Operaes Relacionais______________________________________________________22 4.9. Operaes Lgicas_________________________________________________________22 4.10. Funes Matemticas Elementares___________________________________________23 4.11. Funes de Matrizes_______________________________________________________24 4.12. Caracteres de Strings____________________________________________________25 5. Grficos____________________________________________________________________28 5.1. Grficos Bsicos em 2-D_____________________________________________________28 5.2. Opes de Estilo___________________________________________________________28 5.3. Rtulos, Ttulo, Legenda e Outros objetos de texto_______________________________28 5.1 Controle dos Eixos e de Zoom________________________________________________29 5.4. Grficos sobrepostos________________________________________________________30 5.5. Grficos especficos em 2-D__________________________________________________32 5.6. Usando o comando subplot__________________________________________________37 5.7. Grficos 3D_______________________________________________________________38

2

Grupo PET Engenharia Eltrica - UFMS5.8. Comando View____________________________________________________________38 5.9. Rotacionar a vista__________________________________________________________40 5.10. Grficos de malha e superfcie_______________________________________________40 5.11. Grficos de Superfcie Interpolados__________________________________________45 5.12. Manejar com Grficos_____________________________________________________47 5.13. A Hierarquia dos Objetos__________________________________________________48 5.14. Objetos Handles__________________________________________________________48 5.15. Propriedades dos objetos___________________________________________________49 5.16. Modificando um grfico existente____________________________________________53 5.17. Controle completo sobre o plano grfico (layout)_______________________________54 5.18. Salvando e Imprimindo Grficos____________________________________________55 5.19. Animao________________________________________________________________56 6. Programando no MATLAB: Funes e Procedimentos____________________________63 6.1. Procedimentos_____________________________________________________________63 6.2. Funes__________________________________________________________________63 6.3. Executando uma funo_____________________________________________________64 6.4. Mais sobre funes_________________________________________________________66 6.5. Sub-funes_______________________________________________________________68 6.6. Funes compiladas (Analisadas): P-Code______________________________________68 6.7. O Profiler_________________________________________________________________68 6.8. Caractersticas Especficas da Linguagem _____________________________________69 6.9. O uso de comentrio para criar ajuda on-line___________________________________69 6.10. Continuao______________________________________________________________69 6.11. Variveis Globais _________________________________________________________70 6.12. Laos, ramificaes e controle de fluxo_______________________________________71 6.13. Entrada interativa_________________________________________________________74 6.14. Recursion________________________________________________________________77 6.15. Entrada/Sada____________________________________________________________77 6.16. Objetos de Dados Avanados________________________________________________79 6.17. Matrizes Multidimensionais_________________________________________________79 6.18. Estruturas ou Registros____________________________________________________80 6.19. Clulas__________________________________________________________________84 7. Erros 86

Apndice (Respostas dos exerccios do tutorial)________________________________90

3

Grupo PET Engenharia Eltrica - UFMS

ApresentaoEsta apostila foi confeccionada pelos bolsistas do Grupo Pet de Engenharia Eltrica Diogo Chadud Milagres, Hudson Paz da Silva, Igor Gavilon e Luigi Galotto Jnior, baseada no livro de Rudra Pratap, com o objetivo de ensinar desde de os princpios bsicos at os comandos mais avanados do Matlab. Meses de trabalho no foram suficientes para que se dominasse toda a ferramenta MATLAB, uma vez que o trabalho realizado visou a preparao de um material apropriado para o ensino em nvel acadmico. Esta obra tem carter exclusivamente cientfico e sua viso expressa por acadmicos que buscam na ferramenta seu melhor desempenho do ponto de vista experimental. Portanto, a aplicao especfica para algumas extenses que existem do MATLAB no mercado hoje em dia como confeco de mapas, estradas, lay-outs, redes neurais, lgica fuzzy entre outros no ser abordada nesta apostila. Esperamos que esta apostila seja de grande utilidade para todos, no sendo usada apenas durante o aprendizado, mas que seja utilizada como uma fonte de consulta.

4

Grupo PET Engenharia Eltrica - UFMS

MATLAB v. 5.31. INTRODUO Nesta apostila, apresentaremos um pouco sobre a potencialidade do MATLAB. Precisaramos de muito tempo para mostrar tudo aquilo de que o MATLAB capaz. Voc provavelmente sentir a necessidade de estudar este tutorial executando o MATLAB ao mesmo tempo. Dessa forma, poder introduzir os comandos conforme descrito aqui, confirmar os resultados apresentados e desenvolver uma compreenso prtica do MATLAB. Talvez a maneira mais fcil de visualizar o MATLAB seja pensar nele como uma calculadora cientfica completa. Assim como em uma calculadora bsica, ele faz operaes matemticas elementares como a adio, subtrao, multiplicao e diviso. Tal como uma calculadora cientfica, ele opera com nmeros complexos, razes quadradas e potenciaes, logaritmos e operaes trigonomtricas, tais como seno, cosseno e tangente. Da mesma forma que uma calculadora programvel, possvel armazenar e recuperar dados, criar, executar e armazenar seqncias de comandos para automatizar o clculo de equaes importantes, e fazer comparaes lgicas e controlar a ordem na qual os comandos so executados. Assim como as calculadoras mais poderosas disponveis, ele lhe permite plotar os dados de diversas maneiras, executar lgebra matricial, manipular polinmios, integrar funes, manipular as funes simbolicamente etc. Na realidade, o MATLAB oferece muitas caractersticas e muito mais verstil do que qualquer calculadora: uma ferramenta para fazer clculos matemticos; uma linguagem de programao com caractersticas mais avanadas e muito mais fcil de usar do que linguagens de programao tais como BASIC, Pascal ou C; apresenta um ambiente rico para a visualizao de dados graas a sua poderosa capacidade grfica; uma plataforma de desenvolvimento de aplicaes, na qual conjuntos de ferramentas inteligentes de resoluo de problemas para aplicaes especficas, geralmente denominados toolboxes, podem ser desenvolvidos de forma relativamente fcil.

5

Grupo PET Engenharia Eltrica - UFMS 2. NOES BSICAS Como possvel fazer operaes aritmticas bsicas utilizando o MATLAB? Os operadores so: + Adio, Subtrao, * Multiplicao, / Diviso, ^ Exponenciao. Os clculos efetuados em uma frmula obedecero hierarquia matemtica, ou seja, primeiro ser calculado a exponenciao, depois a multiplicao e diviso e por ltimo a soma e a subtrao. Caso voc tenha a necessidade de obter prioridade de clculo em outra ordem, lembre-se de utilizar os caracteres parnteses. Se voc digitar: 5+5 A resposta ser: ans = 10 Este resultado significa que a sua resposta foi armazenada na varivel ans, pois todos os resultados devem ser armazenados em uma varivel. No MATLAB, as variveis so declaradas automaticamente, portanto basta fazer uma atribuio. Por exemplo: a=5 a= 5 Neste caso, a varivel a recebe o valor 5, assim o mesmo clculo anterior pode ser: b=a+a b= 10 Obs.: Colocando ; no final de cada sentena, o MATLAB no retorna a resposta. Se no conseguir se lembrar do nome de uma varivel, pode pedir para o MATLAB apresentar uma lista das variveis que ele conhece, utilizando o comando who: who Your variables are: a ans b

6

Grupo PET Engenharia Eltrica - UFMS Observe que o MATLAB no informa o valor das variveis, mas somente lista seus nomes. Para descobrir seus valores, basta introduzir seus nomes aps o prompt do MATLAB. Para chamar os comandos previamente utilizados, o MATLAB utiliza as teclas de cursor (, , , do seu teclado. Por exemplo, ao pressionar uma tecla uma ) vez, chamamos o comando mais recente do prompt do MATLAB. Pressionando-se a tecla repetidamente chamamos os comandos anteriores, um de cada vez. De forma semelhante, pressionando-se a tecla chamam os seus comandos posteriores. , 2.1. AJUDA ON-LINE O comando help a maneira mais simples de se conseguir ajuda caso voc saiba exatamente o tpico a respeito do qual voc necessita de informaes. Ao digitar help , a tela apresenta ajuda sobre o tpico, caso ela exista. Por exemplo: help sqrt SQRT Square root. SQRT(X) is the square root of the elements of X. Complex results are produced if X is not positive. See also SQRTM. Essa foi a resposta ajuda sobre o tpico SQRT. Caso voc no sabe o nome da funo, possvel utilizar o comando lookfor. O comando lookfor fornece ajuda fazendo uma busca em toda a primeira linha dos tpicos de ajuda e retornando aqueles que contm a palavra-chave que voc especificou. Por exemplo: lookfor complex CONJ Complex conjugate. CPLXPAIR Sort numbers into complex conjugate pairs. IMAG Complex imaginary part. REAL Complex real part. CDF2RDF Complex diagonal form to real block diagonal form. A palavra-chave complex no um comando MATLAB, mas o comando localizou nas descries de ajuda alguns comandos do MATLAB. A partir dessa informao, o comando help pode ser usado para buscar ajuda sobre um comando especfico.

7

Grupo PET Engenharia Eltrica - UFMS 3. LIES TUTORIAIS As seguintes lies tm o objetivo de auxiliar voc a conhecer o MATLAB rapidamente. As lies devem duram de 10 a 15 minutos e aconselhamos que voc faa os exerccios no final de cada lio. 3.1. LIO 1: CRIANDO E TRABALHANDO COM VETORES O que voc aprender: Como criar matriz linha e coluna. Como criar um vetor com n elementos linearmente (igualmente) espaados entre dois nmeros a e b. Como fazer operaes aritmticas simples com vetores. Como fazer operaes termo por termo (usando: .* , ./ , .^ , etc). Como usar funes trigonomtricas com vetores. Como usar funes matemticas elementares como raiz quadrada, exponenciais e logaritmos com vetores. Mtodo: Tente executar os comandos a seguir e tente entender os resultados apresentados. x = [1 2 3] x= 1 2 3 y uma matriz coluna com 3 elementos. x uma matriz linha com 3 elementos.

y = [2; 1; 5] y= 2 1 5 z = [2 1 0]; a=x+z a= 3 3 3

Voc pode somar (ou subtrair) dois vetores com o mesmo comprimento.

b=x+y ??? Error using ==> + Matrix dimensions must agree.

Mas voc no pode somar (ou subtrair) uma matriz linha com uma coluna.

8

Grupo PET Engenharia Eltrica - UFMS

a = x.*z a= 2 2 0

Voc pode multiplicar (ou dividir) os elementos de dois vetores de mesmo tamanho termo por termo, utilizando um operador especial ( .* , ./, etc.).

b = 2*a b= 4 4 0

No necessrio um operador especial para multiplicar um escalar com um vetor. Cria um vetor x com 5 elementos linearmente espaados entre 0 e 10. 7.5000 10.0000 Funes trigonomtricas sin, cos, etc., assim como funes matemticas elementares sqrt, exp log, etc., operam com vetores termo por termo.

x = linspace(0,10,5) x= 0 2.5000 5.0000 y = sin(x); z = sqrt(x).*y z= 0 0.9463 -2.1442 EXERCCIOS

2.5688 -1.7203

1. A equao de uma reta y = mx c, onde m e c so constantes. Compute os valores de y para os seguintes valores de x: x = 0, 1.5, 3, 4, 5, 7, 9 e 10. 2.Crie um vetor t com 10 elementos: 1, 2, 3, ..., 10. Depois compute os seguintes valores: x = t .sen(t). y = (t - 1)/(t + 1). z = sen(t2)/t2. 3.Todos os pontos com coordenadas x = r cos e y = r sen , sendo r uma constante, representam um crculo de raio r, que satisfazem a equao x2 + y2 = r2. Crie um vetor coluna para com valores 0, /4, /2, 3 /4, e 5 /4. Considere r = 2 e compute os vetores coluna x e y, e verifique se eles satisfazem a equao do crculo encontrando o raio r = x 2 + y 2 . 4. A soma de uma srie geomtrica 1 + r + r2 + r3 + ... + rn possui um limite 1/ (1-r) para r < 1 e n : . Crie um vetor n de 11 elementos de 0 a 10. Considere r = 0.5 e crie outro vetor x = [r0 r1 ... rn]. Compute a soma deste vetor com o comando s = sum(x) (s soma da srie atual). Calcule o limite 1/(1-r) e compare com s. Repita o procedimento para n de 0 a 50 e depois de 0 a 100.

9

Grupo PET Engenharia Eltrica - UFMS 3.2. LIO 2: PLOTANDO GRFICOS SIMPLES O que voc ir aprender: Como criar as coordenadas x e y de uma circunferncia de raio unitrio. Como plotar o grfico x x y, visualizando a circunferncia. Como escolher os eixos x e y em escalas iguais, para que a circunferncia no parea uma elipse. Como nomear os eixos e o grfico. Como imprimir o grfico. Os comandos usados do MATLAB so: axis, xlabel, ylabel, title e print. Mtodo: Voc ir desenhar um crculo de raio unitrio. Para faz-lo, primeiro criam-se os dados (coordenadas x e y) ento plotam-se os dados e finalmente imprima o grfico. Para criar os dados, use as equaes paramtricas de um crculo unitrio: x = cos y = sen 0 2 Nos procedimentos abaixo, s sero mostrados os teta = linspace(0,2*pi,100); x = cos(teta); y = sin(teta); plot(x,y) axis('equal'); xlabel('horizontal') ylabel('vertical) title('Crculo de raio unitrio') printCria um vetor teta de 100 elementos linearmente espaados. Calcula as coordenadas x e y. Plota o grfico x x y. Iguala a escala dos eixos. Nomeia os eixos x e y. Insere um ttulo para o grfico. Imprime.

10

Grupo PET Engenharia Eltrica - UFMS EXERCCIOS 1. Plote y = e-0.4xsen x, 0 x 4 . Tomando 10, 50 e depois 100 pontos no

intervalo.

2. Use o comando plot3(x,y,z) para plotar a hlice circular x(t) = sen t, y(t) = cos t e z(t) = t, 0 t 20. 3. Os comandos de plotagem semilogx, semilogy, e loglog sero usados neste exerccio. Plote os valores de x, os valores de y e ambos no grfico na escala log10 respectivamente. Crie o vetor x = 0:10:1000. Plote x x y = x3, usando as trs escalas logartmicas descritas no incio. 3.3. LIO 3: CRIANDO, SALVANDO E EXECUTANDO PROCEDIMENTOS O que voc ir aprender: Como criar, escrever e salvar o procedimento. Como executar o procedimento no MATLAB. Mtodo: Escrever um procedimento para desenhar o crculo unitrio da lio 2. Voc essencialmente escrever os comandos mostrados na lio anterior, ir salv-los, nome-los e execut-los no MATLAB. Siga as instrues abaixo: 1. Escolha a opo Novo (New) no menu Arquivo (File) do MATLAB e selecione a opo M-file. 2. Escreva as linhas a seguir. As linhas que comeam com o caracter % so interpretadas como comentrios pelo MATLAB e so ignoradas. % CIRCLE Procedimento que desenha um crculo unitrio. % Arquivo escrito pelo Grupo Pet. % ------------------------------------------teta = linspace(0,2*pi,100); % Cria o vetor teta. x = cos(teta); % Gera coordenadas x. y = sin(teta); % Gera coordenadas y. plot (x, y); % Plota o crculo. axis (equal); % Iguala a escala dos eixos. title(Crculo de raio unitrio) % Pe um ttulo. 3. Depois de escrito, salve o arquivo como circle.m. 4. Volte ao MATLAB e verifique se possvel executar o seu arquivo, da forma a seguir: help circle CIRCLE Procedimento que desenha um crculo unitrio. Arquivo escrito pelo Grupo Pet. ------------------------------------------circle Voc dever ver o mesmo crculo do exemplo anterior. 11

Grupo PET Engenharia Eltrica - UFMS EXERCCIOS 1. Modifique o arquivo circle.m para mostrar o centro do crculo tambm. Marque o ponto central +. 2. Modifique o arquivo circle.m para formar um crculo de raio qualquer. Use o comando input para escrever na tela que voc quer entrar com um valor para o raio. Ex: r = input(Entre com o valor do raio: ) Modifique o clculo de x e y, multiplicando-os pelo valor do raio (r). Salve e execute o arquivo. 3.4. LIO 4: CRIANDO E EXECUTANDO UMA FUNO O que voc ir aprender: Como abrir e editar um M-file existente. Como definir e executar um arquivo funo. Mtodo: Escreva um arquivo funo para desenhar um crculo de um raio especfico, com o raio sendo a entrada para a funo. Voc pode escrever um novo arquivo funo ou modificar o procedimento da lio 3. Ns aconselhamos voc a escolher a ltima opo. 1. Abra o arquivo circle.m: Selecione a opo Abrir (Open) do menu Arquivo (File). D um clique duplo no arquivo na caixa de dilogo. 2. Edite o arquivo circle.m da lio 3, conforme indicado abaixo: function [x,y] = circlefn(r); % CIRCLE Funo para desenhar um crculo de raio r. % Arquivo escrito pelo Grupo Pet. % Input: r = raio especificado. % Output: [x,y] = coordenadas x e y dos pontos dados. % ------------------------------------------teta = linspace(0,2*pi,100); % Cria o vetor teta. x = r*cos(teta); % Gera coordenadas x. y = r*sin(teta); % Gera coordenadas y. plot (x, y); % Plota o crculo. axis (equal); % Iguala a escala dos eixos. title(Crculo de raio r = , num2str(r)]) % Pe um ttulo com o valor de r. 3. Depois de modificado salve o arquivo com o nome circlefn.m, utilizando a opo Save as... do menu Arquivo.

12

Grupo PET Engenharia Eltrica - UFMS 4. Este um exemplo de se executar uma funo de 3 diferentes formas. Tente execut-los. R = 5; [x,y] = circlefn(R); [cx,cy] = circlefn(2.5); circlefn(1); circlefn(R^2/(R+5*sin(R)));Especifica a entrada e executa a funo com as variveis de sada especificadas. Voc pode tambm especificar o valor de entrada diretamente. Se voc no precisar da sada, no necessrio armazenar a sada numa varivel. claro que a entrada pode ser uma expresso vlida do MATLAB.

EXERCCIOS 1. Escreva uma funo que retorne uma tabela de converso de Celsius para Fahrenheit. A entrada da funo deve ser dois nmeros: Ti e Tf, especificando o menor e o maior variao da tabela em Celsius. A sada deve ser uma matriz de duas colunas: a primeira coluna mostrando a temperatura em Celsius de Ti para Tf no incremento de 1 oC e a segunda coluna mostrando a temperatura correspondente em Fahrenheit. (i) Crie um vetor coluna C de Ti para Tf com o comando C = [Ti : Tf], (ii) Calcule o nmero correspondente em Fahrenheit usando a frmula [F = 9*C/5 +32] e (iii) Faa o matriz final com o comando temp = [C F];. Note que a sua sada ser nomeada temp. 2. Escreva uma funo crossprod para computar o produto vetorial de dois vetores u e v, dado u = (u1, u2, u3), e v = (v1, v2, v3), e u x v = (u2u3 - u3u2, u3u1 - u1u3, u1u2 - u2u1). Cheque sua funo fazendo o produto vetorial de vetores unitrios: (i,j), (j,k), etc. [i = (1,0,0), j = (0,1,0), k = (0,0,1)]. 3. Escreva a funo para computar a soma (utilize a funo sum) de uma srie geomtrica 1 + r + r2 + r3 + ... + rn para um dado r e n. Portanto a entrada para a funo deve ser r e n e a sada deve ser a soma da srie. (Veja o exerccio 4 do item 3.1. lio 1).

13

Grupo PET Engenharia Eltrica - UFMS

4. COMPUTAO INTERATIVA Neste captulo, ns introduziremos para vocs algumas das funes embutidas no MATLAB e suas capacidades, exemplos completos de computao interativa. 4.1. MATRIZES E VETORES 4.2. ENTRADA Os valores de uma Matriz so colocados entre colchetes, sendo que, os elementos de uma linha so separados por espao ou vrgula, e as colunas so separadas por ponto e vrgula. Exemplos: Matriz Entrada do comando no MATLAB 1 2 5 A= A = [1 2 5;3 9 0] 3 9 0 2 x ln x + siny B= B = [2*x log(x)+sin(y);5i 3+2i] 5i 3 + 2i Obs.: Usa-se a mesma notao para vetores com uma linha ou com uma coluna. Continuao Se a sua entrada muito longa, voc poder usar reticncias (...) e continuar a entrada na outra linha. Exemplo: A = [1/3 5.55*sin(x) 9.35 0.097; ... 3/(x+2*log(x)) 3 0 6.555; ... (5*x 23)/55 x-3 x*sin(x) sqrt(3)]; 4.3. NDICES Dada uma matriz, os seus elementos podem ser acessados especificando os ndices de suas linhas e colunas, sendo que A(i, j) representa do elemento aij da matriz A. Exemplos: A = [1 2 3; 4 5 6; 7 8 8] Entrada da Matriz. A= 1 4 7 2 5 8 3 6 8 Elementos de uma linha so separados por espao ou vrgula, e as colunas so separadas por ponto e vrgula.

14

Grupo PET Engenharia Eltrica - UFMS

A(2,3) ans = 6 A(3,3) = 9 A= 1 4 7 2 5 8 3 6 9

Acesso ao elemento da segunda linha e da terceira coluna da matriz A.

Substitui o elemento da terceira linha e da terceira coluna da matriz A.

B = A(2:3,1:3) B= 4 7 5 8 6 9

possvel retirar uma parte da matriz A, usando os especficos limites para as linhas e as colunas.

B = A(2:3,:) B= 4 7 5 8 6 9

possvel selecionar toda uma linha ou coluna utilizando (:).

B(:,2) = [] B= 4 7 6 9 Dimenso

Para deletar uma linha ou uma coluna, basta atribuir a matriz vazia.

A dimenso da matriz determinada automaticamente pelo MATLAB. Exemplo: 0 0 0 B(2, 3) = 5; produz, B= 0 0 5

15

Grupo PET Engenharia Eltrica - UFMS 0 0 0 produz. B= 0 0 0 1 2 3

C(3,1:3) = [1 2 3];

4.4. MANIPULAO DE MATRIZES Voc pode manipular facilmente a seleo de qualquer elemento de uma matriz, utilizando vetores como ndices da matriz, para que seja criada uma submatriz a partir de uma matriz. Tambm, pode-se adicionar, remover ou substituir linhas e/ou colunas de uma matriz. Como exemplo, suponha que A uma matriz 10 x 10, B uma matriz 5 x 10 e y um vetor de 20 elementos, ento: A( [1 3 6 9], : ) = [B(1:3, : ); y(1:10)] As linhas 1, 3 e 6 da matriz A sero substitudas pelas linhas 1, 2 e 3 da matriz B, e a linha 9 da matriz A substituda pelo vetor y. Exemplo:2 3 6 3 0 9 5 8

Se Q =

0 0 20 1 2 2 5 5

4 3 5 6

e v = [ 1 4 5] ento,

5 10 15 20 25 2 0 5 8 0 4 3 5 6

2 3

6

0

5

Q(v, : ) =

2

5 5

5 6

e Q( : , v) =

1 9 2

5 10 15 20 25

5 20 25

Reformando matrizes Os elementos de uma matriz podem ser colocados dentro de um vetor ou tambm podem ser agrupados para formar uma matriz com a dimenso diferente da matriz de origem. Suponha uma matriz A4x3; com o comando b = A(:), os elementos da matriz A so armazenados em um vetor coluna b. J com o comando reshape(A,3,4), transformamos a matriz A3x4. Note que o nmero de elementos da matriz nunca pode mudar.

16

Grupo PET Engenharia Eltrica - UFMS Transposta A transposta de uma matriz, obtida colocando-se o nome da matriz seguida de um apstrofo: matriz A4x3 A3x4. Inicializao A inicializao de uma matriz no necessria em MATLAB. Contudo, ela pode ser til em alguns casos: % Este comando cria uma matriz mxn onde A = zeros(m,n) todos os seus elementos so zeros. A = ones (m,n) % Este comando cria uma matriz mxn onde todos os seus elementos so 1s.

Inserindo uma linha ou uma coluna Uma linha ou uma coluna pode ser facilmente inserida em uma matriz j existente. Deve-se atentar para o seguinte detalhe: que o tamanho da linha ou coluna a ser inserida deve ter o mesmo tamanho da linha ou coluna da matriz j existente. Exemplo:1 0 0 2

A= 0 1 00 0 1

,u=[5 6 7]

e v= 341 0 1 0 6 0 0 1 7

Ento A = [A; u] produz A=

0 0 5

, uma matriz 4x3,

1 0 0 2

A = [A,v]

produz

A=

0 1 0 3 0 0 1 4

, uma matriz 3x4,

1 0 0 5

A = [A, u] A = [A u]

produz produz

A=

0 1 0 6 0 0 1 7

, uma matriz 3x4,

um erro. produz B = [ 1 2 3 ], e1 2 3

B = [ ]; B = [B; 1 2 3]

B = [ ]; for k = 1:3, B = [B; k k+1 k+2 ]; end produz B = 2 3 4 3 4 5

17

Grupo PET Engenharia Eltrica - UFMS Deletando uma linha ou coluna Qualquer linha ou coluna de uma matriz pode ser deletada simplesmente atribuindo um vetor nulo mesma. Exemplo: A(2, : ) = [ ] deleta a 2. linha da matriz A. O MATLAB possui alguns utilitrios para a gerao e manipulao de matrizes. Por exemplo: eye (m,n) retorna uma matriz mxn com 1 na diagonal principal. zeros (m,n) retorna uma matriz de zeros mxn. ones (m,n) retorna uma matriz de elementos 1 mxn. rand (m,n) retorna uma matriz mxn com nmero randmicos. diag(v) sendo v um vetor qualquer, gera uma matriz diagonal com o vetor v na diagonal. diag(A) extrai a diagonal principal de uma matriz para um vetor coluna. diag(A,1) extrai a primeira diagonal superior diagonal principal para um vetor coluna. rot90 rotaciona uma matriz em 90. fliplr gira uma matriz da esquerda para a direita. flipud gira uma matriz de cima para baixo. tril extrai a parte triangular inferior de uma matriz. triu extrai a parte triangular superior de uma matriz. reshape muda o formato da matriz. eye(3) ans = 1 0 0 0 1 0 0 0 1

B = [ones(3) zeros(3,2); zeros(2,3) 4*eye(2)] B= 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 0 0 0 4 0 0 0 0 0 4 Cria uma matriz B usando submatrizes elementares: ones, zeros, e a matriz identidade de tamanhos especficos.

18

Grupo PET Engenharia Eltrica - UFMS diag(B)' ans = 1 1 1 4 4 Este comando extrai a diagonal principal da matriz B e a transforma num vetor. Sem a transposta ( ), o resultado seria obviamente uma coluna. O segundo argumento escolhe a diagonal que voc deseja extrair. 0 0

diag(B,1)' ans = 1 1

d = [2 4 6 8]; d1 = [-3 -3 -3]; d2 = [-1 -1]; D = diag(d) + diag(d1,1) + diag(d2,-2) D= 2 -3 0 0 4 -3 -1 0 6 0 -1 0 0 0 -3 8 Cria uma matriz D colocando d na diagonal principal, d1 na primeira diagonal acima da diagonal principal e d2 na segunda diagonal abaixo da diagonal principal.

4.5. CRIANDO VETORES Suponha que voc queira criar um vetor com um nmero grande de elementos, existe um comando que possibilita criar um vetor sem precisar digitar todos os elementos. A frmula geral : v = valor inicial : incremento : valor final Os trs valores acima podem ser expresses vlidas do MATLAB. Caso voc no coloque o incremento, o MATLAB utilizar o valor padro que 1. Exemplo: a = 0:10:100 b = 0:pi/50:2*pi c = 2:10 produz a = [ 0 10 20 ... 100], produz b = [0 pi/50 2*pi/50 ... 2*pi] produz c = [2 3 4 5 ... 10]

Como voc pode perceber, no necessrio utilizar colchetes se um vetor gerado deste modo, entretanto, um vetor atribudo como u = [1:10 33:-2:19] necessita a utilizao de colchetes para fazer a concatenao dos dois vetores [1 2 3 ... 10] e [33 31 29 ... 19]. Finalmente, ns mencionamos o uso de duas funes embutidas freqentemente usadas para gerar vetores:

19

Grupo PET Engenharia Eltrica - UFMS linspace (a, b, n) gera um vetor linearmente espaado de comprimento n de a at b. Exemplo: u = linspace(0, 20, 5) gera u = [0 5 10 15 20]. Ento u = linspace(a, b, n) o mesmo que u = a: (b-a)/(n-1) : b. logspace(a, b, n) gera um vetor logaritmicamente espaada e de comprimento n de 10a at 10b. Exemplo: v = logspace(0, 3, 4) gera v = [1 10 100 1000]. Portanto logspace(a, b, n) o mesmo que 10.^(linspace(a, b, n)). Vetores especiais tais como vetores de 0s ou de 1s de um comprimento especfico, podem ser criados com as funes zero, ones etc. 4.6. OPERAES COM MATRIZES 4.7. OPERAES ARITMTICAS As operaes aritmticas com matrizes s sero vlidas se elas forem matematicamente compatveis, conforme as seguintes condies: A+B ou A-B A*B A/B A^2 vlida se A e B so do mesmo tamanho vlida se o nmero de colunas de A igual ao nmero de linhas de B. vlida e igual a A.B-1 para matrizes quadradas do mesmo tamanho. faz sentido somente se A quadrada; o comando igual a A*A.

Diviso direita: Adicionando diviso esquerda( / ), existe tambm a diviso direita( \ ). Em particular, o comando x = A\ b encontra o valor de b dividido por A. Portanto A\b quase o mesmo que inv(A)*b, mas mais rpido e mais numericamente estvel do que computar inv(A)*b. Ordem de operaes possvel fazer a multiplicao, diviso ou exponenciao elemento por elemento entre matrizes ou vetores de mesmo tamanho colocando um ponto ( . ): .* ./ .\ .^ . Multiplicao de elemento por elemento, Diviso esquerda de elemento por elemento, Diviso direita de elemento por elemento, Exponenciao de elemento por elemento, Transposta no conjugada.

20

Grupo PET Engenharia Eltrica - UFMS Exemplos: u.*v produz [u1v1 u2v2 u3v3 ... ], u./v produz [u1/v1 u2/v2 u3/v3 ...], e u.^v produz [u1v1 u2v2 u3v3 ...]. O mesmo verdadeiro para matrizes. Para duas matrizes de mesmo tamanho A e B, o comando C = A.*B produz uma matriz C com elementos Cij = Aij . Bij. A = [1 2 3;4 5 6;7 8 9]; x = A(1,:)' x= 1 2 3 x'*x ans = 14 x*x' ans = 1 2 2 4 3 6 A*x ans = 14 32 50 A^2 ans = 30 36 42 66 81 96 102 126 150 A.^2 ans = 1 4 9 16 25 36 49 64 81 Exponenciao da matriz A; o mesmo que A*A. 3 6 9 Atribui ao vetor x, a transposta da primeira linha da matriz A.

Produto do vetor linha (x) e do vetor coluna (x); o resultado ser um escalar, pela propriedade da multiplicao de matrizes. A dimenso do resultado ter o nmero de linhas da matriz (x) e o nmero de colunas da matriz (x).

Multiplicao de um vetor por uma matriz.

Neste caso, a exponenciao feita elemento por elemento.

21

Grupo PET Engenharia Eltrica - UFMS 4.8. OPERAES RELACIONAIS H seis operadores relacionais no MATLAB: < >= == ~= menor que menor ou igual que maior que maior ou igual que igual diferente

A relao feita com vetores ou matrizes de mesmo tamanho, com 1 para verdadeiro ou 0 para falso. Exemplos: Se x = [1 5 3 7] e y = [0 2 8 7] ento k=x= y k = x == y k = x ~= y resulta em k = [0 0 1 0] resulta em k = [0 0 1 1] resulta em k = [1 1 0 0] resulta em k = [1 1 0 1] resulta em k = [0 0 0 1] resulta em k = [1 1 1 0] porque xi < yi para i = 3. porque xi yi para i = 3 e 4. porque xi > yi para i = 1 e 2. porque xi yi para i = 1, 2 e 4. porque xi = yi para i = 4. porque xi yi para i = 1, 2 e 3.

4.9. OPERAES LGICAS Existem quatro operaes lgicas: & | ~ xor E lgico OU lgico NO lgico OU exclusivo

Estes operadores trabalham de forma similar aos operadores relacionais. Exemplos: Para dois vetores x = [0 5 3 7] e y = [0 2 8 7], m = (x>y)&(x>4) n = x|y m = ~(x|y) p = xor(x,y) all resulta em m = [0 1 0 0], resulta em n = [0 1 1 1], resulta em m = [1 0 0 0], resulta em p = [0 0 0 0].

No MATLAB existem muitas funes lgicas embutidas, como: verdadeiro (=1) se todos os elementos de um vetor forem verdadeiros. Exemplo: all(x> hL=line(t, sin(t) ); >>get (hL); Color = [0 0 1] EraseMode = normal Linestyle = Linewidth = [0.5] Marker = none MarkerSize = [6] MarkeredgeColor = auto MarkerFaceColor = none Xdata = [(1 by 50) double array] Ydata = [(1 by 50) double array] Zdata = [ ]

49

Grupo PET Engenharia Eltrica - UFMS ButtonDownFcn = Children = [ ] Clipping = on CreateFcn = DeleteFcn = BusyAction = queue HandleVisibility = on Interruptible = on Parent = [3.00037] Selected = off SelectionHighlight = on Tag = Type = line UserData = [ ] Visible = on Estabelecendo os valores das propriedades Voc pode ver a lista de propriedades e seus valores com o comando set (handle). Qualquer propriedade pode ser mudada atravs do comando: set (handle , Nome da Propriedade , Valor da Propriedade) onde Valor da Propriedade pode ser um caracter string ou um nmero. Se o Valor da Propriedade uma string ento ele deve estar entre apstrofos. >>t=linspace(0, pi, 50); >>x=.*sin(t); >>hL=line(t, x); >>set(hL) Color EraseMode: [{normal} | background | xor | none ] LineStyle: [{-} | -- | : | -. | none ] LineWidth Marker: [ + | o | * | . | x | square | diamond .. MarkerSize MarkerEdgeColor: [ none | {auto}] -ou- um ColorSpec. MarkerFaceColor: [{none} | auto] -ou- um ColorSpec. XData YData Zdata ButtonDownFcn Children Clipping: [{on} | off] CreatFcn DeleteFcn BusyAction: [{queue} | cancel]

50

Grupo PET Engenharia Eltrica - UFMS

Agora vejamos dois exemplos: Exemplo-1: Criamos uma linha com um handle explcito e ento usamos o comando set para mudar o estilo da linha, sua espessura, e alguns dos dados. Exemplo-2: Escrevemos algum texto em uma posio especfica (na janela figure), criamos seu handle, e ento usamos o comando set para mudar o tamanho da fonte, a fonte, e a string do texto. Exemplos de Script Cria uma linha simples e retorna o seu handle hL. Sada

t = linspace(0, pi, 50); x = t.*sin(t); hL = line(t,x);

Muda o estilo de linha para tracejado.

set(hL,linestyle,--);

Muda a espessura da linha.

set(hL,linewidth,3);

Muda os valores de algumas coordenadas y. yvec = get(hL, ydata); yvec(25:35) = ones(size(yvec(25:35))); set(hL,ydata,yvec)

51

Grupo PET Engenharia Eltrica - UFMS Escreve algum texto no local (0.5, 0.5) e cria um handle para isso. x = 0.5; y = 0.5; hT = text(x,y,Isso legal, ... erasemode,xor);

Fazer o texto centrado em (0.5, 0.5) e muda a fonte e o tamanho da fonte.

52

Grupo PET Engenharia Eltrica - UFMS

set(hT, horizontal,center,fontsize, 36, ... fontname, symbol); set(gca,visible,off) Agora cria uma apresentao. clf line([0 0 1 1 0], [0 1 1 0 0]); h1 = text(.5, .7, Breve ..., ... fontangle,italic, ... horizontal,center); set(gca,visible,off) h2 = text(.5, .5, 3D-Simulation, ... horizontal, center, ... fontsize, 40, fontname, times, ... fontweight, bold, erase, xor); h3 = text(.5, .4, by, horizontal, center); h4 = text(.5, .3, Stephen Spielberg, ... fontsize, 16, horizontal, center, ... erase, xor); Prximo slide por favor ... set(h1, string, ); set(h2, string, O modelo); set(h3, string, ); set(h4, string, Previses & Idealizaes);

5.16. MODIFICANDO UM GRFICO EXISTENTE Mesmo que voc crie um plot sem explicitamente criar objetos handles, o MATLAB cria handles para cada objeto plotado. Se voc quer modificar algum objeto voc primeiro deve obter seu handle. Aqui onde voc precisa conhecer o parentesco pai-filho entre os vrios objetos grficos. Modificando plots com PropEdit Agora, que voc tem algum entendimento sobre Handle Graphics, objetos handles, e propriedades de objetos, voc pode querer usar o editor grfico point-andclick, PropEdit, existente no MATLAB. Simplesmente digite propedit para ativar o editor. Todos os objetos grficos ativos na janela figure so mostrados com suas propriedades na janela do PropEdit. Voc pode selecionar uma propriedade a partir da lista clicando nela e mud-la no retngulo estreito no centro. Um objeto grfico com um

53

Grupo PET Engenharia Eltrica - UFMS sinal de adio (+) sua esquerda indica que voc pode dar um duplo click nele para ver seus objetos filhos. 5.17. CONTROLE COMPLETO SOBRE O PLANO GRFICO (LAYOUT) Ns encerramos esta seo com um exemplo de colocao arbitrria de eixos e figuras na janela grfica. Com ferramentas Handle Graphics como estas, voc ainda tem controle completo sobre o plano grfico. Aqui esto dois exemplos: Exemplo-1: Placing Insets O seguinte script file mostra como criar mltiplos eixos, size them and place them so that they look like insets. A sada mostrada na figura a seguir. %---------------------------------------------------------% Exemplo de posicionamento grfico com Handle Graphics %---------------------------------------------------------clf t=linspace(0, 2*pi); t(1)=eps; y=sin(t); %--------------------------------------h1=axes(position, [0.1 0.1 0.8 0.8] ); plot(t,y), xlabel(t), ylabel(sint) set(h1, Box, Off ); xh1=get(gca, ylabel ); set(xh1, fontsize, 16, fontweight, bold ) yh1=get(gca, ylabel ); set(yh1, fontsize, 16, fontweight, bold ) %--------------------------------------h2=axes(position, [0.6 0.6 0.2 0.2 ] ); fill(t, y.^2, r ) set(h2, Box, Off ); xlabel(t), ylabel((sin t)^2 ) set(get(h2, xlabel ), FontName, Times ) set(get(h2 , ylabel ), FontName, Times ) %--------------------------------------h3=axes(position, [0.15 0.2 0.3 0.3] ); polar(t, y./ t ); polarch=get(gca, children); set(polarch(1), linewidth, 3) for i=1: length(polarch) if strcmp(get(polarch(i), type ) delete (polarch(i) ) end end 54

Grupo PET Engenharia Eltrica - UFMS %---------------------------------------

5.18. SALVANDO E IMPRIMINDO GRFICOS O jeito mais simples de to get a hardcopy de um grfico digitar print na janela de comando depois que o grfico aparecer na janela figure. O comando print envia o grfico atual da janela figure para a rea de impresso na forma apropriada. Em PCs (rodando o Windows) e MACs voc poderia, alternativamente, ativar a janela figure (trazer frente dando um click na janela) e ento selecionar print a partir do menu. A figura pode tambm ser salva em um arquivo especfico no formato Post Script ou Encapsulated Post Script (EPS). Estes formatos esto disponveis para impressoras preto e branco bem como para impressoras coloridas. O Post Script inclui ambos LEVEL 1 e LEVEL 2 Post Script. O comando que salva grficos para um arquivo tem a forma: Print ddevicetype options filename onde devicetype for postscript printers pode ser um dos seguintes: devicetype ps psc ps2 psc2 Descrio PostScript preto e branco PostScript colorido PostScript preto e branco nvel 2 PostScript colorido nvel 2 devicetype eps epsc eps2 epsc Descrio EPSF Preto e Branco EPSF colorido EPSF Preto e Branco nvel 2 EPSF colorido nvel 2

Por exemplo, o comando: print deps sineplot

55

Grupo PET Engenharia Eltrica - UFMS salva a figura atual no arquivo Encapsulated Post Script sineplot.eps. A extenso .eps automaticamente gerada pelo MATLAB. Os padres do argumento opcional options so append, epsi, Pprinter, e fhandle. Existem vrias outras plataformas de opes dependentes. Veja o on-line help em print para maiores informaes. Em adio ao dispositivo Post Script, MATLAB suporta um nmero de outros dispositivos de impressoras nos sistemas UNIX e PC. Existem aes de dispositivos disponveis para HP Laser Jet, Desk jet, e impressoras Paint jet, DEC LN03, impressoras Epson e outros tipos de impressoras. Veja no on-line help em print para checar a disponibilidade de dispositivos e opes. Other than printer devices, o MATLAB tambm pode gerar um arquivo grfico nos seguintes formatos: -dill -djpeg -dtiff -dmfile salva o arquivo no formato Adobe Illustrator salva o arquivo como uma imagem JPEG salva o arquivo como uma imagem comprimida TIFF salva o arquivo como um M-file com grficos handles

Agora, possvel salvar um arquivo grfico como uma lista de comandos (um M-file), restaurar o grfico depois, e modific-lo. Para salvar os grficos na janela ativa atual, digite: Print filename dmfile Depois, para abrir o grfico novamente, simplesmente execute o arquivo que voc criou. O formato Adobe Illustrator completamente til se voc quer dar um retoque ou modificar a figura de forma que fica muito difcil faz-lo no MATLAB. claro, voc deve ter acesso ao Adobe Illustratror para estar apto a abrir e editar o grfico salvo. O aspecto mais desagradvel das verses anteriores s do MATLAB 5 era a falta de facilidade para escrever subescritos e sobrescritos e misturar fontes nas legendas. A partir do MATLAB 5 este problema foi resolvido incorporando um subconjunto de comandos LATEX, os quais podem ser usados em rtulos e textos. Se voc no conhece LATEX, vale a pena consultar o MATLAB helpdesk para ver a lista de comandos e suas sadas. 5.19. ANIMAO Todos ns sabemos o impacto visual da animao. Se voc tem uma grande quantidade de dados representando uma funo ou um sistema em vrias seqncias de tempo, voc pode desejar aproveitar a capacidade do MATLAB animar seus dados. Existem trs tipos de ferramentas de animao no MATLAB. 1. Comet pot: Esta a mais simples e mais restrita ferramenta para exibir um grfico de linha 2-D ou 3-D como uma animao. O comando comet (x , y) plota os dados em vetores x e y com um cometa se movendo. Ento, preferivelmente do que ver o conjunto todo do plot aparecer na tela de uma vez, voc pode ver o grfico sendo plotado. Esta ferramenta pode ser utilizada na visualizao de trajetrias em um phase planes. Como um exemplo veja o demo embutido on the Lorenz attractor.

56

Grupo PET Engenharia Eltrica - UFMS 2. Movies: Se voc tem uma sequncia de grficos que voc gostaria de animar, use a ferramenta embutida movie. A idia bsica armazenar cada figura como um pedao de filme, frame, com cada frame armazenado como um vetor coluna de uma grande matriz chamada M, e ento executar os frames na tela com o comando movie (M). Um frame armazenado em um vetor coluna usando-se o comando getframe. Para um eficiente armazenamento voc deveria primeiro inicializar a matriz M. O comando embutido moviein fornecido precisamente para esta inicializao, embora voc mesmo possa faz-la. Um exemplo de script file que faz um movie pode ser visto a seguir:% ---- Esqueleto de um script % nframes = 36; Frames = moviein(nframes); for i = 1:nframes, . . . x = ....; y = ....; plot(x,y) Frames(:,i) = getframe; end movie(Frames,5) file para gera e mostra uma animao.---% nmero de quadros na animao. % inicializa a matriz 'Frames'. % Voc pode ter clculos aqui para % gerar dados.

% Voc pode usar alguma funo plot % Armazena a figura atual em um quadro. % passa a animao armazenada % em quadros 5 vezes.

3. Handle Graphics: Uma outra forma, e talvez a forma mais verstil de criar animaes usar a ferramenta Handle Graphics. A idia bsica aqui plotar um objeto na tela, pegar seu handle para mudar as propriedades desejadas do objeto (mais comumente os valores do seu xdata e ydata), e plotar novamente o objeto numa seqncia de vezes selecionada. Existem duas coisas importantes a saber para estar apto a criar animaes usando Handle Graphics: O comando drawnow, o qual transporta os grficos para a tela de sada sem aguardar o controle retornar para o MATLAB. O on-line help explica como funciona o drawnow. A propriedade do objeto erasemode o qual pode ser ajustado para normal, background, none, ou xor para controlar o aparecimento do objeto quando a tela grfica redesenhada. Por exemplo, se um script file contendo as seguintes linhas de comando executado: h1= plot (x1 , y1 ,erasemode, none); h2= plot (x2 , y2 ,erasemode,xor); . . newx1= ...; newy1= ...; newx2= ...; newy2= ...; . . set (h1 ,xdata, newx1 ,ydata, newy1); set (h2 ,xdata, newx2 ,ydata, newy2);

57

Grupo PET Engenharia Eltrica - UFMS . . ento o primeiro comando set desenha o primeiro objeto com o novo xdata e ydata, mas o mesmo objeto desenhado antes permanece na tela, enquanto que o segundo comando set redesenha o segundo objeto com o novo dado e tambm apaga o objeto desenhado com os dados anteriores x2 e y2. Assim possvel manter alguns objetos fixados na tela enquanto outros objetos mudam a cada passagem de controle. Agora, vejamos alguns exemplos que ilustram o uso do Handle Graphics em animaes. Exemplo-1: Uma bolha se move atravs de um caminho circular: A idia bsica primeiro calcular as diferentes posies da bolha ao longo do caminho circular, desenhar a bolha como um ponto na posio inicial e criar seu handle para determinar a coordenada x e y da bolha compreendendo todos os valores pertencentes circunferncia. A propriedade erasemode da bolha ajustada para xor (Exclusive or) assim a bolha anterior apagada da tela quando a nova bolha desenhada. Execute o seguinte script file:% Script file para animar um movimento circular de uma bolha. % -----------------------clf theta = linspace(0, 2*pi, 100); x = cos(theta); y = sin(theta); hbolha = line(x(1),y(1),'marker','o', ... 'markersize',8, ... 'erase','xor'); % Desenha a bolha nas sua condies iniciais. axis([-1 1 -1 1]); axis('square'); for k = 2:length(theta), set(hbolha,'xdata',x(k), ... 'ydata',y(k)); drawnow % Desenha a bolha em uma nova posio.

end

58

Grupo PET Engenharia Eltrica - UFMS Exemplo-2: A bolha se move ao redor de um caminho circular e deixa seu rasto: No exemplo-1 acima, a bolha se move no caminho circular, mas no deixa vestgios de que ela passou por ali. Para ficar evidente, ns podemos fazer a bolha deixar um rasto quando se move. Para tanto, ns basicamente desenhamos a bolha duas vezes, uma vez como uma bolha (com uma marca de maior tamanho) e uma vez como um ponto em cada posio. Mas ns ajustamos a propriedade erasemode do ponto para none, assim este ponto (a posio anterior da bolha) permanece na tela enquanto a bolha se move e assim cria o rasto da bolha.% Script file para animar um movimento circular de uma bolha. % Quando ela se move, ela deixa um rasto. % -----------------------clf theta = linspace(0, 2*pi, 100); x = cos(theta); y = sin(theta); hbolha = line(x(1),y(1),'marker','o','markersize',8,'erase','xor'); hrasto = line(x(1),y(1),'marker','.','color','r','erase','none'); axis([-1 1 -1 1]); axis('square'); for k = 2:length(theta), set(hbolha,'xdata',x(k),'ydata',y(k)); set(hrasto,'xdata',x(k),'ydata',y(k)); drawnow end

Exemplo-3: Um pndulo de barra oscila em 2-D: Aqui est um slightly mais complicado exemplo. Ele envolve animao do movimento de um pndulo em barra determinado pela EDO + sen = 0. Agora que voc est familiarizado com definio de objetos grficos e usar seus handles para mudar sua posio, a adio da complicao da resoluo de uma equao diferencial no seria to difcil.% ---- script file para animar um pendulo simples ---------------clf % limpa a figura data = [0 0; -1.5 0]; % coordenadas dos pontos finais da barra. phi = 0; % orientao inicial. R = [cos(phi) -sin(phi); sin(phi) cos(phi)]; % rotao da matriz data = R*data; axis([-2 2 -2 2]) % seleciona os limites dos eixos. axis('equal') %---- define oo objetos chamados bar, hinge e path. Bar = line('xdata',data(1,:), ... 'ydata',data(2,:),'linewidth',3,'erase','xor'); hinge = line('xdata',0,'ydata',0,'marker','o','markersize',[10]); path = line('xdata',[],'ydata',[],'marker','.','erasemode','none'); theta = pi-pi/1000; thetadot = 0; dt = .1; tfinal=50; t=0; % ngulo inicial. % velocidade angular inicial. % tempo de passo, tempo final e inicial.

%-----Mtodo de Euler para integrao numrica.

59

Grupo PET Engenharia Eltrica - UFMSwhile(t> [detA, y] = solvexf(1) ; >> detA ans = 64 >> y ans = -0.0312 0.2344 1.6875 % Mostra o valor de y Os valores de detA e y sero automaticamente mostrados se o ponto e vrgula no final da funo de comando executada for omitido. % Pega r=1 e executa solvexf.m % Mostra o valor de detA

Aps a execuo de uma funo, as nicas variveis deixadas na rea de trabalho pela funo sero as variveis de sada da lista. Isto nos da um maior controle da entrada e sada do que ns podemos conseguir com arquivos script. Ns podemos tambm incluir checagem de erros e mensagem dentro das funes. Por exemplo, ns poderamos modificar a funo acima para checar se a matriz A vazia ou no e mostrar uma mensagem apropriada antes de resolver o sistema, mudando a ltima linha para: if isempty(A) % se a matriz A for vazia disp(A matriz A vazia); else % se A no for vazia x = A\ b ; % encontra x end % fim da declarao if 65

Grupo PET Engenharia Eltrica - UFMS 6.4. MAIS SOBRE FUNES At agora a diferena entre scripts e funes devia estar clara para voc. As variveis dentro de uma funo so locais e so apagadas aps a execuo da funo. Mas as variveis dentro de uma arquivo script so deixadas na rea de trabalho do MATLAB aps a execuo do script. Funes podem ter argumentos, j os arquivos script no. E quanto as funes dentro de uma outra funo? Elas so locais? Como elas so executadas? Uma funo pode ser passada como uma varivel de entrada para uma outra funo? Agora ns vamos esclarecer essas questes. Executando uma funo dentro de uma outra funo Na funo solvexf acima, ns usamos uma funo embutida, det, para calcular o determinante de A. Ns usamos a funo justamente do modo que ns a usaramos no prompt do MATLAB ou no arquivo script. Isto verdade para todas as funes embutidas ou escritas pelo usurio. A histria diferente somente quando voc quer que o nome da funo seja dinmico, isto , se a funo a ser executada dentro puder ser diferente com diferentes execues da funo de chamada. Em tais casos, o atual nome da funo passado para a funo denominada atravs de uma lista de entrada e de um nome fictcio que usado dentro da funo de chamada. O mecanismo de passar o nome da funo e avali-la dentro de uma funo de chamada bem diferente daquele para uma varivel. Ns explicaremos isto logo abaixo. Uma funo na lista de entrada Quando uma funo precisa ser passada na lista de entrada de uma outra funo, o nome da funo a ser passada precisa aparecer como um caractere string, na lista de entrada. Por exemplo, a funo embutida fzero encontra um zero de uma funo fornecida pelo usurio de uma varivel simples. A chamada sintaxe da funo fzero (f,x) onde f o nome da funo e x uma incgnita inicial. Se ns escrevermos a funo fr3 (salvada como fr3.m) para resolve-la, dizemos, f(r) = r3 32*5r2 + (r 22)r + 100, ns podemos denominar fzero com a declarao fzero(fr3, 5). Note os apstrofos entre o nome da funo fr3 de entrada. Avaliando uma funo com Feval A funo feval avalia uma funo cujo o nome especificado como uma string na dada lista de variveis de entrada. Por exemplo [y , z] = feval(Hfunction , x, t); avalia a funo Hfunction nas variveis de entrada x e t e retorna a sada em y e z. Isto equivalente a escrever [y, z] = Hfunction (x,t). Ento porque voc alguma vez avaliaria uma funo usando feval quando voc pode avaliar a funo diretamente? O uso mais comum quando voc quer avaliar funes com diferentes nomes mas na mesma lista de entrada. Considere a seguinte situao. Voc quer avaliar alguma dada funo de x e y na origem x = 0, y = 0. Voc pode escrever um arquivo script com um comando do seguinte modo: value = feval (funxy, 0, 0); Este comando o mesmo que escrever, value = funxy(0, 0). Agora suponha que Harry tem uma funo z(x,y) = sinxy + xy2, programada como:

66

Grupo PET Engenharia Eltrica - UFMS

function z = harrysf(x,y) % funo para avaliar z(x,y) z = sin(x*y) + x*y^2; e Kelly tem uma funo h(x,y) = 20xy 3y3 2x3 + 10, programada como: function z = kellysf(x,y) % funo para avaliar h(x,y) h = 20*x*y 3*y^3 2*x^3 + 10; Ambas as funes podem ser avaliadas com seu arquivo script mudando o nome funxy para harrysf e kellysf, respectivamente. A questo aqui que o comando no seu arquivo script leva nomes de arquivos dinmicos. O uso de feval torna-se essencial quando a funo passada como uma varivel de entrada para uma outra funo. Em tais casos, a funo passada como a varivel de entrada deve ser avaliada usando feval dentro da funo de chamada. Por exemplo, os solucionadores de ODE (ordinary differential equation) ode23 e ode45 levam funes definidas pelo usurio como entradas nas quais o usurio especifica a equao diferencial. Dentro de ode23 e ode45, a funo de definida pelo usurio avaliada no tempo corrente t e no valor corrente de x para computar a derivada x usando feval, ode23 e ode45 so arquivos M, os quais voc pode copiar e editar. Faa o printout de um deles e veja como ele usa feval. Escrevendo boas funes Escrever boas funes no MATLAB mais fcil do que escrever funes na maioria dos programas de linguagem padro, ou, para devido interesse, na maioria dos pacotes de software que suportam seus prprios programas de desenvolvimento. Entretanto, escrever eficientes e elegantes funes uma arte que se consegue apenas atravs da experincia. Para iniciantes, manter os seguintes pontos em mente ajuda: Algoritmo: Antes de voc comear a escrever uma funo, escreva um algoritmo. Ele essencialmente uma funo inteira no portugus simples. Pense sobre a estrutura lgica e a seqncia de computaes, defina a entrada e a sada de variveis, escreva a funo em simples palavras e ento comece a traduo na linguagem MATLAB. Clareza: Selecione um nome sensato para a funo e as variveis dentro dela. Escreva comentrios no corpo da funo. Esboce e escreva um comentrio til para uma ajuda on-line (as linhas de comentrio devem ser escritas no comeo de uma funo). Verifique se voc incluiu a sintaxe de como usar a funo. Modularidade: Mantenha sua funo modular, isto , divida grandes clculos em pedaos menores (sub-rotinas) e escreva funes separadas para eles. Mantenha suas funes pequenas em comprimento. Robustez: Providencie checagem para erros e sada com teis mensagens de erros.

67

Grupo PET Engenharia Eltrica - UFMS Expansibilidade: O programador deve prever uma expanso do programa. Por exemplo, se voc est escrevendo uma funo com variveis escalares, mas voc acha que pode usar variveis vetoriais depois, escreva a funo com isto em mente. 6.5. SUB-FUNES O MATLAB 5 admite que vrias funes sejam escritas em um nico arquivo. Enquanto esta facilidade til de um ponto de vista de organizao de arquivo, vem com severas limitaes. Todas as funes escritas aps a primeira funo no arquivo so tratadas como sub-funes e no esto disponveis para o mundo l fora. Isto significa que enquanto a primeira funo pode acessar todas suas sub-funes e as subfunes escritas no mesmo arquivo podem tambm acessar uma a outra, funes de fora do arquivo no podem acessar essas sub-funes. 6.6. FUNES COMPILADAS (ANALISADAS): P-CODE Quando uma funo executada no MATLAB, cada comando da funo primeiramente interpretado pelo MATLAB e ento traduzido para um nvel de linguagem mais baixo. Este processo chamado parsing. No exatamente como compilar uma funo em C ou Fortran mas, superficialmente, um processo similar. O MATLAB 5 permite que voc salve uma funo analisada para uso posterior. Para analisar uma funo dita projectile, que existe em um arquivo M chamado projectile.m, digite o comando. pcode projectile Este comando gera uma funo analisada que salva em um arquivo projectile.p. Na prxima vez em que voc chamar a funo projectile, o MATLAB diretamente executa a funo pr-analisada. Para todas as funes de tamanho moderado, salva-las como funes analisadas no gastam tanto tempo durante a execuo como voc poderia pensar. O analisador do MATLAB rpido o suficiente para reduzir o tempo gasto na anlise a uma frao de tempo desprezvel. O melhor uso de p-codes, talvez, proteger suas propriedades corretas quando voc envia suas funes para outras pessoas. Enviando pcodes, os receptores podem execut-los mas no podem modific-los. 6.7. O PROFILER Para avaliar a performance das funes, o MATLAB 5 possui uma ferramenta chamada profiler. O profiler mantm o rastro do tempo gasto em cada linha da funo (em unidades de 0.01 segundos) assim que a funo executada. O profiler mostra quanto tempo quanto tempo foi gasto em cada linha. A sada do profiler podem tambm ser vista graficamente. O profiler surpreendentemente fcil de usar. Vejamos um falso exemplo. Para desenhar uma funo chamada projectile, digite os seguintes comandos: profile projectile % ativa o profiler no projectile.m

68

Grupo PET Engenharia Eltrica - UFMS [a,b] = profile profile profile projectile (v, theta) % executa a funo projectile report % mostra as informaes do profiler plot % mostra a informao graficamente done % obrigado, tchau

Observao: O profiler pode ser usado somente em funes (no scripts) e nessas funes que existem como arquivos M. Ento, voc no pode esboar funes embutidas que no so providas como arquivos M. 6.8. CARACTERSTICAS ESPECFICAS DA LINGUAGEM Foram discutidas vrias caractersticas da linguagem do MATLAB atravs de muitos exemplos nas sees anteriores. Voc advertido a prestar uma ateno especial ao uso formal de sinais de pontuao e diferentes delimitadores, operadores, especialmente a ordem dos operadores ( um ponto (.) precedendo os operadores aritmticos, e os operadores relacionados para controle de fluxo, o MATLAB provido de laos for e while, e if-elseif-eslse e um switch-case-otherwise. Todo o controle de fluxo das declaraes devem terminar com a correspondente declarao end. Ns agora discutiremos o controle de fluxo e algumas outras caractersticas da linguagem. Veja a ajuda on-line para mais detalhes. 6.9. O USO DE COMENTRIO PARA CRIAR AJUDA ON-LINE Como j foi mostrado na discusso sobre funes, as linhas de comentrios no princpio (antes de qualquer declarao executvel) de um script ou uma funo so usadas pelo MATLAB como a ajuda on-line sobre o arquivo. Este automaticamente cria a ajuda on-line para funes escrita pelo usurio. Isto uma boa idia para reproduzir a linha de definio de funo sem a palavra function entre essas primeiras poucas linhas de comentrio de forma que a sintaxe de execuo da funo exibida pela ajuda on-line. O comando lookfor procura o argumento string na primeira linha comentada dos arquivos M. Portanto, de acordo com a conveno um pouco confusa das funes embutidas do MATLAB, voc deveria escrever o nome do script ou funo no caso acima com letras seguidas por uma curta descrio com palavras chaves, como a primeira linha comentada. Veja o exemplo abaixo. % SOLVEX resolve uma matriz de equao 3x3 com parmetro r. 6.10. CONTINUAO Trs pontos consecutivos (...) ao trmino de uma linha denota continuao. Logo, se voc digita um comando que no cabe em uma nica linha, voc pode dividi-lo em duas ou mais linhas usando os trs pontos no final de cada linha exceto na ltima linha. Exemplos: A = [1 3 3 3; 5 10 2 20; 3 5 ... 10 2; 1 0 0 9];

69

Grupo PET Engenharia Eltrica - UFMS x = sin(linspace(1,6*pi,100)) .* cos(linspace(1,6*pi,100)) + ... 0.5*ones(1,100) ; plot(comprimento do tubo, presso do fluido,: ,comprimento do tubo, ... presso terica, -) Voc no pode, entretanto, usar o recurso continuao dentro de um caracter string. Por exemplo, digitando logo = Eu no sou somente o Presidente da empresa, ... mas tambm um cliente; produz um erro. Para criar strings longas, quebre a string em pequenos segmentos de string e use concatenao. 6.11. VARIVEIS GLOBAIS possvel declarar um jogo de variveis para ser globalmente acessvel para todas ou algumas funes sem declarar as variveis na lista de entrada das funes. Isto feito com o comando global. Por exemplo, a declarao global x y z declara as variveis x, y e z para serem globais. Esta declarao deve estar antes de qualquer declarao executvel nas funes e scripts que precisam acessar valores de variveis globais. Tenha cuidado com os nomes das variveis globais. aconselhvel utilizar longos nomes para tais variveis com o fim de evitar semelhana com outras variveis locais. Exemplo: Considere a resoluo da seguinte EDO de 1 ordem. . x(0) = 1.0 x = kx + csint, onde voc est interessado em solues para vrios valores de k e c. Seu arquivo script pode parecer: % scriptfile para resolver a EDO de 1-ordem . ts = [0 20]; % intervalo de tempo = [t_0 t_final] x0 = 1.0 ; % especfica a condio inicial [t, x] = ode23(ode1, ts,x0); % executa ode23. e a funo ode1 pode parecer: funo xdot = ode1(t,x); % EDO1: funo para computar a derivada xdot % dados t e x. % sintaxe chamada: xdot = ode1 (t,x); % ------------------xdot = k*x + c*sin(t); Isto, entretanto, no funcionar. De fato para ode1 computar xdot. os valores de k e c devem estar prescritos. Esses valores podiam ser prescritos dentro da funo ode1 mas voc teria de editar essa funo a cada vez que voc mudar os valores de k e c. 70

Grupo PET Engenharia Eltrica - UFMS Uma alternativa prescrever os valores na arquivo script e faz-los disponveis para a funo ode1 atravs de uma declarao global.

% scriptfile para resolver EDO de1 ordem. global k_value c_value % declara variveis globais. k_value = 5; c_value = 2 ; % valor das variveis t0 = 0 ; tf = 20 ; % tempo inicial e final x0 = 1.0 ; % especfica a condio inicial [t, x] = ode23(ode1, t0,x0); % Resolve a EDO. Agora voc pode modificar a funo ode1 e desse modo pode acessar as variveis globais. function xdot = ode1(t,x) ; % EDO1: funo para computar a derivada xdot % dados t e x. % sintaxe chamada: xdot = ode1 (t,x); % ------------------global k_value c_value xdot = k_value*x + c_value*sin(t) Dessa forma, se os valores de k_value e c_value for mudado no arquivo script, os novos valores tornam-se disponveis para ode1 tambm. Observe que a declarao global somente no script e na funo do usurio ode1, portanto k_value e c_value estaro disponveis somente para esses arquivos. 6.12. LAOS, RAMIFICAES E CONTROLE DE FLUXO O MATLAB tem sua prpria sintaxe para declaraes de controle de fluxo como o lao for, lao while e claro, if-elseif-else. Alm do mais, ele prove trs comandos break, error, e return para controlar a execuo de scripts e funes. Abaixo descreveremos cada uma dessas funes. Lao For: Um lao usado para repetir uma declarao ou um grupo de declaraes por um nmero fixo de vezes. Temos aqui dois exemplos: Exemplo 1: for m = 1:100 Num = 1/(m+1) end

O contador no lao for pode tambm ser especificado: for = m:k:n para avanar o contador i em relao a k a cada vez (no exemplo abaixo n vai de 100 a 0 da

71

Grupo PET Engenharia Eltrica - UFMS seguinte forma 100, 98, 96, ..., etc.). Voc pode ter laos for abrigados, isto , colocar laos for dentro de laos for. Todo for, entretanto, deve ser terminado com um end. Exemplo 2: for n = 100:-2:0, k = 1/(exp(m)), end

Lao While: Um lao while usado para executar uma declarao ou um grupo de declaraes para um nmero indefinido de vezes at que a condio especificada por while no seja satisfeita. Por exemplo: % Vamos encontrar todos as potncias de 2 abaixo de v=1; i=1; while num < 10000 num = 2^i ; v = [v ; num] ; i = i +1 ; end 10000

Novamente, um lao while deve ter um end fechando o lao. Declaraes If-elseif-else : Esta construo prov uma ramificao lgica para computao. Por exemplo: if i > 5 ; k=i; elseif (i >1) & (j == 20) k = 5*i + j ; else k = 1; end Voc pode colocar a declarao if, contanto que voc feche o lao com a declarao end. Voc pode colocar todos os trs tipos de laos, em uma combinao. Switch-case-otherwise: Essa construo ( uma caracterstica do MATLAB 5.x) que prove uma outra ramificao lgica para computao. Uma varivel usada como uma chave e os valores da varivel fazem com que os diferentes casos sejam executados. A sintaxe geral : switch varivel case valor1 1 bloco de comandos case valor2 2 bloco de comandos otherwise

72

Grupo PET Engenharia Eltrica - UFMS ltimo bloco de comandos end Neste exemplo, o primeiro bloco de comandos executado se a varivel for igual ao valor 1; o segundo bloco de comandos executado se a varivel for igual ao valor 2. Caso a varivel no combine com nenhum dos casos o ltimo bloco de comandos executado. O switch pode ser usado como uma varivel numrica ou uma varivel string. Vamos ver um exemplo mais concreto usando uma varivel string com o comando switch. switch cor case vermelho c = [1 0 0]; case verde c = [0 1 0]; case azul c = [0 0 1]; otherwise error(escolha de cor invlida) end Break O comando break dentro de um lao for ou while termina a execuo do lao, at mesmo se a condio do lao for verdadeira. Exemplos: 1. for i = 1: length (v) if u(i) < 0 % verifica para u negativo break % termina a execuo do lao end a = v(i) + ......................... % faz alguma coisa end 2. while 1 n = input(Entre com o n mximo de interaes ) if n >, muda para k>> para mostrar o status especial. Neste ponto, voc pode checar variveis j computadas, mudar seus valores e editar qualquer comando MATLAB vlido. O controle retornado funo digitando a palavra return no prompt especial k>> e pressionando enter. Este comando til para funes que eliminam erros (debugging functions). s vezes, em grandes algoritmos, voc pode querer checar alguns resultados intermedirios, plot-los e ver se a colocao dos dados no algoritmo est seguindo uma ordem logicamente correta, e ento deixar que a execuo continue. Exemplo: % EXKEYBRD: um arquivo de script como exemplo de comando no % teclado % -----A = ones(10) for i=1:10 disp(i) A(:,i) = i*A(:,i); if i= =5 keyboard end end % monta uma matriz 10x10 de 1s % % % % mostra o valor de I remaneja a i-sima coluna de A quando i = 5 retorna o controle do teclado

Durante a execuo do script acima (exekeybrd.m) o controle retornado ao teclado quando o valor do contador i alcana 5. A execuo do procedimento recomea aps o controle ser retornado ao arquivo script digitando return no prompt especial k>>. Menu O comando menu(Nome do menu, opo 1,opo 2...) cria um menu na tela com o Nome do menu e lista as opes no menu. O usurio pode selecionar qualquer opo pelo mouse ou pelo teclado, dependendo do computador. A

75

Grupo PET Engenharia Eltrica - UFMS implementao desse comando em MACs e PCs cria menus de janelas interessantes com botes.

Exemplo: % Plotando um crculo r = input(Entre com o raio desejado: ); theta = linspace(0, 2*pi, 100); r = r*ones(size(theta)); %faz r do mesmo tamanho de theta. coord = menu(Plotagem de Crculo, Cartesian, Polar); if coord == 1 % Se a primeira opo do menu for % selecionada plot(r.*cos(theta), r.*sin(theta)) axis(square) else % Se a segunda opo do menu for % selecionada polar(theta, r); end No exemplo acima, o comando menu cria um menu com o nome Plotagem de Crculo e duas opes: Cartesiano e Polar. As opes so internamente numeradas. Quando o usurio seleciona uma das opes, o nmero correspondente passado para a varivel coord. O lao if-else no script mostra (atravs do comando menu) o que fazer com cada opo. Pause Este comando temporariamente pra o processo em decorrncia. Pode ser usado com ou sem um argumento opcional: pause pra o processo em andamento e espera o usurio dar o sinal de v em frente. Pressionando qualquer tecla reinicia-se o processo. pause(n) Pra o processo em andamento, por n segundos, e ento recomea o processo.

Exemplo: for i = 1:n, plot(X(:,i),Y(:,i)), pause(5), end pra por 5 segundos antes de plotar o prximo grfico.

76

Grupo PET Engenharia Eltrica - UFMS 6.14. RECURSION A linguagem do MATLAB suporta recursion, isto , uma funo pode chamar a si prpria durante sua execuo. Assim, algoritmos recursivos podem ser diretamente implementados no MATLAB.

6.15. ENTRADA/SADA O MATLAB suporta vrias funes I/O de arquivos de linguagem C padro para leitura e escrita de binrios formatados e arquivos de texto. As funes suportadas incluem: Fopen Abre um arquivo existente ou cria um novo Fclose Fecha um arquivo aberto Fread L dados binrios de um arquivo Fwrite Escreve dados binrios para um arquivo Fscanf L strings em formato especificado Fprintf Escreve dados em um string formatado Fgets L uma linha de um arquivo excluindo NEW-LINE CHARACTER Fgetl L uma linha de um arquivo incluindo NEW-LINE CHARACTER Frewind rebobina um arquivo Fseek Escolhe o indicador de posio do arquivo Ftell D a indicao correta da posio do arquivo Ferror Investiga o status de erro do arquivo I/O J satisfatrio usar os seis primeiros comandos listados acima. Para a maioria dos propsitos fopen, fprintf e fclose so suficientes. Este um exemplo simples que usa fopen, fprint e fclose para criar e escrever dados formatados para um arquivo: % TEMTABLE gera e escreve a tabela de temperatura % Arquivo script para gerar uma tabela de temperatura. % A tabela est em um arquivo chamado Temperature.table. %--------------------------------------------------------F = -40:5:100; C = (F - 32)*5/9; t = [F; C]; fid = fopen(Temperature.table, w); fprintf(fid, Temperature.table\n ); fprintf(fid,~~~~~~~~~~~~~~\n); fprintf(fid, Fahrenheit Celsius\n); fprintf(fid, %4i %8.2f\n, t); fclose(fid); No arquivo de script acima, o primeiro comando I/O, fopen, abre um arquivo temperature.table no modo de escrita (write) especificado por um w no comando e

77

Grupo PET Engenharia Eltrica - UFMS designa o identificador de arquivo para fid. Os seguintes fprintf usam fid para escrever as strings e os dados no arquivo em questo. Os dados so formatados de acordo com as especificaes no argumento-string de fprintf. No comando acima, \n insere uma nova linha, %4i insere um campo ntegro de largura 4, e %8.2f insere um ponto fixo de largura 8 e 2 casas decimais aps a vrgula. O arquivo de sada, Temperature.table, mostrado abaixo. Note que a matriz de dados t tem duas filas, no qual o arquivo de sada escreve a matriz em 2 colunas. Isto porque t lida columnwise (coluna sbia) e ento escrito no formato especificado (2 linhas em cada coluna). Temperature Table ~~~~~~~~~~~~~~ Fahrenheit Celsius -40 -40.00 -35 -37.22 -30 -34.44 -25 -31.67 -20 -28.89 -15 -26.11 -10 -23.33 -5 -20.56 0 -17.78 5 -15.00 10 -12.22 15 -9.44 20 -6.67 25 -3.89 30 -1.11 35 1.67 40 4.44 45 7.22 50 10.00 55 12.78 60 15.56 65 18.33 70 21.11 75 23.89 80 26.67 85 29.44 90 32.22 95 35.00 100 37.78

78

Grupo PET Engenharia Eltrica - UFMS

6.16. OBJETOS DE DADOS AVANADOS No MATLAB 5 alguns e novos objetos de dados foram introduzidos, nomeados estruturas e clulas. Alm disso, o mais familiar objeto de dados, a matriz, foi transformada agora ela pode ser multidimensional. Embora uma detalhada discusso desses objetos e suas aplicaes alm do espao imaginvel no tenham ainda sido abrangidos nessa apostila, nesta seo dar-se- uma introduo suficiente para que o usurio se sinta inicialmente preparado. A princpio, esses objetos parecem ser bem diferentes do principal elemento do MATLAB, a matriz. O fato, entretanto, que esses objetos, bem como a matriz, so somente casos especiais do tipo fundamental de dados, o vetor. Eles se encaixam em seus lugares corretos e comea-se a trabalhar com eles do mesmo modo que com vetores e matrizes. 6.17. MATRIZES MULTIDIMENSIONAIS O MATLAB 5 suporta matrizes multidimensionais. Voc pode criar matrizes de dimenso n especificando n ndices. As funes de criao das matrizes usuais, zeros, ones, rand e randn aceitam n ndices para criar tais matrizes. Por exemplo: A = zeros (4, 4, 3) B = rand (2,4,5,6) inicializa uma matriz A 4x4x3 com todos os elementos nulos cria uma matriz aleatria B 2x4x5x6 (na 4 dimenso!)

fcil visualizar uma matriz 2-D. H como escreve-la em uma folha plana (uma pgina). J matrizes 3-D seriam um pouco mais complexas. Imaginemos (l, c, p). O primeiro termo indicaria o nmero de linhas, o segundo o nmero de colunas, e o terceiro indicaria o nmero de pginas em que seriam escritas p matrizes l x c. Assim, A = zeros (4, 4, 3) poderia ser representado por 3 pginas, cada uma delas contendo uma matriz 4 x 4 cheia de zeros. Agora, suponhamos que se queira mudar o termo da quarta linha e quarta coluna da matriz na pgina 2. Ento, escrevemos, no MATLAB, A(4, 4, 2) = 6. ento, as regras usuais de ordenao se aplicam: Deve-se unicamente pensar qual matriz no total de pginas est sendo acessada. Podemos associar ento a terceira dimenso a um caderno cheio de pginas que representam o 2-D. Assim fica fcil expandir o conceito de dimenses para matrizes. Pensemos em uma prateleira com n cadernos (4-D), uma estante com n1 prateleiras (5-D), uma sala com n2 estantes (6-D), um bloco com n3 salas (7-D), um prdio com n4 blocos (8-D), e assim por diante. Assim voc pode acessar qualquer matriz 2-D nesse conjunto. Por exemplo, para acessar o elemento a11 de cada pgina de cada caderno de cada prateleira de cada estante de cada sala de cada bloco de cada prdio, escreve-se C(1, 1, :, :, :, :, :, :, :). As regras de ordenao se aplicam em cada dimenso. Portanto, voc pode acessar submatrizes com ndices variveis do mesmo modo como voc faria para acessar uma matriz 2-D. Quando se opera em matrizes multidimensionais deve-se ser cuidadoso. Todas as funes de lgebra linear so aplicadas a matrizes 2-D. No se pode multiplicar matrizes de dimenses diferentes, e nem mesmo que sejam da mesma dimenso, mas

79

Grupo PET Engenharia Eltrica - UFMS diferente de 2-D. Porm, todas as operaes elemento por elemento so vlidas para qualquer dimenso. (Ex: 5*A, sin (A), log (A)). Tambm operaes A+B e A-B so aceitas, desde que as dimenses sejam iguais entre si. 6.18. ESTRUTURAS OU REGISTROS Uma estrutura uma construo de dados cujo agrupamento denominado campo. Diferentes campos podem conter diferentes tipos de dados, mas um nico campo deve conter dados do mesmo tipo. Uma estrutura um registro. Um registro (estrutura) pode conter uma informao (dados) sobre vrios assuntos de diferentes ttulos (campos). Por exemplo, voc poderia manter um livro de registros com uma pgina dedicada a cada um de seus parentes. Voc poderia listar informaes para cada um deles sob os ttulos: grau de parentesco, nome, telefone, filhos (quantos), filhos (nomes), etc. Embora os ttulos sejam os mesmos em cada registro, a informao contida nos ttulos diferente para cada registro. Implementar esse registro no MATLAB montar uma estrutura. O melhor que no h limites para a quantidade de registros dentro do livro de registros. Vejamos um exemplo de estrutura. Est sendo feita uma estrutura chamada Turma com os campos curso, prof e notas. Deseja-se registrar os nomes dos cursos, de seus professores correspondentes e sua performance no curso: Turma.curso = eletrica2003; Turma.prof = Paulo; Turma.notas = [80 75 95]; Assim, campos so indicados adicionando seus nomes aps o nome da estrutura, separados por um ponto (.). Os campos so valores designados simplesmente como uma outra varivel no MATLAB. No exemplo acima, os campos curso e notas contm um vetor de nmeros. Agora, como pode ser gerado um registro para o prximo curso? Estruturas so bem como seus campos: multidimensionais. Portanto, pode-se gerar o prximo registro de diferentes maneiras: Mltiplos registros em um vetor de estrutura Pode-se fazer com que a estrutura Turma seja um vetor (neste exemplo, um vetor ser o bastante), ento armazene um registro completo como um elemento do vetor: Turma.curso = 'eletrica2003'; Turma.prof = 'Paulo'; Turma.notas = [80 75 95]; Turma Turma = curso: 'eletrica2003' prof: 'Paulo' notas: [80 75 95] Cria uma estrutura Turma com 3 campos: curso, prof, notas;

Quando requisitado, o MATLAB mostra a estrutura.

80

Grupo PET Engenharia Eltrica - UFMS Turma(2).curso = 'Fsica'; Turma(3).curso = 'Computao'; Turma(2).prof = 'Mauro'; Turma(3).prof = 'Karen'; Turma(2).notas = [72 75 78]; Turma(3).notas = [85 35 66]; Turma Aps adicionar mais 2 registros, Turma torna-se um vetor, e, quando requisitado, o MATLAB Turma = mostra informaes sobre a estrutura; 1x3 struct array with fields: curso prof notas Turma(2).curso ans = Fsica Turma(3).notas(1) ans = 85 Turma.notas ans = 80 75 ans = 72 75 ans = 85 35 95 78 66 Para acessar os valores a partir de um campo de muitas gravaes use um lao. Usa o ndice do vetor na estrutura para acessar os seus elementos.

Pode-se usar a notao de ndices para a estrutura assim como para os seus campos.

Quando nenhum ndice especificado para a estrutura, o MATLAB mostra na tela os valores do campo de todos os registros at agora executados.

for k = 1:3, all_notas(k,:) = Turma(k).notas; end

Assim, foi criado o arranjo de estrutura Turma 1 x 3. Cada elemento de Turma pode ser acessado assim como se acessa um elemento de um vetor comum faz Turma(2) ou Turma(1), etc. Digitando Turma(1), obtm-se 2 valores de todos os campos junto com os nomes do campo. Pode-se tambm acessar campos individuais (Turma(1).prof ou Turma(1).notas(3)). Obs.: Em um vetor de estrutura, cada elemento deve ter o mesmo nmero de campos. Cada campo, entretanto, poder conter dados de diferentes tamanhos. Portanto, Turma(1).notas pode um vetor linha de 3 espaos enquanto que Turma(2).notas um vetor coluna de 5 espaos.

81

Grupo PET Engenharia Eltrica - UFMS Mltiplas gravaes em campos de vetores. Para o exemplo escolhido, pode-se armazenar mltiplos registros em uma nica estrutura (ou seja, guarda Turma 1 x 1) fazendo com que os campos sejam de tamanhos apropriados para acomodar os registros: Turma.curso = char(eletrica2003, Fsica, Computao); Turma.prof = char(Paulo, Mauro, Karen); Turma.notas = [80 75 95; 72 75 78; 85 35 66]; Neste exemplo, a funo char usada para criar de caracteres string separadamente das variveis de entrada. Aqui, Turma uma estrutura 1 x 1, mas o campo curso um arranjo de caracteres 3 x 7, prof de tamanho 3 x 10 e notas um vetor de nmeros 3 x 3. Bem, este exemplo funciona muito bem porque se poderia criar um vetor coluna de nomes de curso, outra de nomes de professores, e uma matriz de notas onde cada linha corresponde a um curso diferente. O que aconteceria se o terceiro registro tivesse uma matriz para cada curso? Poderia-se ainda armazenar o registro por ambos os caminhos mencionados anteriormente. Enquanto o primeiro mtodo de criao de um vetor de estrutura parece ser o caminho mais mais fcil, pode-se tambm usar o segundo mtodo e obter o terceiro campo notas sendo uma matriz 3-D. Criando Estruturas Nos exemplos anteriores, j se tinha visto como criar estruturas por designao direta. Assim como pode-se criar uma matriz digitando seu nome e designando valores para ela A = [1 2 3 4] pode-se criar uma estrutura digitando seu nome junto a um campo e designando valores ao campo, assim como feito nos exemplos anteriores. O outro caminho para criar uma estrutura com a funo struct. A sintaxe geral de struct : str_name = struct(nome do campo1,campo1, nome do campo2, campo2,...) Assim, a estrutura criada Turma poderia ser criada como se segue: Como uma simples estrutura: Turma = struct(curso,char(eletrica2003,Fsica,Computao), . . . prof,char(Paulo, Mauro, Karen), . . . notas,char( [80 75 95; 72 75 78; 85 35 66]); Como um vetor de estrutura: Vet_Turma = [struct(curso,eletrica2003,prof,Paulo, . . . notas, [80 75 95]); struct(curso,Fsica,prof,Mauro, . . . notas, [72 75 78]); struct(curso,Computao,prof,Karen, . . . notas, [85 35 66])];

82

Grupo PET Engenharia Eltrica - UFMS Manipulando estruturas Manipulao de estruturas similar manipulao de arranjos em geral acessar elementos de estrutura pelo prprio ndice e manipular seus valores. H, porm, uma grande diferena: no se pode designar todos os valores de um campo atravs de um vetor de uma estrutura a uma varivel com 2 pontos variveis e especificadores. Assim, se Vet_Turma um arranjo de estrutura 3 x1 ento: Vet_Turma(1).notas(2) Vet_Turma(1).notas(:) Vet_Turma(:).notas vlido e mostra o elemento do notas oriundo do primeiro registro de Vet_Turma mostra todos os elementos de notas vindos de Vet_Turma(1).notas invlido, no designa notas vindos de todos os registros para, embora o comando Vet_Turma(:).notas ou (Vet_Turma.notas) mostra notas de todos os registros.

Ento, embora se possa ver na tela os valores de campo atravs de mltiplos registros com Vet_Turma(:).notas, deve-se usar um loop para designar os valores varivel: For k=1:3, todas_notas (k,:) = Vet_Turma(k).notas; end A designao no pode ser feita diretamente com o operador de coluna porque os valores dos campos de muitos registros so tratados como entidades diferentes. Os contedos de campo so tambm so permitidos cserem de diferentes tamanhos. Portanto, embora se possa usar um lao for para designao, deve tomar cuidado extra para assegurar que a designaofaz sentido. Por exemplo, no lao for citado, se Vet_Turma(2),notas tem somente 2 notas de teste, ento a designao produzir um erro. Est claro, dos exemplos mostrados, que se pode usar ndices para a estrutura tanto como campos para acessar informao. At agora, tm-se usado somente arranjos de caracter e de nmeros nos campos. Pode-se, entretanto, haver tambm estruturas dentro de estruturas. Porm, o nvel de ordenao torna-se completamente envolvido e requer cuidado extra quando se tm estruturas entrelaadas. H tasmbm vrias funes que ajudam na manipulao das estruturas fieldnames, setfield, getfield, rmfield, is field, etc. Os nomes da maioria dessas funes j sugere seu papel.

83

Grupo PET Engenharia Eltrica - UFMS 6.19. CLULAS Uma clula o mais verstil objetode dados no MATLAB. Pode conter qualquer tipo de dados um arranjo de nmeros, strings, estruturas, ou outras clulas. Um arranjo de clulas cahmado de cell array.Pode-se pensar que uma clula como um arranjo de recipientes de dados. Imagine que se tenha um arranjo 3 x3, my_riches. Agora colocam-se roupas em uma caixa, sapatos em outra, um computador em outra, etc. Cada caixa um recipiente que simplesmente parece com cada uma das outras. Entretanto, o contedo de cada uma diferente. Ento, tem-se um arranjo que se pode acomodar qualquer coisa e ainda parecer sumariamente similar. Analogamente, pense nisto como no Universo do MATLAB, trocando-se as caixas, por clulas, roupas por uma matriz, sapatos por uma estrutura, etc., ento teremos um objeto de dados no MATLAB chamado clula. Vamos primeiro criar uma clula, colocando somente dados nela, e ento discutir vrios aspectos das clulas usando esta como exemplo: C = cell (2,2); C{1,1} = rand(3); C{1,2} = char(john,raj) C{2,1} = Vet_Turma; C{2,2} = (3, 3); % cria uma clula 2 x 2. Cell(2) teria o mesmo efeito % insere uma matriz ramdmica 3 x 3 na primeira caixa % insere um arranjo de string na segunda caixa % insere a estrutura Vet_Turma na terceira caixa % insere um clula 3 x 3 na quarta caixa

Neste exemplo, criar uma clula parece superficialmente criar um arranjo ordenado, porm h algumas diferenas evidentes. Primeiramente, os contedos so to variados quanto se desejar. Alm disso, para designar a dimenso da clula h chaves {} no lugar dos parnteses. Mas, por que no se usam os parnterses no lugar das chaves? Uma clula diferente de um vetor numrico ordenado que ele distingue entre os recipientes de dados e os contedos, e isso permite acesso a ambos separadamente. Quando se trata uma clula como um vetor de recipientes, as clulas se comportam somente como um arranjo e voc pode acessar um recipiente com a sintaxe familiar C(i,j). O que voc consegue o recipiente da i-sima linha e da j-sima coluna. O recipiente carregar um rtulo que indicar se os contedos so doubl, char, struct ou cell, e de que dimenso. Se voc deseja acessar os contedos de um recipiente, ento deve-se usar a especial clula-contedo-ordenao ndices dentro de chaves. Assim, para visualizar a matriz randmica em C(1,1), deve-se digitar C{1,1}. Criando Clulas J foi discutido como criar clulas com a funo cell. Pode-se tambm criar clulas diretamente. C = {rand(3) char(John, raj); Vet_Turma cell(3,3)}; Este exemplo ilustra que as chaves esto para as clulas assim como os colchetes esto para um vetor comum quando usado do lado direito da declarao.

84

Grupo PET Engenharia Eltrica - UFMS Manipulando Clulas Manipular clulas to fcil quanto manipular vetores comuns. Entretanto, fica bem mais fcil com a indexao de clula, que no foi visto antes. Crie a clula do ltimo exemplo mostrado, com a estrutura Vet_Turma feita como exemplo nesta apostila. Depois, tente os seguintes comandos e veja o que acontece. C(1,1) = {[1 2; 3 4]}; C{1,2}(1,:) C{2,1}(1).notas(3) = 100; C{2,1}(2).prof C{2,2}{1,1} = eye(2); C{2,2}{1,1}(1,1) = 5; H vrias funes viveis para manipulao de clulas. Algumas delas: dellstr, iscellstr, cell2struct, struct2cell, iscell, num2cell, dentre outros. Duas funes merecem ateno especial: celldisp cellplot mostra na tela os contedos de uma clula. plota o vetor de clulas esquematicamente.

85

Grupo PET Engenharia Eltrica - UFMS

7. ERROS Erros fazem parte de nossas vidas interagindo com computadores ou no. A diferena que se voc interage com computadores os seus erros so indicados imediatamente (geralmente sem rodeios e sem muitos conselhos). A interao com o MATLAB no diferente. Errar humano, mas ao programar no podemos permanecer no erro se quisermos que o programa funcione. O MATLAB fornece muitas indicaes de erros, mas no esclarece muito bem o que est indicando e o que necessrio fazer para corrigir o erro, portanto iremos dar algumas breves dicas para auxiliar o programador a entender os seus erros no MATLAB. Aqui esto algumas das mais comuns mensagens de erro, em ordem alfabtica, seguidos de algum comando. >> D(2:3, :) = sin(d) ??? In an assignment A(matrix, :) = B, the number of columns in A and B must be the same. Esta um tpico problema de transferncia de matrizes onde as dimenses das matrizes dos dois lados no so iguais. Use os comandos size e length para verificar as dimenses em ambos os lados. Por exemplo, para o caso acima execute size (D(2:3, :)) e size(sin(d)) ou size(d). Um erro semelhante ocorre ao tentar transferir uma matriz para um vetor. >> D(:, 2) = d1 ??? In an assignment A(matrix) = B, a vector A cant be resized to a matrix. Neste exemplo, D e d1 so matrizes, mas D(:, 2) um vetor ( a segunda coluna de D), ento d1 no pode ser colocado dentro de D(:, 2). >> (x, y) = circlefn(5); ??? (x, | A closing right parenthesis is missing. Check for a missing ) or a missing operator. O problema aqui que o MATLAB utiliza parnteses como ndice de matrizes. Para se representar uma lista de vetores para a sada de uma funo deve-se utilizar colchetes, portanto o comando correto : [x, y] = circlefn(5); Quando os colchetes so misturados com os parnteses a mesma mensagem aparece. >> (x, y] = circlefn(5); ??? (x, | A closing right parenthesis is missing. Check for a missing ) or a missing operator.

86

Grupo PET Engenharia Eltrica - UFMS x = 1:10; v = [0 3 6]; x(v) ??? Index into matrix is negative or zero. O primeiro elemento do vetor v zero. Assim ns estamos tentando pegar o elemento zero de x. Mas zero no um ndice vlido para qualquer matriz ou vetor no MATLAB. O mesmo problema surge quando um nmero negativo usado como ndice. claro que um erro tambm aparece se o ndice excede a dimenso da varivel. x*y ??? Error using ==> * Inner matrix dimensions must agree. Na multiplicao de x*y o nmero de colunas de x deve ser igual ao nmero de linhas de y e vice e versa. Aqui x e y so ambos vetores linha de 10 elementos cada, portanto, no podem multiplicar, mas x*y ou x*y ir executar sem erro. Muitas outras operaes envolvendo dimenses imprprias de matrizes produzem erros parecidos. Por exemplo, A2 s tem lgica para uma matriz A, se A for uma matriz quadrada. Um outro erro comum usar o operador de matriz quando voc quer usar o operador seqencial. Por exemplo, para os mesmos vetores x e y acima, y.^x retorna a exponenciao elemento por elemento, j y^x produz um erro: >> y^x ??? Error using ==> ^ Matrix dimensions must agree. [x, y] = Circlefn; ??? Input argument r is undefined. Error in ==> Macintosh HD:MATLAB 4.1:Circlefn.m On line 4 ==> x = r*cos(theta); y = Uma funo foi executada sem uma entrada apropriada. Esta uma das poucas funes que fornecem informaes suficientes (nome da funo, o diretrio onde est a funo e a linha em que o erro ocorreu). [t, x] = Circle (5); ??? Attempt to execute SCRIPT Circle as a function. Aqui temos um caso comum de erro em que Circle, que um procedimento (script file), est sendo usado como funo (function file). Nas funes podemos especificar as entradas e as sadas, mas nos procedimentos no. >> x = 1:10; y = 10:-2:-8;

87

Grupo PET Engenharia Eltrica - UFMS Outro caso interessante que produz o mesmo erro quando tentamos executar a funo abaixo. Function [x, y] = circlefn (r); % CIRCLEFN funo que desenha um circulo de raio r. theta = linspace (0, 2*pi, 100); x = r*cos (theta); y = r*cos (theta); plot (x, y); O erro ser: >> [x, y] = circlefn (5); ??? Attempt to execute SCRIPT circlefn as a function. A princpio voc se assusta: Opa!? Esse arquivo no um procedimento!. Tudo bem, mas tambm no funo, porque um arquivo s classificado como funo se no incio estiver escrito function com f minsculo, e no Function. [x, y] = circlefn (); ??? [x, y] = circlefn () Missing variable or function. Este erro claro. Voc no colocou a varivel de entrada. circlefn [5]; ??? circlefn [ Missing operator, comma, or semi-colon. A entrada das funes deve ser especificada entre parnteses. >> x = b+2.33 ??? Undefined function or variable b. Neste caso a mensagem j indica o erro exato: a varivel b no foi criada. Mas se o mesmo erro ocorrer com uma funo ou com um procedimento que voc j criou, qual seria o erro? Provavelmente, o seu arquivo est em outro diretrio. Para verificar utilize o comando dir. >> global a, b ??? Undefined function or variable b. Neste caso voc pretende declarar as variveis a e b como globais, mas voc no pode utilizar aquela vrgula depois do a, pois o MATLAB enxerga vrgulas como separadores, assim ele executa global a, e depois executa b. Quando digitamos apenas o

88

Grupo PET Engenharia Eltrica - UFMS nome de uma varivel no MATLAB ele retorna o valor dessa varivel, e como