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

Post on 17-Apr-2015

102 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

top related