Skip to content

Montecarlo

O que é o Monte Carlo?

O método de Monte Carlo consiste em simular eventos aleatórios computacionalmente, ele é especialmente útil para casos que uma resposta analítica nem sempre é conhecida. Nessa biblioteca ele é usado para 'repetir' várias vezes o mesmo experimento do laboratório e encontrar a gama de diferentes respostas esperadas, com essa distribuição é possível calcular uma média e um desvio padrão da Medida

LabIFSC2.medida.montecarlo
def montecarlo(func : callable, *parametros : list[Medida]): -> Medida

Propagação de erros usando Monte Carlo

Calcula a média e desvio padrão da densidade de probabilidade de uma função com variáveis gaussianas, também armazena o histograma inteiro dentro de uma Medida

Globals

num_montecarlo : Quantidade de números aleatórios usados (Default=10.000) pode ser alterado globalmente usando num_montecarlo(valor)

Parameters:

Name Type Description Default
func callable

função para a propagação do erro

required
parametros list[Medida]

parâmetros da função definida acima

()

Returns:

Name Type Description
Resultado Medida

Medida com , e histograma

Source code in LabIFSC2/medida.py
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
def montecarlo(func : callable, *parametros):
    '''## Propagação de erros usando Monte Carlo

  Calcula a média e desvio padrão da densidade de probabilidade de uma 
  função com variáveis gaussianas, também armazena o histograma
  inteiro dentro de uma Medida

  Globals:
    num_montecarlo : Quantidade de números aleatórios usados (Default=10.000)
    pode ser alterado globalmente usando num_montecarlo(valor)

  Args:
    func (callable): função para a propagação do erro
    parametros list[Medida]: parâmetros da função definida acima

  Returns:
    Resultado (Medida):  Medida com \(\mu\), \(\sigma\) e histograma
'''
    #from . import num_gaussianos

    N=int(1e4)
    if not callable(func): raise TypeError("Func precisa ser um callable")
    x_samples=np.empty((len(parametros),N))
    for index,parametro in enumerate(parametros):
        if not isinstance(parametro,Medida): 
            raise TypeError("Todos os parametros precisam ser Medidas")
        if not len(parametro.histograma):
            x_samples[index]=np.random.normal(parametro.nominal,
                                              parametro.incerteza,size=N)
        else:
            x_samples[index]=parametro.histograma
    vec_func=np.vectorize(func)
    histograma=vec_func(*x_samples)
    mean=np.mean(histograma)
    std=np.std(histograma)
    return Medida(mean,std,histograma=histograma)

Exemplos

Exemplo com \(sin(xy)\)
    import LabIFSC2 as lab
    import numpy as np
    x=lab.Medida(3,1e-3)
    y=lab.Medida(5,2e-3)
    func=lambda x,y: np.sin(x*y)
    montecarlo(func,x,y) #(-0.65 ± 0.01)
    #Que é o mesmo que fazer
    sin(x*y) #(-0.65 ± 0.01)