Programação em MATLAB UNIVERSIDADE DA BEIRA INTERIOR Departamento de Matemática
Conteúdo 1 Introdução 2 2 Scripts 3 3 Funções 5 4 Programação 7 5 Escrita e leitura de arquivos 11 6 Gráficos especiais 13 1
Capítulo 1 Introdução A utilização do Matlab apenas com a janela de comandos torna bastante difícil emendar erros e guardar instruções para repetir noutra sessão. Para resolver este inconveniente existem os scripts e funções. São ficheiros de texto com extensão.m. Para melhorar estes ficheiro o Matlab permite uma linguagem de programação de alto nível. Com os scripts e funções podemos criar rotinas próprias e adicioná-las às já existentes. 2
Capítulo 2 Scripts Um script é um conjunto de instruções do MATLAB gravados num ficheiro (com a extensão.m chamados m-files), como está exemplificado na figura 2.1. É equivalente a escrever todas as instruções na janela principal, só que armazenadas num arquivo. O script trabalha com variáveis globais (apresentadas no directório de trabalho), ou seja, lê e escreve as variáveis do ambiente de trabalho. É preciso ter cuidado pois também pode alterar variáveis existentes, sem avisar. Nos scripts podemos escrever informação útil para o utilizador, mas que não faz parte de nenhuma Figura 2.1: Exemplo de um script instrução. Tudo o que é escrito após o símbolo %, numa linha, é considerado comentário e o Matlab não lê. O ; no final da instrução permite que seja efectuada a instrução sem apresentação do resultado. No caso de a instrução não ser finalizada com ; o resultado é mostrado na janela de comandos. A apresentação dos resultados também pode ser feita com o comando fprintf. A entrada de variáveis que não existem no ambiente de trabalho pode ser feiro com o comando input. Para executar o script basta escrever o nome do arquivo (sem a extensão.m), como mostra a figura 2.2. 3
Scripts Figura 2.2: Exemplo de utilização de um script A utilização de scripts requer alguns cuidados. NUNCA grave o script com o mesmo nome de uma variável nele utilizada. O nome do arquivo script deve começar por uma letra. Seja cuidadoso com os nomes das variáveis no script (todas essas variáveis são gravadas no ambiente de trabalho) Exercícios 1. Construa um script que transforma um número x em graus, num número y em radianos. 2. Faça um script que mostra na janela principal uma tabela de conversão de graus Celsius para graus Fahrenheit. ( Considere C=-40:5:100) 3. Construa um script que: traça o gráfico da função tan(x) a azul, no intervalo [ π, π]; representa a tracejado verde as assimptotas; marca com um circulo vermelho os zeros da função; insere as legendas e título. 4
Capítulo 3 Funções Funções são m-files contendo um conjunto de instruções do Matlab, como um script, só que todas as variáveis são locais e não globais. São como programas ou subrotinas no Fortran. Para distinguir as funções dos scripts a primeira instrução é function. A seguir na 1 a linha do arquivo define-se as variáveis de entrada e de saída, e o nome da função, como mostra a figura 3.1. O nome da função deve ter o mesmo nome do arquivo a ser gravado. Figura 3.1: Exemplo de uma função Para executar uma função existem várias opções. Podemos guardar todas as variáveis de saída ou apenas as primeiras, como está exemplificado na figura 3.2. Algumas dicas para construir funções. Crie uma estrutura lógica e pense na sequência computacional antes de escrever o código. Escreva-a num papel. Defina as variáveis de entrada e saída. Traduza o que escreveu no papel para a lingagem do Matlab. 5
Funções Figura 3.2: Exemplo de uma função Defina nomes lógicos para as variáveis e funções. Divida grandes blocos computacionais e escreva-os em funções separadas. Verifique os erros e a saída com mensagens de erro e use o artifício do ; para verificar os passos intermédios de cálculo. O termo de definição deve ser escrito com letra minúscula ( function e não Function ). Os comentários começam com %, podendo ser colocados em qualquer lugar. Todas as linhas com comentários imediatamente após a primeira linha são mostradas no Matlab help. Escreva o máximo de comentários possíveis no código. Uma simples variável de saída não precisa ser fechada por parênteses rectos [ ]. O nome das variáveis de entrada e de saída declaradas na primeira linha são variáveis locais. Exercícios 1. Construa uma função cuja entrada é um número x em graus, e devolve o seu valor em radianos. 2. Faça uma função que dadas 2 matrizes calcule a soma e diferença. 3. Construa uma função que converte a pressão de atm para N/m 2. 6
Capítulo 4 Programação Nos scripts e funções as instruções são executadas pela ordem que estão escritas, para mudar a ordem com que são executadas são necessários alguns comandos. O Matlab tem um conjunto de comandos para controlar o fluxo das instruções, de entre eles destacamos: for e while - para ciclos. if-elseif-else - para condições simples. switch-case-otherwise - para condições mais complexas. break, return e error - para terminar operações. Cada um dos controladores de fluxo deve terminar com end. Ciclo for Um for é usado para repetir uma operação ou um grupo de operações para um número de vezes predefinido. Figura 4.1: Exemplo do ciclo for A forma de utilizar é: for contador=vector instruç~oes 7
Programação end A variável que define o contador é um vector, não necessariamente de valores inteiros. As instruções são executadas para cada elemento do vector. Ciclo while Um while é usado para repetir uma operação ou um grupo de operações para um número indefinido de vezes enquanto que a condição especificada seja satisfeita. Figura 4.2: Exemplo do ciclo while A sintaxe é while condiç~ao instruç~oes end É necessário garantir que alguma vez a condição não é satisfeita, pois caso contrário o programa entra num ciclo infinito. Para parar um ciclo infinito pode-se utilizar as teclas ctrl e c simultaneamente. Condicional if O comando if cria blocos condicionais. O comando é utilizado da forma: if condiç~ao instruç~oes else instruç~oes end Se a condição é verdadeira realiza o primeiro bloco de instruções. realiza o segundo bloco. No caso de vários condicionais encadeados podemos utilizar elseif Observações: Se a condição é falsa 8
Programação Figura 4.3: Exemplo do condicional if Não é necessário utilizar sempre o comando completo, por vezes basta o if e end. A instrução elseif pode ser utilizada as vezes que for necessária. Condicional switch Cria blocos condicionais. Uma variável é usada como um dispositivo de direccionamento (switch), onde cada valor dessa variável direcciona para um caso (case). Figura 4.4: Exemplo do condicional switch A sintaxe é: switch variável case valor1 instruç~oes case valor2 instruç~oes... otherwise instruç~oes end Observações: Não é necessário utilizar sempre o comando completo, por vezes basta o switch e case. 9
Programação A instrução case pode ser utilizada as vezes que for necessária. Operadores Booleanos O resultado das condições tem de ser uma variável booleana, com os valores 1 ou 0. O valor 0 quando a condição é falsa e 1 quando verdadeira. Essencialmente existem dois tipos de operadores. Relacionais Os relacionais permitem comparar elementos <, <=, >, >=, ==, =. Lógicos Os lógicos permitem construir proposições. & ou and - conjunção; ou or - disjunção; ou not - negação; Comandos de paragem Para terminar a execução de algumas instruções o Matlab tem alguns comandos de paragem. error( mensagem ) dentro de uma função ou script, sai da execução da rotina e mostra uma mensagem de erro. return dentro de uma função ou script, sai da execução da rotina. break dentro de um for ou while, termina a execução do ciclo. Figura 4.5: Exemplo de utilização dos comandos de paragem Exercícios 1. Faça um programa que verifica se um número é primo. 2. Um fornecedor faz o seguinte desconto num determinado produto: mais de 200 unidades 7%; de 100 a 200 uni. 5%; de 50 a 100 uni. 3%; menos de 50 unidades não tem desconto. Escreva um programa que calcula o preço total, dado o n o. de unidades e o preço unitário. 10
Capítulo 5 Escrita e leitura de arquivos O MATLAB possui algumas funções para ler e escrever dados em arquivos do tipo binário ou ASCII formatados. As funções são: fopen: abre um arquivo existente ou cria um novo arquivo fclose: fecha um arquivo aberto fwrite: escreve uma informação binário para um arquivo fread: lê informação binário num arquivo fscanf: lê informação formatada num arquivo fprintf: escreve informação formatada num arquivo Figura 5.1: Exemplo de escrita de dados num ficheiro Para ler e escrever informação formatada os comandos são: 11
Escrita e leitura de arquivos Figura 5.2: Exemplo da leitura de dados escritos num ficheiro Formato Descrição %c Simples caracter %d Notação decimal %e Notação exponencial (usando e minúsculo ) %E Notação exponencial (usando e maiúsculo ) %f Notação fixando ponto %g O mais compactado de %e ou %f %o Notação Octal %s Grupos de caracteres %x Notação Hexadecimal Exercícios 1. Construa um programa que escreve num ficheiro de texto uma tabela de conversão entre as unidades de temperatura Fahrenheit, Kelvin e Celsius. 2. Crie um programa que gera aleatoriamente um conjunto de 100 elementos normalmente distribuídos e os escreva num ficheiro. 3. Faça um programa que lê o ficheiro da alínea anterior, calcule a média dos dados e apresente um gráfico dos valores lidos. 12
Capı tulo 6 Gra ficos especiais fplot Representa gra ficos de func o es de uma forma simples. Por exemplo: >>fplot( x.*sin(x),[0 10*pi]) semilogy O gra fico e representado com escala logarı tmica (base 10) no eixo y. >> x=linspace(0,2*pi,200); >> y=exp(-x); >> semilogy(x,y) >> grid on semilogx O gra fico e representado com escala logarı tmica (base 10) no eixo x. >> x=linspace(0,2*pi,200); >> y=log(2*x); >> semilogx(x,y) >> grid on 13
Gráficos especiais loglog O gráfico é representado com escala logarítmica (base 10) nos dois eixos. >>t=linspace(0,2*pi,200); >>x=exp(t); >>y=100+exp(2*t); >>loglog(x,y); >>grid on fill Representa o polígono e pinta a área limitada pelo polígono. Se necessário une o primeiro e o último ponto para fechar o polígono >>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( equal ) errorbar Representa a função e a margem de erro para cada ponto. >>x=0:0.1:2; >>aprx2=x-x.^3/6; >>er=aprx2-sin(x); >>errorbar(x,aprx2,er) 14
Gráficos especiais barh Desenha um gráfico de barras horizontal. >>cont=char( Asia, Europa,...... Africa, America do Norte,...... America do Sul ); >>pop=[3332;696;694;437;307]; >>barh(pop) >>for i=1:5, gtext(cont(i,:)); end >>xlabel( Polulaç~ao em Milh~oes ) >>title( Populaç~ao do Mundo (1992) ) plotyy Representa duas funções no mesmo intervalo mas com escalas diferentes. Um eixo é representado à esquerda e outro à direita. >>x=1:0.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)*sin(x) ); >>set(hy2, string, e^x ); area Desenha a função e preenche a área limitada pela função e o eixo. >>x=linspace(-3*pi,3*pi,100); >>y=-sin(x)./x; >>area(x,y) >>xlabel( x ) >>ylabel( sin(x)./x ) >>hold on >>x1=x(46:55); >>y1=y(46:55); >>area(x1,y1, facecolor, y ) 15
Gráficos especiais stem Representa uma sequência. >>t=linspace(0,2*pi,100); >>f=exp(-0.2*t).*sin(t); >>stem(t,f) compass Desenha vectores. >>th=linspace(0,2*pi,11); >>zx=cos(th); >>zy=sin(th); >>z=zx+i*zy; >>compass(z) comet Representa uma animação onde a função é desenhada como sendo a trajectória de um cometa. >>q=linspace(0,10*pi,20000); >>y=q.*sin(q); >>comet(q,y) quiver Representa o campo de velocidades com vectores. >>r=-2:0.2:2; >>[X,Y]=meshgrid(r,r); >>Z=-0.5*X.^2 + X.*Y + Y.^2; >>[dx,dy]=gradient(z,.2,.2); >>quiver(x,y,dx,dy,2); 16
Gráficos especiais surfc Representa a superfície e as curvas de nível. >>u=-5:0.2:5; >>[X,Y]=meshgrid(u,u); >>Z = cos(x).*cos(y).*exp(-sqrt(x.^2+y.^2)/4); >>surfc(x,y,z) >>axis( off ) pie3 Desenha um gráfico circular em 3D. >>pop=[3332;696;694;437;307]; >>pie3(pop) >>title( populaç~ao do mundo ) stem3 Representa uma sequência em 3D. >>t=linspace(0,6*pi,200); >>x=t; >>y=t.*sin(t); >>z=exp(t/10)-1; >>stem3(x,y,z) ribbon Representa uma função em forma de fita. >>t=linspace(0,5*pi,100); >>y=sin(t); >>ribbon(t,y,0.1) 17
Gráficos especiais sphere Desenha uma esfera. >>sphere(20) ou >>[x,y,z]=sphere(20); >>surf(x,y,z) >>axis( equal ) cylinder Desenha um cilindro por rotação de uma função. >>z=0:0.02:1; >>r=sin(3*pi*z)+2; >>cylinder(r) slice Mostra alguns cortes de funções em 4D. >>v=[0,1]; >>[x,y,z]=meshgrid(v,v,v); >>slice(x,y,z,z,[0,1],[0,1],[0,1]) >>axis([-.1,1.1,-.1,1.1,-.1,1.1]) movie Mostra um filme. >>nframes = 36; >>Frames = moviein(nframes); >>angulo = linspace(0,360,36); >>x=linspace(-3,3,100); >>[X,Y]=meshgrid(x,x); >>Z=X.*Y.*(X.^2-Y.^2)./((X.^2+Y.^2)); >>mesh(x,y,z) >>for i=1:nframes view(angulo(i),30) Frames(:,i)=getframe; end >>movie(frames,2) 18