programação em matlab - fenix.tecnico.ulisboa.pt · ressalto nº 1 possui uma altura de 3.750...

32
Instituto Superior Técnico, Dep. de Engenharia Mecânica - ACCAII Programação em MATLAB Estruturas de Repetição Ciclo WHILE As instruções BREAK e RETURN A função ERROR Vectorização

Upload: lynhu

Post on 11-Nov-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Instituto Superior Técnico,

Dep. de Engenharia Mecânica - ACCAII

Programação em MATLAB

• Estruturas de Repetição

• Ciclo WHILE

• As instruções BREAK e RETURN

• A função ERROR

• Vectorização

Page 2: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Estruturas de repetição no MATLAB

2

• Estruturas de repetição disponíveis no MATLAB:

• Estruturas de repetição:

• instrução for

• O ciclo FOR permite que uma sequência de instruções seja executada mais do que uma vez.

• O ciclo FOR repete um bloco de instruções um determinado número de vezes. Esse número de vezes é especificado antes do ciclo ser executado.

• instrução while

• O ciclo WHILE repete o bloco de instruções enquanto a condição associada for verdadeira.

Page 3: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução while

3

Descrição: Repete um bloco de instruções um número indefinido de vezes.

Sintaxe: while expression

statement_1

.

.

statement_n

end

Page 4: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução while

4

FLUXOGRAMA:

Expression

T

F

Statement

Expression

T

F

Statement

Page 5: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução while exemplo1

5

Problema: Escreva uma função que receba uma valor escalar e que retorne o valor de um factorial (n!) que seja superior a esse valor.

Page 6: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução while exemplo1

6

>> compara_com_fact(5000)

ans =

5040

>> compara_com_fact(-1000)

ans =

1

>>

Exemplo de execução:

Page 7: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução while exemplo2

7

• Quando uma bola é largada, ressalta parapara ½ do sua altura anterior.

• Queremos um programa que efectue esta simulação

• Peça ao utilizador a altura inicial da bola, em metros.

• Mostre o número de cada ressalto e a respectiva altura

• Repita até que a altura do ressalto é muito pequena(exemplo: 1mm)

Problema:

Page 8: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução while exemplo2

8

1. Inicializar numRessaltos a 0 (zero)

2. Perguntar e ler valor de altura

3. Mostrar o valor original de altura com descrição

4. Ciclo:

a. Se altura < LIMITE_ALTURA, termina ciclo

b. Actualizar altura para altura/2

c. Adicionar 1 a numRessaltos

d. Mostrar numRessaltos e altura

5. Fim do ciclo

Algoritmo:

Page 9: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução while exemplo2

9

Page 10: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução while exemplo2

10

Introduza altura inicial, em metros: 7.5

Altura inicial = 7.500 metros

Ressalto nº 1 possui uma altura de 3.750 metros

Ressalto nº 2 possui uma altura de 1.875 metros

Ressalto nº 3 possui uma altura de 0.938 metros

Ressalto nº 4 possui uma altura de 0.469 metros

Ressalto nº 5 possui uma altura de 0.234 metros

Ressalto nº 6 possui uma altura de 0.117 metros

Ressalto nº 7 possui uma altura de 0.059 metros

Ressalto nº 8 possui uma altura de 0.029 metros

Ressalto nº 9 possui uma altura de 0.015 metros

Ressalto nº 10 possui uma altura de 0.007 metros

Ressalto nº 11 possui uma altura de 0.004 metros

Ressalto nº 12 possui uma altura de 0.002 metros

Ressalto nº 13 possui uma altura de 0.001 metros

>>

Exemplo de execução:

Page 11: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução while exemplo3

11

• A instrução WHILE pode ter associada múltiplas condições.

• Exemplo: considere o seguinte problema.

Problema: Escreva uma função que possua como argumento de entrada um vector, e que retorne o valor lógico true se, e se só se, o vector for composto por valores maiores ou iguais a zero e inteiros.

Page 12: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução while exemplo3

12

Qual é a vantagem relativamente à utilização de um ciclo FOR ?

Page 13: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução while exemplo4

13

• Pode ser necessário fazer uma contagem, sem se saber, à partida, o número de valores introduzidos

• Exemplo: considere o seguinte problema.

Problema: Escreva um script que vá pedindo números positivos ao utilizador (-1 para terminar), e que no fim apresente a média dos valores introduzidos.

Page 14: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução while exemplo4

14

Page 15: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução while exemplo4

15

>> calcula_media

Introduza um valor >=0 [-1 para terminar]: 2

Introduza um valor >=0 [-1 para terminar]: 4

Introduza um valor >=0 [-1 para terminar]: -1

A média = 3.00

>> calcula_media

Introduza um valor >=0 [-1 para terminar]: -1

Não inseriu nenhum valor >=0!!

>>

Exemplos de execução:

Page 16: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução while exemplo5

16

• Como utilizar o ciclo WHILE para verificar erros de introdução de valores.

• Exemplo: considere o seguinte problema.

Problema: Escreva um script que peça ao utilizador um valor inteiro, e que só permita avançar na execução, quando o número for realmente um inteiro.

Page 17: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução while exemplo5

17

Page 18: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução while exemplo5

18

>> teste1

Introduza um valor inteiro: 3.5

O valor introduzido não é um inteiro!!

Introduza um valor inteiro: -1.0

Agora sim !!! O valor -1 é um inteiro!!

>>

Exemplos de execução:

Page 19: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução while exemplo6

19

Outra possível solução:

Page 20: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução while exemplo6

20

>> teste2

Introduza um valor inteiro: 76.8

O valor introduzido não é um inteiro!!

Introduza um valor inteiro: 65

Agora sim !!! O valor 65 é um inteiro!!

>>

Exemplos de execução:

Page 21: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução break

21

Descrição: Termina a execução de um ciclo FOR ou de um ciclo while. Em ciclos encadeados, a instrução BREAK termina a execução do ciclo a que está associado.

• Exemplo: while(true)

statement_1

.

if (condição == true)

break;

end

.

statement_n

end

Page 22: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Instrução return

22

Descrição: A instrução RETURN , se utilizada dentro de uma função (ou script), termina a sua execução, causando um retorno à entidade que a invocou.

• Exemplo:

function d = det(A)

if isempty(A)

d = 1;

return

else

...

end

Page 23: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

A função error exemplo7

23

Descrição: A função ERROR apresenta no monitor uma mensagem de erro, e aborta a função.

• Exemplo:

Page 24: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Vectorização.

24

• Muitas vezes me MATLAB, não é necessário implementar ciclos.

• Uma vez que o MATLAB foi originalmente concebido para manipular vectores e matrizes, muitos operadores podem ser utilizados com este tipo de operandos.

• Em geral, também as funções pré-definidas no MATLAB, operam sobre vectores e matrizes.

• Concluindo: a vectorização permite evitar a implementação de ciclos, e logo tornar os programas mais eficientes.

Page 25: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Vectorização: exemplos

25

>> vec_1 = [1 2 3]

vec_1 =

1 2 3

>> vec_2 = vec_1*10

vec_2 =

10 20 30

>> vec_3 = vec_1/2

vec_3 =

0.5000 1.0000 1.5000

>> vec_4 = vec_1+5

vec_4 =

6 7 8

NOTA:

Todos estes cálculos poderião

ter sido implementados com

ciclos FOR !

Faça os mesmos testes para:

mat_1=[1 2;3 4]

Page 26: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Vectorização

26

>> vec_5 = vec_1^2

??? Error using ==> mpower

Matrix must be square.

>> vec_5 = vec_1.^2

vec_5 =

1 4 9

>> vec_6 = vec_1 .* vec_5

vec_6 =

1 8 27

Operadores elemento a elemento ou operadores sobre arrays:

.^

.*

./

Operadores elemento a elemento:

Page 27: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Vectorização: exemplo

27

for ii = 1:100

quadrado(ii) = ii^2;

raiz_quadrada(ii) = ii^(1/2);

raiz_cubica(ii) = ii^(1/3);

end

ii = 1:100;

quadrado = ii.^2;

raiz_quadrada = ii.^(1/2);

raiz_cubica = ii.^(1/3);

Operadores elemento a elemento:

Page 28: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Vectorização:

28

>> vec_7 = [5 3 45 38 7]

vec_7 =

5 3 45 38 7

>> vec_8_log = vec_7 > 6

vec_8_log =

0 0 1 1 1

%Como criar um vector só os

%componentes >7 de vec_7????

>> vec_9 = vec_7(vec_8_log)

vec_9 =

45 38 7

Os operadores relacionais podem ser utilizados em vectores e matrizes, e devolvem vectores ou matrizes do tipo lógico.

Vectores lógicos:

Page 29: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Vectorização:

29

>> vec_10 = [1 0 1 0 1];

>> vec_11 = [0 1 1 1 0];

>> vec_12 = vec_10 & vec_11

vec_12 =

0 0 1 0 0

vec_13 =

1 1 1 1 1

>> vec_14 = ~vec_13

vec_14 =

0 0 0 0 0

Os operadores lógicospodem ser utilizados em vectores e matrizes, e devolvem vectores ou matrizes to tipo lógico.

Operadores:

&

|

~

Vectores lógicos:

Page 30: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Vectorização:

30

>> vec_15 = [1 0 1 0 0];

>> vec_16 = [0 0 0 0 0];

>> vec_17 = [1 1 1 1 1];

>> any(vec_15)

ans =

1

>> any(vec_16)

ans =

0

>> any(vec_17)

ans =

1

Funções lógicas pré-definidas no MATLAB, que operam sobre vectores (e matrizes). (NOTA: em matrizes as operações são coluna a coluna)

Funções:

any – devolve true se existir pelo menos um valor true no vector.

all – devolve true se todos os elementos do vector forem true.

Funções lógicas pré-definidas no MATLAB:

Page 31: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Vectorização:

31

>> vec_15 = [1 0 1 0 0];

>> vec_16 = [0 0 0 0 0];

>> vec_17 = [1 1 1 1 1];

>> all(vec_15)

ans =

0

>> all(vec_16)

ans =

0

>> all(vec_17)

ans =

1

Funções lógicas pré-definidas no MATLAB, que operam sobre vectores (e matrizes). (NOTA: em matrizes as operações são coluna a coluna)

Funções:

any – devolve true se existir pelo menos um valor true no vector.

all – devolve true se todos os elementos do vector forem true.

Funções lógicas pré-definidas no MATLAB (cont.):

Page 32: Programação em MATLAB - fenix.tecnico.ulisboa.pt · Ressalto nº 1 possui uma altura de 3.750 metros Ressalto nº 2 possui uma altura de 1.875 metros ... raiz_quadrada = ii.^(1/2);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Referências

32

• Capítulo 4 de Stormy Attaway (2009), “Matlab: A Practical Introduction to Programming and Problem Solving”, Elsevier.

• Getting started with MATLAB: http://www.mathworks.com/access/helpdesk/help/pdf_doc/matlab/getstart.pdf