petuhoff (petuhoff) wrote,
petuhoff
petuhoff

Categories:

Превращаем знания математики в деньги

Введение
    Давненько я не брал в руки шашек. В России большинство "русской интеллигенции" и гражданских активисток, обычно течет от иносранцев, даже если это пьяный в жопу фин ссущий на Невском проспекте, или иностранное программное обеспечение написанное индусами нанятыми за 3 копейки белым хозяином. Но я, как интеллигент в первом поколении, ватник и колорад считаю, что мы можем делать не хуже и местами даже лучше, тем более в области математического моделирования и теории автоматического управления. Еще в 2004 году, мы занимались импортозамещением и показывали, как можно средствами ПК "МВТУ" заменить Simulink для моделирования регуляторов на базе нечеткой логики. Продукт развивался и теперь он называется "SimInTech" возможности расширялись и по просьбе партии и правительства взявшего курс на "импортозамещение" мы выпускаем вторую редакцию лабораторной работы.

Некоторые несознательные товарищи, которые нам не совсем товарищи, а совсем наоборот, продажные наймиты мировой буржуазии, при выборе пакета для моделирования советуют руководствуются такими, чуждыми нашему строю, рассуждениями. "Допустим, пользователю нужно моделировать регулятор нечеткой логики. Пакет XXX имеет средства для работы с нечеткой логикой а пакет ЙЙЙ не имеет. Какой пакет выбрать?" При это подразумевается ответ, деваться некуда надо пиздить или покупать Simulink вместе с MatLab. А вот и хрен им всем с маслом.  Выполнив эту лабу вы поимейте, что выбирать надо SimInTech.
Но самое интересное, мои маленькие друзья, раз партия сказала импорто-замещение, то теперь американский Simulink должен идти на органы, или органы придут к тем кто его закупает, и у нас с вами появляется возможность помочь кровавому мордеру и заменить Simulink, рубанув при этом балосов. Алгоритм прост, как все гениальное, выполнив эту лабораторную работу вы поймете как можно делать библиотеки для SimInTech и теперь ваше финансовое благополучие в ваших руках. Берете с торрентов Simulink, выбираете понравившейся вам ToolBох и по образцу и подобию делаете библиотеку в SimInTech - все можно рубить капусту.
"Мы работаем как отбойный молоток,
Лабаем TollBoxы ебем MathWork"

Цель работы:


  • показать как можно заработать $7 000 за неделю на математическом моделировании;

  • ознакомление с новыми методами формирования математических моделей динамики САР в программном комплексе "SimInTech", включая:

  • - процедуры создания новых блоков с помощью языка программирования; - cоздание собственных библиотек блоков; - и еще кучу разных ништяков;
  • ознакомление с основами создания управляющих блоков на базе нечеткой логики, включая:

  • - фазификацию переменных; - формирование математической модели базы правил нечеткого вывода; - аккумуляцию, агрегацию и прочую дребедень;
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. Дефазификация выходных переменных.

Все эти этапы мы и заебенем в SimInTech с помощью встроенного языка программирования.    

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

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

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


Рис. 2.1 Вид окна языка программирования

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

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

Создайте новую схему автоматики и настройте параметры расчета. Установите время моделирования 20 сек. Для тех кто в танке напоминаю, что для этого нужно залезть в меню Расчет/Параметры расчета и найти строку как Конечное врем расчета. Для расчета с максимальной скоростью, на закладке "Синхронизация" снимете галочку "Синхронизировать с реальным временем" см. рис. 2.2

Рис. 2.2. Настройка параметров расчета.

Бросьте на схему три блока: Из закладки Источники возьмите блок Линейный, из закладки Данные возьмем блок Временной график, ну и наконец, самый интересный для нас блок из линейки Динамические – блок Язык программирования.
Наша задача выполнить фазификацию переменной. Роль входной переменной будет играть линейный источник. Переменная у нас будет меняться от -1 до 1. Для этого установите параметры блока Линейный источник:

  1. Свободный член -1;

  2. Коэффициент при t - 0.1

Откройте редактор блока языка программирования двойным кликом на блоке в схеме. Снесите весь текст, который там есть по умолчанию, программировать контроллеры мы в этой лабораторной работе не будем. И забейте туда текст как показано на картинке 2.3


Рис. 2.3. Программа блока.

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

Рис. 2.4. Окно SimInTech после расчета модели.

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

   Чтобы забацать эту формулу, необходимо ввести в программу две переменные с и sigma, и записать код для расчета кривой.
Измените текст в блоке язык программирования на следующий:

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

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

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

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

Рис. 2.7. Схема демонстрации фазификации.

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

Рис. 2.8. Результаты работы блока фазификации

Посмотри еще раз на дело рук своих. Мы создали блок который обеспечивает анализ входной переменной и ее разложение на 3 терма (низкий, нормальны, высокий) (фазификацию). Мы посмотрев в потолок решили, что -1 это нихрена (low), 0, это ничего (normal), 1 это дохера (high). В нашей тестовой схеме переменная меняется от - 1 до 1. Запустив расчет мы наглядно видим как изменения линейные изменения одной переменной от - 1 до 1 приводят к изменению значений трех термов, в диапазоне от 0, до 1. В начале когда входная величина равна -1, терм нихрена имеет функцию принадлежности = 1, термы ничего и дохрена по нулям. по мере роста входной величины, значение терма нихрена уменьшается (величина еще низкая но уже не стопудово.), а значение терма ничего начинает расти, чем ближе к 0, тем ближе значение терма ничего к 1. Так на наших глаза простой рост входа от -1 до 1, не имеющий никакого смыла превратился в наглядный жизненный процесс перехода от нихера, через ничего к дохрена.

2.3.  Как заработать 7 000$ за 2 часа. Создание собственной библиотеки блоков..

В это разделе мы рассмотрим покажем как из нихера сделать дохера c помощью SimInTech. Мы тут не изобретаем велосипед, а просто демонстрируем сеанс магии с разоблачением. Если вы захотите купить библиотеку нечеткой логики у MatchWork, то вам выкатят цену $7000, и будут заливать, какие продвинутые яцеголовые американские профессора делали эту библиотеку и какое это счастье всего за $7000 получить инновационный продукт передовой американской мысли. Дешевле только даром. На самом деле все эти библиотеки делают, китайцы и индусы будучи студентами университетов, а MatchWork просто рубит капусту с доверчивых лошар.

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

Сейчас создадим блок, в котором пользователь будет задавать сколько нужно ему термов и какие значения им соответствуют. Что бы не кривыми ручками не поломать, то что уже работает, первым делом необходимо сменить название класса блока. Войдите в Свойства блока "язык программирования", который мы с вами сделали ранее, и замените тип элемента дав ему название "Фазификация Гаусса" (см. Рис. 2.9) Теперь при сохранении этого блока, мы не повредим существующий блок язык программирования, несмотря на любую рукожопость.


Рис. 2.9. Именуем новый блок

После того как тип элемента переименован, можно приступить его редактированию. Нужно убедится, что SimInTech знает, что перед ним находиться не лошара юзер, а крутой разработчик. Заходим в главное меню программы пункт "Файл" подпункт "Параметры" В появившемся окне нужно поставить галочку в опции "Режим разработчика" (Рис. 2.10)

Рис. 2.10. Переводим систему в режим разработчика

В режиме разработчика выделяем блок "Язык программирования" на схеме и переходим к главному меню программы "Правка" в самом низу находится подпункт "Изменить блок", в диалоговом окне необходимо снести все свойства которые там могут быть (нам они уже не понадобятся) и добавить новые как показано на Рис. 2. 11. Для удаления и добавления используются кнопки внизу справа. В качестве свойств блока мы задаем Количество термов, Mассив значений с, и Массив значений sigma. Тут же мы даем значения по умолчанию (см. Рис. 2.11).


Рис 2.11. Параметры блока фазификация заданные разработчиком

Нажимаем кнопку окей. Если вы все сделали правильно, у нашего блока в свойствах появились ровно те же поля. Что посмотреть и поменять свойства выделите блок, правой кнопкой мыши вызовите всплывающее меню и выберите пункт "Свойства объекта" . В окне выберите закладку "Свойства" (см. Рис 2.12). И вот оно счастье, меняйте параметры и получайте разнообразные фазификации в любом количестве.


Рис 2.12. Параметры блока фазификация для пользователя

Перейдем в окно редактирования скрипта и изменим текст нашей программы с учетом, того что у нас появились новые переменные которые будут задавать счастливые пользователи нашего блока.

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

   Теперь если сохранит это блок и запустить на расчет модель, графики должны быть точно такими как как на рис. 2.8. Если это так, то поздравлю вы только что разработали новый блок для SimInTech и сделали первый шаг к тому что бы стать миллионером. Что бы убедиться что это чудо произошло поменяйте свойства блока на другие и посмотрите какие графики у вас рисуются. Например, если для 5 термов, при параметрах заданных для блока, как на рисунке 2.13, у вас и графики похожи, то вы точно крутой разработчик, почти Цукамото или даже Мамдани!


Рис. 2.13. Фазификация на 5 тремов функция гаусса

Теперь можно заносить этот блок в библиотеку, но перед этим изменим его свойства, что бы он был более похож на стандартные блоки SimInTech. Выделите блок на схеме, правой кнопкой мыши вызовите всплывающее меню и выберите пункт "Свойства объекта" . В окне выберите закладку "Общие" В нижней части списка можно можно изменить "Графическое изображение" и установить Да для параметра "Блокировка доступа". В этом случае при двойном клике на схеме по блоку будет вызываться окно с параметрами, а не текст программы (см. Рис. 2.14).


Рис. 2.14 Настройка блока фазификация перед добавлением в библиотеку.

Для занесения блока в библиотеку, выделяем его на схеме и в главном окне выбираем пункт меню "Файл" подпункт "Сохранить в библиотеку".
(Я бы еще рекомендовал "Сохранить в файл", что бы потом продавать это файл). Блок сохранился в библиотеку но мы пока его не видим в линейке. Еще раз меню "Файл", потом "Редактировать библиотеку". Пролистываем столбец "Все записи" и в самом низу находим наш блок "Фазификация Гаусса" (см. Рис. 2.15):

Рис. 2.15 Создание новой закладки "Нечетка Логика"

Ну вот последние клики мышкой и страницу "Нечеткая Логика" переносим в нее наш блок, на закладке "Свойства", задаем ему картинку и вуаля, у вас в палитре новая библиотека. (См. Рис. 2.16):


Рис. 2.16. Новая линейка блоков.

Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments