• Nenhum resultado encontrado

Informá(ca para as Ciências e Engenharias Versão : C (Engenharia Civil) Aula 6. Pedro Barahona 2016 / 17

N/A
N/A
Protected

Academic year: 2021

Share "Informá(ca para as Ciências e Engenharias Versão : C (Engenharia Civil) Aula 6. Pedro Barahona 2016 / 17"

Copied!
86
0
0

Texto

(1)

Informá(ca para as Ciências e Engenharias

Versão : C

(Engenharia Civil)

Aula 6

Pedro Barahona 2016 / 17

(2)

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.

(3)

Cons(tuição do ecrã

•  Ecrã cons(tuído por uma matriz

de píxeis (picture elements).

•  Organizado em L linhas (por

exemplo, 768).

•  Cada linha tem C colunas (por

exemplo, 1024). Píxel(1,1) Píxel(1,C) C colunas L lin has

(4)

Imagem é composta por píxeis

(5)
(6)
(7)

Píxeis formam letras e números [2]

(8)

Representação da cor [1]

l  Cor: cada píxel formado por 3

componentes primários.

l  RGB:

l  Red – vermelho;

l  Green – verde;

(9)

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. http://en.wikipedia.org/wiki/RGB_color_model

R

G

B

(255,255,0)

(10)

Representação da cor – Exemplos

Cor representada

por 3 valores de 8

bits (True Color)

(11)

Controlador do

ecrã

Manipulação do ecrã (simplificado)

Píxel(1,1) Píxel(1,C) Píxel(L,1) Píxel(L, C)

CPU

RAM vídeo (3 bytes cada píxel) CPU escreve bits na memória de vídeo Eletrónica atualiza os píxeis do ecrã 50/60 vezes por segundo

(12)

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.

(13)

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’)

(14)

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, ’*’)

(15)

Gráficos de linhas / funções [1]

•  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. >> 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)

(16)

Gráficos de linhas / funções [1]

•  Para melhorar a qualidade do gráfico usar mais pontos. >> X = 0: pi/16:2pi; >> Y = sin(X); >> plot(X,Y)

(17)

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’);

(18)

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.

(19)

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);

(20)

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’);

(21)

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’);

(22)

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.

(23)

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( [cor1 ; … ; corn] )

em que cori = 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

cor1 = verde; cor2 = vermelho; cor3 = amarelo

§  Para testar outras cores usar, por exemplo:

hjp://www.rapidtables.com/web/color/RGB_Color.htm

(24)

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 ];

(25)

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.

(26)

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,

(27)

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:

e

−x

3

0

1

dx

R

0 0.5 1 1.5 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

(28)

Monte Carlo – Cálculo de áreas

Método para calcular a área AR da região R: 1.  Definir uma região S tal que:

a)  S contém R;

b)  a área de S (AS) é 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 AR é proporcional ao número de pontos que pertemcem a R, pelo que se pode es(mar: AR = ( k / n ) × AS. •  Nota: Os resultados são melhores quando: §  S é uma região contendo R, tão “estritamente ” quanto possível; e

(29)

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:

(30)

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.

(31)

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.

(32)

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

2r

2r

r

r

0

0

R

S

(33)

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.

(34)

Representação gráfica

2r

2r

r

r

0

0

R

S

(35)

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.

(36)

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

(37)

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.

(38)

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 [r1, r2, ..., rn] = nomeFunção( parâmetros )

§  Retorno dos valores r1, r2, ..., rn, possivelmente de (pos diferentes. Nota: [r1, r2, ..., rn] não é um vetor; é uma “lista” de valores.

(39)

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:

(40)

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,

(41)

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

numPtsDentro ç numPtsDentro + 1 Acrescentar (x,y) à matriz ptsDentro senão Acrescentar (x,y) à matriz ptsFora retornar: numPtsDentro / numPts * (2*raio)^2, ptsDentro, ptsFora

(42)

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.

(43)

Função desenha2ConjPts

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.! clf; % apaga graficos das janelas abertas!

plot(conj1(:,1),conj1(:,2),’.r’)! hold on;!

plot(conj2(:, 1), conj2(:, 2), ’.b');!

end!

•  O 2º sub-problema (mais simples) usa os comandos e funções gráficas

(44)

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.

(45)

Função areaFa(aCirc [1]

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.!

...!

•  Para o 1º sub-problema (mais complexo ) começamos pela sua

(46)

Função areaFa(aCirc [2]

function [area, ptsDentro, ptsFora] = ...!

areaFatiaCirc(raio, xEsq, xDir, numPts)!

% ...!

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;!

•  E agora o código

(47)

Função areaFa(aCirc [3]

function [area, ptsDentro, ptsFora] =

areaFatiaCirc(raio, xEsq, xDir, numPts)!

...

for i = 1 : numPts % conta os pontos e atualiza as matrizes

x = xEsq + (xDir - xEsq) * rand;

y = 2 * raio * rand;

if (x − raio)^2 + (y − raio)^2 <= raio^2 % conta

numPtsDentro = numPtsDentro + 1;

ptsDentro = [ptsDentro ; x, y];

else

ptsFora = [ptsFora ; x, y];

end end ... end •  E agora o ciclo FOR 2r 2r r 0 R S xEsq xDir

(48)

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.

(49)

Função es(maEDesenhaFa(aCirc

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);

(50)

Alguns Testes [1]

>> estimaEDesenhaFatiaCirc(3, 2, 5, 5000)

(51)

Alguns Testes [1]

>> estimaEDesenhaFatiaCirc(3, 2, 5, 5000)

(52)

Alguns Testes [1]

>> estimaEDesenhaFatiaCirc(3, 2, 5, 100000)

(53)

Figura com (3, 0, 6, 100000)

>> pi9 = estimaEDesenhaFatiaCirc(3, 0, 6, 100000) pi9 = 28.281

>> pi9/ 9 ans = 3.1423

(54)

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

(55)

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.

(56)

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 ...

(57)

•  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.

Função es(maPi

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;

(58)

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.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 1 2 3 4 5 6 7

(59)

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.

(60)

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);

(61)

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

(62)

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).

(63)

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.

(64)

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.

(65)

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.

(66)

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.

(67)

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.

(68)

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.

(69)

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,

(70)

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)

(71)

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);

(72)

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;

(73)

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. ...

(74)

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

(75)

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:

(76)

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.

(77)

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.

(78)

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

(79)

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);

novoEstado(i,j) = estadoArvore(aArvore, vizinha1, …

vizinha2, vizinha3, vizinha4, pbbArder);

end end

... significa :

(80)

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.

(81)

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.

(82)

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

(83)

Execução de incendioFloresta [1]

>> floresta = ones(20, 20);

>> floresta(10, 10) = 2; % início do incêndio

>> incendioFloresta(floresta, 0.001, 9)

(84)

Execução de incendioFloresta [2]

F 4

F 6

F 5

(85)

Execução de incendioFloresta [3]

F 7

F 8

F 9

(86)

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-high-level-plo‡ng-func(ons.html •  Método Monte Carlo (informal): §  hjp://en.wikipedia.org/wiki/Monte_Carlo_method

Referências

Documentos relacionados

Apesar da utilização da ventilação cruzada, a velocidade do vento (aproximadamente 1,20 m/s) não é suficiente para refrescar toda a sala. Outro ponto abordado foi a questão da

Os estudos originais encontrados entre janeiro de 2007 e dezembro de 2017 foram selecionados de acordo com os seguintes critérios de inclusão: obtenção de valores de

O PCA, Joaquim Ventura, acompanhado de membros do Conselho de Administra- ção, realizou, nos dias 4 e 5 de Junho de 2020, visitas aos aproveitamentos hidro- eléctricos de

A maioria dos casos de doença está associada a ambientes sujeitos a intervenção humana onde temperatura da água é superior, alterando a concentração quer das bactérias quer dos

A cada 03 (três) anos de serviço prestado ininterruptamente à Sulmed, perceberá o médico o adicional mensal de 5% (cinco por cento) do seu salário base.. CLÁUSULA

· 4.3 Indicações sobre cuidados médicos urgentes e tratamentos especiais necessários Não existe mais nenhuma informação relevante disponível.. SECÇÃO 5: Medidas de combate

Com a revogação da norma de isenção e consequente passagem ao regime de tributação, os sujeitos passivos devem indicar, na declaração de alterações, o volume de negócios

Estabelece que em caso de levantamento da suspensão de candidaturas determinada pela Portaria n.º 341/2003, de 29 de Abril, podem ser consideradas elegíveis as