Computação e Programação 1 Aula prática Nº 11 Introdução ao MatLab O que é o MatLab? O MatLab é um sistema para cálculo cient ífico que proporciona um ambiente de fácil utilização com uma notação intuitiva mas poderosa. Permite a realização de algoritmos numéricos sobre matrizes com o mínimo de programação. Além disso, no ambiente MatLab é possível a criação e manipulação de matrizes sem a necessidade de dimensionamento prévio e a manipulação das variáveis pode ser realizada de forma interactiva. O termo “MatLab" tem origem na conjugação dos termos “MATrix" e “LABoratory". Figura 1 - Exemplos de aplicações do MatLab: gráfico 2D, processamento de imagens e gráficos 3D Para iniciar o programa MatLab seleccionar as seguintes opções de menu: Start → Programs → MatLab 7.0 1 Computação e Programação Aula prática Nº 11 Execute o programa. O desktop apresentado na Figura 2 deverá aparecer no ecrã. Figura 2 – Imagem do desktop por defeito do MatLab. A aparência exacta do desktop pode diferir ligeira mente em diferentes tipos de computador. A interface apresenta na barra de comandos superior diversas opções, incluindo help, no qual se pode observar os diferentes comandos da linguagem, como será visto mais adiante. Os comandos são executados no MatLab pela linha de comando, através da prompt " >>" e, após a confirmação através da tecla <Enter>. O comando HELP Para esclarecer a maior parte das dúvidas acerca da utilização de uma dada função do Matlab o comando help é de grande utilidade. Se se pretender, por exemplo, informação sobre a função sin, basta fazer >> help sin obtendo-se a seguinte descrição SIN Sine. SIN(X) is the sine of the elements of X. O Matlab possui todas as funções organizadas em grupos e a própria estrutura de directórios onde o Matlab é armazenado em disco reflecte esse facto. Por exemplo, todas as funções de álgebra linear estão armazenadas no directório matfun. Para obter uma lista completa deste tipo de funções basta fazer >>help matfun 2 Computação e Programação Aula prática Nº 11 Como não é fácil decorar os nomes de todas as categorias de funções, existe uma janela de ajuda mais organizada, bastando para tal escrever o comando >>helpwin O comando LOOKFOR Quando se pretende encontrar uma função para resolver um problema, mas desconhecese se existirá alguma adequada no Matlab, o comando lookfor permite pesquisar as primeiras linhas do “help" de todas funções da instalação do Matlab. Esta pesquisa é adequada para resolver a maior parte das situações uma vez que a primeira linha do “help" de uma função contém sempre uma descrição sumária da sua funcionalidade. O seguinte exemplo procura pela palavra “inverse". >>lookfor inverse Se se pretender que a função lookfor pesquise todas as linhas do “help", pode-se utilizar a opção -all, tal como o seguinte exemplo ilustra. >>lookfor -all inverse O sistema Matlab O sistema Matlab é constituído pelas seguintes partes: A linguagem: Permite a manipulação e criação de matrizes de forma rápida e intuitiva. Diferentes soluções para um problema podem ser testadas numa fracção do tempo que levaria com outras linguagens (C ou Fortran por ex.). Possui um conjunto muito vasto de funções que permitem resolver problemas complexos de forma eficiente. O ambiente de trabalho: O Matlab proporciona um ambiente de trabalho que permite a gestão e visualização das variáveis, ler e gravar variáveis em disco e gerar programas em linguagem Matlab, possibilitando assim a automatização de cálculos complexos. Gráficos: As funções de criação, visualização e manipulação de gráficos são muito fáceis de usar e permitem a criação de gráficos 2D e 3D. O ajuste de escala é automático e o utilizador pode começar a utilizar as funções de geração de gráficos pouco tempo depois do primeiro contacto com o ambiente do Matlab. "Toolboxes": O Matlab disponibiliza um conjunto de pacotes de funções para as mais variadas áreas de cálculo cient ífico, sendo estes denominados “toolboxes". Existem “toolboxes" para estatística, processamento de sinal, processamento de imagem, controlo, cálculo simbólico, etc. 2 Arrays no MatLab Um array é uma estrutura de dados organizada em linhas e colunas e identificado por um nome unívoco. Valores individuais de um array são acedidos, incluindo o nome do array seguido de subíndices entre parêntesis que identificam a linha e a coluna do valor particular. O termo “vector” é geralmente usado para descrever um array com uma 3 Computação e Programação Aula prática Nº 11 dimensão, e o termos “matriz” é geralmente usado para descrever um array com duas ou mais dimensões. Atribuição A atribuição de um valor a uma variável pode ser realizada da seguinte forma: >> x = 8 (não é necessário declarar a variável) O MatLab responderá com x = 8 Se o mesmo comando for digitado com o ";" no final da expressão >> x = 8; nada será exibido além do prompt de espera de um novo comando. Porém, ao digitar a variável "x" e pressionar o <Enter>, aparecerá o conteúdo actual de "x": x = 8 Criação de Matrizes Uma matriz, por exemplo, pode ser criada através do comando: >> A = [1 1 1; 2 2 2; 3 3 3] ou >> A = [1 1 1 2 2 2 3 3 3] e o resultado, para ambos os casos, será A = 1 1 2 2 3 3 1 2 3 Assim, o elemento a11 = 1 é o primeiro elemento da linha 1, coluna 1 da matriz A. Quando são atribuídos valores às variáveis, estas guardam os valores até que novos valores sejam atribuídos ou o programa seja encerrado. Para limpar o conteúdo das variáveis, existe o comando "clear": >> clear; Comandos anteriormente submetidos ao MatLab podem ser recuperados e reexecutados a qualquer momento, usando-se a tecla de "seta para cima". 4 Computação e Programação Aula prática Nº 11 Índices O elemento da linha i e da coluna j de uma matriz A é designado por A(i; j). Por exemplo o elemento da linha 1 e coluna 3 da matriz A é designado por A(1; 3). Em notação Matlab, para obter o elemento A(1; 3) definida anteriormente, pode-se escrever >>A(1,3) e obtém-se ans= 3 Para alterar o valor do elemento A(1; 3) para 7 basta fazer >>A(1,3)= 7 Os índices das matrizes são números inteiros positivos pertencentes ao intervalo [1 … N] em que N depende da memória disponível, e podem ser vectores declarados anteriormente. Se pretendermos por exemplo, extrair a segunda linha da matriz A podemos fazer >>v= A(2,[1 2 3]) v= 4 5 6 ou declarando primeiro um vector para os índices das colunas >>k= [1 2 3] >>v= A(2,k) v= 4 5 6 3 Utilização da ferramenta de Debug: É muito mais comum fazer erros num programa que contém funções, estruturas e ciclos, do que quando escrevemos um programa simples e sequencial. Mesmo garantindo que o programa foi elaborado seguindo todas as regras de projecto, é quase totalmente garantido que o programa conterá erros na primeira vez que for corrido. O MatLab possui uma ferramenta de debug e para explorá-la vamos utilizar um programa simples: % Ficheiro script: calcula_raizes.m % Este programa calcula as raizes uma equacao quadratica da % forma a*x^2 + b*x + c = 0, sejam elas reais ou complexas. % Data Programador Descricao da alteracao % ==== ============= ===================== % 15/04/06 Joao M. C. Sousa Codigo original 5 Computação e Programação Aula prática Nº 11 % % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante % parte_imag -- Parte imaginaria da equacao % raizes complexas) % parte_real -- Parte real da equacao (para % complexas) % x1 -- Primeira solucao da equacao % raizes reais) % x2 -- Segunda solucao da equacao % raizes reais) (para raizes (para (para % Pergunta ao utilizador os coeficientes da equacao disp('Este programa calcula as raizes de uma equacao'); disp('quadratica da forma a*x^2 + b*x + c = 0.' ); a = input('Introduza o coeficiente a: '); b = input('Introduza o coeficiente b: '); c = input('Introduza o coeficiente c: '); % Calcula o discriminante discriminante = b^2 - 4 * a * c; % Calcula as raizes dependendo do valor do discriminante if discriminante > 0 % ha duas raizes reais x1 = (-b + sqrt(discriminante)) / (2*a); x2 = (-b - sqrt(discriminante)) / (2*a); disp('Esta equacao tem duas raizes reais:'); fprintf('x1 = %f\n', x1); fprintf('x2 = %f\n', x2); elseif discriminante == 0 % ha uma raiz dupla x1 = -b / (2*a); disp('Esta equacao tem uma raiz dupla:'); fprintf('x1 = x2 = %f\n', x1); else % existem duas raizes complexas parte_real = -b / (2*a); parte_imag = sqrt(abs(discriminante)) / (2*a); disp ('Esta equacao tem raizes complexas:'); fprintf('x1 = %f +i %f\n', parte_real, parte_imag ); fprintf('x1 = %f -i %f\n', parte_real, parte_imag ); end Queremos saber o que acontece se corrermos o programa. Para isso podemos adicionar “breakpoints”, clicando com o botão direito do rato nas linhas em que temos interesse e escolhendo a opção “Set/Clear Breakpoint”. Quando utilizamos um “breakpoint” numa linha, aparece um ponto vermelho à sua esquerda. Uma vez criados os “breakpoints” desejados, pode correr-se o programa, escrevendo o nome do programa na janela de comandos. O programa correrá até encontrar o primeiro”breakpoint”. Aparecerá uma seta verde na linha one o programa parou a execução. Neste ponto o programador pode examinar e modificar qualquer variável do programa no “workspace”. Quando o 6 Computação e Programação Aula prática Nº 11 programador estiver satisfeito pode continuar a correr o programa linh a linha pressionando a tecla F10 ou pode correr o programa até ao próximo “breakpoint” pressionado a tecla F5. É sempre possível observar os valores de qualquer variável em qualquer ponto do programa. 4 Problemas de programação 1. A maioria dos microfones desenhados para serem utilizados em palco é microfones direccionais, que são construídos especificamente para realçar o sinal recebido do cantor que está á frente do microfone e para o ruído provocado pela audiência por trás do microfone. O ganho deste tipo de microfones varia em função do ângulo de acordo com a seguinte equação: EQUAÇÂO Onde g é a constante associada a cada microfone, e θ é o ângulo formado pelo eixo do microfone com a origem do som. Assuma que g é igual a 0.5 para um dado microfone, e faça um gráfico do ganho do microfone como função da direcção do som. % % % % % % % % % % % % % Ficheiro Script: microfone.m Este programa faz o grafico padrao do ganho de um microfone cardioide Data ==== 04/05/06 Programador ========== Susana Vieira Descricao da alteracao ===================== Original code Definicao das variaveis:: g -- constante de ganho do microfone ganho -- Ganho como função do angulo theta -- Angulo do eixo do microfone (radians) % Calcula o ganho versus o angulo g = 0.5; theta = 0:pi/20:2*pi; ganho = 2*g*(1+cos(theta)); % Desenha o ganho polar (theta,ganho,'r-'); title ('\bfGanho versus anglo \theta'); 7 Computação e Programação Aula prática Nº 11 2. Num gás ideal todas as colisões entre moléculas são perfeitamente elásticas. É possível pensar nas moléculas de um gás ideal como sendo bolas de snooker de rigidez perfeita, que colidem e separam-se sem perder energia ciné tica. Os gases ideais podem ser caracterizados por três grandezas: pressão absoluta (P), volume (V) e temperatura absoluta (T). A relação entre estas grandezas para um gás ideal, é conhecida como a Lei dos Gases Ideais: EQUAÇÂO Onde P é a pressão dos gases em kilopascais (kPa), V é o volume do gás em litros (L), n é o número de moléculas do gás em unidades de moles (mol), R é a constante universal dos gases ideais (8.314 L.kPa/mol.K) e T é a temperatura absoluta em Kelvin (K). (Nota: 1 mol = 6.02 E23 moléculas) Assuma que uma amostra de um gás ideal contém 1 mole de moléculas à temperatura de 273 K. a) Como varia o volume do gás conforme a sua pressão varia entre 1 e 1000 kPa? Faça o gráfico da pressão versus o volume para este gás para as condições descritas. Use uma linha vermelha com espessura de 2 pixels. b) Suponha que a temperatura do gás aumenta para 373 K. Como é que o volume deste gás varia agora com a pressão? Faça o gráfico da pressão versus o volume deste gás, na mesma figura utilizada anteriormente. Use uma linha de traço interrompido azul, com espessura de 2 pixels. Inclua um título no gráfico e uma legenda para cada um dos eixos, x e y, assim como uma legenda para cada uma das linhas utilizadas. % % % % % % % % % % % % % % Ficheiro Script: gas_ideal.m Este programa faz o grafico da pressao versus o volume de um gas ideal % n R T Inicializar nRT = 1; = 8.314; = 273; Data ==== 04/05/06 Programador ========== Susana Vieira Descricao da alteracao ===================== Codigo Original Definicao das variaveis: n -- Numero de atomos (mol) P -- Pressao (kPa) R -- Contante dos gases ideais (L kPa/mol K) T -- Temperatura (K) V -- volume (L) % Moles de atomos % Contante dos gases ideais % Temperatura (K) % Cria o array de pressoes de entrada. 8 Computação e Programação Aula prática Nº 11 P = 1:0.1:1000; % Calcula os volumes V = (n * R * T) ./ P; % Cria o primeiro grafico figure(1); loglog( P, V, 'r-', 'LineWidth', 2 ); title('\bfVolume vs Pressao num Gas Ideal'); xlabel('\bfPressao (kPa)'); ylabel('\bfVolume (L)'); grid on; hold on; % Aumenta a temperatura T = 373; % Temperatura (K) % Calcula os volumes V = (n * R * T) ./ P; % Adiciona uma segunda linha ao grafico figure(1); loglog( P, V, 'b--', 'LineWidth', 2 ); hold off; % Adiciona uma Legenda legend('T = 273 K','T = 373 K'); 9