Skip to content

Repository files navigation

Build StatusCodecovPyPI - Python VersionGitHub - LicensePyPI - Version

LabIFSC

Uma biblioteca para Python 2 e Python 3 para propagação de erro e conversão de unidades utilizando os métodos (um tanto insólitos) que os professores de lab de física do IFSC-USP insistem.

Sumário

  1. Instalação
    1. PIP
    2. Manualmente
  2. Uso
    1. O Básico
    2. Comparações
    3. Propagação de Erro
    4. Unidades
    5. Formatação de Números
    6. Sequências e Tabelas

Instalação

PIP

Em um terminal, basta executar um dos seguintes comandos para instalar ou atualizar a LibIFSC:

pip2 install -U LabIFSC --user --upgrade (para quem usa Python 2)

pip3 install -U LabIFSC --user --upgrade (para quem usa Python 3)

pip install -U LabIFSC --user --upgrade (para quem não sabe qual versão do Python está usando)

Manualmente

Caso o PIP não esteja disponível ou não funcione, é possível utilizar a LabIFSC simplesmente colocando a pasta LabIFSC dentro da pasta em que o seu script está. Exemplo:

─┬ Minha pasta qualquer
├─ Relatório.tex
├─ Relatório.pdf
├─ Foto1.jpg
┊
├─ meu script.py
└┬ LabIFSC
├─ __init__.py
├─ geral.py
├─ lista_de_unidades.py
├─ matematica.py
├─ medida.py
├─ tabela.py
└─ unidade.py

Download da Última Versão (.zip)

Lista de Todas as Versões

Uso

O Básico

Para utilizar essa biblioteca:

fromLabIFSCimport*

A principal classe é a Medida. Ela pode ser inicializada de diversas formas como mostrado abaixo. (Note que todas essas medidas são iguais, o que muda é a apenas o formato)

# A unidade é sempre opcionalm=Medida((130, 27), "m") # Medida((valor nominal, erro), unidade)m=Medida("130+-27", "m") # Medida(valor+-erro, unidade)m=Medida("130+/-27", "m") # Medida(valor+/-erro, unidade)m=Medida("130±27", "m") # Medida(valor±erro, unidade)m=Medida("130(27)", "m") # Medida(valor(erro), unidade)

Também podemos usar a abreviatura M(), a qual funciona de forma bem parecida:

m=M((130, 27), "m") # Medida((valor nominal, erro), unidade)m=M("130+-27", "m") # Medida(valor+-erro, unidade)m=M("130+/-27", "m") # Medida(valor+/-erro, unidade)m=M("130±27", "m") # Medida(valor±erro, unidade)m=M("130(27)", "m") # Medida(valor(erro), unidade)

No entanto, M() também nos permite criar listas de medidas com facilidade:

x=M([7, 15, 28, 42, 49, 61], incerteza=1, unidade="cm")
y=M(["1", "2", "3", "4", "4", "6"], incerteza=0.01, unidade="s")
z=M(["7+-1", "15+/-0.1", "28±10", "42(3)", 49, 61], unidade="kg", incerteza=0.01)

Uma instância de Medida tem os seguintes atributos:

m=Medida("130±27", "ft")
print(m.nominal) # 130.0print(m.incerteza) # 27.0print(m.si_nominal) # 39.64print(m.si_incerteza) # 8.2296

Os valores prefixados com si_ estão em unidades do MKS, ou seja: metro, radiano, quilograma, segundo, Kelvin, Ampère e mol. As dimensões físicas são, respectivamente: comprimento (L), ângulo (A), massa (M), tempo (T), temperatura (K), corrente (I) e "número" (N). Quando uma medida é adimensional, usa-se ∅ como mostrado no excerto abaixo:

# Lembre-se que lb é o símbolo para libras/poundsM("1") # <1.0±0.0 = 1.0±0.0 ∅>M("1", "lb/kg") # <1.0±0.0 lb kg⁻¹ = 0.45359237±0.0 ∅>

Também é possível converter uma medida para sua equivalente no SI usando o método .SI() como no exemplo abaixo:

M("1+-0.1", "ft").SI() # <0.3048±0.03048 m = 0.3048±0.03048 L1>

Comparações

As comparações entre medidas não comparam os valores em si, mas sim verificam se as medidas são estatisticamente equivalentes.

A equação que determina se duas medidas são equivalentes é: |x₁ - x₂| ≤ 2(σ₁ + σ₂). Já a equação~que determina não equivalência é |x₁ - x₂| > 3(σ₁ + σ₂).

Cuidado deve ser tomado já que duas medidas podem não ser iguais nem diferentes ao mesmo tempo.

m1=Medida("100+/-7")
m2=Medida("110+/-3")
m1==m2# Truem1!=m2# False
m1=Medida("100+/-7")
m2=Medida("125+/-3")
m1==m2# Falsem1!=m2# False
m1=Medida("100+/-7")
m2=Medida("131+/-3")
m1==m2# Falsem1!=m2# True

Propagação de Erro

A propagação de erro é feita automaticamente nas seguintes operções: +, -, *, /, **.

m1=Medida("20+/-1")
m2=Medida("4+/-2")
print(m1+m2) # 24±3print(m1-m2) # 16±3print(m1*m2) # 80±40print(m1/m2) # 5±3print(m1**4) # 160000±30000print(3**m2) # 81±200print(m1**m2) # Erro

Infelizmente, não há propagação de erro automática nas funções da biblioteca math, porém, a LabIFSC provê as seguintes funções com propagação de erro:

m1=Medida("20+/-1.5")
print(cos(m1)) # 0±1print(sin(m1)) # 0.9±0.6print(tan(m1)) # 2±9print(cot(m1)) # 0±2print(sec(m1)) # 2±8print(csc(m1)) # 2.2±0.7print(arc_cos(m1)) # 0.8±0.1 radprint(arc_sin(m1)) # 0.8±0.1 radprint(arc_tan(m1)) # 0.6±0.1 radprint(log(m1)) # 2.73±0.07print(log10(m1)) # 1.30±0.03print(log2(m1)) # 4.3±0.1print(ln(m1)) # 3±0.08print(sqrt(m1)) # 4.5±0.2print(cbr(m1)) # 2.71±0.0

Unidades

Todas as medidas podem ter um parâmetro adicional de unidade após o valor. Por exemplo:

m1=Medida("1+/-0.001", "m")
m2=Medida("1+/-0.001", "ft")
m3=Medida("1+/-0.02", "s")

(O arquivo LabIFSC/lista_de_unidades.py contém todas as unidades suportadas por esta biblioteca.)

As contas de soma e subtração sempre ficam nas unidades do primeiro argumento nas operações, exceto quando o primeiro argumento for adimensional. Neste caso, as unidades serão as do segundo argumento.

Já as contas de multiplicação e divisão simplesmente combinam as unidades.

# Lembre-se que ft é o símbolo para pésprint(m1+m2) # 2.610±0.001 mprint(m2+m1) # 5.586±0.004 ftprint(m1-m2) # -0.610±0.001 mprint(m2-m1) # -3.586±0.004 ftprint(m1*m2) # 1.000±0.002 ft mprint(m2*m1) # 1.000±0.002 ft mprint(m1/m2) # 1.000±0.002 m ft⁻¹print(m2/m1) # 1.000±0.002 ft m⁻¹print(m1*m3) # 1.00±0.02 m sprint(m1/m3) # 1.00±0.02 m s⁻¹

Para converter as unidades:

m4=m1*m2/m3print(m4.converta("m^2 s^-1")) # 1.610±0.007 m² s⁻¹print(m4.converta("m^2/s")) # 1.610±0.007 m² s⁻¹

Formatação de Números

Uma mesma Medida pode ser impressa de diferentes formas:

m1=Medida("1.23456789+/-0.015", "m lb/s")
# Formatação padrão, do jeito que os profs de lab gostamprint(m1) # 1.23±0.02 m lb s⁻¹print(str(m1)) # 1.23±0.02 m lb s⁻¹print("{}".format(m1)) # 1.23±0.02 m lb s⁻¹# Representação do objeto Medida. Temos o valor original à esquerda e o valor no SI, bem como a dimensão física, à direitaprint(m1.__repr__()) # <1.23456789±0.015 m lb s⁻¹ = 0.5599905751509993±0.00680388555 L1M1T-1>print("{:repr}".format(m1)) # <1.23456789±0.015 m lb s⁻¹ = 0.5599905751509993±0.00680388555 L1M1T-1># Diferentes estilos de representação com o arredondamento padrão (arredondamento ifsc)print("{}".format(m1)) # 1.23±0.02 m lb s⁻¹print("{:-}".format(m1)) # 1.23±0.02 m lb s⁻¹print("{:latex}".format(m1)) # 1.23\pm0.02\textrm{ m lb s^-1}print("{:siunitex}".format(m1)) # 1.23±0.02 m lb s⁻¹print("{:txt}".format(m1)) # 1.23+/-0.02 m lb s^-1# Diferentes estilos de representação com o arredondamento do ifscprint("{}".format(m1)) # 1.23±0.02 m lb s⁻¹print("{:-,ifsc}".format(m1)) # 1.23±0.02 m lb s⁻¹print("{:latex,ifsc}".format(m1)) # 1.23\\pm0.02\\textrm{ m lb s^-1}print("{:siunitex,ifsc}".format(m1)) # 1.23±0.02 m lb s⁻¹print("{:txt,ifsc}".format(m1)) # 1.23+/-0.02 m lb s^-1# Diferentes estilos de representação sem arredondamentoprint("{:-,full}".format(m1)) # 1.23456789±0.015 m lb s⁻¹print("{:latex,full}".format(m1)) # 1.23456789\\pm0.015\\textrm{ m lb s^-1}print("{:siunitex,full}".format(m1)) # 1.23456789±0.015 m lb s⁻¹print("{:txt,full}".format(m1)) # 1.23456789+/-0.015 m lb s^-1# Diferentes estilos de representação com o arredondamento do ifsc usando 10^-2 como baseprint("{:-,ifsc,-2}".format(m1)) # (123±2)×10⁻² m lb s⁻¹print("{:latex,ifsc,-2}".format(m1)) # (123\pm2)\cdot10^{-2}\textrm{ m lb s^-1}print("{:siunitex,ifsc,-2}".format(m1)) # (123±2)×10⁻² m lb s⁻¹print("{:txt,ifsc,-2}".format(m1)) # (123+/-2)*10^-2 m lb s^-1# Diferentes estilos de representação sem arredondamento usando 10^-2 como baseprint("{:-,full,-2}".format(m1)) # (123.45678899999999±1.5)×10⁻² m lb s⁻¹print("{:latex,full,-2}".format(m1)) # (123.45678899999999\pm1.5)\cdot10^{-2}\textrm{ m lb s^-1}print("{:siunitex,full,-2}".format(m1)) # (123.45678899999999±1.5)×10⁻² m lb s⁻¹print("{:txt,full,-2}".format(m1)) # (123.45678899999999+/-1.5)*10^-2 m lb s^-1

Sequências e Tabelas

Essa biblioteca provê funções para calcular média, desvio padrão e linearização de dados. Mais detalhes estão no exemplo abaixo:

x=M(["147.0", "161.8", "174.6", "161.01", "175.6", "166.0"], incerteza=0.1, unidade="cm")
print(media(x)) # 160±10 cmprint(media(x, incerteza="desvio padrão")) # 160±10 cmprint(media(x, incerteza="propagação")) # 164.3±0.1 cmprint(desvio_padrao(x)) # 10.516907815513074x=M(["7", "15", "28", "42", "49", "61"], incerteza=1, unidade="cm")
y=M(["1", "2", "3", "4", "4", "6"], incerteza=0.01, unidade="s")
linearize(x, y, imprimir=True)
x[1] =x[1].converta("m")
x[2] =x[2].converta("km")
linearize(x, y, imprimir=True)
# Note que, mesmo com unidades diferentes, as linearizações tem o mesmo resultado

About

Uma biblioteca em python para propagação de erro e conversão de unidades utilizando os métodos que os professores de lab de física do IFSC-USP insistem.

Resources

Stars

18 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages