Units of measurement
In this lesson we will learn how to use units of measurement in Julia. We will learn how to convert from one unit to another and we will see how to write functions which can deal with units.
Unitful.jl
The package used to deal with units of measurement in Julia is Unitful.jl
. First of all we need to install Unitful
:
using Pkg
Pkg.add("Unitful")
using Unitful
In order to add units of measurement to numbers we use the notation u"unit"
:
one_meter = 1u"m"
or
one_meter = 1*u"m"
It is possible to convert from one unit to another using uconvert
:
b = uconvert(u"km", one_meter)
>>>b
1//1000 km
>>>one_meter
1 m
As you can see on line 3 and 6, uconvert
won’t change the unit of the argument variable and will return a variable of the desired unit.
In case you want to remove the unit from a variable, you can use ustrip(unit, variable)
: this will first convert the variable
to the desired unit
and then strip the unit.
c = ustrip(u"m", one_meter)
>>>c
1
>>>typeof(c)
Int64
>>>one_meter
1 m
>>>ustrip(u"km", one_meter)
1//1000
If no conversion is need, one can simply type:
>>>ustrip(one_meter)
1
Functions
It is possible to write functions that accept arguments with units without any particular change:
function compute_speed(Δx, Δt)
return Δx/Δt
end
>>>compute_speed(1u"km", 2u"s")
0.5 km s^-1
It is also possible to write functions with type annotations specific for arguments with units. Unitful
provides many abstract types such as Unitful.Length
or Unitful.Time
, which are useful for type annotation of function arguments:
function compute_speed(Δx::Unitful.Length, Δt::Unitful.Time)
return uconvert(u"m/s", Δx/Δt)
end
>>>compute_speed(1u"km", 2u"s")
500.0 m s^-1
Although it may be tempting, it is better to refrain from using abstract types inside type definitions. When defining a struct
, you can use typeof
to get the right type for the annotations:
struct Person
height::typeof(1.0u"m")
mass::typeof(1.0u"kg")
end
Numerical integration
In Julia it is possible to compute integrals numerically taking into account units of measurements. For example, if we integrate a velocity over an interval of time we will get the distance covered:
using QuadGK
velocity(t::Unitful.Time) = 2u"m/s^2"*t + 1u"m/s"
>>>quadgk(velocity, 0u"s", 3u"s")[1]
12.0 m
For a uniformly accelerated motion, the velocity (line 2) is given by:
\[v(t)=a t + v_0\]Here a = 2 m/s^2
.
If we integrate the velocity from t = 0s
to t = 3s
we get the distance covered, which is 12m
in this case. Notice how QuadGK
automatically returns the correct unit (meters).
Conclusions
In this lesson we have learnt how to add units of measurement using Unitful.jl
and how to write functions which naturally use units. Furthermore, we have seen how QuadGK
handles correctly units inside integrals.
If you liked this lesson and you would like to receive further updates on what is being published on this website, I encourage you to subscribe to the newsletter! If you have any question or suggestion, please post them in the discussion below!
Thank you for reading this lesson and see you soon on TechyTok!
Leave a comment