Simulink との Python コード統合の概要
このトピックでは、Python® コードと Simulink® の統合に関する概要を示します。Simulink で Python を使用するようにシステムを設定し、MATLAB Function ブロックまたは MATLAB System ブロックを使用して Python コードを Simulink と統合できます。
Python を使用するためのシステムの構成
MATLAB® で Python モジュールを呼び出すには、互換性のあるバージョンの Python がインストールされている必要があります。サポートされている Python バージョンと、MATLAB で Python を使用するためのシステムの設定の詳細については、Python を使用するためのシステムの構成を参照してください。
MATLAB から、すべての標準 Python ライブラリ、サードパーティの機能、またはユーザーが作成したモジュールにアクセスできます。MATLAB での Python の使用の詳細については、MATLAB から Python モジュールへのアクセスを参照してください。
MATLAB Function ブロックを使用した Python コードと Simulink の統合
MATLAB Function ブロックを使用して、単純な Python コードを Simulink と統合します。Python 関数またはクラス名の接頭辞として py. を使用して、MATLAB Function ブロックで Python モジュールを呼び出します。
次のコードは、py.math.cos と py.math.sin を使用して、提供された入力について複素数のオイラーの公式を計算する MATLAB 関数を実装します。
function [re, img, num] = euler(x) % Declare py.math.cos and py.math.sin as extrinsic functions coder.extrinsic('py.math.cos','py.math.sin'); % Preallocate outputs re = double(0); img = double(0); re = py.math.cos(x); img = py.math.sin(x); num = re + 1j*img; end
Python モジュールはコード生成ではサポートされておらず、実行には MATLAB エンジンが必要です。
coder.extrinsic関数を使用して外部関数として宣言することで、コード生成から Python の呼び出しを除外し、実行に MATLAB エンジンを使用できます。次のコードは、py.math.cosとpy.math.sinを外部関数として宣言します。coder.extrinsic('py.math.cos','py.math.sin');
外部関数が実行時に返す出力は
mxArrayであり、これは MATLAB 配列とも呼ばれます。MATLAB 配列に対する有効な操作は、変数に保存すること、別の外部関数に渡すこと、MATLAB に返すことに限られます。コードの式で使用するなど、mxArray値に対して他の操作を実行するには、実行時にmxArrayを既知の型に変換する必要があります。このアクションを実行するには、前の代入によって型が既に定義されている変数にmxArrayを代入します。mxArrayの事前割り当ての詳細については、外部関数の出力を実行時に返すを参照してください。次のコードは、数値の実数部と虚数部のデータ型をdoubleとして事前に割り当てます。re = double(0); img = double(0);
入力についてオイラーの公式を計算するために、Simulink で MATLAB 関数を実装します。

MATLAB System ブロックを使用した Python コードと Simulink の統合
MATLAB System ブロックを使用して、Python コードを Simulink と統合できます。アルゴリズムで状態のダイナミクス、ストリーミング データ、または追加のブロックのカスタマイズの処理が必要な場合は、このブロックを使用します。Python 関数またはクラス名の接頭辞として py. を使用して、Python モジュールを呼び出すことができます。MATLAB System ブロック内での Python 関数の呼び出しは、外部関数として宣言する必要はありません。"Simulate Using" ブロック パラメーターを Interpreted Excecution に変更します。
次のコードは、複素数のオイラーの公式を計算するために py.math.cos と py.math.sin を呼び出す MATLAB System object™ を実装します。
classdef eulerSystem < matlab.System % System object to calculate Euler's formula for an input methods (Access = protected) function [re, img, num] = stepImpl(obj, u) % Implement algorithm re = py.math.cos(u); img = py.math.sin(u); num = py.math.cos(u) + 1j*py.math.sin(u); end function [c1, c2, c3] = isOutputComplexImpl(obj) % Implement propagator to declare complexity of outputs c1 = false; c2 = false; c3 = true; end function [flag1, flag2, flag3] = isOutputFixedSizeImpl(obj) % Implement propagator to declare if outputs are fixed size flag1 = true; flag2 = true; flag3 = true; end function [sz_1, sz_2, sz_3] = getOutputSizeImpl(obj) % Implement propagator to declare output sizes sz_1 = [1,1]; sz_2 = [1,1]; sz_3 = [1,1]; end function [out_1, out_2, out_3] = getOutputDataTypeImpl(obj) % Implement propagator to declare output data types out_1 = "double"; out_2 = "double"; out_3 = "double"; end end end
入力についてオイラーの公式を計算するには、以下に示すように Simulink で System object を実装します。

モデルのコンパイル中に System ブロックの出力仕様を入力から直接推論できない場合は、伝播メソッドを定義する必要があります。上記のコードは、isOutputComplexImpl、isOutputFixedSizeImpl、getOutputSizeImpl、および getOutputDataTypeImpl の各伝播メソッドを実装しています。伝播メソッドの詳細については、伝播メソッドの追加と実装を参照してください。