28
MATLAB Programação básica

Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

Embed Size (px)

Citation preview

Page 1: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

MATLAB

Programação básica

Page 2: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

2João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Tipo de dados logical

Podem ter valores true ou false.Dados do tipo lógico podem ser utilizados com valores numéricos. São convertidos nos valores 0 e 1. Operadores relacionais

Símbolo Significado < Menor que > Maior que == Igual a <= Menor ou igual a >= Maior ou igual a ~= Diferente de

Page 3: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

3João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Saída de dados do tipo logical

Page 4: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

4João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Comparação de reais

>> a = 0;>> b = sin(pi);>> a == bans =

0

Porquê?Devido a erros de arredondamento, b = 1.2246e-16.

>> abs(a - b) < 1.0E-14ans =

1

Page 5: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

5João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Operadores lógicos

Operadores lógicos Significado & E (AND) lógico && E (AND) lógico com avaliação parcial | OU (OR) lógico || OU (OR) lógico com avaliação parcial xor OU exclusivo ~ NÃO (NOT) lógico

x = a/b > 10.0

E se b é zero?x = (b ~= 0) && (a/b > 10.0)

Se b é zero, a segunda expressão não é avaliada; retorna logo falso.

Page 6: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

6João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Hierarquia de operações lógicas

Prioridade dos operadores:1. Todas as expressões aritméticas.2. Todos os operadores relacionais (==, ~=, >, >=, <, <=) da

esquerda para a direita.3. Todas as negações, ~, são avaliadas.4. Todos os operadores & e && são avaliados da esquerda para

a direita.5. Todos os operadores |, ||, e xor são avaliados da esquerda

para a direita.

Page 7: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

7João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Funções lógicas intrínsecas

ischar(a) – retorna true se a for uma variável do tipo caracter.isempty(a) – retorna true se a for vazia.isinf(a) – retorna true se a for infinito (Inf).isnan(a) – retorna true se a não for um número, ou seja, se for NaN.isnumeric(a) – retorna true se a for um arraynumérico.logical(a) – converte um valor numérico num valor lógico. Se a for zero retorna falso, e verdadeiro caso contrário.

Page 8: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

8João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Estruturas de selecção

Construção if____________________________________________________________________________

if expressao_logica1atribuição1atribuição2...

elseif expressao_logica2atribuição1atribuição2...

elseatribuição1atribuição2...

end

Page 9: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

9João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Exemplo: cálculo de raízes% Ficheiro script: calcula_raizes.m% Este programa calcula as raizes uma equacao quadratica da% forma a*x^2 + b*x + c = 0, sejam elas reais ou complexas. % Data Programador Descricao da alteracao% ==== ============= =====================% 15/04/06 Joao M. C. Sousa Codigo original %% Definicao das variavais:% a -- Coeficiente em x^2% b -- Coeficiente em x% c -- Termo constante% discriminante -- Discriminante% parte_imag -- Parte imaginaria da equacao (para raizes complexas)% parte_real -- Parte real da equacao (para raizes complexas) % x1 -- Primeira solucao da equacao (para raizes reais)% x2 -- Segunda solucao da equacao (para raizes reais)

% Pergunta ao utilizador os coeficientes da equacaodisp('Este programa calcula as raizes de uma equacao');disp('quadratica da forma a*x^2 + b*x + c = 0.' );a = input('Introduza o coeficiente a: ');b = input('Introduza o coeficiente b: ');c = input('Introduza o coeficiente c: ');

Page 10: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

10João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Exemplo: cálculo de raízes (2)

% Calcula o discriminantediscriminante = b^2 - 4 * a * c;

% Calcula as raizes dependendo do valor do discriminanteif discriminante > 0 % ha duas raizes reais

x1 = (-b + sqrt(discriminante)) / (2*a);x2 = (-b - sqrt(discriminante)) / (2*a);disp('Esta equacao tem duas raizes reais:');fprintf('x1 = %f\n', x1);fprintf('x2 = %f\n', x2);

elseif discriminante == 0 % ha uma raiz duplax1 = -b / (2*a);disp('Esta equacao tem uma raiz dupla:');fprintf('x1 = x2 = %f\n', x1);

else % existem duas raizes complexasparte_real = -b / (2*a);parte_imag = sqrt(abs(discriminante)) / (2*a);disp ('Esta equacao tem raizes complexas:');fprintf('x1 = %f +i %f\n', parte_real, parte_imag );fprintf('x1 = %f -i %f\n', parte_real, parte_imag );

end

Page 11: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

11João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Construção switch

switch(expressao)case {valor1,valor2}

atribuição1atribuição2...

case valor3,atribuição1atribuição2...

...otherwise,

atribuição1atribuição2...

end

Page 12: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

12João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Exemplo de switch

A construção determina se um inteiro entre 1 e 10 épar ou ímpar:

switch(valor)case {1,3,5,7,9},

disp(‘O valor é impar’);case {2,4,6,8,10},

disp(‘O valor é par’);otherwise,

disp(‘O valor nao está entre 1 e 10’);end

Page 13: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

13João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Construção try/catch

Forma para detectar erros. Envia mensagens de erro para o utilizador.

tryatribuição1atribuição2...

catchatribuição1atribuição2...

end

Page 14: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

14João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Exemplo de try/catch

Exemplo no ficheiro try_catch.m

% Inicializa vector

a = [1 -3 2 5];

try% Tenta escrever um elementoindice = input('Insira indice de elemento a escrever: ');disp(['a(' int2str(indice) ') = ' num2str(a(indice))]);

catch% Se ocorrer um erro:disp(['Indice errado: ' int2str(indice)]);

end

Page 15: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

15João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Exemplo de execução

>> try_catchInsira indice de elemento a escrever: 2a(2) = -3>> try_catchInsira indice de elemento a escrever: 4a(4) = 5>> try_catchInsira indice de elemento a escrever: 21

Indice errado: 21

Page 16: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

16João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Ciclo while

while expressaoatribuição1atribuição2......

end

Page 17: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

17João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Exemplo: média e desvio padrão

% Script file: estatisticas.m% Calcula a media e o desvio padrao de dados com % um numero arbitrario de entradas.%% Registo das revisões:% Data Programador Descricao das alteracoes% ===== ============== ========================% 18/04/06 Joao M. C. Sousa Codigo original%% Variaveis:% n -- Numero de entradas% desv_pad -- Desvio padrao das entradas dadas% soma_x -- Soma das entradas% soma_x2 -- Soma das entradas ao quadrado% x -- Um dado valor de entrada% media -- Media dos valores dados

% Inicializa somas.n = 0; soma_x = 0; soma_x2 = 0;

% Le o primeiro valor

x = input('Introduza o primeiro valor (valor negativo para acabar): ');

Page 18: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

18João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Exemplo: média e desvio padrão (2)% Ciclo while para ler os dados de entrada.while x >= 0

% Somas acumuladasn = n + 1;soma_x = soma_x + x;soma_x2 = soma_x2 + x^2;

% Le o proximo valorx = input('Introduza o valor seguinte (valor negativo para acabar):');

end

% Verifica se existem dados suficinetesif n < 2 % Dados insuficientes

disp('E'' necessario introduzir 2 valores no minimo!');else % calcula a media e o desvio padrao

media = soma_x / n;desv_pad = sqrt( (n*soma_x2 - soma_x^2) / (n*(n-1)) );

% Escreve resultadosfprintf('A media dos dados e'': %f\n', media);fprintf('O desvio padrao e'': %f\n', desv_pad);fprintf('O numero total de pontos e'': %f\n', n);

end

Page 19: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

19João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Ciclo for

for indice = expressãoatribuição1atribuição2......

end

Page 20: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

20João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Exemplo: cálculo do dia do ano

% Script file: diadoano.m%% Este programa calcula o dia do ano correspondente a uma data% especificada. Utiliza as construcoes switch e for.%% Registo das revisões:% Data Programador Descricao das alteracoes% ===== ============== ========================% 26/04/06 Joao M. C. Sousa Codigo original%% Variaveis:% dia -- dia (dd)% dia_do_ano -- dia do ano% ii -- indice do ciclo% dia_extra -- dia_extra dos anos bissextos% mes -- mes (mm)% ano -- ano (aaaa)

% Pegunta o dia, mes e ano ao utilizadordisp('Este programa calcula o dia do ano para uma ');disp('data especificada.');dia = input('Qual e'' o dia actual(1-31)? ');mes = input('Qual e'' o mes actual(1-12)? ');ano = input('Introduza o ano(com 4 digitos): ');

Page 21: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

21João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Exemplo: cálculo do dia do ano (2)% Verifica se e' ano bissextoif rem(ano,400) == 0

dia_extra = 1; % Anos divisiveis por 400 sao bissextoselseif rem(ano,100) == 0

dia_extra = 0; % Outros seculos nao sao bissextoselseif rem(ano,4) == 0

dia_extra = 1; % Caso contrario, todo o 4º ano e' bisextoelse

dia_extra = 0; % Os outros anos nao sao bissextosend

% Calcula o dia do ano, adicionando o dia actual aos dias dos meses anterioresdia_do_ano = dia;for ii = 1:mes-1

% Adiciona dias do mes de Jasneiro ate' ao mes anteriorswitch (ii)

case {1,3,5,7,8,10,12},dia_do_ano = dia_do_ano + 31;

case {4,6,9,11},dia_do_ano = dia_do_ano + 30;

case 2,dia_do_ano = dia_do_ano + 28 + dia_extra;

endend

% Saida de resultadosfprintf('A data %2d/%2d/%4d é o dia do ano %d.\n', dia, mes, ano, dia_do_ano);

Page 22: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

22João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Arrays como índices

Os índices de um ciclo for podem ser arrays. Considere-se uma array A de m × n:A instruçãofor ii = A,

atribuiçõesend

atribui a ii o vector A(:,k). Na primeira iteração, k é igual a1; na segunda iteração k é igual a 2, etc., até que k é igual a n. Ou seja, o ciclo é repetido o número de vezes igual ao número de colunas de A. Em cada iteração, i é um vector contendo uma das colunas de A.

Page 23: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

23João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Exemplos

for ii = 1:2:11atribuição_1...atribuição_n

end

for ii = [1 2 3; 4 5 6]atribuição_1...atribuição_n

end

Page 24: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

24João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Vectorização

Torna os cálculos mais rápidos.Exemplo:

for ii = 1:100quadrado(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);

Segunda forma pode ser 15 a 20 vezes mais rápida!

Page 25: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

25João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Intruções return e break

returnreturn termina a sequência de comandos a ser executada e devolve o controlo à função anterior ou ao teclado.

breakA instrução break termina a execução de um ciclo for ouwhile. A execução continua com a primeira instrução fora do ciclo. Em ciclos encadeados, break acaba apenas com o ciclo mais interior.

Page 26: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

26João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Arrays lógicos e vectorização

É muito fácil criar arrays do tipo lógico.Exemplo:

>> a = [1 2 3; 4 5 6; 7 8 9];>> b = a > 5b =

0 0 00 0 11 1 1

Se quisermos calcular a raíz quadrada dos elementos > que 5:>> a(b) = sqrt(a(b))a =

1.0000 2.0000 3.00004.0000 5.0000 2.44952.6458 2.8284 3.0000

Page 27: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

27João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Comparação com e sem vectorização

a = [1 2 3; 4 5 6; 7 8 9];for ii = 1:size(a,1)

for jj = 1:size(a,2)if a(ii,jj) > 5

a(ii,jj) = sqrt(a(ii,jj));end

endend

Ou:a = [1 2 3; 4 5 6; 7 8 9];b = a > 5a(b) = sqrt(a(b))

Dá o mesmo resultado (na página anterior). A segunda forma émuito mais rápida!

Page 28: Programação básica - fenix.tecnico.ulisboa.ptP_C... · % Definicao das variavais: % a -- Coeficiente em x^2 % b -- Coeficiente em x % c -- Termo constante % discriminante -- Discriminante

28João Sousa João Sousa –– Miguel Miguel Pedro SilvaPedro Silva ComputaComputaçção e Programaão e Programaçção 2007 / 2008ão 2007 / 2008

Comandos tic, toc

tic – inicia um contador de tempo.

toc – retorna o tempo decorrido, em segundos, desde o último tic. Pode retornar o valor para uma variável.