ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

測定単位のチュートリアル

測定単位を Symbolic Math Toolbox™ で使用します。このページでは単位の定義、方程式 (微分方程式を含む) の中での単位の使用、および式の次元の検証方法について示します。

単位の定義と変換

symunit を使用して単位を読み込みます。

u = symunit;

u.unit を使用して単位を指定します。たとえば、5 メートルの距離、50 キログラムの重さ、時速 10 キロメートルの速度を指定します。表示された出力では、単位は大かっこ [] 内に記されます。

d = 5*u.m
w = 50*u.kg
s = 10*u.km/u.hr
d =
5*[m]
w =
50*[kg]
s =
10*([km]/[h])

ヒント

単位の名前を探すにはタブの拡張を使用してください。u. と入力し、Tab を押して、入力を続けてください。

単位は他のシンボリック式と同じように動作し、あらゆる標準的な演算や関数で使用できます。単位は自動では単純化されず、これにより柔軟性が生まれます。単位の一般的な別名がサポートされています。複数形はサポートされていません。

500 メートルと 2 キロメートルを加えます。結果の距離は、自動では単純化されません。

d = 500*u.m + 2*u.km
d =
2*[km] + 500*[m]

simplify を使用して d を単純化します。関数 simplify は、単純化の目標単位を自動的に選択します。

d = simplify(d)
d =
(5/2)*[km]

単位を自動的に選択する代わりに、unitConvert を使用して d を特定の単位に変換します。d をメートルに変換します。

d = unitConvert(d,u.m)
d =
2500*[m]

さらに多くの単位変換オプションと単位系オプションがあります。単位変換と単位系を参照してください。

距離 d50 秒以内で横断できる速度を求めます。結果は正しい単位をもちます。

t = 50*u.s;
s = d/t
s =
50*([m]/[s])

温度単位を絶対形式と差分形式とで使用する

既定では、温度は絶対測定ではなく差分で表されることを仮定しています。たとえば、5*u.Celsius は摂氏 5 度の差分温度を表すことを仮定しています。この仮定により温度の値の算術演算が可能になります。

絶対温度を表すにはケルビンを使用し、これにより絶対温度と温度の差分を区別する必要がなくなります。

摂氏 23 度をケルビンに変換して、最初は温度の差分として扱っていた温度を絶対温度として扱います。

u = symunit;
T = 23*u.Celsius;
diffK = unitConvert(T,u.K)
diffK =
23*[K]
absK = unitConvert(T,u.K,'Temperature','absolute')
absK =
(5923/20)*[K]

次元を検証する

長い式では、単位を視覚的に確認するのは困難です。式の次元は、方程式の次元を検証することで自動的に確認できます。

はじめに運動方程式 v2=v02+2as を定義します。ここで、v は速度を、a は加速度を、s は距離を表します。s がキロメートルで、他のすべての単位は SI 基本単位であると仮定します。次元の確認を実際に行うために、a の単位を意図的に間違えています。

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 =
v^2*([m]^2/[s]^2) == v0^2*([m]^2/[s]^2) + (2*a*s)*(([km]*[m])/[s])

eqn に出現する単位を findUnits で観察します。返された単位から、キロメートルとメートルの両方が距離を表現するのに使われていることがわかります。

findUnits(eqn)
ans =
[ [km], [m], [s]]

単位が同じ次元 (長さや時間のような) をもっているかを、checkUnits'Compatible' 入力を与えて確認します。MATLAB® はシンボリック変数は無次元であると仮定しています。checkUnits は論理的な 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 は論理値 0 (false) を返します。

checkUnits(eqn,'Consistent')
ans =
  logical
   0

eqn を SI 基本単位に変換して単位を整合させます。checkUnits を再実行します。eqn は互換性と整合性のある単位をもちます。

eqn = unitConvert(eqn,'SI')
eqn =
 v^2*([m]^2/[s]^2) == v0^2*([m]^2/[s]^2) + (2000*a*s)*([m]^2/[s]^2)
checkUnits(eqn)
ans = 
  struct with fields:

    Consistent: 1
    Compatible: 1

単位に関連する作業が終了し、無次元の方程式または式だけが必要になったら、separateUnits を用いて単位と方程式を分離します。

[eqn,units] = separateUnits(eqn)
eqn =
v^2 == v0^2 + 2000*a*s
units =
1*([m]^2/[s]^2)

eqnunits を掛けて結果を展開することで、元の単位付きの方程式を返すことができます。

expand(eqn*units)
ans =
v^2*([m]^2/[s]^2) == v0^2*([m]^2/[s]^2) + (2000*a*s)*([m]^2/[s]^2)

式から数値を計算するには、subs でシンボリック変数に代入し、double または vpa で数値に変換します。

eqnv について解きます。次に v の値を求めます。ここで v0 = 5a = 2.5s = 10 です。結果を 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

微分方程式で単位を使用

標準的な式と同じように微分方程式で単位を使用します。このセクションでは、微分方程式での単位の使い方を、加速度の定義 a=dvdt から始まり、速度関係 v = v0 + at および v2=v02+2as を導出することで示します。

加速度の定義を 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) =
a*([m]/[s]^2) == diff(V(t), t)*(1/[s])

速度 V は不明で単位もないので、eqn1 の単位には互換性も整合性もありません。

checkUnits(eqn1)
ans = 
  struct with fields:

    Consistent: 0
    Compatible: 0

初速度が v0 という条件で、eqn1V について解きます。結果は方程式 v(t) = v0 + at です。

syms v0
cond = V(0) == v0*u.m/u.s;
eqn2 = V == dsolve(eqn1,cond)
eqn2(t) =
V(t) == v0*([m]/[s]) + a*t*([m]/[s])

結果の次元が正しいことを、rhs(eqn2)eqn1 に代入し、checkUnits を使用して確認します。

checkUnits(subs(eqn1,V,rhs(eqn2)))
ans = 
  struct with fields:

    Consistent: 1
    Compatible: 1

今度は、v2=v02+2as を導出します。速度は距離の変化率なので、V に距離の微分 S を代入します。この場合も、速度 S に単位があるとすれば、S は、単に t ではなく正しい単位である T = t*u.s について微分されなければなりません。

syms S(t)
eqn2 = subs(eqn2,V,diff(S,T))
eqn2(t) =
diff(S(t), t)*(1/[s]) == v0*([m]/[s]) + a*t*([m]/[s])

初期地点が 0 という条件で、eqn2 を解きます。expand を使用して S を所定の形式で取得します。

cond2 = S(0) == 0;
eqn3 = S == dsolve(eqn2,cond2);
eqn3 = expand(eqn3)
eqn3(t) =
S(t) == t*v0*[m] + ((a*t^2)/2)*[m]

この単位付きの方程式はシンボリックなワークフローで使用できます。あるいは、rhs を用いて右辺を返し、separateUnits を用いて単位を分離し、その結果得られる単位のない式を使うことで、単位を取り除くこともできます。

[S units] = separateUnits(rhs(eqn3))
S(t) =
(a*t^2)/2 + v0*t

units(t) =
[m]

式から数値を計算する必要があるときは、subs でシンボリック変数に代入し、double または vpa で数値に変換します。

8 秒間での移動距離を求めます。ここで、v0 = 20a = 1.3 です。結果を double 型に変換します。

S = subs(S,[v0 a],[20 1.3]);
dist = S(8);
dist = double(dist)
dist =
  201.6000

参考

| | | | | | |

関連するトピック

外部の Web サイト