610 likes | 701 Views
Programação para as Ciências Experimentais 2007/8. Teórica 7. 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). Monte Carlo.
E N D
Programação para as Ciências Experimentais2007/8 Teórica 7 Ludwig Krippahl, 2008
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)
Monte Carlo • Nome cunhado pelo matemático Nicholas Constantine Metropolis(1915-1999) • Conjunto de métodos baseados em números aleatórios.
Calcular uma área x>1 y2+x2<4 y<x-1
Calcular uma área x>1 y2+x2<4 y<x-1 Área?
Algoritmo • Pontos ao acaso no quadrado -2, 2. Área?
Algoritmo • Contamos os pontos dentro e fora. Área?
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.
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.
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
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
Implementação • Função areamc: functiona=areamc(testfn,minx,miny,maxx,maxy,pontos) • valor a devolver com a área
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
Implementação • Função areamc: function a=areamc(testfn,minx,miny,maxx,maxy,pontos) • rectângulo que contêm a área a determinar
Implementação • Função areamc: function a=areamc(testfn,minx,miny,maxx,maxy,pontos) • número de pontos a testar
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
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)
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)
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.
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
Dicas • Mais pontos, mais rigor:
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)
Dicas • Em vez de (-2,-2) a (2,2) usar (1, -2) a (2,1) • Área=1.7
Integrar função • O integral de f(x)=exp(-x3) não tem solução analítica. • Mas o integral é a área:
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
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).
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;;");
Contar microorganismos no ar • Bomba aspira ar. • Orifícios sobre placa. • Contar colónias. • Estimar UFCs.
Contar microorganismos no ar • Problema: • Podem entrar vários esporos ou bactérias pelo mesmo orifício, resultando numa só colónia. Ar
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?
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.
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
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.
Implementação • Função functioncs=colonias(buracos,ufcs,tentativas) • Devolve o número de colónias
Implementação • Função function cs=colonias(buracos,ufcs,tentativas) • Número de orifícios
Implementação • Função function cs=colonias(buracos,ufcs,tentativas) • Número de UFCs no ar
Implementação • Função function cs=colonias(buracos,ufcs,tentativas) • Número de vezes que repete a simulação para calcular a média
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.
Implementação • Dois ciclos for: for a=1:4 for b=1:3 [a,b] endfor endfor
Implementação • Dois ciclos for: for a=1:4 for b=1:3 [a,b] endfor endfor Repetido 4 vezes
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)
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.
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.