【FMI/FMU】最小構成のMBD事例 第2章 その88【PyFMI⑤】

【FMI/FMU】最小構成のMBD事例 第2章 その88【PyFMI⑤】 事例
【FMI/FMU】最小構成のMBD事例 第2章 その88【PyFMI⑤】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/

はじめに

実際にPyFMIを使用し始めた前回。
FMUをロードする関数が返すオブジェクトは
実際に読み込んだFMUによって変化する。

今回は、FMUに渡すデータの作成部分からの話となる。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

技術者太郎

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

時間軸

フクさん
フクさん

先ずは時間軸を作る。

太郎くん
太郎くん

時間軸?

フクさん
フクさん

FMUにデータを渡したり、シミュレーション結果を受ける際に時間軸が必要になるんだよ。
まぁ作り方としてはシンプルに等差数列で作ればOKだ。

太郎くん
太郎くん

と、、、等差??
数列???

フクさん
フクさん

Wikipediaから引用。

数学における等差数列(とうさすうれつ、英: arithmetic progression, arithmetic sequence; 算術数列)とは、「隣接する項が共通の差(公差)を持つ数列」(sequence of numbers with common difference) を言う。例えば、5, 7, 9, 11, 13 … は初項 5, 公差 2 の等差数列である。同様に、1, 7, 13, 19, 25 … は公差 6 の等差数列である。

Wikipediaより(https://ja.wikipedia.org/wiki/%E7%AD%89%E5%B7%AE%E6%95%B0%E5%88%97)
太郎くん
太郎くん

あー、名前のまんまか。

フクさん
フクさん

numpyのlinspaceで簡単に作ることが可能だ。

太郎くん
太郎くん

こんなイメージか。
0秒から2秒までを200等分した感じ。

t = np.linspace(0.,2.,200) 
フクさん
フクさん

そうそう。
それでOKだ。

Rampの生成

フクさん
フクさん

FMU側は制御電圧のInputブロックを配置しているわけなのだが・・・。

太郎くん
太郎くん

入力の制御電圧をPython側で作る必要があるのか?!

フクさん
フクさん

とりあえず、Rampを生成してみよう。

太郎くん
太郎くん

どうやって作れば・・・。

フクさん
フクさん

まぁ書き方はいくらでもあるだろうが、
一例としては以下だな。

x = np.linspace(-20, 220, 200)
x = np.maximum(x, 0)
x = np.minimum(100, x)
フクさん
フクさん

そのままプロットするとこんな感じだ。

Ramp、numpy、matplotlib、pyplot
太郎くん
太郎くん

うん。
いままで使ってたRampと同じようなデータだね。

時間軸とRamp入力を行列として統合

フクさん
フクさん

次はと時間軸配列とRamp配列を統合して2×200の行列を作る必要がある。
これがFMUに対しての入力セットの元ネタになる。

太郎くん
太郎くん

統合ってどうやれば・・・。

フクさん
フクさん

単純に上下に並べるようにする場合はnumpyのvstackを使えばOK。

np.vstack((t,x))
フクさん
フクさん

このままだと200×2の行列なので、転置する。

u = np.transpose(np.vstack((t,x)))
フクさん
フクさん

これでuがFMUの入力用の行列となる。

入力オブジェクト

太郎くん
太郎くん

この行列をそのまま渡せば良いのかな?

フクさん
フクさん

いんや。
この行列をどの信号にするか紐づけて入力オブジェクトを生成する必要がある。

太郎くん
太郎くん

入力オブジェクト?

フクさん
フクさん

まぁ名前にそれほど意味はないんだけど、以下の処理が必要なだけだな。

input_object = ('voltage', u)
太郎くん
太郎くん

ほう。
そういえば、voltageというエイリアスがInputブロックで作ってたから、
ここに入力用行列を紐づけるってことか。

フクさん
フクさん

そうそう。
これでシミュレーション前の準備が揃ったことになる。

まとめ

フクさん
フクさん

まとめだよ。

  • 時間軸作った。
    • とりあえず、0秒から2秒の等差数列で作った。
  • Ramp作った。
    • 等差数列で斜めにプロットした後にmax,minでサチらせた。
  • 時間軸とRamp入力と統合&縦方向に。
    • vstackとtransposeを使用。
  • 入力オブジェクト作った。
    • voltageに入力行列を紐づけた。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました