Activate で Modelica を使ってみる(その1)- バネマスモデルの作成

Minoru Yubuchi_21921
Minoru Yubuchi_21921 Altair Community Member
edited December 2021 in Altair HyperWorks - 日本語

Activate で Modelica を使ってみる(その1)

最初の Modelica モデル – バネマスモデル

Altair Activate 関連のドキュメントでは Modelica に関する記述がそれほど多くは存在しないため、Altair Community の場を利用して Activate で Modelica を使うための基本的な知識や使い方をこれから何回かに分けて紹介していきたいと思います。初回である今回は、まずは力学系の一番基本的なモデルとして以下に示すようなバネマスモデルを Modelica 標準ライブラリを用いて作成するための手順を紹介します。

 image

ちなみに、これ以降の記述は Activate のチュートリアルの最初のセクションである “基本の学習” に含まれている4つの課題の学習が終了している(つまり Activate の基本的な操作方法は習得済みである)ことを前提としていることをご了承ください。

因果的モデル

上述のチュートリアル内で作成されたモデルは因果的モデル(もしくは、シグナルベースモデル)と呼ばれています。すなわち、あるブロックで計算された結果をリンク(矢印)で結ばれた次のブロックが入力として使用するというダイアグラムの構成になっています。つまり、ブロック間のデータのやり取りは一方通行です。例えば、上図のバネマスモデルは以下のような因果的モデル(添付:SpringMass_SignalBased.scm)で表現することができます。

image

このダイアグラムは、1自由度系の運動方程式である

image

をダイアグラム化しやすいように少し変形した以下の微分方程式をベースにモデル化されています。

image

このダイアグラムでの処理手順は以下の通りです。

image

① StepGenerator ブロック:ステップ荷重(f(t):最初の 1 秒間のみ値が 1.0)の生成
② Sum ブロック:前の時刻ステップで計算されていた減衰力と復元力(符号は逆)の、 ① で入力された外力への加算
③ ②で生成された力を質量(M=2.0)で割ることによる加速度の生成

④ 加速度を積分することによる速度の計算
⑤ 速度を積分することによる変位の計算
⑥ 変位結果のプロット
⑦ 計算結果である速度をフィードバックし、減衰係数(B=1.0)を乗じることにより減衰力を計算
⑧ 計算結果である変位をフィードバックし、剛性(K=2.0)を乗じることにより復元力を計算

 ちなみに、⑥ で出力された結果は以下のようになります。

 image

 与えた減衰係数(=1.0)が臨界減衰係数(≒4.90)よりも小さいため応答は振動しながら減衰します。

 Modelica を用いた非因果的モデル

この因果的なモデリング手法に対して、Modelica に代表される非因果的なモデリング手法ではブロック(Modelica の場合はコンポーネントと呼ばることが多い)間でのデータのやり取りは一方通行ではなく双方向です。リンクで結ばれたコンポーネント間でデータ(計算される物理量)が等値されることになります。因果的モデルでは、多くのプログラミング言語で使われる代入式のように右辺を計算して左辺に代入する(すなわち、右辺が原因で左辺が結果=因果的)という手法を用いていますが、非因果的なモデル化手法である Modelica では方程式のように右辺と左辺を等置して解くことになります。そのため、因果的モデルのように、どれかのブロックをまず計算して連鎖的に順番に計算が進んでいくのではなく、非因果的モデルでは全ての方程式を集めて連立して一挙に解くことになります。

上記の1自由度系バネマスモデルを、Modelicaを用いて(正確には Modelica 標準ライブラリを用いて)非因果的にモデル化すると以下のようになります(添付:SpringMass_Vertical_PositionSensor.scm)。非因果的モデルのもう一つの大きな特徴である、元となる構造をモデルから容易に類推できるということが分かると思います。

 image

 使用した Modelica コンポーネントは Activate パレットの以下のライブラリに含まれています。

 image image image

まずは上記の各コンポーネントをダイアグラムエリアにドラッグ&ドロップして以下のようなモデルを作成してみてください。

image

出力とセンサー

この Modelica モデルで使用されている PositionSensor というのは設置された場所での変位を検知するためのブロックです。結果の出力が必要な場所にはSensors ライブラリに含まれるセンサーを必ず設置する必要があります(注:センサーを設置せずに結果を出力する方法もあります。後日紹介します)。Activate ではPositionSensorに限らず、センサーで検知された結果を出力するためには出力方法を陽に指定してやる必要があります。この出力方法としては、XY プロットとして描画する、csv 形式等の外部ファイルに出力する、OML メモリ領域に出力して OML スクリプトで後処理する、等の方法がありますが、ここでは、上述の因果的モデルに合わせるため、Scope ブロックを用いて XY プロットに描画することとします。

Scope ブロックの入力ポートをPositionSensor のポートとリンクさせると、下図のように自動的に FromModelica と呼ばれるインターフェースのためのブロックが生成されます。

image

シグナルベースモデルと Modelica モデルではやり取りするデータ構造が全く異なりますが(これについては次回で紹介します)、この FromModelica ブロックが自動的に変換を行ってくれるため、とりあえずはデータ構造の相違を気にする必要はありません。

速度(SpeedSensor)および加速度(AccSensor)の検知に関しても PositionSensor と同様に、ポートを検知したい場所にポートをリンクさせます。これに対して力やパワーの検知に関しては下図のように検知したい場所に “挟み込まれる” ような形で設置します(添付:SpringMass_Vertical_ForceSensor.scm)。

 image

ちなみに、相対変位/相対速度/相対加速度に関するセンサーは以下の図のように二つの “足” をそれぞれ別の場所に設置することにより、その2か所の結果の差を出力します(添付:SpringMass_Vertical_RelSpeedSensor.scm)。ただし、このモデルの場合は足の片方が固定端であるため結果は絶対変位と同じになります。

image 

荷重とソース

Modelica モデルに外部から荷重を与える場合は Sources ライブラリに含まれる Position や Force 等のコンポーネントを通して行う必要があります。また、与える荷重値の時間的な変化はシグナルベースのブロックを用いて行います。Modelica の Blocks ライブラリのコンポーネントで時間的な変化を与えることも可能ですが、シグナルベースのブロックではより多彩な信号形式が用意されおり、Activate ではこちらを使用することを薦めています。

上述したシグナルベースモデルに合わせて、ここでは StepGenerator を信号定義のために使用します。以下のように、StepGenerator のポートを Force の空いているポートに接続します。センサーの時と同様にインターフェースのためのブロックが自動生成されます。この場合はシグナルベースモデルの信号を Modelica に変換するので、生成されるブロックは ToModelica です。

image

ブロックダイアログ

ブロックダイアログでのパラメータ値の指定方法はシグナルベースのブロックの場合と同じです。ただし、Modelica では多くのパラメータが物理的な意味を持っているため、参考のための単位を表示している場合が多くあります。これはあくまで参考のための表示であり、ユーザーが単位を統一して値を指定する必要があることに変わりはりません。

このモデルでは、バネ定数、質量、減衰係数の値をそれぞれ各ブロックダイアログで以下のように設定しています。

image

image

image

ちなみに、このモデルではステップ荷重(力)を与えていますが、 Mass コンポーネントに初期速度を与えてシミュレーションを行うこともできます。その場合の Mass のブロックダイアログは以下のようになります。

image


ここでは、指定した初期値を確実に使うために fixed フィールドを true に変更しています。ここを false のままにすると、Modelica 側で収束に適した初期値に変更してしまう可能性があります。ただし、fixed にした上で矛盾した初期値を与えるとエラーで落ちるため注意が必要です。あまり良い例ではありませんが、例えば、直接リンクされた2つの Mass コンポーネントにそれぞれ異なる初期値を与えるというような場合です。

上記の初期速度を与えた場合のモデル(添付:SpringMass_Vertical_InitialVelocity.scm)と結果は以下の通りです。

imageimage 

Modelica モデルとシグナルベースモデルの混在

Activate の大きな特長の一つに異なる種類のモデルがひとつのダイアグラム内で混在できることがあります。ここでは上述した2種類のバネマスモデルを下図のように1つにまとめて、結果が一致することを確認してみます(添付:SpringMass_Modelica_SignalBased.scm)。

image

このモデルの結果は以下となり、シグナルベースモデルと Modelica モデルで結果が完全に一致していることが分かります。

image

今回は、バネマスモデルを題材として Modelica ライブラリを用いたモデル作成の手順を簡単に説明しました。次回は Modelica を使う場合に必須となる知識である、Modelica が扱う物理量(アクロス変数/スルー変数)と、それに関連してセンサーの使い方について紹介します。

Modelicaについて詳しく勉強したい場合はModelica Associationのウェブサイトを参照するか、もしくは以下の日本語の書籍を参照してください。

  • Peter Fritzson(著) 「Modelicaによるシステムシミュレーション入門」 (発行:TecShare)
  • 平野豊(著) 「Modelicaによるモデルベースシステム開発入門」 (発行:TecShare)
  • 広野友英(著) 「はじめてのModelicaプログラミング」 (発行:TecShare) -