ludwig krippahl, 2007 programação para as ciências experimentais 2006/7 teórica 6
TRANSCRIPT
Ludwig Krippahl, 2007
Programação para as Ciências Experimentais
2006/7
Teórica 6
Ludwig Krippahl, 2007 2
Na aula de hoje...
Anúncios Métodos estocásticos (Monte Carlo)
• Calculo de áreas
• Integração de funções
• Unidades formadoras de colónias
• Formação de nanoestruturas
Trabalho 1 (dúvidas, etc...)
Ludwig Krippahl, 2007 3
Anúncios
Entrega do trabalho 1: dia 27, 9:00h As aulas dessa semana não são para
tirar dúvidas sobre o trabalho 1.
Alunos do P5: combinar aula para compensar o feriado (no final desta)
Ludwig Krippahl, 2007 4
Monte Carlo
Nome cunhado pelo matemático Nicholas Constantine Metropolis(1915-1999)
Conjunto de métodos baseados em números aleatórios.
Ludwig Krippahl, 2007 5
Calcular uma área
x>1
y<x-1y2+x2<4
Ludwig Krippahl, 2007 6
Calcular uma área
x>1
y<x-1y2+x2<4
Área?
Ludwig Krippahl, 2007 7
Algoritmo
Pontos ao acaso no quadrado -2, 2.
Área?
Ludwig Krippahl, 2007 8
Algoritmo
Contamos os pontos dentro e fora.
Área?
Ludwig Krippahl, 2007 9
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, 2007 10
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, 2007 11
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, 2007 12
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, 2007 13
Ludwig Krippahl, 2007 14
Ludwig Krippahl, 2007 15
Ludwig Krippahl, 2007 16
Ludwig Krippahl, 2007 17
Ludwig Krippahl, 2007 18
Implementação
Função areamc:
function a=areamc(testfn,minx,miny,maxx,maxy,pontos)
• valor a devolver com a área
Ludwig Krippahl, 2007 19
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, 2007 20
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, 2007 21
Implementação
Função areamc:
function a=areamc(testfn,minx,miny,maxx,maxy,pontos)
• número de pontos a testar
Ludwig Krippahl, 2007 22
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, 2007 23
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, 2007 24
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, 2007 25
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, 2007 26
Exemplo de utilização
pontos=1000;[a,ds,fs]=areamc("triangcirc",-2,-2,2,2,pontos);hold offaxis("equal") eixos iguaistitle([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, 2007 27
Dicas
Mais pontos, mais rigor:
Ludwig Krippahl, 2007 28
Dicas
Mais pontos, mais rigor. O rectângulo convêm 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, 2007 29
Dicas
• Em vez de (-2,-2) a (2,2)
usar (1, -2) a (2,1)
• Área=1.7
Ludwig Krippahl, 2007 30
Integrar função
Ludwig Krippahl, 2007 31
Integrar função
O integral de f(x)=-exp(x3) não tem solução analítica.
Mas o integral é a área:
Ludwig Krippahl, 2007 32
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, 2007 33
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, 2007 34
Integrar função Para fazer o gráfico:pontos=5000;[a,ds,fs]=areamc("expxcubo",0,0,2,1.2,pontos);clearplotaxis("equal")title([num2str(pontos)," pontos"]);plot(ds(:,1),ds(:,2),"og;;");hold on;plot(fs(:,1),fs(:,2),"or;;");
Ludwig Krippahl, 2007 35
Ludwig Krippahl, 2007 36
Contar microorganismos no ar
Bomba aspira ar. Orifícios sobre placa. Contar colónias. Estimar UFCs.
Ludwig Krippahl, 2007 37
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, 2007 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, 2007 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, 2007 40
Implementação
Função
function cs=colonias(buracos,ufcs,tentativas)
• Devolve o número de colónias
Ludwig Krippahl, 2007 41
Implementação
Função
function cs=colonias(buracos,ufcs,tentativas)
• Número de orifícios
Ludwig Krippahl, 2007 42
Implementação
Função
function cs=colonias(buracos,ufcs,tentativas)
• Número de UFCs no ar
Ludwig Krippahl, 2007 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, 2007 44
Implementação
Dois ciclos for:• número de tentativas e, para cada tentativa
• número de ufcs.
A cada tentativa somar a um contador o número de orifícios marcados.
Ludwig Krippahl, 2007 45
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, 2007 46
Implementação
Como seleccionar o orifício aleatoriamente.• É preciso arredondar:
• round(x) inteiro mais próximo de x
• floor(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, 2007 47
Problema real
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, 2007 48
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, 2007 49
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, 2007 50
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, 2007 51
Formação de nanoestruturas
Controlled Synthesis of 2-D and 3-D Dendritic PlatinumNanostructures, Yujiang Song et al, JACS 23/12/2003
Ludwig Krippahl, 2007 52
Formação de nanoestruturas
Ludwig Krippahl, 2007 53
Simular difusão em 2D
Movimento aleatório da partícula
Ludwig Krippahl, 2007 54
Simular difusão em 2D
Superfície maior: cyclic boundary
Ludwig Krippahl, 2007 55
Simular difusão em 2D
Regras de movimento:• partícula está em x, y.
• escolher aleatoriamente -1, +0, +1 para cada
Ludwig Krippahl, 2007 56
Simular difusão em 2D
Regras de movimento:• partícula está em x, y.
• escolher aleatoriamente -1, +0, +1 para cada
• sai por um lado, entra pelo outro:• se >tamanho, coordenada = 1
• se <1, coordenada = tamanho
• Atenção• round(rand*2) ou floor(rand*3)?
• O round dá 50% de probabilidade de ser 1...
Ludwig Krippahl, 2007 57
Simular difusão em 2D
Função movexy
function [x,y]=movexy(x,y,tamanho)
• Recebe coordenadas x, y e tamanho.
• Devolve coordenadas x, y depois de modificadas.
• Precisa de saber o tamanho para “dar a volta” se a coordenada sai da grelha.
Ludwig Krippahl, 2007 58
Inicio da trajectória
A partícula vai começar no limite da grelha:
Ludwig Krippahl, 2007 59
Inicio da trajectória
A partícula vai começar no limite da grelha:• Escolher x e y ao acaso , entre 1 e tamanho.
• x e y têm que ser inteiros.
• Escolher um r ao acaso entre 0 e 1.
• Conforme o r é <0.25, <0.5, <0.75 ou else x=1, x=tamanho, y=1, y=tamanho
Ludwig Krippahl, 2007 60
Inicio da trajectória
• Conforme o r é <0.25, <0.5, <0.75 ou else x=1, x=tamanho, y=1, y=tamanho
25% probabilidade para cada lado
Ludwig Krippahl, 2007 61
Inicio da trajectória
Função inicio
function [x,y]=inicio(tamanho)
• Recebe o tamanho da grelha e devolve as coordenadas iniciais da partícula geradas aleatoriamente, na fronteira da grelha.
Ludwig Krippahl, 2007 62
Formação de nanoestruturas
A estrutura vai-se formando conforme partículas difundem pela membrana e se agregam.
Algoritmo: quando o movimento de uma partícula a levaria a uma posição da grelha já ocupada, a partícula fica imobilizada como parte da estrutura
Ludwig Krippahl, 2007 63
Implementação
Função crescimento
function parts=crescimento(tamanho,particulas)
• Recebe o tamanho da grelha e o número de partículas na nanoestrutura. Devolve uma matriz de 2 colunas com as coordenadas x e y das partículas na estrutura.
Ludwig Krippahl, 2007 64
Implementação
Exemplotamanho=20;
parts=crescimento(tamanho,40);
title([num2str(length(parts))," particulas"]);
axis([1,tamanho,1,tamanho],"equal");
plot(parts(:,1),parts(:,2),"or;;");
Ludwig Krippahl, 2007 65
Implementação
Exemplo
Ludwig Krippahl, 2007 66
Implementação
Representação da estrutura:• Matriz de duas colunas x, y.
Problema:• Para detectar se uma célula da grelha está
ocupada temos que ver todas as partículas já na estrutura. Isto cada vez que se move uma partícula. Pouco eficiente
Ludwig Krippahl, 2007 67
Implementação
Representação da estrutura:• Matriz de duas colunas x, y.
Solução:• Representar também a grelha com uma
matriz de zeros, de tamanho x tamanho, em que colocamos 1 em cada célula ocupada.
• Para detectar ocupação da célula x, y é só consultar matriz(x,y)
Ludwig Krippahl, 2007 68
Implementação
Função crescimento• Criar grelha e vector partículas
• Colocar a primeira partícula no centro da grelha
• Para cada partícula da segunda em diante:• Usar inicio para escolher o ponto inicial.
• Repetir:• movexy e verificar se novo x, y está ocupado. Se
está guardar o x, y corrente na partícula e marcar a grelha.
Ludwig Krippahl, 2007 69
Formação de nanoestruturas
Ludwig Krippahl, 2007 70
Como fazer estes gráficos?
Próxima aula....
Ludwig Krippahl, 2007 71
Trabalho 1
Parte 1• Quase o mesmo que o zero do polinómio,
mas em vez do polinómio usa a função que calcula o desvio ao equilíbrio.
Parte 3• Quase o mesmo que extrair os elementos da
fórmula química
Partes 2 e 4: usar o resto.
Ludwig Krippahl, 2007 72
Dúvidas