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 の各伝播メソッドを実装しています。伝播メソッドの詳細については、伝播メソッドの追加と実装を参照してください。