数値計算や流体解析など、単位が重要になってくる場合、単位変換させながらの計算が必要となります。
今回は、astropy.unitsを用いて、数値に単位を付与し、単位計算を楽にする方法を紹介します。
基本の使用方法
まずは、簡単な例を参考に基本的な使用方法について解説します。
記述方法
使い方は非常に簡単です。
数字の後に単位を以下のように単位を記載するだけです。単位が揃っていれば、そのまま計算してくれます。
# import
from astropy import units as u
# calculation
length = 10*u.km
t = 5*u.hour
v = length/ t
print(v)
>>> 2 km/h
# import
from astropy import units as u
# calculation
v = 2* u.km/u.hour
t = 5* u.hour
length= v*t
print(length)
>>> 10 km
異なる単位による単位計算(decompose()の使用)
hourとminのように単位が示す量が同じ場合、decompose()の使用することで単位を補正してくれます。デフォルトでは、SI単位に揃うようです。
v = 2* u.km/u.hour
t = 300* u.min
length= v*t
print(length)
>>> 600.0 km min/h
print(length.decompose())
>>> 10000.0 m
# 1h = 60min, 1km = 1000m を自動で変換します。
他にも以下のような単位を制限して、変換することも可能です。
u.Ry.decompose(bases=[u.m, u.N])
>>>Unit("2.17987e-18 m N")
さらには、以下のように .si や .csg を使用することでSI単位やCSG単位に揃えることも可能です。
(1.0 * u.Pa).cgs
>>> 10 P/s
単位の省略表示
以下のように単位の省略表示も可能です。
v = 15.1*u.meter / (32.0*u.second)
print(v)
>>> 0.471875 m/s
v = 15.1*u.m / (32.0*u.s)
print(v)
>>> 0.471875 m/s
表に省略単位の一例を載せました。詳しくはドキュメントをご確認ください。
表. 省略単位の例
項目 | 単位名称 | 省略単位記号 |
温度 | Celsius Fahrenheit Kelvin | deg_C deg_F K |
時間 | second minute hour day | s min hr,h d |
長さ | kilometer meter centimeter millimeter micrometer※ | km m cm mm micron |
※ドキュメントに載っていなくても変換できました。他にもいくつかあるかもしれません。
値と単位のみ取得(.value , .unit)
関数やライブラリによっては、単位が入ると計算できないことがあります。
その際には、.valueや.unitを使用することで値のみ、単位のみを取り出すことができます。
# calculation
v = 2* u.km/u.hour
t = 5* u.hour
length= v*t
print(length.value)
>>> 10.0
print(length.unit)
>>> km
単位変換①(.to())
MPaからPa, kmからmなど、同じ量を示す異なる単位へ変換したいときは、.to() を使用します。
length_km = 1*u.km
length_m = length_km.to(u.m)
print(length_km)
>>> 1.0 km
print(length_m)
>>> 1000.0 m
Pressure_MPa = 1*u.MPa
Pressure_Pa = Pressure_MPa.to(u.Pa)
print(Pressure_MPa)
>>> 1.0 MPa
print(Pressure_Pa)
>>> 1000000.0 Pa
単位変換②( .to( ,equivalencies= ) )
単位によっては、同じ量を示していても同じ量と認識してくれない場合があります。例えば、温度の℃とKは、同じ量であっても.to()だけでは変換してくれません。
そこで、equivalenciesを指定することで変換します。
Temp = 100*u.deg_C
Temp_K = Temp.to(u.K ,equivalencies = u.temperature() )
print(Temp)
>>> 100.0 deg_C
print(Temp_K)
>>> 373.15 K
equivalenciesのモジュールには、u.temperature()以外にも、parallax()、spectral()、molar_mass_amu()などがあります。
モジュールにない場合は、以下のように自分でequivalenciesを定義することで、指定した単位に変換も可能です。
pressure_kgm2_to_MPa = [(u.MPa,u.kg/(u.m*(u.s)**2))]
Pre_MPa = 1.0*u.MPa
Pre_kgms = Pre_MPa.to(u.kg/u.m*(u.s)**2,equivalencies=pressure_kgm2_to_MPa )
print(Pre_kgms)
>>> 1.0 kg / m s2
実戦編
実戦編ということで単位計算が大切になる流体解析として、レイノルズ数を例に計算してみます。
レイノルズ数の計算
流体条件と配管径を指定して、レイノルズ数を計算してみます。
流体解析に便利なfluidsと、水の物性値に関してiapw.iapws97というライブラリを使用しているため、わかりにくいところあるかと思いますが、ご了承ください。
ちなみにfluidsは、単位が付与されていても問題なく、計算できます。一方、iapw.iapws97は単位があるとエラーが出るので、数値のみを取り出して、計算します。
最後のレイノルズ数は無次元になるので、単位が消えれば単位計算は合っているということになります。
from iapws import iapws97 as if97
import numpy as np
import pandas as pd
import math
import fluids
from astropy import units as u
# 流体条件
G = 100*u.kg/u.s
Pw_MPaA = 10.0 *u.MPa #MPaA
Temp = T = 200*u.deg_C
# 配管条件
L_piping = L = 100*u.m
di_piping = di = 0.3112*u.m
#温度単位変換
T_K = T_C.to(u.K, equivalencies = u.temperature())
# 流体の物性値
# iapwsは、単位が付いているとエラーが出るので、数値のみを使用します。
parameter_water = para_w = if97.IAPWS97(T=T.value, P=Pw_MPaA.value)
rho_l = para_w.Liquid.rho*(u.kg/(u.m)**3) #密度
v_l = para_w.Liquid.v*((u.m)**3/u.kg) #比体積
mu_l = para_w.Liquid.mu*(u.Pa*u.s) #粘性
nu_l = para_w.Liquid.nu*((u.m)**2/u.s) #動粘性
#体積流量
Q = G*v_l #m3/s = kg/s・m3/kg
print(round(Q,4))
>>> 0.1148 m3 / s
# 流体流速
v = Q/(np.pi*(di/2)**2) #m/s = m3/s・1/m2)
print(round(v,4))
>>> 1.5095 m / s
#レイノルズ数
Re = fluids.core.Reynolds(V=v, rho=rho_l, mu=mu_l, D=L,nu=nu_l)
print("{:.4}".format(Re,'.1E'))
>>> 9.617e+08 kg / (m Pa s2)
print("{:.4}".format(Re.decompose(),'.1E'))
>>> 9.617e+08
補足
iapw.iapws97については、こちらの記事をご覧ください。
今後、fluidsのライブラリについても解説記事を出す予定です。
まとめ
astropy.unitsを使用することで劇的に単位計算ミスが少なくなります。
慣れれば、非常に使いやすいライブラリです。是非使ってみてください。