Informá(ca para as Ciências e Engenharias Versão : C (Engenharia Civil) Aula 6 Pedro Barahona 2016 / 17
Sumário Representação de imagens num ecrã. Píxeis. Sistema RGB. Gráficos em Matlab. Gráficos de pontos e de linhas. Gráficos de barras. Gráficos de imagens. Cálculo de áreas pelo método de Monte Carlo. Números pseudo-aleatórios. Simulação de Modelos Discretos Exemplo: Incêndio numa floresta. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 2
Cons(tuição do ecrã Píxel(1,1) Píxel(1,C) Ecrã cons(tuído por uma matriz de píxeis (picture elements). Organizado em L linhas (por exemplo, 768). L linhas Cada linha tem C colunas (por exemplo, 1024). C colunas Píxel(L,1) Píxel(L,C) 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 3
Imagem é composta por píxeis Image from: wikipedia, author: ed g2s Imagem ampliada para mostrar os píxeis 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 4
Píxeis formam figuras geométricas 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 5
Píxeis formam letras e números [1] 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 6
Píxeis formam letras e números [2] Uso de níveis intermédios para melhorar a imagem 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 7
Representação da cor [1] l Cor: cada píxel formado por 3 componentes primários. l RGB: l l l Red vermelho; Green verde; Blue azul. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 8
Representação da cor [2] Cor de cada píxel codificada, usualmente, em 3 bytes (24 bits); 1 byte por componente. (red, green, blue) Os três números representam a contribuição de cada uma das cores primárias. Exemplo: O terno (255, 255, 0) resulta num brilhante amarelo. R (255,255,0) G http://en.wikipedia.org/wiki/rgb_color_model B Para testar cores: hjp://www.rapidtables.com/web/color/rgb_color.htm 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 9
Representação da cor Exemplos Cor representada por 3 valores de 8 bits (True Color) 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 10
Manipulação do ecrã (simplificado) CPU CPU escreve bits na memória de vídeo Píxel(1,1) Píxel(1,C) RAM vídeo (3 bytes cada píxel) Controlador do ecrã Eletrónica atualiza os píxeis do ecrã 50/60 vezes por segundo Píxel(L,1) Píxel(L, C) 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 11 11
Sumário Representação de imagens num ecrã. Píxeis. Sistema RGB. Gráficos em Matlab. Gráficos de pontos e de linhas. Gráficos de barras. Gráficos de imagens. Cálculo de áreas pelo método de Monte Carlo. Números pseudo-aleatórios. Simulação de Modelos Discretos Exemplo: Incêndio numa floresta. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 12
Gráficos de linhas 1. Preencher um vetor x com os valores das abcissas. 2. Preencher um vetor y com os valores das ordenadas. 3. Usar a função plot(x, y, cor) para traçar o gráfico, onde cor especifica a cor a usar (por exemplo, r, b, g, c, y, ) Pode não usar o 3º argumento, usando a cor por omissão (ver help plot). >> X = [0, 1, 2, 3, 4, 5]; >> Y = [0, 0.5, 1, 0.5, 0, 0.5]; >> plot(x, Y, -b ) 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 13
Gráficos de Pontos 1. Preencher um vetor x com os valores das abcissas. 2. Preencher um vetor y com os valores das ordenadas. 3. Usar a função plot(x, y, sym) para traçar o gráfico, em que sym especifica o símbolo e a cor a usar (se não quiser a cor por omissão). Exemplos: +, *, o, +r, *g, etc. (ver help plot). Nota: O símbolo - corresponde à linha >> X = [0, 1, 2, 3, 4, 5]; >> Y = [0, 0.5, 1, 0.5, 0, 0.5]; >> plot(x, Y, * ) 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 14
Gráficos de linhas / funções [1] >> X = 0: pi/4:2pi; >> Y = sin(x) 0.00 0.71 1.00 0.71 0.00-0.71-1.00-0.71-0.00 >> plot(x,y) Nota: Relembrar que em Matlab os dados são tratados como matrizes. A função sin, chamada com uma matriz retorna o seno de cada elemento da matriz A função sin, chamada com um vetor retorna o seno de cada elemento do vetor. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 15
Gráficos de linhas / funções [1] >> X = 0: pi/16:2pi; >> Y = sin(x); >> plot(x,y) Para melhorar a qualidade do gráfico usar mais pontos. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 16
Gráficos de linhas / funções [1] Pode fazer-se o gráfico de várias funções se se usar a instrução hold on Pode acrescentar-se uma legenda ao gráfico com o comando legend('sin', 'cos ); >> X = 0: pi/16:2pi; >> Y = sin(x); >> Z = cos(x); >> plot(x,y, r ); >> hold on; >> plot(x,z, g ); >> legend('sin', 'cos ); >> hold off; % para outro gráfico 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 17
Sumário Representação de imagens num ecrã. Píxeis. Sistema RGB. Gráficos em Matlab. Gráficos de pontos e de linhas. Gráficos de barras. Gráficos de imagens. Cálculo de áreas pelo método de Monte Carlo. Números pseudo-aleatórios. Simulação de Modelos Discretos Exemplo: Incêndio numa floresta. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 18
Gráficos de barras [1] 1. Preencher um vetor x com os valores de cada barra. 2. Usar a função bar(x) para traçar o gráfico. Por omissão as categorias são enumeradas no eixo dos x >> V = [10, 20, 15, 35, 5]; >> bar(v); 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 19
Gráficos de barras [2] Pode-se melhorar o gráfico Alterarando o nome das categorias; e /ou Adicionando o ytulo e os nomes dos eixos. >> V = [10, 20, 15, 35, 5]; >> bar(v); >> set(gca, 'XTickLabel', {, A, B, C, D, E }); >> title( Estatística ); >> ylabel( Reprovação ); >> xlabel( Disciplinas ); 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 20
Gráficos de barras [3] Pode-se traçar mais do que uma barra em cada categoria usando uma matriz, em que cada linha tem os pontos de cada categoria. Nota: Ver mais detalhes no manual ou com help bar V = [10, 90 ; 20, 80 ; 15, 85 ; 35, 65 ; 5, 95]; >> bar(v); >> set(gca, 'XTickLabel', {, A, B, C, D, E }); >> xlabel( Disciplinas ); 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 21
Sumário Representação de imagens num ecrã. Píxeis. Sistema RGB. Gráficos em Matlab. Gráficos de pontos e de linhas. Gráficos de barras. Gráficos de imagens. Cálculo de áreas pelo método de Monte Carlo. Números pseudo-aleatórios. Simulação de Modelos Discretos Exemplo: Incêndio numa floresta. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 22
Gráficos de imagens [1] Para produzir um gráfico de uma imagem usar o seguinte procedimento: 1. Preencher uma matriz M com um valor de 1 a n para cada ponto. 2. Definir o mapa de cores usando a função colormap( [cor 1 ; ; cor n ] ) em que cor i = R G B, são 3 reais entre 0 e 1, definindo a cor para o valor i da matriz Exemplo: A matriz [ 0 1 0; 1 0 0; 1 1 0 ] especifica que cor 1 = verde; cor 2 = vermelho; cor 3 = amarelo Para testar outras cores usar, por exemplo: hjp://www.rapidtables.com/web/color/rgb_color.htm 3. Desenhar a imagem usando a função image(m). 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 23
Gráficos de imagens [2] >> V = [10, 20, 15, 35, 5]; >> imagem = [1 1 2 2 2 ; 1 3 3 2 2 ; 1 3 3 2 2 ; 1 1 2 2 2]; >> cores = [0 1 0 ; 1 0 0 ; 1 1 0]; % [1-green; 2-red; 3-yellow] >> colormap(cores); >> image(imagem); [ 1 1 2 2 2 ; 1 3 3 2 2 ; 1 3 3 2 2 ; 1 1 2 2 2 ]; 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 24
Sumário Representação de imagens num ecrã. Píxeis. Sistema RGB. Gráficos em Matlab. Gráficos de pontos e de linhas. Gráficos de barras. Gráficos de imagens. Cálculo de áreas pelo método de Monte Carlo. Números pseudo-aleatórios. Simulação de Modelos Discretos Exemplo: Incêndio numa floresta. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 25
Métodos de Monte Carlo Métodos de Monte Carlo: Métodos usados para conceber algoritmos que recorrem a números (pseudo-)aleatórios. Números pseudo-aleatórios: Uma sequência de números pseudo-aleatórios tem uma aparência aleatória (aparentemente, sem padrão), mas é previsível e reproduyvel. Algumas aplicações: Simulações de fenómenos zsicos, químicos, biológicos, bioquímicos, etc., jogos, cálculo de áreas. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 26
Monte Carlo aplicações Algumas aplicações do cálculo de áreas: Es(mar o valor de um número irracional (p.e. π). Es(mar a área de uma região definida por várias funções ou por funções com muitas variáveis. Es(mar o valor de um integral. Exemplo: 1.5 R 1 e x 3 0 dx 1 0.5 0 0 0.2 0.4 0.6 0.8 1 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 27
Monte Carlo Cálculo de áreas Método para calcular a área A R da região R: 1. Definir uma região S tal que: a) S contém R; b) a área de S (A S ) é conhecida (e fácil de calcular). 2. Gerar n pontos pseudo-aleatórios de S e contar o número k de pontos que quantos pertencem a R. 3. O valor es(mado para A R é proporcional ao número de pontos que pertemcem a R, pelo que se pode es(mar: A R = ( k / n ) A S. Nota: Os resultados são melhores quando: S é uma região contendo R, tão estritamente quanto possível; e n é grande. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 28
Números pseudo-aleatórios A função rand retorna números pseudo-aleatórios uniformemente distribuídos no intervalo ]0, 1[. Para obter um número entre: ]0, 1[ rand ou rand( ) ]0, b[ (com 0 < b) b * rand ]a, b[ (com a < b) a + (b a) * rand Para obter uma matriz de L C com elementos entre: ]0, 1[ rand(l, C) 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 29
Problema da fa(a de um círculo Faça um programa que, dado o raio de um círculo e duas abcissas, es0ma a área da respe(va fa(a ver(cal do círculo e representa graficamente a es(ma(va. Sugestão: use o método de Monte Carlo para efetuar a es(ma(va. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 30
Resolução Problema [1] 1. Compreender totalmente o problema. Pretende-se es(mar a área da fa(a ver(cal do círculo usando o método de Monte Carlo. Pretende-se uma representação gráfica da es(ma(va. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 31
Monte Carlo Es(ma(va da área Algoritmo: A região S é [0, 2r] [0, 2r]. A área de S é (2r) 2. Geram-se n pontos uniformemente distribuídos em S. Contam-se os k pontos pertencendo a R. O valor es(mado para a área de R é (k / n) (2r) 2. Para usar este algoritmo, como se contam os pontos? Geram-se n pontos x, y tais que x: x A e x B y: y 0 e y 2r Conta-se o ponto se (x-r) 2 +(y-r) 2 r 2 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 32 2r r 0 0 S A R r B 2r
Resolução Problema [2] 2. Caracterizar o problema. Problema: Es(ma(va da área de uma fa(a ver(cal de um círculo com representação gráfica. Entrada: (real) raio, (real) xesq, (real) xdir, (inteiro) número de pontos a gerar. Saída: (real) es(ma(va da área da fa(a do círculo eé gerado um gráfico. 3. Generalizar o problema (sempre que for possível). Não vamos generalizar este problema. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 33
Representação gráfica 2r r S R 0 0 A r B 2r 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 34
Resolução Algoritmo [1] 4. Desenhar o algoritmo para resolver o problema. a) Conceber o algoritmo, decompondo o problema em sub-problemas. Como es(mar a área e representar a es(ma(va? Aplicar o método de Monte Carlo, «computando uma es(ma(va da área; e «devolvendo os pontos gerados que ficam dentro e fora da fa(a. Desenhar o gráfico com os pontos gerados dentro e fora da fa(a. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 35
Resolução Algoritmo [2] b) Iden(ficar, caracterizar e generalizar cada sub-problema. Problema: Es(ma(va da área de uma fa(a ver(cal de um círculo. Entrada: (real) raio, (real) xesq, (real) xdir, (inteiro) número de pontos a gerar. Saída: (real) es(ma(va da área da fa(a do círculo, (matriz) pontos gerados dentro da fa(a, (matriz) pontos gerados fora da fa(a. Nota: Temos aqui uma situação em que a função não retorna um só valor (escalar, vetor ou matriz) mas sim um conjunto de valores de (pos diferentes. No caso, um número real e duas matrizes. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 36
Resolução Algoritmo [3] b) Iden(ficar, caracterizar e generalizar cada sub-problema. Problema: Desenho de dois conjuntos de pontos. Entrada: (matriz) pontos do conjunto 1, (matriz) pontos do conjunto 2. Saída: nenhuma. É gerado um gráfico. Nota: Temos aqui uma situação em que a função não retorna nenhum valor. Neste caso a assinatura da função não contem nenhuma variável de retorno. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 37
Valores retornados por funções Em Matlab, as assinaturas das funções permitem especificar funções que retornam um número variado de resultados : function res = nomefunção( parâmetros ) Retorno de um valor de qualquer (po (escalar, vetor, matriz, etc.) function [r 1, r 2,..., r n ] = nomefunção( parâmetros ) Retorno dos valores r 1, r 2,..., r n, possivelmente de (pos diferentes. Nota: [r 1, r 2,..., r n ] não é um vetor; é uma lista de valores. function nomefunção( parâmetros ) Retorno de nenhum valor. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 38
Resolução Algoritmo [4] c) Conceber o algoritmo, assumindo que os sub-problemas estão resolvidos. Es(ma(va da área com representação gráfica (raio, xesq, xdir, numpts): Sub-problema 1: [area, ptsdentro, ptsfora] ç areafa(acirc(raio, xesq, xdir, numpts) Sub-problema 2: desenha2conjpts(ptsdentro, ptsfora) 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 39
Resolução Algoritmo [5] 5. Para cada sub-problema, desenhar o algoritmo para o resolver. Sub-problema 2: desenha2conjpts( conj1, conj2 ): desenha os pontos na matriz conj1 na mesma figura, desenha os pontos na matriz conj2, 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 40
Resolução Algoritmo [6] 5. Para cada sub-problema, desenhar o algoritmo para o resolver. Sub-problema 1: areafa(acirc( raio, xesq, xdir, numpts ): numptsdentro ç 0 ; ptsdentro ç [] ; ptsfora ç []; Para i de 1 a numpts Gerar ponto aleatório (x,y) em [0, 2*raio] [0, 2*raio] Se (x,y) entre as retas e dentro do círculo então senão retornar: numptsdentro ç numptsdentro + 1 Acrescentar (x,y) à matriz ptsdentro Acrescentar (x,y) à matriz ptsfora numptsdentro / numpts * (2*raio)^2, ptsdentro, ptsfora 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 41
Resolução Programa [1] 6. Para cada sub-problema (começando pelos mais simples), implementar o respec(vo algoritmo e testar o sub-programa. Problema: Desenho de dois conjuntos de pontos. Entrada: (matriz) pontos do conjunto 1, (matriz) pontos do conjunto 2. Saída: nenhuma. É gerado um gráfico. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 42
Função desenha2conjpts O 2º sub-problema (mais simples) usa os comandos e funções gráficas vistas anteriormente. function desenha2conjpts(conj1, conj2)! % desenha2conjpts(conj1, conj2)! % Desenha dois conjuntos de pontos com cores diferentes. % As matrizes conj1 e conj2 tem: % na primeira coluna, as abcissas dos pontos; % na segunda coluna, as ordenadas dos pontos.! end! clf; % apaga graficos das janelas abertas! plot(conj1(:,1),conj1(:,2),.r )! hold on;! plot(conj2(:, 1), conj2(:, 2),.b');! 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 43
Resolução Programa [2] 6. Para cada sub-problema (começando pelos mais simples), implementar o respec(vo algoritmo e testar o sub-programa. Problema: Es(ma(va da área de uma fa(a ver(cal de um círculo. Entrada: (real) raio, (real) xesq, (real) xdir, (inteiro) número de pontos a gerar. Saída: (real) es(ma(va da área da fa(a do círculo, (matriz) pontos gerados dentro da fa(a, (matriz) pontos gerados fora da fa(a. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 44
Função areafa(acirc [1] Para o 1º sub-problema (mais complexo ) começamos pela sua documentação. function [area, ptsdentro, ptsfora] =! areafatiacirc(raio, xesq, xdir, numpts)! % [area, ptsdentro, ptsfora] =! % areafatiacirc(raio, xesq, xdir, numpts)! % Desenha dois conjuntos de pontos com cores diferentes.! % Estima a area de uma fatia vertical de um circulo (com o raio dado)! % usando o metodo de Monte Carlo.! % O circulo tem centro no ponto (raio, raio).! % A fatia e' definida pelos pontos do circulo cujas abcissas! % estao entre xesq e xdir (com xesq < xdir).! % O inteiro numpts e o numero de pontos gerados.! % As matrizes ptsdentro e ptsfora, com duas colunas,! % tem os pontos gerados que ficam dentro e fora da fatia.! end!...! 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 45
Função areafa(acirc [2] E agora o código (deixando para o próximo slide o ciclo FOR) function [area, ptsdentro, ptsfora] =...! areafatiacirc(raio, xesq, xdir, numpts)! %...! end! numptsdentro = 0;! ptsdentro = [ ];! ptsfora = [ ];! areafora = (2 * raio) * (xdir xesq);! for i = 1 : numpts % conta os pontos e atualiza as matrizes! end!...! area = (numptsdentro / numpts) * areafora;! 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 46
Função areafa(acirc [3] E agora o ciclo FOR function [area, ptsdentro, ptsfora] = areafatiacirc(raio, xesq, xdir, numpts)! end... for i = 1 : numpts end... x = xesq + (xdir - xesq) * rand; y = 2 * raio * rand; % conta os pontos e atualiza as matrizes if (x raio)^2 + (y raio)^2 <= raio^2 else end numptsdentro = numptsdentro + 1; ptsdentro = [ptsdentro ; x, y]; ptsfora = [ptsfora ; x, y]; 2r % conta r 0 xesq R S xdir 2r 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 47
Resolução Programa [3] 7. Implementar o algoritmo que resolve o problema e testar o programa pedido. Problema: Es(ma(va da área de uma fa(a ver(cal de um círculo com representação gráfica. Entrada: (real) raio, (real) xesq, (real) xdir, (inteiro) número de pontos a gerar. Saída: (real) es(ma(va da área da fa(a do círculo. É gerado um gráfico. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 48
Função es(maedesenhafa(acirc E agora a função principal, que chama as duas funções anteriores. function area = estimaedesenhafatiacirc(raio, xesq, xdir, numpts) % area = estimaedesenhafatiacirc(raio, xesq, xdir, numpts) % Estima a area de uma fatia vertical de um circulo % (com o raio dado), usando o metodo de Monte Carlo, e % apresenta a estimativa graficamente. % O centro do circulo e' (raio, raio). A fatia e' definida pelos % pontos do circulo cujas abcissas estao entre xesq e xdir % (com xesq < xdir). % O inteiro numpts e o numero de pontos gerados. [area, ptsdentro, ptsfora] = areafatiacirc(raio,... xesq, xdir, numpts); %... permite a mudança de linha desenha2conjpts(ptsdentro, ptsfora); end 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 49
Alguns Testes [1] >> estimaedesenhafatiacirc(3, 2, 5, 5000) ans = 19.080 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 50
Alguns Testes [1] >> estimaedesenhafatiacirc(3, 2, 5, 5000) ans = 17.172 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 51
Alguns Testes [1] >> estimaedesenhafatiacirc(3, 2, 5, 100000) ans = 16.943 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 52
Figura com (3, 0, 6, 100000) >> pi9 = estimaedesenhafatiacirc(3, 0, 6, 100000) pi9 = 28.281 >> pi9/ 9 ans = 3.1423 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 53
Problema da es(ma(va de pi Faça um programa que es0me o valor de π (pi) Sugestão: use o método de Monte Carlo para efetuar a es(ma(va da área de um círculo: π = A/r 2 para r=1 temos: π = A 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 54
Resolução Problema [1] 1. Compreender totalmente o problema. Pretende-se es(mar o valor de π (pi) Sugestão: recorre-se à es(ma(va da área de um círculo de raio 1 pelo método de Monte Carlo. 2. Caracterizar o problema. Problema: Es(ma(va de π. Entrada: (inteiro) número de pontos a gerar. Saída: (real) es(ma(va de π. 2. Generalizar o problema (sempre que for possível). Não é possível generalizar este problema. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 55
Resolução Problema[2] 4. Desenhar o algoritmo para resolver o problema. a) Conceber o algoritmo, decompondo o problema em sub-problemas. Como es(mar o valor da área do círculo? Já resolvido anteriormente, por exemplo: [area, ptsdentro, ptsfora] = areafatiacirc(1, 0, 1, numpts) Es(ma(va de PI = area 5. Para cada sub-problema, desenhar o algoritmo para o resolver. Já resolvido 6. Para cada sub-problema, implementar o respec(vo algoritmo... Já implementado 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 56
Função es(mapi A função é basicamente uma chamada à função que calcula a área de um círculo de raio 1, centrado no ponto (1,1), entre as abcissas 0 e 2. function estpi = estimapi(numpts) % area = estimapi(numpts) % % Calcula uma estimativa de pi recorrendo ao metodo % de Monte Carlo. O inteiro numpts e o numero de pontos % gerados aleatoriamente para estimar a area do circulo [area, ptsdentro, ptsfora] = areafatiacirc(1,0,2,numpts); estpi = area; end 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 57
Função es(mapi Como visto anteriormente, a qualidade da es(ma(va do valor de π depende do número de pontos u(lizado. 3.40 3.35 3.30 3.25 3.20 3.15 3.10 3.05 1 2 3 4 5 6 7 Valores es(mados com vários valores de numpts: 10 1, 5 10 1, 10 2, 5 10 2, 10 3, 5 10 3, 10 4,5 10 4, 10 5, 5 10 5, 10 6, 5 10 6, 10 7. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 58
Sumário Representação de imagens num ecrã. Píxeis. Sistema RGB. Gráficos em Matlab. Gráficos de pontos e de linhas. Gráficos de barras. Gráficos de imagens. Cálculo de áreas pelo método de Monte Carlo. Números pseudo-aleatórios. Simulação de Modelos Discretos Exemplo: Incêndio numa floresta. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 59
Problema Incêndio em Floresta [1] Pretende-se simular um incêndio numa floresta, segundo o modelo de simulação a seguir apresentado: A floresta é composta por um conjunto de árvores dispostas numa grelha retangular. Em cada instante, cada árvore está num de três estados: Viva, representado por 1 (e desenhado a verde); A arder, representado por 2 (e desenhado a vermelho); Morta, representado por 3 (e desenhado a preto). 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 60
Problema Incêndio em Floresta [2] Simula-se o incêndio em passos discretos, onde as árvores transitam de estado simultaneamente a cada passo. O novo estado de cada árvore depende do seu estado atual, do estado das quatro árvores vizinhas (nas direções Norte, Sul, Este e Oeste) e de uma probabilidade... As árvores da fronteira (da primeira / úl(ma linha / coluna da grelha retangular) não mudam de estado (só para facilitar a solução). 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 61
Problema Incêndio em Floresta [3] Regras de propagação do incêndio (para o estado seguinte): 1. Se uma árvore está viva e: a) alguma árvore vizinha está a arder, a árvore fica a arder; b) nenhuma árvore vizinha está a arder, então: a árvore fica a arder com probabilidade pbbarder (ex. devido a faúlhas); a árvore con(nua viva com probabilidade 1. 2. Se a árvore está a arder, morre. 3. Se a árvore está morta, permanece morta (já não volta a mudar de estado). Objec0vo: O programa deve desenhar o estado da floresta no estado inicial e no fim de cada um dos passos. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 62
Resolução Problema [1] 1. Compreender totalmente o problema. 2. Caracterizar o problema. Problema: Incêndio em floresta.. Entrada: (matriz) estadoinicial, (real) pbbarder, (inteiro) numpassos. Saída: nenhuma. São gerados numpassos + 1 gráficos. 3. Generalizar o problema (sempre que for possível). Não vamos generalizar mais este problema. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 63
Resolução Algoritmo [1] 1. Desenhar o estado inicial da floresta. desenhafloresta(estado) 2. Em cada um dos numpassos passos: a) Calcular o novo estado da floresta. novoestado = estadofloresta(estado, pbbarder) b) Desenhar o novo estado da floresta. desenhafloresta(novoestado) 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 64
Resolução Problema [2] b) Iden(ficar, caracterizar e generalizar cada sub-problema. Problema: Desenho da floresta. Entrada: (matriz) estado da floresta. Saída: nenhuma. É gerado um gráfico. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 65
Resolução Problema [3] b) Iden(ficar, caracterizar e generalizar cada sub-problema. Problema: Cálculo do próximo estado da floresta. Entrada: (matriz) estado atual, (real) pbbarder. Saída: (matriz) novoestado da floresta. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 66
Resolução Algoritmo [2] novoestado = estadofloresta( estado, pbbarder ) 1. Criar a matriz novoestado. Como o tamanho de novoestado é o tamanho de estado e as árvores da fronteira não mudam de estado: novoestado ç estado. 2. Para todas as árvores do interior de novoestado: a) Calcular o novo estado de cada árvore: Criamos a função estadoarvore que, dado o estado da árvore (arv), o estado das 4 vizinhas (v1, v2, v3, v4) e a probabilidade de arder, calcula o novo estado: res = estadoarvore(arv, v1, v2, v3, v4, pbbarder) b) Guardar o novo estado da árvore na matriz novoestado. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 67
Resolução Problema [4] b) Iden(ficar, caracterizar e generalizar cada sub-problema. Problema: Cálculo do próximo estado da árvore. Entrada: (inteiro) arvore, (inteiro) viz1, (inteiro) viz2, (inteiro) viz3, (inteiro) viz4, (real) pbbarder. Saída: (inteiro) novoestado da árvore. 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 68
Resolução Algoritmo [3] novoestado = estadoarvore( arv, v1, v2, v3, v4, pbbarder) 1. Testar em que estado está a árvore (arv pode valer 1, 2 ou 3) e aplicar as regras de transição desse estado. Problema: Como é que se programa a seguinte funcionalidade? As instruçõesa são executadas com probabilidade p e as instruçõesb são executadas com probabilidade 1 p. Solução: a) Gera-se um número pseudo-aleatório entre 0 e 1. b) Se esse número for inferior ou igual a p, executam-se as instruçõesa senão, executam-se as instruçõesb 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 69
Resolução Programa [1] 6. Para cada sub-problema (começando pelos mais simples), implementar o respec(vo algoritmo e testar o sub-programa. Sub-problemas a implementar: func(on desenhafloresta( floresta ) func(on novoestado = estadoarvore(arv, viz1, viz2, viz3, viz4, pbbarder) func(on novoestado = estadofloresta( estado, pbbarder ) 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 70
Função desenhafloresta 6. Para cada sub-problema (começando pelos mais simples), implementar o respe(vo algoritmo e testar o sub-programa. Problema: Desenho da floresta. Entrada: (matriz) estado da floresta. Saída: nenhuma. É gerado um gráfico. function desenhafloresta(floresta) % desenhafloresta(floresta) % Produz um grafico retangular com a representacao da % matriz floresta. % Cada celula da grelha corresponde a um elemento da % matriz. A cor da celula e : % (0 1 0) verde: se o elemento e 1 (a arvore esta viva); % (1 0 0) vermelha se o elemento e 2 (a arvore a arder); % 80 0 0) preta se o elemento e 3 (a arvore esta morta). mapacores = [ 0 1 0; 1 0 0; 0 0 0 ]; colormap(mapacores); image(floresta); end 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 71
Função estadoarvore [1] 6. Para cada sub-problema (começando pelos mais simples), implementar o respec(vo algoritmo e testar o sub-programa. Problema: Cálculo do próximo estado da árvore. Entrada: (inteiro) arvore, (inteiro) viz1, (inteiro) viz2, (inteiro) viz3, (inteiro) viz4, (real) pbbarder. Saída: (inteiro) novoestado da árvore. Documentação da função function novoestado = estadoarvore(arv,viz1,viz2,viz3,viz4,pbbarder) % novoestado = estadoarvore(arv, viz1, viz2, viz3, viz4, pbbarder) % Calcula o novo estado da arvore com base: % no valor arv, que tem o estado atual da arvore % (1 significa viva, 2 a arder e 3 morta ); % nos valores viz1, viz2, viz3 e viz4, que sao os estados das % arvores vizinhas; % pbbarder, que e a probabilidade de uma arvore viva... end 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 72
Função estadoarvore [2] Problema: Cálculo do próximo estado da árvore. Documentação da função (cont.) function novoestado = estadoarvore(arv,viz1,viz2,viz3,viz4,pbbarder) %... % Se a arvore esta' viva e: % alguma arvore vizinha esta' a arder, a arvore fica a arder; % nenhuma arvore vizinha esta' a arder, % a probabilidade da arvore ficar a arder e' pbbarder e % a probabilidade da arvore continuar viva e' 1 pbbarder. % Se a arvore esta' a arder, morre. % Se a arvore esta' morta, mantem-se nesse estado.... end 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 73
Função estadoarvore [3] Problema: Cálculo do próximo estado da árvore. Caso em que a árvore não está viva function novoestado = estadoarvore(arv,viz1,viz2,viz3,viz4,pbbarder) %... if arv == 1 % se a arvore estiver viva... else % A arvore esta' a arder ou está morta. % Em qualquer caso, fica morta. novoestado = 3; end end 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 74
Números pseudo-aleatórios Para o caso em que a árvore está viva relembrar A função rand retorna números pseudo-aleatórios uniformemente distribuídos no intervalo ]0, 1[. Para obter um número entre: ]0, 1[ rand ou rand( ) ]0, b[ (com 0 < b) b * rand ]a, b[ (com a < b) a + (b a) * rand Para obter uma matriz de L C com elementos entre: ]0, 1[ rand(l, C) 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 75
Função estadoarvore [4] Problema: Cálculo do próximo estado da árvore. Caso em que a árvore está viva function novoestado = estadoarvore(arv,viz1,viz2,viz3,viz4,pbbarder)... if arv == 1 % se a arvore estiver viva if viz1 == 2 viz2 == 2 viz3 == 2 viz4 == 2 % Com alguma arvore vizinha a arder, a arvore fica a arder. novoestado = 2; elseif rand <= pbbarder % A arvore fica a arder com probabilidade pbbarder. novoestado = 2; else % A arvore fica viva com probabilidade 1 pbbarder. novoestado = 1; end... 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 76
Função estadofloresta [1] 6. Para cada sub-problema (começando pelos mais simples), implementar o respe(vo algoritmo e testar o sub-programa. Problema: Cálculo do próximo estado da floresta. Entrada: (matriz) estado, (real) pbbarder. Saída: (matriz) novoestado da floresta. Documentação da função (cont.) function novoestado = estadofloresta( estado, pbbarder) % novoestado = estadofloresta(estado, pbbarder) % Calcula o novo estado da floresta com base: % na matriz estado, que tem o estado atual da floresta; % no valor pbbarder, que e a probabilidade de uma arvore % viva sem vizinhas a arder ficar a arder. % As arvores da fronteira (da primeira/ultima linha/coluna da % matriz estado) nao mudam de estado.... end 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 77
Função estadofloresta [2] E o código para obter o novo estado Tendo em atenção que a fronteira não é alterada function novoestado = estadofloresta( estado, pbbarder) %... numlinhas = size(estado, 1); numcolunas = size(estado, 2); novoestado = estado; % A fronteira nao e' alterada. for i = 2 : numlinhas 1 for j = 2 : numcolunas 1 % Calcula o novo estado da arvore em (i, j)... end end end 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 78
Função estadofloresta [3] E o código para obter o novo estado Actualizando o estado de cada árvore do interior function novoestado = estadofloresta( estado, pbbarder) %... for i = 2 : numlinhas 1 for j = 2 : numcolunas 1 % Calcula o novo estado da arvore em (i, j) aarvore = estado(i, j); vizinha1 = estado(i 1, j); vizinha2 = estado(i+1, j); vizinha3 = estado(i, j 1); vizinha4 = estado(i, j+1);... significa : continua na próxima linha novoestado(i,j) = estadoarvore(aarvore, vizinha1, vizinha2, vizinha3, vizinha4, pbbarder); end end end 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 79
Função incendiofloresta [1] 7. Implementar o algoritmo que resolve o problema e testar o programa pedido. Problema: Incêndio em floresta. Entrada: (matriz) estadoinicial, (real) pbbarder, (inteiro) numpassos. Saída: nenhuma. São gerados numpassos + 1 gráficos. function incendiofloresta( estadoinicial, pbbarder, numpassos ) % % incendiofloresta(estadoinicial, pbbarder, numpassos) % Simula o estado de um conjunto de arvores dispostas numa % grelha rectangular. % Em cada instante, cada arvore esta' num de tres estados: % 1 viva (desenhado a verde); % 2 a arder (desenhado a vermelho); % 3 morta (desenhado a preto). % A simulacao desenha o estado da floresta no estadoinicial e % no fim de cada passo. O numero de passos e' numpassos. % As arvores da fronteira (da primeira/ultima linha/coluna da matriz estadoinicial) nao mudam de estado.... end 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 80
Função incendiofloresta [2] Problema: Incêndio em floresta. Entrada: (matriz) estadoinicial, (real) pbbarder, (inteiro) numpassos. Saída: nenhuma. São gerados numpassos + 1 gráficos. Documentação da função (cont.) function incendiofloresta( estadoinicial, pbbarder, numpassos ) % As arvores transitam de estado simultaneamente. % O novo estado depende do estado da arvore, do estado das % quatro arvores vizinhas (direcoes Norte, Sul, Este e Oeste) % e do valor de pbbarder. % Se a arvore esta' viva e: % alguma arvore vizinha esta' a arder, a arvore fica a arder; % nenhuma arvore vizinha esta' a arder, % a probabilidade da arvore ficar a arder e' pbbarder e % Se a arvore esta' a arder, morre. % Se a arvore esta' morta, mantem-se nesse estado.... end 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 81
Função incendiofloresta [3] Entrada: (matriz) estadoinicial, (real) pbbarder, (inteiro) numpassos. Saída: nenhuma. São gerados numpassos + 1 gráficos. E agora o código Nota: A função não retorna qualquer valor. Apenas produz várias figuras. function incendiofloresta( estadoinicial, pbbarder, numpassos ) %... estado = estadoinicial; figure(1); % criação da figura nº 1 desenhafloresta(estado); for i = 1 : numpassos estado = estadofloresta(estado, pbbarder); figure(i+1); % criação da figura nº i+1 desenhafloresta(estado); end end 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 82
Execução de incendiofloresta [1] >> floresta = ones(20, 20); >> floresta(10, 10) = 2; % início do incêndio >> incendiofloresta(floresta, 0.001, 9) F 1 F 2 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 83
Execução de incendiofloresta [2] F 3 F 4 F 6 F 5 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 84
Execução de incendiofloresta [3] F 6 F 7 F 8 F 9 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 85
Para Estudar esta Aula Manual Octave Capítulo 15, plo ng MATLAB plo ng func(ons hjp://www.mathworks.com/help/matlab/crea(ng_plots/using-highlevel-plo ng-func(ons.html Método Monte Carlo (informal): hjp://en.wikipedia.org/wiki/monte_carlo_method 10 Abril 2017 6: Imagens e Gráficos em Matlab; Método Monte-Carlo 86