Você está na página 1de 91

# MATLAB

2. Edio

## Grupo PET Engenharia Eltrica - UFMS

ndice
Matlab__________________________________________________________________1 Apresentao_____________________________________________________________4 MATLAB v. 5.3__________________________________________________________5
1. 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______________________________________________________21 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

## Grupo PET Engenharia Eltrica - UFMS

5.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)_______________________________53 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________________________________________________________________76 6.15. Entrada/Sada____________________________________________________________76 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

Apresentao

## Grupo PET Engenharia Eltrica - UFMS

MATLAB v. 5.3

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 <tpico>, 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.

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.

## 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.

x = linspace(0,10,5) x=

0 2.5000 5.0000 7.5000 10.0000 y = sin(x); z = sqrt(x).*y z= 0 0.9463 -2.1442 2.5688 -1.7203 EXERCCIOS 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. Funes trigonomtricas sin, cos, etc., assim como funes matemticas elementares sqrt, exp log, etc., operam com vetores termo por termo.

## 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') print
Cria 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

intervalo.

## EXERCCIOS 1. Plote y = e-0.4xsen x, 0 x 4. Tomando 10, 50 e depois 100 pontos no

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

A(2,3)

## Grupo PET Engenharia Eltrica - UFMS

ans = 6 A(3,3) = 9 A= 1 4 7 2 5 8 3 6 9 possvel retirar uma parte da matriz A, usando os especficos limites para as linhas e as colunas. 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

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 0 0 0 C(3,1:3) = [1 2 3];produz. B= 0 0 0 1 2 3

15

Grupo PET Engenharia Eltrica - UFMS 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

Q(v, : ) =

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. Transposta A transposta de uma matriz, obtida colocando-se o nome da matriz seguida de um apstrofo: matriz A4x3 A3x4.

16

Grupo PET Engenharia Eltrica - UFMS 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 todos A = zeros(m,n) 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 0
0 0 1

,u=[5 6 7] e v=

3 4

1 0 0 5

0 1 0 6

0 0 1 7

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 ], e
1 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 Deletando uma linha ou coluna Qualquer linha ou coluna de uma matriz pode ser deletada simplesmente atribuindo um vetor nulo mesma. Exemplo:

17

## Grupo PET Engenharia Eltrica - UFMS 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.

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.

18

## Grupo PET Engenharia Eltrica - UFMS

diag(B,1)' ans = 1 1 0 0

## O segundo argumento escolhe a diagonal que voc deseja extrair.

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 0 4 -3 0 -1 0 6 -3 0 -1 0 8 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] 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.

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: 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.

19

## Grupo PET Engenharia Eltrica - UFMS

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. Exemplos: u.*v produz [u1v1 u2v2 u3v3 ... ], u./v produz [u1/v1 u2/v2 u3/v3 ...], e u.^v produz [u1v1 u2v2 u3v3 ...].

20

Grupo PET Engenharia Eltrica - UFMS 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 4.8. OPERAES RELACIONAIS H seis operadores relacionais no MATLAB: 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).

## Neste caso, a exponenciao feita elemento por elemento.

21

Grupo PET Engenharia Eltrica - UFMS < <= > >= == ~= 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 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 any exist isempty 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<0) retorna 1 se todos os elementos de x forem negativos. verdadeiro (=1) se algum elemento do vetor for verdadeiro. Exemplo: any(x) retorna 1 se algum elemento de x diferente de zero. verdadeiro (=1) se o argumento (uma varivel ou funo) existe. verdadeiro (=1) para uma matriz vazia.

22

Grupo PET Engenharia Eltrica - UFMS isinf isfinite isnan find verdadeiro para todos os elementos infinitos de uma matriz. verdadeiro para todos os elementos finitos de uma matriz. verdadeiro para todos os elementos de uma matriz que no forem nmeros (Not-a-Number). encontra os ndices de elementos no-nulos de uma matriz. Exemplo: find(x) retorna [2 3 4] para x=[0 2 5 7].

4.10. FUNES MATEMTICAS ELEMENTARES Todas as funes a seguir so realizadas termo por termo, portanto elas produzem sadas com a mesma dimenso das entradas. Funes Trigonomtricas sin asin cos acos tan atan, atan2 sec asec csc acsc cot acot seno. arco seno. coseno. arco coseno. tangente. arco tangente. secante. arco secante. cosecante arco cosecante cotangente arco cotangente sinh asinh cosh acosh tanh atanh sech asech csch acsch coth acoth seno hiperblico. arco seno hiperblico. cose hiperblico. arco coseno hiperblico. tangente hiperblico. arco tangente hiperblico. secante hiperblico. arco secante hiperblico. cosecante hiperblico. arco cosecante hiperblico. cotangente hiperblico. arco cotangente hiperblico.

Os ngulos devem ser dados em radianos. Todas essas funes, exceto atan2, pegam um escalar, vetor ou matriz como entrada de argumentos. A funo atan2 pega 2 entradas: atan2(y, x) e retorna o arco tangente do ngulo y/x. Funes Exponenciais exp Exponencial (exp(A) = eAij). logLogaritmo natural (log(A) = ln(Aij)). log10 Logaritmo na base 10 (log10(A) = log10(Aij)). sqrt Raiz quadrada. Funes Complexas abs angle conj imag real Valor absoluto. ngulo de fase. Complexo conjugado. Parte imaginria. Parte real.

23

## Grupo PET Engenharia Eltrica - UFMS

Funes de aproximao fix floor ceil round rem sign Aproxima na direo de zero. Exemplo: fix([-2.33 2.66]) = [-2 2]. Aproxima na direo de -. Exemplo: floor([-2.33 2.66]) = [-3 2]. Aproxima na direo de +. Exemplo: ceil ([-2.33 2.66]) = [-2 3]. Aproxima para o inteiro mais prximo. Exemplo: round ([-2.33 2.66]) = [-2 3]. Resto da diviso. rem(a, b) o mesmo que a b*.fix(a./b). Exemplo: Se a=[-1.5 7], b=[2 3], ento rem(a, b) = [-1.5 1]. Retorna o sinal. Exemplo: sign ([-2.33 2.66]) = [-1 1].

4.11. FUNES DE MATRIZES As funes de matrizes so: expm(A) logm(A) sqrtm(A) encontra o exponencial da matriz A (eA). encontra log(A), tais que A = elog(A). encontra a raiz da matriz A.

Obs: As funes normais realizam as operaes termo por termo enquanto as funes de matrizes realizam uma operao com a matriz. Veja os exemplos a seguir. A=[1 2;3 4]; asqrt = sqrt(A) asqrt = 1.0000 1.4142 1.7321 2.0000 Asqrt = sqrtm(A) Asqrt = 0.5537 + 0.4644i 0.8070 - 0.2124i 1.2104 - 0.3186i 1.7641 + 0.1458i exp_aij = exp(A) exp_aij = Analogamente, exp retorna a exponencial de cada elemento da matriz, enquanto expm retorna a exponencial da matriz A. Raiz quadrada da matriz A. Portanto, Asqrt*Asqrt = A.

24

Grupo PET Engenharia Eltrica - UFMS 2.7183 7.3891 20.0855 54.5982 exp_A = expm(A) exp_A = 51.9690 74.7366 112.1048 164.0738 4.12. CARACTERES DE STRINGS Todos os caracteres de strings so colocados entre apstrofo. O MATLAB considera toda string como um vetor linha com 1 elemento para cada caracter. Por exemplo, mensagem = Deixe-me sozinho cria um vetor, nomeado mensagem, de tamanho 1 x 16 (os espaos tambm contam como caracteres). Portanto, para criar um vetor coluna com strings em cada linha, cada texto string deve ter exatamente o mesmo nmero de caracteres. Por exemplo o comando: nomes = [John; Ravi; Mary; Xiao] cria um vetor coluna com um nome por linha. Contudo, para o MATLAB a varivel nomes uma matriz 4 x 4. Claramente, o comando howdy = [Hi; Hello; Namaste] resultar em um erro porque cada uma das linhas tem tamanhos diferentes. Textos de diferentes tamanhos podem ser feitos preenchendo-os com espaos vazios. Assim a entrada correta para o howdy ser: howdy = [Hi ; Hello; Namaste] Um modo mais fcil de fazer a mesma coisa utilizar o comando char, que converte strings para uma matriz. Assim ele pode criar o mesmo howdy acima preenchendo os espaos em branco em cada linha automaticamente. howdy = char(Hi, Hello, Namaste) Manipulando caracteres strings Os caracteres strings podem ser manipulados apenas como matrizes. Assim c = [howdy(2, :) nomes(3, : )]

25

Grupo PET Engenharia Eltrica - UFMS produz Hello Mary como uma sada na varivel c. Esta caracterstica pode ser usada durante a execuo de funes de converso nmero-para-texto, como num2str e int2str. Por exemplo, se voc quiser apresentar o resultado de um programa que calcula a hipotenusa h de um tringulo retngulo, que varia dependendo da entrada do programa. Assim para apresentar o resultado voc dever digitar: disp( [A hipotenusa , num2str(h)] ) H vrias funes embutidas para a manipulao de strings. char abs blanks(n) deblank eval findstr int2str ischar isletter isstring lower mat2str num2str strcmp strncmp strcat strvcat upper converte strings para uma matriz. converte caracteres para os correspondentes numricos de acordo com a tabela ASCII. cria n espaos em branco. remove os espaos em branco de uma string. executa a string como um comando. encontra uma especificada substring em uma string. converte nmero inteiros para textos. verdadeiro (=1) para uma seqncia de caracteres. verdadeiro (=1) para um caracter alfabtico. verdadeiro (=1) se o argumento um texto. converte letras maisculas em letras minsculas. converte uma matriz para uma string. converte nmeros para textos (similar ao int2str). compara duas matrizes e retorna 1 se forem iguais. compara os primeiros n caracteres de uma dada string. concatena strings horizontalmente ignorando os espaos em branco. concatena strings verticalmente ignorando os espaos em branco. converte letras minsculas em letras maisculas.

A funo eval MATLAB possui uma poderosa funo chamada eval, que executa o que tem no interior de uma string. Se a string possui um comando que voc deseja executar esta funo ideal. Por exemplo, eval(x = 5*sin(pi/3)) este comando atribui o valor 5*sen(/3) varivel x. Exerccios 1. Entre com as matrizes a seguir: 2 6 1 2 5 5 A= B= C = 3 9 3 4 5 3 2. Criando uma matriz nula, de 1s e identidade. Crie as seguintes matrizes com a ajuda das matrizes genricas citadas acima.

26

Grupo PET Engenharia Eltrica - UFMS 5 0 0 3 3 F= 0 5 0 3 3 0 0 5 3. A seguinte matriz G criada colocando as matrizes A, B e C citadas acima, na sua diagonal. De quantas maneiras voc pode criar a matriz G, utilizando as submatrizes A, B e C? 2 6 0 0 0 0 3 9 0 0 0 0 0 0 1 2 0 0 G = 0 0 3 4 0 0 0 0 0 0 5 5 0 0 0 0 5 3 4. Crie uma matriz 20 x 20 com o comando H = ones(20). Agora substitua a submatriz 10 x 10 entre as linhas 6 e 15 e as colunas 6 e 15 com zeros. Veja a estrutura da matriz (em termos de entradas diferentes de zero) com o comando spy(H). Escolha as submatrizes 5 x 5 no canto superior direito e no canto inferior esquerdo para zerar e ver a estrutura de novo. 5. Crie uma matriz 10 x 10 qualquer com o comando J = rand(10). Agora realize as seguintes operaes: Multiplique todos os elementos por 100 e aproxime todos os elementos para inteiros com o comando J = fix(J). Substitua todos os elementos de J < 10 por zeros. Substitua todos os elementos de J < 90 por infinito (inf). Extraia todos os elementos entre 30 e 50 e coloque-os em um vetor b.

0 0 0 D= E= 0 0 0

27

## Grupo PET Engenharia Eltrica - UFMS

5. GRFICOS 5.1. GRFICOS BSICOS EM 2-D O mais bsico e talvez o mais til comando para produzir um grfico simples em 2-D : plot (x, y, Opes de estilos) onde x e y so vetores contendo as coordenadas correspondentes de pontos no grfico e opes de estilos um argumento opcional para especificar a cor, estilo de linha (contnuo, tracejado, pontilhado, etc.), e o estilo da marcao dos pontos (o, -, *, +, etc) todas as trs opes podem ser especificadas juntas na seguinte seqncia: cor, estilo de linha e estilo de marcador. Os dois vetores x e y DEVEM ter o mesmo nmero de elementos. Tamanhos diferentes entre os dois vetores o caso mais comum de erro com o uso do comando plot. Se a funo plot for utilizada sem o componente x, ela considera que o valor das abscissas (x) so os valores dos ndices i de y ( i ). Se por exemplo y = [2 3 5 9], o comando plot(y) ir plotar os pontos: (1, 2),(2, 3),( 3, 5),(4, 9). 5.2. OPES DE ESTILO Cores yellow magenta cyan red green blue white black Estilo de linha contnuo -tracejado .. pontilhado -. trao ponto none sem linha Estilo de marcao + sinal de mais o crculo * asterisco x marcao de x . marcao de ponto ^ circunflexo square quadrado diamond losango

y m c r g B W K

5.3. RTULOS, TTULO, LEGENDA E OUTROS OBJETOS DE TEXTO Grficos podem ser anotados com os comandos xlabel, ylabel, title e text. O primeiro dos trs comandos utilizam apenas 1 argumento de texto, enquanto o ltimo utiliza 3. Exemplo: xlabel(Comprimento do cano) Rtulo da abcissa. ylabel(Presso do fluido) Rtulo da ordenada. title(Variao de Presso) Ttulo do grfico. text(2, 6, Note este ponto) Insere um comentrio no ponto (2, 6) Os argumentos do comando text(x,y,texto) devem ser vetores, sendo que x e y devem ter o mesmo nmero de elementos e o texto deve ser uma string ou um conjunto 28

Grupo PET Engenharia Eltrica - UFMS de string. Se texto um vetor ento ele deve ter o mesmo nmero de elementos de x e y. Uma varivel til do comando text o gtext, que pega os valores de x e y com um simples clik do mouse. Legenda: O comando legend produz uma caixa de legenda no grfico. legend(string1, string2, ...) legend(LineStyle1, string1,...) legend(...,pos) Produz uma legenda usando os textos das correspondentes strings. Especifica o estilo de linha de cada rtulo. Escreve a legenda fora do quadro de plotagem se pos =-1 e dentro se pos=0. (h outras opes para pos.) Deleta a legenda do grfico..

legend off

Quando o MATLAB solicitado para produzir uma legenda, ele tenta encontrar um lugar no grfico onde caiba o que est escrito nela sem atrapalhar os traados do grfico, o grid, e outros objetos. Ao argumento opcional pos especifica o local da caixa de legenda. Pos = 1 superior direito (default); pos = 2 superior esquerdo; pos = 3 inferior esquerdo; pos = 4 inferior direito. Mas melhor mover a caixa de legenda com o mouse. 5.1 CONTROLE DOS EIXOS E DE ZOOM Uma vez que um grfico foi gerado voc pode mudar os limites dos eixos com o comando axis. Escrevendo: axis( [ xmin xmax ymin ymax] ) onde os valores xmin, xmax, ymin e ymax so os respectivos valores dos limites dos eixos a serem colocados no comando. O comando axis pode assim ser usado para aumentar uma seo particular do grfico, ou diminuir (zoom-in e zoom-out). H tambm alguns argumentos teis ao comando. axis(equal) axis(square) axis(normal) axis(axis) axis(off) Escolhe uma escala igual para todos os eixos. Transforma a tela padro, que retangular, para quadrada. Retorna os eixos para os valores padro. Congela os limites do eixo atual. Remove o quadro de plotagem e os valores do eixo.

29

## Grupo PET Engenharia Eltrica - UFMS

Controle parcial dos eixos possvel controlar somente uma parte dos limites dos eixos e deixar que o MATLAB complete os outros limites automaticamente. Isto feito especificando os limites desejados com o comando axis e preenchendo com inf os limites que vocs gostaria que fossem escolhidos automaticamente. Por exemplo: axis( [-5 5 -inf inf] ) 5.4. GRFICOS SOBREPOSTOS H trs diferentes modos de gerar grficos sobrepostos no MATLAB: o plot, o hold e linhas de comandos. Mtodo 1: Usando o comando plot. Se toda a seleo de dados est disponvel, o comando plot com mltiplos argumentos pode ser usado para gerar grficos sobrepostos. Por exemplo, se ns tivermos trs selees de dados (x1,y1), (x2,y2) e (x3,y3), o comando plot(x1, y1, x2, y2, :, x3, y3, o), desenha (x1,y1) com uma linha slida, (x2,y2) com uma linha pontilhada e (x3,y3) como vrios pontos separados em forma de crculos (o). Note que todos os vetores devem ter o mesmo tamanho. Se todos os componente (x1,y1), (x2,y2) e (x3,y3), tiverem o mesmo tamanho, ento conveniente fazer uma matriz de X vetores e uma matriz de Y vetores de modo que X = [x1 x2 x3] e Y = [y1 y2 y3], assim o comando plot(X,Y) ir desenhar os trs grficos na mesma figura com cores diferentes. Exemplo: A seqncia de comandos abaixo ir gerar o grfico a direita. x = [1 2 3; 4 5 6; 7 8 9; 10 11 12] x= 1 2 3 4 5 6 7 8 9 10 11 12 y = [2 2 2;5 5 5;8 8 8;11 11 11] y= 2 2 5 5 8 8 11 11 plot(x,y) 2 5 8 11 Somente os limites do eixo x so especificados, enquanto os do y so escolhidos pelo MATLAB.

30

Grupo PET Engenharia Eltrica - UFMS Mtodo 2: Usando o comando hold para gerar grficos sobrepostos. Um outro modo de fazer grficos sobrepostos usando o comando hold. Digitando hold on em qualquer ponto durante a sesso congela o grfico corrente na janela de grficos. Todos os subseqentes grficos gerados pelo comando plot so simplesmente adicionados (e no substitudos) ao grfico existente. O seguinte arquivo procedimento (Script file) mostra como gerar o mesmo grfico como na figura abaixo, usando o comando hold.

% - Procedimento que gerar grficos sobrepostos com o comando hold x = linspace(0,2*pi,100); % Cria o vetor x. y1 = sin(x); % Calcula y1. plot(x,y1) % Desenha (x,y1) com uma linha slida. hold on % Congela a figura. y2 = x; plot(x,y2,'r--') % Desenha (x,y2) com uma linha tracejada. y3 = x-(x.^3)/6+(x.^5)/120; % Calcula y3. plot(x,y3,'go') % Desenha (x,y3) com crculo. axis([0 5 -1 5]) % ajusta os eixos do grfico. hold off % Descongela a figura.

Mtodo 3: Usando o comando line para gerar grficos sobrepostos O line um comando grfico de baixo nvel o qual usado pelo comando plot para gerar linhas. Uma vez que exista um grfico na janela de grfico, voc pode adicionar linhas utilizando o comando line diretamente. O comando line utiliza um par de vetores (ou um trio em 3D) seguidos de ParameterName / ParemeterValue como argumentos: line(xdata, ydata, ParameterName, ParameterValue) O mesmo grfico acima pode ser feito com o comando line ao invs de ser feito com o comando hold, conforme a seguir:
% - Procedimento que gerar grficos sobrepostos com o comando line x = linspace(0,2*pi,100); % Cria o vetor x.

31

## Grupo PET Engenharia Eltrica - UFMS

y1 = sin(x); y2 = x; y3 = x-(x.^3)/6+(x.^5)/120; % Calcula y1. % Calcula y2. % Calcula y3.

plot(x,y1) % Desenha (x,y1) com uma linha slida. line(x,y2,'linestyle','r--') % Desenha (x,y2) como uma linha tracejada. line(x,y3,'linestyle','go') % Desenha (x,y3) com crculos. axis([0 5 -1 5]) % ajusta os eixos do grfico. xlabel('x') ylabel('Aproximao do sen(x)') legend('sin(t)','Aprox. linear','Aprox. de 5 ordem')

A legenda da figura acima pode ser arrastada para uma outra posio clicando e segurando o com o mouse em cima da legenda. 5.5. GRFICOS ESPECFICOS EM 2-D Existem muitas funes especficas de grficos em 2-D. Elas so usadas como alternativas para o comando plot. Aqui est uma lista dos possveis modos de desenho em 2D: area bar barh comet compass contour contourf errorbar feather fill fplot hist loglog cria uma rea preenchida. cria um grfico de barras. cria um grfico de barras horizontais. faz uma animao 2D. cria um grfico de vetores para nmeros complexos. faz um grfico de curvas de nvel. faz um grfico de curvas de nvel preenchidas. desenha um grfico com barras de erro. faz um grfico do vetor velocidade. desenha um polgono preenchido com uma cor especificada. desenha uma funo de uma nica varivel. faz um histograma. cria grficos com escala logartmica em ambos os eixos.

32

Grupo PET Engenharia Eltrica - UFMS pcolor faz um grfico de uma matriz, onde cada clula possui uma cor de acordo com o seu valor. pie faz um grfico em forma de pizza. plotyy faz um grfico com duplo eixo y. plotmatrix faz uma matriz espalhada. polar desenha curvas em coordenadas polares. quiver desenha campos de vetores. rose faz histogramas em coordenadas polares. scatter cria um grfico espalhado. semilogx faz um grfico semilog com escala logartmica no eixo x. semilogy faz um grfico semilog com escala logartmica no eixo y. stairs desenha um grfico em degraus. stem desenha um grfico em fatias. Mostraremos exemplos destas funes a seguir. Funo Comando f(t) = t sen(t), 0 t 10 fplot fplot(x.*sin(x), [0 10*pi]) Note que a funo para ser desenhada deve ser escrita como uma funo de x. Resultado

x = e t, y = t, 0 t 2 semilogx t = linspace (0, 2*pi, 200); x = exp( -t ); y = t; semilogx (x, y), grid;

## x = t, y = e t, 0 t 2 semilogy t = linspace (0, 2*pi, 200); semilogy (t, exp(t)) grid

Funo

Comando

33

Grupo PET Engenharia Eltrica - UFMS x = e t, y = 100 + e2t, 0 t 2 t = linspace (0, 2*pi, 200); x = exp(t); y = 100 + exp(2*t); loglog (x, y); grid

loglog

r2 = 2 sen (5t), 0 t 2 polar t = linspace (0, 2*pi, 200); r = sqrt (abs(2*sin(5*t))); polar (t, r)

r2 = 2 sen (5t), 0 t 2 x = r cos (t), y = r sen (t); fill t = linspace (0, 2*pi, 200); r = sqrt (abs(2*sin(5*t))); x = r.*cos(t); y = r.*sin(t); fill (x, y,k); axis(square); r2 = 2 sen (5t), 0 t 2 y = r sen (t); bar t = linspace (0, 2*pi, 200); r = sqrt (abs(2*sin(5*t))); y = r.*sin(t); bar (t, y); axis([0 pi 0 inf]);

Funo

Comando

Grupo PET Engenharia Eltrica - UFMS aprox = x x3/3!, 0 t 2 error = aprox sen(x). errorbar x = 0: .1: 2; aprx2 = x x.^3/6; er = aprx2 sin(x); errorbar (x, aprx2, er); Populao mundial por continentes cont = char(sia, Europa, frica, ... Amrica do Norte, Amrica do Sul); pop = [3332; 696; 694; 437; 307]; barh (pop) hist for i = 1:5, gtext (cont (i, : )); end xlabel (Populao em milhes); title (Populao Mundial (1992), ... Fontsize, 18); y1 = e -x sen(x), 0 t 10 y2 = e x x = 1: .1:10; y1 = exp(-x).*sin(x); y2 = exp(x); Ax = plotyy (x, y1, x, y2); hy1 = get(Ax(1),ylabel); hy2 = get(Ax(2),ylabel); set (hy1, string,e^-x .sen(x)); set (hy2, string,e^x); y = sen(x)/x, -3 x 3 x = linspace (-3*pi, 3*pi, 100); y = -sin(x)./x; area (x, y) xlabel (x); ylabel (sen(x)/x ); hold on x1 = x (46:55); y1 = y (46:55); area (x1, y1, facecolor,y);

plotyy

area

Funo

Comando

Grupo PET Engenharia Eltrica - UFMS Populao mundial por continentes cont = char(sia, Europa, frica, ... Amrica do Norte, Amrica do Sul); pop = [3332; 696; 694; 437; 307]; pie (pop) for i = 1:5, gtext (cont (i, : )); end title (Populao Mundial (1992), ... Fontsize, 18); Histograma de 50 de nmeros distribudos aleatoriamente entre 0 e 1. hist y = randn (50,1); hist (y)

pie

= e-t/5 sen t, 0 t 2 stem t = linspace(0, 2*pi, 200); f = exp(-.2*t).* sin(t); stem(t, f) r2 = 2 sen 5t, 0 t 2 y = r sen t stairs t = linspace(0, 2*pi, 200); r = sqrt (abs (2*sin(5*t))); y = r.*sin(t); stairs (t, y) axis([0 pi 0 inf]) z = cos + i sen , 0 2 compass th = -pi: pi/5:pi; zx = cos(th); zy = sin(th); z = zx + i*zy; compass (z);

36

Grupo PET Engenharia Eltrica - UFMS Funo Comando y = t sen t, 0 t 10 q = linspace(0, 10*pi, 200); y = q.*sin(q); comet (q, y); Obs.: melhor visualizar no MATLAB, pois ele desenhado gradualmente. z = - (x2/2) + xy + y2, -5 x 5 -5 y 5 contour r = -5: .2:5; [X, Y] = meshgrid (r, r); Z = -.5*X.^2 + X.*Y + Y.^2; cs = contour (X ,Y, Z); clabel (cs); z = x2 + y2 5sen(xy), -2 x 2, -2 y 2 quiver r = -2: .2: 2; [X, Y] = meshgrid (r, r); Z = X.^2 + Y.^2 5.*sin(X.*Y); [dx, dy] = gradient (Z, .2, .2); quiver (X, Y, dx, dy, 2); z = x2 + y2 5sen(xy), -2 x 2, -2 y 2 pcolor r = -2: .2: 2; [X, Y] = meshgrid (r, r); Z = X.^2 + Y.^2 5.*sin(X.*Y); pcolor (Z), axis(off ); shading interp Resultado

comet

5.6. USANDO O COMANDO SUBPLOT Se voc quer fazer alguns grficos lado a lado numa mesma figura (no sobrepostos), use o comando subplot para desenhar os seus grficos. O comando subplot requer 3 argumentos: subplot (m, n, p) O subplot divide a janela da figura em m x n sub-janelas e coloca o prximo grfico gerado na p-sima sub-janela, sendo p contado da esquerda para a direita e de cima para baixo. Ento, o comando subplot (2, 2, 3), plot (x, y) divide a janela de grficos em 4

37

Grupo PET Engenharia Eltrica - UFMS partes e insere o grfico de (x, y) na terceira sub-janela, que a primeira sub-janela da segunda linha. 5.7. GRFICOS 3D O MATLAB dispe de diversas funes que facilitam a visualizao do grfico 3D. De fato os colormap embutidos podem ser usados para representar a quarta dimenso. As facilidades dispostas incluem funes embutidas para plotar curvas espaciais, objetos em forma de grade, superfcies, superfcies com textura, gerando contornos automaticamente, especificando os pontos de luz, interpolando cores e textura e mesmo imagens digitando help graph3d no comando voc obtm uma lista de funes viveis para grficos 3D gerais. Aqui est uma lista dos mais comuns: plot3 stem3 bar3 bar3h pie3 comet3 fill3 contour3 guiver3 scatter3 mesh meshc meshz surf surfc surfl trimesh trisurf slice waterfall cylinder sphere plot curvas no espao cria dados discretos na plotagem fatiados. desenha grficos 3D em barras. idem acima para barras horizontais. desenha o grfico de pizza 3D. faz animao grfica para grficos 3D. desenha figuras 3D preenchidas. faz os contornos de um grfico 3D. desenha vetores de campo em 3D. faz grficos 3D espalhados. desenha superfcie. desenha superfcie ao longo de contornos. desenha superfcie com cortinas. desenha superfcie em 3D (igual ao mesh, porm preenchido). idem meshc, porm preenchido. cria superfcie com as fontes de luz especificadas. mesh com tringulos. surf com tringulos. desenha uma superfcie volumtrica em pedaos. cria um grfico em forma de cachoeira. cria um cilindro. cria uma esfera.

Entre estas funes plot3 e comet3 so anlogos ao plot e ao comet do 2D. 5.8. COMANDO VIEW O ngulo de vista do observador especificado com o comando view ( azimute, elevao) O azimute e a elevao so em graus. O azimute medido tendo o eixo z como referncia, contado no sentido anti-horrio. A elevao positiva acima do plano xy. O script file abaixo gera os dados, plota as curvas e obtm diferentes pontos de vista.

38

Grupo PET Engenharia Eltrica - UFMS Existem dois tipos especficos do comando view, especificando o padro 2D e 3D. view(2) view(3) o mesmo que view(0, 90). (padro 2D) o mesmo que view(37.5, 30). (padro 3D)
% --- Script file com exemplos de subplot e view --clf %limpar a figura anterior. t = linspace(0, 6*pi, 100); %Gera o vetor t. x = cos(t); y = sin(t); z = t; subplot(2,2,1) %Calcula x, y, z. %Divide a janela de grfico em 4 %e plota na primeira janela. plot3(x,y,z); grid %Plota a curva 3D com grades. xlabel('cos(t)'), ylabel('sen(t)'), zlabel('t') title('hlice circular'); subplot(2,2,2) %Plota na segunda sub-janela. plot3(x,y,z), view(0,90), %Vista de cima pelo eixo z. xlabel('cos(t)'), ylabel('sen(t)'), zlabel('t') title('Projeo no plano X-Y') subplot(2,2,3) %Plota na terceira sub-janela. plot3(x,y,z), view(0,0), %Vista ao longo do eixo y. xlabel('cos(t)'), ylabel('sen(t)'), zlabel('t') title('Projeo no plano X-Z') subplot(2,2,4) %Plota na quarta sub-janela. plot3(x,y,z), view(90,0), %Vista ao longo do eixo x. xlabel('cos(t)'), ylabel('sen(t)'), zlabel('t')

39

## Grupo PET Engenharia Eltrica - UFMS

title('Projeo no plano Y-Z')

40

Grupo PET Engenharia Eltrica - UFMS cada ponto dessas matrizes. Ns podemos ento avaliar z com o comando z = X.^2 Y.^2 Criar as duas matrizes X e Y muito mais fcil com o comando meshgrid: rx = 0:4; ry = -4:2:4; [X,Y] = meshgrid(rx,ry); X= 0 0 0 0 0 Y= -4 -4 -4 -4 -2 -2 -2 -2 0 0 0 0 2 2 2 2 4 4 4 4 -4 -2 0 2 4 % cria um vetor rx = [0 1 2 3 4] % cria um vetor ry = [-4 2 0 2 4] % cria um grid de 25 pontos e armazena essas % coordenadas em X e Y.

1 1 1 1 1

2 2 2 2 2

3 3 3 3 3

4 4 4 4 4

plot3

41

Grupo PET Engenharia Eltrica - UFMS Y = [0 0 0 0; 4 4 4 4; 4 4 4 4]; Z = [0 0 0 0; 1 1 1 1; -1 1 1 1]; fill3 (X, Y, Z, rand (3, 4)); view (120, 30) Desenho de linhas de contorno 3D de: Z = -5 / (1 + x2 + y2), -3 x 3, -3 y 3. contour3 r = linspace (-3, 3, 50); [x, y] = meshgrid (r, r); z = -5./(1 + x.^2 + y.^2); contour3 (z). z = cos x . cos y . e -5 y 5 surf
x 2 + y2 4

, -5 x 5,

u = -5: .2: 5; [X, Y] = meshgrid (u, u); Z = cos(X).* cos(Y).* ... exp(-sqrt(X.^2 +Y.^2)/4); surf(X, Y, Z) Funo Comando z = cos x . cos y . e -5 y 5
x 2 + y2 4

surfc

u = -5: .2: 5; [X, Y] = meshgrid (u, u); Z = cos(X).* cos(Y).* ... exp(-sqrt(X.^2 +Y.^2)/4); surfc (Z) view (-37.5, 20) axis(off ) z = cos x . cos y . e , -5 x 5, -5 y 5 u = -5: .2: 5; [X, Y] = meshgrid (u, u); Z = cos(X).* cos(Y).* ... exp(-sqrt(X.^2 +Y.^2)/4); surfl (Z) shading interp colormap hot
4 x 2 + y2

surfl

42

Grupo PET Engenharia Eltrica - UFMS z = -5/(1+x2+y2), -3 x 3, -3 y 3. mesh x = linspace (-3, 3, 50); y = x; [x, y] = meshgrid (x, y); z = -5./(1+x.^2+y.^2); mesh (z) z = -5/(1+x2+y2), -3 x 3, -3 y 3. meshz x = linspace (-3, 3, 50); y = x; [x, y] = meshgrid (x, y); z = -5./(1+x.^2+y.^2); meshz (z) view (-37.5, 50)

Funo

Comando z = -5/(1+x +y ), -3 x 3, -3 y 3.
2 2

waterfall

x = linspace (-3, 3, 50); y = x; [x, y] = meshgrid (x, y); z = -5./(1+x.^2+y.^2); waterfall (z) hidden off Populao mundial por continente. % Popdata: As, Eu, Af, NA, AS

pie3

pop = [3332; 696; 694; 437; 307]; p ie3 (pop) title (Populao Mundial) Desenho de dados discretos com fatias. x = t, y = t sen (t), z = e t/10 1. 0 t 6. 43

stem3

## Grupo PET Engenharia Eltrica - UFMS

t = linspace (0, 6*pi, 200); x = t; y= t.*sin(t); z = exp(t/10) 1; stem3 (x, y, z, filled) xlabel (x), ylabel (x sen(x)), zlabel (e^(t/10) - 1); Curvas 2D desenhadas como tiras 3D y1=sen t, y2 = e 15 t sen t, y3 = e 8 t sen t 0 t 5. ribbon t = linspace (0, 5*pi, 100); y1 = sin(t); y2 = exp(-15*t).*sin(t); y3 = exp(-8*t).*sin(t); y = [y1; y2; y3]; ribbon (t, y, .1);

Funo

Comando Uma unidade de esfera centrada na origem e gerada por 3 matrizes x, y e z de tamanho 21x21 cada. sphere (20) ou [x, y, z] = sphere (20); surf (x, y, z); Um cilindro gerado por r = sen (3 z) + 2, 0 z 1, 0 2. z = [0: .02: 1]; r = sin(3*pi*z) + 2; cylinder (r) Pedaos de uma funo volumtrica. (x, y, z) = x2 + y2 z2; -3 x 3, -3 y 3, -3 z 3.

sphere

cylinder

slice

44

Grupo PET Engenharia Eltrica - UFMS v = [-3: .2: 3]; [x, y, z] = meshgrid (v, v, v); f = (x.^2 + y.^2 z.^2); xrows = [10, 31]; yrows = 28; zrows = 16; slice (f, xrows, yrows, zrow); view ([-30 30]) O valor da funo indicada por uma intensidade de cor.

45

Grupo PET Engenharia Eltrica - UFMS % SURFINTERP: Script file que gera uma superfcie interpolada % Dado os vetores x, y, e z, gera a matriz de dados Zi da interpolao para ajustar uma superfcie %------------------------------------------------------------------------------------------------------xv=2*rand(1,100) 1; yv=2*rand(1,100) 1; zv=3./ (1+ xv.^2 + yv.^2) stem3(xv, yv, zv) xi=linspace(-1, 1, 30); espaados yi=xi; espaados %este o vetor x %este o vetor y %este o vetor z %mostra os dados como um grfico stem %cria xi com os dados uniformemente %cria yi com os dados uniformemente

%observe que yi uma coluna [Xi, Yi, Zi]=griddata (xv, yv, zv, xi, yi, v4 ); % superfcie interpolada usando o mtodo v4 (MATLAB 4 % griddata) de interpolao surf(Xi,Yi,Zi) %plota a superfcie

46

## Grupo PET Engenharia Eltrica - UFMS

Grupo PET Engenharia Eltrica - UFMS propriedades dos objetos. Uma vez que nem todos os objetos grficos so independentes (por exemplo, o aparecimento de uma linha est ligado um eixo em uso), uma certa propriedade de um deles pode afetar as propriedades de outros, ento importante saber como os objetos se relacionam. 5.13. A HIERARQUIA DOS OBJETOS Os objetos grficos seguem uma hierarquia de parentesco pai-filho. A Raiz Os Graphics Screen

## Figuras Uicontrols Linhas Patch Eixos Texto Uimenus Imagem Superfcie

importante conhecer esta estrutura por dois motivos: Mostra para voc quais objetos so afetados se voc mudar um valor defualt de uma propriedade em um nvel em particular, e Diz a voc em qual nvel voc pode perguntar por handles de quaisquer objetos. 5.14. OBJETOS HANDLES Objetos Handles so identificadores nicos associados a cada objeto grfico. Estes handles tm uma representao em ponto flutuante. Handles so cridos no momento da criao do objeto por funes grficas tais como plot(x, y), contour(z), line(z1 , z2), text( xc , yc , Olhe aqui rapaz), etc. Obtendo Objetos Handles Existem duas formas de obteno de handles: 1. Criao de handles explicitamente por meio dos comandos object-creationlevel (isto , voc pode plotar e obter seu handle na mesma hora): h1 = plot (x , y , r-) retorna o handle da linha para h1 hx1 = xlabel (ngulo) retorna o handle do eixo x para hx1 2. Pelo uso explcito de funes de retorno de handles: gfc obtm o handle da figura atual Exemplo: hfig = gfc, retorna o handle da figura em hfig.

48

Grupo PET Engenharia Eltrica - UFMS gca gco obtm o handle do eixo atual Exemplo: haxes = gca, retorna o handle do eixo atual em haxes. obtm o handle do objeto atual

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

## 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. 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);

52

Grupo PET Engenharia Eltrica - UFMS 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 paifilho 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 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 ) 53

Grupo PET Engenharia Eltrica - UFMS 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

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

% 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.

59

## Grupo PET Engenharia Eltrica - UFMS

while(t<tfinal); t = t + dt; theta = theta + thetadot*dt; thetadot = thetadot -sin(theta)*dt; R = [cos(theta) -sin(theta); sin(theta) cos(theta)]; datanew = R*data; %----- muda os valores das propriedades dos objetos: path e bar. set(path,'xdata',datanew(1,1),'ydata',datanew(2,1)); set(bar,'xdata',datanew(1,:),'ydata',datanew(2,:)); drawnow;

end

Exemplo-4: O pndulo de barra oscila, e outros dados so exibidos: Agora aqui est o desafio. Se voc puder entender o seguinte script file, voc est em boa forma! Voc est pronto para fazer praticamente qualquer animao. O exemplo seguinte divide a tela grfica em quatro partes, mostra o movimento do pndulo em uma parte, mostra a posio da extremidade na segunda parte, plota o deslocamento angular na terceira parte e a velocidade angular na quarta parte (veja fig.6.18). Existem quatro animaes ocorrendo simultaneamente. Tente! H um erro intencional em uma das quatro animaes. Se voc iniciasse o pndulo da posio vertical perpendicular com uma velocidade angular inicial (voc precisa mudar a declarao thetadot = 0 dentro do programa), ento voc veria o erro. V em frente, encontre o erro e elimine-o.
% ------- script file para animar um pndulo e os dados -------% Conseguir os dados bsicos para a animao. % Perguntar para o usurio sobre as posies iniciais. disp('Por favor especifique o ngulo inicial a partir da'); disp('posio vertical superior direita.'); disp(' ') offset = input('Entre com o ngulo inicial agora: '); % Pede para o usurio o tempo de simulao. tfinal = input('Por favor entre com a durao da simulao: '); disp('Eu estou trabalhando ...') theta = pi-offset; % ngulo inicial. thetadot = 0; % Velocidade angular inicial. dt = .2; t = 0; tf = tfinal; % Tempo de passo, tempo inicial e final. disp('Veja os grficos na tela') clf % Limpar a figura h1 = axes('position', [.6 .1 .4 .3]); axis([0 tf -4 4]); % Seleciona os limites do eixo. xlabel('tempo'); ylabel('Deslocamento'); Displ = line('xdata', [],'ydata', [],'marker','.','erasemode','none'); h2 = axes('position', [.6 .55 .4 .3]); axis([0 tf -4 4]); % Seleciona os limites do eixo. xlabel('tempo'); ylabel('Velocidade'); Vel = line('xdata', [],'ydata', [],'marker','.','erasemode','none'); h3 = axes('position', [.1 .1 .4 .4]);

60

## Grupo PET Engenharia Eltrica - UFMS

axis([-pi pi -4 4]); % Seleciona os limites do eixo. axis('square'); phase = line('xdata',[],'ydata',[], ... 'marker','o','markersize',5 ,'erasemode','none'); h4 = axes('position', [.1 .55 .4 .4]); axis([-2 2 -2 2]); % Seleciona os limites do eixo. axis('square'); data = [0 0;-1.8 0]; % Coordenadas de pontos finais da barra. phi = 0; % Orientao inicial. R = [cos(phi) -sin(phi); +sin(phi) cos(phi)]; % Rotaciona a matriz. data = R*data; % ---- Define os objetos chamados bar, hinge e path bar = line('xdata',data(1,:), ... 'ydata',data(2,:),'linewidth',3,'erase','xor'); hinge = line('xdata',[],'ydata',[],'marker','.','erasemode','none'); path = line('xdata',[],'ydata',[],'marker','.','erasemode','none'); % ---- Mtodo de Euler para a integrao numrica. ---while (t < tfinal); t = t + dt; theta = theta + thetadot*dt; thetadot = thetadot - sin(theta)*dt; R = [cos(theta) (-sin(theta)); sin(theta) cos(theta)]; datanew = R*data; % ---- Muda os valores das propriedades dos objetos: path e bar. set(path,'xdata',datanew(1,1),'ydata',datanew(2,1)); set(bar,'xdata',datanew(1,:),'ydata',datanew(2,:)); set(phase,'xdata',theta,'ydata',thetadot); set(Displ,'xdata',t,'ydata',theta); set(Vel,'xdata',t,'ydata',thetadot); drawnow; end

61

62

## Grupo PET Engenharia Eltrica - UFMS

6. PROGRAMANDO NO MATLAB: FUNES E PROCEDIMENTOS Para o estudo deste captulo, o essencial saber a diferena entre uma funo e um procedimento. Ambos so subrotinas, que so uma seqncia de comandos que so dados ao comutador pelo programador, mas a funo possui entradas e sadas e o procedimento no. Algumas vezes chamaremos os procedimentos de script files. 6.1. PROCEDIMENTOS Sempre que voc quiser escrever um procedimento basta escrever os mesmos comandos que voc digitaria na rea de trabalho (parte interativa do MATLAB) dentro de um arquivo *.m. interessante fazer um procedimento sempre que voc tiver um grupo de comandos muito grande e preciso executa-lo vrias vezes. Armazenando este grupo de comandos num arquivo script, basta escrever o nome do arquivo na rea de trabalho e o mesmo grupo de comandos ser executado. Cuidado: Nunca nomeie um arquivo script com o mesmo nome de uma varivel que ele computa. Quando o MATLAB procura por um nome, ele busca primeiro na lista de variveis existentes na rea de trabalho, ou seja, se existir uma varivel com o mesmo nome de um arquivo script ele jamais ser aberto. O nome o arquivo deve comear com uma letra e os restantes devem ser dgitos, exceto o ponto ( . ). Voc pode escrever nomes longos, mas o MATLAB ir pegar somente os primeiros 19 caracteres. Fique atento com as variveis que voc trabalha nos procedimentos, porque todas as variveis que voc declarar ficaro na rea de trabalho a menos que voc as limpe. Evite nomes que coincidam com as funes embutidas. bom checar se os nomes propostos j existem. Voc pode fazer isso com o comando exist(nome), que retornar zero se no houver nada com este nome. 6.2. FUNES Para se fazer uma funo, deve-se fazer quase a mesma coisa do que com o procedimento. A nica diferena que a funo necessita de uma linha de definio com a seguinte sintaxe: function [variveis_de_sada] = nome_da_funo (variveis_de_entrada); Exemplos: Linha de Definio da funo function [rho, H, F] = motion(x, y, t); function [theta] = anguloTH(x, y, t); function theta = THETA(x, y, t); function [] = circulo(r); function circulo(r); Nome da funo motion.m anguloTH.m THETA.m circulo.m circulo.m 63

## Grupo PET Engenharia Eltrica - UFMS

64

Grupo PET Engenharia Eltrica - UFMS para a funo e det_A e x ser a sada. Vamos chamar esta funo de solvexf. Como uma regra, ela deve ser salvada em um arquivo chamado sovexf.m. function [det_A,x] = solvexf(r); % SOLVEXF resolve uma equao de matriz 3x3 com parmetro r % Esta a funo solvexf.m % Para chamar esta funo, digite: % [det_A,x] = solvexf(r) ; % r a entrada e det_A e x so as sadas. %--------------------------------------------------------A = [5 2*r r; 3 6 2*r-1; 2 r-1 3*r]; % cria a matrix A b = [2;3;5] ; % cria o vetor b det_A = det(A); % resolve o determinante x = A\b ; % encontra x. Agora r, x e det_A so todas variveis locais. Portanto, alguns outros nomes de variveis podem ser usados no lugar delas no momento da execuo da funo (repare que no exemplo abaixo usamos detA ao invs de det_A e y no lugar de x). Vamos executar esta funo no MATLAB. >> [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

66

67

68

69

## Grupo PET Engenharia Eltrica - UFMS

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. Uma alternativa prescrever os valores na arquivo script e faz-los disponveis para a funo ode1 atravs de uma declarao global.

70

## Grupo PET Engenharia Eltrica - UFMS

% 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 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

71

Grupo PET Engenharia Eltrica - UFMS 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 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

72

Grupo PET Engenharia Eltrica - UFMS 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 <= 0 break % termina execuo do lao end for i=1:n ..... % faz alguma coisa end end Caso haja um lao dentro de outro, o comando break finaliza somente o lao mais interno. Error O comando error (mensagem) dentro de uma funo ou um script aborta a execuo, mostra uma mensagem de erro e retorna o controle para o teclado. Exemplo:

73

## Grupo PET Engenharia Eltrica - UFMS

function c = crossprod (a,b); % crossprod (a,b) calcula o produto vetorial axb. if nargin~=2 % se no h 2 argumento de entrada error (Desculpe, precisa da entrada de 2 vetores) end if length(a)==2 % inicia os clculos ...... end

## Return O comando return simplesmente retorna o controle da funo chamada. Exemplo:

function animatebar(t0, tf, x0); % animatebar anima um pndulo : disp(Voc deseja ver o retrato da fase?) ans = input (Digite 1 para SIM, e 0 para NO); % descrio abaixo if ans= = 0 % se o input 0 return % sair da funo else plot(x,...) % mostra a plotagem da fase end

Este comando pode ser usado para escrever programas interativos amigveis no MATLAB.

74

Grupo PET Engenharia Eltrica - UFMS Keyboard O comando keyboard dentro de um script ou uma funo retorna o controle para o teclado no exato ponto onde o comando ocorre. A execuo da funo ou o script no esto terminados. O prompt da janela de comandos >>, 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

## Exemplo: % Plotando um crculo 75

Exemplo: for i = 1:n, plot(X(:,i),Y(:,i)), pause(5), end pra por 5 segundos antes de plotar o prximo grfico. 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:

76

Grupo PET Engenharia Eltrica - UFMS Fopen Fclose Fread Fwrite Fscanf Fprintf Fgets Fgetl Frewind Fseek Ftell Ferror Abre um arquivo existente ou cria um novo Fecha um arquivo aberto L dados binrios de um arquivo Escreve dados binrios para um arquivo L strings em formato especificado Escreve dados em um string formatado L uma linha de um arquivo excluindo NEW-LINE CHARACTER L uma linha de um arquivo incluindo NEW-LINE CHARACTER rebobina um arquivo Escolhe o indicador de posio do arquivo D a indicao correta da posio do arquivo Investiga o status de erro do arquivo I/O

Grupo PET Engenharia Eltrica - UFMS -35 -30 -25 -20 -15 -10 -5 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 -37.22 -34.44 -31.67 -28.89 -26.11 -23.33 -20.56 -17.78 -15.00 -12.22 -9.44 -6.67 -3.89 -1.11 1.67 4.44 7.22 10.00 12.78 15.56 18.33 21.11 23.89 26.67 29.44 32.22 35.00 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!)

79

## 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 95 ans = 72 75 78 ans = 85 35 66 for k = 1:3, all_notas(k,:) = Turma(k).notas; end 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.

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

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. 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

84

Grupo PET Engenharia Eltrica - UFMS 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

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 o b ainda no existe ocorreu este erro. Portanto, no use vrgulas nos comandos global, save ou load. Um outro erro parecido ocorre no lao for quando se digita: for i = 1, n. Contudo o MATLAB no dar uma mensagem de erro, ele ir executar o lao apenas uma vez (para i = 1) e retornar o valor de n. plot (d, d1) ??? Error using ==> plot Vectors must be the same lengths. Os vetores de entrada no comando plot devem ser compatveis. Para mais detalhes, veja os comentrios sobre o comando plot no captulo de grficos.

89

## Apndice (Respostas dos exerccios do tutorial)

Os comandos abaixo resolvem os problemas do captulo de tutorial. Lio 1: Criando e Trabalhando com Vetores 1. x = [0 1.5 3 4 5 7 9 10]; y = 0.5*x-2 Resposta: y = [-2.0000 1.2500 0.5000 0 0.5000 1.5000 2.5000 3.0000]. 2. t = 1:10; x = t.*sin(t) y = (t-1)./(t+1) z = sin(t.^2)./(t.^2) 3. theta = [0; pi/4; pi/2; 3*pi/4; pi; 5*pi/4] r = 2; x = r*cos(theta); y = r*sin(theta); x.^2 + y.^2 4. n = 0:10; r = 0.5; x = r.^n; s1 = sum(x) n = 0:50; x = r.^n; s2 = sum(x) n = 0:100; x = r.^n; s3 = sum(x) Resposta: s1 = 1.9990, s2 = 2.0000 e s3 = 2. Lio 2: Plotando Grficos Simples 1. x = linspace(0, 4*pi, 10); % Com 10 pontos y = exp(-.4*x).*sin(x); plot (x, y) x = linspace(0, 4*pi, 50); % Com 50 pontos y = exp(-.4*x).*sin(x); plot (x, y) x = linspace(0, 4*pi, 100); % Com 100 pontos y = exp(-.4*x).*sin(x); plot (x, y) 2. t = linspace(0, 20, 100); plot3(sin(t), cos(t), t) 3. x = 0:10:1000; y = x.^3; semilogx (x, y) semilogy (x, y) loglog (x, y)

90

Grupo PET Engenharia Eltrica - UFMS Lio 3: Criando, Salvando e Executando Procedimentos 1. Substitua o comando plot(x, y) pelo comando plot(x, y, 0, 0, +) no arquivo circle.m. 2. O seu script file modificado deve se parecer com isso: % CIRCLE procedimento que desenha um crculo unitrio % ---------------------------------r = input(Entre com o raio do crculo: ) theta = linspace(0, 2*pi, 100); % cria o vetor theta. x = r*cos(theta); % gera a coordenada x y = r*sin(theta); % gera a coordenada y plot(x, y); % Desenha o crculo axis(equal); % iguala a escala dos eixos title(Crculo com o raio fornecido) % pe um ttulo Lio 4: Criando e Executando uma Funo 1. function temptable = ctof(tinitial, tfinal); % CTOF : Funo que converte a temperatura de C para F. % sintaxe de chamada: % temptable = ctof(tinitial, tfinal); % -----------------C = [tinitial:tfinal]; % cria um vetor coluna C F = (9/5)*C + 32; % calcula o correspondente em F. temptable = [C F]; % matriz de 2 colunas com C e F. 2. function w = prodvet(u, v); % PRODVET: funo que calcula w = u x v para vetores u e v. % sintaxe de chamada: % w = prodvet(u, v); % -------------------if length(u) > 3 | length(v) > 3, % se u OU v tm mais de 3 % elementos error(Pergunte ao Euler. Este vai alm de mim.) end w = [u(2)*v(3)u(3)*v(2); u(3)*v(1)u(1)*v(3); u(1)*v(2)u(2)*v(1)]; 3. function s = somaserieg(r,n); % SOMASERIEG: calcula a soma de uma srie geomtrica. % A srie 1 + r + r^2 + r^3 + ... + r^n. % sintaxe de chamada: % s = somaserieg(r,n); % ----------------nvetor = 0:n; % cria um vetor de 0 a n. serie = r.^nvetor; % cria um vetor com os termos da srie. s = sum(serie); % soma os elementos do vetor serie.

91