NO IMAGE

【Python,astropy.units】astropy.unitsを用いた単位付与と単位計算

数値計算や流体解析など、単位が重要になってくる場合、単位変換させながらの計算が必要となります。
今回は、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を使用することで劇的に単位計算ミスが少なくなります。

慣れれば、非常に使いやすいライブラリです。是非使ってみてください。

NO IMAGE
最新情報をチェックしよう!