Создание пользовательских функций принадлежности для построения нечетких экспертных систем

 

1. Общие понятия создания построения графика функции

2. Стандартные функции принадлежности в MATLAB

 

Вид типовых функций принадлежности

 

3. Создание пользовательского интерфейса для построения функции принадлежности. Основы работы с GUI

 

Создать два пользовательских окна: первое окно отвечает за ввод данных пользователем; во втором окне отображается функция принадлежности. В результате окна должны выглядеть так

 

Для создания формы необходимо обратиться к классу функций FIGURE. Создать экземпляр этого класса с необходимыми свойствами

Свойство Position графического окна отвечает за положение окна на экране и его размер. Значением Position является вектор из четырех элементов, имеющий следующий формат:

 

[left bottom width height]

 

где left задает расстояние от левого края монитора до левого края области окна без учета толщины рамки, bottom означает расстояние от нижнего края монитора до нижнего края области окна, также без учета толщины рамки, a width и height определяют соответственно, ширину и высоту области окна

 

Откройте пустой скрипт-файл и создайте свою функцию, пропишите в ней глобальную переменную для окна, создайте экземпляр класса Figure со своими свойствами. Пример:

Сохранение функции под тем же именем что и название функции!!!

 

function MYGUI

 

global FigureMY;

FigureMY=figure('Name','Функции принадлежности','Position',[50 50 400 350],'Resize','off');

 

end

 

Свойство Resize отключает возможность изменять размер окна.

 

Далее создадим на форме надпись: «Введите название первой функции принадлежности:»

Это можно сделать добавив новый элемент типа Text. Данный экземпляр (как и все последующие в данном примере) наследуется классом uicontrol, созданного специально для пользовательского задания интерфейса.

 

global Text1;

Text1=uicontrol(FigureMY,'Style','text','Position',[50 270 300 60],'BackgroundColor',[0.7 0.7 0.7],'String','Введите название функции принадлежности:','HorizontalAlignment','center','FontName','Times New Roman','FontSize',[14]);

 

Место для ввода названия можно определить с помощью объекта Edit т.е. редактируемое поле.

Это можно сделать добавив новый элемент типа Edit.

 

global Edit1;

Edit1=uicontrol(FigureMY,'Style','edit','String','','Position',[50 240 300 30],'BackgroundColor','white','HorizontalAlignment','left','FontName','Times New Roman','FontSize',[12]);

 

Для примера предлагается рассмотреть две функции принадлежности: колоколообразную и трапецеидальную. Для этих двух функций необходимо создать 4 переменных: a, b, c, d. Согласно расчётных формул описанных раньше. Для колоколообразной необходимо лишь 3 переменные, при второй функции добавляется четвертая.

Добавление надписи и места для ввода можно осуществить по аналогии предыдущих действий.

 

global a;

a=uicontrol(FigureMY,'Style','text','Position',[50 210 50 30],'BackgroundColor',[0.7 0.7 0.7],'String','a=','HorizontalAlignment','center','FontName','Times New Roman','FontSize',[14]);

 

global EditA;

EditA=uicontrol(FigureMY,'Style','edit','String','','Position',[100 210 50 30],'BackgroundColor','white','HorizontalAlignment','left','FontName','Times New Roman','FontSize',[12]);

 

Создайте по аналогии для остальных 3 точек.

 

Когда все параметры заданы, осталось создать три кнопки, реализующие три основные процедуры: считать данные, построить график и закрыть окно.

Начнём с самой простой кнопки «Закрыть окно». Для этого снова создадим глобальную переменную и с помощью uicontrol фигуру типа «Кнопка». Пример:

global CL;

CL=uicontrol(FigureMY,'Style','pushbutton','String','Выход','Position',[300 10 80 30],'Callback','MyExit','FontName','Times New Roman');

 

Обратите внимание, что появилось новое свойство у объекта так называемая 'Callback' функция, после этого свойства задаётся имя функции 'MyExit', которая отвечает за реализацию действия закрытия окна. Для этого в отдельном скрипте пропишите эту функцию, как показано на рисунке:

 

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

Теперь сохраните все изменения и запустите главную функцию MyGui. Кнопка уже должна работать.

 

Следующая кнопка «Сохранить данные».

 

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

В этой же функции проделайте такую операцию с оставшимися переменными.

Не забудьте сохранить функцию.

Когда функция описана, можно прикрепит её к кнопке. Создайте кнопку по аналогии.

global SaveVariable;

SaveVariable=uicontrol(FigureMY,'Style','pushbutton','String','Сохранить данные','Position',[100 100 100 30],'Callback','Save','FontName','Times New Roman');

 

Последняя кнопка отвечает за построение графика.

global CreatePlot;

CreatePlot=uicontrol(FigureMY,'Style','pushbutton','String','Построить график','Position',[250 100 100 30],'Callback','CreatePl','FontName','Times New Roman');

Функция отвечающая за саму реализацию построения графика 'CreatePl'. Её необходимо прописать отдельно, так как и предыдущую функцию сохранения данных.

 

Приложение

 

MYGUI

 

function MYGUI

 

global FigureMY;

FigureMY=figure('Name','Функции принадлежности','Position',[50 50 400 350],'Resize','off');

 

global Text1;

Text1=uicontrol(FigureMY,'Style','text','Position',[50 270 300 60],'BackgroundColor',[0.7 0.7 0.7],'String','Введите название функции принадлежности:','HorizontalAlignment','center','FontName','Times New Roman','FontSize',[14]);

 

global Edit1;

Edit1=uicontrol(FigureMY,'Style','edit','String','','Position',[50 240 300 30],'BackgroundColor','white','HorizontalAlignment','left','FontName','Times New Roman','FontSize',[12]);

 

global a;

a=uicontrol(FigureMY,'Style','text','Position',[50 210 50 30],'BackgroundColor',[0.7 0.7 0.7],'String','a=','HorizontalAlignment','center','FontName','Times New Roman','FontSize',[14]);

 

global EditA;

EditA=uicontrol(FigureMY,'Style','edit','String','','Position',[100 210 50 30],'BackgroundColor','white','HorizontalAlignment','left','FontName','Times New Roman','FontSize',[12]);

 

global b;

b=uicontrol(FigureMY,'Style','text','Position',[150 210 50 30],'BackgroundColor',[0.7 0.7 0.7],'String','b=','HorizontalAlignment','center','FontName','Times New Roman','FontSize',[14]);

 

global EditB;

EditB=uicontrol(FigureMY,'Style','edit','String','','Position',[200 210 50 30],'BackgroundColor','white','HorizontalAlignment','left','FontName','Times New Roman','FontSize',[12]);

 

global c;

b=uicontrol(FigureMY,'Style','text','Position',[250 210 50 30],'BackgroundColor',[0.7 0.7 0.7],'String','c=','HorizontalAlignment','center','FontName','Times New Roman','FontSize',[14]);

 

global EditC;

EditC=uicontrol(FigureMY,'Style','edit','String','','Position',[300 210 50 30],'BackgroundColor','white','HorizontalAlignment','left','FontName','Times New Roman','FontSize',[12]);

 

global d;

d=uicontrol(FigureMY,'Style','text','Position',[150 170 50 30],'BackgroundColor',[0.7 0.7 0.7],'String','d=','HorizontalAlignment','center','FontName','Times New Roman','FontSize',[14]);

 

global EditD;

EditD=uicontrol(FigureMY,'Style','edit','String','','Position',[200 170 50 30],'BackgroundColor','white','HorizontalAlignment','left','FontName','Times New Roman','FontSize',[12]);

 

global CL;

CL=uicontrol(FigureMY,'Style','pushbutton','String','Выход','Position',[300 10 80 30],'Callback','MyExit','FontName','Times New Roman');

 

 

global SaveVariable;

SaveVariable=uicontrol(FigureMY,'Style','pushbutton','String','Сохранить данные','Position',[100 100 100 30],'Callback','Save','FontName','Times New Roman');

 

global CreatePlot;

CreatePlot=uicontrol(FigureMY,'Style','pushbutton','String','Построить график','Position',[250 100 100 30],'Callback','CreatePl','FontName','Times New Roman');

 

end

 

 

SAVE

function Save

global EditA;

global a;

st11=get(EditA,'String');

a=str2num(st11);

global EditB;

global b;

st11=get(EditB,'String');

b=str2num(st11);

global EditC;

global c;

st11=get(EditC,'String');

c=str2num(st11);

global EditD;

global d;

st11=get(EditD,'String');

d=str2num(st11);

end

 

MYEXIT

function MyExit

close;

end

GreatePL

function CreatePl

global a;

global b;

global c;

global d;

 

if (d==0)

x=0:0.1:10;

y=gbellmf(x,[a b c]);

global FigurePL1;

FigurePL1=figure('Name','График функции принадлежности','Position',[50 50 400 350],'Resize','off');

plot(x,y);

grid on;

xlabel('колоколообразная функция');

else

x=0:0.1:10;

y=trapmf(x,[a b c d]);

global FigurePL2;

FigurePL2=figure('Name','График функции принадлежности','Position',[50 50 400 350],'Resize','off');

plot(x,y);

grid on;

xlabel('трапецеидальная функция');

end

 

end