測定単位のチュートリアル
測定単位を Symbolic Math Toolbox™ で使用します。このページでは単位の定義、方程式 (微分方程式を含む) の中での単位の使用、および式の次元の検証方法について示します。
単位の定義と変換
symunit
を使用して単位を読み込みます。
u = symunit;
u.
unit
を使用して単位を指定します。たとえば、5
メートルの距離、50
キログラムの重さ、時速 10
キロメートルの速度を指定します。
d = 5*u.m
d =
w = 50*u.kg
w =
s = 10*u.km/u.hr
s =
タブの拡張を使用して単位の名前を探すことができます。u.
と入力し、"Tab" キーを押して、入力を続けてください。
単位は他のシンボリック式と同じように動作し、あらゆる標準的な演算や関数で使用できます。単位は自動では単純化されず、これにより柔軟性が生まれます。単位の一般的な別名がサポートされています。複数形はサポートされていません。
500
メートルと 2
キロメートルを加えます。結果の距離は、自動では単純化されません。
d = 500*u.m + 2*u.km
d =
simplify
を使用して d
を単純化します。関数 simplify
は返す単位を選択します。
d = simplify(d)
d =
unitConvert
を使用して d
を特定の単位に変換します。d
をキロメートルに変換します。
d = unitConvert(d,u.km)
d =
単位変換と単位系のオプションの詳細については、単位変換と単位系を参照してください。
距離 d
を 50
秒で移動する場合の速度を求めます。結果は正しい単位をもちます。
t = 50*u.s; s = d/t
s =
温度単位を絶対形式と差分形式とで使用する
既定では、温度は絶対測定ではなく差分で表されることを仮定しています。たとえば、5*u.Celsius
は摂氏 5 度の差分温度を表すことを仮定しています。この仮定により温度の値の算術演算が可能になります。
絶対温度を表すにはケルビンを使用し、これにより絶対温度と温度の差分を区別する必要がなくなります。
摂氏 23
度をケルビンに変換して、最初は温度の差分として扱っていた温度を絶対温度として扱います。
u = symunit; T = 23*u.Celsius; diffK = unitConvert(T,u.K)
diffK =
absK = unitConvert(T,u.K,'Temperature','absolute')
absK =
symunit
を使用すると、シンボリック単位の 0
倍の値が無次元 0
として返されるため、cell 配列を使用して 0
度を表すことができます。
たとえば、摂氏 0
度を華氏に変換します。
TC = {0,u.Celsius}; TF = unitConvert(TC,u.Fahrenheit,'Temperature','Absolute')
TF =
次元を検証する
長い式では、単位を視覚的に確認するのは困難です。式の次元は、方程式の次元を検証することで自動的に確認できます。
はじめに運動方程式 を定義します。ここで、 は速度を、 は加速度を、 は距離を表します。 がキロメートルで、他のすべての単位は SI 基本単位であると仮定します。次元の確認を実際に行うために、 の単位を意図的に間違えて設定しています。
syms v v0 a s u = symunit; eqn = (v*u.m/u.s)^2 == (v0*u.m/u.s)^2 + 2*a*u.m/u.s*s*u.km
eqn =
eqn
に出現する単位を findUnits
で観察します。返された単位から、キロメートルとメートルの両方が距離を表現するのに使われていることがわかります。
findUnits(eqn)
ans =
単位が長さや時間のような同じ次元をもっているかを、checkUnits
に入力 'Compatible'
を与えて確認します。MATLAB® では、シンボリック変数が無次元であると仮定されます。checkUnits
は logical 0
(false
) を返します。つまり、これらの単位には互換性がなく、物理的に等しい次元ではないことを意味します。
checkUnits(eqn,'Compatible')
ans = logical
0
eqn
を見ると、加速度 a
の単位が誤っています。単位を修正して互換性を再確認します。ここで、eqn
は互換性のある単位をもちます。
eqn = (v*u.m/u.s)^2 == (v0*u.m/u.s)^2 + 2*a*u.m/u.s^2*s*u.km;
checkUnits(eqn,'Compatible')
ans = logical
1
今度は、各次元が同じ単位で矛盾なく表現されているかどうかを確認するために、checkUnits
に入力 'Consistent'
を与えます。eqn
では距離を表現するのにメートルとキロメートルの両方が使用されているため、checkUnits
は logical 0
(false
) を返します。
checkUnits(eqn,'Consistent')
ans = logical
0
eqn
を SI 基本単位に変換して単位を整合させます。checkUnits
を再実行します。eqn
は互換性と整合性のある単位をもちます。
eqn = unitConvert(eqn,'SI')
eqn =
checkUnits(eqn)
ans = struct with fields:
Consistent: 1
Compatible: 1
単位に関連する作業が終了し、無次元の方程式または式だけが必要になったら、separateUnits
を使用して単位と方程式を分離します。
eqn = separateUnits(eqn)
eqn =
式から数値を計算するには、subs
を使用してシンボリック変数への代入を行い、double
または vpa
を使用して数値に変換します。
eqn
を v
について解きます。次に v
の値を求めます。ここで 、、 です。結果を double 型に変換します。
v = solve(eqn,v);
v = v(2); % choose the positive solution
vSol = subs(v,[v0 a s],[5 2.5 10]);
vSol = double(vSol)
vSol = 223.6627
微分方程式で単位を使用
標準的な式と同じように微分方程式で単位を使用します。このセクションでは、微分方程式での単位の使い方を、加速度の定義 から始まり、速度関係 および を導出することで示します。
加速度の定義を SI 単位を用いてシンボリックに表現します。速度 V
には単位があるため、V
は、単に t
ではなく正しい単位である T = t*u.s
について微分しなければなりません。
syms V(t) a u = symunit; T = t*u.s; % time in seconds A = a*u.m/u.s^2; % acceleration in meters per second eqn1 = A == diff(V,T)
eqn1(t) =
速度 V
は不明で単位もないので、eqn1
の単位には互換性も整合性もありません。
checkUnits(eqn1)
ans = struct with fields:
Consistent: 0
Compatible: 0
初速度が であるという条件で、eqn1
を V
について解きます。結果は方程式 です。
syms v_0
cond = V(0) == v_0*u.m/u.s;
eqn2 = V == dsolve(eqn1,cond)
eqn2(t) =
結果の次元が正しいことを、rhs(eqn2)
を eqn1
に代入し、checkUnits
を使用して確認します。
checkUnits(subs(eqn1,V,rhs(eqn2)))
ans = struct with fields:
Consistent: 1
Compatible: 1
今度は、 を導出します。速度は距離の変化率なので、V
に距離の微分 S
を代入します。この場合も、S
には単位があるため、S
は、単に t
ではなく正しい単位である T = t*u.s
について微分しなければなりません。
syms S(t)
eqn2 = subs(eqn2,V,diff(S,T))
eqn2(t) =
初期地点が 0
という条件で、eqn2
を解きます。expand
を使用して S
を所定の形式で取得します。
cond2 = S(0) == 0; eqn3 = S == dsolve(eqn2,cond2); eqn3 = expand(eqn3)
eqn3(t) =
この単位付きの方程式はシンボリックなワークフローで使用できます。または、rhs
を使って右辺を返してから separateUnits
を使って単位を分離し、その結果得られる単位のない式を使用することで、単位を取り除くことができます。
[S units] = separateUnits(rhs(eqn3))
S(t) =
units(t) =
式から数値を計算する必要があるときは、subs
を使用してシンボリック変数への代入を行い、double
または vpa
を使用して数値に変換します。
8
秒間での移動距離を求めます。ここで、v_0 = 20
、a = 1.3
です。結果を double 型に変換します。
S = subs(S,[v_0 a],[20 1.3]); dist = S(8); dist = double(dist)
dist = 201.6000
参考
checkUnits
| findUnits
| isUnit
| newUnit
| separateUnits
| symunit2str
| unitConversionFactor
| unitConvert