WOLFRAM

測定単位の概念と設定

概要数量と表示単位の設定
概念単位定義のオーバーライドを避ける
単位の設定数量空間の一貫性とケルビンの従来の使用

System Modelerで使う測定単位は,いくつかの方法で設定できる.以下では,中心となる概念を紹介し,それらの概念がどのように関係しているか,そしてどのように設定できるかについて説明する.あるライブラリ特有の単位の設定を知りたい場合には,そのライブラリの最上レベルのパッケージについてのドキュメントを開き,ライブラリの単位と数量セクションのリンクを使う.

概要

System Modelerの表示単位変換に使われる測定単位の定義は,モデルにおける単位の非一貫性を検知するのに使われる定義と同じものである.単位の一貫性を確実にするのに加えて,現在のアプリケーション領域に基づく単位系が設定できる利点もある.つまり,使用している単位が一貫したものであることを確かめつつ,領域特定の単位を使うことができ,値はその領域の慣例にしたがって入力と表示を行うことができる.

モデル(あるいはその他のModelicaクラス)で作業をしている場合には常に,測定単位のアクティブな設定はモデルの最上レベルの親クラスに基づいて決定される.例えば,IntroductoryExamples.MultiDomain.DCMotorで作業をしている場合には,アクティブな設定はIntroductoryExamplesによって決定される.設定はシステムのデフォルト,ライブラリの依存関係から継承した設定,System Modeler特有の注釈,型の定義から抽出した情報を組み合せたものに基づく.このことについては以下でさらに詳しく説明する.

現在アクティブな設定内の情報を使って,ユーザはどの単位をユーザインターフェースメニューに単位として含むかをある程度制御することができる.ユーザ設定はオプションのドキュメントの表示単位ビューで説明されているが,以下でももとになる情報を説明する.

概念

以下の概念は,System Modelerがどのように測定単位と関連機能を処理するのかを理解する上で中核となるものである.使われている用語はSystem Modeler特有のものもあるので,以下のセクションを読み進む前に用語の意味を理解することが望ましい.

理解することが最も重要である概念以外のものについては,出てきたときにその都度説明する.

単位

「単位」の例として,meters(メートル), kilonewtons(キロニュートン), meters per second(メートル毎秒)が挙げられる.変数と式はどちらも単位を使うことができるが,モデル内で一貫した単位を使用することに関する規則がある.

「単位式」は,「単位記号」,「単位接頭辞」,掛け算,割り算,累乗法について単位を表現する方法である.式は通常特定のシンタックスに従う文字列として符号化される.上の例に対応する文字列はそれぞれ"m""kN""m/s"である.

単位記号は,ある単位を表す簡潔な名前である.例えば,mはメートルの記号であり,Nはニュートンの記号である.単位記号の一部のみがk等のSI単位系の接頭辞と一緒に使える.つまり,kNはキロニュートンを表す有効な方法であるが,minはミリインチを表す有効な方法ではない.

単位記号は,「基本単位」記号と「派生単位」記号に分けられる.基本単位はすべて単位の空間内で別の次元に対応するが,派生単位は別の単位について定義されるものである.派生単位の定義は単位式と尺度からなり,絶対数量の解釈のオフセットが含まれることもある.例えばinは,単位式がcm,尺度が2.54,オフセットがなしとして定義できる.オフセットについては下でさらに詳しく説明する.

派生単位の定義を使って,単位式は基本単位の指数と尺度についてのみ等価の標準形に評価することができる.特別単位1は標準形の尺度が1であり,非零の指数の基本単位を持たない場合の単位を表す.

変数がunit属性を持つ場合には,属性が変数の単位を決定する.それ以外の場合には,変数の単位は単位の一貫性規則から推測されることがある.

数量

「数量」は,変数の特性であり,変数によって何が測定されるかを特定する名前が与えられる.Modelicaでは接続は,数量が存在する場合には,接続される変数が同一の数量を持つことが必要である.数量は通常,"Length"(長さ),"CurrentDensity"(電流密度)等の大文字で始まる名前を持つ.

System Modelerでは,数量はメニューの選択に含める単位をより賢く選択するためにも使われる.

変数はquantity属性が存在する場合にのみ数量を持ち,System Modelerは数量についての推測を行わない.数量が一般に推測できないのは,変数が接続において同一でなければならないという唯一の必要条件のせいである.方程式の等価性で関連付けられた xyzという3つの変数を考える.x"Torque"(トルク),z"Work"(仕事量)であるとすると,yについて数量が指定されていない場合には,推測メカニズムは他の変数との等価性に基づいてyの数量を推測することができない.さらに,"Force"(力)変数に"Length"(長さ)変数を掛けることが"Torque""Work",単位"N.m"と互換性のあるその他の数量のいずれでもあり得るので,式の数量がうまく定義できないことを示している.

数量の値

「数量の値」は,数値と単位の組合せである.例えば,1.5 meters (1.5メートル)は,数値が1.5で,単位がメートルである数量の値である.モデリングにおいては,数値ではなく,数量の値間の関係を表現することが望ましい.単位を含むことによって基本的なモデリングのミスの多くを検知することができるだけでなく,単位について数多くのユーザインターフェースの拡張機能を有効化することができるからである.

「数量の値」は,数値と単位の組合せである.例えば,1.5 meters (1.5メートル)は,数値が1.5で,単位がメートルである数量の値である.モデリングにおいては,数値ではなく,数量の値間の関係を表現することが望ましい.単位を含むことによって基本的なモデリングのミスの多くを検知することができるだけでなく,単位について数多くのユーザインターフェースの拡張機能を有効化することができるからである.Modelicaでは,数量の値を使うことは,単位を持つ変数を使うことと同じであり,変数に単位を与えるのに望ましい方法は,Modelica.Units.SI.Length等のquantityも含まれる型の定義を使うか,単位の面で柔軟性のある汎用モデルの単位推測に依存するかのどちらかである.

モデル変数の数値は,変数の「値」として参照されることが多く,変数が単位を含む場合には,変数は数量の値を表す.

この概念は,別のコンテキストではさまざまな異なる名前で呼ばれるが,よりよく使われる名前には別の意味がすでに与えられていて,現行のコンテキストでは変更できない.

表示単位

多くの場合,「表示単位」は数量の値を表示したり編集したりするときに使われる.System Modelerはその後自動的に表示単位と数量の値を表す単位との間の変換を行う.例えば,シミュレーション結果は変数の単位よりも表示単位を使ってプロットすることが多く,パラメータ値は表示単位を使って表示したり編集したりすることが多い.

変数のdisplayUnit属性は変数と一緒に使う表示単位を提案する.しかし,変数がこの単位のみを使って表示されたり編集されたりするとは限らない.モデル間で表示単位がどの程度使われるかは指定されない.そして System Modelerのバージョンによって異なることがある.

単位系

「単位系」の例には,「国際単位系」と「米国慣用単位」が含まれる.System Modelerは一定の単位系を含み,それぞれがどのように関係するかを知っている.表示単位ビューオプションで単位系を有効にしたり無効にしたりできる.その設定に基づいて,任意の単位式を有効あるいは無効として分類することができ,その分類が単位の選択のメニューのコンテンツをフィルタリングするのに使われる.

単位式は,現れるすべての単位記号が有効である場合に有効化される.基本単位では,その記号を有効化する単位系は明示的に定義されなければならない.派生単位は基本単位の記号と同じように明示的に有効化するか,その定義する単位式によって陰的に有効化するかすることができる.

数量空間

数量の値はすべて「絶対」数量か「相対」数量を表す.この分類は数量の値の「数量空間」と呼ばれ,絶対数量は「アフィン」(数量)空間,相対数量は「ベクトル」(数量)空間に属する.単位間で変換を行う場合には,単位のオフセットはアフィン空間についてだけ考慮される.したがって,ベクトル空間で変換するときには数値のゼロはゼロのままであるが,アフィン空間では一般にはそうではない.さらに,アフィン空間内での意味ある演算は差分(これはベクトル空間に属する)の計算と差分(ベクトル)によるオフセット値に限られる.

単位解析を行う際にunit属性が情報源であるのと同じように,数量空間の解析を行っている際には,absoluteValue注釈が情報源である.しかし,変数の数量空間はunit属性に基づいて決定することも可能である.それぞれの単位式はすべてその単位で宣言された変数についてデフォルトの数量空間を定義するからである.単一の記号からなる単位式は,その記号に設定された数量空間を持つが,その他の単位式はすべてベクトル空間を持つ.

単位検定のための規則が単位の推測を可能にするのと同じように,どのように数量の値が使われるかについての規則に基づいて数量空間を推測することが可能である.また単位と同様に,数量空間もいつも決定できるとは限らない.

単位の設定

上で述べたように,同じパッケージ階層内のクラスはすべて同じ単位定義を共有する.以下では,Pはそのような階層の根にあるパッケージであるとする.P内のアクティブな単位定義は下で説明されるメカニズムを使って決定される.

単位定義表

循環的に依存する派生単位定義は使えない.単位定義のアクティブな集合は,単位定義が前に定義された単位記号のみに依存するように整理することができる(これは基本単位記号について自明に真であり,これらの記号は他のどの単位記号にも依存しない).

使用可能な単位定義の有向非巡回グラフ構造は,有向非巡回グラフ構造が最後まで強制されない「単位定義の表」の形式を持つ中間表現を使って,ライブラリのアクティブな単位の定義の中で利用される.単位定義のトポロジカル整列は簡単な過程であり,Pの単位定義表をどのように定義するかという重要な質問を行う.このことについては以下のサブセクションで見ていく.

使用依存関係

PDへの依存を宣言するuses注釈を持つとき,後者のパッケージはPの「使用依存関係」であるとされる.Pからのuses注釈に従って,パッケージ使用依存関係グラフが取得される.このグラフは位相的にソートされ,単位定義表の主要単位はグラフの強力なコンポーネントである.したがって,Pの単位定義表は,Pが属する強力なコンポーネントの単位定義表として定義される.

説明を簡単にするために,それぞれの強力なコンポーネントは単一のパッケージからなるものであると仮定され,P等のパッケージ名が,Pからなる強力なコンポーネントの簡約化された参照として使われることがある.簡約化された仮定は実際にはめったに使われることがない.というのは,バージョン4.0.0では,ModelicaパッケージはModelicaServicesと同じ強力なコンポーネント内にあるからである.しかし,ModelicaServicesが存在しないと想像することによって,簡約された説明はほとんどの場合まだ適用可能で正しい.

継承された単位定義

パッケージPが使用依存関係を持つ場合,単位定義表はまず依存関係のそれぞれについて決定され,その後Pによって継承される.記号の継承された定義間で大きな相違がある場合には,Pがコンフリクトを解決しない限りエラーとなる.Pがコンフリクトを解決する1つの方法として,Units注釈を使ってP自体の記号定義を提供することある.以下で説明する.

系のデフォルト

System Modelerにはデフォルトの単位定義表が含まれている.この表はModelicaパッケージで使うのに必要な単位に加えて,一般に使用される追加の単位を提供する.使用依存関係を持たないパッケージは,使用依存関係を持つパッケージが依存関係から単位定義表を継承するのと同じように,デフォルトの単位定義表からの単位を継承する.

Units注釈

継承された単位定義に加えて,最上位パッケージはSystem Modeler特有のUnits注釈を使って単位定義を設定することがある.注釈は,新しい基本単位と派生単位を定義することを可能にし,継承された単位を削除して,単位定義のコンフリクトを処理する仕組みを提供する.注釈編集のサポートされている方法は,ライブラリ単位ダイアログから行う方法である.ライブラリ単位の編集を参照されたい.

単位定義には,単位が正しく設定されることを確実にするために,特に注意を要する4つの文字列属性がある.記号は必須の属性であり,単位式の文字列で使われる単位の識別子である.名前も必須の属性であり,記号Nに対する newton(単位名に大文字を使うことは,単位名が人名から付けられた場合でも,ほとんどないことに注意する.)等,単位を意味する完全名である.単位の説明は,単位の意味や目的を明確に伝えるために,名前の他に追加情報を提供する必要があるときにだけ使われる任意の説明である.記号の提示は,単位式の表示の中で記号の代りに使われる任意のUnicode文字列である.

数量と表示単位の設定

メニューで関連の単位を提供する基本は,数量に対して表示単位を関連付けることである.単位定義のアクティブな集合が一旦決定されると,数量に関連付けられた表示単位が単位の変換互換性に基づいて等価クラスにソートされるので,数量がお互いに変換互換性のない表示単位に関連付けられていても問題ない.数量設定の異なるソースを統合することで失敗することがないので,数量設定は単位設定よりも簡単に処理することができる.

単位定義と同じように,P内のアクティブな数量設定は使用依存関係に基づいて決定され,数量設定は使用依存関係グラフの強力なコンポーネントそれぞれについて決定される.その他に関わってくる仕組みについては以下で説明する.

継承された表示単位

パッケージP使用依存関係を持つ場合には,数量設定はまずそれぞれの使用依存関係について決定され,それがPによって継承される.統合の過程で失われる可能性がある情報は,複数のソースから継承されたときの関連付けられた表示単位のもとの単位だけである.

系のデフォルト

System Modelerにはデフォルトの数量設定が含まれている.この数量設定は,Modelicaパッケージに現れるほとんどの数量に対する表示単位を提供する.使用依存関係を持つパッケージが依存関係から数量設定を継承するのと同じように,使用依存関係を持たないパッケージはデフォルトの数量設定を継承する.

型のエイリアスの抽出

表示単位は,組込みのReal型を拡張し,quantity属性を持つ型から抽出される.しかし,型は最大2つの異なる単位(unit 属性に1つとdisplayUnit属性に1つ)を数量に関連付けることができるので,系のデフォルトでうまく取り扱えなく,以下で説明するSystem Modeler特有の注釈を使うように設定されていないパッケージについては,抽出は最小レベルの利便性しか提供しない.

Units注釈

継承された数量設定と型のエイリアスの抽出に加えて,最上位パッケージはSystem Modeler特有のUnits注釈を使って数量と表示単位を設定することがある.注釈は,数量ごとに整理される.それぞれの数量について,新しい表示単位を追加し,継承された表示単位を削除することが可能である.注釈編集のサポートされている方法は,ライブラリ単位ダイアログから行う方法である.ライブラリ単位の編集を参照されたい.

既知の数量

数量は何らかの表示単位に関連付けられるとすぐに既知であると見なされる.

単位定義のオーバーライドを避ける

System Modelerで単位定義を設定できる機能は強力で,例えばラジアンを基本単位にしたり,オフセットの温度尺度なしの系にしたり(以下を参照),モルを純粋な数値尺度単位にしたりすることが可能である.これらはすべて,特定の領域内での単位慣例にできるだけ近い形にするために使える高度な設定の例である.しかし,そのような高度な設定を試みる前に,モデルを再利用する際に予想される結果を考慮する必要がある.

数量空間の一貫性とケルビンの従来の使用

唯一認識されている温度の単位がケルビンである工学や科学の領域では,摂氏や華氏の温度尺度のオフセットを単位変換で考慮すべきかどうかを考える必要はない.しかし,System Modelerのデフォルトの単位定義は温度尺度のオフセットをいつ考慮すべきかに注意することが重要である領域をサポートするように設定されているので,ケルビンの使用が当たり前のように考えられている公式や方程式では特別に注意を払う必要がある.

問題

したがって,これらの領域では温度は従来ベクトル数量(アフィン数量ではない.上を参照)として取り扱われ,よく使われる単位にオフセットが含まれない他の数量すべてと同じように容易に温度を取り扱うことが可能である.これについて重要でよく知られた例に,理想気体の状態方程式がある:

またシュテファン=ボルツマンの法則もある:

どちらの法則でも温度 は乗法的に使われる.つまり,ベクトル数量でなければならない.Modelica Standard LibraryではこのためにTemperatureDifference を提供する:

model StefanBoltzmann_TemperatureDifference
import Modelica.Units.SI.*;
import Modelica.Constants.sigma;
parameter TemperatureDifference T = 293.15;
RadiantExitance M0;
equation
M0 = sigma * T^4;
end StefanBoltzmann_TemperatureDifference;

反対に,System Modelerのユーザは,上のような方程式を使っている場合でも,温度を摂氏でも華氏でも入力できる利便性を期待するかもしれない.StefanBoltzmann_TemperatureDifferenceを使っているときには,温度を20 °Cとして入力することと293.15 Kと入力することが同じであると考える過ちを犯しやすい.しかし,Tはベクトル数量なので,20 °C20 Kと同じなのである.

解決策

上の問題の極端な解決策は,オフセットを含む温度の単位をすべて削除し,残りの温度単位すべてがデフォルトでベクトル数量を作成するようにすることである.残念ながら,Modelica Standard Libraryは"degC""degF"のどちらもを使用する型の定義を持ち,この方法の適用はModelica Standard Libraryとの互換性がないことからかなり限られたものになる.

よりよい解決策として,Temperature(これはアフィン数量である)をTに使って,予期される単位変換を行ってから方程式を修正し,乗法演算がベクトル数量T - T_zero_Kに対して行われるようにする方法がある.ここで定数T_zero_Kは,温度0 Kを意味する.System Modelerでは,T_zero_Kの定義はSystemModelerExtras.Experimental.Units.T_zero_Kとして提供される.

model StefanBoltzmann_Temperature
import Modelica.Units.SI.*;
import Modelica.Constants.sigma;
import SystemModelerExtras.Experimental.Units.T_zero_K;
parameter Temperature T = 293.15;
RadiantExitance M0;
equation
M0 = sigma * (T - T_zero_K)^4;
end StefanBoltzmann_Temperature;

T_zero_Kを減算する方法は,アフィン温度の誤った使用によるエラーに対処するために広く適用できるものである.