View in NBViewer Open in binder Download notebook View source


3.3. Trabalhando com unidades e dimensões em Julia

using Unitful
using UnitfulBuckinghamPi
using Plots
using UnitfulRecipes

Quantidades, unidades e dimensão via Unitful.jl

Comprimento

h0 = 10.0u"m" # quantidade em metros
10.0 m
h0.val # valor da quantidade
10.0
unit(h0) # unidade da quantidade
m
dimension(h0) # dimensão da quantidade
𝐋
typeof(h0) # tipo
Unitful.Quantity{Float64, 𝐋, Unitful.FreeUnits{(m,), 𝐋, nothing}}
uconvert(u"cm", h0) # convertendo para outras unidades (de mesma dimensão)
1000.0 cm

Velocidade

v0 = 3u"m/s"
3 m s⁻¹
deslocamento = 198u"km"; tempo = 1.8u"hr"; velocidade = deslocamento / tempo
110.0 km hr⁻¹

Aceleração

g = -9.8u"m/s^2"
-9.8 m s⁻²

Altura de um corpo em queda livre

h(t, h0, v0) = h0 + v0 * t + g * t^2/2
h (generic function with 1 method)
t = (0:0.02:2.0)u"s" # iterador com unidade
(0.0:0.02:2.0) s
h.(t, h0, v0)
101-element Vector{Unitful.Quantity{Float64, 𝐋, Unitful.FreeUnits{(m,), 𝐋, 
nothing}}}:
                10.0 m
            10.05804 m
            10.11216 m
            10.16236 m
            10.20864 m
  10.251000000000001 m
  10.289439999999999 m
            10.32396 m
  10.354560000000001 m
  10.381239999999998 m
                     ⋮
 -1.0694400000000037 m
 -1.3720400000000037 m
  -1.678560000000001 m
 -1.9890000000000008 m
 -2.3033599999999996 m
 -2.6216399999999993 m
 -2.9438400000000016 m
  -3.269960000000003 m
 -3.6000000000000014 m

Traçando o gráfico da função sobre o intervalo dado

plot(t, t -> h(t, h0, v0))

Traçando o gráfico com os vetores/iteradores de quantidades

plot(t, h.(t, h0, v0))

Embelezando o gráfico

plot(t, h.(t, h0, v0), title="lançamento vertical de um objeto", titlefont=10,
    xlims = (0.0, 4.0), ylims=(0.0, 12.0), label = "altura do objeto", 
    xlabel = "tempo", ylabel="altura")

Operações permitidas

1u"km" + 100u"m" + 10u"ft" + 2u"inch"
2757747//2500 m
1.0u"km" + 13u"inch"
1000.3302 m
3.0u"m" * 2.0u"1/s"
6.0 m s⁻¹
3.0u"m" * u"m/s^2"
3.0 m² s⁻²
u"𝐋" * u"𝐓"
𝐋 𝐓
uconvert(u"hr", 4352.0u"s")
1.208888888888889 hr

Operações proibidas

1.0u"m" + 2.0u"s"
Error: DimensionError: 1.0 m and 2.0 s are not dimensionally compatible.
u"m" + u"m"
Error: MethodError: no method matching +(::Unitful.FreeUnits{(m,), 𝐋, nothi
ng}, ::Unitful.FreeUnits{(m,), 𝐋, nothing})
Closest candidates are:
  +(::Any, ::Any, !Matched::Any, !Matched::Any...) at /Applications/Julia-1
.7.app/Contents/Resources/julia/share/julia/base/operators.jl:655
  +(!Matched::ChainRulesCore.Tangent{P}, ::P) where P at ~/.julia/packages/
ChainRulesCore/GUvJT/src/tangent_arithmetic.jl:146
  +(!Matched::ChainRulesCore.AbstractThunk, ::Any) at ~/.julia/packages/Cha
inRulesCore/GUvJT/src/tangent_arithmetic.jl:122
  ...
1u"m" * u"s" * u"𝐓"
Error: MethodError: no method matching *(::Unitful.Quantity{Int64, 𝐋 𝐓, Uni
tful.FreeUnits{(m, s), 𝐋 𝐓, nothing}}, ::Unitful.Dimensions{(Unitful.Dimens
ion{:Time}(1//1),)})
Closest candidates are:
  *(::Any, ::Any, !Matched::Any, !Matched::Any...) at /Applications/Julia-1
.7.app/Contents/Resources/julia/share/julia/base/operators.jl:655
  *(!Matched::Unitful.Dimensions, ::Unitful.Dimensions...) at ~/.julia/pack
ages/Unitful/SUQzL/src/dimensions.jl:25
  *(!Matched::SpecialFunctions.SimplePoly, ::Any) at ~/.julia/packages/Spec
ialFunctions/oPGFg/src/expint.jl:8
  ...
uconvert(u"g", 10u"m")
Error: DimensionError: g and m are not dimensionally compatible.

Buckingham-Pi

Resolvendo o período do pêndulo via UnitfulBuckinghamPi.jl

# parâmetros
ℓ = 2u"m" # quantidade
g = 9.8u"m/s^2" # quantidade
m = u"g" # unidade
T = u"𝐓" # dimensão
θ = u"NoDims" # "dimensão" adimensional
nothing
# registro
@setparameters ℓ g m T θ
# grupos adimensionais na forma de string
pi_groups(:String)
2-element Vector{String}:
 "g^(1//2)*ℓ^(-1//2)*T^(1//1)"
 "θ^(1//1)"
# grupos adimensionais na forma de expressão do Julia
Π = pi_groups(:Expr)
2-element Vector{Expr}:
 :(g ^ (1 // 2) * ℓ ^ (-1 // 2) * T ^ (1 // 1))
 :(θ ^ (1 // 1))
eval(Π[2])
NoDims
eval(Π[1])
Error: MethodError: no method matching *(::Unitful.Quantity{Float64, 𝐓⁻¹, U
nitful.FreeUnits{(s⁻¹,), 𝐓⁻¹, nothing}}, ::Unitful.Dimensions{(Unitful.Dime
nsion{:Time}(1//1),)})
Closest candidates are:
  *(::Any, ::Any, !Matched::Any, !Matched::Any...) at /Applications/Julia-1
.7.app/Contents/Resources/julia/share/julia/base/operators.jl:655
  *(!Matched::Unitful.Dimensions, ::Unitful.Dimensions...) at ~/.julia/pack
ages/Unitful/SUQzL/src/dimensions.jl:25
  *(!Matched::SpecialFunctions.SimplePoly, ::Any) at ~/.julia/packages/Spec
ialFunctions/oPGFg/src/expint.jl:8
  ...
τ = u"s"
s
@setparameters ℓ g m τ θ
Π = pi_groups()
2-element Vector{Expr}:
 :(g ^ (1 // 2) * ℓ ^ (-1 // 2) * τ ^ (1 // 1))
 :(θ ^ (1 // 1))
eval(Π[1])
2.2135943621178655
eval(Π[2])
NoDims
dimension(eval(Π[1]))
NoDims

Exercícios

  1. Considere a equação \(\tau = 2\pi\sqrt{\ell/g}\) para o período de pêndulo:

    1. Defina a função \(\tau(\ell, g) = 2\pi \sqrt{\ell/g}\) em julia.

    2. Defina um vetor \(\ell\) com unidades de comprimento variando de \(10\,\texttt{cm}\) a \(2\,\texttt{m}\), espaçados de um centímetro.

    3. Defina a constante \(g\) como uma quantidade dimensional apropriada.

    4. Obtenha os valores correspondentes de \(\tau=\tau(\ell,g)\).

    5. Trace o gráfico de \(\tau\) no intervalo considerado de \(\ell\).

  2. Obtenha o grupo adimensional \(T\ell/mv^2\) do exercício da caderno anterior através do pacote UnitfulBuckinghamPi.jl.