Main Content

Generate MATLAB Function Blocks from Symbolic Expressions

Using matlabFunctionBlock, you can generate a MATLAB® Function block. The generated block is available for use in Simulink® models, whether or not the computer running the simulations has a license for Symbolic Math Toolbox™.

Generate and Edit a Block

Suppose, you want to create a model involving the symbolic expression r = sqrt(x^2 + y^2). Before you can convert a symbolic expression to a MATLAB Function block, create an empty model or open an existing one:

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

Create a symbolic expression and pass it to the matlabFunctionBlock command. Also specify the block name:

syms x y
r = sqrt(x^2 + y^2);
matlabFunctionBlock('my_system/my_block', r)

If you use the name of an existing block, the matlabFunctionBlock command replaces the definition of an existing block with the converted symbolic expression.

You can open and edit the generated block. To open a block, double-click it.

function r = my_block(x,y)
%#codegen

% x = complex(x);  % required to enforce complex operations on x
% y = complex(y);  % required to enforce complex operations on y
r = sqrt(x.^2+y.^2);

Tip

Some symbolic expressions cannot be represented using MATLAB functions. matlabFunctionBlock cannot convert these symbolic expressions, but issues a warning. Since these expressions might result in undefined function calls, always check conversion results and verify results by running the simulation containing the resulting block.

Control the Order of Input Ports

matlabFunctionBlock generates input variables and the corresponding input ports in alphabetical order from a symbolic expression. To change the order of input variables, use the vars option:

syms x y
mu = sym('mu');
dydt = -x - mu*y*(x^2 - 1);
matlabFunctionBlock('my_system/my_block', dydt,'vars', [y mu x])

Name the Output Ports

By default, matlabFunctionBlock generates the names of the output ports as the word out followed by the output port number, for example, out3. The output option allows you to use the custom names of the output ports:

syms x y
mu = sym('mu');
dydt = -x - mu*y*(x^2 - 1);
matlabFunctionBlock('my_system/my_block', dydt,'outputs',{'name1'})