63
Programação em MATLAB Computação – 2º Semestre 2016/2017

Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Programação em MATLAB

Computação – 2º Semestre 2016/2017

Page 2: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Ficheiros-M

O MATLAB permite escrever várias linhas de comandos

em ficheiros de texto denominados ficheiros-M

Os ficheiros-M têm esse nome porque a sua extensão é

sempre ‘.m’

Existem dois tipos de ficheiros-M

Ficheiros de script

Ficheiros de funções

Programação em MATLAB 220 Março 2017

Page 3: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Ficheiros de Script

Um ficheiro de script é simplesmente uma sequência de

comandos gravada num ficheiro

Quando é executado um ficheiro de script é como se a

sequência de comandos fosse escrita na janela de comandos

Os scripts são executados quando se escreve o nome do

ficheiro (sem a extensão .m) na janela de comandos

Programação em MATLAB 320 Março 2017

Page 4: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Ficheiros de Script

Exemplo: calcular a velocidade do bungee jumper

Seleccionar: File → New → M-File

Escrever no editor:

g=9.81; m=68.1; t=12; cd=0.25;

v=sqrt(g*m/cd)*tanh(sqrt(g*cd/m)*t)

Gravar o ficheiro com o nome scriptdemo.m

Escrever na janela de comandos:

>> scriptdemo

v =

50.6175

As variáveis criadas no script são visíveis na janela de comandos:

>> g

g =

9.8100

Programação em MATLAB 420 Março 2017

Page 5: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Ficheiros de Funções

Os ficheiros de funções são diferentes do ficheiros de script.

Implementam funções que aceitam argumentos (inputs) da

janela de comandos e retornam valores (outputs) para a janela

de comandos

As variáveis criadas e manipuladas no contexto de uma função

não são visíveis na janela de comandos

Programação em MATLAB 520 Março 2017

Page 6: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Ficheiros de Funções

Uma função deve escrever-se na forma:

function outvar = funcname(arglist)

% helpcomments

statements

outvar = value;

end;

em que:outvar: nome da variável de output

funcname: nome da função

arglist: lista de argumentos de input (separados por vírgulas)

helpcomments: texto que é mostrado com >> help funcname

statements: comandos da função

A função deve ser gravada num ficheiro denominado funcname.m

Programação em MATLAB 620 Março 2017

Page 7: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Ficheiros de Funções

Exemplo: calcular a velocidade do bungee jumper

Seleccionar: File → New → Function (só versão 2010)

Escrever no editor:function v = freefall(t, m, cd)

% freefall: bungee velocity with second-order drag

% v=freefall(t,m,cd) computes the free-fall velocity

% of an object with second-order drag

% input:

% t = time (s)

% m = mass (kg)

% cd = second-order drag coefficient (kg/m)

% output:

% v = downward velocity (m/s)

g = 9.81; % acceleration of gravity

v = sqrt(g * m / cd)*tanh(sqrt(g * cd / m) * t);

end

Programação em MATLAB 720 Março 2017

Page 8: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Ficheiros de Funções

Exemplo: calcular a velocidade do bungee jumper

Gravar o ficheiro com o nome freefall.m

Escrever na janela de comandos:>> freefall(12,68.1,0.25)

ans =

50.6175

Se quisermos calcular a velocidade de um saltador de 100kg ao

fim de 8 segundos:>> freefall(8,100,0.25)

ans =

53.1878

As variáveis da função não são visíveis na janela de comandos:>> g

??? Undefined function or variable 'g'.

Programação em MATLAB 820 Março 2017

Page 9: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Ficheiros de Funções

Exemplo: calcular a velocidade do bungee jumper

Para visualizar os comentários de ajuda:>> help freefall

freefall: bungee velocity with second-order drag

v=freefall(t,m,cd) computes the free-fall velocity

of an object with second-order drag

input:

t = time (s)

m = mass (kg)

cd = second-order drag coefficient (kg/m)

output:

v = downward velocity (m/s)

Se nos esquecermos do nome da função:>> lookfor bungee

freefall.m: bungee velocity with second-order drag

Programação em MATLAB 920 Março 2017

Page 10: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Ficheiros de Funções

As funções podem retornar mais que um resultado

Exemplo: calcular a média e o desvio padrão de um vector

Criar o ficheiro stats.m:function [mean, stdev] = stats(x)

n = length(x);

mean = sum(x)/n;

stdev = sqrt(sum((x-mean).^2/(n-1)));

end

Chamar na janela de comandos:>> y = [8 5 10 12 6 7.5 4];

>> [m,s] = stats(y)

m =

7.5000

s =

2.8137

Programação em MATLAB 1020 Março 2017

Page 11: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Ficheiros de Funções

Um ficheiro de funções pode conter um única função, ou uma função primária e uma ou mais subfunções.

A função primária é a primeira das funções, cujo nome corresponde ao nome do ficheiro.

As subfunções são as que vêm a seguir à função primária.

As subfunções são apenas acessíveis pela função primária e pelas outras subfunções escritas no mesmo ficheiro.

são invisíveis da janela de comandos e outras funções ou scripts

Programação em MATLAB 1120 Março 2017

Page 12: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Ficheiros de Funções

Exemplo: calcular a velocidade do bungee jumper

Criar o ficheiro freefallsubfunc.m:

function v = freefallsubfunc(t, m, cd)

v = vel(t, m, cd);

end

function v = vel(t, m, cd)

g = 9.81;

v = sqrt(g * m / cd)*tanh(sqrt(g * cd / m) * t);

end

Chamar na janela de comandos:>> freefallsubfunc(12,68.1,0.25)

ans =

50.6175

>> vel(12,68.1,.25)

??? Undefined function or method 'vel' for input arguments

of type 'double'.

Programação em MATLAB 1220 Março 2017

Page 13: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Input e Output

A função input permite ao utilizador a entrada de valores directamente da janela de comandos: n = input('promptstring')

mostra o texto 'promptstring' e espera que o utilizador escreva um número que será guardado na variável n

n = input('promptstring','s')

mostra o texto 'promptstring' e espera que o utilizador escreva um string que será guardada na variável n

A função disp permite ao utilizador a visualização de valores na janela de comandos: disp(valor)

mostra no ecrã o valor (pode ser uma constante numérica, uma variável numérica ou uma string)

Programação em MATLAB 1320 Março 2017

Page 14: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Input e Output

Exemplo: calcular a velocidade do bungee jumper

Criar o ficheiro freefalli.m:function freefalli

% freefalli: interactive bungee velocity

% freefalli interactive computation of the

% free-fall velocity of an object

% with second-order drag.

g = 9.81; % acceleration of gravity

m = input('Mass (kg): ');

cd = input('Drag coefficient (kg/m): ');

t = input('Time (s): ');

disp(' ')

disp('Velocity (m/s):')

disp(sqrt(g * m / cd)*tanh(sqrt(g * cd / m) * t))

end

Programação em MATLAB 1420 Março 2017

Page 15: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Input e Output

Exemplo: calcular a velocidade do bungee jumper

Chamar na janela de comandos:

>> freefalli

Mass (kg): 68.1

Drag coefficient (kg/m): 0.25

Time (s): 12

Velocity (m/s):

50.6175

Programação em MATLAB 1520 Março 2017

Page 16: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Input e Output

A função fprintf permite ao utilizador a visualização formatada de valores de variáveis juntamente com texto: fprintf('format', x, y,...)

em que format é uma string que especifica o formato com que se quer apresentar os valores das variáveis x, y,... e como estes devem ser integrados no resto do texto.

Ex: mostrar, integrado num texto, o valor da velocidade com 7 dígitos sendo 4 decimais

>> velocity = 50.61751452;

>> fprintf('The velocity is %7.4f m/s\n', velocity)

The velocity is 50.6175 m/s

Programação em MATLAB 1620 Março 2017

Page 17: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Input e Output

Os códigos de formato definem como os valores numéricos devem ser visualizados:%d – inteiro %e – notação científica (com ‘e’)%E – notação científica (com ‘E’) %f – decimal

Os códigos seguintes produzem resultados especiais:\n – muda de linha\t – tabulação \\ – escreve \

Programação em MATLAB 1720 Março 2017

Page 18: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Input e Output

O MATLAB permite a escrita e a leitura dos valores das variáveis para ficheiros com um formato especial (.mat) save filename var1 var2 ... varn

grava as variáveis num ficheiro denominado filename.mat.

se não for indicada nenhuma variável, são gravadas todas.

load filename var1 var2 ... varn

lê as variáveis de um ficheiro denominado filename.mat.

se não for indicada nenhuma variável, são lidas todas.

Os ficheiros .mat não são ficheiros de texto e por isso só são legíveis no ambiente MATLAB.

Programação em MATLAB 1820 Março 2017

Page 19: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Input e Output

Ex: gravar vectores de velocidades e coeficientes de resistência criam-se as variáveis:>> g=9.81;m=80;t=5;

>> cd=[.25 .267 .245 .28 .273]';

>> v=sqrt(g*m ./cd).*tanh(sqrt(g*cd/m)*t);

gravam-se as variáveis:>> save veldrag v cd

>> clear

agora não existem variáveis:>> v

??? Undefined function or variable 'v'.

obtêm-se de novo as variáveis:>> load veldrag

>> who

Your variables are:

cd v

Programação em MATLAB 1920 Março 2017

Page 20: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Input e Output

Para criar ficheiros de texto legíveis acrescentar -ascii save -ascii filename V

grava o valor da variável V num ficheiro denominado filename.

os valores são gravados como seriam visualizados com disp(V)

tem que se indicar a extensão (normalmente .txt ou .dat)

load filename

lê para a variável filename (sem extensão) os valores gravados

V = load(filename)

lê para a variável V os valores gravados

Programação em MATLAB 2020 Março 2017

Page 21: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Input e Output

Ex: gravar os valores de uma matriz 24

cria-se a matriz:

>> A=[5 7 9 2;3 6 3 9];

grava-se a matriz num ficheiro de texto:

>> save -ascii simpmatrix.txt A

>> clear

lê-se o ficheiro e cria-se uma nova variável com o nome do ficheiro:

>> load simpmatrix.txt

>> simpmatrix

simpmatrix =

5 7 9 2

3 6 3 9

lê-se o ficheiro para a variável A:

>> A = load('simpmatrix.txt')

Programação em MATLAB 2120 Março 2017

Page 22: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Programação Estruturada

Um programa pode ser simplesmente uma sequência de instruções ou pode ser estruturado não sequencialmente

Existem dois tipos de instruções que permitem o encadeamento de comandos de uma forma não sequencial:

Decisões (if, if…else, if…elseif) e Selecções (switch)

permitem instruções alternativas baseadas na satisfação de condições

Ciclos (for, while) permitem o encadeamento repetitivo de instruções

Programação em MATLAB 2220 Março 2017

Page 23: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Decisões

Decisões são implementadas com instruções if que podem incluir alternativas elseif ou else.

A decisão de qual das alternativas deve ser seguida depende do resultado de condições que podem ser verdadeiras ou falsas.

Se nenhuma das condições é verdadeira então deverá ser seguida a alternativa associada ao else.

Programação em MATLAB 23

if condição

instruções

end

if condição

instruções

else

instruçõeselseend

if condição1instruções1

elseif condição2instruções2

...elseif condiçãon

instruçõesnelse

instruçõeselseend

20 Março 2017

Page 24: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Condições

A condição mais simples é uma expressão relacional: valor1 relação valor2

os valores podem ser constantes ou expressões

a relação é um dos operadores relacionais da tabela seguinte

Programação em MATLAB 24

Exemplo Operador Relação

x == 0 == Igual

unit ~= 'm' ~= Diferente

a < 0 < Menor

s > t > Maior

3.9 <= a/3 <= Menor ou igual

r >= 0 >= Maior ou igual

20 Março 2017

Page 25: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Condições

É possível combinar várias expressões relacionais usando operadores lógicos: ~expressão (Negação)

verdadeiro se a expressão é falsa; falso se a expressão é verdadeira

expressão1 & expressão2 (Conjunção)

verdadeiro se ambas expressão1 e expressão2 são verdadeiras

expressão1 | expressão2 (Disjunção):

verdadeiro se expressão1 ou expressão2 é verdadeira

Prioridade: ~, &, |

Ex:>> x = 0;

>> -1<x & x<1

ans =

1

>> -1<x<1

ans =

0 (porquê?)

Programação em MATLAB 2520 Março 2017

Page 26: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Condições

Exemplo de avaliação de uma condição:

Programação em MATLAB 2620 Março 2017

Page 27: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Instrução if

Exemplo: verificar se uma nota é suficiente para passar (60%)

Criar o ficheiro grader.m:

function grader(grade)

% grader(grade):

% determines whether grade is passing

% input:

% grade = numerical value of grade (0-100)

% output:

% displayed message

if grade >= 60

disp('passing grade')

end

end

Testar na janela de comandos:>> grader(95.6)

passing grade

Programação em MATLAB 2720 Março 2017

Page 28: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Instrução if

Exemplo: utilização da função error num if de uma única linha

Criar o ficheiro errortest.m:

function f = errortest(x)

if x == 0, error('zero value encountered'), end

f = 1/x;

end

Testar na janela de comandos:>> errortest(10)

ans =

0.1000

>> errortest(0)

??? Error using ==> errortest at 2

zero value encountered

Programação em MATLAB 2820 Março 2017

Page 29: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Instrução if

Exemplo: implementar a função pré-definida sign

Criar o ficheiro mysign.m:function sgn = mysign(x)

% mysign(x) returns 1 if x is greater than zero.

% -1 if x is less than zero.

% 0 if x is equal to zero.

if x > 0

sgn = 1;

elseif x < 0

sgn = -1;

else

sgn = 0;

end

end

Testar na janela de comandos:>> mysign(0)

ans =

0

Programação em MATLAB 2920 Março 2017

Page 30: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Selecções

As selecções são implementadas com instruções switch

A decisão da alternativa a executar é baseada na comparação do valor de uma expressão com valores associados a vários casos

Se o valor da expressão corresponder a um dos casos, será esse o caso escolhido

Caso contrário, será escolhida a alternativa reservada para essa situação

Programação em MATLAB 30

switch expressão

case valor1instruções1

case valor2instruções2

...otherwise

instruçõesotherwiseend

20 Março 2017

Page 31: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Instrução switch Exemplo: implementar uma função que diga a nota por extenso

function grade(S)

switch S

case 'A'

disp('Excellent')

case 'B'

disp('Good')

case 'C'

disp('Mediocre')

case 'D'

disp('Whoops')

case 'F'

disp('Would like fries with your order?')

otherwise

disp('Huh!')

end

end

>> grade('B')

Good

Programação em MATLAB 3120 Março 2017

Page 32: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Instrução switch

O MATLAB permite que seja passado um número variável de

argumentos na chamada de uma função

Isto permite a definição de valores por omissão que poderá

ser acompanhada de detecção de erros

Para se saber o número de argumentos que foram passados na

chamada da função usa-se a função pré-definida nargin

Para se seleccionar a alternativa a executar de acordo com o

número de argumentos passado usa-se a instrução switch

Programação em MATLAB 3220 Março 2017

Page 33: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Instrução switch Exemplo: calcular a velocidade do bungee jumper

function v = freefall2(t, m, cd)

% freefall2: bungee velocity with second-order drag

% v=freefall2(t,m,cd) computes the free-fall velocity

% of an object with second-order drag.

% input:

% t = time (s)

% m = mass (kg)

% cd = drag coefficient (default = 0.27 kg/m)

% output:

% v = downward velocity (m/s)

switch nargin

case 0

error('Must enter time and mass')

case 1

error('Must enter mass')

case 2

cd = 0.27;

end

g = 9.81; % acceleration of gravity

v = sqrt(g * m / cd)*tanh(sqrt(g * cd / m) * t);

Programação em MATLAB 3320 Março 2017

Page 34: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Instrução switch

Exemplo: calcular a velocidade do bungee jumper

>> freefall2(12,68.1,0.25)

ans =

50.6175

>> freefall2(12,68.1)

ans =

48.8747

>> freefall2(12)

??? Error using ==> freefall2 at 15

Must enter mass

>> freefall2()

??? Error using ==> freefall2 at 13

Must enter time and mass

Programação em MATLAB 3420 Março 2017

Page 35: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Ciclos

Nos ciclos as mesmas linhas de código são executadas

múltiplas vezes.

Existem dois tipos de ciclos:

Os ciclos for repetem o código um número pré-determinado de

vezes.

Os ciclos while repetem o código enquanto uma condição for

satisfeita.

Programação em MATLAB 3520 Março 2017

Page 36: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Instrução for

Os ciclos em que sabemos previamente o número de vezes que as instruções devem ser repetidas são implementados com instruções for:

início:passo:fim é um vector linha

O código instruções é repetido um número de vezes correspondente ao número de elementos do vector

Para cada uma das vezes a variável índice toma o valor do respectivo elemento do vector

Programação em MATLAB 36

for índice = início:passo:fim

instruções

end

20 Março 2017

Page 37: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Instrução for

Exemplo: mostrar o valor dos índices

Criar o ficheiro de script teste.mfor i = 1:5

disp(i)

end

for j = 10:-1:1

disp(j)

end

Testar com:>> teste

Programação em MATLAB 3720 Março 2017

Page 38: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Instrução for Exemplo: implementar uma função para calcular o factorial

Criar o ficheiro factor.mfunction fout = factor(n)

% factor(n):

% Computes the product of all the integers from 1 to n.

x = 1;

for i = 1:n

x = x * i;

end

fout = x;

end

Testar com:>> factor(5)

ans =

120

Programação em MATLAB 3820 Março 2017

Page 39: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Instrução for vs Vectorização

O MATLAB permite passar vectores e matrizes como argumentos para funções pré-definidas.

Este processo, denominado vectorização, aplica eficientemente a função a cada um dos elementos do vector ou matriz.

Se for possível, é preferível usar a vectorização do MATLAB do que aplicar a função elemento a elemento num ciclo for

Programação em MATLAB 39

Ciclo for Vectorização

i = 0;

for t = 0:0.02:50

i = i + 1;

y(i) = cos(t);

end

t = 0:0.02:50;

y = cos(t);

20 Março 2017

Page 40: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Instrução while

Os ciclos em que se pretende executar repetidamente instruções enquanto uma condição for satisfeita são implementados com instruções while:

A condição é uma expressão lógica. Se for verdadeira as instruções são executadas e no fim a condição será avaliada novamente para eventual repetição do ciclo.

Mesmo que a condição fique falsa enquanto as instruções são executadas, apenas a avaliação no fim determinará a repetição ou interrupção do ciclo.

Programação em MATLAB 40

while condição

instruções

end

20 Março 2017

Page 41: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Instrução while

Exemplo: mostrar o valor de uma variável no ciclo

Criar o ficheiro de script teste.mx = 8

while x > 0

x = x - 3;

disp(x)

end

Testar com:>> teste

x =

8

5

2

-1

Programação em MATLAB 4120 Março 2017

Page 42: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Instrução while

Existe outra forma de usar a instrução while:

A condição (1) é sempre verdadeira, logo o ciclo não terminará no fim por esta passar a ser falsa.

O ciclo será interrompido (instrução break) quando a avaliação da condição na instrução if for verdadeira.

Programação em MATLAB 42

while (1)

instruções1if condição, break, end

instruções2end

20 Março 2017

Page 43: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Instrução while Exemplo: mostrar o valor de uma variável no ciclo

Criar o ficheiro de script teste.mx = 12

while (1)

if x < 0, break, end

x = x - 5;

disp(x)

end

y = 12

while (1)

y = y - 5;

if y < 0, break, end

disp(y)

end

Testar com:>> teste

x = y =

12 12

7 7

2 2

-3

Programação em MATLAB 4320 Março 2017

Page 44: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Animações

Existem duas formas de criar animações em MATLAB.

Usando repetidamente a instrução plot dentro de um ciclo

O gráfico é assim refeito repetidamente

É importante usar o comando axis para fixar as escalas dos eixos.

Usando funções especiais: getframe e movie

Permitem guardar a sequência de plots (getframe) e posteriormente mostrar todos de uma vez (movie).

Programação em MATLAB 4420 Março 2017

Page 45: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Animações

Exemplo: as coordenadas (x,y) de um projéctil podem ser calculadas em função do tempo:

onde v0 = velocidade inicial (m/s)

q0 = ângulo inicial (radianos)

g = constante gravitacional (9.81 m/s2)

Programação em MATLAB 45

tvx 00 cos

2

00 5.0sin gttvy

20 Março 2017

Page 46: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Animações Exemplo: mostrar a trajectória do projéctil

Criar o ficheiro de script teste.mclf,clear

g=9.81; theta0=45*pi/180; v0=5;

t(1)=0;x=0;y=0;

plot(x,y,'o','MarkerFaceColor','b','MarkerSize',8)

axis([0 3 0 0.8])

M(1)=getframe;

dt=1/128;

for j = 2:1000

t(j)=t(j-1)+dt;

x=v0*cos(theta0)*t(j);

y=v0*sin(theta0)*t(j)-0.5*g*t(j)^2;

plot(x,y,'o','MarkerFaceColor','b','MarkerSize',8)

axis([0 3 0 0.8])

M(j)=getframe;

if y<=0, break, end

end

pause

movie(M,1)

Programação em MATLAB 4620 Março 2017

Page 47: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Animações

Exemplo: mostrar a trajectória do projéctil

Programação em MATLAB 4720 Março 2017

Page 48: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Indentação

Em programação estruturada, onde puder ser colocada uma instrução, também pode ser colocado um conjunto de instruções

As instruções podem ser colocadas umas dentro das outras

Para clareza do código é muito importante usar indentação para mostrar o contexto de cada conjunto de instruções.

Programação em MATLAB 4820 Março 2017

Page 49: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Indentação

Exemplo: calcular as raízes de um polinómio de segundo grau

Criar o ficheiro quadroots.mfunction quadroots(a, b, c)

% quadroots: roots of quadratic equation

% quadroots(a,b,c): real and complex roots

% of quadratic equation

% input:

% a = second-order coefficient

% b = first-order coefficient

% c = zero-order coefficient

% output:

% r1 = real part of first root

% i1 = imaginary part of first root

% r2 = real part of second root

% i2 = imaginary part of second root

Programação em MATLAB 4920 Março 2017

Page 50: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Indentaçãoif a == 0 %special cases

if b ~= 0 %single root

r1 = -c / b

else %trivial solution

disp('Trivial solution. Try again')

end

else %quadratic formula

d = b ^ 2 - 4 * a * c; %discriminant

if d >= 0 %real roots

r1 = (-b + sqrt(d)) / (2 * a)

r2 = (-b - sqrt(d)) / (2 * a)

else %complex roots

r1 = -b / (2 * a)

i1 = sqrt(abs(d)) / (2 * a)

r2 = r1

i2 = -i1

end

end

Programação em MATLAB 5020 Março 2017

Page 51: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Funções Anónimas Funções anónimas são funções simples criadas sem a utilização de um ficheiro-M

fhandle = @(arg1, arg2, ...) expression

Exemplos:

>> f1=@(x,y) x^2 + y^2;

>> f1(3,4)

ans =

25

>> a = 4; b = 2;

>> f2=@(x) a*x^b;

>> f2(3)

ans =

36

>> a = 3;

>> f2(3)

ans =

36

>> f2=@(x) a*x^b;

>> f2(3)

ans =

27

Programação em MATLAB 5120 Março 2017

Page 52: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Funções de Funções

São funções que usam outras funções que lhe são passadas por parâmetro no momento da chamada da função

O argumento pode ser:

A identificação de uma função anónima;

O nome de uma função pré-definida;

O nome de uma função definida num ficheiro-M.

O uso de funções de funções permite uma programação mais dinâmica.

Programação em MATLAB 5220 Março 2017

Page 53: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Funções de Funções

Exemplo: passagem de uma função anónima para fplot

>> vel=@(t) sqrt(9.81*68.1/0.25)*tanh(sqrt(9.81*0.25/68.1)*t);

>> fplot(vel,[0 12])

Programação em MATLAB 5320 Março 2017

Page 54: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Funções de Funções

Exemplo: uma função que calcule a média das velocidadesfunction favg = funcavg1(a,b,n)

% funcavg: average function height

% favg=funcavg1(a,b,n): computes average value

% of function over a range

% input:

% a = lower bound of range

% b = upper bound of range

% n = number of intervals

% output:

% favg = average value of function

x = linspace(a,b,n);

y = func(x);

favg = mean(y);

end

function f = func(t)

f=sqrt(9.81*68.1/0.25)*tanh(sqrt(9.81*0.25/68.1)*t);

end

Programação em MATLAB 5420 Março 2017

Page 55: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Funções de Funções

Exemplo: uma função que calcule a média de uma funçãofunction favg = funcavg(f,a,b,n)

% funcavg: average function height

% favg=funcavg(f,a,b,n): computes average value

% of function over a range

% input:

% f = function to be evaluated

% a = lower bound of range

% b = upper bound of range

% n = number of intervals

% output:

% favg = average value of function

x = linspace(a,b,n);

y = f(x);

favg = mean(y);

end

Programação em MATLAB 5520 Março 2017

Page 56: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Funções de Funções

Testes:>> funcavg1(0,12,60)

ans =

36.01727

>> vel=@(t) sqrt(9.81*68.1/0.25)*tanh(sqrt(9.81*0.25/68.1)*t);

>> funcavg(vel,0,12,60)

ans =

36.01727

>> funcavg(@sin,0,2*pi,180)

ans =

-6.3001e-017

Programação em MATLAB 5620 Março 2017

Page 57: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Funções de Funções

Exemplo: uma função que calcule a média de uma função com passagem de parâmetros

function favg = funcavg(f,a,b,n,varargin)

x = linspace(a,b,n);

y = f(x,varargin{:});

favg = mean(y);

end

>> vel=@(t,m,cd) sqrt(9.81*m/cd)*tanh(sqrt(9.81*cd/m)*t);

>> funcavg(vel,0,12,60,68.1,0.25)

ans =

36.0127

>> funcavg(vel,0,12,60,100,0.28)

ans =

38.9345

Programação em MATLAB 5720 Março 2017

Page 58: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Caso de Estudo

Bungee Jumper

20 Março 2017 Programação em MATLAB 58

Page 59: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Bungee Jumper Exemplo: usar o modelo diferencial para calcular a velocidade do bungee jumperfunction vend = velocity1(dt, ti, tf, vi)

% velocity1: Euler solution for bungee velocity

% vend = velocity1(dt, ti, tf, vi)

% Euler method solution of bungee jumper velocity

% input:

% dt = time step (s)

% ti = initial time (s)

% tf = final time (s)

% vi = initial value of dependent variable (m/s)

% output:

% vend = velocity at tf (m/s)

t = ti;

v = vi;

n = (tf - ti) / dt;

for i = 1:n

dvdt = deriv(v);

v = v + dvdt * dt;

t = t + dt;

end

vend = v;

end

function dv = deriv(v)

dv = 9.81 - (0.25 / 68.1) * v*abs(v);

end

Programação em MATLAB 5920 Março 2017

Page 60: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Bungee Jumper Teste: >> velocity1(0.5,0,12,0)

ans =

50.9259

>> velocity1(0.001,0,12,0)

ans =

50.6181

Programação em MATLAB 6020 Março 2017

Page 61: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Bungee Jumper Exemplo: usar o modelo diferencial para calcular a velocidade do bungee jumper

function vend = velocity2(dt, ti, tf, vi)

t = ti;

v = vi;

h = dt;

while(1)

if t + dt > tf, h = tf - t; end

dvdt = deriv(v);

v = v + dvdt * h;

t = t + h;

if t >= tf, break, end

end

vend = v;

end

function dv = deriv(v)

dv = 9.81 - (0.25 / 68.1) * v*abs(v);

end

Programação em MATLAB 6120 Março 2017

Page 62: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Bungee Jumper Teste: >> velocity2(0.5,0,12,0)

ans =

50.9259

>> velocity2(0.35,0,12,0)

ans =

50.8348

Programação em MATLAB 6220 Março 2017

Page 63: Programação em MATLAB · 2017. 3. 17. · O MATLAB permite escrever várias linhas de comandos em ficheiros de texto denominados ficheiros-M Os ficheiros-M têm esse nome porque

Bungee Jumper Exemplo: usar o modelo diferencial para calcular a velocidade do bungee jumper

function yend = odesimp(dydt, dt, ti, tf, yi)

t = ti; y = yi; h = dt;

while (1)

if t + dt > tf, h = tf - t; end

y = y + dydt(y) * h;

t = t + h;

if t >= tf, break, end

end

yend = y;

end

>> dvdt=@(v) 9.81-(0.25/68.1)*v*abs(v);

>> odesimp(dvdt,0.5,0,12,0)

ans =

50.9259

>> odesimp(@(y) -0.1*y,0.005,0,5,10)

ans =

6.0645

Programação em MATLAB 6320 Março 2017