Informá(ca para as Ciências e Engenharias
Versão : C
(Engenharia Civil)
Aula 6
Pedro Barahona 2016 / 17Sumá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.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
Imagem é composta por píxeis
Píxeis formam letras e números [2]
Representação da cor [1]
l Cor: cada píxel formado por 3
componentes primários.
l RGB:
l Red – vermelho;
l Green – verde;
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)Representação da cor – Exemplos
Cor representada
por 3 valores de 8
bits (True Color)
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 segundoSumá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.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’)
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, ’*’)
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)
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)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’);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.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);
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’);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’);
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.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
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 ];
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.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,
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
30
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 27Monte 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
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:
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.
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.
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 ≤ By:
y ≥ 0 e y ≤ 2r2r
2r
r
r
0
0
R
S
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.Representação gráfica
2r
2r
r
r
0
0
R
S
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.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ó valorResoluçã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.
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.
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:
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,
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ãonumPtsDentro ç numPtsDentro + 1 Acrescentar (x,y) à matriz ptsDentro senão Acrescentar (x,y) à matriz ptsFora retornar: numPtsDentro / numPts * (2*raio)^2, ptsDentro, ptsFora
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.
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
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.
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
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
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
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.
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);
Alguns Testes [1]
>> estimaEDesenhaFatiaCirc(3, 2, 5, 5000)
Alguns Testes [1]
>> estimaEDesenhaFatiaCirc(3, 2, 5, 5000)
Alguns Testes [1]
>> estimaEDesenhaFatiaCirc(3, 2, 5, 100000)
Figura com (3, 0, 6, 100000)
>> pi9 = estimaEDesenhaFatiaCirc(3, 0, 6, 100000) pi9 = 28.281
>> pi9/ 9 ans = 3.1423
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
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.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 ...
• 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;
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 7Sumá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.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);
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
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).
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.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.
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.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.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.
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.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,
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)
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);
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;
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. ...
Função estadoArvore [3]
• Problema: Cálculo do próximo estado da árvore. • Caso em que a árvore não está vivafunction 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
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:
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.
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.
Função estadoFloresta [2]
• E o código para obter o novo estado • Tendo em atenção que a fronteira não é alteradafunction 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
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 :
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.
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.
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
Execução de incendioFloresta [1]
>> floresta = ones(20, 20);
>> floresta(10, 10) = 2; % início do incêndio
>> incendioFloresta(floresta, 0.001, 9)