Main Content

シンボリック式からの MATLAB 関数の生成

matlabFunction を使って MATLAB® 関数ハンドルを生成できます。この関数ハンドルは、シンボリック式の変数に数値を代入する場合と同じ方法で数値を計算するものです。また、matlabFunction は、引数を受け取ることのできるファイルを生成できます。そのファイルは受け取った引数に適用するシンボリック式を評価します。生成されたファイルは、すべての MATLAB 計算で使用できます。これは、ファイルを実行するコンピューターに Symbolic Math Toolbox™ 関数のライセンスがあるかどうかを問いません。

関数ハンドルの生成

matlabFunction は、任意のシンボリック式から関数ハンドルを生成できます。以下に例を示します。

syms x y
r = sqrt(x^2 + y^2);
ht = matlabFunction(tanh(r))
ht = 
  function_handle with value:
    @(x,y)tanh(sqrt(x.^2+y.^2))

この関数ハンドルは、数値的な計算に使用できます。

ht(.5,.5)
ans =
    0.6089

関数ハンドルには、通常の MATLAB の倍精度の数値または行列を渡すことができます。以下に例を示します。

cc = [.5,3]; 
dd = [-.5,.5];
ht(cc, dd)
ans =
    0.6089    0.9954

ヒント

一部のシンボリック式は MATLAB 関数で表すことができません。matlabFunction はこれらのシンボリック式を変換できませんが、警告を表示します。これらの式によって未定義の関数呼び出しが行われる可能性があるため、常に変換結果をチェックし、結果として得られた関数を実行して結果を確認します。

変数の順序の制御

matlabFunction は、シンボリック式から入力変数をアルファベット順に生成します。そのため、関数ハンドルの生成の関数ハンドルでは xy より先に書かれています。

ht = @(x,y)tanh((x.^2 + y.^2).^(1./2))

関数ハンドルでの入力変数の順序を指定するには、オプション vars を使用します。文字ベクトルの cell 配列、シンボリック配列またはシンボリック変数のベクトルを渡すことにより順序を指定します。以下に例を示します。

syms x y z
r = sqrt(x^2 + 3*y^2 + 5*z^2);
ht1 = matlabFunction(tanh(r), 'vars', [y x z])
ht1 = 
  function_handle with value:
    @(y,x,z)tanh(sqrt(x.^2+y.^2.*3.0+z.^2.*5.0))
ht2 = matlabFunction(tanh(r), 'vars', {'x', 'y', 'z'})
ht2 = 
  function_handle with value:
    @(x,y,z)tanh(sqrt(x.^2+y.^2.*3.0+z.^2.*5.0))
ht3 = matlabFunction(tanh(r), 'vars', {'x', [y z]})
ht3 = 
  function_handle with value:
    @(x,in2)tanh(sqrt(x.^2+in2(:,1).^2.*3.0+in2(:,2).^2.*5.0))

ファイルの生成

シンボリック式からは、関数ハンドルのほかに、ファイルを生成することもできます。ファイル名を指定するには、file オプションを使用します。ファイル名またはファイルのパスを含む文字ベクトルを渡します。ファイルのパスを指定しない場合は、matlabFunction によってこのファイルが現在のフォルダーに作成されます。

次の例では、倍精度の入力 txy に対して、シンボリック行列 F の値を計算するファイルが生成されます。

syms x y t
z = (x^3 - tan(y))/(x^3 + tan(y));
w = z/(1 + t^2);
F = [w,(1 + t^2)*x/y; (1 + t^2)*x/y,3*z - 1];
matlabFunction(F,'file','testMatrix.m')

ファイル testMatrix.m は、以下のコードを含みます。

function F = testMatrix(t,x,y)
%TESTMATRIX
%    F = TESTMATRIX(T,X,Y)

t2 = x.^2;
t3 = tan(y);
t4 = t2.*x;
t5 = t.^2;
t6 = t5 + 1;
t7 = 1./y;
t8 = t6.*t7.*x;
t9 = t3 + t4;
t10 = 1./t9;
F = [-(t10.*(t3 - t4))./t6,t8; t8,- t10.*(3.*t3 - 3.*t2.*x) - 1];

matlabFunction は、多くの中間変数を生成します。これは、"最適化された" コードと呼ばれます。MATLAB によって生成される中間変数は、小文字の t に自動生成される番号を付けたもので、たとえば t32 などです。中間変数は、中間式 (F の計算における、t4t6t8t9t10) を再利用するため、結果のコードが効率的になります。また、式が短くなるため、コードが読みやすくなります。

入力変数の既定の順序、アルファベット順を変更するには、vars オプションを使用します。例の続き、

matlabFunction(F,'file','testMatrix.m','vars',[x y t])

は、入力変数の順序が異なる点以外は前のファイルと等価なファイルを生成します。

function F = testMatrix(x,y,t)
...

出力変数名の指定

既定の出力変数名は、matlabFunction を呼び出すときに使用する名前と同じです。たとえば、変数 F を使用して matlabFunction を呼び出すと

syms x y t
z = (x^3 - tan(y))/(x^3 + tan(y));
w = z/(1 + t^2);
F = [w, (1 + t^2)*x/y; (1 + t^2)*x/y,3*z - 1];
matlabFunction(F,'file','testMatrix.m','vars',[x y t])

生成される出力変数の名前も F になります。

function F = testMatrix(x,y,t)
...

個々の変数でなく式を使用して matlabFunction を呼び出すと

syms x y t
z = (x^3 - tan(y))/(x^3 + tan(y));
w = z/(1 + t^2);
F = [w,(1 + t^2)*x/y; (1 + t^2)*x/y,3*z - 1];
matlabFunction(w + z + F,'file','testMatrix.m',...
'vars',[x y t])
出力変数の既定の名前は、out に番号を付けたもので、例は次のとおりです。
function out1 = testMatrix(x,y,t)
...
出力変数名をカスタマイズするには、output オプションを使用します。

syms x y z
r = x^2 + y^2 + z^2;
q = x^2 - y^2 - z^2;
f = matlabFunction(r, q, 'file', 'new_function',...
'outputs', {'name1','name2'})

生成された関数は、結果として name1name2 を返します。

function [name1,name2] = new_function(x,y,z)
...