Programação para as
Ciências Experimentais
2007/8
Teórica 7
Ludwig Krippahl, 2008
Na aula de hoje...

Métodos estocásticos (Monte Carlo)

Simulação

Trabalho 1 (dúvidas)
• Calculo de áreas
• Integração de funções
• Contar unidades formadoras de colónias
Ludwig Krippahl, 2008
2
Monte Carlo


Nome cunhado pelo matemático
Nicholas Constantine Metropolis(19151999)
Conjunto de métodos baseados em
números aleatórios.
Ludwig Krippahl, 2008
3
Calcular uma área
y2+x2<4
x>1
y<x-1
Ludwig Krippahl, 2008
4
Calcular uma área
y2+x2<4
x>1
y<x-1
Área?
Ludwig Krippahl, 2008
5
Algoritmo

Pontos ao acaso no quadrado -2, 2.
Área?
Ludwig Krippahl, 2008
6
Algoritmo

Contamos os pontos dentro e fora.
Área?
Ludwig Krippahl, 2008
7
Algoritmo



Contamos os pontos dentro e fora.
A fracção de pontos dentro da área será
a proporção entre a área a medir e a
área do quadrado.
Quanto mais pontos melhor.
Ludwig Krippahl, 2008
8
Implementação

Separar as tarefas:
• Dentro ou fora?
• Uma função que recebe x, y
e devolve true ou
false conforme x, y está dentro da área que
queremos.
• Contar os pontos
• Outra função que recebe o nome da função que
testa, o rectângulo que inclui a área a medir, e o
número de pontos, e devolve a área pretendida.
Ludwig Krippahl, 2008
9
Implementação

Função triangcirc testa se está dentro
do triângulo e circulo
function dentro=triangcirc(x,y)
dentro= ( x^2+y^2<4 && x>1 && y<x-1);
endfunction
Ludwig Krippahl, 2008
10
Implementação

Função areamc:
• devolve área
• recebe
• nome da função teste (string, para o feval)
• mínimos de x e y
• máximos de x e y (definem o rectângulo)
• número de pontos
Ludwig Krippahl, 2008
11
Ludwig Krippahl, 2008
12
Ludwig Krippahl, 2008
13
Ludwig Krippahl, 2008
14
Ludwig Krippahl, 2008
15
Ludwig Krippahl, 2008
16
Implementação

Função areamc:
function
a=areamc(testfn,minx,miny,maxx,maxy,pontos)
•
valor a devolver com a área
Ludwig Krippahl, 2008
17
Implementação

Função areamc:
function
a=areamc(testfn,minx,miny,maxx,maxy,pontos)
•
string com o nome da função que testa cada ponto
Ludwig Krippahl, 2008
18
Implementação

Função areamc:
function
a=areamc(testfn,minx,miny,maxx,maxy,pontos)
•
rectângulo que contêm a área a determinar
Ludwig Krippahl, 2008
19
Implementação

Função areamc:
function
a=areamc(testfn,minx,miny,maxx,maxy,pontos)
•
número de pontos a testar
Ludwig Krippahl, 2008
20
Implementação

Função areamc:
• área (variável a) começa a zero
• calcular a largura e altura do rectângulo
• ciclo para testar o número especificado de
•
pontos.
no final, a área é o número de pontos dentro
a dividir pelo total de pontos e multiplicar pela
área do rectângulo
Ludwig Krippahl, 2008
21
Implementação

Função areamc:
• ciclo para testar o número especificado de
pontos.
• criar coordenadas x,y aleatórias, de minx a maxx,
e miny a maxy respectivamente.
• se feval(testefn, x, y) for verdadeiro então
incrementar a variável a (para contar o número de
pontos dentro da área)
Ludwig Krippahl, 2008
22
Implementação

Para fazer os gráficos:
• Além da área devolver também duas matrizes
com as coordenadas x,y dos pontos dentro e
fora.
function
[a,dentros,foras]=areamc(testfn,minx,miny,
maxx,maxy,pontos)
Ludwig Krippahl, 2008
23
Exemplo de utilização
octave:13> areamc("triangcirc",-2,-2,2,2,1000)
ans = 1.7440
Nota: chamando assim ignora os outros valores
devolvidos, dentros e foras.
Ludwig Krippahl, 2008
24
Exemplo de utilização
pontos=1000;
[a,ds,fs]=areamc("triangcirc",-2,-2,2,2,pontos);
hold off
axis("equal")
eixos iguais
title([num2str(pontos)," pontos"]);
plot(ds(:,1),ds(:,2),"og;;");
hold on;
plot(fs(:,1),fs(:,2),"or;;");
“or;;” – circulo, red, ;; indica que não tem legenda
Ludwig Krippahl, 2008
25
Dicas

Mais pontos, mais rigor:
Ludwig Krippahl, 2008
26
Dicas


Mais pontos, mais rigor.
O rectângulo deve estar o mais próximo
possível da área que queremos.
• Em vez de (-2,-2) a (2,2), usar (1, -2) a (2,1)
Ludwig Krippahl, 2008
27
Dicas
• Em vez de (-2,-2) a (2,2)
usar (1, -2) a (2,1)
• Área=1.7
Ludwig Krippahl, 2008
28
Integrar função
Ludwig Krippahl, 2008
29
Integrar função


O integral de f(x)=exp(-x3) não tem
solução analítica.
Mas o integral é a área:
Ludwig Krippahl, 2008
30
Integrar função

Podemos usar a areamc, só precisamos
de uma função nova:
function dentro=expxcubo(x,y)
dentro=y<=exp(-x^3);
endfunction
Ludwig Krippahl, 2008
31
Integrar função
Basta usar:
areamc("expxcubo",0,0,2,1.2,5000);
ans= 0.89952

Nota: neste caso só é devolvido o primeiro
valor (a).
Ludwig Krippahl, 2008
32
Integrar função
Para fazer o gráfico:
pontos=5000;
[a,ds,fs]=areamc("expxcubo",0,0,2,1.2,pontos);
clearplot
axis("equal")
title([num2str(pontos)," pontos"]);
plot(ds(:,1),ds(:,2),"og;;");
hold on;
plot(fs(:,1),fs(:,2),"or;;");

Ludwig Krippahl, 2008
33
Ludwig Krippahl, 2008
34
Contar microorganismos no ar




Bomba aspira ar.
Orifícios sobre placa.
Contar colónias.
Estimar UFCs.
Ludwig Krippahl, 2008
35
Contar microorganismos no ar

Problema:
• Podem entrar vários esporos ou bactérias
pelo mesmo orifício, resultando numa só
colónia.
Ar
Ludwig Krippahl, 2008
36
Contar microorganismos no ar

Problema:
• Podem entrar vários esporos ou bactérias
•
pelo mesmo orifício, resultando numa só
colónia.
Sabendo o número de colónias na placa,
quantas UFCs no ar?
Ludwig Krippahl, 2008
37
Contar microorganismos no ar

Dividir em 2 fases
• Simular o processo para calcular quantas
•
colónias sabendo o número de UFCs.
Usar a simulação com diferentes valores de
UFCs até que obter o número de colónias
observado.
Ludwig Krippahl, 2008
38
Simulação



Temos N orifícios e X UFCs.
Cada UFC pode entrar por qualquer dos
N orifícios.
O número de colónias será o número de
orifícios diferentes por onde entraram
UFCs
Ludwig Krippahl, 2008
39
Algoritmo



Para cada UFC seleccionar um orifício
aleatoriamente e marcar esse orifício.
Contar o número de orifícios marcados.
Repetir um número grande de vezes
(50, 100, ...) e tirar o valor médio.
Ludwig Krippahl, 2008
40
Implementação
Função
function
cs=colonias(buracos,ufcs,tentativas)

• Devolve o número de colónias
Ludwig Krippahl, 2008
41
Implementação
Função
function
cs=colonias(buracos,ufcs,tentativas)

• Número de orifícios
Ludwig Krippahl, 2008
42
Implementação
Função
function
cs=colonias(buracos,ufcs,tentativas)

• Número de UFCs no ar
Ludwig Krippahl, 2008
43
Implementação
Função
function
cs=colonias(buracos,ufcs,tentativas)

• Número de vezes que repete a simulação
para calcular a média
Ludwig Krippahl, 2008
44
Implementação

Dois ciclos for:

A cada tentativa somar a um contador o
número de orifícios marcados.
• número de tentativas e, para cada tentativa
• número de ufcs.
Ludwig Krippahl, 2008
45
Implementação
Dois ciclos for:
for a=1:4
for b=1:3
[a,b]
endfor
endfor

Ludwig Krippahl, 2008
46
Implementação
Dois ciclos for:
for a=1:4
for b=1:3
[a,b]
endfor
endfor

Ludwig Krippahl, 2008
Repetido 4 vezes
47
Implementação
Dois ciclos for:
for a=1:4
for b=1:3
[a,b]
endfor
endfor

Ludwig Krippahl, 2008
Repetido 3 vezes
cada uma das 4
do ciclo de fora
(12 vezes no total)
48
Implementação


Os orifícios podem ser representados
como um vector de zeros, e marcados
com 1.
O total de orifícios marcados é o
somatório do vector.
Ludwig Krippahl, 2008
49
Implementação

Como seleccionar o orifício
aleatoriamente.
• É preciso arredondar:
• round(x)
• floor(x)
inteiro mais próximo de x
maior inteiro menor que x
ix=floor(rand*buracos)+1; (de 1 a buracos)
Nota: o rand nunca devolve 1. Ver help.
Ludwig Krippahl, 2008
50
Implementação
Exemplo: 10 orifícios e 3 UFCs,
[0 0 0 0 0 0 0 0 0 0] inicio, todos vazios
[0 0 1 0 0 0 0 0 0 0] 3
[0 0 1 0 0 0 1 0 0 0] 5
[0 0 1 0 0 0 1 0 0 0] 3

2 Colónias
Ludwig Krippahl, 2008
51
Problema real: saber UFCs


A função colonias dá-nos o número de
colónias formadas na placa sabendo as
UFCs no ar.
O problema real é o inverso: as colónias
na placa é o que se observa, e o que
queremos saber é as UFCs do ar.
Ludwig Krippahl, 2008
52
Algoritmo


O número de colónias será sempre igual
ou inferior ao número de UFCs no ar.
Começar por UFCs= colónias, e ir
incrementando os UFCs até obter da
função colonias o número certo de
colónias.
Ludwig Krippahl, 2008
53
Implementação

Função contaufcs
function
u=contaufcs(buracos,cs,tentativas)
• Recebe o número de orifícios, colónias
observadas, e o número de tentativas para
estimar as colónias para cada valor de u.
Ludwig Krippahl, 2008
54
Implementação

Função contaufcs
• u = cs
• Enquanto o número estimado de colónias for
•
inferior a cs, incrementar u e recalcular a
estimativa
Para estimar o número de colónias em função
de u usar a função colonias, com o número
de tentativas no argumento do contaufcs
Ludwig Krippahl, 2008
55
Ficha 7

Implementar:
• areamc
• colonias
• contaufcs
Ludwig Krippahl, 2008
56
Trabalho 1: Dúvidas
Ludwig Krippahl, 2008
57
Trabalho 1: Estrutura
Ponto Isoeléctrico
Ler sequências
Processar cada uma
Calcular o zero
Função carga
Ludwig Krippahl, 2008
Polinómios
Ler polinómios
Processar cada um
Calcular o zero
Função polinómio
58
Trabalho 1: Cálculo das cargas
Ponto Isoeléctrico
Polinómios
Função carga
Função polinómio
pH
X
Ler pKas.txt
Multiplicar coefs.
Consultar a tabela
Calcular cadeias laterais
Adicionar NH3 e COOH
Ludwig Krippahl, 2008
59
Trabalho 1: Cálculo da carga
pH = pKa + log (A/AH)
A + AH = 1
Resolvendo:
x = 10^(pH-pKa)
A= x/(1+x)
AH= 1-A
Carga média = A*CD + AH * (CD+1)
(CD é a carga da forma desprotonada)
Ludwig Krippahl, 2008
60
Dúvidas
Ludwig Krippahl, 2008
61
Download

Slides