Category Archives: Physics

Building a (fast) low resolution light spectrometer

Motivation

Despite the limitations that a low resolution light spectrometer
has (like the inability to detect the atmosphere absortion bands),
it still can be useful to investigate the light spectrum from
multiple light sources, like the Sun, the Moon, LEDs and mercury lamps.

Methods

The output of a light spectrometer is a wavelength dependent light intensity, to archive this the light to be analysed has to be separated into its constituent wavelength. This separation can be done with a prism or by grating, on this post we will use the second. The working principle can be find here.

Material

– Support box – this will provide the support for the webcam, grating and slit, ensuring that all of them have the proper alignment.

specbox

The main requirements of this box are that the grating support makes a 60 ° angle with the horizontal (we also tried 45 °, but the results were not better) and ensure that the camera always fit exactly on the same place.

– Slit – the slit is in a panel that should fit on the open face of the “box”. It should be very narrow for better resolution of the spectrometer, however the resolution is limited by other factors in this case making less important the width of the slit. We tested with multiple slit widths 0.8mm worked well, less narrow slit adds sensibility to the spectrometer.

slit

– Filter – this setup is missing a collimator mirror, this requires that the light being analysed  is already collimated. The sunlight is nearly collimated and can be analysed directly, but other point light sources need some kid of correction. Failing to apply collimated light will create too many reflections on the grating with disappointing results.

20150809_223002
Filter, 3D printed with transparent PLA

The 3D printed filter is not great, but it is better than no filter.

– Grating – the grating is a surface with very closely spaced holes, this  is not easy to fabricate at home, but an old CD would do, you can also buy a grating on ebay.s_20150809_233101

– Webcam

We used a very cheap webcam (costed ~ 10CHF), a better camera would be a major improvement, this camera has the advange of being very small but has only 0.3 MPixel.

s_20150809_232736

 

All the parts together

Glue a small piece of CD into the grating support, making sure that all the support is covered.

20150809_223019

Fit the silt panel in the open face of the box.

20150810_032953

Finally out the camera and the filter in place.

s_20150809_232943

And the hardware is ready!

The Software

Just a quick python script, using OpenCV for webcam image manipulation and matplotlib for plotting. You can download it at the bottom of the page.

prog
Grating Spectra up and running

The figure above shows the spectrum of a white led. As you can see the resolution is not great, the rainbow looks a bit blur. Despite the blur and aliasing, the spectrum is very clear. Also this spectrometer is very fast, we can analyse 20 spectrum per second!

Downloads:

grat_spectra.py – Python software
box.scad – drawing files for 3D printing.

 

MC e a Regra Metropolis

Featured image: MC e a Regra Metropolis, by Leonardo Casto, icensed under the Creative Commons Attribution-Share Alike 2.5 Generic license.

Viva, já revi um pouco o texto 🙂 aqui está de novo.

Num post anterior fez-se uma pequena introdução ao método Monte Carlo. Aqui a ideia é introduzir os conceitos de importance sampling, detailed balance e apresentar a regra  Metropolis, num contexto emque se pretende calcular a/uma configuração de equilíbrio de um sistema.

Dependendo da dimensão do sistema em estudo, calcular aleatoriamente a energia de cada configuração do mesmo pode ser impraticável. O ideal seria então conseguir reduzir a computação a um conjunto de configurações que mais nos interesse. Assim, o problema passaria por construir uma amostra pesada cuja distribuição de estados seja dada pela distribuição de probabilidade do equilíbrio. Como o fazer?

Mas…mais devagar…

  1. Importance Sampling e Detailed Balance

A probabilidade de transição de um estado a outro, \displaystyle W(x \to x') , adequada, obedece às seguintes características:

1. \displaystyle \text{ergodicidade, } W(x \to x') \neq 0;

2. \displaystyle \text{positividade, } W(x \to x') \geq 0;

3. \displaystyle \text{normalizada (ou normaliz\'avel), }\sum_{x'} W(x \to x') = 1;

4. \displaystyle \sum_{x'} W(x' \to x) P (x' , t) = P (x , t),  \text{ considerando } P(x, t)   \displaystyle \text{ a probabilidade de, no instante }  t\text{, o estado }  x \text{ ocorra.}

Voltando ao referido anteriormente, a ideia subjacente ao importance sampling consiste em efectuar uma amostragem de uma distribuição não uniforme, considerando uma função de distribuição de probabilidade cujo comportamento seja o mais semelhante à função sobre a qual vai ser aplicado o MC. Ou seja, respeitar a distribuição das configurações do sistema e dar maior ênfase às que mais contribuem para o integral – às que correspondem a um maior valor de \displaystyle P(x). Note-se que, deste modo, é possível reduzir a variância do estimador MC.

As probabilidades de transição, ou probabilidade de o sistema transitar do estado onde se encontra para um novo estado, determinam a construção da chamada cadeia de Markov. Uma cadeia de Markov é uma sequência de números aleatórios construída de forma tal que a probabilidade de um determinado valor ocorrer depende apenas do número que ocorreu previamente, ou de outro modo a probabilidade de transição para o estado seguinte depende apenas do estado presente. Diz-se então que a probabilidade está condicionada pelo estado imediatamente anterior, ou ainda que o processo “não guarda (ou não tem) memória” de estados passados.

Assim, pode  construir-se um passeio aleatório (uma sucessão de passos aleatórios) [sobre passeios aleatórios ver [1]] tendo em conta a distribuição de probabilidade \displaystyle P(x) , a definição da probabilidade de transição  \displaystyle W(x \to x') e o conceito de importance sampling.

A evolução de  \displaystyle P(x, t) no tempo fica descrita pela equação cinética Markoviana:

\displaystyle \frac{d}{dt}P(x, t) =\sum_{x'} W(x'\to x) P(x', t) - \sum_{x'} W(x \to x') P(x, t)

No equilíbrio termodinâmico tem-se,

\displaystyle \frac{d}{dt}P(x, t) = 0

e consequentemente a probabilidade de transição deverá satisfazer

\displaystyle W(x'\to x) P(x', t) = W(x \to x') P(x, t) . Esta não é nada mais que a condição de detailed balance.

A condição de detailed balance diz-nos que a probabilidade de transição depende exclusivamente da diferença de energia entre os dois estados em causa – permite a reversibilidade de cada transição.

Como \displaystyle P(x, t) = P_{eq}(x) = Z^{-1}e^{-\beta\Delta H(x)}, sendo \displaystyle Z a função de partição, a condição de detailed balance pode reescrever-se:

\displaystyle \frac{W(x \to x')}{W(x' \to x)} = e^{-\beta\Delta H(x)}, \Delta H(x) = H(x) - H(x')

A propriedade de detailed balance garante a convergência do passeio aleatório para uma distribuição de probabilidade fixa.

  1. A regra Metropolis

A regra Metropolis tem implícita uma amostragem markoviana num sistema em equilíbrio, com uma determinada função de distribuição de probabilidade e definindo como probabilidade de transição o seu quociente, consequência da condição de detailed balance [1]:

 \begin{cases} \frac{1}{\tau} e^{(-\beta\Delta H)}& \quad \text{if } \Delta H > 0 \\ \frac{1}{\tau} & \quad \text{if } \Delta H \leq 0\\ \end{cases}

com  \tau} em unidades de tempo. Sem perda de generalidade considerou-se  \tau} = 1.

A transição é então aceite:

1. incondicionalmente, se a energia diminuir com a transição;

2. no caso de a energia aumentar com a transição, é aceite condicionalmente: se  e−Hx,  gerado aleatoriamente no intervalo ]0, 1[.

O método permite rápida convergência para um estado de equilíbrio uma vez que  aceita sempre a melhor configuração. Ao aceitar ocasionalmente configurações menos óptimas, garante-se o não aprisionamento em mínimos locais. Nota: Deve ter-se em atenção à topologia das barreiras, uma transição de estado assim definida pode ainda conduzir à retenção em mínimos locais. Existem variantes do algoritmo de Metropolis que podem ser aplicadas nestes casos.

MC Metropolis pode ser aplicado ao estudo de diversos problemas como o da simulação de cadeias de moléculas, em particular o estudo do problema de folding de proteínas, abordado anteriormente.

Referências:

Outras…

  • Metropolis, N. (1987). “The beginning of the Monte Carlo method”, Los Alamos Science, Special Issue 15: 125-130 . (PDF)
  • Anderson, Herbert L. (1986). “Metropolis, Monte Carlo and the MANIAC” Los Alamos Science 14: 96–108. (PDF)
  • Eckhardt, Roger (1987). “Stan Ulam, John von Neumann, and the Monte Carlo method” Los Alamos Science, Special Issue  15: 131–137. (PDF)
  • O mistério da forma das proteínas, Patrícia F.N. Faísca, Gazeta da Física, pp. 34-39,  cftc.cii.fc.ul.pt/divulga/Misterio_gazeta.pdf

Este artigo foi  inspirado num trabalho realizado no âmbito da cadeira de Física Computacional (com o meu colega Rui P.),  (2006).

O método de Monte Carlo

[Featured Image credits to  CaitlinJo, CC BY 3.0 (http://creativecommons.org/licenses/by/3.0), via Wikimedia Commons: O método de Monte Carlo]

O método de Monte Carlo (MC), desenvolvido em meados do séc. XX, constitui uma das técnicas de simulação computacional mais utilizadas. Uma simulação por MC visa determinar soluções via análise estocástica recorrendo ao conceito de número aleatório, de modo a que se possa descrever (probabilisticamente) o comportamento de um dado sistema e calcular variáveis de interesse para análise do mesmo. OK…vamos desencriptar isto.

MC recorre ao conceito de número aleatório. Um número aleatório é um número que é escolhido ao acaso. Pode exemplificar-se recorrendo a um dado: quando lançamos um dado obtém-se um número de 1 a 6, mas à partida não sabemos que número sairá visto que cada um tem igual probabilidade de saída. Esta imprevisibilidade de saída determina a aleatoriedade. Se lançarmos o dado várias vezes e formos anotando os números que forem saindo obtemos uma sequência de números aleatórios. Se esta sequência for verdadeiramente aleatória não temos forma de nela decifrar algum padrão que permita a prever o número que se segue. Existem algoritmos computacionais que geram sequências ‘quase’ aleatórias, diz-se quase porque os algoritmos são na realidade deterministas, dependendo das condições iniciais e, em particular, da chamada seed (semente). Estes geradores de números aleatórios designam-se pseudo-aleatórios.

E isto é importante porquê? A implementação de MC passa pela geração de uma sequência de números aleatórios. Vamos aqui apenas requerer que a sequência seja aleatória “o suficiente” para que permita gerar uma distribuição de números uniforme. Tente-se um exemplo….o exemplo canónico simples muitas vezes apresentado quando se fala deste tópico: calcular o valor aproximado de pi. Imaginemos que se quer determinar o valor de π (pi).

Sabemos que a área de uma circunferência de raio r é dada pela expressão π r2. Sabemos ainda que a área de um quadrado de lado l é dado por l2.  Se circunscrevermos uma circunferência de raio r num quadrado (de lado 2r), podemos usar MC para saber a relação entre as área das duas figuras geométricas. Vamos desenhar um quadrado e circunscrever uma circunferência, fazendo 2r=l=1m. Experimentemos mesmo desenhá-lo no chão, e em seguida, vamos atirar pedrinhas (todas iguais) para dentro da área do quadrado (nada pode cair fora), e tente-se que ao atirar se distribuem as pedrinhas uniformemente pela  área do quadrado. Após atirarmos pedrinhas suficientes (muitas!) contam-se as pedrinhas que cairam dentro da circunferência e as que ficam de fora ou seja todas as pedrinhas, para saber o número total (contamos todas as que estão dentro do quadrado).

A relação entre o número de pedrinhas é igual á relação entre as áreas, e assim podemos saber o valor aproximado de π. Vejamos:

\frac{(2r)^2}{\pi\times r^2} = \frac{N_{pedras_ {quadrado}}}{N_{pedras _{circunferencia}} } \Rightarrow \pi =  \frac{4 \times N_{pedras _{circunferencia}}}{N_{pedras _{quadrado}}}

Observe-se a imagem animada no início do artigo. Experimente repetir atirando o dobro das pedrinhas….e, novamente, agora com metade das pedrinhas. O que observa?

A ilustração permite-nos ter uma ideia: quanto mais densa for a distribuição de pedrinhas melhor será a aproximação ao valor de π. Agora tente atirar as pedrinhas sem o ‘cuidado’ de as distribuir uniformemente. Ou imagine apenas que, no caso limite, o mesmo número de pedrinhas ao serem atiradas caiem todas na área da circunferência. Concluir-se-ia que a área do quadrado é igual à área da circunferência, o que constitui uma aproximação bastante grosseira à área de um quadrado e, consequentemente, ao valor de π, neste caso sai directamente π = 4.

Concluímos então que a distribuição de pedrinhas tem que ser o mais uniforme possível, cada ‘atirar uma pedrinha’não pode ou correlacionada com nenhum outro ‘atirar uma pedrinha’…o mais aleatória possível. Então parece que o mais complicado é conseguir arranjar um gerador de números aleatéorios que seja suficientemente bom para permitir melhor exactidão nos resultados.

Na realidade o problema da amostragem de números e sequências aleatórias é central em MC. Como em geral precisamos de muitas (muitas muitas…) pedrinhas se calhar não encontraríamos pedrinhas (nem tempo!) suficientes para nos focarmos no essencial da questão. Como tal, usamos um simples computador, aproveitamo-nos da sua incrível rapidez e capacidade de não se aborrecer ao ter que fazer milhares de contas ‘iguais’ e, recorrendo à nossa linguagem de programação preferida, escrevemos um pequeno programinha.

Para o exemplo acima, usando a linguagem de programação C, podemos escrever:

Gravamos num ficheiro, calcpi.c. Agora é só compilar na shell (ambiente linux)

E chamar o programa

Depois é fazer uns testes….note-se que é muito mais rápido que atirar e contar pedrinhas 😉 No programinha acima confiamos que a função interna da biblioteca math.h – rand() permite-nos obter uma distribuição uniforme de números aleatórios. Cada chamada de rand() devolve um número pseudo aleatório entre 0 e RAND_MAX (no mínimo 32767). A função srand() inicializa o gerador de números aleatórios com a seed (semente) que é dada como argumento, no exemplo usado é usada a função time() que devolve um valor calculado com base na hora actual. Semelhante raciocínio pode ser utilizado se quisermos utilizar o método para calcular o integral definido I de uma função f(x), no intervalo [a, b]. I= \int_{a}^{b}}} f(x)dx O método de Monte CarloAnalogamente ao caso anterior, podemos aproximar o valor do integral atirando pedrinhas para o rectangulo de lados (AB) e (0Y*). E procedendo de modo semelhante na contagem.  I = \frac{N_{f}}{N_{tot}} Y^ {*}(b - a) = \frac{N_{f}}{N_{tot}} A_{rect} Neste caso a condição a verificar para a contagem de Nf consiste em saber se o número aleatório gerado (y = rand()) é menor (ou igual) que o valor da função num ponto (x = rand()) também gerado aleatoriamente: if y <= f(x) then count ++. Concluímos que a exactidão do método depende:

  • do número de pedrinhas — número de iterações. O erro da simulação de MC é proporcional a  1/sqrt(N), sendo N o número de iterações, e N grande ;
  • da aleatoriedade na distribuição das pedrinhas. É suficientemente uniforme? Não correlacionada? Se possível sem repetições. — qualidade do gerador de números aleatórios em gerar uma distribuição uniforme, não correlacionada, e de período longo.

Repare-se que nos exemplos acima todos os pontos da área do rectângulo têm a  mesma importância, cada um contribui com o mesmo peso para o cálculo do integral. Por vezes é útil efectuar uma amostragem mais ‘refinada’ em certas zonas da função que queremos integrar. Por exemplo em zonas onde a função varia mais rapidamente. onde esta é mais  ‘importante’. A este processo chama-se importance sampling. Num proximo post escreverei acerca de um caso particular em que o importance sampling é utilizado – a Regra Metropolis.

Referências:

Outras…

  • Metropolis, N. (1987). “The beginning of the Monte Carlo method”, Los Alamos Science, Special Issue 15: 125-130 . (PDF)
  • Anderson, Herbert L. (1986). “Metropolis, Monte Carlo and the MANIAC” Los Alamos Science 14: 96–108. (PDF)
  • Eckhardt, Roger (1987). “Stan Ulam, John von Neumann, and the Monte Carlo method” Los Alamos Science, Special Issue  15: 131–137. (PDF)

Para desenhar a figura acima recorreu-se a programação em R