EST - Setúbal SINAIS, SISTEMAS E SIMULAÇÃO Laboratório 1a - Trabalho de Matlab “Introdução ao Matlab: comandos” Curso de LEACI (3º Sem) e LEII (5º Sem) Realizado em Outubro / 2006 por João Nabais. Revisto e formatado em Novembro / 2006 por Rogério Largo Curso: _____ Turma:_____ Grupo: ___ Objectivos O trabalho tem por principal objectivo a familiarização com a ferramenta computacional Matlab. Em concreto pretende-se salientar as seguintes tarefas, • • • Álgebra (manipulação e operações sobre matrizes, vectores) Gráficos (criar e editar gráficos 2D) Programação (realização de scripts e funções) O Matlab tem um vasto campo de aplicação onde se salientam entre outras as seguintes áreas • • • • • • Controlo de Sistemas Processamento de Sinais Aquisição de Sinais Instrumentação Optimização Financeira A. Apresentação A interface do Matlab é intuitiva e simples. Ao abrir a aplicação tem acesso ao ambiente de desenvolvimento que se caracteriza por disponibilizar as seguintes secções, Barra de Menus dependentes da tarefa seleccionada Área de introdução de comandos e visualização de resultados (prompt) Menu de navegação de directórios Visualização do Workspace (variáveis criadas e existentes na memória) Visualização do histórico dos comandos introduzidos por sessão de trabalho Acesso ao Editor para programação Vamos proceder à abertura de alguns módulos programados para verificar as potencialidades. Na linha de comandos escreva seguido de enter, >> travel >> truss >> teapotdemo >> thermo B. Configuração – Directório de Trabalho Antes de iniciarmos a sessão de trabalho vamos modificar o directório de trabalho – menu superior. Assim, tudo o que estiver nesta directoria estará disponível para o Matlab. São exemplos disso os M-Files desenvolvidos pelos teus colegas. SSSimul Lab-1a 1 EST - Setúbal Caso pretendas reconhecer o conteúdo de uma directoria mas trabalhar noutra então terás de adicionar a primeira ao conjunto de directorias em que o Matlab procura por código, Menu/Set_Path C. Álgebra Pode definir constantes. Os nomes das variáveis não devem começar por números. >> a = 10, b = 5, c = 2 O operador “,” serve para realizar espaçamento entre instruções. Pode realizar mais do que uma instrução na mesma linha. O que vê na prompt do Matlab? Visualize o Workspace. O que regista? [R] Para limpar variáveis da memória pode apagá-las. Estando a monitorizar o workspace faça, >> clear a >> clear all Voltemos a definir as mesmas variáveis, mas agora com uma pequena alteração nas linha de código, >> a = 10; b = 5; c = 2; Também se pode pedir ao Matlab a listagem do workspace, na prompt faça: >> whos. O que vê na prompt do Matlab? Visualize o Workspace. Qual a função do operador “;” nesta linha de código? [R] Sobre variáveis pode realizar operações. Para se aceder à listagem de operações disponíveis, faça na prompt do Matlab, >> help + Sempre que queira saber algo (precise de ajuda sobre uma função) pode na prompt do Matlab introduzir: >> help [nome_função], (sem parentesis). Outra forma de pedir ajuda é recorrer à barra de menus. Podemos realizar algumas operações, >> rho = ( 1 + sqrt(5))/2 >> a = abs(3+4*i) >> huge = exp(log(realmax)) Que cálculo é realizado em cada instrução? [R] SSSimul Lab-1a 2 EST - Setúbal Decerto reparaste que foram feitas referências a variáveis não existentes no workspace e o código correu sem problemas. O Matlab tem um conjunto de números definidos por defeito. Qual o valor de … [R] pi …. [R]____________________________________ i… ____________________________________ j… ____________________________________ eps … ____________________________________ realmax … ____________________________________ realmin … ____________________________________ inf … ____________________________________ NaN … ____________________________________ C1. Matrizes Vamos iniciar a manipulação de matrizes. Defina-se na prompt do Matlab a matriz A, >> A = [ 16 , 2, 3 , 13 ; 5 , 11, 10, 8 ; 9 , 7, 6, 12; 4 , 14, 15, 1] Os vectores e matrizes definem-se sempre por parêntesis rectos. Dentro dos argumentos do vector o operador “,” separa os elementos e o operador “;” muda de linha. Quais as dimensões da matriz definida? [R] A dimensão de uma matriz pode ser lida pelo comando “size”. Agora realize a soma dos valores por coluna da matriz, faça, >> sum(A) Alguma particularidade na resposta? [R] Transponha a matriz A e defina a matriz B como sendo a transposta, faça, >> B = A’ Agora realize a soma dos valores por coluna. Alguma particularidade? [R] Aceda aos elementos da diagonal da matriz A e some-os, faça, >> sum( diag(A) ) Pode-se encadear operações numa mesma instrução. Caso prefiras por legibilidade de código podes fazer uma instrução por linha. Note-se: As funções têm sempre parêntesis curvo para receber os argumentos. SSSimul Lab-1a 3 EST - Setúbal O resultado anterior poderia ser obtido pela referência a cada elemento da matriz em particular, faça, >> A(1,1) + A(2,2) + A(3,3) + A(4,4) Os elementos de um array são obtidos por referência dos seus índices dentro de parêntesis curvos. Qual a dimensão de diag(A)? Alguma particularidade quanto ao resultado? [R] É verdade! És um mágico da matemática! Acabaste de encontrar uma matriz mágica. Faz no Matlab, >> A – magic(4) Que operação acabaste de realizar? Que te permite concluir? [R] Existem mais matrizes interessantes que podem ser definidas. Fazer no Matlab: Que operações são realizadas pelas instruções seguintes: (pode fazer help para pormenores) >> n = 3 >> zeros(n) >> ones(n) >> eye(n) >> rand(n) _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ Existem operações especialmente dedicadas à manipulação de matrizes já tuas conhecidas. Aqui são implementadas via, >> rank(A) >> det(A) >> eig(A) >> inv(A) >> svd(A) _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ _________________________________________________ C2. Mais um pouco sobre manipulação de matrizes… Caso queiras aceder apenas a algumas colunas ou linhas da matriz A faz, >> D = A(1:3,:) O operador “:” no primeiro caso é lido como “do índice 1 a 3” e no segundo caso como “qualquer”. Qual a semelhança entre D e A? SSSimul Lab-1a 4 EST - Setúbal [R] Caso pretendas apagar uma coluna ou linha da matriz faz, >> D(:,2) = [ ] O que foi apagado da matriz original A? [R] Quando se define uma matriz nem sempre tem de ser introduzido elemento a elemento. Podem ser adicionados elementos a matrizes ou criada uma matriz a partir de matrizes. Chama-se a isto concatenação. Faça na prompt do Matlab, >> X = A >> X(4,5) = 17 Qual a dimensão final de X ? [R] >> C = [A , A+32; A+48 A+16] A matriz C é não singular? (Não te recordas da definição, usa o método indicado acima) [R] O Matlab é ou não uma ferramenta amiga do programador? …. ________________________ Cria no Matlab o seguinte vector de inteiros, (já iremos estudar melhor) >> n = [-5:5]’ O operador “:” nesta instrução indica a existência de um intervalo, no caso entre -5 e 5 com incremento unitário. Como procederias para cumprir o mesmo objectivo noutra linguagem? [R] Sobre um vector de dados pode-se pretender realizar operações, nomeadamente calcular o quadrado de cada entrada entre outras. As operações sobre elementos de vectores são geralmente acompanhadas do operador “.”. (Fazer >> help + ). No Matlab faz: >> pow = [ n, n.^2, 2.^n] Qual o significado de cada coluna de pow? SSSimul Lab-1a 5 EST - Setúbal [R] Pode realizar gráficos de dados armazenados em matrizes. Em relação ao exemplo cada coluna da matriz tem o significado indicado. Para ver o significado graficamente faça na prompt do Matlab, >> plot(n,pow) Qual o significado da curva a azul, verde e vermelha? [R] O nível de iniciado está concluído. Decerto ficaste cansado de introduzir comandos e de os reintroduzir quando algum erro acontecia. Utilizar a pompt do Matlab é apenas para amadores, os profissionais utilizam as capacidades de programação que o Matlab oferece. D. Nível Avançado O Matlab permite a programação em ficheiros designados de M-file. No caso existem dois tipos distintos de M-file, Scripts – que não aceitam nem retornam argumentos. Operam sobre o workspace e podem criar variáveis para o workspace, Function – aceitam e retornam argumentos. Possuem variáveis locais (internas) À própria função. D1. – M-file [O código elaborado nesta secção tem de ser entregue no final da sessão] Vamos focar atenção para já nos Scripts (a utilização de funções é análoga). Para consolidar a manipulação de M-file abra a partir da barra de menus do Matlab File/New/Mfile. Assim abre o editor do Matlab onde pode introduzir exactamente os mesmos comandos que realizou anteriormente directamente na prompt do Matlab. Realize um ficheiro muito simples introduza, % % O meu primeiro M-file % n = (-5:5)’; pow = [ n, n.^2, 2.^n]; plot(n,pow) Grava o ficheiro com o nome “eureka”. O caracter “%” é especial pois indica que tudo o que estiver à direita é interpretado como comentário. Caso a primeira linha de código se inicie com o símbolo “%” então o bloco de linhas consecutivo iniciado pela linha indicada representa o help do ficheiro. Confuso? Faz no Matlab >> help eureka SSSimul Lab-1a 6 EST - Setúbal Mais claro agora? Para correr o seu ficheiro tem duas alternativas: • Chamar directamente a partir da prompt do Matlab introduzido apenas o nome do ficheiro • Atalhos existente na barra de menus do Editor. No Matlab faça, >> eureka Vamos construir uma função para implementar o mesmo código. A função requer uma definição padronizada logo na primeira linha, function “valores retornados” = “nome_da_função”(argumentos_entrada) A função obedece ao mesmo critério de help que um script –o bloco de comentário logo abaixo da definição da function é o help da função. O nome do ficheiro M-file da função e o nome da função devem ser o mesmo. Usualmente uma função recebe argumentos. Atendendo ao código pode-se utilizar a parametrização do vector inicial, isto é, n = (-arg:arg)’. Assim introduz, function pow = eureka_f(arg) % % A minha primeira function % n = (-arg:arg)’; pow = [ n, n.^2, 2.^n]; plot(n,pow) Grava o ficheiro com o nome “eureka_f”. Antes de correr a função repara no worksapce existente após o Script. Agora apaga todas as variáveis e fecha a figura. Chama a tua função com um parâmetro do valor que achares criterioso. Que diferença existe entre o código implementado via Script e via Function? (Sugestão: analisa o workspace) [R] SSSimul Lab-1a 7