Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 7
Ludwig Krippahl, 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, Monte Carlo Nome cunhado pelo matemático Nicholas Constantine Metropolis( ) Conjunto de métodos baseados em números aleatórios.
Ludwig Krippahl, Calcular uma área x>1 y<x-1 y 2 +x 2 <4
Ludwig Krippahl, Calcular uma área x>1 y<x-1 y 2 +x 2 <4 Área?
Ludwig Krippahl, Algoritmo Pontos ao acaso no quadrado -2, 2. Área?
Ludwig Krippahl, Algoritmo Contamos os pontos dentro e fora. Área?
Ludwig Krippahl, 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, 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, Implementação Função triangcirc testa se está dentro do triângulo e circulo function dentro=triangcirc(x,y) dentro= ( x^2+y^2 1 && y<x-1); endfunction
Ludwig Krippahl, 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,
Ludwig Krippahl,
Ludwig Krippahl,
Ludwig Krippahl,
Ludwig Krippahl,
Ludwig Krippahl, Implementação Função areamc: function a=areamc(testfn,minx,miny,maxx,maxy,pontos) valor a devolver com a área
Ludwig Krippahl, 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, 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, Implementação Função areamc: function a=areamc(testfn,minx,miny,maxx,maxy,pontos) número de pontos a testar
Ludwig Krippahl, 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, 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, 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, Exemplo de utilização octave:13> areamc("triangcirc",-2,-2,2,2,1000) ans = Nota: chamando assim ignora os outros valores devolvidos, dentros e foras.
Ludwig Krippahl, 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, Dicas Mais pontos, mais rigor:
Ludwig Krippahl, 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, Dicas Em vez de (-2,-2) a (2,2) usar (1, -2) a (2,1) Área=1.7
Ludwig Krippahl, Integrar função
Ludwig Krippahl, Integrar função O integral de f(x)=exp(-x 3 ) não tem solução analítica. Mas o integral é a área:
Ludwig Krippahl, 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, Integrar função Basta usar: areamc("expxcubo",0,0,2,1.2,5000); ans= Nota: neste caso só é devolvido o primeiro valor (a).
Ludwig Krippahl, 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,
Ludwig Krippahl, Contar microorganismos no ar Bomba aspira ar. Orifícios sobre placa. Contar colónias. Estimar UFCs.
Ludwig Krippahl, 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, 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, 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, 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, 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, Implementação Função function cs=colonias(buracos,ufcs,tentativas) Devolve o número de colónias
Ludwig Krippahl, Implementação Função function cs=colonias(buracos,ufcs,tentativas) Número de orifícios
Ludwig Krippahl, Implementação Função function cs=colonias(buracos,ufcs,tentativas) Número de UFCs no ar
Ludwig Krippahl, 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, 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, Implementação Dois ciclos for: for a=1:4 for b=1:3 [a,b] endfor
Ludwig Krippahl, Implementação Dois ciclos for: for a=1:4 for b=1:3 [a,b] endfor Repetido 4 vezes
Ludwig Krippahl, Implementação Dois ciclos for: for a=1:4 for b=1:3 [a,b] endfor Repetido 3 vezes cada uma das 4 do ciclo de fora (12 vezes no total)
Ludwig Krippahl, 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, 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, Implementação Exemplo: 10 orifícios e 3 UFCs, [ ] inicio, todos vazios [ ]3 [ ]5 [ ]3 2 Colónias
Ludwig Krippahl, 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, 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, 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, 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, Ficha 7 Implementar: areamc colonias contaufcs
Ludwig Krippahl, Trabalho 1: Dúvidas
Ludwig Krippahl, Trabalho 1: Estrutura Ponto IsoeléctricoPolinómios Ler sequênciasLer polinómios Processar cada umaProcessar cada umCalcular o zero Função cargaFunção polinómio
Ludwig Krippahl, Trabalho 1: Cálculo das cargas Ponto IsoeléctricoPolinómios Função cargaFunção polinómio pHX Ler pKas.txtMultiplicar coefs. Consultar a tabela Calcular cadeias laterais Adicionar NH3 e COOH
Ludwig Krippahl, 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, Dúvidas