Skip to content

Commit

Permalink
testes do MCSamples
Browse files Browse the repository at this point in the history
  • Loading branch information
viniciusdutra314 committed Jan 23, 2025
1 parent 314d34c commit 9e92ae0
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 11 deletions.
4 changes: 3 additions & 1 deletion LabIFSC2/_medida.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@
@obrigar_tipos
def alterar_monte_carlo_samples(novo_valor:int) -> None:
global MCSamples
assert novo_valor>0, "MCSamples deve ser maior que 0"
if novo_valor<=0:
raise ValueError("MCSamples deve ser maior que 0")
MCSamples=novo_valor
return None

Expand All @@ -38,6 +39,7 @@ def montecarlo(func : Callable,*parametros : 'Medida',) -> 'Medida':
resultado=Medida(mean.magnitude,std.magnitude,str(histograma.units))
else:
resultado=Medida(mean,std,"")
resultado._histograma=histograma
return resultado

class Medida:
Expand Down
12 changes: 12 additions & 0 deletions docs/propagacao_de_erros.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
!!! warning
A leitura dessa parte da documentação não é obrigatória para o uso da biblioteca, caso sinta que a matemática/estatística é muito complexa, sinta-se livre para pular. Mas caso queira realmente entender como as coisas funcionam por baixo dos panos essa secção é pra você.




Nesta seção, explicarei em mais detalhes como a biblioteca propaga incertezas, o método usado é mais geral, mas ainda assim compatível com o da apostila. Nos testes unitários da biblioteca, comparamos os erros calculados pelo LabIFSC2 com as bibliotecas [uncertainties](https://pythonhosted.org/uncertainties/) e [LabIFSC](https://github.com/gjvnq/LabIFSC), chegando a um acordo geralmente de \(10^{-3}\) para erros pequenos, onde os métodos devem ser equivalentes.

## Apostila
Expand Down Expand Up @@ -58,6 +64,12 @@ Repare como \(T\) e \(L\) são gaussianas (\(\mu_L=15cm\), \(\sigma_L=1cm\)) e (
Já o histograma de \(g\) é centralizado em \(10m/s²\), mas observe que ele possui uma cauda para a direita. A distribuição não é simétrica, logo, não é gaussiana. Se usássemos \(g\) para outros cálculos, esse desvio de uma gaussiana provavelmente iria se amplificando. Esse fato não é observado no método GUM, que assume linearidade e basicamente tudo é uma gaussiana.


!!! tip
Por padrão a biblioteca utiliza \(N=10^5\) amostras, acredito que esse seja um número que vá satisfazer a maioria das aplicações e não trazer problemas de performance para a biblioteca, mas caso queira alterar esse número é só usar
`alterar_monte_carlo_sample`, por enquanto Medidas com N diferentes não se interagem corretamente (pense o que isso significa), então se quiser mudar esse número é recomendado alterar no começo do código ou as varíaveis usadas só terem escopo dentro dessa alteração do N




[^1]: O método GUM é amplamente utilizado em metrologia e calibragem de equipamentos. Existem diversas referências para quem quiser aprender mais. Eu, pessoalmente, achei um material introdutório e interessante em:

Expand Down
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ extra_javascript:
- https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.4/MathJax.js?config=TeX-AMS-MML_HTMLorMML
markdown_extensions:
- pymdownx.highlight:
- admonition
- pymdownx.inlinehilite
- pymdownx.snippets
- pymdownx.superfences
Expand Down
25 changes: 25 additions & 0 deletions tests/test_MCSamples.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import pytest

from LabIFSC2 import *


def test_operacoes_incompativeis():
x=Medida(10,0.1,'m')
x=x*x
alterar_monte_carlo_samples(10_000)
y=Medida(10,0.1,'m')
y=y*y
with pytest.raises(ValueError):
x+y
with pytest.raises(ValueError):
alterar_monte_carlo_samples(0)
with pytest.raises(ValueError):
alterar_monte_carlo_samples(-3)
def test_especionando_histograma():
alterar_monte_carlo_samples(100_000)
x=Medida(10,0.1,'m')
assert len(x.histograma)==100_000
alterar_monte_carlo_samples(10_000)
y=Medida(10,0.1,'m')
assert len(y.histograma)==10_000
alterar_monte_carlo_samples(100_000)
28 changes: 18 additions & 10 deletions tests/test_doc_gravidade_histograma.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.gridspec import GridSpec
from scipy.stats import norm

from LabIFSC2 import *

Expand All @@ -12,41 +14,47 @@
histograma_L = L.histograma
histograma_T = T.histograma

#(...) bastante matplotlib para ficar bonito
# Configurando o estilo do plot
plt.style.use('ggplot')

# Obtendo os histogramas


# Criando a grade personalizada
fig = plt.figure()
fig = plt.figure(figsize=(10, 8))
gs = GridSpec(2, 2, height_ratios=[1, 1], width_ratios=[1, 1])

# Adicionando os subplots à grade
ax1 = fig.add_subplot(gs[0, 0])
ax2 = fig.add_subplot(gs[0, 1])
ax3 = fig.add_subplot(gs[1, :])


# Função para ajustar e plotar uma gaussiana
def plot_gaussian(ax, data, color):
mu, std = norm.fit(data)
xmin, xmax = ax.get_xlim()
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, mu, std)
ax.plot(x, p, color=color, linestyle='--', linewidth=2)

# Histograma de L
ax1.hist(histograma_L, bins=1000, color='green', alpha=0.7)
ax1.hist(histograma_L, bins=100, color='green', alpha=0.7, density=True)
ax1.set_title('PDF (L)')
ax1.set_xlabel('L (cm)')
ax1.set_ylabel('Frequência')
plot_gaussian(ax1, histograma_L, 'green')

# Histograma de T
ax2.hist(histograma_T, bins=100, color='red', alpha=0.7)
ax2.hist(histograma_T, bins=100, color='red', alpha=0.7, density=True)
ax2.set_title('PDF (T)')
ax2.set_xlabel('T (ms)')
ax2.set_ylabel('Frequência')
plot_gaussian(ax2, histograma_T, 'red')

# Histograma da gravidade
ax3.hist(histograma_g.to('m/s²'), bins=1000, color='blue', alpha=0.7)
ax3.hist(histograma_g.to('m/s²'), bins=100, color='blue', alpha=0.7, density=True)
ax3.set_title(r'PDF ($g=\frac{4\pi^2L}{T^2}$)')
ax3.set_xlabel('g (m/s²)')
ax3.set_ylabel('Frequência')
plot_gaussian(ax3, histograma_g.to('m/s²'), 'blue')

# Ajustando o layout
plt.tight_layout()
plt.savefig("docs/images/gravidade_histograma.jpg",dpi=300)
plt.savefig("docs/images/gravidade_histograma.jpg", dpi=300)

0 comments on commit 9e92ae0

Please sign in to comment.