Você está na página 1de 91

MATLAB

Uma Linguagem Tcnica de Computao

2. Edio

Grupo PET Engenharia Eltrica UFMS

Campo Grande MS Maio 2004

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

Apndice (Respostas dos exerccios do tutorial)________________________________90

Grupo PET Engenharia Eltrica - UFMS

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

Grupo PET Engenharia Eltrica - UFMS

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

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

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

Grupo PET Engenharia Eltrica - UFMS

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

Grupo PET Engenharia Eltrica - UFMS

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

A(2,3)

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

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

Ento A = [A; u] produz A=

1 0 0 5

0 1 0 6

0 0 1 7

, uma matriz 4x3,

1 0 0 2

A = [A,v]

produz

A=

0 1 0 3 0 0 1 4

, uma matriz 3x4,

1 0 0 5

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

produz produz

A=

0 1 0 6 0 0 1 7

, uma matriz 3x4,

um erro. produz B = [ 1 2 3 ], 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).

Multiplicao de um vetor por uma matriz.

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.

Raiz quadrada de cada elemento da matriz 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

Resultado

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

Resultado 34

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

Resultado 35

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')

5.9. ROTACIONAR A VISTA Existe um comando chamado rotate3d, que simplesmente possibilita girar o grfico 3D com o mouse. Existem tambm funes como zoom, roll, pan, etc. Veja a ajuda on-line no graph3D. 5.10. GRFICOS DE MALHA E SUPERFCIE As funes para plotagem de malhas e superfcies (mesh e surf) e suas variveis meshz, meshc, surfc e surfl possuem mltiplos argumentos opcionais, a maioria formando mesh(Z) e surf(Z) onde z representa uma matriz. Superfcies geralmente so representadas pelos valores de coordenada z mostrados em uma grade de valores (x,y). Portanto para criar uma superfcie primeiramente precisamos gerar uma grade (x,y) de coordenadas e definir a altura (a coordenada z) das superfcies de cada um dos pontos da grade. Note que voc precisa fazer o mesmo para plotar uma funo de duas variveis. O MATLAB dispe da funo meshgrid para criar uma grade de pontos abaixo de um alcance especificado. Exemplo: Plotar a funo z = x2 y2, entre o domnio de 4 x 4 e 4 y 4. Para fazer isso, ns primeiro formamos 25 pontos na grade. Ns podemos criar duas matrizes X e Y sendo cada uma de tamanho 5 x 5 e escrever as coordenadas xy de

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

Os comandos mostrados acima geraram os 25 pontos necessrios. A grade pode ser criada com o comando meshgrid: [X,Y] = meshgrid(rx,ry); quando rx e ry so vetores especificando o local das linhas de grade ao longo dos eixos x e y. Tudo o que ns precisamos gerar dois vetores, rx e ry, para definir a regio de interesse de distribuio dos pontos. Tambm os dois vetores no precisam ser do mesmo tamanho ou linearmente espaados (contudo, na maioria das vezes ns pegamos a regio quadrada e criamos os pontos de grade igualmente espaados em ambas as direes). Para utilizar bem grficos 3D preciso entender o uso do meshgrid Funo Comando Desenho de uma curva paramtrica espacial: x(t) = t, y(t) = t2, z(t) = t3. 0 t 1 t = linspace (0, 1, 100); x = t; y = t.^2; z = t.^3; plot3 (x, y, z), grid fill3 Desenho de 4 polgonos preenchidos com 3 vrtices cada: X = [0 0 0 0; 1 1 1 1; 1 1 1 1]; Resultado

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

Resultado , -5 x 5,

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

Resultado

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.

Resultado

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.

5.11. GRFICOS DE SUPERFCIE INTERPOLADOS Muitas vezes, ns obtemos dados (geralmente a partir de experimentos) na forma da tripla (x, y, z), e queremos ajustar uma superfcie a partir dos dados. Assim, ns temos um vetor Z que contm os z-valores correspondendo aos valores x e y irregularmente espaados. Aqui ns no temos uma grade regular, como a criada pelo comando meshgrid, e no temos uma matriz Z que contm os z-valores da superfcie naqueles pontos da grade. Portanto, ns temos que ajustar a superfcie a partir das variveis dadas(xi , yi , zi). A incumbncia muito mais simples do que parece. O MATLAB dispe de uma funo, griddata, que faz esta interpolao para ns. A sintaxe geral desta funo [Xi , Yi , Zi] = griddata (x , y , z , xi ,yi , mtodo) onde x, y, z so os vetores dados (espaados no-uniformemente), xi e yi so os pontos prescritos pelo usurio (com certeza, uniformemente espaados) no qual z i so calculados pela interpolao, e mtodo a escolha do algoritmo de interpolao. Os algoritmos disponveis so nearest, linear, cubic e v4. Veja a documentao on-line para a descrio destes mtodos. Como exemplo vamos considerar 50 pontos randomicamente distribudos no plano xy, no limite 1< x <1, e 1< y <1. Os valores de z nestes pontos so determinados por z= 3/(1+x2+y2). Assim, ns temos 3 vetores de comprimento 50 cada um. Os dados dos pontos so mostrados na figura pelo stem plot.

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

5.12. MANEJAR COM GRFICOS A linha um objeto grfico. Ela tem vrias propriedades tipo de linha, cor, intensidade, visibilidade, etc. Uma vez que uma linha desenhada numa tela de um grfico, possvel mudar qualquer uma das propriedades depois. Suponha que voc queira mudar umas das linhas, voc primeiro deve escolher a linha que voc quer mudar e ento mudar o que voc no gosta nela. Num grfico, uma linha pode estar entre vrios objetos grficos (eixos, textos, legendas, etc). Ento como voc pode identificar esta linha? Voc consegue identificar uma linha pela sua handle. O que handle? O MATLAB atribui um floating-point number para todo objeto na figura (incluindo objetos invisveis), e usa este nmero como um endereo ou nome para o objeto na figura. Este nmero o handle do objeto. Uma vez que voc obtenha o handle, voc pode acessar todas as propriedades do objeto. Em suma, o handle identifica o objeto e o objeto carrega com ele a lista de suas propriedades. Em programao, este approach de definir objetos e suas propriedades chamado programao orientada a objeto. A vantagem que isso oferece que voc pode acessar objetos individuais e suas propriedades e mudar qualquer propriedade de um objeto sem afetar outras propriedades ou objetos. Assim, voc obtm um controle completo sobre os objetos grficos. Todo o sistema do MATLAB de grficos orientados a objeto e sua controlabilidade referido ao HANDLE GRAPHICS. Aqui ns discutiremos resumidamente este sistema e seu uso, mas s aconselhamos aos leitores mais interessados a consultar o User Guide para maiores detalhes. A chave para o entendimento e uso do sistema HANDLE GRAPHICS saber como obter os handles dos objetos grficos e como usar os handles para obter e mudar as 47

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

Handles de outros objetos pode ser obtido atravs do comando get. Por exemplo, hlines = get (gca , children) retorna os handles de todos os filhos do eixo atual em um vetor coluna hlines. A funo get usada para obter o valor da propriedade de um objeto, especificado por seu handle, na forma do comando get (handle, Nome da Propriedade) Para um objeto com handle h, digite get(h) para obter uma lista de todos os nomes das propriedades e seus valores atuais. Exemplos: h1 = plot (x , y) plota uma linha e retorna o handle h1 da linha plotada. get (h1) lista todas as propriedades da linha e seus valores. get (h1 , type) mostra a classe do objeto (neste caso uma linha). get (h1 , linestyle) retorna o estilo de linha atual da linha. Para maiores informaes sobre get, veja o on-line help. 5.15. PROPRIEDADES DOS OBJETOS Todos os objetos grficos sobre a tela tm certas propriedades associadas a eles. Por exemplo, as propriedades e uma linha incluem type, parent, visible, color, linsetyle, linewidth, xdata, ydata, etc. igualmente, as propriedades de um objeto de texto, tais quais xlabel ou title, incluem type, parent, visible, color, fontname, fontsize, fontweight, string, etc. Uma vez conhecido o handle de um objeto, voc pode ver uma lista de suas propriedades e seus valores atuais com o comando get (handle). Por exemplo, veja o algoritmo as propriedades de uma linha e seus valores atuais. Existem algumas propriedades comuns para todos os objetos grficos. Estas propriedades so: children, clipping, parent, type, userdata, e visible. >> t=linspace(0, pi, 50); >> hL=line(t, sin(t) ); >>get (hL); Color = [0 0 1] EraseMode = normal Linestyle = Linewidth = [0.5] Marker = none MarkerSize = [6] MarkeredgeColor = auto MarkerFaceColor = none Xdata = [(1 by 50) double array] Ydata = [(1 by 50) double array] Zdata = [ ]

49

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

50

Grupo PET Engenharia Eltrica - UFMS

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

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

Muda o estilo de linha para tracejado.

set(hL,linestyle,--);

Muda a espessura da linha.

set(hL,linewidth,3);

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

51

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

Fazer o texto centrado em (0.5, 0.5) e muda a fonte e o tamanho da fonte. 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

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

56

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

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

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

57

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

end

58

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

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

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

59

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

Grupo PET Engenharia Eltrica - UFMS

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

Cuidado: A palavra function deve ser escrita em letras minsculas. Um erro muito comum iniciar a declarao com Function. 6.3. EXECUTANDO UMA FUNO Existem dois modos em que uma funo pode ser executada, ela pode ser embutida ou escrita pelo usurio: 1. Com sada explicita: Esta a sintaxe integral de chamar uma funo. Ambas as listas de sada e entrada so especificadas na declarao. Por exemplo, se a linha de definio de uma funo : function [rho,H,F] = motion(x,y,t); ento todos os seguintes comandos representam a sua execuo; [r,angmom,force] = motion(xt,yt,time); As variveis de entrada xt, yt e time devem ser definidas antes de executar este comando. [r,h,f] = motion(rx,ry,[0:100]); As variveis de entrada rx e ry devem ser definidas anteriormente, a terceira entrada, a varivel t especificada na execuo. [r,h,f] = motion(2,3.5,0.001); Todos os valores de entrada so especificados na execuo. [radius,h] = motion(rx,ry); Chamada com lista parcial de entrada e sada. Na terceira varivel de entrada deve ser nomeado um valor default (padro) dentro da funo se ela for requerida nos clculos. A sada corresponde aos primeiros dois elementos da lista de sada da funo motion. 2. Sem sada: A lista de sada pode ser omitida completamente se as quantidades computadas no so de algum interesse. Este pode ser o caso quando a funo exibe o resultado desejado graficamente. Para executar a funo deste modo, apenas escreva o nome da funo com a lista de entrada. Por exemplo, motion(xt,yt,time); executar a funo motion sem gerar alguma sada explicita, contando que xt, yt, e time so definidos. Se o ponto e vrgula no fim da declarao omitido, a primeira varivel de sada na lista de sada das funes mostrada na varivel default (padro) chamada ans. A funo pode ser escrita para aceitar uma lista parcial de entradas se alguns valores default (padro) das outras entradas no especificadas esto definidas dentro da funo. Este tipo de lista de entrada pode ser feita com a funo embutida nargin, o qual se estende por um nmero de argumentos de entrada. Da mesma forma, a lista de sada pode ser manipulada com a funo embutida nargout. Veja a ajuda on-line em nargin e nargout. Para um exemplo de como usa-los, olhe na funo fplot digitando type fplot.m. Exemplo de um Arquivo Funo: Vamos escrever uma funo para resolver o mesmo sistema de equaes lineares que ns resolvemos usando o procedimento. Desta vez, ns faremos r uma entrada

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

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

66

Grupo PET Engenharia Eltrica - UFMS

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

67

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

68

Grupo PET Engenharia Eltrica - UFMS profile done % obrigado, tchau

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

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

6.13. ENTRADA INTERATIVA Os comandos input, keyboard, menu e pause podem ser usados dentro de um script ou uma funo para entradas interativas feitas pelo usurio. Suas descries esto logo abaixo: Input O comando input(Texto), usado no exemplo anterior, mostra na tela o texto que est no lugar de Texto e espera o usurio a dar entrada pelo teclado. Exemplo: n = input(Maior tamanho da matriz quadrada); alerta o usurio a entrar com o tamanho da maior matriz quadrada e salva a entrada em n. more = input(Mais simulaes? (S/N), s); alerta o usurio a digitar S para SIM e N para NO e armazena a entrada como uma string em more. Note que o segundo comando, s, do comando, direciona o MATLAB a salvar a entrada como uma string.

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

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

Exemplo: % Plotando um crculo 75

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

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

J satisfatrio usar os seis primeiros comandos listados acima. Para a maioria dos propsitos fopen, fprintf e fclose so suficientes. Este um exemplo simples que usa fopen, fprint e fclose para criar e escrever dados formatados para um arquivo: % TEMTABLE gera e escreve a tabela de temperatura % Arquivo script para gerar uma tabela de temperatura. % A tabela est em um arquivo chamado Temperature.table. %--------------------------------------------------------F = -40:5:100; C = (F - 32)*5/9; t = [F; C]; fid = fopen(Temperature.table, w); fprintf(fid, Temperature.table\n ); fprintf(fid,~~~~~~~~~~~~~~\n); fprintf(fid, Fahrenheit Celsius\n); fprintf(fid, %4i %8.2f\n, t); fclose(fid); No arquivo de script acima, o primeiro comando I/O, fopen, abre um arquivo temperature.table no modo de escrita (write) especificado por um w no comando e designa o identificador de arquivo para fid. Os seguintes fprintf usam fid para escrever as strings e os dados no arquivo em questo. Os dados so formatados de acordo com as especificaes no argumento-string de fprintf. No comando acima, \n insere uma nova linha, %4i insere um campo ntegro de largura 4, e %8.2f insere um ponto fixo de largura 8 e 2 casas decimais aps a vrgula. O arquivo de sada, Temperature.table, mostrado abaixo. Note que a matriz de dados t tem duas filas, no qual o arquivo de sada escreve a matriz em 2 colunas. Isto porque t lida columnwise (coluna sbia) e ento escrito no formato especificado (2 linhas em cada coluna). Temperature Table ~~~~~~~~~~~~~~ Fahrenheit Celsius -40 -40.00 77

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!)

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

79

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

Quando requisitado, o MATLAB mostra a estrutura.

80

Grupo PET Engenharia Eltrica - UFMS Turma(2).curso = 'Fsica'; Turma(3).curso = 'Computao'; Turma(2).prof = 'Mauro'; Turma(3).prof = 'Karen'; Turma(2).notas = [72 75 78]; Turma(3).notas = [85 35 66]; Turma Aps adicionar mais 2 registros, Turma torna-se um vetor, e, quando requisitado, o MATLAB Turma = mostra informaes sobre a estrutura; 1x3 struct array with fields: curso prof notas Turma(2).curso ans = Fsica Turma(3).notas(1) ans = 85 Turma.notas ans = 80 75 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

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

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

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

87

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

88

Grupo PET Engenharia Eltrica - UFMS nome de uma varivel no MATLAB ele retorna o valor dessa varivel, e como 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

Grupo PET Engenharia Eltrica - UFMS

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