主要内容

用MATLAB编码器生成模糊系统代码

您可以使用MATLAB®Coder™生成评估模糊系统的代码。有关生成代码的更多信息,请参见代码生成(MATLAB编码器)

创建模糊系统

为了生成用于评估模糊系统的代码,必须首先设计一个模糊推理系统。有关更多信息,请参见在命令行构建模糊系统使用模糊逻辑设计器构建模糊系统,调整模糊推理系统

您可以生成用于评估以下类型的模糊系统的代码。

  • Type-1 Mamdani FIS使用mamfis对象

  • Type-1 Sugeno FIS实现使用sugfis对象

  • Type-2 Mamdani FIS使用mamfistype2对象

  • Type-2 Sugeno FIS实现使用sugfistype2对象

  • FIS树实现使用fistree对象的任意组合mamfissugfismamfistype2,或sugfistype2对象

在本例中,您将为type-2 Sugeno FIS和FIS树生成代码。该工作流程也适用于其他类型的模糊系统。

加载最终调优的type-2 Sugeno FIS从利用Type-2 FIS预测混沌时间序列

数据a1 =负载(“tunedfischaotictimeseriestype2.mat”);Fis = data1.fisout3;

加载最终调优的FIS树利用模糊逻辑设计人工胰腺控制器

Data2 = load(“fuzzyPancreasExampleData.mat”);fisTree = data2.fisTMFTuned;

将模糊系统转化为齐次结构

使用MATLAB Coder生成代码不直接支持FIS对象或FIS树对象。金宝app方法将FIS或FIS树转换为同构结构,以生成用于评估模糊系统的代码getFISCodeGenerationData函数。

将Sugeno FIS转换为均匀结构。

fisData = getFISCodeGenerationData(fis);

将FIS树转换为同构结构。

fisTreeData = getFISCodeGenerationData(fisree);

用嵌入式模糊系统生成代码

如果编译后不希望更改模糊系统属性,可以在生成的代码中嵌入FIS或FIS树数据。模糊系统的嵌入方法有三种。

  • 从MATLAB工作区中嵌入FIS数据

  • 嵌入MAT文件中的FIS数据

  • 从FIS文件嵌入FIS数据(* .fis).

从MATLAB工作区嵌入FIS

为输入向量创建一个模糊系统的评估函数x.属性的选项在此函数中evalfis函数使用evalfisOptions对象。

函数Y = evaluatefis1(fis,x)% # codegenopt = evalfisOptions“NumSamplePoints”, 51);Y = evalfis(fis,x,opt);结束

evaluatefis1使用Sugeno FIS储存在fisData.当生成代码时:

  • 指定金融中间人input参数为常量,它将FIS数据嵌入到生成的代码中。

  • 指定输入向量的大小。在本例中,FIS有四个输入变量。因此,将输入向量指定为包含四个元素的零向量。

  • 为构建指定目标,例如静态库、可执行文件或MEX文件。对于本例,生成一个MEX文件。

codegen (“evaluatefis1”“参数”,{code . constant (fisData),[0 0 0 0 0]},“配置:墨西哥人”
代码生成成功。

验证MEX文件的执行。

  1. 计算MEX文件中的一个或多个输入值。在调用MEX文件时,指定与编译时使用的相同的FIS结构。

  2. 为相同的输入值计算原始FISevaluatefis1.在评估FIS使用时evaluatefis1,采用相同的均匀FIS结构。

  3. 比较评价结果。

mexOutput1 = evaluatefis1_mex(fisData,[0.3 0.1 0.8 0.2])
mexOutput1 = 0.6913
evalfisOutput1 = evaluatefis1(fisData,[0.3 0.1 0.8 0.2])
evalfisOutput1 = 0.6913

从MAT文件中嵌入FIS

如果FIS或FIS树存储在MAT文件中,则可以通过从计算函数中加载FIS数据来将FIS数据嵌入到生成的代码中。

将FIS树数据保存到MAT文件中。

保存(“FISTreeData.mat”“fisTreeData”“垫”);

指定一个函数来计算输入向量x的FIS树。这个函数假设FIS树作为变量存储在MAT文件中fisTreeData

函数Y = evaluatefis2(x)% # codegenS = code .load(“FISTreeData.mat”);opt = evalfisOptions“NumSamplePoints”, 51);y = evalfis(s.fisTreeData,x,opt);结束

evaluatefis2

codegen (“evaluatefis2”“参数”,{[0 0 0]},“配置:墨西哥人”
代码生成成功。

验证MEX文件的执行。

mexOutput2 = evaluatefis2_mex([105 0.25 0.001])
mexOutput2 = 0.7366
evalfisOutput2 = evaluatefis2([105 0.25 0.001])
evalfisOutput2 = 0.7366

从FIS文件中嵌入FIS

如果type-1或type-2 FIS存储在FIS文件中,则可以通过从计算函数中读取FIS数据来将FIS数据嵌入到生成的代码中。FIS树不支持此工作流。金宝app

将type-2 FIS保存到一个文件。

writeFIS (fis,“predictTimeSeries.fis”

指定一个函数,用于对输入向量x的模糊系统进行评估。在这个函数中,从文件中读取FIS数据predictType2.fis.由于存储的FIS是type-2系统,所以在调用时必须指定FIS类型getFISCodeGenerationData.如果存储的FIS是type-1系统,则不必指定FIS类型。

函数Y = evaluatefis3(x)% # codegenfisData = getFISCodeGenerationData(“predictTimeSeries.fis”“FuzzySetType”“type2”);opt = evalfisOptions“NumSamplePoints”, 51);y = evalfis(fisData,x,opt);结束

evaluatefis3

codegen (“evaluatefis3”“参数”,{[0 0 0 0]},“配置:墨西哥人”
代码生成成功。

验证MEX文件的执行。

mexOutput3 = evaluatefis3_mex([0.3 0.1 0.8 0.2])
mexOutput3 = 0.6913
evalfisOutput3 = evaluatefis3([0.3 0.1 0.8 0.2])
evalfisOutput3 = 0.6913

生成在运行时加载模糊系统的代码

若要在编译后更改FIS属性,可以生成用于计算在运行时从指定的FIS文件中读取的FIS的代码。在这种情况下,FIS数据没有嵌入到生成的代码中。FIS树不支持在编译FIS文件后修改模糊系统属性。金宝app

指定一个函数,用于对输入向量的指定FIS文件中定义的模糊系统进行评估x.此函数使用相同的输入数据类型evaluatefis4

函数y = evaluatefis4(fisFileName,x)% # codegenfis = getFISCodeGenerationData(fisFileName,“FuzzySetType”“type2”);opt = evalfisOptions“NumSamplePoints”, 51);Y = evalfis(fis,x,opt);结束

定义此函数的输入数据类型。

文件名= code .newtype(“字符”,[1 Inf],[false true]);X = code .newtype(“双”,[1 Inf],[false true]);

evaluatefis4

codegen (“evaluatefis4”“参数”{文件名,x},“配置:墨西哥人”
代码生成成功。

验证MEX文件的执行。

mexOutput4 = evaluatefis4_mex(“predictTimeSeries.fis”,[0.3 0.1 0.8 0.2])
mexOutput4 = 0.6913
evalfisOutput4 = evalatefis4 (“predictTimeSeries.fis”,[0.3 0.1 0.8 0.2])
evalfisOutput4 = 0.6913

每次你奔跑evaluatefis4,该函数从指定文件中重新加载模糊系统。为了提高计算效率,可以创建一个不重新加载先前加载的FIS的函数。例如,evaluatefis5函数只在指定了新文件名时才从FIS文件中加载FIS。

函数y = evaluatefis5(fileName,x)% # codegen持续的fisName fis如果isempty(fisName) [fisName,fis] = loadFIS(fileName);elseif~strcmp(fisName,fileName) [fisName,fis] = loadFIS(fileName);结束opt = evalfisOptions“NumSamplePoints”, 51);Y = evalfis(fis,x,opt);结束函数[fisName,fis] = loadFIS(fileName) fisName = fileName;fis = getFISCodeGenerationData(fisName,“FuzzySetType”“type2”);结束

evaluatefis5.此函数的输入数据类型与for相同evaluatefis2

codegen (“evaluatefis5”“参数”{文件名,x},“配置:墨西哥人”
代码生成成功。

使用存储的type-2 FIS执行MEX文件。

mexOutput5 = evaluatefis5_mex(“predictTimeSeries.fis”,[0.3 0.1 0.8 0.2])
mexOutput5 = 0.6913

您可以使用此函数计算具有相同输入数量的另一个FIS。例如,保存FIS的中间版本利用Type-2 FIS预测混沌时间序列predictTimeSeries2.fis,并使用MEX文件对相同的输入值计算FIS。

writeFIS (data1.fisout2“predictTimeSeries2.fis”) mexOutput5_2 = evaluatefis5_mex(“predictTimeSeries2.fis”,[0.3 0.1 0.8 0.2])
mexOutput5_2 = 0.7934

生成单精度数据代码

前面的示例为双精度数据生成代码。若要为单精度数据生成代码,请将输入值的数据类型指定为.在计算FIS对象和FIS树对象时,可以使用单精度数据。例如,为生成代码evaluatefis2使用单精度数据。

codegen (“evaluatefis2”“参数”,{single([0 0 0])},“配置:墨西哥人”
代码生成成功。

执行MEX文件,传入单精度输入值。

mexOutputSingle = evaluatefis2_mex(single([105 0.25 0.001]))
mexOutputSingle = 0.7366

另请参阅

||

相关的话题