НИИ Батца

petuhoff.

ДИСЦИПЛИНА: УПРАВЛЕНИЕ В ТЕХНИЧЕСКИХ СИСТЕМАХ

ЛАБОРАТОРНАЯ РАБОТА № X3 
СОЗДАНИЕ В СРЕДЕ ПК "МВТУ" БЛОКА УПРАВЛЕНИЯ НА БАЗЕ НЕЧЕТКОЙ ЛОГИКИ


Москва, 2004 г.

Цель работы:

ВВЕДЕНИЕ

   В предыдущих лабораторных работах Вы научились пользоваться ПК МВТУ. Тем же, кто забил на предыдущие лабы, напоминаю основные приемы работы:
   Возьмите в правую руку манипулятор типа "мышь", левую руку положите на клаву и давите баттоны.
   Клава это не имя девушки, а такая доска из дерьмового пластика на которой много кнопок, мышь, это не зверек из комнаты юнатов, а такая маленькая дрянь с длинным хвостом но без ушей с двумя-тремя кнопками. Разобрались? Тогда приступаем, тем кому не удалось можно идти нафиг. 
   Появившийся в ПК МВТУ встроенный язык программирования привел в полный восторг всех пользователей МВТУ. Теперь все то, о чем Вы мечтали, но боялись спросить осуществилось. Если Вам не хватает какой-то ерунды для моделирования, Вы можете запрограммировать ее своими умелыми ручками. Чем мы сейчас и займемся как говорит реклама против спида "Безопасный секс в твоих руках!".
   Некоторые несознательные товарищи, которые нам не совсем товарищи, а совсем наоборот, продажные наймиты мировой буржуазии, при выборе пакета для моделирования советуют руководствуются такими, чуждыми нашему строю, рассуждениями. "Допустим, пользователю нужно моделировать регулятор нечеткой логики. Пакет XXX имеет средства для работы с нечеткой логикой а пакет ЙЙЙ не имеет. Какой пакет выбрать?" При это подразумевается  ответ, деваться некуда надо тырить Simulink вместе с MatLab. А вот и хрен им всем с маслом. Выполнив эту лабу вы поимейте, что выбирать надо МВТУ.


(к содержанию)

1. ОСНОВЫ ТЕОРИИ НЕЧЕТКОЙ ЛОГИКИ.

1.1. Что за хрень эта нечеткая логика и с чем ее едят?

   В учебниках по теории нечеткой логики часто изложение построено таким образом, чтоб читатель охренел с первых страниц и проникся крутизной авторов,  а так же осознал собственную непроходимую тупость. Авторы уверяют, что без знания о предикатах, коньюкции, дезьюкции, импликации и прочей  подобной поебени, изучить принципы работы управления на базе нечеткой логики невозможною. Конечно, грязному ботану подобное изложение, может и доставляет не с чем несравнимое райское наслаждение. Но нормальный чисто конкретный инженер или студент скажет прямо "В жопу такое баунти" после первых страниц. Выполнив эту лабораторную работу, Вы поймете,  что нечеткая логика, это просто как два пальца намочить, а авторы учебников просто наводят тень на плетень, причем эта тень явно от листьев хрена и получается полная хренотень.
   Что бы понять чем отличается нечеткая логика от обычной рассмотрим простой пример с краном. Обычная логика:
   Если в кране нет воды,
               значит выпили жиды.
  Если в кране есть вода,
            то еврей нассал туда.

   Другими словами вода либо есть либо нет, а третьего не дано и в любом случае виноваты евреи или Чубайс. Представим теперь что Вы новый русский или старый евреи или даже сам Чубайс, а значит у Вас всегда в кране есть и горячая и холодная вода. Залезаете Вы под душ и начинает крутить краны. Сначала откручиваете кран с холодной водой яйца становятся квадратными от холода, начинаете откручивать кран с горячей водой и чувствуете свою ошпаренную жопу. Ощущаете разницу? Теперь у вас не только есть вода (или ее нет), как в случае обычной логики, но она еще может быть,  холодной, очень холодно, нормальной, горячей или совсем кипяток.  А задача управления, в данном случае привести температуру к нормальной.
   Сообразительные перцы на этом месте могут меня остановить. Типа чего ты гонишь, если известна температура воды, то можно построить алгоритм управления открывающий нужный кран в зависимости от текущей температуры и поддерживающий заданную температуру, в МВТУ подобные алгоритмы делаются без всякой нечеткой логики, где здесь особенность?
   Отвечаю прямо, как есть, особенность регулирования температуры воды с помощью нечеткой логики в жопе. Дело в том что Ваша задница не может определить температуру воды в градусах Кельвина, Цельсия или Фаренгейта. Вы жопой чувствуете горячая вода, холодная или нормальная и крутите краны в нужную сторону.
   И вот однажды, одному кексу, которому в лом было составлять честные алгоритмы управления, расчетные зависимости для регуляторов, пришла в голову здравая идея. Как всегда случайно, например Ньютону яблоко в темя шарахнуло, а этому перцу явно водой жопу обварило. Выскочил они ошпаренный из ванны и заорал благим матом. Эврика! Что в переводе с древнегреческого означает. Бля! Если с помощь одной только голой жопы можно с успехом регулировать температуру воды, почему бы не попробовать такой же метод и для других задачах управления. 
   Вместо того чтобы подбирать коэффициентов для всяких там ПИД регуляторов, управление осуществляется с помощь набора правил например:
1. если вода горячая то открываем кран холодной воды;
2. если вода холодная то открываем кран горячей воды
;
3. если вода холодная и кран горячей открыт полностью, то закрываем кран холодной;
4. если вода горячая и кран холодной воды открыт полностью, то закрываем кран горячей воды.
  
Как видим алгоритм управления становится простым и понятным даже последнему дауну. Если все так просто, то где здесь собака порылась? спросите вы. Отвечу, в науке и технике, при моделировании различных процессов, как правило не используется такой чуткий и измерительный инструмент как жопа. Есть даже поговорка железо жопой думать не научишь. Вместо интуитивно понятного сигнала "горячо" с датчиков, как правило, приходит конкретная температура в градусах Кельвина, Цельсия или Фаренгейта. Да и кран нужно не просто "закрывать" а указывать на какой угол поворачивать или с какой скоростью крутить иначе тупое железо не поймет, что от него хотят. В следующем параграфе мы и рассмотрим как эти фундаментальные непонятки разбодяжить.


(к содержанию)

1.2. Принцип построения алгоритма нечеткого вывода.

   Для того, чтобы можно было применять простые правила, данные, передаваемые в блок регулирования на основе нечеткой логики, должны быть преобразованы. Для этого предлагается следующие:
   Входные и выходные преобразовываются в лингвистические переменные. Каждая лингвистическая переменная характеризуется набором термов. Например лингвистическая переменная температура может иметь следующие термы  "холодно", "нормально", "горячо". Лингвистическая переменная уровень может иметь следующие термы: "низкий", "нормальный", "высокий". Лингвистическая переменная задвижка может иметь следующие термы "открывать быстро", "открывать медленно", "не трогать", "закрывать медленно", "закрывать быстро". Каждый терм описывается своей функции принадлежности µi(x), которая может принимать значения от 0 до 1.  Получив значение входной переменной x в блоки нечетко логики вычисляется значения µi(x) каждого терма. Это процедура называется медицинским термином Фазификация.
 Результатом применения правила являются величина, называемая степенью истинности, а попросту число от 0 до 1.  Что бы было понятно рассмотрим пример: Пусть есть задвижка которая открывается по сигналу уровня и простое правило:
   Если уровень низкий то задвижку открывать быстро.
У нас есть входная величина уровень h в метрах. Если величина уровня стопудово низкая (µlow(h) = 1, где µlow(h) - функция принадлежности для трема низкий), или уровень стопудово не низкий ((µlow(h) = 0),  то все происходит как и в обычной логике, степеь истинности правила принимает значение 1 или 0.  Нечеткость начинается если 0 < µlow(h) < 1, например = 0.5. Уровень низкий, но не очень. Соответственно и открывать задвижку нужно быстро, но не очень. В данном правиле степень истинности равна 0.5. Подобным образом происходит ее вычисления для каждого правила.
   По научному, этот процесс называется Активизация.
   Заключения из каждого правила собираются вместе для каждой лингвистической переменной, этот процесс называется Аккумуляця. Например после расчета набора правил, мы получаем результаты для лингвистической переменной задвижка:  "открывать быстро" - 0.5, "открывать медленно" - 0.3, "не трогать" - 0, "закрывать медленно"-0, "закрывать быстро"-0. Понятно, что скорость задвижки лежит где то между медленной и быстро. 
   Зная степень истинности для каждого терма выходной переменной можно рассчитать ее числовое значение. Эта процедура называется Дефазификацией.
Таким образом работа блока управления на базе нечеткой логики может быть разбита на следующие этапы:

  1. Фазификация входных переменных.
  2. Активизация заключений правил нечеткой логики.
  3. Аккумуляция заключений для каждой лингвистической переменной.
  4. Дефазификация выходных переменных.
Все эти этапы мы и забацаем в ПК МВТУ с помощью новейшего средства разработки встроенного языка программирования.    


(к содержанию)

2. ИСПОЛЬЗОВАНИЕ ЯЗЫКА ПРОГРАММИРОВАНИЯ В МВТУ ДЛЯ СОЗДАНИЯ РЕГУЛЯТОРА НА БАЗЕ НЕЧЕТКОЙ ЛОГИКИ.

2.1. Встроенный язык программирования или сбылась мечта идиота.

   Этой весной разработчики ПК МВТУ сделали новый блок - язык программирования. Теперь пользователю ПК МВТУ полностью развязали руки. Любая безумная идея, случайно залетевшая в голову, может быть легко и непринужденно реализована, как говорится не отходя от кассы.  Встроенный язык программирования является настоящим языком программирования высокого уровня, и при этом обладает всеми возможностями "Нового" блока для задания дифференциальных уравнений в форме Коши. Кто-то может сказать, что все это дребедень, а настоящие языки программирования это С++, Pascal, Java. Но такое может заявить только задроченный онанист-программист который высушил остатки мозгов работая с разным говном типа Windows GDI или SQL. Нормальным же перцем абсолютно по барабану на каком языке писать код, главное чтоб он работал и позволял отмоделировать все что движется и шевелится от черепахи до гравицапы.
   Внешний вид ПК МВТУ с открытым окном редактора языка программирования представлен  на рис. 2.1. Новый блок по умолчанию находится в закладке Динамические. Редактор языка программирования открывается по двойному клику на блоке в схемном окне.


Рис. 2.1 

   Назначение основных кнопок на панели редактора языка программирования:

   Есть два способа изучать программу читать инструкцию и работать с программой. Второй метод получил название метод научного тыка. Чтобы оценить как работает новый блок, давайте приступим к его юзанию, в полном соответствии с научной методой.


(к содержанию)

2.2.  Фазификация - это не больно.

   Пора на чисто конкретном примере посмотреть, что можно сделать, имея встроенный язык программирования в ПК МВТУ, да пару - тройку не совсем пропитых мозговых извилин.
   Для начала займемся расчлененкой, будем расчленять исходную величину на несколько термов, рассчитывая для каждого трема функцию принадлежности. При этом мы убедимся, что это совсем не страшно.
   Бросьте на схему три блока: Из закладки Источники возьмите блок Линейный, из закладки Данные возьмем блок Временной график, ну и наконец, самый интересный для нас блок из линейки Динамические – блок Язык программирования.
   Наша задача выполнить фазификацию переменной. Роль входной переменной будет играть линейный источник. Установите время моделирования 20 сек.Для тех кто в танке напоминаю, что для этого нужно залезть в меню Моделирование/Параметры расчета и найти окошко подписанное как время интегрирования. Переменная у нас будет меняться от -1 до 1. Для этого установите параметры блока линейный как -1, 0.1 Соедините блок линейный с блоком график.
   Нажмите кнопку с убегающим человечком , и смотрите на график. Если все прошло правильно должна быть прямая линия. Ну вот прелюдия завершена и мы можно непосредственно переходить к совокуплению - кодированию.
Откройте редактор блока языка программирования двойным кликом на блоке в схеме.
И забейте туда текст как на рисунке 2.2 следующий текст:


рис. 2.2

   Закройте окно, нажав красную галку . После закрытия видим, что у блока появились входной и выходной порты. На вход подайте сигнал из блока линейный (для танкистов напоминаю, что узел вставляется в линию кликом мышки с нажатой клавишей Ctrl). Ну а для того, чтобы было, куда запихнуть выход, в свойствах графика увеличьте количество входных портов до 2 и соедините выход блока программирования с графиком. Запустите расчет и на графике должен быть косой крест как на рисунке 2.3 Входная переменная возрастает выходная переменная убывает.  


рис. 2.3

   Ну вот в принципе вы и слепили свой первый блок-программу. Правда, крест этот на хрен никому не нужен, поэтому сделаем полезную вещь, которую можно юзать, а именно, расчет функции принадлежности µ(x) типа кривой Гаусса. Формула для расчета известна:
      
Чтобы забацать эту формулу, необходимо ввести в программу две переменные с и sigma, и записать код для расчета кривой.
Измените текст в блоке язык программирования на следующий:

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


рис. 2.4

Запустите расчет, на графиках появилась шишка смотри рис. 2.5.


рис. 2.5

   Две переменный с и sigma определяют вид кривой: с - это значение, при котором функция принадлежности равна единице - верхушка шишки. Sigma – параметр ширины шишки.
   Таким образом мы получили блок, который позволяет рассчитывает функцию принадлежности для входной величины. Из графиков видно, что в момент времени, когда входная переменная х = 0.5 (наклонная кривая) функция принадлежности равна единице, и чем больше х отличается от 0.5 тем меньше функция принадлежности. Имея такой блок уже сейчас можно скопировать его на схеме получать разные функции принадлежности для разных термов забивая разные значения с и sigma.
   Но мы как Ленин пойдем другим путем, все храбрецы всегда идут в обход. Мы не будем засирать рабочие поле схемы хуевой тучей блоков, как это делается в Simulinke. Мы сделаем из одного сигнала три терма с тремя функциями принадлежности в одном блоке.
Для этого запишем функцию принадлежности как функцию. Измените текст на следующий:

   Запустите на счет и убедитесь что ничего не изменилось. А теперь воспользуемся тем счастливым обстоятельством что, в МВТУ почти все, что может быть векторезировано, является вектором. Следовательно, и переменные могут быть векторами. Пусть, в базе правил нечеткой логике используем три терма низкий нормальный и высокий. Соответственно вместо одного значения на выходе нужно три, каждый из которых показывает насколько величина является, низкой нормальной или высокой. Делается это легко и не принужденно.
   Переколбасим переменные с, sigma и выход у в массивы из трех элементов соответственно c[3], sigma[3], у[3]. Запишем для каждого трема свои параметры функции принадлежности. И чтобы уже совсем чувствовать себя сухо и комфортно сделаем присвоение значений переменным в блоке инициализации (между слов initialization и end). Это блок выполняется только одни раз при запуске расчета, незачем повторять присвоение на каждом шаге интегрирования. А теперь в цикле ровно три раза, как не давала зараза в одной тупой песне, вызовем функцию принадлежности. Текст всего этого приведен ниже:

  Если сейчас нажать на кнопку то ПК МВТУ покажет вам большую дулю и сообщит что не может привести в соответствие какие-то размерности. Не пугайтесь с вами добрый доктор проктолог, дело в том, что фазовый портрет должен иметь на обоих портах одинаковую размерность, а у нас переменная, попавшая в язык программирования расплодилась. Необходимо, размножить переменную подаваемую на верхний вход фазового портрета. Возьмите в закладке Векторные блок размножитель, и воткните его на схему, как показано на рисунке, а в качестве параметров запишите 3#1. Теперь переменная преобразуется в вектор из трех одинаковых значений и фазовый портрет престанет глючить:

   Вот и все с помощью каких то 15 строчек кода мы выполнили фазификацию переменной на три трема. Сохраните эту модель, либо в голове, либо если там недостаток оперативки, и на диске компьютера. В дальнейшем мы еще будем использовать подобную схему для проверки работы кода вышедего из под наших оч.умелых ручек.
Результаты моделирования представлены на рис. 2.6.



(к содержанию)

2.3.  Архив схем - очередной новый ништяк ПК МВТУ.

   Сделав такой чудесный блок не мешало бы его и сохранить для дальнейшего использования. Конечно ничего не стоит написать эти пятнадцать строк кода еще раз, но зачем нам лишний геморрой, когда разработчики ПК МВТУ заботятся о вас и вашем здоровье, и сделали архив схем куда можно положить любую хрень которая вышла из под Ваших шаловливых ручонок.
   Подпишете, блок дав ему название Фазификация MF типа кривой Гаусса. MF это сокращение от Membership Function, что в переводе с языка пиндосов, означает функция принадлежности. После этого ткните мышкой в кнопку (Сохранить в архив схем). В появившимся окне запишите категорию Fuzzy Logic записи MF Gaussian:

  А теперь обещанный ништяк, Зайдите в меню Главное меню Опции и выберете пункт Архив схем. Появится окошко с деревом, где есть категория Fuzzy Logic с элементом MF Gaussian. Берите его и володейте как Рюрик древнерусскими хохлами т.е. используете в любой схеме где приспичит.
   Блок вышел конечно ладным, но как всегда хочется большего, например, мне лично лень набивать каждый раз значения параметров для функции Гаусса. Довольно часто шишки термов распределены равномерно между Мах и Min  а ширина шишек Гаусса одинакова, зачем же как дятлу каждый раз забивать параметры для каждого терма, пускай компьютер это сделает сам, он же железный. Мы сообщим минимальное значение, максимальное, ширину шишки и количество термов, а ПК МВТУ пусть все раскидает по термам. Надо только его научить.
  Для этого киньте на схему блок Макроблок из закладки Субструктуры. Скопируйте наш  блок фазификации и зайдите в макроблок кликнув на нем два раза. На этом девственно чистом поле мы и сделаем суб-структуру. Рецепт прост как три копейки: бросаем порт входа, порт выхода, вставляем скопированный блок фазификации и соединяем все последовательно порт входа – фазификация – порт выхода:

На панели окна схемы есть кнопка (параметры макро блока) давите на нее и в окне параметров забейте следующий текст:

   Это те параметры, по которым входное значение будет разбито на термы. Закрываем окно, нажав на красную галку .
Заходим в редактор языка программирования и слегка меняем текст:
     
   Думаю что все понятно. Единственное можно сделать пояснения к последним строчкам. Если входная величина равна границе диапазона, то согласно алгоритму значения функции принадлежности для крайних термов равно единице. Однако, при выходе за границу диапазона значение функции принадлежности начнет уменьшатся, шишка Гаусса идет на убыль. Очень часто, это является ошибкой. Например, входная температура разбита на три терма: холодно +10 C, нормально +30 C, и горячо +55 C. Если температура 55 С это на 100% горячо (функция принадлежности = 1), и по правилам логики нужно максимально быстро крутить кран холодной воды, то при температуре 100 C, явно нужно делать тоже самое, хотя функция гаусса в этой точке может превратится в ноль. Чтобы этого не случилось введена проверка выхода значения входной величины за границу диапазона.
   Поднимитесь в главное окно и соедините блок линейный с новой субмоделью, добавьте в свойствах графика еще один порт и подключите к нему выход из суб_модели. Нажимаем на бегущего человечка. Полученные результаты показывают, что при заданных параметрах графики сливаются. Теперь меня параметры субмодели TermCount, Minimum, Maximum, Sig можно получать разные результаты фазификации.
   Подписываем полученный блок как Автоматическая фазификация FM типа кривой Гаусса и заботливо помещаем в архив схем под именем Auto MF Gaussian.


(к содержанию)

2.4. Дырявый бак управляемый нечеткой логикой.

   Прежде, чем перейти к овладению следующим этапам работы алгоритма нечеткой логики, сделаем объект управления. Управлять будем дырявым баком, А Вы что хотели ХУЯСом? Холодный Управляемый Ядерный Синтез (ХУЯС) мы рассмотри в следующий раз.
   Управлять будем уровнем в дырявом баке. Задача проста как в школе про бассейн, в одну трубу вливается в другую выливается. Мы будем рулить расходом входа, а утечка будет происходить самотеком
   Параметры бака: высота - 2 м; Площадь сечения - 1 м; Диаметр выходного отверстия 0.05 м2.
Создайте новый проект, бросьте на схему Макроблок из закладки Субструктуры.  Войдите в блок и забейте в свойствах блока данные по баку:
  
   Динамику бака можно описать следующими уравнениями:
  
  где:    V - объем бака м3;
         rate - расход поступающий в бак м3/с;
    outrate - расход утечки м3/с;
             h - уровень в баке м;
        area - площадь сечения бака;
    outarea - площадь выходного отверстия;
    g = 9.8 - ускорение свободного падения.
Бросьте на на схему наш любимы блок Язык программирования и запишите уравнения динамики:

   Вот, чем особенно хорош Блок язык программирования ПК МВТУ, теперь пользователь как узбек (что вижу, о том пою) что видит, то и моделирует. Если уравнения динамики известны, их нужно просто записать, не забывая указывать начальные условия для динамических ременных (здесь init V=0)и опля! - новый блок готов к труду и обороне.
 Дособирайте схему как показано на рисунке и модель бака дырявого бак готова.

    Разберемся теперь клапаном управляющим расходом. Основная идея такова. Задается номинальный расход 0.5 м3/с. Управляющие воздействие это скорость закрытия-открытия задвижки, интегрируя данную скорость мы получаем положение задвижки - число от 0 (задвижка закрыта - расход равен 0) до 1 расход равен номинальному. Зависимость расхода от положение задвижки линейная. Бросьте на основную схему новый Макроблок из закладки Субструктуры войдите в него и соберите схему как на рис. 2.8:


Рис.2.8.

   Теперь модель объекта управления типа дырявый бак, готова к работе. Осталось положить на схему недостающие блоки, для задания уровня, отображения результатов. Конечная схема модели, вместе с регуляторному уровня на базе нечеткой логики будет выглядеть следующим как на рисунке 2.9:


Рис.2.9.

   Работа системы проста и незатейлива. Блок Меандр из закладки Источники задает изменение уровня с частотой 20 сек с 1.5 до 0.5, заданное значение сравнивается с реальным и разница подается на первый вход блока управления. На второй вход подается скорость изменения уровня в баке. На выходе мы получаем команду клапана который и управляет расходом в бак.


(к содержанию)

2.5. Рулез рулят или ORDNUNG, ORDNUNG UBER ALLES!

   Получив модель дырявого бака, самое время перейти к рассмотрению базы правил нечеткой логики. Рассматривать будем сразу пока горячо. Для нашего бака правила блок управления на базе нечеткой логики имеет входные переменные уровень, и изменение уровня. Переменная уровень будет иметь следующие термы: 1 -высокий, 2 -нормальный, 3 -низкий. Переменная изменение уровня будет иметь такие термы: 1 - уменьшается,  2 -не изменяется, 3 -увеличивается. Блок управления клапаном  будет выдавать переменную команда клапана, которая в свою очередь, будет иметь следующие термы: 1 -закрывать быстро, 2 -закрывать медленно, 3 -не менять, 4 -открывать медленно,  5 - открывать быстро. База правил для управления будет иметь следующий вид:

  1. ЕСЛИ уровень = высокий TO команда клапана = закрывать быстро;

  2. ЕСЛИ уровень = нормальный TO команда клапана = не  изменять

  3. ЕСЛИ уровень = низкий ТО команда клапана = открывать быстро;

  4. ЕСЛИ уровень = нормальный И изменение уровня = уменьшается ТО команда клапана = открывать медленно;

  5. ЕСЛИ уровень = нормальный И изменение уровня = увеличивается ТО команда клапана = закрывать медленно;   

   Как видим на словах все абсолютно ясно и просто. Поскольку логика у нас нечеткая, для каждого правила нужно, не просто получить ответ да или нет, а рассчитать степь истинности. Для правил 1-3 степень истинности равна величание функции принадлежности для соответствующего терма. Попросту, если уровень h высокий на 0.5 (µhigh(h) = 0.5) то и степень истинности равна 0.5. Функциональная схема макроблока реализующего данное правило:
     
   Константа вес позволяет задать весовой коэффициент для правила в базе данных. Создайте новый макроблок, свяжите эту схему и пометите его в архив схем с многозначительным именем =>.
   Степень истинности правил 4 и 5 зависит от двух входных переменных, соединенных логическим И, если хотите понтануться, можете называть это логической конъюнкцией. Для вычисления степени истинности существует несколько вариантов, мы используем метод алгебраического произведения смотри схему макроблока:
     
  Этот макроблок тоже отправляем в архив схем под именем AND (prod). Сохранив в архиве два простых макроблока мы можем приступить к созданию нашего блока управления на базе нечеткой логики. Внутренняя структура показана на рисунке 2.10. 


Рис.2.10.

   На рисунке 2.10 картинки блоков для наглядности изменена, что совсем не влияет на функциональное наполнении блока.  Возьмите блоки из архива схем и перетащите их на схему.  Задайте параметры автоматической фазификации в редакторе переменных соответствующего блока:
Для переменной уровень:
TermCount= 3, Minimum = -1, Maximum = 1, Sig = 0.3;
для переменной скорость изменения:
TermCount = 3, Minimum = -0.1, Maximum = 0.1, Sig = 0.03
   Самая большая сложность на этом этапе, это соединение блоков фазификации и блоков правил в нужном порядке. Вот здесь и пригодится возможность подписывать блоки. Выход из блока фазификации для каждой переменной соедините с блоком Демультиплексор, для удобства дальнейшей работы с базой правил, подпишите под блоком соответствующие название термов в том порядке в котором они расположены в веторе. Ибо ORDNUNG, ORDNUNG UBER ALLES, как говорят немцы. Правда один мой знакомый немецкий фашист Патрик Вейс считает, что превыше всего penis enlargement, но я склоняюсь к мнению, что он слишком много смотрит качественной немецкой порнухи.
   Поместите на схему необходимое количество блоков правил.
   Выходная переменная имеет пять термов их мы будем предавать в виде вектора. Поместите на схему блок Мультиплексор и задайте 5 входных параметров. Подписи под блоком помогут правильно подключить результаты блоков правил. Помните  ORDNUNG, ORDNUNG UBER ALLES!
   Соедините схему согласно записанных правил. И сохраните заготовку.


(к содержанию)

2.6. Аккумуляция и дефазификация в одном флаконе.

   Получив вектор состоящий из пяти заключений из правил нечеткой логики, необходимо рассчитать значение выходной переменной. Для этого мы воспользуемся алгоритмом Мамдани.
    Для начала осуществим фазификацию выходной переменной на пять термов с помощью треугольных функций принадлежности. Как Вы уже догадались мы снова будем пользовать блок Язык программирования. Первая часть текста программы приведена на рисунке 2.11


Рис.2.11.

   action[5] - это массив входных значений (заключений из базы правил), который в процессе моделирования мы получим из блока Демультиплексор;
   TriangleFM - треугольная функция принадлежности.
   Записав данный кусок кода не плохо бы проверить, что мы нагородили, и тут нам на помощь приходит очередной грандиозный прорыв МВТУ.
   За что инженеры физики уважают MachCad? Не в последнюю очередь за то, он позволяет проверить ту галиматью, которую записывают в расчетах непосредственно в процессе записи. В любой момент можно построить графическую зависимость и посмотреть не припущено-ли где возведение в степень, не стоил ли знак плюс вместо минуса или умножение вместо деления. А вот при программировании постоянно приходится вооружившись дебаггером шерстить код на предмет ошибок. Явно смущаясь программисты пользуются языком пиндосов называя это процесс поиском багов. Впрочем оставим поиск насекомых для обезьян и программистов и вернемся к ПК МВТУ.
   Чтобы убедится в отсутствии блох в написанном куске кода, построим график функции. Для этого нажмите на кнопку  построить графическую зависимость. При этом появится диалоговое окно построения зависимости как на рис. 2.12:


Рис.2.12.

    Вообще то это окно предназначено для обработки векторных данных, но если поставить галочку в окошке Скалярная зависимость, то "легким движением руки шорты превращаются в ..."  графопостроитель. В верхней строке задаете минимальное, максимальное значения по оси их  X и количество точек графика. В нижнем записываете функцию которую только что запрограммировали (см. рисунок 2.12). Нажимаете кнопку ОК и видите результат как на рис. 2. 13


Рис.2.13.

     Теперь меняя значения параметров функции (a,b,c) и нажимая кнопку ОК можно получать графики функции при различных параметрах.
   Следующая часть листинга приведена на рисунке 2.14. Здесь описываются массивы переменных для треугольных функции фазификации выходной переменной. В секции initialization присваиваются значения переменным для каждого терма. Для удобства дальнейшей проверки присваиваем значения входному вектору action.
   Дело в том, что до начала расчета значения входных переменных в векторе action[5] равны нулю. В процессе расчета эти значения получаются из входного расчета. Для проверки кода без запуска моделирования можно присвоить им проверочные значения, если это сделать в секции initialization, то в последствии это присвоение можно не удалять так как на расчет они не повлияют. В этом же разделе кода задаем количество точек для численного интегрирования IntCount и вычисляем шаг численного интегрирования dX 


Рис.2.14.

   Заполнив значения массивов можно проверит с помощью графика правильность заполнения построив зависимости для каждого терма используя вместо численных, значений имена переменных. Например последовательно меняя в нижнем поле диалогового окна "Построение зависимостей" текст:
TriangleFM(x,a[2],b[2],c[2]),
TriangleFM(x,a[3],b[3],c[3]),
TriangleFM(x,a[4],b[4],c[4]) и
TriangleFM(x,a[5],b[5],c[5]) каждый раз н не забывая нажимать ОК можно получить зубы как на рис. 2.15


Рис.2.15.

IntCount задет количество точек для численного интегрирования. Соответственно рассчитывается шаг интегрирования dX.
   Параметры a[i], b[i], c[i], задаются с учетом расположения заключений правил в входном векторе смотри рис 2.10. В примере принято расположение термов по возрастанию. В принципе, расположение может быть любое. Главное соблюдать соответствие между индексом терма в векторе входа, и индексом параметров функции принадлежности терма. Соответствие термов и параметров их функций принадлежности приведены в таблице:
Index Терм Параметры функции принадлежности
1 закрывать быстро  (-1, -0.9, -0.8)
2 закрывать медленно (-0.6, -0.5, -0.4)
3 не изменять (-0.1, 0, 0.1)
4 открывать медленно (0.3, 0.4, 0.5)
5 открывать быстро (0.8, 0.9, 1)
На рис 2.15 изображена фазификация выходной переменной по термам, согласно таблице. Следующая процедура заключается в применении заключений из правил нечеткой логики. Данная процедура называется активизация.
   Есть несколько методов активизации мы воспользуемся методом prod-активизации, при этом результирующая функция получается умножением степени истинности заключения из правила на соответствующую функцию принадлежности. Например если степень истинности для заключения закрывать быстро равна 0 (первое значение в массиве action ) то после умножения функция принадлежности превратится в ноль. 
   Одновременно с активизацией мы проведем аккумуляцию - найдем общую функцию принадлежности для выходной переменной по всем термам. Мы строим общую функцию для  заданного диапазона значений. Для этого, функцию принадлежности каждого терма µi(x) нужно умножить на значение степени истинности соответствующего заключения (активизация), и найти максимальное значение из всех таких произведений для каждого трема в т. x (аккумуляция). В результате мы получаем огибающую функцию. Алгоритм вычисления провиден на рис. 2.16.


Рис.2.16.

   Если построит функцию AccProb(x) для значения входного вектора action[5] по умолчанию (все элементы равны единицы см. рис. 2.14 ) то получится график как на рисунке 2.17:.


Рис.2.17.

     А например, если задать входной вектор значений action = [1, 0.5, 0.3, 0.8, 1], (секция initialization см. рис. 2.14 ), результат расчета по приведенному коду принимает вид представленный на рисунке 2.18:


Рис.2.18.

   Ну наконец имея результирующую функцию мы находим центр масс полученной фигуры. Для этого нам и пригодится значение dX, рассчитанное в секции initialization блока см. рис. 2.12. Формулу расчета центра масс знает каждый октябренок:
     
   Ну, а численный алгоритм реализующий эту формулу методом треугольников представлен на рисунке 2.19.


Рис.2.19.

   Если вы правильно переписали листинги кода с рисунков 2.11, 2.14, 2.16, 2.19, то при запуске расчета,  на графике, подписанном нами как уровень, из основной схемы, (смотри рис. 2.9.) отразится изменения заданного уровня (черный график) и уровня обеспечиваемого регулятором нечеткой логики:


Рис.2.16.

  Поздравляю! Вы только что своими руками создали регулятор на базе нечеткой логики. Для этого Вам пришлось написать около 70 строчек кода. При этом Вы мимоходом без напряга, получили три блока которые могут пригодится при решении подобных задач в будущем.  В отличие о пользователей MatLab, тупо заполняющих диалоговые окна, Вы теперь знаете как работает нечетка логика изнутри и может выдумывать, а главное программировать свои собственные алгоритмы. После выполнения это лабораторной работы, Вы можете спокойно начинать изучение нечеткой логики, пользуясь любым учебником. И как бы не грузили авторы Вы теперь знает, что нечеткая логика это не просто, а очень просто особенно с ПК "МВТУ". Удачи!
    А еще, эта лаба в очередной раз наглядно показывает, что совсем не обязательно пиздить Simulink вместе с MatLab, что бы изучить, что то новое и интересное.

 
(к содержанию)

Литература:

1. Тимофеев К.А. "Описание языка программирования ПК МВТУ"
2. Козлов О.С. "Теория автоматического управления. в примерах и среда моделирования ПК МВТУ".
3. Леоненков А.В. "Нечеткое моделирование в среде MATLAB и fuzzyTECH"
 

Ссылки:

1.Сайт ПК МВТУ.
2. Последние версии ПК МВТУ.
3. Архив с проектами на тему лабораторной работы.
4. Форум где можно обсудить или осудит эту лабораторную работу.
5. Дискуссионная группа по моделированию систем.