メインコンテンツ

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

参考

トピック