• Nenhum resultado encontrado

INTRODUÇÃO AO SOFTWARE MATLAB

N/A
N/A
Protected

Academic year: 2019

Share "INTRODUÇÃO AO SOFTWARE MATLAB"

Copied!
103
0
0

Texto

(1)

1

AULA 5 – INTRODUÇÃO AO MATLAB

INTRODUÇÃO AO SOFTWARE MATLAB

Deste ponto em diante da disciplina, um novo software será utilizado para a solução de problemas na área da engenharia e física: O MATLAB®. Este software, diferentemente de um compilador, permite a execução de códigos e rotinas diretamente a partir de uma janela de comando. Além disso, é possível também o desenvolvimento de programas e scripts, que se assemelham muito com a forma que resolvemos problemas nas disciplinas anteriores.

A sintaxe envolvida no desenvolvimento das aplicações também será sensivelmente alterada, de modo que serão necessárias algumas aulas para a familiarização com essa nova sintaxe.

A aula de hoje visa tão somente a apresentação do software que será utilizado, além da exposição de alguns comandos básicos inerentes ao programa.

O

MATLAB®

O software surgiu em meados da década de 1970, e fundamentalmente fora criado para operações com matrizes, como o próprio nome do software sugere: MATLAB® é o acrônimo do inglês Matrix Laboratory (Laboratório de Matrizes).

Naturalmente, no MATLAB® operações com matrizes (que normalmente são extremamente complexas de serem realizadas em outras linguagens) são simples e diretas, como o cálculo de uma matriz inversa, e.g.

Com o tempo, porém, o software evoluiu muito, e hoje pode ser utilizado nos mais diversos tipos de aplicações, como operações em tempo real, processamento de imagens entre outras operações.

O

A

MBIENTE DE

D

ESENVOLVIMENTO

A Figura 1 apresenta a janela inicial do software com o nome das janelas que a constituem.

(2)

A janela de comando, central, é onde os comandos são executados. Na janela de comandos os comandos são processados na hora em que são digitados, diferentemente da forma como se fazia no Dev ou em outro compilador, onde todo o código era compilado e um arquivo executável era gerado.

Na parte superior esquerda está a janela da pasta corrente. O MATLAB® acessa os arquivos da pasta corrente sem a necessidade de especificar o caminho completo do arquivo. Abaixo dessa janela é apresentado detalhes de um arquivo qualquer quando este é selecionado.

Na janela superior esquerda encontra-se a área de trabalho, onde todas as variáveis que são criadas são listadas.

Abaixo da janela da área de trabalho encontra-se o histórico de comandos executados na janela de comando.

Usualmente, no desenvolvimento de uma aplicação, utiliza-se a janela de comando como uma espécie de rascunho, e somente depois, com a lista de comandos necessários selecionados, passa-se para a confecção de scripts, programas e funções.

M

ANIPULANDO

V

ARIÁVEIS

Por se tratar de uma linguagem em mais alto nível, no MATLAB® (ou M-Código) não é necessário que variáveis sejam declaradas, e tampouco um tipo é necessário para a variável. Isso é um pouco complicado de processar em um primeiro momento, mas com o tempo essa flexibilidade apresenta-se como uma vantagem. O comando whos apresenta a que tipo (classe no MATLAB®) a variável pertence, bem como outras características da variável. Para visualizar tais diferenças, execute na janela de comando os seguintes comandos:

clc

clear all close all a = 10;

b = 'Agora é no MATLAB!!'; c = 5 - 3j;

d = int16(452); whos

Perceba que não é necessário declarar a variável, nem especificar o tipo ao qual ela pertence. O comando clc limpa a janela de comandos, o comando clear all limpa a área de trabalho (deletando as variáveis criadas até então), o comando close all fecha qualquer janela aberta por algum comando (como gráficos). O comando whos, como já mencionado, apresenta detalhes das variáveis da área de trabalho.

(3)

3

AULA 5 – INTRODUÇÃO AO MATLAB

O uso do ponto-e-vígurla no MATLAB® tem função diferente do que em C. Quando se executa um comando terminado em ponto-e-vírgula, o valor das variáveis envolvidas não é apresentado. Execute os comandos abaixo para perceber essa diferença:

a = 10; b = 10

Uma variável, depois de criada, pode receber qualquer tipo de classe de dado. Observe a saída após executar os comandos:

clc

clear all close all a = 10; whos a = '!?'; whos

a = [1 2 3 4 5]; whos

Nos exemplos até aqui apresentados é possível constatar que o desenvolvimento de códigos no MATLAB® se dá de maneira mais intuitiva e em mais alto nível. Por exemplo, não foi necessário criar nenhuma estrutura para representar um número complexo, simplesmente foi escrito: c = 5 - 3j; bem como o comando do último exemplo a = [1 2 3 4 5]; criou um vetor com cinco números double. Isso torna a linguagem muito versátil quando se busca uma solução numérica para problemas utilizando computadores, e é por essa razão que o MATLAB® é muito utilizado. Como dito, o MATLAB® é uma ferramenta feita para manipulação de matrizes, portanto, suporta naturalmente operações envolvendo matrizes. Então é fundamental saber como criar matrizes e como a indexação de elementos é realizada nessa ferramenta.

I

NTRODUÇÃO ÀS

M

ATRIZES

A manipulação de matrizes é direta no MATLAB®, bastando criar a matriz na atribuição, como nos exemplos abaixo:

clear all close all

A = [1 2 3 4 5];

B = int16([1 3; 2 5]); C = [-1 5 2; 6 -2 1]; whos

Perceba que para criar uma matriz basta utilizar colchetes []. Os elementos da linha são

separados por espaços (formando colunas), e as linhas são separadas por ponto-e-vírgula.

A indexação de matrizes no MATLAB® se dá de forma diferente do que se fazia em C, utilizando parênteses ao invés de colchetes. Execute o código:

A = [1 2 3; 2 -4 5; 9 4 2]; B = [-1 5 2; 6 -2 1];

A(2,2) B(1,3)

(4)

O processo de indexação inicia em 1, e não em 0 (como se fazia em C). Essa é uma diferença crucial e que gera muitos problemas se não observada desde o inicio da utilização do software.

É possível ainda criar matrizes diretamente com a manipulação de índices, e não necessariamente atribuindo toda uma matriz no comando. O MATLAB® entenderá o comando e completará a matriz, preenchendo os termos restantes com zeros. Verifique a saída dos comandos:

vet(6) = 10 imag(3,2) = 3 vid(3,3,5) = -10

A manipulação algébrica de matrizes pode ser realizada de forma direta no MATLAB®. Observe o exemplo abaixo:

A = [2 5 2; -4 2 1; 5 3 1]; B = [1 2 3; 3 3 4; 4 5 7]; C = [3 2];

A * B B * C C' inv(A) inv(B)

Tente explicar o que ocorreu quando os comandos acima foram executados. Perceba que o comando C' retorna a matriz transposta de C.

É fundamental compreender como manipular matrizes no MATLAB®, pois muitas aplicações fazem uso de matrizes, como por exemplo a manipulação de polinômios.

Além da sintaxe apresentada até agora para criar matrizes, é possível utilizar o operador dois-pontos ( : ). É mais fácil entender a utilidade deste operador executando os comandos

abaixo:

clc

clear all close all vet = 1 : 10 vet2 = 1 : 2 : 10

vet3 = -0.5 : 0.2 : 0.6

Com o operador dois-pontos fica fácil criar vetores com muitos elementos que serão utilizados em cálculos numéricos e em gráficos. Por exemplo, execute e observe a saída dos comandos.

clear all close all

t = 0 : 0.25 : 2; t = t*pi

v = sin(t)

Como exercício, aumente a quantidade de pontos substituindo a linha t = 0 : 0.25 : 2;

(5)

5

AULA 5 – INTRODUÇÃO AO MATLAB

Perceba que a função seno (sin) já retornou um vetor contendo o seno de cada um dos elementos do vetor t. Isso será melhor compreendido quando funções forem abordadas. Note

que em códigos como esse a utilização do ponto-e-virgula torna-se interessante para suprir respostas intermediárias desnecessárias.

E

XERCÍCIOS

Exercício 1 Lembrando da descrição matricial de sistemas lineares, tente calcular a resposta desse sistema de equações lineares utilizando manipulação de matrizes.

5 3

3 5

x y

x y

+ =

 + = 

Resposta do sistema: x = 1.5714 e y = 0.2857.

Exercício 2 Escreva um código no MATLAB® para obter os pontos de g t( )=5 cos(2π f t) para f

(6)

MATRIZES

Na última aula, uma breve introdução à manipulação de matrizes foi realizada. Na aula de hoje, a manipulação de vetores e matrizes será abordada em detalhes.

Como vimos, matrizes podem ser criadas a partir de atribuição direta, utilizando colchetes, ou através de indexação, conforme pode-se observar no exemplo abaixo.

clear all

A = [1 2 4;-5 -3 1]; B(4,2) = 10;

disp(A) disp(B)

O comando disp() pode ser utilizado para imprimir variáveis e texto na janela de

comando, e será estudado em mais detalhes na próxima aula.

Além disso, pode-se criar um vetor utilizando o operador dois-pontos.

clear all C = 0:10;

D = 0 : 0.2 : 1; disp(C)

disp(D)

Esses exemplos são relativamente simples quando comparados a outros tipos de atribuições possíveis no MATLAB quando se trabalha com matrizes.

Estude o exemplo abaixo, onde atribuições mais complexas são utilizadas.

clear all

A = [ 0:6 ; -5:5:25]; B = [ 2 3 5 6; -2:1]; C = [-3 -5 3 2]; D = [A B]

E = [B;C]

Além disso, é possível criar vetores e matrizes utilizando funções. Algumas das funções que podem ser utilizadas para criar vetores e matrizes serão apresentadas agora.

zeros()

A função zeros() no MATLAB cria matrizes onde todos os termos são, como o nome da

função sugere, zeros. Seu funcionamento varia conforme os parâmetros passados para a função. Por exemplo, quando zeros(5) é executada, é retornado uma matriz 5x5 onde todos os

elementos são zeros. De maneira análoga, zeros(2,5) retorna uma matriz 2x5 contendo somente zeros. Se mais dimensões são necessárias, basta adicioná-las separando-as com vírgulas na função

zeros(). Execute comandos semelhantes aos abaixo apresentados.

mat = zeros(5) vet = zeros(1,5) zeros(4,1)

(7)

2

AULA 6 – MATRIZES

ones()

Esta função é análoga a função zeros(), porém retorna matrizes onde todos os elementos são uns (1). Repita os mesmos comandos executados anteriormente mudando a função utilizada de zeros() para ones().

eye()

Esta função retorna a matriz onde os elementos da diagonal são uns (1) e os demais elementos são zeros. Como realizado com a função ones(), modifique os comandos de forma a

utilizar a função eye() e observe as matrizes geradas.

Todas as funções podem ser utilizadas para criar matrizes de classes numéricas diferentes, bastando adicionar como último parâmetro a classe numérica desejada. Observe essa possibilidade no exemplo abaixo.

clear all

A = eye(3,'int8'); B = ones(3,2,'int32'); C = zeros(4,2,'uint64'); D = eye(1,10,'single'); E = eye(1);

whos

Perceba que muitas funções no MATLAB são flexíveis não somente quanto ao tipo empregado como parâmetro mas também quanto à quantidade de parâmetros utilizados.

diag()

A função diag() é utilizada para a manipulação de diagonais de matriz, e seu funcionamento depende das dimensões dos parâmetros utilizados.

Caso o primeiro parâmetro seja uma matriz, a função diag() retorna uma diagonal especificada pelo segundo parâmetro da função (caso não seja utilizado o segundo parâmetro é retornado a diagonal principal). Estude e avalie a saída dos comandos.

clear all

A = [0:4;5:9;10:14;15:19;20:24] diag(A)

diag(A,1) diag(A,-2)

Caso o primeiro parâmetro seja um vetor, a função retorna uma matriz onde uma diagonal é formada pelos elementos do vetor. É possível especificar qual diagonal se deseja completar com os elementos do vetor utilizando novamente um segundo parâmetro.

clear all vet = 1:6; diag(vet)

diag(vet) + diag(2:6,1)

(8)

triu() e tril()

As funções triu() e tril() retornam a matriz triangular acima ou abaixo da diagonal principal. Observe o que os comandos abaixo retornam.

clear all

A = [0:4;5:9;10:14;15:19;20:24] tril(A)

triu(A)

blkdiag()

A função blkdiag() retorna uma matriz formada pela concatenação de outras matrizes,

fazendo a concatenação das matrizes na diagonal principal da matriz de retorno.

clear all A = [1:3;5:7]

B = [[-3:0]' [1:4]'] C = blkdiag(A,B)

Finalmente, existem duas funções que retornam grandezas relacionadas ao tamanho de matrizes e vetores. São as funções length() e size().

length() Retorna o tamanho de um vetor.

size(

)

Retorna um vetor contendo o tamanho das dimensões de uma matriz.

A = [0:4;5:9;10:14;15:19;20:24;25:29]; v = 0:10;

length(A) size(A) length(v) size(v)

I

NDEXAÇÃO DE

M

ATRIZES

Na aula passada foi apresentado a indexação simples de matrizes, porém, o processo de indexação de matrizes no MATLAB pode ser realizado utilizando-se vários índices de uma só vez. Isso permite que mais de um elemento seja acessado em uma única operação. Os índices utilizados no processo de indexação, no MATLAB, podem assumir mais de uma dimensão (podem ser vetores ou até mesmo matrizes). Isto é um pouco complexo em um primeiro momento e é melhor entendido estudando-se exemplos.

A = 1 : 0.2 : 2; A(1)

A([1 2]) A([1 2 3]) A([1 4]) A(1:3) A(1:2:5)

Outro exemplo desse tipo de indexação pode ser observado na sequencia:

A = [0:4;5:9;10:14;15:19;20:24]; A(2,5)

(9)

4

AULA 6 – MATRIZES

É possível ainda acessar todos os elementos de uma dada dimensão. Para realizar tal tarefa basta utilizar o operador dois-pontos (:) na dimensão que se deseja obter todos os elementos.

Observe os exemplos.

A = [0:4;5:9;10:14;15:19;20:24];

A(:,2) %retorna todos os elementos da segunda coluna A(4,:) %retorna todos os elementos da quarta linha

É possível ainda obter os elementos de uma matriz de um dado índice até o último índice da dimensão, utilizando a palavra reservada end.

A = [0:4;5:9;10:14;15:19;20:24]; k = 3;

A(k:end,2) %retrona os elementos a partir de k da segunda coluna A(k:end,k:end)

Perceba que é possível utilizar variáveis no processo de indexação de matrizes.

O

PERAÇÕES COM

M

ATRIZES

O MATLAB suporta operações diretas com matrizes, utilizando os mesmos operadores utilizados para manipulação de escalares. Porém, deve-se atentar às regras básicas de álgebra linear, conforme estudado na aula passada. Além de permitir operações algébricas com matrizes, o MATLAB possui alguns operadores com função específica para matrizes, como o operador divisão (/) e barra-invertida (\), bem como funções padrão como a função inv(), que computa a inversa de uma matriz.

As operações básicas (soma, subtração e multiplicação) são análogas àquelas vistas no curso de álgebra linear, portanto não serão explicadas em demasia. Para avaliar essas operações execute os comandos abaixo.

clear all

A = [1 2; 4 -1]; B = [-1 0; 1 1]; C = [1 2 3]; D = [3; 1; 4]; A*B

B*A A + B A - B C * D D * C D * A D + C * D

O operador divisão (/) e barra-invertida (\) implementam operações diferentes daquelas imaginadas (a operação de divisão não é definida matematicamente para matrizes).

A expressão A\B implementa a operação matemática A−1⋅B enquanto a operação A/B

implementa a operação matemática 1

A B⋅ − . A primeira das expressões é usada amplamente para

(10)

ambos os lados da equação por A-1 se obtém: 1

x= A− ⋅B. Logicamente, deve-se relembrar dos conceitos e conhecimentos angariados nos cursos de álgebra. O operador divisão ainda mantém sua função original quando manipulado com escalares.

É possível ainda (e é muito comum) a operação de matrizes "elemento por elemento". Imaginemos agora um vetor de tempo definido no MATLAB: t = 0 : 0.1 : 10;

Matematicamente, para calcular os valores de f(t) para uma função dada por f t( )=t2 por

exemplo, deve-se, para cada instante t calcular t·t, ou seja, para t = 0, f(0) = 0·0, para t = 1, f(1) = 1·1=1, para t = 2, f(2) = 2·2=4 e assim por diante. Isto é, estamos multiplicando cada ponto do vetor tempo por ele mesmo para calcular f(t). É natural, matematicamente, que se tente

escrever no MATLAB, então, o comando: f = t*t; ao se deparar com esta situação. Tente então executar os comandos sugeridos e observe o que ocorre.

t = 0 : 0.1 : 10; f = t*t;

Logicamente, o comando resultou em erro, pois não é possível, matematicamente, multiplicar duas matrizes-linha. Porém o problema em se computar t2 persiste. Portanto, o MATLAB permite a operação elemento por elemento entre matrizes. Essas operações são realizadas adicionando-se um ponto (.) antes da operação a ser executada. Estude atentamente a

saída gerada pelos comandos abaixo.

A = [1 2; 3 4]; B = [2 3; 4 5];

A*B %multiplica as matrizes

A.*B %multiplicação elemento por elemento A/B %realiza a operação A*B^(-1)

A./B %divisão elemento por elemento A.^B

Portanto, para computar os valores de f(t) utilizando o MATLAB deve-se utilizar os comandos abaixo.

t = 0 : 0.1 : 10; f = t.*t;

f2 = t.^2; %também funciona

Finalmente, existem muitas funções para a manipulação ou processamento de matrizes no MATLAB, algumas são apresentadas no código de exemplo na sequencia deste material.

A = [1 2; 3 4];

t = linspace(-5,5,100); %cria um vetor de -5 a 5 com 100 pontos vet = [5 5 3 -2 3 -1];

mean(vet) %calcula média de vetor

max(vet) % valor máximo (e pode retornar o índice: ver "help") min(vet) % valor mínimo (e pode retornar o índice: ver "help") sort(vet) %ordena vetor

det(A) %calcula o determinante

(11)

6

AULA 6 – MATRIZES

D

ELETANDO

E

LEMENTOS DE

M

ATRIZES

No MATLAB ainda é possível deletar elementos, utilizando a abertura e fechamento de colchetes []. Observe o exemplo.

A = rand(4); %cria uma matriz randômica com elementos de zero a um V = rand(1,5);

A

A(:,1) = [] V

V([1 3]) = []

O

COMANDO

HELP

O MATLAB possui um comando dedicado a apresentar tópicos de ajuda sobre funções. Portanto, virtualmente para qualquer função é possível obter informações de seu funcionamento digitando help nome_da_função. Por exemplo, para informação sobre a função mean() basta

digitar na janela de comando help mean. Além disso, o MATLAB possui uma ferramenta dedicada para ajuda, para acessá-la basta digitar helpdesk na janela de comando.

E

XERCÍCIOS

Exercício 1 Leia a saída apresentada pelo comando help para todas as funções apresentadas

nesta aula.

Exercício 2 Escreva um código para obter um vetor com os valores de

10 ( ) t cos( ) t sen( ) 2 t 1

f t =e− ⋅ ω⋅ +t e− ⋅ ω⋅ +t e− + para um vetor de tempo de 0 até 5 com 1000 pontos e para ω = 5rad/s. Pode-se computar ex no MATLAB utilizando exp(x).

Exercício 3 Equacione o circuito abaixo algebricamente utilizando análise de malhas e resolva o sistema utilizando o MATLAB para obter as correntes em todos os resistores (sentido indicado).

Com correntes de malha no sentido horário, obtemos o sistema:

1 2 1 2 2 1

2 1 2 3 4 2 4 3

4 2 4 5 3 2

( )

( ) 0

( )

R R I R I V

R I R R R I R I

R I R R I V

+ − =

 − + + + − =

− + + = −

(12)

SCRIPTS E ENTRADA E SAÍDA DE DADOS

Nas últimas aulas, a janela de comando foi utilizada para execução dos comandos necessários para solução de um dado problema. Essa abordagem é válida em um primeiro momento, na etapa de testes, onde ainda não se sabe exatamente a sequência ideal de comandos (ou mais próxima da sequência ótima possível). Na criação de aplicações mais complexas, é muito comum a utilização de scripts (e de funções).

Scripts são um conjunto de comandos que são executados em uma sequencia na linha de comando. Eles se assemelham muito aos arquivos em lotes utilizados no MSDOS, por exemplo (*.bat). Scripts são salvos em um arquivo com extensão *.m, este é o motivo por muitas vezes chamarem a linguagem do MATLAB de M-Código. Scripts são executados na janela de comando, linha por linha. Desta maneira, ele se assemelha muito aos programas desenvolvidos em C.

Antes, porém, deve-se apresentar as funções de entrada e saída de dados no MATLAB, de modo a permitir uma interface mais amistosa com o usuário da aplicação.

S

AÍDA DE

D

ADOS

Duas são as funções básicas para saída de dados utilizando o MATLAB. São a função disp()

e a função fprintf().

A função disp() é extremamente simples e não permite a formatação dos dados pelo desenvolvedor. A função simplesmente imprime os dados na tela. Observe a saída dos comandos abaixo.

clear all A = eye(2); V = ones(1,3); G = eye(2); R = ones(1,3); E = zeros(5,1);

disp('Imprimindo uma string'); disp(G);

disp(R); disp(E); disp(E*R);

O comando fprintf() é exatamente o mesmo utilizado em C, porém, para imprimir na

janela de comando, não é necessário indicar o ponteiro de arquivo. Dessa maneira, o funcionamento e sintaxe se torna análoga àquela do printf(). Vale lembrar e observar nos exemplos o que ocorre ao se imprimir matrizes utilizando a função fprintf().

Caracteres de largura mínima de campo, tabulação, casas decimais e códigos de formato também são utilizados como no C. O mesmo ocorre com os caracteres especiais como o \n ou \b,

que continuam podendo ser utilizados.

(13)

2

AULA 7 – SCRIPTS E ENTRADA E SAÍDA DE DADOS

Avalie a saída dos comandos na sequência.

clear all var01 = 10; var02 = pi;

fprintf('Observe... parece C\n');

fprintf('Agora com números: %.5f\n',var02);

fprintf('%-6d * %6.2f = %f\n', var01, var02, var01*var02);

Quando o comando fprintf() é utilizado com matrizes, ele é executado várias vezes, e a

string de controle é repetida em cada termo impresso, até que todos os elementos sejam impressos.

clear all

mat = [1 3 4; -1 -2 -3]; vet = 0:5;

fprintf('%3d',vet);

disp(' ') %disp quebra linha automáticamente fprintf('%3d opa\n',vet);

fprintf('%3d',mat); disp(' ')

fprintf('%3d %3d.',mat); disp(' ')

fprintf('%3d %3d %3d\n',mat');

Como tarefa, leia o help para a função fprintf().

A função fprintf() ainda funciona para impressão em arquivos de texto. Nas próximas aulas estudaremos melhor essa operação.

O

COMANDO

FORMAT

Pode-se observar que com exceção do comando fprintf(), não é possível alterar a forma como as variáveis são apresentadas na tela por outros comandos (como o disp()). Isso não é

totalmente verdade, pois o MATLAB permite alterar sensivelmente a forma como as variáveis são apresentadas na janela de comando utilizando o comando format. Com o comando format é

possível especificar como os dados serão mostrados (com mais ou menos casas decimais, por exemplo). Execute, na sequência especificada, os comandos abaixo.

format long disp(pi) format short pi

É possível também alterar a base na qual o número é representado.

a = int8(100); format hex disp(a) format short disp(a)

(14)

E

NTRADA DE

D

ADOS VIA

J

ANELA DE

C

OMANDO

A entrada de dados via janela de comando se dá através da função input(). A sintaxe básica da função é apresentada abaixo.

var_a_ler = input('string de informação')

O MATLAB irá imprimir a string de informação na tela e aguardar que o usuário digite um valor para a variável a ser lida. O valor pode ser qualquer valor válido na sintaxe do MATLAB, e a variável pode assumir qualquer classe, seja numérica ou não. A função input() é um modo fácil de obter dados via janela de comando.

SCRIPTS

Como mencionado no início do material scripts são arquivos em lotes, que executam uma sequência de comandos na janela de comando. Para criar um script, basta criar um novo arquivo-M (arquivo-M-file), clicando no menu File > New > Blank M-File. Pode-se ainda utilizar a tecla de atalho Ctrl+N ou ainda clicar no ícone logo abaixo do menu File:

A janela de edição de scripts será, então, aberta.

A Figura 1 apresenta a janela de edição já sendo utilizada no desenvolvimento de uma função (funções serão abordadas na sequência da disciplina)

Figura 1 - Janela de Edição

Agora abra a janela de edição e copie e cole o seguinte código nela:

clear all close all clc

A = 0:50; disp(A')

(15)

4

AULA 7 – SCRIPTS E ENTRADA E SAÍDA DE DADOS

Salve o arquivo em uma pasta em seu diretório de trabalho, com o nome EX7.m. Para executar o script, basta clicar no ícone Pode-se alternativamente pressionar a tecla de função 5 (F5) do teclado.

É importante, na execução de scripts, que a pasta corrente (Current Folder) seja a pasta

onde o arquivo foi salvo (isso evita a necessidade de digitar todo o caminho do M-File). Caso a pasta do script não seja a corrente, um aviso semelhante ao disposta na Figura 2 aparecerá na tela ao se tentar executar o script.

Figura 2 - Aviso para alteração da pasta corrente.

Uma vez que a pasta corrente contenha um script, é possível executá-lo digitando tão somente seu nome (sem a extensão) na janela de comando (no caso, EX7).

Os comandos serão executados um a um na janela de comando, e os resultados serão apresentados. Nesse ponto, pode-se fazer o paralelo entre os scripts e os programas que são desenvolvidos no C, porém a diferença é substancial, pois o script não é compilado como um todo como o código escrito em C (um arquivo executável não é gerado).

E

XERCÍCIOS

Exercício 1 Crie um script que calcula a resistência elétrica de um fio de cobre. O programa deve solicitar o diâmetro (em mm) e o comprimento do fio de cobre, e deve apresentar na tela o resultado.

Exercício 2 Crie um script para resolver um sistema de equações lineares da forma A·x = B. O usuário deve digitar as matrizes A e B.

Exercício 3 Crie um script que normaliza um vetor. Em um vetor normalizado, o módulo do maior elemento é unitário. O vetor deve ser solicitado ao usuário do programa.

(16)

STRINGS

A boa compreensão sobre strings é fundamental em qualquer linguagem de programação, uma vez que toda a informação visual passada ao usuário é realizada mediante a manipulação desses vetores de caracteres. Porém, diferentemente do C, onde um char poderia ser tratado diretamente como um tipo numérico, no MATLAB, o tipo char é tratado como uma classe não numérica. A Figura 1 apresenta um resumo sobre as classes de dados do MATLAB, onde essa diferença básica pode ser constatada.

Figura 1 - Classes de dados no MATLAB.

A representação de caracteres no MATLAB segue o chamado Standard Unicode, e pode utilizar o formato UTF-8 ou o UTF-16 dependendo dos caracteres utilizados. Não entraremos em detalhes sobre essas representações. Nesta aula veremos tão somente algumas funções e operações envolvendo strings no MATLAB.

Como visto em alguns exemplos anteriormente, strings são definidas entre aspas simples no MATLAB:

clc

str = 'The Stars Look Down'; disp(str)

whos

Perceba analisando o retorno dos comandos abaixo que a string é um vetor, portanto pode ser indexada exatamente como vetores numéricos.

disp(str(1)) disp(str(5:9))

str([8 3 end (end-2)])

Pode-se informar à função input que o dado lido será texto. Isso é realizado mediante ao envio de mais um argumento para a função ('s'). Execute os comandos abaixo e tente escrever qualquer texto em ambas as solicitações.

(17)

2

AULA 8 – STRINGS

Quando a segunda função é executada, o dado digitado é encarado como texto, sem a necessidade do uso das aspas simples.

Pode-se também formar arranjos de strings (concatenando várias strings). São várias funções que podem ser utilizadas para esse processo: strcat(), strvcat(), char().

srtcat() concatena strings passadas como argumentos em uma só string, formando uma

matriz linha composta pela concatenação horizontal das strings.

srtvcat() concatena strings verticalmente, de modo a formar uma matriz onde cada linha

é uma string passada como argumento da função.

A função char() converte inteiros sem sinal em seu equivalente pelo formato Unicode (os

127 primeiros caracteres coincidem com a tabela ASCII). Essa função também pode ser utilizada para concatenar várias strings verticalmente.

Execute os comandos abaixo e observe atentamente o que é apresentado na tela. Perceba que as funções automaticamente preenchem as strings com caracteres espaços de modo a formar uma matriz realizável no MATLAB.

clc

clear all

str1 = 'Rush,'; str2 = 'o';

str3 = 'Power Trio';

a = int8([76 105 109 98 111]); ac = char(a);

disp('Vator a:') disp(a)

disp('Vetor Convertido ac') disp(ac)

str4 = char(a,str1); disp('Str4:')

disp(str4)

str5 = strcat(str1,str2,str3,',Show!!'); disp('Str5:')

disp(str5)

str6 = strvcat(str1,str2,str3,'Ok!'); disp('Str6:')

disp(str6) disp('----') whos

A concatenação de strings pode ser realizada utilizando a manipulação direta de matrizes, como fora visto nas últimas aulas, porém é importante que a concatenação resultante seja realizável, ou seja, na concatenação vertical, as strings devem possuir o mesmo número de caracteres, caso contrário, a matriz não será formada corretamente. Tente executar as linhas apresentadas na sequência:

str1 = 'Sertanejo'; str2 = ' é melhor que '; str3 = 'Rock';

(18)

Perceba que a primeira das duas concatenações (horizontal) foi executada. Já a segunda operação (concatenação vertical) retornou uma mensagem de erro, uma vez que não foi possível montar uma matriz válida. As matrizes menores devem ser preenchidas com espaços para que possuam o mesmo número de caracteres antes da realização da concatenação utilizando este tipo de expressão.

C

ONVERSÃO DE

N

ÚMEROS PARA

S

TRINGS

Existem funções dedicadas para a conversão de dados numéricos (classe numérica) para dados de texto (classe char). Essas funções são int2str() e num2str(). A primeira função,

int2str(), converte um inteiro para seu equivalente representado por caracteres. Caso o

número não seja um inteiro, a função arredondará o número antes da execução da função. Já a função num2str() converte um número qualquer para seu equivalente string, permitindo,

inclusive, a especificação de um formato, seguindo os códigos de formato e a sintaxe de formatação do comando fprintf(). O código abaixo ilustra o funcionamento das funções.

clear all format compact clc

a = 10*rand(1,5) b = [1 5 76 235] c = int2str(a) d = int2str(b) whos

c = num2str(a)

d = num2str(a,'%10.5f') e = num2str(a,'|Opa:%-15e') f = num2str(a,'|Opa:%15e') format loose

whos

C

ONVERSÃO DE

S

TRINGS PARA

N

ÚMEROS

,

M

ATRIZES E

C

OMANDOS

:

EVAL()

A função eval() tem especial importância para esta disciplina, uma vez que trabalharemos em um futuro muito próximo com manipulação simbólica no MATLAB, e a função eval() será

utilizada com certa frequência para a obtenção de resultados numéricos para as expressões simbólicas simplificadas ou obtidas via funções de manipulação da classe simbólica. Esta função avalia uma string e transforma a string em um comando equivalente no MATLAB, executando-o.

clc

'194'*10 %tente explicar o que ocorre aqui... eval('128')

a = eval('185')*12; disp(a)

'A = [1 2 3 4]'

(19)

4

AULA 8 – STRINGS

C

OMPARAÇÃO

,

B

USCA E

S

UBSTITUIÇÃO

O MATLAB possui funções dedicadas para comparar, realizar buscas e, inclusive, substituir pedaços de strings por outras strings. Algumas das funções que se enquadram nesse tipo:

strcmp(), strncmp(), findstr(), strmatch(), strrep() e strtok(). Algumas dessas funções serão descritas brevemente na sequência, porém é aconselhado a leitura da saída do comando

help para todas as funções citadas.

A função strcmp() compara duas strings passadas como argumentos da função,

retornando verdadeiro (um) se elas forem iguais e falso (zero) caso sejam diferentes. Cuidado, pois

seu resultado difere de como era na linguagem C. strncmp() compara apenas os n primeiros caracteres da string (o parâmetro n deve ser utilizado como último argumento da função).

findstr() retorna os índices de todas as ocorrências de uma string em outra. A primeira string passada para a função é a string onde a busca será efetuada. Logicamente, a segunda string passada para a função será a string a ser buscada.

strrep() realiza a substituição de um pedaço de uma string por outra string, retornando a

string resultante.

Uma operação interessante é realizada pela função strtok(). Ela divide a string segundo

um delimitador (um caractere). Tal delimitador (que inclusive pode ser mais de um) é especificado na função como último argumento. Caso não seja especificado um caractere, a função utilizará como delimitador o caractere espaço.

Para correta compreensão da sintaxe e funcionalidade envolvida na execução de comandos com essas funções, estude o código abaixo.

clc

str1 = 'Opa! Olha como é fácil manipular matrizes no MATLAB'; str2 = 'Opa!';

strcmp(str1,str2) strncmp(str1,str2,4) findstr(str1,'Opa!') findstr(str1,'ma')

str3 = strrep(str1,'Olha','Mira!!'); disp(str3)

[a,b] = strtok(str1,'r'); %a ultima string lista os possíveis

disp(a) %delimitadores

disp(b)

[a,b] = strtok(str1,'pr'); %que podem ser vários. disp(a)

disp(b)

[a,b] = strtok(str1); %o delimitador será espaço nesse caso disp(a)

disp(b)

A

LTERAR

C

AIXA

(A

LTA

/

B

AIXA

)

Finalmente, é possível ainda alterar a caixa dos caracteres, utilizando as funções upper() e

(20)

clc

str1 = 'Opa! Olha como é fácil manipular matrizes no MATLAB'; str2 = upper(str1);

disp(str2);

str3 = lower(str2); disp(str3)

E

XERCÍCIOS

Exercício 1 A conversão de bases numéricas não será abordada. Como exercício, porém, leia a saída do comando help para as seguintes funções de conversão de base: dec2bin(), dec2hex() e

dec2base().

Exercício 2 Crie um script que leia seu nome em strings separadas, após, concatene horizontal e verticalmente as strings de seu nome.

Exercício 3 Crie um script que lê seu nome e separe nome e sobrenome em strings separadas. Exercício 4 Escreva um script que conta as vogais em uma string digitada do teclado.

(21)

1

AULA 9 – ESTRUTURAS E CÉLULAS

Na aula passada fomos apresentados para as classes de dados básicas do MATLAB, as quais podem ser novamente vistas abaixo, na Figura 1.

Figura 1 - Classes de dados no MATLAB.

As três primeiras classes (BOOLEAN, NUMERIC e TEXT), já foram utilizadas em exemplos (ou são facilmente compreendidas). A classe FUNCTION HANDLE será abordada na última parte do conteúdo, por seu uso extensivo quando se trabalha com interfaces. Na aula de hoje, as duas classes restantes serão abordadas: STUCTURES e CELL ARRAYS.

M

ATRIZES DE

C

ÉLULAS

(

CELLARRAYS

)

No MATLAB, é possível agrupar matricialmente tipos diferentes de dados em cada "elemento" da matriz. Em uma matriz desse tipo, cada elemento é chamado de célula, e pode conter qualquer tipo de dado em seu interior.

O processo de manipulação de matrizes de células é muito semelhante à de matrizes comuns. Deve-se atentar que o processo de criação de matrizes de células utiliza chaves ({}) ao

invés de colchetes ([]). Observe o exemplo abaixo, principalmente lendo cuidadosamente a saída

do comando whos.

clc clear all

close all

A = [1 2 3;4 5 6;7 8 9]; B = {1 2 3;4 5 6;7 8 9}; whos

(22)

clc clear all

close all

notas = {'Cid',[9.6 8.4 7.4];'Vincent',[10 9 5.5];'Tifa',[8.8 9 7.5]}; disp(notas)

Note que, neste caso, foram agrupados dados distintos (heterogêneos) em uma mesma matriz. Daí a definição observada no organograma da Figura 1.

Atente que, para criar colunas basta utilizar vírgulas, enquanto o ponto-e-vírgula delimita as linhas.

O processo de indexação de matrizes de células não é tão simples quanto se imagina. É possível utilizar parênteses () ou chaves {} no processo de indexação de matrizes celulares.

 C(ind) - Retorna as células da matriz de células C especificadas pelo índice ind.  C{ind} - Retorna conteúdo das células de C especificadas pelo índice ind.

É uma sutil, porém importante, diferença. Observe e estude o exemplo abaixo de maneira a compreender a indexação de matrizes de células.

clc clear all

close all

matcel = {'String',zeros(2); 50, rand(1,10) }; disp(matcel);

a = matcel(1,2); disp(a);

b = matcel{1,2}; disp(b);

whos

Atente para a classe das variáveis e como elas são impressas na tela.

(23)

3

AULA 9 – ESTRUTURAS E CÉLULAS

clc clear all

close all

% Estrutura básica do registro:

% Nome, Endereço, Celular, Nascimento, Peso, Altura, Data Consulta

registros = cell(4,7); %pré-aloca memória

nreg = {'John Rutsey','Av Ipiranga, n6000','(51)9999-9999',...

[14 05 1953],[80;79],[1.80],[09 09 2009;08 11 2009]}; registros(1,:) = nreg;

nreg = {'Geddy Lee','Av Ipiranga, n6000','(51)9999-9999',...

[29 07 1953],[70],[1.79],[09 09 2009]}; registros(2,:) = nreg;

nreg = {'Alex Lifeson','Av Ipiranga, n6000','(51)9999-9999',...

[27 08 1953],[89],[1.76],[09 09 2009]}; registros(3,:) = nreg;

nreg = {'Neil Peart','Av Ipiranga, n6000','(51)9999-9999',...

[12 09 1952],[80;79;76],[1.80],[09 09 2009;08 11 2009;06 05 2010]}; registros(4,:) = nreg;

disp(registros); figure(1)

cellplot(registros);

nomes = registros(:,1); %obtém todos os nomes

disp(nomes);

registros(1,:) = []; %deleta linha

figure(2)

disp(registros); cellplot(registros);

registros{2,1} = 'Lerxt'; %Modifica nome

disp(registros)

disp('Últuma consulta de Neil:');

disp( registros{3,7}(end,:) ) %Estude com atenção esta linha

Perceba na última linha do código que a matriz da célula {3,7} (que contém as datas das últimas consultas) é indexada com (end,:), dessa maneira, toda a última linha da matriz é obtida.

Para concatenar matrizes celulares é possível utilizar tanto chaves quanto colchetes.

clc clear all

close all

A = {'A',zeros(3);ones(2),'OPA'}; B = {'B',zeros(3);ones(2),'OLA'}; C = {'C',10};

C1 = {'C1'; 10}; D = {A B};

E = [A B]; F = {A B C};

%G = [A B C]; %gera um erro!!!

G1 = [A B C1];

Note que, quando se concatena células utilizando chaves é formado uma matriz celular onde cada célula é composta pela matriz de células utilizada na concatenação. É dito que essas matrizes celulares são aninhadas.

(24)

E

STRUTURAS

Estruturas são um conjunto de dados que são agrupados e referenciados como uma entidade única. Estruturas contém, na maioria das vezes, dados heterogêneos, isto é, de tipos distintos (daí, novamente, a definição apresentada na Figura 1 para esse tipo de dado). A diferença básica de matrizes celulares e estruturas é que nas estruturas os campos são nomeados, enquanto nas matrizes celulares o mesmo processo é feito com a utilização de índices (e não de nomes).

Para criar uma estrutura, basta utilizar o ponto, concatenando o nome da estrutura com o nome do campo.

clc clear all

close all

nc.pr = 10; nc.pi = -20; whos nc

Como todos os tipos de dados do MATLAB, é possível criar uma matriz de estruturas com grande facilidade:

clc clear all

close all

aux(1,10) = struct('Campo1',[],'Campo2',[]);

%Criando struct com campos vazios

aux2(1:3,1:3) = struct('C1',10,'C2',20,'C3',30);

%Inicializando os campos com valores não-nulos

whos

disp( aux(1) ) disp( aux2(1,1) ) disp( aux2(:,1) ) C = aux2(:,1); disp( C(2).C2 )

No MATLAB, diferentemente de C, os campos de uma matriz de estruturas podem assumir tipos de dados diferentes, desde que os elementos da matriz contenham sempre o mesmo número de campos. Isso significa que, no exemplo acima, aux(1) e aux(2) não conterão, necessariamente, os mesmos tipos de variáveis. Estude as próximas linhas.

clc clear all

close all

aux(1,2) = struct('Campo1',[],'Campo2',[]); aux(1).Campo1 = 'Ola, isso é string';

aux(1).Campo2 = zeros(4);

aux(2).Campo1 = rand(1,4);

aux(2).Campo2 = {'Cid','Highwind'};

disp(aux(1)) disp(aux(2))

(25)

5

AULA 9 – ESTRUTURAS E CÉLULAS

Vale lembrar que o processo de indexação de matrizes de estruturas segue a sintaxe básica do MATLAB. Para finalizar, estude o exemplo abaixo, onde uma matriz de estrutura é utilizada para representar uma turma de processos numéricos avançados.

clc clear all

close all

aux(1,20) = struct('Nome',[],'P1',[],'P2',[],'T1',[],'T2',[]); aux(1).Nome = 'Fulano1';

aux(1).P1 = 10; aux(1).P2 = 9; aux(1).T1 = 7; aux(1).T2 = 7;

aux(2).Nome = 'Fulano2'; aux(2).P1 = 3;

aux(2).P2 = 2; aux(2).T1 = 4; aux(2).T2 = 5;

%(...)

mean([aux.P1]) mean([aux.P2]) mean([aux.T1]) mean([aux.T2])

Lembre-se que aux é um vetor. Portanto, aux.P1 também será um vetor, podendo ser

tratado como tal.

Para mais informações sobre matrizes de células e sobre estruturas, basta acessar o

helpdesk do MATLAB, procurando sobre CELL ARRAYS e/ou STRUCTURES.

E

XERCÍCIOS

Exercício 1 Crie uma estrutura de dados para uma lista telefônica.

Exercício 2 Repita o exercício anterior utilizando uma matriz de células.

(26)

ELEMENTOS DE PROGRAMAÇÃO I

Até a presente aula, apenas comandos simples de atribuição e manipulação algébrica de arranjos foram vistas, além da utilização de várias funções do MATLAB. Porém, é possível neste programa criar algoritmos complexos, formando um código estruturado com expressões condicionais e com a realização de iterações. Para alcançar tal objetivo, é necessário a familiarização com a sintaxe utilizada no MATLAB.

A sintaxe utilizada para o desenvolvimento de um código estruturado é sensivelmente diferente da sintaxe empregada na linguagem C, de modo que será necessário algum tempo até que a fluência na linguagem seja obtida.

De modo a permitir o entendimento da sintaxe, é necessário apresentar os operadores que são extensivamente utilizados no controle de fluxo no MATLAB.

As operações relacionais e lógicas elemento a elemento são interpretadas pelo MATLAB da mesma forma do que no C. Ou seja, qualquer número que não seja zero é interpretado como verdadeiro (true), caso contrário é avaliado como falso (false). Após apresentarmos alguns

operadores partiremos para exemplos.

O

PERADORES

R

ELACIONAIS

São seis os operadores relacionais disponíveis no MATLAB. Eles estão descritos na Tabela 1. Tabela 1 - Operadores relacionais no MATLAB.

Operador Descrição > Maior do que >= Maior ou igual a < Menor do que <= Menor ou igual a

== Igual

~= Diferente

Execute as linhas abaixo na janela de comando e observe a saída.

clear all close all clc

(27)

2

AULA 9 – ELEMENTOS DE PROGRAMAÇÃO I

Perceba que as variáveis C e D são da classe logical. Ou seja, são variáveis booleanas, podendo assumir apenas dois possíveis valores: 0 e 1. Da mesma forma que a classe numérica,

pode-se utilizar a função logical() para criar variáveis lógicas.

Os operadores lógicos são capazes de manipular arranjos, com a mesma facilidade com a qual outros operadores são utilizados. Observe a saída das operações na sequência.

A = [-1 -3 3 5]; B = [3 -5 9 -1]; C = A < B;

D = A > B; disp(C) disp(D) whos

Deve-se atentar para a forma como as expressões são avaliadas. Quando operações relacionais são computadas, as operações e testes ocorrem em pares, e problemas podem surgir, como no exemplo abaixo.

A = 10; B = 20; C = 30; r1 = (A < B < C);

r2 = (C > B > A); disp(r1)

disp(r2)

Note que, matematicamente, ambas as expressões devem ser verdadeiras, no entanto, não é isso que o programa retorna. Tente explicar o que ocorre.

Para corrigir tal problema, deve-se fazer uso de operadores lógicos para concatenar expressões relacionais. Os operadores lógicos podem ser operadores elemento a elemento (elementwise) ou bit a bit (bitwise). A diferença será mostrada na sequência.

O

PERADORES

L

ÓGICOS

E

LEMENTO A

E

LEMENTO

Os operadores lógicos elemento a elemento são apresentados na Tabela 2 Tabela 2 - Operadores Lógicos elemento a elemento.

Operador Descrição & E lógico (AND) | OU lógico (OR) ~ Negação lógica (NOT) xor OU Exclusivo (XOR)

Note que, diferentemente do que ocorria com o C, a operação de OU e de E lógico não

(28)

uma função. Existem funções análogas para fazer E, OU e a negação lógica. São as funções and(),

or() e not(). Estude os comandos realizados abaixo. A = 10; B = 20; C = 30; D = 0; r1 = (A < B)&(B < C);

r2 = (C > B)&(B > A); E = [3 ; 2]; F = [0 ; 1]; ~F

and(E,F) or(A,D)

xor([1 1 0],[1 0 0])

F

UNÇÕES PARA

L

ÓGICA

B

IT A

B

IT

O MATLAB possui funções que, assim como no C, podem manipular os bits dos dados. Essas funções são apresentadas na Tabela 3.

Tabela 3 - Funções para realizar operações lógicas bit a bit.

Operador Descrição bitand E lógico bit a bit bitor OU lógico bit a bit bitcmp Complemento bitxor OU Exclusivo bit a bit

As operações serão explicadas estudando-se o exemplo em aula. O exemplo faz uso da função dec2bin() para apresentar o resultado em binário.

clear all close all clc

A = 34; B = 43;

disp(dec2bin(A)) disp(dec2bin(B))

disp('--- resultado da op'); R = bitand(A,B);

disp(dec2bin(R))

Modifique o código para realizar outras operações. Notório que a função bitcmp()

(29)

4

AULA 9 – ELEMENTOS DE PROGRAMAÇÃO I

C

OMANDOS DE

D

ESVIO IF

O comando if possui uma sintaxe genérica dada pelo exemplo na sequência.

if

expressão

comandos

elseif

expressão

comandos

else

comandos

end

Perceba que os comandos serão executados somente se o campo expressão possuir parte real não nula. Essa definição é fundamental, uma vez que os operadores lógicos, como visto anteriormente, operam também com matrizes e com vetores. Quando a expressão não resultar em um escalar, TODOS os elementos devem ser não zeros (verdadeiros) para que os comandos sejam executados.

Os comandos elseif e else são opcionais, podendo ou não aparecer na estrutura condicional apresentada.

Além disso, a estrutura pode conter quantos elseif seja necessário. O comando elseif caracteriza e tem o mesmo funcionamento de comandos if e else alinhados na linguagem C, estrutura também chamada de escada if-else naquela linguagem.

Para entender o funcionamento da estrutura apresentada, crie um script com os seguintes comandos e execute-o.

clear all close all clc

a = input('Digite uma vogal, apenas: ','s'); a = upper(a);

if length(a) ~= 1

disp('Digite apenas uma letra...') elseif (a == 'A')

disp('Digitaste A'); elseif (a == 'E')

disp('Digitaste E'); elseif (a == 'I')

disp('Digitaste I'); elseif (a == 'O')

disp('Digitaste O'); elseif (a == 'U')

disp('Digitaste U'); else

disp('Não foi vogal a letra digitada...') end

(30)

Estude o script abaixo para melhor compreender o caso onde as expressões não retornam escalares.

clear all close all clc

a = 0+j; b = 1;

A = [1 0;0 1]; B = zeros(2); C = [0 3;2 0]; if b

disp('Opa, b!'); end

if abs(a)

disp('Opa, |a|!'); end

if A

disp('Opa A'); end

if A|~B

disp('Opa A ou ~B'); end

if xor(A,C)

disp('Opa A XOR B'); end

O

C

OMANDO

SWITCH

O comando switch possui funcionamento muito similar ao comando utilizado na linguagem C, com algumas sutis diferenças. Em sua sintaxe básica:

switch

expressão

case

case_exp

comandos

case

case_exp

comandos

(...)

otherwise

comandos

end

Perceba que, diferentemente do que ocorria com a linguagem C, não há necessidade da utilização do comando break. Assim que um case for encontrado e executado, outros comandos case não serão sequer verificados.

(31)

6

AULA 9 – ELEMENTOS DE PROGRAMAÇÃO I

case

{case_exp1, case_exp2, case_exp3 }

Nesse caso, os comandos relacionados a este case serão executados se houver coincidência com qualquer uma das constantes listadas.

Um exemplo clássico da aplicação do comando switch:

a = input('Digite um número: '); b = input('Digite um número: ');

if isnumeric(a)&&isnumeric(b) %testa se ambos são números c = input('Digite a operação (+-*): ','s');

switch c case '+'

res = a+b; disp(res)

disp('foi realizado +'); case '-'

res = a-b; disp(res)

disp('foi realizado -'); case '*'

res = a*b; disp(res)

disp('foi realizado *'); otherwise

disp('Caractere inválido'); end

end

Outro exemplo já utilizando alguns conceitos que veremos na próxima aula é apresentado abaixo. Crie um script para rodar o programa.

while 1

a = input('Digite uma letra: ','s'); switch a

case {'a','e','i','o','u'}

disp('É vogal e minúscula'); case {'A','E','I','O','U'}

disp('É vogal e maiúscula'); case {'EXIT','exit'}

disp('Terminando programa...'); return

otherwise

disp('Não é vogal...'); end

end

E

XERCÍCIOS

Exercício 1 Crie um script gere randomicamente uma operação de multiplicação (inteira) e apresenta a operação ao usuário. O programa deve corrigir a resposta dada ao usuário, e informar, em caso de erro, o quão distante da resposta correta está a resposta dada. Utilize os critérios que desejar. Caso necessário, execute o comando help rand.

Exercício 2 A equação característica de segunda ordem para um sistema segue, entre outras formas, a forma padrão 2 2

2 n n

(32)

localização das raízes: 2

1,2 n n 1

r = −ζω ω ζ± − . Lembrando dos conhecimentos de equações diferencias, faça um script que leia os termos referentes à equação de segunda ordem e imprima o tipo da resposta e a localização das raízes da equação.

Exercício 3 Escreva um programa que calcula a potência dissipada em uma resistência. A potência dissipada em uma resistência, basicamente, pode ser calculada de três maneiras diferentes, apresentadas na expressão abaixo:

2

2 V

P VI P RI P

R

= = =

(33)

1

AULA 10 – ELEMENTOS DE PROGRAMAÇÃO II

ELEMENTOS DE PROGRAMAÇÃO II

Na aula passada foram abordados os dois comandos de seleção que a linguagem M dispõe: O comando if e o comando switch. Na aula de hoje, veremos os comandos responsáveis pelo controle de laços, de modo a permitir a realização de iterações, i.e., a realização da mesma operação repetidas vezes. Os comandos responsáveis por este tipo de operação são o comando while e o comando for. O primeiro é muito semelhante ao comando em C, já o comando for é substancialmente diferente.

O

C

OMANDO WHILE

Abaixo é apresentada a sintaxe básica do comando while no MATLAB.

while expressão

comandos

end

O campo expressão pode conter qualquer comando válido na linguagem. Os comandos contidos no corpo do laço while serão executados sempre que a expressão avaliada retornar verdadeiro. Observe o exemplo abaixo.

clear all

close all

clc

disp('Comando while em ação!') a = input('Digite um número: '); while round(a) == a

disp('O número é inteiro...')

a = input('Digite outro número: '); end

disp('O número não é inteiro...') disp('Programa terminado')

Vale lembrar que a expressão, assim como no comando if, pode não ser um escalar, e nesse caso a expressão será verdadeira somente se todos os elementos do arranjo forem não nulos.

clear all

close all

clc

disp('Comando while em ação!') a = [7 5;11 7];

k = 4;

fprintf('Iterações: ')

while mod(a,k) %resto da divisão fprintf('.');

i = i - 1; end

(34)

O

C

OMANDO FOR

O comando for no MATLAB possui uma sintaxe relativamente diferente do que se utilizava na linguagem C.

A sintaxe básica do comando será apresentada abaixo.

for variável = expressão, comando, (...), comando, end Ou também fazendo uso de quebra de linha:

for variável = expressão

comandos

end

A variável utilizada para o controle de laço será incrementada conforme a expressão, esta normalmente da forma INICIO:INCREMENTO:FINAL. Porém o campo expressão pode virtualmente assumir qualquer expressão válida. Abaixo são apresentados alguns exemplos básicos de laços empregando o comando for.

for k = [1 3 5 7 9], fprintf('%d^2 = %d\n', k, k*k), end

Nesse exemplo, na primeira iteração a variável k possui o valor 1, na segunda iteração, k possui o valor 3 (seguindo o que é utilizado no campo expressão), e assim por diante, até a última iteração, onde k possui valor 9.

No próximo exemplo, a indexação de matrizes como era realizado no C será executada, de modo a atingir a soma dos elementos de um vetor.

clc clear all

close all

N = 100;

VET = rand(1,N); soma = 0;

for k = 1:N

soma = soma + VET(k); fprintf('%10.5f',soma); if ~mod(k,5)

fprintf('\n'); end

end

fprintf('FINAL: %.5f\n',soma);

A expressão pode decrementar os valores da variável de controle, como no próximo exemplo.

clc clear all

close all

prod = 1;

for k = 21 : -2 : 1 prod = prod * k;

(35)

3

AULA 10 – ELEMENTOS DE PROGRAMAÇÃO II

Finalmente, a expressão não necessariamente deve ser um vetor, podendo ser um arranjo. Nesse caso, a variável de controle de laço se torna, na iteração, um vetor contendo os elementos da coluna do arranjo. Estude o exemplo.

clc clear all

close all

A = randi(100,3,2); disp(A)

for k = A disp(k); disp('opa'); end

disp(' ')

O último exemplo remete a indexação de matrizes de duas dimensões, na obtenção da média dos elementos da matriz.

clc clear all

close all

M = 8; N = 3;

A = rand(M,N); disp(A)

soma = 0; for m = 1:M for n = 1:N

soma = soma + A(m,n); end

end

disp('Media:'); disp(soma/(N*M));

É importante ressaltar que a variável de controle de laço é sempre encarada como um escalar no corpo do for, ou como um vetor quando se trabalha com arranjos (vide penúltimo exemplo).

C

ONSIDERAÇÕES QUANTO AO TEMPO DE

E

XECUÇÃO

Antes de partirmos para a análise de velocidade de execução do código, devemos entender como contar o tempo de execução de programas. Basta utilizar as funções tic e toc. Ver help para essas funções para mais detalhes.

clc clear all

close all

tic; soma = 0;

for a = 1:100000 for b = 1:10000 soma = soma + 1; end

end

disp(toc)

(36)

Dois códigos podem cumprir a mesma função, porém com tempo de execução completamente diferentes. No exemplo abaixo, a diferença entre o tempo de execução de três porções de código funcionalmente idênticas será discutida.

clc clear all

close all

ti = tic;

for k = 1:10000

vet(k) = k^2; %gera um warning...

end

t1 = toc(ti);

clear vet k %apaga vet e k ti = tic;

vet = zeros(1,10000); %pré alocação da memória

for k = 1:10000 vet(k) = k^2; end

t2 = toc(ti);

clear vet k

ti = tic; k = 1:10000; vet = k.^2; t3 = toc(ti);

fprintf('Tempo de execução do primeiro código: %e s\n',t1); fprintf('Tempo de execução do segundo código: %e s\n',t2); fprintf('Tempo de execução do terceiro código: %e s\n',t3);

Notavelmente, no primeiro caso o tempo de execução foi muito maior, isso se deve aos constantes pedidos de memória devido a não utilização da pré-alocação de memória. Em cada iteração, memória é solicitada a máquina. Isso acontece somente uma vez na segunda versão do algoritmo, já que a porção de memória que será utilizada é pré-alocada antes do laço. Finalmente, a não execução do laço, fazendo uso de álgebra vetorial no terceiro caso poupa tempo de execução, uma vez que apenas uma linha é interpretada.

C

OMANDO BREAK,CONTINUE E RETURN

O comando break, bem como o comando continue, possuem a mesma função que em C.

O comando break força a saída de um laço em execução, passando o controle do programa para o comando que sucede o laço.

O comando continue, diferentemente, força a saída apenas da iteração, passando o controle do programa para a próxima iteração do mesmo laço.

(37)

5

AULA 10 – ELEMENTOS DE PROGRAMAÇÃO II

Execute o script abaixo, e após a execução, altere a linha do comando break para continue e após para return e observe o que ocorre.

clear all

close all

clc a = 0; b = 0;

while a < 20 a = a+1;

fprintf('%3d',a); if (a >= 10)&&(a<=15) b = b + 1;

break end

fprintf('.'); end

fprintf('\nfinal\na = %d b = %d\n', a, b);

O

C

OMANDO

T

RY

-

C

ATCH

O comando try-catch é utilizado para tratamento de erros. Basicamente, o MATLAB tentará executar o código do bloco try e, caso não consiga, passa a executar o bloco catch. É uma maneira de evitar as mensagens de erro do MATLAB e também de promover o correto encerramento de um programa ou ainda promover a correção do erro.

A sintaxe básica é:

try

comandos

catch obj_erro

comandos

end

O campo obj_erro contém informações sobre o erro ocorrido no bloco try. Acompanhe em aula a execução do exemplo.

clear all

close all

clc

A = input('Digite uma matriz: '); B = input('Digite uma matriz: '); try

C = A*B;

disp('A multiplicação é: ') disp(C)

catch erro

disp('Opa, um erro ocorreu...')

if strfind(erro.message,'Inner matrix') disp('Cuidado com as dimensões...') end

(38)

E

XERCÍCIOS

Exercício 1 O número de Euler, citado por muitos matemáticos e físicos como o número mais importante de toda a matemática, pode ser obtido da expressão:

1 lim 1

n

n e

n →∞

 

= +

 

Faça um script para estudar a convergência deste limite para vários valores de n, partindo de zero até n = 1000. Caso se lembre do comando plot(), pode utilizá-lo.

Exercício 2 O número de ouro pode ser obtido através da razão entre um termo e seu predecessor quando esses termos fazem parte da Série de Fibonacci, para um número infinito de termos. É um número que aparece com curiosa frequência na natureza. Faça um script que gere a sequência de Fibonacci e computa, a cada novo termo, o número de ouro associado a esse termo. Observe a convergência.

(39)

1

AULA 11 –FUNÇÕES

FUNÇÕES

Como provavelmente qualquer estudante que já tenha trabalhado com alguma linguagem de programação sabe, as funções são blocos independentes de código, responsáveis pela realização de uma determinada tarefa. No MATLAB, funções são desenvolvidas de forma diferente que em C. Basicamente, uma função é salva em um arquivo .m independente, e não junto com o script principal onde se localiza a sequência básica de comandos a ser executada. Uma vez no diretório corrente, a função pode ser invocada (chamada) diretamente na janela de comando (como scripts) ou ainda por qualquer script ou função rodado no mesmo diretório.

O MATLAB é muito mais flexível quando ao desenvolvimento de funções. Por exemplo, a mesma função pode ser chamada com uma lista diferente de parâmetros de entrada, e inclusive pode retornar uma lista diferente de parâmetros de saída. Muitas funções as quais já utilizamos nessa disciplina funcionam dessa maneira, por exemplo, a função strtok(). Perceba como o comportamento dela é diferente dependendo da maneira que a função é invocada.

a = strtok('Opa, olha!') %1 param de saída, 1 de entrada strtok('Opa, olha!') %0 param de saída, 1 de entrada

[a,b] = strtok('Opa, olha!') %2 param de saída, 1 de entrada a = strtok('Opa, olha!','l') %1 param de saída, 2 de entrada [a,b] = strtok('Opa, olha!','l') %2 param de saída, 2 de entrada

O objetivo básico da função (separar pedaços de uma string) é sempre realizada, mas a lista de parâmetros de entrada e saída são diferentes, portanto as operações realizadas pela função são sensivelmente alteradas, porém mantêm-se a essência básica da função. Essa flexibilidade é relativamente fácil de ser alcançada no MATLAB, e será vista em detalhes (além de outras coisas) nesta aula.

F

ORMA

B

ÁSICA DE UMA

F

UNÇÃO

A sintaxe básica para a construção de uma função é apresentada abaixo.

function [variáveis_de_saída] = nome(variáveis_de_entrada)

%Texto de Ajuda

COMANDOS

end

Como mencionado, a função deve ser salva em um arquivo .m com o mesmo nome dado à função.

(40)

função. No campo variáveis_de_entrada são listadas as variáveis que são utilizadas como parâmetros da função. Essas variáveis recebem valores externos à função, como no C.

Atenção para a linha de comentário logo abaixo da função. Esta linha é automaticamente apresentada na tela ao se executar na janela de comando helpnome.

Na sequência deste material alguns exemplos serão discutidos. O primeiro exemplo é apenas um exemplo trivial de uma função extremamente simples que calcula o quadrado de um número qualquer.

function [y] = quadrado(x)

%QUADRADO Esta função calcula o quadrado de um número qualquer %

%[y] = quadrado(x) Realiza a operação y = x.^2

y = x.^2;

end

De posse da função, devidamente salva no arquivo quadrado.m, execute na janela de comando helpquadrado e avalie o que ocorre.

Perceba que não é necessário retornar a variável com um comando explícito (como o que ocorre em outras linguagens). Basta utilizar a variável definida como parâmetro de saída no corpo da função e a variável será automaticamente retornada.

Após, tente executar a função seguindo o que foi apresentado pelo comando help.

Execute a mesma função e tente enviar um vetor quando chamá-la. Perceba o que ocorre executando os comandos abaixo na janela de comando.

quadrado(3)

b = quadrado(7.2) quadrado([1 2 3])

A = quadrado([1 2 3;3 4 5]) quadrado(eye(5));

Como mencionado (e como é possível observar na sintaxe básica da função), pode-se ter quantas variáveis de entrada e quantas variáveis de saída forem necessárias ou desejadas. Estude a função abaixo.

function [soma, media, mini, maxi] = xtudo(x)

%XTUDO Calcula soma, média, valor mínimo e máximo do vetor

% [soma, media, mini, maxi] = xtudo(x) x pode ser vetor, escalar ou matriz

soma = sum(x);

media = soma/numel(x); mini = min(x);

maxi = max(x); end

Perceba que a função xtudo() possui quatro parâmetros de saída, soma, media, mini, e

(41)

3

AULA 11 –FUNÇÕES

invocada. Com a função xtudo() devidamente salva, execute as seguintes linhas na janela de comando.

xtudo([-4 3 2 6 8 -9]) v1 = xtudo([-4 3 2 6 8 -9])

[v1, v2] = xtudo([-4 3 2 6 8 -9]) [v1, v2, v3] = xtudo([-4 3 2 6 8 -9]) [v1, v2, v3, v4] = xtudo([-4 3 2 6 8 -9])

É possível "pular" parâmetros de saída, caso não deseje utilizá-los, utilizando um tio (~) ao invés do nome da variável:

[~, var] = xtudo([-4 3 2 6 8 -9])

[var1, ~, ~, var2] = xtudo([-4 3 2 6 8 -9])

Vale ressaltar que é possível criar uma função sem parâmetros de entrada e/ou sem parâmetros de saída. Como exemplo, observe a função sem_par().

function [A] = sem_par() A = rand(1);

disp('Olhaa'); end

S

UBFUNÇÕES

É possível construir, em um mesmo arquivo .m onde uma função é criada, outras funções. Essas funções definidas após a função que dá nome ao arquivo (chamada de função principal) são chamadas de subfunções, e podem ser utilizadas por quaisquer funções do arquivo .m que define a função. Subfunções não são visíveis fora do arquivo .m, portanto não podem ser invocadas por outros scripts ou na janela de comandos. Estude a função soma_linhas().

function [som] = soma_linhas(A)

%calcula soma das linhas de uma matriz

tam = size(A);

som = zeros(1,tam(1)); %pré-aloca memória for i = 1:tam(1)

som(i) = soma_elem(A(i,:)); end

end

function [aux] = soma_elem(vet) %subfunção aux = sum(vet);

Imagem

Figura 1  O MatLab®.
Figura 1 - Janela de Edição
Figura 2 - Aviso para alteração da pasta corrente.
Figura 1 - Classes de dados no MATLAB.
+7

Referências

Documentos relacionados

Apesar dos esforços para reduzir os níveis de emissão de poluentes ao longo das últimas décadas na região da cidade de Cubatão, as concentrações dos poluentes

A Ética Resolvendo Conflito Entre Direito e Moral Nesse outro estágio percebe-se que a eticidade contempla um Estado em que suas leis não são sentidas como mera coerção ao

Redução do estoque de carbono após a exploração florestal, alterações no numero de indivíduos e no estoque de carbono da regeneração natural e danos aos indivíduos

A estabilidade do corpo docente permanente permite atribuir o conceito muito bom, segundo os parâmetros da área, para o item 2.2 (pelo menos 75% dos docentes permanentes foram

De seguida, vamos adaptar a nossa demonstrac¸ ˜ao da f ´ormula de M ¨untz, partindo de outras transformadas aritm ´eticas diferentes da transformada de M ¨obius, para dedu-

29. Na especificação da receita e da despesa é utilizada a tabela de Medidas que consta do Anexo IV. O Orçamento inscrito em projetos e atividades abrange as despesas

Considera-se que a interdisciplinaridade contribui para uma visão mais ampla do fenômeno a ser pesquisado. Esse diálogo entre diferentes áreas do conhecimento sobre

Portanto, o objetivo deste trabalho foi analisar os elementos: temperatura do ar, umidade relativa do ar e temperatura da superfície do solo, e aplicar o Índice de Calor