最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。
測定単位を 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]
さらに多くの単位変換オプションと単位系オプションがあります。単位変換と単位系を参照してください。
距離 d
を 50
秒以内で横断できる速度を求めます。結果は正しい単位をもちます。
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]
長い式では、単位を視覚的に確認するのは困難です。式の次元は、方程式の次元を検証することで自動的に確認できます。
はじめに運動方程式 を定義します。ここで、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
は logical 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)
eqn
と units
を掛けて結果を展開することで、元の単位付きの方程式を返すことができます。
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
で数値に変換します。
eqn
を v
について解きます。次に v
の値を求めます。ここで v0 = 5
、a = 2.5
、s = 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
標準的な式と同じように微分方程式で単位を使用します。このセクションでは、微分方程式での単位の使い方を、加速度の定義 から始まり、速度関係 v = v0 + at および を導出することで示します。
加速度の定義を 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 という条件で、eqn1
を V
について解きます。結果は方程式 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
今度は、 を導出します。速度は距離の変化率なので、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 =
20
、a = 1.3
です。結果を double 型に変換します。
S = subs(S,[v0 a],[20 1.3]); dist = S(8); dist = double(dist)
dist = 201.6000
checkUnits
| findUnits
| isUnit
| newUnit
| separateUnits
| symunit2str
| unitConversionFactor
| unitConvert