はじめに
数値計算を行う際に地味に困るものの一つとして「単位」がある。メートルとセンチメートルを混同したり、ワットとミリワットを取り違えたりといった凡ミスは、研究や実務で少なからず発生する。
特に物理計算を行っているとかなり長い式になってしまい、細かい部分で計算ミスをすることは一度や二度ではない。
これを避けるために、JuliaにはUnitful.jlというライブラリが存在しており、数値に単位を付与して計算できる仕組みを提供している。
本記事では、自分の備忘録を兼ねてUnitful.jlの基本的な使い方から実際の使用例、そして注意点についてまとめていく。
unitfulとは
Unitful.jlは、Juliaで物理単位を明示的に扱うためのパッケージである。特徴としては以下の点が挙げられる:
- SI単位をはじめとした多くの単位をサポートしている
- 単位付き同士の加減乗除演算が可能
- 異なる単位間の自動変換(例:m → cm)が可能
以下でインストールを行う。
using Pkg
Pkg.add("Unitful")実例
基本的な使い方
using Unitful
# 単位を使う
length = 5u"m" # 長さ 5 m
time = 2u"s" # 時間 2 s
velocity = 10u"m/s" # 速度 10 m/s
# 計算
distance = velocity * time
println(distance) # 20 m
# 単位の変換
d_cm = uconvert(u"cm", distance)
println(d_cm) # 2000 cm以上のように、数値に単位を付与してから単位を自在に変更できる。
また、計算を行ったときに自動で単位同士で計算されている。
実使用例

上記の光学系でReceiverに帰ってくる光量を考える。詳細な式はこちらを参考にしてほしい。
using Unitful
P_tx = 60u"W" # 送信電力 60 W
ρ = 0.2 # 反射率 0.2
τ_tx = 0.9 # 透過率 0.9
η_rx = 0.85 # 受光光学系効率 0.85
A_ap = 2.0e-4u"m^2" # 受光口径面積 2.0e-4 m²
R = 100u"m" # 距離 100 m
θ = 0.0u"rad" # 入射角 0 rad
P_echo(P_tx, ρ, τ_tx, η_rx, A_ap, R, θ) = (P_tx * τ_tx^2 * η_rx * ρ * A_ap * cos(θ)) / (π * R^2)
P_e = P_echo(P_tx, ρ, τ_tx, η_rx, A_ap, R, θ)
println("P_echo = ", P_e)
# P_echo = 5.259752559300958e-8 W以上のような長い式でも問題なく計算できていることが単位系で確認できる。
注意点
たまに単位をめちゃくちゃな理解をすることはある。
v = 36u"h"
v2 = 36*3600u"s"
println(v)
println(v2)
# 36 hours ではなく 36h(plank constant) と解釈される
# 時間として扱いたい場合は 36*3600u"s" とする他にもWを勘違いしたりする。
一部Pkgが使えない場合がある。例えば自分の気に入って使っているPyPlotは使えない。このときは単位を外して使う
using PyPlot
R_list = 100u"m":10u"m":1000u"m"
P_e_list = [P_echo(P_tx, ρ, τ_tx, η_rx, A_ap, R, θ) for R in R_list]
figure()
#plot(R_list, P_e_list)
# → エラー: Unitful は 一部Pkg で扱えない
# その場合は ustrip で単位を外す
plot(ustrip.(u"m",R_list), ustrip.(u"W",P_e_list),)
xlabel("Range (m)")
ylabel("Received Power (W)")
display(gcf())また当たり前ではあるが単位違いの足し算はできない。
1u"m" + 1u"s"
# errorまとめ
・Unitful.jl を使うことで物理単位を付けたまま計算でき、凡ミスを防げる
・光子エネルギーやレーザー出力などの物理計算において特に便利
・自動単位変換や互換性の問題には注意が必要
研究やシミュレーションで数値を扱う際に「単位の整合性」という地味に重要な問題を解決してくれるのがUnitful.jlである。自分の理解を深めつつ、今後も活用していきたい。



コメント