Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Como implementar a máquina de feijões utilizada para aproximar uma distribuição normal?

0 votos
60 visitas
perguntada Jul 30, 2015 em Estatística por danielcajueiro (5,566 pontos)  

A máquina de feijões, inventada por Francis Galton, explora a convergência da distribuição binomial para a distribuição normal. Na versão computacional desse experimento, um pequeno grão é colocado na plateleira mais alta e vai descendo as prateleiras indo para a esquerda ou para a direita com a mesma probabilidade.

Compartilhe

1 Resposta

0 votos
respondida Jul 30, 2015 por danielcajueiro (5,566 pontos)  

Em python, eu escrevi o programa abaixo. Ele é composto de duas partes. A função createBeanMachine cria o gráfico de fundo e a função shelfDynamics lida com a dinâmica das bolas. O movimento das bolas é feito criando-se bolas vermelhas que são apagadas por bolas brancas que são colocadas em cima das primeiras, quando elas mudam de lugar. O uso do pause é fundamental para enxergarmos o movimento.

import matplotlib.pyplot as plt
import numpy as np


# SetFigure
#fig = plt.figure()
plt.figure(num=None, figsize=(8, 16), dpi=80, facecolor='w', edgecolor='k')
plt.hold(True)
plt.axis([0, 45, 0, 85])  


pauseTime=0.1

def createBeanMachine():
    # Cria as retas que delimitam a máquina de feijões

    m=21
    n=m
    xinicial=2
    yinicial=60    
    for i in range(m):
        xi=xinicial
        yi=yinicial
        for j in range(n):
            xf=xi+1
            plt.plot([xi,xf],[yi,yi],'b-')                                          
            xi=xi+2
        xinicial=xinicial+2
        yinicial=yinicial+2
        n=n-2


    xi=1.5
    for i in range(m):
        plt.plot([xi,xi],[0,55],'b-',linewidth=1.0)  
        xi=xi+2


def createBall(x,y):
    plt.plot([x],[y],u'ro',markersize=5, markeredgewidth=0)


def deleteBall(x,y):
    plt.plot([x],[y],u'wo',markersize=8, markeredgewidth=0)    

def shelfDynamics(x,y):
    direction=np.random.uniform(-1,1)
    if(direction<0):
        x=x-2
        y=y-2
        createBall(x,y)
        plt.pause(pauseTime)            
        deleteBall(x,y)
    else:
        x=x+2
        y=y-2
        createBall(x,y)
        plt.pause(pauseTime)            
        deleteBall(x,y)
    return x,y

def xToCount(x):
    return int((x-0.5)/2)



def beanDynamics():
    # Gera a dinâmica do feijão
    stakeHigh=np.zeros(22)
    maxStakeHigh=15
    numberShelfs=11
    plt.pause(20*pauseTime)
    cont=0
    while(np.max(stakeHigh)<55):
        cont=cont+1
        print cont
        x=22.5
        y=81
        createBall(x,y)
        plt.pause(pauseTime)
        deleteBall(x,y)
        for i in range(0,numberShelfs):
            [x, y]=shelfDynamics(x,y)
        while((y-2)>stakeHigh[xToCount(x)]):
            y=y-2
            createBall(x,y)
            plt.pause(pauseTime)            
            deleteBall(x,y)        
        createBall(x,y)    
        stakeHigh[xToCount(x)]=y

if __name__ == '__main__':    

    createBeanMachine()
    beanDynamics()

Com esse código, gerei as seguintes figuras:

A imagem será apresentada aqui.

A imagem será apresentada aqui.

...