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

Post on 17-Apr-2015

106 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Ludwig Krippahl, 2008

Programação para as Ciências Experimentais

2007/8

Teórica 7

Ludwig Krippahl, 2008 2

Na aula de hoje...

Métodos estocásticos (Monte Carlo)• Calculo de áreas

• Integração de funções

Simulação• Contar unidades formadoras de colónias

Trabalho 1 (dúvidas)

Ludwig Krippahl, 2008 3

Monte Carlo

Nome cunhado pelo matemático Nicholas Constantine Metropolis(1915-1999)

Conjunto de métodos baseados em números aleatórios.

Ludwig Krippahl, 2008 4

Calcular uma área

x>1

y<x-1y2+x2<4

Ludwig Krippahl, 2008 5

Calcular uma área

x>1

y<x-1y2+x2<4

Área?

Ludwig Krippahl, 2008 6

Algoritmo

Pontos ao acaso no quadrado -2, 2.

Área?

Ludwig Krippahl, 2008 7

Algoritmo

Contamos os pontos dentro e fora.

Área?

Ludwig Krippahl, 2008 8

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 9

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 10

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 11

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 12

Ludwig Krippahl, 2008 13

Ludwig Krippahl, 2008 14

Ludwig Krippahl, 2008 15

Ludwig Krippahl, 2008 16

Ludwig Krippahl, 2008 17

Implementação

Função areamc:

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

• valor a devolver com a área

Ludwig Krippahl, 2008 18

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 19

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 20

Implementação

Função areamc:

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

• número de pontos a testar

Ludwig Krippahl, 2008 21

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 22

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 23

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 24

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 25

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, 2008 26

Dicas

Mais pontos, mais rigor:

Ludwig Krippahl, 2008 27

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 28

Dicas

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

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

• Área=1.7

Ludwig Krippahl, 2008 29

Integrar função

Ludwig Krippahl, 2008 30

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 31

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 32

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 33

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, 2008 34

Ludwig Krippahl, 2008 35

Contar microorganismos no ar

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

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.

Ar

Ludwig Krippahl, 2008 37

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 38

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 39

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 40

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 41

Implementação

Função

function cs=colonias(buracos,ufcs,tentativas)

• Devolve o número de colónias

Ludwig Krippahl, 2008 42

Implementação

Função

function cs=colonias(buracos,ufcs,tentativas)

• Número de orifícios

Ludwig Krippahl, 2008 43

Implementação

Função

function cs=colonias(buracos,ufcs,tentativas)

• Número de UFCs no ar

Ludwig Krippahl, 2008 44

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 45

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, 2008 46

Implementação

Dois ciclos for:

for a=1:4

for b=1:3

[a,b]

endfor

endfor

Ludwig Krippahl, 2008 47

Implementação

Dois ciclos for:

for a=1:4

for b=1:3

[a,b]

endfor

endfor

Repetido 4 vezes

Ludwig Krippahl, 2008 48

Implementação

Dois ciclos for:

for a=1:4

for b=1:3

[a,b]

endfor

endfor

Repetido 3 vezes cada uma das 4 do ciclo de fora (12 vezes no total)

Ludwig Krippahl, 2008 49

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 50

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, 2008 51

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 52

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 53

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 54

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 55

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 56

Ficha 7

Implementar:• areamc

• colonias

• contaufcs

Ludwig Krippahl, 2008 57

Trabalho 1: Dúvidas

Ludwig Krippahl, 2008 58

Trabalho 1: Estrutura

Ponto Isoeléctrico Polinómios

Ler sequências Ler polinómios

Processar cada uma Processar cada um

Calcular o zero Calcular o zero

Função carga Função polinómio

Ludwig Krippahl, 2008 59

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 60

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 61

Dúvidas

top related