高度なリアルタイムシミュレーション
はじめに
関数WSMRealTimeSimulateは,Wolfram SystemModelerのモデルのシミュレーションのために使用する.この関数は,モデルの構築およびシミュレーションのような一般的な用途をリアルタイムで自動化する.
場合によっては,これらのステップをもっと細かく制御した方が便利なことがある.このチュートリアルでは,シミュレーションワークフローをよりよく制御し,物事を細かく制御する方法を説明する.
Wolfram SystemModeler Linkの機能を使うために,パッケージをロードする.
このチュートリアルでは,"DocumentationExamples"パッケージの"InputAdd"モデルを使用する.このモデルは正弦波と入力を単純に足したものである.
構築と起動
WSMRealTimeSimulateでモデルのシミュレーションを実行する場合,Modelicaモデルはまずシミュレーション実行ファイルに変換される.同時にパラメータ値,初期値,シミュレーションのオプションを制御するのに使われるシミュレーションファイルも生成される.次にシミュレーション実行ファイルは,入力としてシミュレーションファイルを開始し,シミュレーションとWolfram言語の間の接続が確立する.この接続にはTCP/IP上に構築されたカスタムプロトコルが使われる.これでシミュレーションの準備ができたことになる.
この最初のステップを実行するためには,次の関数が利用できる.
WSMRealTimeSimulate[mmodel,…] | シミュレーションを構築し起動する |
WSMRealTimeConnect[port] | port の実行中のシミュレーションに接続する |
WSMRealTimeConnect["ip",port] | "ip":port のシミュレーションに接続する |
WSMRealTimeSimulate関数は,WSMSimulateと同じ引数を取る.前者は,結果のデータをシミュレーションして取り出す過程を継続する代りにWSMSimulationConnectionオブジェクトを返し,シミュレーションがより細かく制御できるようにする.複数の入力と一つの出力で基本的モデルのリアルタイムシミュレーションを構築して開始する.
IPとポート番号を使って実行中のシミュレーションに接続することができる.WSMRealTimeConnectを使って,起動したばかりのシミュレーションに2つ目の接続を確立する.
IPとポートの設定
シミュレーションを起動する場合,特定のインターフェースおよびlistenするポートを指定することも可能である.これにより1つのコンピュータ上でシミュレーションを開始して,別のコンピュータからそれを制御することが可能になる.これに関する2つのオプションが"IP"と"Port"である.
すべてのインターフェース上で,ポート番号55000をlistenするシミュレーションを開始する.
次の接続は,まだlocalhost IP 127.0.0.1上でlistenしている.
$MachineAddressesで見付かるpublic IPを介して接続することもできる.
接続制御
情報特性
シミュレーションを表す接続オブジェクト conn は,多数の特性についてクエリできる.
conn["State"] | 現在のシミュレーション状態 |
conn["Time"] | 現在のシミュレーション時間 |
conn["StopTime"] | シミュレーションの終了時間 |
conn["ModelName"] | シミュレーションモデルの名前 |
conn["NumberOfEvents"] | 生成されたイベントの数 |
conn["NumberOfEvaluations"] | 実行された評価の数 |
conn["IP"] | シミュレーションのIPアドレス |
conn["Port"] | シミュレーションのポート |
conn["Diagram"] | モデルの動的ダイアグラム |
conn["VariableNames"] | 変数名のリスト |
conn["ParameterNames"] | パラメータ名のリスト |
conn["InputVariables"] | 入力変数のリスト |
以下の表に示すように,決まった数の可能なシミュレーション状態がある.
"Unknown" | シミュレーションが未知の状態 |
"NotStarted" | シミュレーション時間が0の初期状態 |
"Running" | シミュレーション時間が増加中 |
"Paused" | シミュレーションが一時停止中 |
"Disconnected" | Wolfram言語がシミュレーションとの接続を解除されている |
接続の"Diagram"特性はモデルダイアグラムを返す.ダイアグラムに動的グラフィックスがある場合,時点conn[Time]に対するデータを使用する.シミュレーションがDisconnectedの状態である場合,ダイアグラムは任意の動的グラフィックスの静的なバージョンを表示する.
制御特性
接続オブジェクト conn はシミュレーションの制御に使うことができる.
conn["Start"] | シミュレーションを開始あるいは再開する |
conn["Pause"] | シミュレーションを一時停止する |
conn["Stop"] | シミュレーションを中止する |
conn["Close"] | シミュレーションからWolfram言語の接続を解除する |
シミュレーションはリアルタイムなので,シミュレーション時間も1秒をわずかに超える.
シミュレーションを中止すると,シミュレーションは現在のシミュレーション時間で中止され,シミュレーション実行ファイルを終了し,Wolfram言語との接続を閉じる.
シミュレーションとの接続を閉じると,シミュレーションは現行の状態のままとなるが,Wolfram言語とシミュレーションとの間の接続は削除される.
シミュレーションデータ
シミュレーションデータの読込み
シミュレーションと接続すると,シミュレーションの実行中に結果のデータの取出しが可能になる.変数に対する最新のデータ点や変数のリストが取り出せる.
conn[{"v1",…}] | vi の変数値 |
conn["SimulationData"] | WSMSimulationDataオブジェクトの生成 |
実行中のシミュレーションの入力および出力に対する現行の値を取り出す.
シミュレーションが中止したり,到達不可能になったりすると,conn[{v1,…}]の結果は{None,…}になる.
完全なWSMSimulationDataオブジェクトを取り出すことができる.
別の方法として,シミュレーションからのデータが更新されるたびに呼び出される関数を登録するというものがある.
WSMLink`Simulate`AddDataMonitor[conn,fn,vars] | 各シミュレーションステップで,vars の時間と値に対する fn を呼び出す |
WSMLink`Simulate`DeleteDataMonitor[dm] | dm からデータを削除する |
yの値が-0.5より低くなるとシミュレーションを中止するデータ監視を加える.
シミュレーションを再開し,上記のデータ監視が終了させるまで実行させる.
再びプロットすることで,結果のファイルから新しいデータを読み込む.
シミュレーションデータオブジェクトは,シミュレーションがWSMRealTimeSimulateによって起動されたときにだけ取り出すことができる.その他の場合は,Wolfram言語には結果を含むファイルがどこにあるのかを制御することはできないため,完全な結果のオブジェクトを返すことができない.WSMRealTimeSimulateでシミュレーションを開始して,WSMRealTimeConnectでそれに接続する.
WSMRealTimeSimulateから受け取った接続からの結果オブジェクトを取り出すことができる.
WSMRealTimeConnectから受け取った接続には必要な情報がない.
シミュレーションデータの書き出し
Wolfram言語からシミュレーションに入力をフィードすることもいくつかの方法で実行できる.一旦入力を指定された値に設定することもできれば,入力を設定するために定期的に呼び出される関数を指定することもできる.Wolfram言語を介してパラメータ値を設定することもできる.
入力変数の設定
実行しているシミュレーションで入力値を変更する最も簡単な方法は,直接指定することである.まず,新しいシミュレーションを起動する.
シミュレーションを開始して,2秒後に入力変数"u"を1に変更する.もう2秒シミュレーションを実行して終了する.
結果のシミュレーションの入力"u"と出力"y"をプロットする.
WSMLink`Simulate`SetInputsの引数として関数を与えると,Wolfram言語から継続的に入力変数を更新することもできる.この場合,シミュレーションとの各通信に対して関数が評価され,結果の値がシミュレーションにフィードバックされる.
次の基本的な例題では,2秒後に入力"u"が乱数で継続的に更新される.
RefreshRateオプションが与えられていないと,Wolfram言語がシミュレーションと通信するたびに更新が起こる.これはWSMRealTimeSimulateに与えるオプションRefreshRateで制御できる.
WSMLink`Simulate`SetInputsでRefreshRateオプションを使うと,入力関数のサンプルをシミュレーションに送る頻度を設定することもできる.
RefreshRateのデフォルトはAutomaticであり,シミュレーションとの標準的な通信のたびに更新される.また,RefreshRate->timespec では,RunScheduledTaskでサポートされるあらゆる timespec が可能になる.
パラメータ値の設定
シミュレーションのパラメータを設定するためには,WSMLink`Simulate`SetParametersを使う.
シミュレーションを開始して,2秒後に入力変数"u"を1に変更する.それからもう2秒シミュレーションさせて,シミュレーションを中止する.
結果のシミュレーションの入力"u"と出力"y"をプロットする.
可視化
シミュレーションからのデータをインタラクティブに可視化するために,シミュレーションとのライブの接続を使うことができる.このセクションでは利用できる可視化の例をいくつか挙げるが,Wolfram言語にはここでは扱わないデータの可視化方法がいくつもある.
WSMPlot
プロット関数WSMPlotには,シミュレーション接続が組込みでサポートされている.シミュレーション接続を取り,シミュレーションデータを直接プロットすることができる.
ニュートンのゆりかごのリアルタイムシミュレーションを起動する.
シミュレーションを4秒実行し,変数x1からx5までプロットする.
シミュレーションが進むと,WSMPlotへの新しい呼出しで,利用できる新しい結果が使われるようになる.もう5秒シミュレーションを実行して,再びプロットしてみる.
WSMRealTimePlotを使って,リアルタイムで更新するプロットを作成することもできる.
シミュレーションを開始して,シミュレーションが進むと上のプロットが更新されるのをご覧いただきたい.
ゲージ
シミュレーションからの値を動的に表示するために,ゲージを使うことができる.ニュートンのゆりかごの新しいシミュレーションを起動する.
0.1秒ごとに更新され,ニュートンのゆりかごの最初と5番目のボールの角度を示す,動的な角度ゲージを表示する.
上の開始ボタンをクリックするか,以下を評価するかするとシミュレーションが開始する.
ボール同士がぶつかり合い,衝突で運動量全体どのようにが移動するかを観察する.
動的ダイアグラム
DynamicやRefreshを使って更新の頻度を制御すると,実行中のシミュレーションから動的ダイアグラムを表示することが簡単にできる.まず,制御器付きのタンクシステムのシミュレーションを起動する.
0.05秒ごとに更新される,シミュレーションの動的ダイアグラムを表示する.上の開始ボタンをクリックするとシミュレーションが開始する.
シミュレーション入力ソース
ゲージ
Wolfram言語では,出力だけでなく入力にもゲージが使える.これにより,実行中のシミュレーションの入力を制御するためにインタラクティブにゲージが使える.
シミュレーションの入力"u"を変数newUに設定する.newUを返す関数を使って,値を継続的に更新する.
最後に上の開始ボタンをクリックして,シミュレーションを開始する.最初のゲージのつまみをドラッグして,2つ目のゲージの出力がどのように変化するかを見てみる.
コントロール
入力の制御のためにゲージを使うのと同様に,どのようなタイプのControlを使うこともできる.
開始ボタンをクリックしてシミュレーションを開始し,コントロールスライダをドラッグしてゲージの出力の変化をご覧いただきたい.
ゲームパッドとデバイス入力
Wolfram言語は多様なハードウェアコントローラと入力デバイスをサポートしている.これらはすべてSystemModelerシミュレーションの入力を制御するために使うことができる.原理は,上述のゲージやControlオブジェクトと同じである.