Preview only show first 10 pages with watermark. For full document please download

Apostila De Matlab

apostila de matlab

   EMBED

  • Rating

  • Date

    December 2018
  • Size

    2.4MB
  • Views

    3,825
  • Categories


Share

Transcript

Introdução 1.1 Informações iniciais O Matlab (abreviatura de Matriz Laboratory - Laboratório de Matrizes) é um software de simulação matemática que realiza operações matriciais, constrói gráficos em duas ou três dimensões, auxilia no processamento de sinais, além de manipular outras funções especializadas. Ele trabalha com uma linguagem de programação de alto nível, em um ambiente interativo, para o desenvolvimento de algoritmos, análise e visualização de dados e computação numérica. Próprio para as áreas técnica e científica, o software tem funções de tratamento numérico de alto desempenho, capazes de resolver problemas computacionais técnicos de forma mais eficiente do que as tradicionais linguagens de programação. Além do ambiente interativo, outra facilidade do Matlab é a possibilidade de execução de arquivos texto, contendo uma seqüência de instruções definidas pelo usuário. Esses arquivos texto, que têm extensão ‘. m’, podem ser criados e editados dentro ou fora do seu ambiente. 1.2 Janelas Através de objetos gráficos denominados janelas, o usuário opera as funcionalidades do programa de forma interativa. A janela principal do Matlabr chama-se Command Window (Janela de Comando), onde os dados e instruções são digitados no prompt ‘>>’ pelo usuário e, após a tecla Enter ser pressionada, o programa os processa imediatamente e expõe na tela o resultado. Os comandos digitados são armazenados em um buffer de comandos, no qual se pode navegar usando as teclas seta-para-cima ‘"’ e seta-para-baixo ‘#’. Além disso, teclando-se o texto ‘str’, por exemplo, e usando-se as setas ‘"’ e ‘#’, navega-se por todos os comandos iniciados com o texto ‘str’. A tecla Esc. limpa o que estiver escrito na linha do comando. Comandos terminados com ponto-e-vírgula não exibem as variáveis de resposta na tela. O uso do ponto-e-vírgula é útil quando a impressão do resultado na tela não interessa, ou quando a impressão é muito extensa como, por exemplo, para uma matriz 1000 × 1000. Deve-se ressaltar que, apesar da impressão ser suspensa, o comando é executado pelo programa. Vários comandos podem ser digitados na mesma linha, desde que estejam separados por vírgula ou ponto-e-vírgula. Comandos muito longos para uma linha podem ser interrompidos por três pontos ‘... ’ e continuados na linha seguinte. O exemplo a seguir é ilustrativo quanto a esses detalhes. >> a=1, b==... 2; c=a+b A= 1 1 c= 3 É importante apontar que a Janela de Comando normalmente é usada para testes de comandos e funções ou simples operações. Quando se deseja implementar algum programa, projeto ou trabalho utiliza-se o M-File Editor. Neste editor, cria-se um arquivo texto ‘. m’ com os comandos desejados. Para abrir um novo arquivo-M, clique em File >New > M-file ou simplesmente digite o comando Edit. Após escrever o programa, pode-se executá-lo pela tecla de atalho F5. Além da Janela de Comando e do Editor de Arquivo-M, há ainda as janelas Help, Command History, Current Directory e Workspace, que estão respectivamente relacionadas com ajuda, histórico dos últimos comandos digitados, diretório corrente do programa e o espaço de trabalho onde se visualizam dados e variáveis. Essas janelas podem ser mantidas fechadas ou abertas, dependendo da necessidade ou gosto do usuário. Essas outras janelas não são detalhadas nesse documento. 1.3 Ajuda Através do comando help, o usuário pode consultar a ajuda do Matlab. Escrevendo se help e o nome da função, é mostrado um pequeno resumo da função (normalmente de uma linha) seguido de uma descrição mais detalhada da mesma. >> help ones ONES Ones array. ONES(N) is an N-by-N matrix of ones. ONES(M,N) or ONES([M,N]) is an M-by-N matrix of ones. ONES(M,N,P,...) is an M-by-N-by-P-by-... array of ones. ONES(SIZE(A)) is the same size as A and all ones. See also ZEROS. É possível, ainda, procurar por funções cujos resumos contenham determinada palavrachave. Para isto, basta digitar o comando lookfor seguido da palavra desejada. Caso se queira interromper a busca, deve-se teclar CTRL+C. PETTele)) UFF 1.4. Bibliotecas do Matlab 1.4.1 Bibliotecas do Matlab O Matlab apresenta uma série de comandos, operadores e funções primitivas, organizadas por categorias, assim como rotinas específicas de diversas áreas da engenharia, organizadas em bibliotecas denominadas Toolboxes. Estas categorias e bibliotecas são designadas por tópicos primários. Para a visualização de todos estes tópicos, basta digitarem o comando help. Alguns desses tópicos primários são: • general - comandos gerais • ops - operadores e caracteres especiais • control - biblioteca de sistemas de controles 2 • signal - biblioteca de processamento de sinais • optim - biblioteca de otimização Outras bibliotecas abrangem campos variados como aquisição e processamento de imagem, bio-informática, telecomunicações, lógica difusa e realidade virtual. Para se aprofundar mais em qualquer biblioteca, basta digitar o comando help tópico. 1.5- Constantes e Variáveis O MATLAB faz cálculos simples e científicos como uma calculadora. Para tal, os comandos devem ser digitados diretamente no prompt (>>) do MATLAB, já que este se trata de um software interativo. Por exemplo: >> 3*25 + 5*12 ans = 135 Observe que no MATLAB a multiplicação tem precedência sobre a adição. Uma constante numérica no MATLAB é formada por uma seqüência de dígitos que pode estar ou não precedida de um sinal positivo (+) ou negativo (-) e pode conter um ponto decimal (.). Esta seqüência pode terminar ou não por uma das letras e, E, d ou D, seguida de outra seqüência de dígitos precedida ou não de um sinal de (+) ou de (-). Esta segunda seqüência é a potência de 10 pela qual a primeira seqüência deve ser multiplicada. Por exemplo, » 1.23e-1 significa 0, 123. O formato em que uma constante numérica é mostrada no MATLAB segue, como opção default, os seguintes critérios: se um resultado é inteiro, o MATLAB mostra o número como inteiro; quando o resultado é real, o MATLAB mostra o número com quatro dígitos à direita do ponto decimal; se os dígitos do resultado estiverem fora desta faixa, o MATLAB mostra o resultado usando a notação científica. Este default pode, entretanto, ser modificado utilizando-se o Numeric Format do item Options na barra de menus. Usando-se a constante numérica (3,5), considere a tabela 5 a título de exemplo dos formatos numéricos do MATLAB: 1.6 Operadores aritméticos: 3 1.1- + Adição 1.2- - Subtração 1.3- * Multiplicação 1.4- / Divisão 1.5- ^ Elevado 1.7 Operadores relacionais: 2.1- = = Igual 2.2- ~= Diferente 2.3- > Maior 2.4- > = Maior ou Igual 2.5- < Menor 2.6- < = Menor ou igual 1.8 Os operadores lógicos permitem a combinação ou negação das relações lógicas. Os operadores lógicos do MATLAB são:    &( E) Conjunção | (OU) Disjunção ~ (Não) Negação 1.9 Operador de atribuição ( =) Representa a atribuição da expressão a sua direita a variável a sua esquerda. Ex: 1- x= 200 2- y= 0.7 3- z= z+2 2.0 Comandos de entrada e saída: 2.1- Entrada Variável = input (‘ Mensagem’ ) ; Transfere os dados externos via teclado para as varáveis indicadas. 2.2- Saída 1- fprintf ( ‘ Mensagem % d’ , Variável) 4 2- fprintf (‘ Mensagem %f ’ , Variável) 3- fprintf (‘ Mensagem % d. 2\n ’ , Variável) 4-- fprintf (‘ Mensagem % g \n ’ , Variável) 5- disp ( variável) Mostra o conteúdo da variável na tela. 6- disp(‘ Mensagem’) Mostra a mensagem na tela. OBS: 1- ; Não mostra o conteúdo da variável na tela. 2- % Comentário. 3- clc Limpa a tela. 4- A mensagem vem entre apóstrofos. 5- clear variável. Apaga o conteúdo da variável. 6- , Separar comandos em uma mesma linha. 7- clear all .Apagar tudo. 3- Estruturas Condicionais : 3.1- Estrutura condicional simples: if Teste Comandos ; end 3.2- Estrutura condicional composta 1- Com duas opções if Teste comandos A ; 5 else Teste comandos B ; end 1.2. Mais de duas opções: if teste comandos a; elseif teste comandos b; * * * else comandos n; end Exercício: 1. Fazer um programa que leia quatro números distintos. Determine e escreva o menor deles. Dados { A,B,C,D} clc a= input ( 'digite a'); b= input (' digite b'); c= input ('digite c'); d= input ('digite d'); 6 if a= 0 x1=( -b + sqrt(d)) / ( 2 * a) ; x2=( -b – sqrt(d))/ ( 2 * a ) ; fprintf ( ' x1 = % f /n ' , x1) fprintf ( ' x2 = % f 1', x2) else disp ( ' não existem raízes reais ' ) end 4. A estrutura switch-case Quando se faz uso repetido de testes de igualdade com apenas um argumento comum, costuma-se usar a estrutura switch-case. Essa estrutura tem a seguinte forma: switch var_teste case expressão_teste1 comandos1 case {expressão_teste2, expressão_teste3, expressão_teste4 } comandos2 otherwise comandos3 end Se os testes de igualdade resultarem em falso para todos os casos, os comandos de otherwise (que é opcional) serão executados. O exemplo abaixo demonstra uma aplicação da estrutura switch-case. clear all num=input(’Escreva um inteiro: ’); % Exibe texto e lê valor para a variável. switch num case 1 8 y=1 case {2, 2.5} y=2 case ’tres’ y=3 case {’quatro’, ’Quatro’, ’QUATRO’ } y=4 otherwise y=0 end . 1) Faça um programa que o usuário possa digitar qualquer mês do ano e como resultado seja mostrado o número de dias do mês correspondente. %Programa para saber quantos dias tem o mês clear; clc; mes=input('digite o mes desejado: '); switch mes case {'Janeiro','Marco','Maio','Julho','Agosto','Outubro','Dezembro'} disp('31 dias') case {'Fevereiro'} disp('28 ou 29 dias') case {'Abril','Junho','Setembro','Novembro'} disp('30 dias') 5. Comando break 9 Propósito: encerra a execução de comandos for ou while quando são encontrados. Sintaxe: break Exemplo: Fazer um programa que leia um número inteiro positivo. Determine e escreva o segundo maior divisor de n. clc; n=input(‘Digite um num. Inteiro’); For d=1:n IF REM(n,d)==0 Break; End End fprintf(‘ %d ‘,d); 6. Estruturas de Repetições : 6.1-A estrutura for: 1. for variável = início : fim Comandos; end Obs. A variável varia de 1 em 1. : significa “até” 1. for variável = início : variação : fim Comandos ; end 10 Exercício Resolvidos: 1. Fazer um programa que leia a idade e só sexo de 10 pessoas .Calcule e escreva; O numero de mulheres com idade entre 17 e 28 anos; A idade média dos homens. Dados{ id, sexo 10 pessoas (np) } Obs: sexo = 1 1. - masculino , sexo = 0 feminino nm 2. idmh = sidh / nh clc nm = 0 ; sid = 0 ; nh = 0 ; for np = 1 : 10 id = input (' digite idade ' ) ; sexo = input ( ' digite sexo , sexo = i – ne sexo = 0 – f ' ) ; if sexo = = 0 & id > 17 & id< 28 nm = nm = 1 ; end if sexo = = 1 nh=nh + 1 ; sidh = sidh + id ; 11 end end idmh = sidh / nh ; fprintf ( ' idmh = % f /n , idmh ) fprintf (' nm = % d' , nm ) 6.2 A Estrutura While : while teste Comandos ; end 2. Fazer um programa que leia a idade de um grupo de pessoas . O último dado que não entrara tem idade igual a zero .Calcule e escreva a idade média do grupo. Dado{ id} I – idha = sid / np clc np = 0 ; sid = 0 ; id = input ( ' digite idade ' ) ; while idn = 0 np = np + 1 ; sid = sid + id ; id = input ( ' digite idade e id = 0 exit ' ) ; end idm = sid / np ; fprintf ( ' idm = % . 2f ', idm ) 12 3. Fazer um programa que escreva a soma dos 20 primeiros termos da série : 2 7 8 13 14 19 … clc so = 0 ; nu = 0 ; for nt = 1: 20 if rem ( nu , 2 ) = = 0 s o = s o + nu ; nu = nu + 5 ; else so=so + nu ; nu = nu + 1 ; end end fprintf ( ' soma = % d ' , s o ) 3. Faça um programa q leia altura, sexo ,idade. O ultimo dado que não entrará tem altura igual a 0.Calcule a porcentagem de mulheres com altura entre 1,6 e 1,72 e idade inferior 28 anos clc nm=0; nh=0;tm=0;so2=0; altura=input('digite altura'); while altura~=0 id=input('digite idade '); sexo=input('digite sexo e sexo=1-m e sexo=0-f '); if sexo==0 tm=tm+1; if altura>1.6 & altura<1.72 & id<28 nm=nm+1; end 13 end altura=input('digite altura e altura=0 exit'); end parm=nm*100/tm; fprintf('parm=%f\n',parm) 4. Fazer um programa que escreva a soma dos n primeiros termos da serie, onde n e x são lidos. clc s=0;d=24;sinal=1;i=6; e=3; termo=input('digite termos'); x=input('digite x'); for nt= 1:termo s=s+x^e*sinal/d; i=i+2; d=d*i*(i-1); e=e*2; sinal=(-1)*sinal; end fprintf('soma=%f',s) 5. Faça um programa que escreva a soma dos 20 primeiros termos da serie. 2 9 10 17 18 25 clc n=2; soma=0; s=9; soma1=0; soma2=0; for nt= 1:10 soma=soma+n; n=n+8; soma1=soma1+s; s=s+8; soma2=soma1+soma; end fprintf('soma=%f',soma2) Obs:1- who % obtém-se uma lista das variáveis na área de trabalho. 2-whos % mostra mais detalhada ás variáveis correntes. 7. Funções Matemáticas. 1- abs(x). Valor absoluto de x. 14 2- acos(x).Arco cosseno de x. 3- asin(x).Arco seno de x. 4- atan(x). Arco tangente de x. 5- conj(x).Conjugado completo. 6- cós(x). Cosseno de x. 7- cosh(x).Cosseno hiperbólico do x. 8- exp(x). Exponencial e*. 9- floor (x). Arredondamento em direção ao – infinito. 10- gcd(x,y).Máximo divisor comum de x e y. 11- lcm(x,y). Mínimo múltiplo comum de x e y. 12-log(x).Logaritmo x na base c. 13-log10(x). Logaritmo x na base 10. 14- rem(x,y). Resto da divisão de x por y. 15- round(x).Arredondamento para o número inteiro mais próximo. 16- sin(x). Seno de x. 17- sinh(x). Seno hiperbólico de x. 18- sqrt(x). Raiz quadrada de x. 19- tang(x).Tangente de x. 20- tanh(x). Tangente hiperbólica de x. 8. Vetores 1- x= inicio : fim % um vetor x começando do valor inicio ate o fim variando de 1 em 1. 2-x= inicio : variação : fim % vetor x começando do inicio até o fim com o valor da variação. 3- x=lindspace ( inicio,último,n) % vetor x começando do inicio até o fim,contendo n elementos linearmente espaçados. 4- logspace (inicio,fim,n) cria um vetor x com o valor 10 inicio e terminado no vetor 10 fim, contendo n elementos logaritmicamente espaçados. 15 Exs: A- x= 1:5 x= 1 2 3 4 5 B- x=1:6.5 x=123456 C- z= 6:-1:1 z=654321 D- k= linspace ( 0,1,6) k= 0 0.2 0.4 0.6 0.8 1 E- x=logspace(0,2,5) x=1 3.1623 10 31.6225 100 5- Para criar um vetor coluna elemento for elemento estes devem estar separados por(;). Ex: v= [ 1.5 ; -3.2 ; 9) v= 1.5 -3.2 9 6- Operador de transposição (‘) transforma um vetor linha para vetor coluna. Ex: y=(1:0.5:3 y =1 1.5 2 2.5 3 7- Endereçamento de vetores: os elementos são acessados através de seu índice. Ex: x= 1:10 x(3) % . Acessa o 3º elemento de x. x (6) % . Acessa o 6º elemento de x. c=linspace (10,40,7) 16 c= 10 15 20 25 30 35 40 c (3:5) % .Acessa o 3º ao 5º elemento de c. 30 20 10 C([ 4 , 1]) % .Acessa o 4º e 1º elementos de c. 25 10 9. Operações Com Matrizes As operações com matrizes no MATLAB são as seguintes:· Transposta;· Adição;· Subtração;· Multiplicação;· Divisão à direita;· Divisão à esquerda;· Exponenciação; 9.1 Transposta O caracter apóstrofo, " ' " , indica a transposta de uma matriz. Considere os exemplos a seguir: >>A=[1 2 3; 4 5 6; 7 8 0] A= 1 2 3 4 5 6 7 8 0 >> B=A’ 1 4 7 2 5 8 3 6 0 >> x = [-1 0 2]' X = -1 0 2 9.2 Adição e Subtração 17 A adição e subtração de matrizes são indicadas, respectivamente, por "+" e "-". As operações são definidas somente se as matrizes tiverem as mesmas dimensões. Por exemplo, a soma com as matrizes mostradas acima, A + x, não é correta porque A é 3x3 e X é 3x1. Porém, >> C = A + B é aceitável, e o resultado da soma é C= 2 6 10 6 10 10 14 13 0 A adição e subtração também são definidas se um dos operadores é um escalar, ou seja,uma matriz l x l. Neste caso, o escalar é adicionado ou subtraído de todos os elementos do outro operador. Por exemplo: >> y = x - 1 resulta em Y = -1 1 9.3 Multiplicação A multiplicação de matrizes é indicada por "*". A multiplicação x*y é definida somente se a segunda dimensão de x for igual à primeira dimensão de y. A multiplicação >> x'* y é aceitável, e resulta em Ans =4 É evidente que o resultado da multiplicação y'*x será o mesmo. Existem dois outros produtos que são transpostos um do outro. >> x*y' Ans = 2 1 -1 0 0 0 -4 -2 2 >> y*x' Ans = 2 0 -4 18 1 0 -2 -1 0 2 O produto de uma matriz por um vetor é um caso especial do produto entre matrizes. Por exemplo A e X, >> b = A*x que resulta em B= 5 8 -7 Naturalmente, um escalar pode multiplicar ou ser multiplicado por qualquer matriz. >> pi*x Ans = -3.1416 0 6.2832 Além da multiplicação matricial e escalar, podemos ter a multiplicação por elemento de matrizes de mesma dimensão. Esse tipo de operação é feita utilizando-se um ponto (.)antes do perador de multiplicação ( * ). Ou seja, se A e B são matrizes definidas por A=[ a11a12... a1n; a21a22... a2n; ... ; am1am2... amn] e B=[ b11b12... b1n; b21b22... b2n; ... ; bm1bm2... bmn], entãoA.*B =aij*bij. Por exemplo: >> A.*B ans = 1 8 8 25 48 21 48 21 0 9.4 Divisão Existem dois símbolos para divisão de matrizes no MATLAB "\" e "/". Se A é uma matriz quadrada não singular, então A\B eB/A correspondem respectivamente à multiplicação à esquerda e à direita da matriz B pela inversa da matriz A , ou inv(A)*B e B*inv(A), mas o resultado é obtido diretamente. Em geral, • X = A\B é a solução de A*X = B • X = B/A é a solução de X*A = B Por exemplo, como o vetor b foi definido como A*x, a declaração >> z = A\b resulta em Z= -1 19 0 2 A divisão por elemento entre matrizes é definida de maneira similar à multiplicação por elemento, ou seja, A./B= aij/bij e A.\B= aij\bij, onde A e B têm mesma dimensão. 9.5 Exponenciação A expressão Ap eleva A à p-ésima potência e é definida se A é matriz quadrada e p um escalar. Se P é um inteiro maior do que um, a exponenciação é computada como múltiplas multiplicações. Por exemplo, >> A^3 Ans = 279 360 306 684 873 684 738 900 441 A exponenciação por elemento entre matrizes é definida de maneira similar à multiplicação por elemento, ou seja, A.B= aijbij,onde A e B têm mesma dimensão. De maneira similar, a potenciação por elemento entre uma matriz e um escalar apresenta as seguintes formas: A.c=aijc e c.A=caij 9.6 Elementos das Matrizes Um elemento individual da matriz pode ser indicado incluindo os seus subscritos entre parênteses. Por exemplo, dada a matriz A: A= 1 2 3 4 5 6 7 8 9 a declaração >> A(3,3) = A(1,3) + A(3,l) resulta em A= 1 2 3 4 5 6 7 8 10 >> A(1:3,2) Ans = 2 5 8 >> A(1:3,2:3) é uma submatriz 3x2, que consiste das três linhas e das últimas duas colunas de A. Ans = 20 2 3 5 6 8 10 Utilizando os dois pontos no lugar de um subscrito denota-se todos elementos da linha ou coluna. Por exemplo, >> A(1:2,:) Ans = 4 1 5 2 3 6 é uma submatriz 2x3 que consiste da primeira e segunda linhas e todas colunas da matriz A• Funções : O MATLAB possui algumas funções que se aplicam a matrizes como, por exemplo, as funções size (fornece o número de linhas e colunas de uma matriz) e length (fornece o maior valor entre o número de linhas e colunas). O MATLAB t em também funções que se aplicam individualmente à cada coluna da matriz produzindo um vetor linha com os elementos correspondentes ao resultado de cada coluna. Se a função for aplicada à transposta de da matriz, os resultados serão relativos a cada linha da matriz. Se o argumento da função for um vetor, o resultado será um escalar. algumas dessas funções são: 9.7 Funções com descrições:        sum soma dos elementos prod produto dos elementos mean média aritmética std desvio padrão max maior elemento min menor elemento sort ordena em ordem crescente 9.8 Submatrizes Sendo B uma matriz 5x5 unitária, podemos defini-la através da seguinte função: >> B = ones (5) B= 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Sendo C uma matriz de zeros 3x4, podemos defini-la como: 21 0 0 0 0 0 0 0 0 >> C=zeros(3,4) C 0 0 0 0 Para que o MATLAB gere uma matriz de números aleatórios entre 0 e 1, utilizamos a função rand (veja também a função randn, utilizando o comando help). Exemplo: 0.2190 0.6789 0.9347 >> D=rand(2,3) D = 0.0470 0.6793 0.3835 10 Gráficos no Matlab A construção de gráficos no MATLAB é mais uma das facilidades do sistema.. Através de comandos simples pode-se obter gráficos bidimensionais ou tridimensionais com qualquer tipo de escala e coordenada 10.1 Gráficos Bidimensionais Estes são os comandos para plotar Funções Gráficas:  Plot ------------------------------------------Plotar linear  Loglog---------------------------------------Plotar em escala loglog  Semilogx------------------------------------Plotar em semilog  Semilogy------------------------------------Plotar em semilog  Poolar--------------------------------------Plotar em coordenada polar  Bar------------------------------------------Gráfico de barras  Stem----------------------------------------Sequência discreta  Stairs --------------------------------------Plotar em degrau  Hist---------------------------------------Plotar histograma  Rose---------------------------------------Plotar histograma em ângulo  Compass----------------------------------Plotar em forma de bússola  Feather------------------------------------Plotar em forma de pena  Fplot---------------------------------------Plotar função  Comet------------------------------------Plotar com trajetória de cometa gráficos bidimensionais: Tabela 11 – comandos para gráficos bidimensionais Se Y é um vetor, plot(Y) produz um gráfico linear dos elementos de Y versos o índice dos elementos de Y. Por exemplo, para plotar os números [0.0, 0.48, 0.84, 1.0, 0.91, 0.6,0,14], entre com o vetor e execute o comando plot: >> Y = [0.0, 0.48, 0.84, 1.0, 0.91, 0.6, 0,14]; 22 >> plot(Y) Se X e Y são vetores com dimensões iguais, o comando plot(X,Y) produz um gráfico bidimensional dos elementos de X versos os elementos de Y, por exemplo >> t = 0:0.05:4*pi; >> y = sin(t); >> plot(t,y) O MATLAB pode também plotar múltiplas linhas e apenas um gráfico. Existem duas maneiras, a primeira é usado apenas dois argumentos, como em plot(X,Y), onde X e/ou Y são matrizes. Então: • Se Y é uma matriz e X um vetor, plot(X,Y) plota sucessivamente as linhas ou colunas de Y versos o vetor X. • Se X é uma matriz e Y é um vetor, plot(X,Y) plota sucessivamente as linhas ou colunas de X versos o vetor Y. • Se X e Y são matrizes com mesma dimensão, plot(X,Y) plota sucessivamente as colunas de X versos as colunas de Y. • Se Y é uma matriz, plot(Y) plota sucessivamente as colunas de Y versos o índice de cada elemento da linha de Y. A segunda, e mais fácil, maneira de plotar gráficos com múltiplas linhas é usando o comando plot com múltiplos argumentos. Por exemplo: >> plot(t, sin(t), t, cos(t), t, sin(t + pi), t, cos(t + pi)) 10.2 Estilos de Linha e Símbolo Os tipos de linhas, símbolos e cores usados para plotar gráficos podem ser controlados se os padrões não são satisfatórios. Por exemplo, >> X = 0:0.05:1; >> subplot(l2l), plot(X,X.^2,’k*’) 23 >> subplot(l22), plot(X,X.^2,’k --‘) Outros tipos de linhas, pontos e cores também podem ser usados: TIPO DE PONTO ** * * * * * * * ° ° ° ° ° ° ° ° ° ° + ++++++++++ x x x x x x x CORES y amarelo m lilás c azul claro r vermelho g verde b azul escuro w branco k preto 24 25 26 27 28 29 30 31 32 33 34 35 36 sum Prod Mean Std Max Min Sort Funções de Controle de Baixo Nível 11 Manipulação de Arquivos 37 Soma dos elementos Produto dos elementos Média aritmética Desvio padrão Máximo Mínimo Ordem crescente O Matlab possui funções para a manipulação de arquivos baseadas na linguagem C. Estas funções permitem a leitura e/ou gravação de dados formatados ou em modo binário. 11.1 FUNÇÕES PARA ABERTURA E FECHAMENTO DE ARQUIVOS ABERTURA Antes de ler ou escrever em um arquivo, o mesmo deve ser aberto através do uso da função fopen ( ). Esta função tem a seguinte sintaxe: = fopen (‘nome’, ’modo’) ou [,] = fopen (‘nome’, ’modo’) onde: modo : ‘r’ para leitura ‘w’ para escrita ‘a’ para acréscimo ‘r+’ para leitura e/ou escrita Se o arquivo for usado em modo binário, deve-se acrescentar a letra b. Exemplo: ‘rb’, ‘wb’, etc... 38 11.2 FECHAMENTO = fclose () LEITURA EM FORMATO BINÁRIO A função fread () é usada para leitura de dados armazenados no formato binário. Exemplo : arq = fopen ( 'dados.dat', 'rb' ); A = fread (arq) ; fecharq = fclose (arq); Este bloco de comandos lê todo o conteúdo do arquivo de nome dados.dat e transfere o conteúdo para a variável A, fechando o arquivo a seguir. Dois argumentos opcionais fornecem à função fread () controle sobre o número de valores lidos e a precisão de cada valor. Exemplo : arq = fopen ( 'dados.dat', 'rb' ); A = fread ( arq, 100 ); fecharq = fclose (arq); Este bloco de comandos lê os 100 primeiros valores contidos no arquivo "dados.dat" e os transfere para um vetor de nome A. Trocando-se o vetor de nome A por uma matriz de dimensões 10 X 10, os mesmos dados serão armazenados em uma matriz. 39 arq = fopen ( 'dados.dat', 'rb' ); A = fread ( arq, [10,10] ); fecharq = fclose (arq); A precisão com que os dados serão lidos é dada usando-se os formatos : char e uchar - para caracteres sinalizados ou não ( 8 bits ) short e long - para inteiros "curtos" ou "longos" ( 16 ou 32 bits ) float e double - para reais com precisão simples ou dupla ( 32 ou 64 bits ) Exemplo A = fread ( arq, 10, 'float' ); lê 10 valores reais e copia estes valores no vetor coluna A. 11.3 ESCRITA EM FORMATO BINÁRIO A função fwrite () é utilizada para escrever dados em um arquivo binário. Exemplo : arq = fopen ( 'magic5.bin', 'wb' ); contador = fwrite ( arq, magic (5), 'long' ); fecharq = fclose (arq); Este bloco de comandos escreve em um arquivo de nome magic5.bin 25 elementos inteiros de uma matriz especial fechando o arquivo em seguida. 40 11.4 ACESSO DIRETO AO CONTEÚDO DE UM ARQUIVO As funções fseek ( ) e ftell ( ) permitem o acesso direto aos elementos de um arquivo. A função ftell ( ) fornece o deslocamento em bytes do indicador de posição em um arquivo específico. A função fseek ( ) reposiciona o indicador de posição permitindo o acesso direto à um dos elementos do arquivo. Ela recebe como argumento o nome do arquivo, dado por fopen () e um número positivo ou negativo, indicando avanço ou retrocesso de posição. Opcionalmente pode-se passar como parâmetro o início (´bof'), o fim ('eof') ou a posição corrente ('cof') do arquivo. Exemplo: A = [ 1:5 ]; fid = fopen ( 'cinco.bin', 'wb' ); fwrite ( fid, A, 'short' ); status = fclose ( fid ); fid = fopen ( 'cinco.bin', 'rb' ); status = fseek ( fid, 6, 'bof' ); quatro = fread ( fid, 1, 'short' ); posicao = ftell ( fid ); status = fseek ( fid, -4, 'eof' ); tres = fread ( fid, 1, 'short' ); status = fclose ( fid ); 11.5 Utilização de Arquivos Formatados 41 A função fprintf () juntamente com a função fscanf () são utilizadas para escrita e leitura usando-se formatos específicos para cada tipo de dado. Os caracteres de controle usados na formatação mais comuns empregados são: %e - para valores reais em notação científica %f - para valores reais %d - para valores inteiros %s - para cadeias de caracteres Campos opcionais nos especificadores de formato controlam a quantidade de casas decimais. Exemplo: x=0:0.1:1; y=[x;exp(x)]; a=fopen('tabelexp.dat',’w’); fprintf(a,'Função Exponencial\n\n'); fprintf(a,'%6.2f %12.8f\n',y); b=fclose(a); Este exemplo cria um arquivo texto contendo uma tabela com valores da função y=exp(x) no intervalo [0,1] A primeira chamada da função fprintf escreve o título no arquivo, saltando uma linha. A segunda chamada de fprintf escreve a tabela, previamente gravada na matriz y no arquivo. Esta escrita é feita no formato real sendo 6 casas para a parte inteira e 2 casas para a parte real do primeiro valor de (x) e 12 casas para a parte inteira e 8 casas para a parte real do segundo valor (f(x)). Os elementos da matriz y são convertidos para a forma 2 colunas. A função usa os formatos definidos (%6.2f e %12.8f) repetidamente até converter todos os componentes da matriz. Uma outra função, sprintf (), faz a saída de dados para uma cadeia de caracteres em lugar de faze-la na tela ou em um arquivo. Exemplo: dados=sprintf('A raiz quadrada de %f é %10.8e\n',2,sqrt(2)); 11.6 LEITURA DE DADOS GRAVADOS EM UM ARQUIVO TEXTO A função fscanf(), similar a fprintf() é utilizada para leitura de dados formatados gravados em arquivos. Exemplo: a=fopen('tabelexp.dat','r'); titulo=fscanf(a,'%[^\n]'); tabela=fscanf(a,'%6.2f %12.8f',[2 inf]); fecharq=fclose(a); disp(tabela’); 42 A primeira linha gravada no arquivo, contendo o título : 'Função Exponencial\n\n', é lida pela primeira chamada feita à função fscanf(). O formato utilizado %[^\n], faz a leitura dos caracteres contido na linha até encontrar um caractere \n. O dados são lidos para uma matriz de nome tabela. Esta variável tem suas dimensões especificadas pelos parâmetros [2 inf ], significando duas linhas e o número de colunas sendo estabelecido pela quantidade de elementos gravados no arquivo. O comando disp(tabela’); exibirá a tabela na linha de comando. O exemplo abaixo : B=fscanf(a,'%5d',100); lê os 100 primeiros valores gravados em um arquivo para o vetor coluna B. Uma outra função, chamada sscanf() é utilizada para leitura de dados de um vetor de caracteres, ao invés de faze-lo de um arquivo. Exemplo: raiz=sscanf(dados,'A raiz quadrada de %f é %f'); retorna um vetor de coluna contendo 2 e sua raiz quadrada. Exemplos de arquivos: %Exemplo de uso de arquivo do tipo binario %Programa para gravar em arquivo do tipo binario os 30 primeiros %termos da serie 1 5 9 13 ... clear clc arq = fopen('Serie.bin','wb'); termo = 1; for a = 1:30 fwrite(arq,termo,'long'); termo = termo + 4; end fprintf('arquivo criado') fclose(arq); %Exemplo de uso de arquivos do tipo texto %gravarem arquivo do tipo texto os 30 primeiros %termos da serie 1 5 9 13 ... clear clc arq = fopen('Serie.txt','w'); termo = 1; for a = 1:30 fprintf(arq,'%d\t',termo); termo = termo + 4; end fprintf('arquivo criado') 43 fclose(arq); %Exemplo de uso de arquivos do tipo binario %Leitura de arquivo do tipo binario clear clc arq = fopen('Serie.bin','rb'); x = fread(arq,'long'); fprintf('arquivo lido\n') fclose(arq); fprintf('Conteudo do arquivo\n') tam = length(x); for a = 1:tam fprintf('%d\t',x(a)); end %Exemplo de uso de arquivos do tipo texto %Leitura de arquivo do tipo texto clear clc arq = fopen('Serie.txt','r'); x = fscanf(arq,'%d'); fprintf('Arquivo lido\n') fclose(arq); fprintf('Conteudo do arquivo\n') tam = length(x); for a = 1:tam fprintf('%d\t',x(a)); end %Exemplo de uso de arquivos do tipo binario %leitura de arquivo do tipo binario usando % funcao para testar fim de arquivo clear clc fprintf('Conteudo do arquivo Serie.bin\n') arq = fopen('Serie.bin','rb'); x = fread(arq,1,'long'); while ~feof(arq) fprintf('%d\t',x); x = fread(arq,1,'long'); end fclose(arq); %Exemplo de uso de arquivos do tipo texto %leitura de arquivo do tipo texto usando % funcao para testar fim de arquivo clear clc fprintf('Conteudo do arquivo Serie.txt\n') arq = fopen('Serie.txt','r'); 44 x = fscanf(arq,'%d',1); while ~feof(arq) fprintf('%d\t',x); x = fscanf(arq,'%d',1); end fclose(arq); %Exemplo de uso de arquivos do tipo binario %Copia o conteudo de um arquivo texto para outro arquivo clear clc arq = fopen('Serie.bin','rb'); mat = fopen('Matriz.bin','wb'); x = fread(arq,[5 6],'long'); fprintf('Arquivo Serie.bin lido\n') fclose(arq); for a = 1:5 for b = 1:6 fwrite(mat,x(a,b),'long'); end end fclose(mat); fprintf('Dados do arquivo Serie.bin copiados para o arquivo Matriz.bin\n') %Exemplo de uso de arquivos do tipo texto %Copia o conteudo de um arquivo texto para outro arquivo texto clear clc arq = fopen('Serie.txt','r'); mat = fopen('Matriz.txt','w'); x = fscanf(arq,'%d',[5 6]); fprintf('Arquivo Serie.txt lido\n') fclose(arq); for a = 1:5 for b = 1:6 fprintf(mat,'%d\t',x(a,b)); end fprintf(mat,'\n'); end fclose(mat); fprintf('Dados do arquivo Serie.txt copiados para o arquivo Matriz.txt\n') %Exemplo de uso de arquivos do tipo binario %escrever em arquivo do tipo binario uma %matriz 11X2 contendo uma tabela de valores %da funcao exponencial clear clc x = 0:0.1:1; y = [x; exp(x)]; 45 arq = fopen('exp.bin','wb'); fwrite(arq,y,'double'); fclose(arq); fprintf('Arquivo criado') %Exemplo de uso de arquivos do tipo texto %escrever em arquivo do tipo texto uma %matriz 11X2 contendo uma tabela de valores %da funcao exponencial clear clc x = 0:0.1:1; y = [x; exp(x)]; fid = fopen('exp.txt','w'); fprintf(fid,'%6.2f%12.8f\n',y); fclose(fid); fprintf('Arquivo criado') %Exemplo de uso de arquivos do tipo texto %leitura de arquivo do tipo texto copiando %os dados lidos para uma matriz 11X2 contendo uma tabela de valores %da funcao exponencial e exibicao do grafico desta funcao clear clc arq = fopen('exp.bin','rb'); tabela = fread(arq,[2 11],'double'); fclose(arq); fprintf('Conteudo do arquivo\n') for a=1:2 for b = 1:11 fprintf('%f\t',tabela(a,b)) end fprintf('\n') end %Exemplo de uso de arquivos do tipo texto %leitura de arquivo do tipo texto copiando %os dados lidos para uma matriz 11X2 contendo uma tabela de valores %da funcao exponencial e exibicao do grafico desta funcao clear clc fid = fopen('exp.txt','r'); tabela = fscanf(fid,'%f',[2 11]); fclose(fid); fprintf('Conteudo do arquivo\n') for a=1:2 for b = 1:11 fprintf('%f\t',tabela(a,b)) 46 end fprintf('\n') end x = tabela(1,:); y = tabela(2,:); plot(x,y) title('Grafico da funcao exeponencial y = e^x') grid %Programa para ler uma matriz quadrada contendo valores inteiross %e imprimir a quantidade de elementos pares situados nas linhas impares %acima da diagonal secundaria, gravando esta informacao em um arquvo %binario clear clc ordem = input('Digite a ordem da matriz : '); mat = fix(100*rand(ordem,ordem)); quant = 0; for a = 1:ordem for b = 1:ordem if ((a+b) == (ordem + 1)) & (mod(mat(a,b),2) == 0 ) & (mod(a,2) == 1) quant = quant + 1; end end end fprintf('Matriz criada\n') for a = 1:ordem for b = 1:ordem fprintf('%d\t',mat(a,b)) end fprintf('\n') end fprintf('\nQuantidade de elementos pares situados nas linhas impares da diagonal secundaria : %d',quant) arq = fopen('quantparesacimadiagsec.bin','wb'); texto1 = 'Quantidade de elementos pares situados nas linhas impares da diagonal secundaria : '; fwrite(arq,texto1); fwrite(arq,quant,'long'); fclose(arq); %Programa para ler uma matriz quadrada contendo valores inteiros %e imprimir a quantidade de elementos pares situados nas linhas impares %acima da diagonal secundaria, gravando esta informacao em um arquvo texto clear clc ordem = input('Digite a ordem da matriz : '); mat = fix(100*rand(ordem,ordem)); quant = 0; 47 for a = 1:ordem for b = 1:ordem if ((a+b) < (ordem + 1)) & (mod(mat(a,b),2) == 0 ) & (mod(a,2) == 1) quant = quant + 1; end end end fprintf('Matriz criada\n') for a = 1:ordem for b = 1:ordem fprintf('%d\t',mat(a,b)) end fprintf('\n') end fprintf('\nQuantidade de elementos pares situados nas linhas impares acima da diagonal secundaria : %d',quant) arq = fopen('quantparesacimadiagsec.txt','w'); texto1 = 'Quantidade de elementos pares situados nas linhas impares acima da diagonal secundaria : '; fprintf(arq,'%s',texto1); fprintf(arq,'%d',quant); fclose(arq); %Programa para ler uma matriz quadrada contendo valores inteiross %e imprimir a quantidade de elementos menores que 20 situados %abaixo da diagonal secundaria, gravando estes elementos em um %arquivo binario clear clc ordem = input('Digite a ordem da matriz : '); mat = fix(100*rand(ordem,ordem)); quant = 0; arq = fopen('menores_20_abaixo_diag_sec.bin','wb'); for a = 1:ordem for b = 1:ordem if ((a+b) > (ordem + 1)) & (mat(a,b) < 20) quant = quant + 1; fwrite(arq,quant,'long'); end end end fclose(arq); fprintf('Matriz criada\n') for a = 1:ordem for b = 1:ordem fprintf('%d\t',mat(a,b)) end fprintf('\n') end fprintf('\nQuantidade dos elementos menores que 20 situados abaixo da diagonal secundaria : %d',quant) 48 %Programa para ler uma matriz quadrada contendo valores inteiros %e imprimir a quantidade de elementos menores que 20 situados %abaixo da diagonal secundaria clear clc ordem = input('Digite a ordem da matriz : '); mat = fix(100*rand(ordem,ordem)); quant = 0; for a = 1:ordem for b = 1:ordem if ((a+b) > (ordem + 1)) & (mat(a,b) < 20) quant = quant + 1; end end end fprintf('Matriz criada\n') for a = 1:ordem for b = 1:ordem fprintf('%d\t',mat(a,b)) end fprintf('\n') end fprintf('\nQuantidade dos elementos menores que 20 situados abaixo da diagonal secundaria : %d',quant) %Exemplo de uso de arquivos do tipo binario %leitura de uma matriz 11x2 contendo valores reais, criacao de %uma matriz transposta 2x11 e gravacao destas duas matrizes %em arquivo do tipo binario clear clc mat = 100*rand(11,2); transposta = zeros(2,11); for a=1:11 for b = 1:2 transposta(b,a) = mat(a,b); end end arqmat = fopen('Matriz_e_sua_Transposta.bin','wb'); for a=1:11 for b = 1:2 fwrite(arqmat,mat(a,b),'double'); end end for a=1:2 for b = 1:11 fwrite(arqmat,transposta(a,b),'double'); end end fclose(arqmat); 49 fprintf('Arquivo criado') %Exemplo de uso de arquivos do tipo texto %leitura de uma matriz 11x2 contendo valores reais, criacao de %uma matriz transposta 2x11 e gravacao destas duas matrizes %em arquivo do tipo texto clear clc mat = 100*rand(11,2); transposta = zeros(2,11); for a=1:11 for b = 1:2 transposta(b,a) = mat(a,b); end end arqmat = fopen('Matriz_e_sua_Transposta.txt','w'); fprintf(arqmat,'Matriz criada\n'); for a=1:11 for b = 1:2 fprintf(arqmat,'%f\t',mat(a,b)); end fprintf(arqmat,'\n'); end fprintf(arqmat,'Matriz transposta\n'); for a=1:2 for b = 1:11 fprintf(arqmat,'%f\t',transposta(a,b)); end fprintf(arqmat,'\n'); end fclose(arqmat); fprintf('Arquivo criado') %Exemplo de uso de arquivos do tipo binario %leitura de um arquivo binario contendo uma matriz 11x2 e %sua matriz transposta 2x11 clear clc mat = zeros(11,2); transposta = zeros(2,11); x = fopen('Matriz_e_sua_Transposta.bin','rb'); for a=1:11 for b = 1:2 mat(a,b) = fread(x,1,'double'); end end for a=1:2 for b = 1:11 transposta(a,b) = fread(x,1,'double'); 50 end end fclose(x); fprintf('Matriz criada\n') mat fprintf('Matriz transposta\n') transposta %Exemplo de uso de arquivos do tipo texto %leitura de um arquivo texto contendo uma matriz 11x2 e %sua matriz transposta 2x11 clear clc mat = zeros(11,2); transposta = zeros(2,11); x = fopen('Matriz_e_sua_Transposta.txt','r'); titulo1=fscanf(x,'%[^\n]'); for a=1:11 for b = 1:2 mat(a,b) = fscanf(x,'%f',1); end end z=fscanf(x,'%f'); espaco=fscanf(x,'%[^\n]'); titulo2=fscanf(x,'%[^\n]'); for a=1:2 for b = 1:11 transposta(a,b) = fscanf(x,'%f',1); end end fclose(x); fprintf('Matriz criada\n') mat fprintf('Matriz transposta\n') transposta 12.0 ESTRUTURAS OU REGISTROS Uma estrutura é uma construção 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 informação (dados) sobre vários assuntos de diferentes títulos (campos). Por exemplo, você poderia manter um livro de registros com uma página dedicada a cada um de seus parentes. Você poderia listar informações para cada um deles sob os títulos: grau de parentesco, nome, telefone, filhos (quantos), filhos (nomes), etc. Embora os títulos sejam os mesmos em cada registro, an informação 51 contida nos títulos é diferente para cada registro. Implementar esse registro no MATLAB é montar uma estrutura. O melhor é que não 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, professor 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 são indicados adicionando seus nomes após o nome da estrutura, separados por um ponto (.). Os campos são valores designados simplesmentecomo uma outra variável no MATLAB. No exemplo acima, os campos curso e notas contêm um vetor de números. Agora, como pode ser gerado um registro para o próximo curso? Estruturas são bem como seus campos: multidimensionais. Portanto, pode-se geraro próximo registro de diferentes maneiras: Múltiplos registros em um vetor de estrutura Pode-se fazer com que a estrutura Turma seja um vetor (neste exemplo, um vetor será o bastante), então 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. » Turma(2).curso = 'Física'; Turma(3).curso = 'Computação'; » Turma(2).prof = 'Mauro'; Turma(3).prof = 'Karen'; » Turma(2).notas = [72 75 78]; Turma(3).notas = [85 35 66]; » Turma 52 Após adicionar mais 2 registros, Turmatorna-se um vetor, e, quando requisitado, oMATLAB mostra informações sobre aestrutura; Turma =1x3 struct array with fields: Curso prof notas » Turma(2).curso Usa o índice do vetor na estrutura para acessar os seus elementos. ans =Física » Turma(3).notas(1) Pode-se usar a notação de índices para a estrutura assim como para os seus campos. ans =85 » Turma.notas ans = 80 75 95 ans = Quando nenhum índice é especificado para a estrutura, o MATLAB mostra na tela os valores do campo de todos os registros até agora executados. 72 75 78 ans = 85 35 66 » for k = 1:3, Para acessar os valores a partir de um campo de muitas gravações use um laço. all_notas(k,:) = Turma(k).notas; end Assim, foi criado o arranjo de estrutura Turma 1 x 3. Cada elemento de Turma pode ser acessado assim como se acessa um elemento de um vetor comum – faz Turma(2) ou Turma(1), etc. Digitando Turma(1), obtêm-se 2 valores de todos os campos junto com os nomes do campo. Pode-se também acessar campos individuais(Turma(1).prof ou Turma(1).notas(3)). Obs.: Em um vetor de estrutura, cada elemento deve ter o mesmo número de campos. Cada campo, entretanto, poder conter dados de diferentes tamanhos. 53 Portanto,Turma(1).notas pode um vetor linha de 3 espaços enquanto que Turma(2).notas um vetor coluna de 5 espaços. Múltiplas gravações em campos de vetores. Para o exemplo escolhido, pode-se armazenar múltiplos 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’, ‘Física’, ‘Computação’); Turma.prof = char(‘Paulo’, ‘Mauro’, ‘Karen’); Turma.notas = [80 75 95; 72 75 78; 85 35 66]; Neste exemplo, a função char é usada para criar de caracteres string separadamente das variáveis 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 números 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? Poder-se-ia ainda armazenar o registro por ambos os caminhos mencionados anteriormente. Enquanto o primeiro método de criação de um vetor de estrutura parece ser o caminho mais fácil, pode-se também usar o segundo método e obter o terceiro campo notas sendo uma matriz 3-D. Criando Estruturas Nos exemplos anteriores, já se tinha visto como criar estruturas por designação direta. Assim como se pode 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 função 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’,’Física’,’Computação’), . . . ’prof’,char(’Paulo’, ’Mauro’, ’Karen’), . . . ’notas’,char( [80 75 95; 72 75 78; 85 35 66]); Como um vetor de estrutura: 54 Vet_Turma = [struct(‘curso’,’eletrica2003’,’prof’,’Paulo’, . . . ’notas’, [80 75 95]);struct(‘curso’,’Física’,’prof’,’Mauro’, . . . ’notas’, [72 75 78]);struct(‘curso’,’Computação’,’prof’,’Karen’, . . . ’notas’, [85 35 66])]; Manipulando estruturas Manipulação de estruturas é similar à manipulação de arranjos em geral –acessar elementos de estrutura pelo próprio índice e manipular seus valores. Há, porém,uma grande diferença: não se pode designar todos os valores de um campo através de um vetor de uma estrutura a uma variável com 2 pontos variáveis e especificadores. Assim, se Vet_Turma é um arranjo de estrutura 3 x1 então: Vet_Turma(1).notas(2) Vet_Turma(1).notas(:) é válido e mostra o elemento das notas oriundo do primeiro registro de Vet_Turma mostra todos os elementos de notas vindos deVet_Turma(1).notas É inválido, não designa notas vindos de todos os registros Vet_Turma(:).notas para, embora o comando Vet_Turma(:).notasou (Vet_Turma.notas) mostra notas de todos os registros. Então, embora se possa ver na tela os valores de campo através de múltiplosregistros com Vet_Turma(:).notas, deve-se usar um loop para designar os valores à variável: For k=1:3, todas_notas (k,:) = Vet_Turma(k).notas; end A designação não pode ser feita diretamente com o operador de coluna porque os valores dos campos de muitos registros são tratados como entidades diferentes.Os conteúdos de campo são também são permitido serem de diferentes tamanhos.Portanto, embora se possa usar um laço for para designação, deve tomar cuidado extra para assegurar que a designação faz sentido. Por exemplo, no laço for citado, se 55 Vet_Turma(2),notas tem somente 2 notas de teste, então a designação produzirá um erro. Está claro, dos exemplos mostrados, que se pode usar índices para a estrutura tanto como campos para acessar informação. Até agora, têm-se usado somente arranjos de caráter e de números nos campos. Pode-se, entretanto, haver também estruturas dentro de estruturas. Porém, o nível de ordenação torna-se completamente envolvido erequer cuidado extra quando se têm estruturas “entrelaçadas”. Há também várias funções que ajudam na manipulação das estruturas – fieldnames, setfield, getfield, rmfield, is field, etc. Os nomes da maioria dessas funções já sugere seu papel. Roteiro e Função no Matlab O Matlab, como outras linguagens de programação, possui duas formas de criação de programas: roteiro (script) e função (function). Na aula passada, vimos um exemplo prático de criação de um roteiro que executava uma seqüência de comandos Matlab para o ajuste de curvas (linear polinomial e não-linear). Quando um programa executa uma seqüência de comandos que pode ou não retornar parâmetros na janela de comandos do Matlab, então esse programa denomina se “roteiro” no Matlab. Em inglês, roteiro é chamado script, termo esse que também é usado na língua portuguesa para descrever uma seqüência de eventos. Entretanto, muitas vezes necessitamos de um programa na forma de função. Uma função é um roteiro que retorna um valor (ou parâmetro). Por exemplo, quando realizamos o cálculo de valores numéricos de funções trigonométricas no Matlab utilizamos funções intrínsecas (isto é, funções já existentes no Matlab). Por exemplo, para calcular o seno de um ângulo de 5 radianos, utilizamos o comando: >> y = sin(5) y= -0.9589 O valor de sen 5 é gravado na variável y. Note a sintaxe da função matemática sin(5), na qual se utiliza a sintaxe na língua inglesa (sin) da função seno, por se tratar de uma função intrínseca do Matlab e segundo, o argumento da função, isto é, o valor de x para o qual queremos determinar o valor do seno está colocado entre parêntesis. Quando desejamos um programa que funcione como uma função, então o roteiro é chamado function. Para ilustrar a diferença entre roteiro e função, vamos calcular a função ex na forma de roteiro (aula2c): % aula2c Calculo da função exponencial por serie de Taylor x = input('Valor de x: '); n = input('Numero de termos: '); funcao = 0; for k = 1:n termo = x.^k/fatorial(k); funcao = funcao + termo; end disp(['exp(' num2str(x) ') = ' num2str(funcao) ' com ' num2str(n) ' termos']); 56 Neste roteiro, o valor de x é informado através de uma instrução input. O mesmo ocorre para o número n de termos da série. Lembrando que a função exponencial na forma de série de Taylor é descrita pela equação: ex=∑∞k=0 x/kk! observamos que o laço for-end executa o cálculo de cada termo da série (variável termo) para depois ser somada na variável soma. No final do roteiro, o resultado é exibido na janela de comando do Matlab usando a instrução disp. Observar que utilizamos no cálculo do termo da série de Taylor, uma função extrínseca chamada fatorial que não existe no Matlab, que foi criada na aula prática e é reproduzida a seguir: function f = fatorial(n) f = 1; for k = 1:n f = f*k; end Observar que numa função, a primeira linha deve obrigatoriamente conter a declaração function f = fatorial(n) e que o nome declarado nesta declaração deve ser o mesmo do programa Matlab, ou seja, fatorial.m. Se quisermos criar uma função para o cálculo da função exponencial, ela será constituída pelas seguintes instruções (func0): function f = func0(x,n) % Funcao para o calculo de exp x por serie de Taylor % Devem ser fornecidos dois argumentos: x e o numero de termos n f = 0; for i = 1:n k = i - 1; f = f + x^k/fatorial(k); end Observe as diferenças entre a função func0 e o roteiro aula2c. Ambos os programas calculam a função ex por série de Taylor. A função func0 tem dois parâmetros de entrada: a variável x e o número de termos n, por isso eles são passados dentro do parêntese separados por vírgula: func0(x,n). O valor da função ex retorna pela variável f declarada no cabeçalho do programa. A vantagem da função é que ela pode ser usada como uma função intrínseca do Matlab. Como exemplo da aplicação da função func0, vamos calcular o valor do número de Euler e1 utilizando essa função com número de termos variando de um a dez e comparando o resultado com o valor exato dado pela função intrínseca do Matlab exp(1): % aula3 Roteiro para o calculo do numero de Euler por serie de Taylor 57 % com numero de termos de um a dez e calculo do respectivo erro de % truncamento x = 1; for i = 1:10 exprox(i) = func0(x,i); end erro = abs(exprox - exp(1)); result = [exprox' erro']; disp([' exp erro']) disp(result) Lista de exercícios: 1 - Faça um programa que some os números pares de 0 (zero) até 100 e imprima o resultado. 2 - Fazer um programa que leia um número indeterminado de cartões contendo cada um a idade de um indivíduo. O último cartão, que não entrará nos cálculos, contém o valor de idade igual à zero. Calcule e imprima a idade média deste grupo de indivíduos. 3- Tem-se um conjunto de dados contendo a altura e o sexo (masculino ou feminino) de 50 pessoas. Fazer um programa que calcule e imprima: - A maior e a menor altura do grupo; - A média de altura das mulheres; - O número de homens 4 - Um comerciante deseja fazer o levantamento do lucro das mercadorias que ele comercializa. Para isto, mandou perfurar em carões (um para cada mercadoria) o nome, preço de compra e preço de venda das mesmas. Fazer um programa que: - Determine e escreva quantas mercadorias proporcionam: lucro < 10% 10% < = lucro < = 20% lucro > 20% - Determine e escreva o valor total de compra e de venda de todas as mercadorias assim como o lucro total. obs.: O aluno deve adotar um flag. 58 5 - Uma firma fez uma pesquisa de mercado para saber se as pessoas gostaram ou não de um novo produto lançado no mercado. Para isto, perfurou-se em cartões o sexo do entrevistado e sua resposta (sim ou não). Sabendo-se que foram entrevistadas 200 pessoas, fazer um programa que calcule e imprima; - O número de pessoas que responderam sim; - O número de pessoas que responderam não; - A porcentagem de homens que responderam não; - A porcentagem de mulheres que responderam sim; 7 - Fazer um programa que calcule e escreva o seguinte somatório S = 1 + 3/2 + 5/3 + 7/4 + . . . +99/50; 8 - Fazer um programa que calcule e escreva o seguinte somatório: S = 1 + 3 + 5 + 7 + 9 + 11 + . . . + 199 9 - Uma companhia de teatro planeja dar um série de espetáculos. A direção calcula que, a R$50,00 o ingresso, serão vendidos 120 ingressos, e as despesas montarão em R$200,00. A diminuição de R$5,00 no preço do ingresso, espera-se que haja um aumento de 26 ingressos vendidos. Fazer um programa que escreva uma tabela de valores do lucro esperado em função do preço do ingresso, fazendo variar este preco de R$5,00 a R$1,00 de R$0,50 em R$0,50. Escreva ainda, o lucro máximo esperado, o preço e o número de ingressos correspondentes. 13 - Elabore um programa para ler do teclado um número inteiro e positivo n e um número real x, calcular e escrever a soma dos n prime rios termos da serie: 0 3 6 9 12 15 Z = X/1! - X/2! + X/4! - X/6! + X/8! - X/10! + . . . 14 - Fazer um programa que calcule e escreva o valor de S: S = 1/1 + 3/2 + 5/3 + 7/4 + . . . + 99/50 59 15 - Fazer um programa que calcule e escreva o valor da soma: 1 2 3 4 50 S = 2/50 + 2/49 + 2/48 + 2/47 + . . . + 2/1 16 - Fazer um programa que calcule e escreva o valor de S onde: S = 37*38/1 + 36*37/2 + 35*36/3 + . . . +1*2/37 17 - Fazer um programa que calcule e escreva o valor de S onde: S = 1/1 - 2/4 + 3/9 - 4/16 + . . . + 10/100 18 - Fazer um programa que calcule e escreva a soma dos 30 primeiros termos da série: S = 1000/1 - 997/2 + 994/3 - 991/4 + . . . 19 - Fazer um algoritmo que calcule e escreva a soma dos 50 primeiros termos da série: S = 480/10 - 470/11 + 460/12 - 450/13 + . . . 20 - Escreva um programa para gerar e escrever uma tabela com os valores do seno de um ângulo em radianos, utilizando a série de Mca-Laurin truncada, apresentada a seguir: 3 5 7 Sen =  - /6 + /120 - /5040 60 Obs.: Os valores dos ângulos  devem variar de 0,0 a 6,3 inclusive 0 e 6,3 de 0,1 em 0,1. 21 - Fazer um programa para calcular e escrever o valor do número  (pi), com precisão de 0.0001, usando a série: PI = 4 - 4/3 + 4/5 - 4/7 + 4/9 - . . . Para obter a precisão desejada, adicionar apenas os termos cujo valor absoluto seja maior ou igual a 0.0001. 22 - Fazer um programa que: - leia o valor de x de uma unidade de entrada; - calcule e escreva o valor do seguinte somatório: 25 24 23 22 S = X/1 - X/2 + X/3 - X/4 + . . . + X/25 23 - Fazer um programa que calcule e escreva o valor de S no seguinte somatório: S = 1/225 - 2/196 + 4/169 - 8/144 + . . . + 16384/1 24 - Fazer um programa que calcule e escreva a soma dos 30 primeiros termos da série: 100/0! + 99/1! + 98/2! + 97/3! + . . . 25 - Fazer um programa que: - calcule e escreva o valor da série abaixo com precisão menor que um décimo de milésimo (0.0001); 61 - indique quantos termos forma usados. S = 63+61/1! + 59/2! + 57/3! + . . . 26 - Fazer um programa que calcule e escreva a soma dos 50 primeiros termos da série: S = 1!/1 - 2!/3 + 3!/7 - 4!/15 + 5!/31 - . . . 27 - Fazer um programa para determinar e escrever soma dos n primeiros termos da série: 2 4 6 S = X - X/3! + X/5! - X/7! + . . . onde: x e n são lidos. 28 - Fazer um programa que: - calcule o valor do co-seno de X através de 20 termos da série abaixo: 2 4 6 8 Cassino X = 1 - X/2! + X/4! - X/6! + X/8! - . . . - calcule a diferença entre o valor calculado no item anterior e o valor fornecido pela função Cos(X); - escreva o que foi calculado nos itens anteriores. 29 - Fazer um programa que: - leia um conjunto de linhas contendo cada uma um número inteiro, na base 10 de até cinco dígitos. A última linha contém o valor zero. - transforme esse número da base 10 para a base 2; 62 - escreva o número na base 10 e na base 2. Variável Composta 1 - Fazer um programa que: - Leia 100 valores numéricos e armazene numa variável composta unidimensional A; - Calcule e escreva: 100 S =  i/a[i], onde i é o i-ésimo valor armazenado na variável A; i=1 - Calcule e escreva quantos termos da série tem o valor do numerador inferior ao denominador. Exemplo: A 2 5 5 6 7 7 1 . .. 2 8 8 3 100 somatório = 1/25 + 2/56 + 3/77 + . . . + 100/88 2 - Fazer um programa que: - Leia duas variáveis compostas unidimensional, contendo, cada uma 200 elementos numéricos; - Intercale os elementos destes dois conjuntos formando uma nova variável composta unidimensional de 400 elementos; - Escreva o novo conjunto, assim obtido. 3 - Em uma cidade do interior, sabe-se que de janeiro a abril de 1.976 (121 dias) não ocorreu temperatura inferior a 15 graus centígrados nem superior a 40 graus centígrados. As temperaturas verificadas em cada dia estão disponíveis em uma unidade de entrada de dados. 63 - Fazer um programa que calcule e imprima:     a menor temperatura ocorrida; a maior temperatura ocorrida; a temperatura média; o numero de dias nos quais a temperatura foi inferior a temperatura média. 4 - Fazer um programa que: a) leia uma frase de 80 caracteres, incluindo brancos; b) conte quantos brancos existem na frase; c) conte quantas vezes à letra aparece; d) conte quantas vezes ocorre um mesmo par de letras na frase e quais são elas e) imprima o que foi calculado nos itens b, c e d. 5 - Fazer um programa que: a) leia o valor de N (N < = 1000) e os n valores de uma variável A composta de valores numéricos, ordenados de forma crescente; b) determine e imprima para cada número que se repete no conjunto à quantidade de vezes que ele aparece repetido; c) elimine os elementos repetidos formando um novo conjunto; d) imprima o conjunto obtido no item C. 6 - Dado um conjunto de 100 valores numéricos disponíveis num meio de entrada qualquer, fazer um a programa para armazená-los numa variável composta B, calcular e imprimir o valor do somatório dado a seguir: Exemplo: B 2 10 1 . 60 .. 1 2 3 3 S = (210-97) + (160-33) + . . . 64 9 7 3 100 7 - Fazer um programa que: - leia o valor de M (M < = 30) e os M valores de uma variável composta A; - leia o valor de N (N < = 20) e os N valores de uma variável composta B; - determine o conjunto C=A  B (união de A com B), onde C não deverá conter elementos repetidos (A e B não contém elementos repetidos); - escreva os elementos contidos em A, B e C. 7 - Seja P = anxn + an-1xn-1 + an-2xn-2 + . . . + a1x + a0 Escrever um programa que: - leia o valor de n, sendo n < = 20; - leia os coeficientes ai, i = 0,1,2, . . ., n; - calcule o valor de p para 10 valores de x, lidos em cartões; - escreva o valor de x e o valor de p correspondente. 8 - Fazer um programa que: a) leia um conjunto de valores inteiros correspondentes a 80 notas dos alunos de uma turma, notas estas que variam de 0 a 10; b) calcule a freqüência absoluta e a freqüência relativa de cada nota; c) imprima uma tabela contendo os valores das notas (de 0 a 10) e suas respectivas freqüências absoluta e relativa; Obs.: 1 - freqüência absoluta de uma nota e o número de vezes que ela aparece no conjunto de dados; 2 - freqüência relativa é a freqüência absoluta dividida pelo numero total de dados. 65 9 - Uma grande firma deseja saber quais os três empregados mais recentes. Fazer um programa para ler um número indeterminado de cartões no máximo de 300, contendo o numero do empregado e o número de meses de trabalho deste empregado e escrever os três mais recentes. 10 - Fazer um programa que: - leia uma variável composta A com 30 valores numéricos; - leia outra variável composta B com 30 valores numéricos; - leia o valor de X; - verifique qual elemento de A que é igual a X; - escreva o elemento de B de posição correspondente a do elemento de A igual a X; 11 -Dados as variáveis compostas A e B abaixo: A 2 5 7 9 5 1 6 9 B 0 2 3 7 2 6 8 9 Calcular o conjunto C=A+B 12 - Fazer um prog. em c++ que leia duas variáveis compostas de dimensão m*n(m<=20,n<=30). Onde os valores de m e n são lidos. Calcule e escreva: - a soma dos elementos das matrizes. 13 - Fazer um prog. em c++ que leia uma Am*n(m<=20,n<=10). Onde m e n são lidos. Calcule e escreva: 66 matriz numérica - a matriz transposta de A. 14 - Fazer um prog. que leia uma matriz numérica Am*n(m<=20,n<=10). Onde m e n são lidos. Calcule e escreva uma matriz modificada B(m*n+1), sendo que os elementos de (n+1)-és ima coluna são formados com o produto dos elementos da mesma linha. Exemplo: A 2 3 4 5 B 2 3 6 4 5 2 0 15 - Fazer um programa que leia uma matriz inteira Am*m. Onde m e n são lidos. Calcule e escreva: - o maior elemento par da diagonal secundária; - a média dos elementos divisíveis por 3 da penúltima coluna da matriz; - o produto dos elementos ímpares abaixo da diagonal principal da matriz. 67