exponenta event banner

Создание кода для нечеткой системы с помощью кодера MATLAB

Можно создать код для оценки системы нечеткого вывода с помощью MATLAB ® Coder™. Дополнительные сведения о создании кода см. в разделе Создание кода (кодер MATLAB).

Для создания кода для анализа нечетких систем необходимо сначала создать нечеткую систему вывода (FIS). Дополнительные сведения см. в разделах Сборка нечетких систем в командной строке и Сборка нечетких систем с использованием конструктора нечеткой логики.

Хотя в этом примере генерируется код для системы нечеткого вывода Mamdani типа 1, рабочий процесс также применяется к системам нечеткого вывода Sugeno и Type-2.

Создание кода с помощью кодера MATLAB не поддерживает нечеткие объекты FIS (mamfis, sugfis, mamfistype2, sugfistype2). Для создания кода для анализа нечетких систем необходимо преобразовать объекты нечеткой системы вывода в однородные структуры с помощью getFISCodeGenerationData функция.

Внедрение данных FIS в сгенерированный код

Данные системы нечеткого вывода можно встроить в созданный код. Используйте эту опцию, если не требуется изменять данные FIS после компиляции.

Сначала создайте нечеткую систему или загрузите нечеткую систему из .fis файл. Для этого примера загрузите нечеткую систему из tipper.fis.

fisObject = readfis("tipper.fis");

Чтобы использовать этот FIS для генерации кода, преобразуйте его в однородную структуру.

fis = getFISCodeGenerationData(fisObject);

По умолчанию getFISCodeGenerationData предполагает, что объект FIS является системой типа 1. Для создания кода для системы типа 2 необходимо указать тип системы с помощью getFISCodeGenerationData(fisObject,"type2").

Создание функции для анализа нечеткой системы fis для данного входного вектора x. В рамках этой функции можно указать опции для evalfis функция с использованием evalfisOptions.

function y = evaluatefis1(fis,x)
    %#codegen
    opt = evalfisOptions('NumSamplePoints',51);
    y = evalfis(fis,x,opt);
end

Создать код для evaluatefis1, указывая, что fis входной аргумент является постоянным. Для построения можно указать различные конечные объекты, например статическую библиотеку, исполняемый файл или файл MEX. Для этого примера создайте файл MEX.

codegen('evaluatefis1','-args',{coder.Constant(fis),[0 0]},'-config:mex')
Code generation successful.

Для проверки выполнения файла MEX:

  1. Вычислите файл MEX для одного или нескольких входных значений. При вызове файла MEX укажите ту же структуру FIS, которая использовалась во время компиляции.

  2. Вычислите исходный FIS для тех же входных значений с помощью evalfis. При оценке с использованием evalfis, использовать ту же однородную структуру FIS.

  3. Сравните результаты оценки.

mexOutput1 = evaluatefis1_mex(fis,[7 9])
mexOutput1 = 21.0327
opt = evalfisOptions('NumSamplePoints',51);
evalfisOutput = evalfis(fis,[7 9],opt)
evalfisOutput = 21.0327

Выходные данные файла MEX соответствуют evalfis выход.

Кроме того, данные FIS можно встроить в созданный код путем считывания данных FIS из файла во время генерации кода. Укажите функцию для оценки нечеткой системы для данного входного вектора x. В рамках этой функции прочитайте данные FIS из файла tipper.fis.

function y = evaluatefis2(x)
    %#codegen
    fis = getFISCodeGenerationData('tipper.fis');
    opt = evalfisOptions('NumSamplePoints',51);
    y = evalfis(fis,x,opt);
end

Создать код для evaluatefis2.

codegen('evaluatefis2','-args',{[0 0]},'-config:mex')
Code generation successful.

Проверьте выполнение файла MEX, используя те же входные значения для x. В этом случае нет необходимости указывать исходную структуру FIS, используемую во время компиляции.

mexOutput2 = evaluatefis2_mex([7 9])
mexOutput2 = 21.0327
evalfisOutput
evalfisOutput = 21.0327

Создание кода для загрузки данных FIS во время выполнения

Можно создать код для оценки FIS, который считывается из .fis файл, указанный во время выполнения. В этом случае данные FIS не встраиваются в сгенерированный код. Укажите функцию для оценки нечеткой системы, определенной в указанном файле fileName для данного входного вектора x.

function y = evaluatefis3(fileName,x)
    %#codegen
    fis = getFISCodeGenerationData(fileName);
    opt = evalfisOptions('NumSamplePoints',51);
    y = evalfis(fis,x,opt);
end

Определите типы входных данных для этой функции.

fileName = coder.newtype('char',[1 Inf],[false true]);
x = coder.newtype('double',[1 Inf],[false true]);

Создать код для evaluatefis3.

codegen('evaluatefis3','-args',{fileName,x},'-config:mex')
Code generation successful.

Проверьте выполнение файла MEX, используя те же входные значения для x. В этом случае указывается имя .fis файл.

mexOutput3 = evaluatefis3_mex('tipper.fis',[7 9])
mexOutput3 = 21.0327
evalfisOutput
evalfisOutput = 21.0327

Каждый раз при запуске evaluatefis3, он перезагружает нечеткую систему из файла. Для эффективности вычислений можно создать функцию, которая загружает FIS только при указании нового имени файла.

function y = evaluatefis4(fileName,x)
    %#codegen
    %#internal
    
    persistent fisName fis
    if isempty(fisName)
        [fisName,fis] = loadFIS(fileName);
    elseif ~strcmp(fisName,fileName)
        [fisName,fis] = loadFIS(fileName);
    end

    opt = evalfisOptions('NumSamplePoints',51);
    y = evalfis(fis,x,opt);
end

function [fisName,fis] = loadFIS(fileName)
    fisName = fileName;
    fis = getFISCodeGenerationData(fisName);
end

Создать код evaluatefis4. Типы входных данных для этой функции те же, что и для evaluatefis3.

codegen('evaluatefis4','-args',{fileName,x},'-config:mex')
Code generation successful.

Проверьте выполнение файла MEX с использованием того же имени файла входных значений.

mexOutput4 = evaluatefis4_mex('tipper.fis',[7 9])
mexOutput4 = 21.0327
evalfisOutput
evalfisOutput = 21.0327

Создание кода для данных с одинарной точностью

В предыдущих примерах создавался код для данных с двойной точностью. Чтобы создать код для данных с одинарной точностью, укажите тип данных входных значений как single. Например, создайте код для evaluatefis2 с использованием данных с одной точностью.

codegen('evaluatefis2','-args',{single([0 0])},'-config:mex')
Code generation successful.

Проверьте выполнение файла MEX, передавая входные значения с одной точностью.

mexOutputSingle = evaluatefis2_mex(single([7 9]))
mexOutputSingle = single
    21.0327
evalfisOutput
evalfisOutput = 21.0327

См. также

|

Связанные темы