Main Content

Generate MATLAB Code for Simulating Fuzzy Systems

Since R2024b

After you interactively build or tune a fuzzy system using Fuzzy Logic Designer, you can generate MATLAB® code to programmatically simulate that system. You can then use or modify the generated code for your applications.

You can generate code for all the analysis simulations defined in Analyze Fuzzy System Using Fuzzy Logic Designer.

  • Control Surface — Creates a surface plot for a FIS using the gensurf function.

  • Rule Inference — Displays a rule inference diagram for a Mamdani or Sugeno FIS using the plotrule function.

  • System Validation — Plots the output of one or more FIS objects for specified input data using the comparefis function. You can also specify output reference data and view the resulting error analysis. For this simulation, you must import data into the app before generating code.

  • Error Distribution — Plots the distribution of FIS output errors for different input combinations using the plotfiserr function. For this simulation, you must import input and output data into the app before generating code.

  • FIS Tree Data Flow — Displays the propagation of inference results through a FIS tree using the plotfis function.

For this example, you generate code for simulating the tipper system created in Build Fuzzy Systems Using Fuzzy Logic Designer. Open the app and import the tipper system.

fuzzyLogicDesigner("tipper.fis")

Fuzzy Logic Designer app showing FIS plot for tipper system

To generate simulation code for the active system in Fuzzy Logic Designer, on the Design tab, select Export > Generate Simulation Function.

App toolstrip showing the Generate Simulation Function selection in the Export menu on the far right side of the toolstrip

In the Generate MATLAB Code for a Simulation dialog box, in the Simulation list, select the type of simulation. For this example, select Rule Inference to generate code for viewing the rule inference diagram for the FIS.

Generate MATLAB Code for a Simulation dialog box open and the pointer on a selection in the Simulation list

To generate code, click OK.

The MATLAB Editor opens a generated script with this code.

function ruleInferenceSimulation(x)
%   This function evaluates a fuzzy inference system using an
%   input data point and creates a visual representation of the rule
%   inference process using the simulation results.
%
%   Input data x is a row vector of n input values for a fuzzy system. This
%   simulation uses n=2.

if nargin==0
    x = [5 5];
end

fis = constructFuzzySystem();
plotrule(fis,Inputs=x,NumSamplePoints=101);
end

function tipper = constructFuzzySystem()
%% Constructs a fuzzy system.

% Construct FIS
tipper = mamfis(Name="tipper");
% Input 1
tipper = addInput(tipper,[0 10],Name="service");
tipper = addMF(tipper,"service","gaussmf",[1.5 0], ...
    Name="poor",VariableType="input");
tipper = addMF(tipper,"service","gaussmf",[1.5 5], ...
    Name="good",VariableType="input");
tipper = addMF(tipper,"service","gaussmf",[1.5 10], ...
    Name="excellent",VariableType="input");
% Input 2
tipper = addInput(tipper,[0 10],Name="food");
tipper = addMF(tipper,"food","trapmf",[0 0 1 3], ...
    Name="rancid",VariableType="input");
tipper = addMF(tipper,"food","trapmf",[7 9 10 10], ...
    Name="delicious",VariableType="input");
% Output 1
tipper = addOutput(tipper,[0 30],Name="tip");
tipper = addMF(tipper,"tip","trimf",[0 5 10], ...
    Name="cheap",VariableType="output");
tipper = addMF(tipper,"tip","trimf",[10 15 20], ...
    Name="average",VariableType="output");
tipper = addMF(tipper,"tip","trimf",[20 25 30], ...
    Name="generous",VariableType="output");
% Rules
tipper = addRule(tipper,[1 1 1 1 2; ...
    2 0 2 1 1; ...
    3 2 3 1 2]);
end

This code:

  • Constructs the FIS object using the same construction code as Generate MATLAB Code for Building Fuzzy Systems.

  • Visualizes the rule inference diagram using the plotrule function. The NumSamplePoints input to plotrule corresponds to the Number of Samples parameter in the app.

  • Accepts a vector of input values for evaluation. By default, the function uses the midpoint of each input variable range as the input.

You can save and modify the generated code for your applications.

Generate Code for Simulations That Require Data

The preceding rule-inference example does not depend on simulation data. When you generate code for the System Validation and Error Distribution analysis methods, you must first import data into the app.

When you generate code for these simulations, the app exports the data as a MAT file. For example, for a system-validation simulation, the MAT file has the name sysValidSimData_<random_string>.mat.

This code shows an sample generated function for system validation simulation.

function systemValidationSimulation(x,y)
%   This function simulates a fuzzy system using an
%   input-output dataset and plots the results for comparison.
%
%   Input data x is an m-by-n matrix, where m is the number of data
%   points and n is the number of inputs of a fuzzy system. Output data y
%   is an m-by-p matrix, where p is the number of outputs of the fuzzy
%   system. This simulation uses n=2 and p=1.

if nargin<1
    data = load('sysValidSimData_tpee830729_af66_4421_9c54_0b07ae48c968.mat','x','y');
    x = data.x;
    y = data.y;
elseif nargin<2
    y = [];
end

fis = constructFuzzySystem();
comparefis(fis,x,OutputData=y,ShowLegend=true,ShowError=false, ...
    MergeInputs=true,MergeOutputs=true,MergeErrors=true,SelectedInputs=[1 2], ...
    SelectedOutputs=1,SelectedFIS=1,NumSamplePoints=101);
end

...

The function accepts input and output data as input arguments. If you do not specify the data, the function loads the data from the exported MAT file.

After constructing the FIS, the generated code plots the system validation using the comparefis function. The software derives the name-value arguments for the function from the options you select in the System Validation document of the app.

See Also

Apps

Functions

Topics