ludwig krippahl, 2007 programação para as ciências experimentais 2006/7 teórica 6

72
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Upload: internet

Post on 17-Apr-2015

102 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007

Programação para as Ciências Experimentais

2006/7

Teórica 6

Page 2: 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...)

Page 3: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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)

Page 4: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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.

Page 5: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 5

Calcular uma área

x>1

y<x-1y2+x2<4

Page 6: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 6

Calcular uma área

x>1

y<x-1y2+x2<4

Área?

Page 7: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 7

Algoritmo

Pontos ao acaso no quadrado -2, 2.

Área?

Page 8: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 8

Algoritmo

Contamos os pontos dentro e fora.

Área?

Page 9: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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.

Page 10: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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.

Page 11: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 12: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 13: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 13

Page 14: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 14

Page 15: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 15

Page 16: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 16

Page 17: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 17

Page 18: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 18

Implementação

Função areamc:

function a=areamc(testfn,minx,miny,maxx,maxy,pontos)

• valor a devolver com a área

Page 19: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 20: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 21: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 21

Implementação

Função areamc:

function a=areamc(testfn,minx,miny,maxx,maxy,pontos)

• número de pontos a testar

Page 22: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 23: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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)

Page 24: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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)

Page 25: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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.

Page 26: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 27: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 27

Dicas

Mais pontos, mais rigor:

Page 28: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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)

Page 29: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 29

Dicas

• Em vez de (-2,-2) a (2,2)

usar (1, -2) a (2,1)

• Área=1.7

Page 30: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 30

Integrar função

Page 31: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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:

Page 32: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 33: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 34: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 35: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 35

Page 36: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 36

Contar microorganismos no ar

Bomba aspira ar. Orifícios sobre placa. Contar colónias. Estimar UFCs.

Page 37: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 38: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 39: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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.

Page 40: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 40

Implementação

Função

function cs=colonias(buracos,ufcs,tentativas)

• Devolve o número de colónias

Page 41: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 41

Implementação

Função

function cs=colonias(buracos,ufcs,tentativas)

• Número de orifícios

Page 42: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 42

Implementação

Função

function cs=colonias(buracos,ufcs,tentativas)

• Número de UFCs no ar

Page 43: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 44: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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.

Page 45: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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.

Page 46: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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.

Page 47: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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.

Page 48: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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.

Page 49: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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.

Page 50: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 51: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 52: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 52

Formação de nanoestruturas

Page 53: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 53

Simular difusão em 2D

Movimento aleatório da partícula

Page 54: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 54

Simular difusão em 2D

Superfície maior: cyclic boundary

Page 55: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 56: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 57: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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.

Page 58: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 58

Inicio da trajectória

A partícula vai começar no limite da grelha:

Page 59: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 60: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 61: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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.

Page 62: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 63: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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.

Page 64: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 65: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 65

Implementação

Exemplo

Page 66: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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

Page 67: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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)

Page 68: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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.

Page 69: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 69

Formação de nanoestruturas

Page 70: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 70

Como fazer estes gráficos?

Próxima aula....

Page 71: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

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.

Page 72: Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 6

Ludwig Krippahl, 2007 72

Dúvidas