Wolfram Computation Meets Knowledge

外部コードを使う

チャープ関数モデリング

Modelica関数を書くことは易しいが,Cで書かれたサブルーチンを読み出すほうが便利である場合もある.このチュートリアルでは,Cで書かれた外部関数の使い方について示す.

このチュートリアルに使用されているモデル
Chirp | ChirpSignal | SeriesCircuit

チャープ関数

チャープ信号とは,次のような場合に周波数が頻繁に変化する正弦曲線である:

モデリング

まず,Chirpと呼ばれるModelica関数を作成することから始める.この関数は,同じ名前を持つC関数への外部呼出しを行う.

function Chirp
input Modelica.Units.SI.AngularVelocity w_start;
input Modelica.Units.SI.AngularVelocity w_end;
input Real A;
input Real M;
input Real t;
output Real y "output signal";
external "C" annotation(
Include = "#include \"Chirp.c\"",
IncludeDirectory = "modelica://IntroductoryExamples/Resources/ExternalFunctions/");
end Chirp;

この関数には,5個の入力信号,1個の出力信号,および外部関数Chirp.cへの呼出しが含まれる.宣言は,関数Chirp.cがこれら5個の入力で宣言され,倍精度浮動小数点数を返すと想定する.万一,何らかの理由で関数を呼び出す際の変数の順序を変えたい場合には,宣言を例えば以下に変えることによってそれが可能になる.

external "C" y = Chirp(t, A, M, w_start, w_end) annotation();

しかし,この場合には,同じ順序で同じ変数を使う関数を定義する.

double Chirp(double w1, double w2, double A, double M, double time)
{
double y;
y = A * cos(w1 * time + (w2 - w1) * time * time / (2 * M));
return y;
}

関数は,任意のテキストエディタを使って書き,Chirp.cの名前で保存することが可能である.この場合,Cファイルは,パッケージが保存されているディレクトリ内の新しいディレクトリResources/ExternalFunctionsに置かなくてはならない.他の場所に置くことも可能ではあるが,その場合には,IncludeDirectory注釈をそれに合わせて変更する必要がある.

C関数が保存されるとすぐに,Modelica関数が使えるようになる.これを行うためには,新しいModelicaブロックを作成し,その中でChirp関数を呼び出すとよい.ChirpSignalブロックを作成し,必要なパラメータを定義してから,事前定義されたModelicaコネクタModelica.Blocks.Interfaces.RealOutputクラスブラウザからダイアグラムビューにドラッグアンドドロップすることができる.そうすると,ChirpSignalブロックにコネクタのインスタンスが作成され,これをブロックの方程式セクションで直接使うことができる.

block ChirpSignal
Modelica.Blocks.Interfaces.RealOutput y »;
parameter Modelica.Units.SI.AngularVelocity w_start = 0;
parameter Modelica.Units.SI.AngularVelocity w_end = 10;
parameter Real A = 1;
parameter Real M = 10;
equation
y = Chirp(w_start, w_end, A, M, time);
end ChirpSignal;

このシミュレーション結果に示されるように,信号が10秒間に0 rad/sから10 rad/sまで増加するように,デフォルトパラメータが設定されていることに注意されたい.

5.gif

IntroductoryExamples.ExternalFunctions.ChirpSignalモデルのチャープ信号yのプロット.

事前定義されたModelicaコネクタModelica.Blocks.Interfaces.RealOutputを使った結果,ChirpSignalを入力ソースとして他のモデルにおいて使うことができる.例えば,以下の電気回路の共振周波数をテストするのに使うことができる.

IntroductoryExamples.ExternalFunctions.SeriesCircuitモデルのダイアグラムビュー

電気成分のデフォルトパラメータが上の図に従って変更されたことに注意されたい.また,チャープのパラメータが0 rad/sから1000 rad/sまで素早く変化するように変更されている.

次に,電流のシミュレーションを行い,観察する.

7.gif

IntroductoryExamples.ExternalFunctions.SeriesCircuitモデルの電流のプロット.

上にあるように,振幅が約5秒の時点で最大になり,これは以下に対応する:

これは,以下のように,回路の共振周波数を分析的に計算することによっても確かめられる:

もちろん,より複雑な系においては,共振周波数を解析的に計算することが難しい場合もある.そのような場合には,チャープ信号が非常に役立つ.

練習問題

チャープ信号は,外部関数を使わずに,単一のModelicaブロックとして実装することも簡単にできる.興味のある読者は,練習問題としてこれに挑戦されたい.