メインコンテンツ

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.cospy.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.cospy.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 関数を実装します。

A Simulink model with MATLAB Function block that implements a Python algorithm

MATLAB System ブロックを使用した Python コードと Simulink の統合

MATLAB System ブロックを使用して、Python コードを Simulink と統合できます。アルゴリズムで状態のダイナミクス、ストリーミング データ、または追加のブロックのカスタマイズの処理が必要な場合は、このブロックを使用します。Python 関数またはクラス名の接頭辞として py. を使用して、Python モジュールを呼び出すことができます。MATLAB System ブロック内での Python 関数の呼び出しは、外部関数として宣言する必要はありません。"Simulate Using" ブロック パラメーターを Interpreted Excecution に変更します。

次のコードは、複素数のオイラーの公式を計算するために py.math.cospy.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 を実装します。

Simulink model with system object, input and display outputs

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

参考

トピック