Main Content

matlabFunctionBlock

MATLAB Function ブロックへのシンボリック式の変換

説明

matlabFunctionBlock(block,f) は、f を MATLAB® Function ブロックに変換し、Simulink® モデルで使用できるようにします。ここで、f はシンボリック式、シンボリック関数、またはシンボリック式か関数のベクトルになります。

block は、作成または変更するブロックの名前を指定します。

matlabFunctionBlock(block,f1,...,fN) は、シンボリック式または関数 f1,...,fNN 個の出力をもつ MATLAB Function ブロックに変換します。f1,...,fN の各要素は、シンボリック式、シンボリック関数、またはシンボリック式か関数のベクトルになります。

matlabFunctionBlock(___,Name,Value) は、前の構文の入力引数の組み合わせのいずれかとともに 1 つ以上の名前と値の引数で指定された追加オプションを使用して、シンボリック式、シンボリック関数、またはシンボリック式か関数のベクトルを MATLAB Function ブロックに変換します。

すべて折りたたむ

新しいモデルを作成し、シンボリック式を MATLAB Function ブロックへ変換します。Comments オプションを指定して、ブロック内にコメントを含めます。

新しいモデルを作成して開きます。

new_system('my_system')
open_system('my_system')

シンボリック式を作成します。

syms x y z
f = x^2 + y^2 + z^2;

matlabFunctionBlock を使用して、シンボリック式を含むブロック my_block を作成します。matlabFunctionBlock は既存のブロックを上書きします。

matlabFunctionBlock('my_system/my_block',f)

MATLAB function block for the function f = my_block(x,y,z)

生成されたブロックをダブルクリックして開き、ブロックを定義する関数を編集します。

function f = my_block(x,y,z)
%#codegen

%    This function was generated by the Symbolic Math Toolbox version 7.3.
%    01-Jan-2017 00:00:00

f = x.^2+y.^2+z.^2;

コメント Version 1.1 をブロックに含めます。

matlabFunctionBlock('my_system/my_block',f,'Comments','Version: 1.1')
function f = my_block(x,y,z)
...
%Version: 1.1
f = x.^2+y.^2+z.^2;

my_system を保存して閉じます。

save_system('my_system')
close_system('my_system')

新しいモデルを作成し、シンボリック関数を MATLAB Function ブロックへ変換します。

新しい空のモデルを作成して開きます。

new_system('my_system')
open_system('my_system')

シンボリック関数を作成します。

syms x y z
f(x,y,z) = x^2 + y^2 + z^2;

f を MATLAB Function ブロックに変換します。ブロックをダブルクリックして、関数を確認します。

matlabFunctionBlock('my_system/my_block',f)
function f = my_block(x,y,z)
%#codegen
f = x.^2+y.^2+z.^2;

複数のシンボリック式を、複数の出力端子をもつ MATLAB Function ブロックに変換します。

新しい空のモデルを作成して開きます。

new_system('my_system')
open_system('my_system')

3 つのシンボリック式を作成します。

syms x y z
f = x^2;
g = y^2;
h = z^2;

それらを MATLAB Function ブロックに変換します。matlabFunctionBlock は 3 つの出力端子をもつブロックを作成します。ブロックをダブルクリックして、関数を確認します。

matlabFunctionBlock('my_system/my_block',f,g,h)
function [f,g,h] = my_block(x,y,z)
%#codegen
f = x.^2;
if nargout > 1
    g = y.^2;
end
if nargout > 2
    h = z.^2;
end

生成された MATLAB Function ブロックを定義する関数の名前を指定します。

新しい空のモデルを作成して開きます。

new_system('my_system')
open_system('my_system')

シンボリック式を作成します。

syms x y z
f = x^2 + y^2 + z^2;

ブロックを作成し、関数名を my_function に設定します。ブロックをダブルクリックして、関数を確認します。

matlabFunctionBlock('my_system/my_block',f,...
                    'FunctionName','my_function')
function f = my_function(x,y,z)
%#codegen
f = x.^2+y.^2+z.^2;

シンボリック式を MATLAB Function ブロックに変換するときに、matlabFunctionBlock は既定でコードを最適化します。この方法は、以降のこのファイルを使用した計算の単純化および高速化に役立ちます。ただし、一部のシンボリック式やシンボリック関数では、そこからの最適化コードの生成に非常に時間がかかることがあります。コードの最適化を無効にするには、Optimize を使用します。

新しい空のモデルを作成して開きます。

new_system('my_system')
open_system('my_system')

シンボリック式を作成します。

syms x
r = x^2*(x^2 + 1);

matlabFunctionBlock を使用して、シンボリック式を含むブロック my_block を作成します。ブロックをダブルクリックし、ブロックを定義する関数を確認します。既定では、matlabFunctionBlock は最適化されたコードを含むファイルを生成します。

matlabFunctionBlock('my_system/my_block',r)
function r = my_block(x)
%#codegen
t2 = x.^2;
r = t2.*(t2+1.0);

Optimize の値を false に設定することによって、コードの最適化を無効にします。

matlabFunctionBlock('my_system/my_block',r,...
                    'Optimize',false)
function r = my_block(x)
%#codegen
r = x.^2.*(x.^2+1.0);

生成されたブロックの入力端子を形成する入力変数の順番を指定します。

新しい空のモデルを作成して開きます。

new_system('my_system')
open_system('my_system')

シンボリック式を作成します。

syms x y z
f = x^2 + y^2 + z^2;

この式を MATLAB Function ブロックに変換します。既定では、matlabFunctionBlock はシンボリック式を変換するときに入力引数をアルファベット順に使用します。

matlabFunctionBlock('my_system/my_block',f)
function f = my_block(x,y,z)
%#codegen
f = x.^2+y.^2+z.^2;

引数 Vars を使用して入力端子の順番を指定します。

matlabFunctionBlock('my_system/my_block',f,...
                    'Vars',[y z x])
function f = my_block(y,z,x)
%#codegen
f = x.^2+y.^2+z.^2;

自動生成される要素の入力変数を明示的に指定します。

新しい空のモデルを作成して開きます。

new_system('my_system')
open_system('my_system')

シンボリック変数 u およびシンボリック変数 x の 3 行 1 列のベクトルを作成します。次のコマンドは、MATLAB ワークスペースにシンボリック変数 x1x2x3 も自動的に生成します。

syms u
syms x [3 1]
whos
  Name      Size            Bytes  Class    Attributes

  u         1x1                 8  sym                
  x         3x1                 8  sym                
  x1        1x1                 8  sym                
  x2        1x1                 8  sym                
  x3        1x1                 8  sym                

シンボリック変数 u および x を使用するシンボリック式を作成します。

A = [0 1 0; 0 0 1; -1 -1 -2];
b = [0; 0; 3];
xdot = A*x+b*u
xdot =
 
                  x2
                  x3
3*u - x1 - x2 - 2*x3

この式 xdot を MATLAB Function ブロックに変換します。xdot の要素には変数 u と、自動生成された変数 x1x2x3 が含まれているため、ux を使用する代わりに、これらの変数に関して Vars 引数を明示的に指定します。

matlabFunctionBlock('my_system/my_block',xdot,'Vars',{u,x1,x2,x3})
function xdot = my_block(u,x1,x2,x3)
%#codegen
xdot = [x2;x3;u.*3.0-x1-x2-x3.*2.0];

ブロックを作成するときに、出力変数および対応する端子の名前を変更します。

新しい空のモデルを作成して開きます。

new_system('my_system')
open_system('my_system')

シンボリック式を作成します。

syms x y z
f = x^2 + y^2 + z^2;

この式を MATLAB Function ブロックに変換し、出力変数と出力端子の名前を指定します。ブロックをダブルクリックし、ブロックを定義する関数を確認します。

matlabFunctionBlock('my_system/my_block',f,f + 1,f + 2,...
                    'Outputs',{'name1','name2','name3'})
function [name1,name2,name3] = my_block(x,y,z)
%#codegen
t2 = x.^2;
t3 = y.^2;
t4 = z.^2;
name1 = t2+t3+t4;
if nargout > 1
    name2 = t2+t3+t4+1.0;
end
if nargout > 2
    name3 = t2+t3+t4+2.0;
end

いくつかの名前と値のペアの引数を同時に使用して matlabFunctionBlock を呼び出します。

新しい空のモデルを作成して開きます。

new_system('my_system')
open_system('my_system')

シンボリック式を作成します。

syms x y z
f = x^2 + y^2 + z^2;

名前と値のペアの引数を使用して matlabFunctionBlock を呼び出し、関数名、入力端子の順および出力端子の名前を指定します。ブロックをダブルクリックし、ブロックを定義する関数を確認します。

matlabFunctionBlock('my_system/my_block',f,f + 1,f + 2,...
                    'FunctionName','my_function','Vars',[y z x],...
                    'Outputs',{'name1','name2','name3'})
function [name1,name2,name3] = my_function(y,z,x)
%#codegen
t2 = x.^2;
t3 = y.^2;
t4 = z.^2;
name1 = t2+t3+t4;
if nargout > 1
    name2 = t2+t3+t4+1.0;
end
if nargout > 2
    name3 = t2+t3+t4+2.0;
end

生成された MATLAB Function ブロックで複素数入力を指定します。

新しい空のモデルを作成して開きます。

new_system('my_system')
open_system('my_system')

入力の平方根を求めるシンボリック関数を作成します。

syms x
f = sqrt(x);

f を MATLAB Function ブロックに変換します。

matlabFunctionBlock('my_system/my_block',f,'FunctionName','sqrt_block')

平方根関数は入力 x が負の場合に複素数の結果を生成するため、生成されたブロックで複素数の入力を手動で指定する必要があります。そうしないと、Function ブロックを負の入力で実行するときにエラーが発生する可能性があります。

ブロックをダブルクリックし、ブロックを定義する関数を確認します。行 x = complex(x); を追加し、複素数の入力を指定します。R2023a 以降では、matlabFunctionBlock によって提供されるこの行をコメント解除できます。生成された関数ブロックは、複素数の入力を受け入れ、複素数出力を返すようになりました。

function f = sqrt_block(x)
%#codegen
x = complex(x);  % required to enforce complex operations on x
f = sqrt(x);
end

別の方法として、[Simulink][Math Operations] ライブラリから Complex to Real-Imag (Simulink) ブロックと Real-Imag to Complex (Simulink) ブロックを挿入することもできます。これらのブロックを追加して、x に入力される入力信号を複素信号に変換します。

MATLAB function block with additional Complex to Real-Imag and Real-Imag to Complex blocks to convert the input signal to a complex signal

入力引数

すべて折りたたむ

作成または変更するブロック。文字ベクトルとして指定します。

MATLAB Function ブロックに変換されるシンボリック入力。シンボリック式、シンボリック関数、シンボリック ベクトルまたはシンボリック行列として指定します。

N 個の出力の MATLAB Function ブロックに変換されるシンボリック入力。コンマで区切られた複数のシンボリック式、複数のシンボリック関数、複数のシンボリック ベクトルまたは複数のシンボリック行列として指定します。

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は関係ありません。

R2021a より前では、コンマを使用して名前と値の各ペアを区切り、Name を引用符で囲みます。

例: matlabFunctionBlock('my_system/my_block',f,'FunctionName','myfun')

ファイル ヘッダーに含めるコメント。文字ベクトル、文字ベクトルの cell 配列、または string ベクトルとして指定します。

関数名。文字ベクトルとして指定します。既定では、matlabFunction(block,…)block を関数名として使用します。

生成された関数の関数名の指定を参照してください。

コードの最適化のフラグ。true または false として指定します。

ファイルへの書き込みの際に、matlabFunctionBlockt0t1 といった名前の中間変数を使用してコードを最適化します。

コードの最適化の無効化を参照してください。

入力変数と生成されたブロックの対応する入力端子の順番。文字ベクトル、シンボリック変数から成るベクトル、または文字ベクトル、シンボリック変数またはシンボリック変数から成るベクトルの 1 次元 cell 配列として指定します。

指定された入力端子の数は、f 内の自由変数の数以上でなければなりません。Vars で指定される入力端子および Outputs で指定される出力端子には、同じ名前を使用しないでください。

既定では、シンボリック式を変換するときの順序は、アルファベット順です。シンボリック関数を変換するときは、入力引数は他の変数の前に配置され、その他の変数はアルファベット順に並べ替えられます。

生成されたブロックの入力端子の指定を参照してください。

出力端子名。文字ベクトルの 1 次元 cell 配列として指定します。出力端子名を指定しない場合、matlabFunctionBlock では語 out とそれに続く出力端子番号から構成される名前 (out3 など) を使用します。

Vars で指定される入力端子および Outputs で指定される出力端子には、同じ名前を使用しないでください。出力端子の指定を参照してください。

制限

  • simplifysolve といった、double データ型を扱い、対応する MATLAB 関数をもたないいくつかのシンボリック関数は、生成された MATLAB Function ブロックにシンボリック関数として保持されます。これらの関数で構成される変換後の関数ブロックは、Simulink モデルで使用できません。double データ型を使用する独自の関数を作成して、これらのシンボリック関数を置き換える必要があります。Simulink モデルで使用できないシンボリック関数の詳細については、MathWorks テクニカルサポートにお問い合わせください。

バージョン履歴

R2009a で導入