Вы находитесь на странице: 1из 308

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ

НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ


"ХАРЬКОВСКИЙ ПОЛИТЕХНИЧЕСКИЙ ИНСТИТУТ"

А. Ю. Заковоротный

ОСНОВЫ ВЫЧИСЛИТЕЛЬНОГО ИНТЕЛЛЕКТА

Лабораторный практикум
для студентов дневной и заочной форм обучения по направлению
"Компьютерная инженерия" и "Компьютерные науки"

Утверждено
редакционно-издательским
советом университета НТУ "ХПИ",
протокол № 2 от 06.12.2012 г.

Харьков
HTMT
2013
УДК 004.89
ББК 32.973-02
З 19
Рецензенты:
Г. А. Кучук, канд. техн. наук, ст. науч. сотр., Харьковский университет
воздушных сил имени Ивана Кожедуба;
А. А. Серков, д-р техн. наук, профессор, заслуженный изобретатель
Украины, академик Академии наук прикладной радиоэлектроники,
НТУ "ХПИ"

Наведено теоретичні відомості про пакет MATLAB та способи побудови в ньому


нечітких множин, алгоритмів нечіткого виведення й нечіткої кластерізації, нечіткого
контролера, генетичних алгоритмів і нейронечітких гібридних мереж. Теоретичний
матеріал підкріплений великою кількістю прикладів із використання описаних нечітких
систем.
Призначено для студентів денної та заочної форм навчання за напрямом
"Комп'ютерна інженерія" й "Комп'ютерні науки".

Заковоротный А. Ю. Основы вычислительного интеллекта /


З 19 А. Ю. Заковоротный : лабораторный практикум. – Х.: HTMT,
2013. – 308 с. – На рус. языке.
ISBN 978-617-578-129-6
Приведены теоретические сведения о пакете MATLAB и способах построения в
нем нечетких множеств, алгоритмов нечеткого вывода и нечеткой кластеризации,
нечеткого контроллера, генетических алгоритмов и нейронечетких гибридных сетей.
Теоретический материал подкреплен большим количеством примеров по
использованию описанных нечетких систем.
Предназначено для студентов дневной и заочной форм обучения по
направлению "Компьютерная инженерия" и "Компьютерные науки".
Ил. 84. Табл. 20. Библиог. 20 назв.

УДК 004.89
ББК 32.973-02
ISBN 978-617-578-129-6  А. Ю. Заковоротный, 2013
ВСТУПЛЕНИЕ

Теория нечетких множеств (fuzzy sets theory) была разработана в


1965 г., когда профессор Лотфи Заде из университета Беркли опубликовал
основополагающую работу Fuzzy Sets в журнале Information and Control.
Прилагательное "fuzzy", которое можно перевести на русский как
нечеткий, размытый, введено в название новой теории с целью
дистанцирования от традиционной четкой математики и аристотелевой
логики, оперирующих с четкими понятиями: "принадлежит – не
принадлежит", "истина – ложь". Концепция нечеткого множества
зародилась у Л. Заде "как неудовлетворенность математическими
методами классической теории систем, которая вынуждала добиваться
искусственной точности, неуместной во многих системах реального мира,
особенно в так называемых гуманистических системах, включающих
людей".
Началом практического применения теории нечетких множеств
можно считать 1975 г., когда Мамдани и Ассилиан построили первый
нечеткий контроллер для управления простым паровым двигателем. В
1982 г. Холмблад и Остергад разработали первый промышленный
нечеткий контроллер, который был внедрен в управление процессом
обжига цемента на заводе в Дании. Успех первого промышленного
контроллера, основанного на нечетких лингвистических правилах "Если –
то" привел к всплеску интереса к теории нечетких множеств среди

3
математиков и инженеров. Несколько позже Бартоломеем Коско была
доказана теорема о нечеткой аппроксимации (Fuzzy Approximation
Theorem), согласно которой любая математическая система может быть
аппроксимирована системой, основанной на нечеткой логике. Другими
словами, с помощью естественно-языковых высказываний-правил "Если –
то", с последующей их формализацией средствами теории нечетких
множеств, можно сколько угодно точно отразить произвольную
взаимосвязь "входы – выход" без использования сложного аппарата
дифференциального и интегрального исчислений, традиционно
применяемого в управлении и идентификации.
Системы, основанные на нечетких множествах, разработаны и
успешно внедрены в таких областях, как управление технологическими
процессами, управление транспортом, медицинская диагностика,
техническая диагностика, финансовый менеджмент, биржевое
прогнозирование, распознавание образов и т.д. Спектр приложений очень
широкий – от видеокамер и бытовых стиральных машин до средств
наведения ракет ПВО и управления боевыми вертолетами. Практический
опыт разработки систем нечеткого логического вывода свидетельствует,
что сроки и стоимость их проектирования значительно меньше, чем при
использовании традиционного математического аппарата, при этом
обеспечивается требуемый уровень робастности и прозрачности моделей.

4
Лабораторная работа 1

ПРОСТЕЙШИЕ ВЫЧИСЛЕНИЯ В ПАКЕТЕ MATLAB

Цель лабораторной работы: получение и закрепление знаний,


формирование практических навыков работы с пакетом MATLAB при
вычислении алгебраических выражений с использованием встроенных
математических функций.

1.1. Краткие сведения из теории

1.1.1. Рабочая среда пакета MATLAB


Пакет MATLAB был создан компанией Math Works более
пятнадцати лет назад. Работа сотен ученых и программистов направлена
на постоянное расширение его возможностей и совершенствование
заложенных алгоритмов. В настоящее время MATLAB является мощным
и универсальным средством решения задач, возникающих в различных
областях человеческой деятельности.
Рабочая среда MATLAB 6.x, MATLAB 7 имеет удобный интерфейс
для доступа ко многим вспомогательным элементам MATLAB.
При запуске MATLAB 6.x на экране появляется рабочая среда,
изображенная на рис. 1.1.
Рабочая среда содержит следующие элементы:
 меню;
 панель инструментов с кнопками и раскрывающимся списком;
 окно с вкладками Launch Pad и Workspace, из которого можно
получить простой доступ к различным модулям ТооlBох и к содержимому
рабочей среды;
 окно с вкладками Command History и Current Directory,
предназначенное для просмотра и повторного вызова ранее введенных
5
команд, а также для установки текущего каталога;
 командное окно Command Window с командной строкой, в
которой находится мигающий курсор;
 строку состояния.

Рис. 1.1. Рабочая среда пакета MATLAB 6.x

Все команды, описанные в этой лабораторной работе, следует


набирать в командной строке. Сам символ », обозначающий
приглашение командной строки, приведенный в примерах, набирать не
нужно. Для просмотра рабочей области удобно использовать полосы
скроллинга или клавиши <Home>, <End> для перемещения влево или
вправо и <PageUp>, <PageDown> для перемещения вверх или вниз. Про
использование клавиш <up>, <down>, <rigth>, <left> будет сказано
дополнительно. Если вдруг после перемещения по рабочей области
командного окна пропала командная строка с мигающим курсором,
просто нажмите <Enter>.
6
Важно запомнить, что набор любой команды или выражения
должен заканчиваться нажатием на клавишу <Enter> для того, чтобы
программа MATLAB выполнила эту команду или вычислила выражение.
Замечание 1
Если в рабочей среде MATLAB 6.x отсутствуют некоторые описанные
окна, то следует в меню View выбрать соответствующие пункты: Command
Window, Command History, Current Directory, Workspace, Launch Pad.

1.1.2. Арифметические вычисления


Встроенные математические функции MATLAB позволяют
находить значения различных выражений. MATLAB предоставляет
возможность управления форматом вывода результата. Команды для
вычисления выражений имеют вид, свойственный всем языкам
программирования высокого уровня.
Наберите в командной строке 1+2 и нажмите <Enter>. В результате
в командном окне MATLAB отображается следующее:

» 1+2
ans =
3

Что сделала программа MATLAB? Сначала она вычислила сумму


1 + 2, затем записала результат в специальную переменную ans и вывела
ее значение, равное 3, в командное окно. Ниже ответа расположена
командная строка с мигающим курсором, обозначающая, что MATLAB
готова к дальнейшим вычислениям. Можно набирать в командной строке
новые выражения и находить их значения.
Если требуется продолжить работу с предыдущим выражением,
например, вычислить (1 + 2) / 4.5, то проще всего воспользоваться уже
имеющимся результатом, который хранится в переменной ans.

7
Наберите в командной строке ans / 4.5 (при вводе десятичных дробей
используется точка) и нажмите <Enter>, получается:

» ans/4.5
ans =
0.6667

Замечание 2
Вид, в котором выводится результат вычислений, зависит от формата
вывода, установленного в MATLAB. Далее объяснено, как задать основные
форматы вывода.

1.1.3. Форматы вывода результата вычислений


Требуемый формат вывода результата определяется пользователем
из меню MATLAB. Выберите в меню File пункт Preferences. На экране
появится диалоговое окно Preferences. Для установки формата вывода
следует убедиться, что в списке левой панели выбран пункт Command
Window. Задание формата производится из раскрывающегося списка
Numeric format панели Text display.
Разберем пока только наиболее часто используемые форматы.
Выберите short в раскрывающемся списке Numeric format в MATLAB 6.x.
Закройте диалоговое окно, нажав кнопку <ok>. Сейчас установлен
короткий формат с плавающей точкой short для вывода результатов
вычислений, при котором на экране отображаются только четыре цифры
после десятичной точки. Наберите в командной строке 100/3 и нажмите
<Enter>.
Результат выводится в формате short:

» 100/3
ans = 33.3333

8
Этот формат вывода сохранится для всех последующих
вычислений, если только не будет установлен другой формат. Заметьте,
что в MATLAB возможна ситуация, когда при отображении слишком
большого или малого числа результат не укладывается в формат short.
Вычислите 100000/3, результат выводится в экспоненциальной форме:

» 100000/3
ans =
З.ЗЗЗЗе+004

То же самое произойдет и при нахождении 1/3000:

» 1/3000
ans =
З.ЗЗЗЗе004

Однако первоначальная установка формата сохраняется и при


дальнейших вычислениях, для небольших чисел вывод результата снова
будет происходить в формате short.
В предыдущем примере пакет MATLAB вывел результат
вычислений в экспоненциальной форме. Запись 3.3333е004 обозначает
3.3333*104 или 0.00033333. Аналогично можно набирать числа в
выражениях. Например, проще набрать 10е9 или l.0e10, чем 1000000000, а
результат будет тот же самый. Пробел между цифрами и символом е при
вводе не допускается, т.к. это приведет к сообщению об ошибке:

» 10 е9
??? 10 е9
Missing operator, comma, or semi-colon.

9
Если требуется получить результат вычислений более точно, то
следует выбрать в раскрывающемся списке long. Результат будет
отображаться в длинном формате с плавающей точкой long с
четырнадцатью цифрами после десятичной точки. Форматы short e и
long e предназначены для вывода результата в экспоненциальной форме
с четырьмя и пятнадцатью цифрами после десятичной точки
соответственно. Информацию о форматах можно получить, набрав в
командной строке команду help с аргументом format:

» help format

В командном окне появляется описание каждого из форматов.


Задавать формат вывода можно непосредственно из командной
строки при помощи команды format. Например, для установки длинного
с плавающей точкой формата вывода результатов вычислений следует
ввести команду format long e в командной строке:

» format long e
» 1.25/3.11
ans =
4.019292604501608е001

Обратите внимание, что команда help format выводит на экран


название форматов прописными буквами. Однако команда, которую
надо ввести, состоит из строчных букв. К этой особенности встроенной
справки help надо привыкнуть. MATLAB различает прописные и
строчные буквы. Попытка набора команды прописными буквами
приведет к ошибке:

10
» FORMAT LONG E
??? FORMAT LONG.
Missing operator, comma, or semi-colon.

Для более удобного восприятия результата MATLAB выводит


результат вычислений через строку после вычисляемого выражения.
Однако иногда бывает удобно разместить больше строк на экране, для
чего следует выбрать переключатель compact (File, Numeric display) из
раскрывающегося списка. Добавление пустых строк обеспечивается
выбором loose из раскрывающегося списка Numeric display.
Замечание 3
Все промежуточные вычисления MATLAB производит с двойной
точностью, независимо от того, какой формат вывода установлен.

1.1.4. Использование элементарных функций


Предположим, что требуется вычислить значение следующего
выражения:

e 2,5  (ln 11,3) 0,3  (sin 2,45  cos 3,78) / (tg 3,3) .

Введите в командной строке это выражение в соответствии с


правилами MATLAB и нажмите <Enter>:

» ехр(2.5)*lоg(11.3)^0.3
sqrt((sin(2.45*pi)+cos(3.78*pi)}/tan(3.3))

Ответ выводится в командное окно:

ans =
-3.2105
11
При вводе выражения использованы встроенные функции
MATLAB для вычисления экспоненты, натурального логарифма,
квадратного корня и тригонометрических функций. Какие встроенные
элементарные функции можно использовать и как их вызывать?
Наберите в командной строке команду help eifun, при этом в командное
окно выводится список всех встроенных элементарных функций с их
кратким описанием. Аргументы функций заключаются в круглые
скобки, имена функций набираются строчными буквами. Для ввода
числа π достаточно набрать pi в командной строке.
Арифметические операции в MATLAB выполняются в обычном
порядке, свойственном большинству языков программирования:
 возведение в степень ^;
 умножение и деление *, /;
 сложение и вычитание +, .
Для изменения порядка выполнения арифметических операторов
следует использовать круглые скобки.
Если теперь требуется вычислить значение выражения, похожего на
предыдущее, например

e 2,5  (ln 11,3) 0,3  ((sin 2,45  cos 3,78) / (tg 3,3))2 ,

то необязательно его снова набирать в командной строке. Можно


воспользоваться тем, что MATLAB запоминает все вводимые команды.
Для повторного занесения их в командную строку служат клавиши <up>,
<down>. Вычислите данное выражение, проделав следующие шаги:
1. Нажмите клавишу <>, при этом в командной строке появится
введенное ранее выражение.
2. Внесите в него необходимые изменения, заменив знак минус на
плюс и квадратный корень на возведение в квадрат (для перемещения

12
по строке с выражением служат клавиши <right>, <left>, <Home>,
<End>).
3. Вычислите измененное выражение, нажав <Enter>.
Получается

» ехр(-2.5)*log(11.3)^0.3+
((sin(2.45*pi)+cos(3.78*pi))/tan(3.3))^2
ans =
121.2446

Если необходимо получить более точный результат, то следует


выполнить команду format long e, затем нажимать клавишу <> до тех
пор, пока в командной строке не появится требуемое выражение, и
вычислить его, нажав <Enter>

» format long e
» exp(-2.5)*log(11.3)^0.3+
((sin.(2.45*pi)+cos(3.78*pi))/tan(3.3))^2
ans =
1.212446016556763e+002

Вывести результат последнего найденного выражения в другом


формате можно без повторного вычисления. Следует изменить формат
командой short, а затем посмотреть значение переменной ans, набрав ее
в командной строке и нажав <Enter>:

» format short
» ans
ans =
121.2446

13
В рабочей среде MATLAB 6.x для вызова ранее введенных команд
имеется удобное средство  окно Command History с историей команд.
История команд содержит время и дату каждого сеанса работы с
MATLAB 6.x. Для активизации окна Command History необходимо
выбрать вкладку с одноименным названием. Текущая команда в окне
изображена на синем фоне. Если щелкнуть на какой-либо команде в
окне левой кнопкой мыши, то данная команда становится текущей. Для
ее выполнения в MATLAB надо применить двойной щелчок мыши или
выбрать строку с командой при помощи клавиш <up>, <down> и
нажать клавишу <Enter>. Лишнюю команду можно убрать из окна. Для
этого ее надо сделать текущей и удалить при помощи клавиши <Delete>.
Можно выделить несколько идущих подряд команд при помощи
комбинации клавиш <Shift>+<up>, <Shift>+<down> и выполнить их при
помощи <Enter> или удалить клавишей <Delete>. Выделение
последовательно идущих команд можно производить левой кнопкой
мыши с одновременным удерживанием клавиши <Shift>. Если команды
не идут одна за другой, то для их выделения следует использовать
левую кнопку мыши с удерживанием клавиши <Ctrl>.
При щелчке правой кнопкой мыши по области окна Command
History появляется всплывающее меню. Выбор пункта Сору приводит к
копированию команды в буфер Windows. При помощи Evaluate Selection
можно выполнить отмеченную группу команд. Для удаления текущей
команды предназначен пункт Delete Selection. Для удаления всех команд
до текущей  Delete to Selection, для удаления всех команд  Delete Entire
History.
При вычислениях возможны некоторые исключительные ситуации,
например деление на нуль, которые в большинстве языков
программирования приводят к ошибке. При делении положительного
числа на нуль в MATLAB получается inf (бесконечность), а при делении

14
отрицательного числа на нуль получается inf (минус бесконечность) и
выдается предупреждение:

» 1/0
Warning: Divide by zero.
ans = Inf

При делении нуля на нуль получается NaN (не число) и также


выдается предупреждение:

» 0/0
Warning: Divide by zero.
ans = NaN

При вычислении, например, sqrt(1) никакой ошибки или


предупреждения не возникает. MATLAB автоматически переходит в
область комплексных чисел:

»sqrt(1.0)
ans = 0 + l.0000i

1.1.5. Работа с комплексными числами


При наборе комплексных чисел в командной строке MATLAB
можно использовать либо i, либо j, а сами числа при умножении,
делении и возведении в степень необходимо заключать в круглые скобки:

»(2.1+3.2i)*2+(4.2+1.7i)^2
ans =
18.9500 + 20.6800i

15
Если не использовать скобки, то умножаться или возводиться в
степень будет только мнимая часть, и получится неверный результат:

» 2.1+3.2i*2+4.2+1.7i^2
ans =
3.4100 + 6.4000i

Для вычисления комплексно-сопряженного числа применяется


апостроф, который следует набирать сразу за числом, без пробела:

» 23i'
ans =
2.0000 + 3.0000i

Если необходимо найти комплексно-сопряженное выражение, то


исходное выражение должно быть заключено в круглые скобки:
»((3.2+1.5i)*2+4.2+7.9i)'
ans =
10.6000  10.9000i

MATLAB позволяет использовать комплексные числа в качестве


аргументов встроенных элементарных функций:

» sin(2+3i)
ans =
9.1545  4.1689i

Конструирование комплексного числа по его действительной и


мнимой части выполняется с помощью функции complex:

16
» complex(2.3, 5.8)
ans =
2.3000 + 5.8000i

Как узнать, какие встроенные элементарные функции можно


использовать и как их вызывать? Наберите в командной строке команду
help eifun, при этом в командное окно выводится список всех встроенных
элементарных функций с их кратким описанием.

1.2. Индивидуальные задания

1. В соответствии с номером N по списку в журнале группы,


записанном в виде N = СМ, где С  старшая цифра, М  младшая цифра,
вычислите выражение, заданное с помощью табл. 1.1 и табл. 1.2.
2. Замените в выражениях табл. 1.1 и табл. 1.2 знак арифметической
операции умножения на знак операции сложения и вычислите новые
выражения без их полного набора в командной строке, воспользовавшись
тем, что MATLAB запоминает вводимые команды.
3. Получите результаты вычислений пункта 2 индивидуального
задания в форматах short и long.
4. Получите комплексное число (a + bi), где a, b  соответственно
число букв в вашем имени и фамилии. При этом определите также:
 комплексно-сопряженное число числу (a + bi);
 вычислите квадрат комплексно-сопряженного числа;
 вычислите произведение исходного комплексного числа и
комплексно-сопряженного числа;
 вычислите выражение sin(a + bi) + cos(a  bi).
5. Оформите отчет по лабораторной работе.

17
Таблица 1.1 – Индивидуальное задание по младшей цифре М
Младшая
цифра М
номера в 0 или 5 1 или 6 2 или 7 3 или 8 4 или 9
журнале
группы
A2 / 5  C A 2
 B1,7 A B  C C
3/ 7
 D A5 D
Выражение
BD DCA D1 / 5 / C B  A5
3
C  B4

Таблица 1.2 – Индивидуальное задание по старшей цифре С


Старшая
цифра С
номера в A B C D
журнале
группы
0 (sin(N ))2 ln( N  2) exp( N / N 2 ) A B
1 (cos(N )) 4 4 2
(ln(N )) exp(N )  1 AC
2 (tg(N ))2 (log(N ))4 1 / exp( N ) B/C
3 (ctg(N ))4 log( N  N 3  9) N / exp( N ) C / ( A  B)

18
Лабораторная работа 2

ПРОСТЕЙШИЕ ВЫЧИСЛЕНИЯ В ПАКЕТЕ MATLAB


С ИСПОЛЬЗОВАНИЕМ ПЕРЕМЕННЫХ И ВЕКТОРОВ

Цель лабораторной работы: получение и закрепление знаний,


формирование практических навыков работы с пакетом MATLAB при
простейших вычислениях с использованием переменных и векторов.

2.1. Краткие сведения из теории

2.1.1. Использование переменных в пакете MATLAB


Как и во всех языках программирования, в MATLAB предусмотрена
возможность работы с переменными. Причем пользователь не должен
заботиться о том, какие значения будет принимать переменная
(комплексные, вещественные или только целые). Для того чтобы
присвоить, например, переменной z значение 1.45, достаточно написать в
командной строке z = 1,45, при этом MATLAB сразу же выведет значение
z:

» z = 1.45
z =
1.4500

Здесь знак равенства используется в качестве оператора


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

19
начинающаяся с буквы. Строчные и прописные буквы различаются,
например, MZ и mz являются двумя разными переменными. Количество
воспринимаемых MATLAB символов в имени переменной составляет 31.
В качестве упражнения на использование переменных найдите
значение следующего выражения:

sin 1,3 ln 3,4  tg 2,75 th 2,75  sin 1,3 ln 3,4  


tg 2,75 th 2,75 .

Наберите последовательность команд, приведенную ниже (обратите


внимание на точку с запятой в первых двух операторах присваивания для
подавления вывода промежуточных значений на экран):

» х = sin(1.3*pi)/log(3.4);
» у = sqrt(tan(2.75)/tanh(2.75));
» z = (х+у)/(х-у)
Z =
0.0243 - 0.9997i

Последний оператор присваивания не завершается точкой с запятой


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

»(sin(1.3*pi)/log(3.4)+sqrt(tan(2.75)/tanh(2.75)))/…
(sin(1.3*pi)/log(3.4)-sqrt(tan(2.75)/tanh(2.75)))
ans =
0.0243 - 0.9997i

Обратите внимание, насколько первая запись компактнее и яснее


второй! Во втором варианте формула не помещалась в командном окне на

20
одной строке, и пришлось записать ее в две строки, для чего в конце
первой строки поставлены три точки.

Замечание 1
Для ввода длинных формул или команд в командную строку следует
поставить три точки (подряд, без пробелов), нажать клавишу <Enter> и
продолжить набор формулы на следующей строке. Так можно разместить
выражение на нескольких строках. MATLAB вычислит все выражение или
выполнит команду после нажатия на <Enter> в последней строке (в
которой нет трех идущих подряд точек).
MATLAB запоминает значения всех переменных, определенных во
время сеанса работы. Если после ввода примера, приведенного выше, были
проделаны еще какие-либо вычисления, и возникла необходимость
вывести значение х, то следует просто набрать х в командной строке и
нажать <Enter>:

» x
-0.6611

Переменные, определенные выше, можно использовать и в других


формулах. Например, если теперь необходимо вычислить выражение

sin 1,3 ln 3,4  tg 2,75 th 2,75 3 / 2 ,

то достаточно ввести следующую команду:

» (x-y)^(3/2)
ans =
-0.8139 + 0.3547i

21
Вызов функций в MATLAB обладает достаточной гибкостью.
Например, вычислить е3,5 можно, вызвав функцию ехр из командной
строки:

» ехр(3.5)
ans =
33.1155

Другой способ состоит в использовании оператора присваивания:

» t = ехр(3.5)
t =
33.1155

Предположим, что часть вычислений с переменными выполнена, а


остальные придется доделать во время следующего сеанса работы с
MATLAB. В этом случае понадобится сохранить переменные,
определенные в рабочей среде.

2.1.2. Сохранение рабочей среды


Самый простой способ сохранить значения всех переменных 
использовать в меню File пункт Save Workspace As… . При этом появляется
диалоговое окно Save… , в котором следует указать каталог и имя файла.
По умолчанию предлагается сохранить файл в подкаталоге work основного
каталога MATLAB. Оставьте пока этот каталог. В дальнейшем будет
объяснено, как устанавливать пути к каталогам в MATLAB для поиска
файлов. Удобно давать файлам имена, содержащие дату работы, например
work20-06-12. MATLAB сохранит результаты работы в файле
work20-06-12.mat. Теперь можно закрыть MATLAB одним из следующих
способов:

22
 выбрать в меню File пункт Exit MATLAB;
 нажать клавиши <Ctrl>+<Q>;
 набрать команду Exit в командной строке и нажать <Enter>;
 нажать на кнопку с крестиком в правом верхнем углу окна
программы MATLAB.
В следующем сеансе работы для восстановления значений
переменных следует открыть файл work20-06-12.mat при помощи пункта
Open меню File. Теперь все переменные, определенные в прошлом сеансе,
стали доступными. Их можно использовать во вновь вводимых командах.
Сохранение и восстановление переменных рабочей среды можно
выполнить и из командной строки. Для этого служат команды save и load.
В конце сеанса работы с MATLAB надо выполнить команду

» save work20-06-12

Расширение можно не указывать, MATLAB сохранит переменные


рабочей среды в файле work20-06-12.mat. В начале следующего сеанса
работы для считывания переменных следует ввести команду

» load work20-06-12

Подробную информацию о командах save и load можно получить,


набрав в командной строке help save или help load.

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

» diary d20-06-12.txt
» al = 3;
» а2 = 2.5;
» а3 = al + a2
» а3 =
5.5000
» save work20-06-12
» quit

производит следующие действия:


 Открывает файл d20-06-12.txt.
 Производит вычисления.
 Сохраняет переменные в двоичном файле work.20-06-12.mat.
 Сохраняет на диске в подкаталоге work корневого каталога
MATLAB журнал работы в файле d20-06-12.txt и закрывает MATLAB.
Посмотрите содержимое файла d20-06-12.txt в каком-нибудь
текстовом редакторе, например, в стандартной программе Windows
Блокнот (NotePad). В файле окажется следующий текст:

al = 3;
а2 = 2.5;
а3 = al+a2
а3 =
5.5000

24
save work20-02-06
quit

Запустите снова MATLAB и введите команду load work20-06-12 или


откройте файл work20-06-12.mat при помощи меню, как описано выше.

2.1.3. Просмотр переменных


При работе с достаточно большим количеством переменных
необходимо знать, какие переменные уже использованы, а какие нет. Для
этой цели служит команда who, выводящая в командное окно MATLAB
список используемых переменных:

» who
Your variables are:
al a2 a3

Команда whos позволяет получить более подробную информацию о


переменных в виде таблицы:

»
Name Size Bytes Class
whos
al 8 double
1l
a2 1l 8 double
a3 ll 8 array
double
arrayusing 24 bytes
Grand total is 3 elements
array

Первый столбик Name состоит из имен используемых переменных.


То, что содержится в столбике Size, по существу, определяется основным
принципом работы MATLAB. Программа MATLAB все данные
представляет в виде массивов. Переменные al, a2 и а3 являются
двухмерными массивами размера один на один. Каждая из переменных
занимает по восемь байтов, как указано в столбике Bytes. Наконец, в

25
последнем столбике Class указан тип переменных  double array, т.е.
массив, состоящий из чисел двойной точности. В строке под таблицей
написано, что в итоге три элемента, т.е. переменные, занимают двадцать
четыре байта. Оказывается, что представление всех данных в MATLAB в
виде массивов дает определенные преимущества.
Для освобождения из памяти всех переменных используется команда
clear. Если в аргументах указать список переменных (через пробел), то
только они будут освобождены из памяти, например:

» clear al аЗ
» who
Your variables are:
a2

Начиная с версии 6.0, появилось удобное средство для просмотра


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

2.1.4. Работа с массивами


Очень важно правильно понять, как использовать массивы. Без этого
невозможна эффективная работа в MATLAB, в частности построение
графиков, решение задач линейной алгебры, обработки данных,
статистики и многих других. В данном подразделе описаны вычисления с
векторами.

26
Массив  упорядоченная, пронумерованная совокупность
однородных данных. У массива должно быть имя. Массивы различаются
по числу размерностей или измерений: одномерные, двухмерные,
многомерные. Доступ к элементам осуществляется при помощи индекса. В
MATLAB нумерация элементов массивов начинается с единицы. Это
значит, что индексы должны быть больше или равны единице.
Важно понять, что вектор, вектор-строка или матрица являются
математическими объектами, а одномерные, двухмерные или многомерные
массивы  способы хранения этих объектов в компьютере. Далее будут
использоваться слова вектор и матрица, если больший интерес
представляет сам объект, чем способ его хранения. Вектор может быть
записан в столбик (вектор-столбец) и в строку (вектор-строка). Вектор-
столбцы и вектор-строки часто будут называться просто векторами,
различие будет сделано в тех случаях, если важен способ хранения вектора
в MATLAB. Векторы и матрицы обозначаются курсивом, а
соответствующие им массивы прямым моноширинным шрифтом,
например: "вектор а содержится в массиве а", "запишите матрицу R в
массив R".
Ввод, сложение и вычитание векторов
Работу с массивами начнем с простого примера  вычисления суммы
векторов:

1,3   7,1 
   
a   5,4  , b   3,5  .
 6,9   8,2 
   

Для хранения векторов используйте массивы а и b. Введите массив а


в командной строке, используя квадратные скобки и разделяя элементы
вектора точкой с запятой:

27
» a = [1.3; 5.4; 6.9]
a =
1.3000
5.4000
6.9000

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


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

» b = [7.1; 3.5; 8.2];

Для нахождения суммы векторов используется знак +. Вычислите


сумму, запишите результат в массив с и выведите его элементы в
командное окно:

» с = а + b
с =
8.4000
8.9000
15.1000

Узнайте размерность и размер массива а при помощи встроенных


функций ndims и size:

» ndims(a)
ans =
2
» size(a)
ans = 3 1

28
Итак, вектор а хранится в двухмерном массиве а с размерностью три
на один (вектор-столбец из трех строк и одного столбца). Аналогичные
операции можно проделать и для массивов b и c. Поскольку числа в пакете
MATLAB представляются в виде двухмерного массива один на один, то
при сложении векторов используется тот же знак плюс, что и для сложения
чисел.
Ввод вектор-строки осуществляется в квадратных скобках, однако
элементы следует разделять пробелами или запятыми. Операции
сложения, вычитания и вычисление элементарных функций от вектор-
строк производятся так же, как и с вектор-столбцами, в результате
получаются вектор-строки того же размера, что и исходные. Например:

» s1 = [3 4 9 2]
s1 =
3 4 9 2
» s2 = [5 3 3 2]
s1 =
5 3 3 2
» s3 = s1 + s2
s3 =
8 7 12 4

Замечание 3
Если размеры векторов, к которым применяется сложение или
вычитание, не совпадают, то выдается сообщение об ошибке.

Естественно, для нахождения разности векторов следует применять


знак минус, с умножением – сложнее.

29
Введите две вектор-строки:

» v1 = [2 -3 4 1];
» v2 = [7 5 -6 9];

Операция .* (не вставляйте пробел между точкой и звездочкой!)


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

» u = v1.*v2
u =
14 -15 -24 9

При помощи .^ осуществляется поэлементное возведение в степень:

» р = v1.^2
p =
4 9 16 1

Показателем степени может быть вектор той же длины, что и


возводимый в степень. При этом каждый элемент первого вектора
возводится в степень, равную соответствующему элементу второго
вектора:

» p = vl.^v2
Р =
128.0000 -243.0000 0.0002 1.0000

30
Деление соответствующих элементов векторов одинаковой длины
выполняется с использованием операции ./

» d = v1./v2
d =
0.2857 -0.6000 -0.6667 0.1111

Обратное поэлементное деление (деление элементов второго вектора


на соответствующие элементы первого) осуществляется при помощи
операции .\

» dinv = vl.\v2
dinv =
3.5000 -1.6667 -1.5000 9.0000

Итак, точка в MATLAB используется не только для ввода


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

» v = [4 6 8 10];
» s = v + 1.2
s =
5.2000 6.2000 9.2000 11.2000
» r = 1.2 - v
r =
-2.8000 -4.8000 -6.8000 -8.8000

31
» r1 = v - 1.2
r1 =
2.8000 4.8000 6.8000 8.8000

Умножать вектор на число можно как справа, так и слева:

» v = [4 6 8 10];
» p = v*2
р =.
8 12 16 20
» pi = 2*v
pi =
8 12 16 20

Делить при помощи знака / можно вектор на число:

» р = v/2
p =
2 3 4 5

Попытка деления числа на вектор приводит к сообщению об ошибке:

» р = 2/v
??? Error using ==> /
Matrix dimensions must agree.

Если требуется разделить число на каждый элемент вектора и


записать результат в новый вектор, то следует использовать операцию ./

» w = [4 2 6];

32
» d = 12./w
d = 3 6 2

Все вышеописанные операции применимы как к вектор-строкам, так


и к вектор-столбцам.
Особенность MATLAB представлять все данные в виде массивов
является очень удобной. Пусть, например, требуется вычислить значение
функции sin сразу для всех элементов вектора с (который хранится в
массиве с) и записать результат в вектор d. Для получения вектора d
достаточно использовать один оператор присваивания:

» d = sin(с)
d =
0.8546
0.5010
0.5712

Итак, встроенные в MATLAB элементарные функции


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

» sqrt(-d)
ans =
0 + 0.9244i
0 + 0.7078i
0 + 0.7558i

33
Оператор присваивания не использовался, поэтому пакет MATLAB
записал ответ в стандартную переменную ans.
Для определения длины вектор-столбцов или вектор-строк служит
встроенная функция length:

» length(s1)
ans =
4

Из нескольких вектор-столбцов можно составить один, используя


квадратные скобки и разделяя исходные вектор-столбцы точкой с запятой:

» v1 = [1; 2];
» v2 = [3; 4; 5];
» v = [v1; v2]
v =
1
2
3
4
5

Для сцепления вектор-строк также применяются квадратные скобки,


но сцепляемые вектор-строки отделяются пробелами или запятыми:
» v1 = [1 2];
» v2 = [3 4 5];
» v = [v1 v2]
v =
1 2 3 4 5

34
Работа с элементами векторов
Доступ к элементам вектор-столбца или вектор-строки
осуществляется при помощи индекса, заключаемого в круглые скобки
после имени массива, в котором хранится вектор. Если среди переменных
рабочей среды есть массив v, определенный вектор-строкой

» v = [1.3 3.6 7.4 8.2 0.9];

то для вывода, например его четвертого элемента, используется


индексация:

» v(4)
ans =
8.2000

Появление элемента массива в левой части оператора присваивания


приводит к изменению в массиве

» v(2) = 555
v =
1.3000 555.0000 7.4000 8.2000 0.9000

Из элементов массива можно формировать новые массивы, например

» u = [v(3); v(2); v(1)]


u =
7.4000
555.0000
1.3000

35
Для помещения определенных элементов вектора в другой вектор в
заданном порядке служит индексация при помощи вектора. Запись в
массив w четвертого, второго и пятого элементов v производится
следующим образом:

» ind = [4 2 5];
» w = v(ind)
w =
8.2000 555.0000 0.9000

MATLAB предоставляет удобный способ обращения к блокам


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

» w = [0.1 2.9 3.3 5.1 2.6 7.1 9.8];


» w(2:6) = 0;
» w
w =
0.1000 0 0 0 0 0 9.8000

Присваивание w(2:6) = 0 эквивалентно последовательности команд


w(2) = 0; w(3) = 0; w(4) = 0; w(5) = 0; w(6) = 0.
Индексация при помощи двоеточия оказывается удобной при
выделении части из большого объема данных в новый массив:

» w - [0.1 2.9 3.3 5.1 2.6 7.1 9.8];

36
» wl = w(3:5)
wl =
3.3000 5.1000 2.6000

Составьте массив w2, содержащий элементы w, кроме четвертого. В


этом случае удобно использовать двоеточие и сцепление строк:

» w2 = [w(l:3) w(5:7)]
w2 =
0.1000 2.9000 3.3000 2.6000 7.1000 9.8000

Элементы массива могут входить в выражения. Нахождение,


например, среднего геометрического из элементов массива u можно
выполнить следующим образом:

» gm = (u(l)*u(2)*u(3))^(l/3)
gm =
17.4779

Конечно, этот способ не очень удобен для длинных массивов. Для


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

Применение функций обработки данных к векторам


Перемножение элементов вектор-столбца или вектор-строки
осуществляется при помощи функции prod:

» z = [3; 2; 1; 4; 6; 5];
» р = prod(z)

37
p =
720

Функция sum предназначена для суммирования элементов вектора. С


ее помощью нетрудно вычислить среднее арифметическое элементов
вектора z:

» sum(z)/length(z)
ans =
3.5000

В MATLAB имеется и специальная функция mean для вычисления


среднего арифметического:

» mean(z)
ans =
3.5000

Для определения минимального и максимального из элементов


вектора служат встроенные функции min и max:

» m1 = max(z)
m1 =
6
» m2 = min(z)
m2 =
1

Часто необходимо знать не только значение минимального или


максимального элемента в массиве, но и его индекс (порядковый номер). В

38
этом случае встроенные функции min и max необходимо использовать с
двумя выходными аргументами, например

» [m, k] = min(z)
m =
1
k =
3

В результате переменной m будет присвоено значение минимального


элемента массива z, а номер минимального элемента занесен в переменную
k.
Для получения информации о различных способах использования
функций следует набрать в командной строке help и имя функции.
MATLAB выведет в командное окно всевозможные способы обращения к
функции с дополнительными пояснениями.
В число основных функций для работы с векторами входит функция
упорядочения вектора по возрастанию его элементов sort

» r = [9.4 -2.3 -5.2 7.1 0.8 1.3];


» R = sort(r)
R =
-5.2000 -2.3000 0.8000 1.3000 7.1000 9.4000

Можно упорядочить вектор по убыванию, используя эту же


функцию sort:

» R1 = -sort(-r)
R1 =
9.4000 7.1000 1.3000 0.8000 -2.3000 -5.2000

39
Упорядочение элементов в порядке возрастания их модулей
производится с привлечением функции abs:

» R2 = sort(abs(r))
R2 =
0.8000 1.3000 2.3000 5.2000 7.1000 9.4000

Вызов sort с двумя выходными аргументами приводит к


образованию массива индексов соответствия элементов упорядоченного и
исходного массивов:

» [rs, ind] = sort(r)


rs =
-5.2000 -2.3000 0.8000 1.3000 7.1000 9.4000
ind =
3 2 5 6 4 1

2.2. Индивидуальные задания

1. Создайте журнал выполнения лабораторной работы.


2. Вычислите значения функции

sin 2 x
y ( x)   e  x ln x
1  cos x

в точках 0.2, 0.3, 0.5, 0.8, 1.3, 1.7, 2.5, N, k, где N  ваш номер по списку
журнала группы; k  численное значение выражения, заданного табл. 1.1 и
табл. 1.2 в соответствии с номером N по списку в журнале группы,
записанном в виде N = СМ, где С  старшая цифра, М  младшая цифра.

40
3. Сформируйте вектор-строку v, содержащую все значения
аргумента x и последние пять значений функции y(x).
4. Получите вектор-строку v1, добавив к каждому элементу вектор-
строки v число 2.1.
5. Вычислите: w = v + v1; w1 = v  v1; w2 = v1  v; w3 = v ./ v1;
w4 = v1.*v; w5 = v1.^v.
6. Упорядочите результаты сложения векторов v + v1 в порядке
возрастания модулей элементов вектора суммы, возрастания элементов
вектора суммы, убывания элементов вектора суммы.
7. Сформируйте из третьих и пятых элементов вектор-строк w, w1,
w2, w3, w4, w5 вектор-столбец ww.
8. Определите в векторе ww минимальный и максимальный элемент,
сумму и произведение компонент вектора.
9. Присвойте элементам массива ww с третьего по шестой значения,
равные единице.
10. Используйте команды who и whos для получения информации о
всех использованных в лабораторной работе переменных.
11. Приведите из журнала выполнения лабораторной работы
несколько первых и последних строк.
12. Оформите отчет по лабораторной работе.

41
Лабораторная работа 3

ПРОСТЕЙШИЕ ВЫЧИСЛЕНИЯ В ПАКЕТЕ MATLAB


С ИСПОЛЬЗОВАНИЕМ МАТРИЦ

Цель лабораторной работы: получение и закрепление знаний,


формирование практических навыков работы с пакетом MATLAB при
простейших вычислениях с использованием переменных, векторов и
матриц.

3.1. Краткие сведения из теории

3.1.1. Различные способы ввода матриц в пакете MATLAB


Вводить небольшие по размеру матрицы удобно прямо из командной
строки. Введите матрицу размерностью два на три

 3 1  1
A    .
 2 4 3 

Для хранения матрицы используйте двухмерный массив с именем A.


При вводе учтите, что матрицу А можно рассматривать как вектор-столбец
из двух элементов, каждый из которых является вектор-строкой длиной
три, следовательно, строки при наборе отделяются точкой с запятой:

» А =[3 1 -1; 2 4 3]
А =
3 1 -1
2 4 3

42
Для изучения простейших операций над матрицами приведем еще
несколько примеров. Рассмотрим другие способы ввода. Введите
квадратную матрицу размера три так, как описано ниже:

 4 3  1
 
B  2 7 0 .
5 1 2 
 

Начните набирать в командной строке

» В = [4 3 -1

Нажмите клавишу <Enter>. Обратите внимание, что пакет ничего не


вычислил. Курсор мигает на следующей строке без символа ».
Продолжите ввод матрицы построчно, нажимая в конце каждой строки
<Enter>. Последнюю строку завершите закрывающей квадратной скобкой,
получается:

2 7 0
-5 1 2]
B = 4 3 -1
2 7 0
-5 1 2

Еще один способ ввода матриц состоит в том, что матрицу можно
трактовать как вектор-строку, каждый элемент которой является вектор-
столбцом. Например, матрицу два на три

 3 1 7
C   
 4 2 0

43
можно ввести при помощи команды:

» С = [[3; 4] [-1; 2] [7; 0]]


С =
3 -1 7
4 2 0

Посмотрите переменные рабочей среды, набрав в командной строке


whos:

А 2x3 48 double array


В 3x3 72 double array
С 2x3 48 double array

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


и одна квадратная.

3.1.2. Обращение к элементам матриц в пакете MATLAB


Доступ к элементам матриц осуществляется при помощи двух
индексов  номеров строки и столбца, заключенных в круглые скобки,
например

» С(2, 3)
ans =
0

Элементы матриц могут входить в состав выражений:

» С(1, 1) + С(2, 2) + С(2, 3)


ans = 5

44
Расположение элементов матрицы в памяти компьютера определяет
еще один способ обращения к ним. Матрица А размера m на n хранится в
виде вектора длины mn, в котором элементы матрицы расположены один
за другим по столбцам

[А(1,1) А(2,1)...А(m,1)...А(1,n) А(2,n)...А(m,n)].

Для доступа к элементам матрицы можно использовать один индекс,


задающий порядковый номер элемента матрицы в векторе.
Матрица С, определенная в предыдущем подразделе, содержится в
векторе

[C(1,1) C(2,1) C(1,2) С(2,2) С(1,3) С(2,3)],

который имеет шесть компонент. Доступ к элементам матрицы


осуществляется следующим образом:

» С(1)
ans =
3
» С(5)
ans =
7

3.1.3. Операции над матрицами в пакете MATLAB: сложение,


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

45
векторов, осуществляется при помощи знаков плюс и минус. Найдите
сумму и разность матриц С и А, определенных выше:

» S = А+С
S =
6 0 6
6 6 3
» R = С-А
R =
0 -2 8
2 -2 -3

Следите за совпадением размерности, иначе получите сообщение об


ошибке:

» S = А+В
??? Error using ==> 
Matrix dimensions must agree.

Для умножения матриц предназначена звездочка:

» Р = С*В

P =
-25 9 11
20 26 -4

Умножение матрицы на число тоже осуществляется при помощи


звездочки, причем умножать на число можно как справа, так и слева:

46
» Р = А*3
Р =
9 3 -3
6 12 -3
» Р = 3*А
Р =
9 3 -3
6 12 9

Транспонирование матрицы, так же как и вектора, производится при


помощи .', а символ ' означает комплексное сопряжение. Для
вещественных матриц эти операции приводят к одинаковым результатам:

» В'
ans =
4 2 -5
3 7 1
-1 0 2
» В.'
ans =
4 2 -5
3 7 1
-1 0 2

Замечание 1
Если матрица A  aik , i  1, n, k  1, m есть произвольная матрица
размера nm, то матрица, транспонированная по отношению к А, есть
матрица размера mn: A  aki , k  1, m, i  1, n . Таким образом, строки
матрицы A становятся столбцами матрицы A , а столбцы матрицы A
становятся строками матрицы A .
47
Комплексно-сопряженная матрица получается из исходной в два
этапа: выполняется транспонирование исходной матрицы, а затем все
комплексные числа заменяются на комплексно-сопряженные.
Сопряжение и транспонирование матриц, содержащих комплексные
числа, приведут к созданию разных матриц:

» К = [l-i, 2+3i; 3-5i, l-9i]


К = 1.0000 – 1.0000i 2.0000 + 3.0000i
3.0000 – 5.0000i 1.0000 – 9.0000i
» К '
ans =
1.0000 + 1.0000i 3.0000 + 5.0000i
2.0000 – 3.0000i 1.0000 + 9.0000i
» К.'
ans =
1.0000 - 1.0000i 3.0000 - 5.0000i
2.0000 + 3.0000i 1.0000 - 9.0000i

Замечание 2
При вводе вектор-строк их элементы можно разделять или
пробелами, или запятыми. При вводе матрицы К применены запятые для
более наглядного разделения комплексных чисел в строке.
Возведение квадратной матрицы в целую степень производится с
использованием оператора ^:

» В2 = В^2
B2 =
27 32 -6
22 55 -2
-28 -6 9

48
Проверьте полученный результат, умножив матрицу саму на себя.
Убедитесь, что вы освоили простейшие операции с матрицами в
MATLAB. Найдите значение следующего выражения

(A + С) В3 (A  С)Т.

Учтите приоритет операций: сначала выполняется


транспонирование, потом возведение в степень, затем умножение, а
сложение и вычитание производятся в последнюю очередь

» (А+С)*В^3*(А-С)'
ans =
1848 1914
10290 3612

3.1.4. Умножение матриц и векторов


Вектор-столбец или вектор-строка в MATLAB являются матрицами,
у которых один из размеров равен единице, поэтому все вышеописанные
операции применимы и для умножения матрицы на вектор-столбец или
вектор-строки на матрицу. Например, вычисление выражения

 2 0 1   8
 
[1 3  2]   4 8  1  3 
 
 0 9 2  4 
  

можно осуществить следующим образом:

» a = [1 3 -2];
» B = [2 0 1; -4 8 -1; 0 9 2];
» c = [-8; 3; 4];

49
» a*B*c
ans =
74

3.1.5. Решение систем линейных уравнений


В математике ничего не говорится про деление матриц и векторов,
однако в MATLAB символ \ используется для решения систем линейных
уравнений. Решим систему из трех уравнений с тремя неизвестными:

 1,2 x1  0,3x2  0,2 x3  1,3;



 0,5 x1  2,1x2  1,3x3  3,9;
 0,9 x  0,7 x  5,6 x  5,4.
 1 2 3

Введем матрицу коэффициентов системы в массив A, а вектор


правой части системы в массив b. Решим систему при помощи символа \:

» x = A\b
x =
1.0000
1.0000
1.0000

Проверьте правильность ответа, умножив матрицу коэффициентов


системы A на вектор-столбец x.

3.1.6. Блочные матрицы


Очень часто в приложениях возникают так называемые блочные
матрицы, т.е. матрицы, составленные из непересекающихся подматриц
(блоков). Рассмотрим вначале конструирование блочных матриц. Введите
матрицы

50
 1 4  2 0  3  3 8 9 
A    , B    , C    , D   
 1 4  0 5  3 3   1 10 

 A B
и создайте из них блочную матрицу K    .
C D
Учитывая, что матрица К состоит из двух строк, в первой строке
матрицы А и B, а во второй  С и D, блочную матрицу можно
сформировать следующим образом:

» К = [А В; С D]
K =
-1 4 2 0
-1 4 0 5
3 -3 8 9
-3 3 1 10

Блочную матрицу можно получить и другим способом, если считать,


что матрица K состоит из двух столбцов, в первом  матрицы А и С, а во
втором  В и D:

» K = [[А; С] [В; D]]

Обратной к конструированию блочных матриц является задача


выделения блоков. Выделение блоков матриц осуществляется индексацией
при помощи двоеточия. Введите матрицу

 1 2 0 2
 
 4 10 12 5 
P
0 11 10 5 
 
 9 2 3 5 

51
и затем выделите подматрицу с элементами a22 , a23 , a32 , a33 , задав
номера строк и столбцов при помощи двоеточия:

»Р1 = Р(2:3,2:3)
Р1 =
10 12
11 10

Для выделения из матрицы столбца или строки (то есть массива, у


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

»p = P(2, :)
p =
4 10 12 5

При выделении блока до конца матрицы можно не указывать ее


размеры, а использовать элемент end:

»p = Р(2, 2:end)
p =
10 12 5

3.1.7. Удаление строк и столбцов


В MATLAB парные квадратные скобки [ ] обозначают пустой
массив, который, в частности, позволяет удалять строки и столбцы
матрицы. Для удаления строки следует присвоить ей пустой массив.
Удалите, например, первую строку квадратной матрицы:

52
» М =[2 0 3; 1 1 4; 6 1 3];
» M(1,:)=[];
» M
M =
1 1 4
6 1 3

Обратите внимание на соответствующее изменение размеров


массива, которое можно проверить при помощи size:

» size(M)
ans =
2 3

Аналогичным образом удаляются и столбцы. Для удаления


нескольких идущих подряд столбцов (или строк) им нужно присвоить
пустой массив. Удалите второй и третий столбец в массиве M

» М(:, 2:3) = []
M =
1
6

Индексация существенно экономит время при вводе матриц,


имеющих определенную структуру.

3.1.8. Заполнение матриц при помощи индексации


Выше было описано несколько способов ввода матриц в MATLAB.
Однако часто бывает проще сгенерировать матрицу, чем вводить ее,

53
особенно если она обладает простой структурой. Рассмотрим пример такой
матрицы:

1 1 1 1 1
 
0 0 0 0 0
T  0 0 0 0 0 .
 
0 0 0 0 0
0 0  1  1  1

Генерация матрицы Т осуществляется в три этапа:


1. Создание массива T размера пять на пять, состоящего из нулей.
2. Заполнение первой строки единицами.
3. Заполнение части последней строки минус единицами до
последнего элемента.
Соответствующие команды MATLAB приведены ниже.

» A(1:5, 1:5) = 0
A=
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

» A(1, :) = 1
A=
1 1 1 1 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
54
» A(end, 3:end) = -1
A=
1 1 1 1 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 -1 -1 -1

Создание некоторых специальных матриц в MATLAB


осуществляется при помощи встроенных функций.

3.1.9. Создание матриц специального вида


Заполнение прямоугольной матрицы нулями производится
встроенной функцией zeros, аргументами которой являются число строк и
столбцов матрицы:

» A = zeros(2, 6)
A =
0 0 0 0 0 0
0 0 0 0 0 0

Один аргумент функции zeros приводит к образованию квадратной


матрицы заданного размера:

» A = zeros(3)
A =
0 0 0
0 0 0
0 0 0

55
Единичная матрица инициализируется при помощи функции eye:

» I = eye(3)
I=
1 0 0
0 1 0
0 0 1

Функция eye с двумя аргументами создает прямоугольную матрицу,


у которой на главной диагонали стоят единицы, а остальные элементы
равны нулю:

» I = eye(4, 8)
I =
1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0

Матрица, состоящая из единиц, образуется в результате вызова


функции ones:

» E = ones(3, 7)
E =
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1

Использование одного аргумента в ones приводит к созданию


квадратной матрицы, состоящей из единиц.

56
MATLAB предоставляет возможность заполнения матриц
случайными элементами. Результатом функции rand является матрица
чисел, распределенных случайным образом между нулем и единицей, а
функции randn — матрица чисел, распределенных по нормальному закону:

» R = rand(3, 5)
R =
0.9501 0.4860 0.4565 0.4447 0.9218
0.2311 0.8913 0.0185 0.6154 0.7382
0.6068 0.7621 0.8214 0.7919 0.1763

Один аргумент функций rand и randn приводит к формированию


квадратных матриц.
Часто возникает необходимость создания диагональных матриц, т.е.
матриц, у которых все недиагональные элементы равны нулю. Функция
diag формирует диагональную матрицу из вектор-столбца или вектор-
строки, располагая их элементы по диагонали матрицы:

» d = [1; 2; 3; 4];
» D = diag(d)
D =
1 0 0 0
0 2 0 0
0 0 3 0
0 0 0 4

Функция diag служит и для выделения диагонали матрицы в вектор,


например

» A = [10 1 2; 1 20 3; 2 3 30];

57
» d = diag(A)

d =
10
20
30

3.1.10. Поэлементные операции с матрицами


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

 2 5  1  1 2 8 
A    , B    .
3 4 9   7  3  5

Умножение каждого элемента одной матрицы на соответствующий


элемент другой производится при помощи оператора .*:

» С = А.*В
С =
-2 10 -8
21 -12 -45

Для деления элементов первой матрицы на соответствующие


элементы второй используется оператор ./, а для деления элементов второй
матрицы на соответствующие элементы первой служит .\:

» R1 = А./В1

58
R1 =
-2.0000 2.5000 -0.1250
0.4286 -1.3333 -1.8000
» R2 = А.\В1
R2 =
-0.5000 0.4000 -8.0000
2.3333 -0.7500 -0.5556

Поэлементное возведение в степень осуществляется при помощи


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

3.1.11. Визуализация матриц


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

2 1 0 0 0 0 0
 
1 2 1 0 0 0 0
0 1 2 1 0 0 0
 
G  0 0 1 2 1 0 0
0 0 0 1 2 1 0
 
0 0 0 0 1 2 1
0 2 
 0 0 0 0 1
» spy(G)

После выполнения команды spy на экране появляется графическое


окно Figure No. 1. На вертикальной и горизонтальной осях отложены
59
номера строк и столбцов. Ненулевые элементы обозначены маркерами,
внизу графического окна указано число ненулевых элементов (nz = 19).
Наглядную информацию о соотношении величин элементов матрицы
дает функция imagesc, которая интерпретирует матрицу как прямоугольное
изображение. Каждый элемент матрицы представляется в виде квадратика,
цвет которого соответствует величине элемента. Для того чтобы узнать
соответствие цвета и величины элемента, следует использовать команду
colorbar, выводящую рядом с изображением матрицы шкалу цвета (Insert
(в графическом окне Figure No. 1), colorbar). Наконец, для печати на
монохромном принтере удобно получить изображение в оттенках серого
цвета, используя команду colormap(gray) (Edit (в графическом окне
Figure No. 1), Colormap, Colormap Editor, Tools, gray). Мы будем работать с
матрицей G. Набирайте команды, указанные ниже, и следите за
состоянием графического окна:

» imagesc(G)
» colorbar
» colormap(gray)

В результате получается наглядное представление матрицы.

3.2. Индивидуальные задания

1. Создайте журнал выполнения лабораторной работы.


2. Введите две матрицы A и B размерностью три на три.
3. Выполните над матрицами операции сложения, вычитания и
умножения.
4. Выполните транспонирование матриц A и B.
5. Создайте из матриц A и B матрицу C с комплексными числами,
причем, элементы матрицы A должны стать действительными частями

60
комплексных чисел, а элементы матрицы B  комплексными частями, т.е.
между элементами матриц должно выполняться соотношение:
ckj  akj  bkj i, k, j =1, 2, 3.

6. Определите матрицу, комплексно-сопряженную матрице C.


7. Возведите квадратную матрицу A в квадрат с использованием
оператора ^. Сравните полученный результат, умножив матрицу A саму на
себя.
8. Вычислите произведение первой строки матрицы A и матрицы B, а
также произведение матрицы B и третьего столбца матрицы A.
9. Решите систему линейных уравнений
a11 x  a12 y  a13 z  d 1,
a21 x  a22 y  a23 z  d 2,
a21 x  a32 y  a33 z  d 3,
где коэффициенты системы уравнений определяются номером по списку в
журнале группы из табл. 3.1.
10. Создайте из матриц A и B и транспонированных матриц AT и B T
 A B
блочную матрицу K   T .
B AT 
11. Удалите второй столбец и третью строку из матрицы K.
12. Заполните прямоугольную матрицу размерами не менее 58
нулями с помощью функции zeros.
13. Инициализируйте при помощи функции eye прямоугольную и
квадратную единичные матрицы, содержащие не менее пяти единиц.
14. Создайте с помощью функции ones прямоугольную и квадратную
матрицы из единиц, содержащие не менее четырех строк.
15. Создайте с помощью функции rand матрицу 45 чисел,
распределенных случайным образом между нулем и N.
16. Из элементов первой строки блочной матрицы с помощью
функции diag сформируйте диагональную матрицу.

61
17. Выполните известные Вам поэлементные операции над
матрицами A и B.
18. Выполните визуализацию блочной матрицы, используя команды
spy, imagesc, colorbar, colormap(gray).
19. Приведите из журнала выполнения лабораторной работы
несколько первых и последних строк.
20. Оформите отчет по лабораторной работе.

Таблица 3.1 – Коэффициенты системы уравнений


№ a11 a12 a13 a21 a22 a23 a31 a32 a33 d1 d2 d3
1 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 5,6 1,32 3,91 5,4
2 1,2 0,3 –0,2 0,5 2,1 1,3 –0,9 0,7 5,6 1,32 3,91 5,4
3 –1,2 0,3 –0,2 0,5 2,1 1,3 –0,9 0,7 5,6 1,32 3,91 5,4
4 1,2 –0,3 0,2 0,5 2,1 1,3 –0,9 0,7 5,6 1,32 3,91 5,4
5 –1,2 –0,3 0,2 0,5 2,1 1,3 –0,9 0,7 5,6 1,32 3,91 5,4
6 –1,2 –0,3 –0,2 0,5 2,1 1,3 –0,9 0,7 5,6 1,32 3,91 5,4
7 –1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 5,6 1,32 3,91 5,4
8 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 5,6 1,60 3,91 5,4
9 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 5,6 1,60 4,90 5,4
10 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 5,6 1,81 4,53 5,4
11 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 5,6 1,81 4,53 5,8
12 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 5,6 2,83 4,53 5,8
13 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 5,6 3,83 4,53 5,8
14 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 5,6 3,32 4,53 5,8
15 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 5,6 0,32 0,53 5,8
16 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 –5,6 0,32 0,45 5,8
17 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 –5,6 –0,32 0,45 5,8
18 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 –5,6 –0,32 –0,45 5,8
19 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 –5,6 –0,32 –0,35 5,8
20 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 –5,6 –0,32 –0,25 –5,8
21 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 –5,6 –0,32 –0,18 5,0
22 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 –5,6 –0,32 –0,15 4,0
23 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 –5,6 –0,32 –0,1 2,0
24 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 –5,6 –0,10 –0,1 1,0
25 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 –5,6 0 –0,1 0,5
26 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 –5,6 0 –0,01 0
27 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 –5,6 –0,32 –0,18 5,0
28 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 5,6 1,81 4,53 5,8
29 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 5,6 2,83 4,53 5,8
30 1,2 0,3 0,2 0,5 2,1 1,3 –0,9 0,7 5,6 3,83 4,53 5,8
62
Лабораторная работа 4

ПОСТРОЕНИЕ ТАБЛИЦ ЗНАЧЕНИЙ И ГРАФИКОВ ФУНКЦИЙ


В ПАКЕТЕ MATLAB

Цель лабораторной работы: получение и закрепление знаний,


формирование практических навыков работы с пакетом MATLAB при
построении таблиц значений и графиков функций.

4.1. Краткие сведения из теории

4.1.1. Построение таблиц значений функции одной переменной в


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

sin 2 x
y ( x)   e  x ln x
1  cos x

в точках 0,2; 0,3; 0,5; 0,8; 1,3; 1,7; 2,5.


Задача решается в два этапа.
1. Создается вектор-строка х, содержащая координаты заданных
точек.
2. Вычисляются значения функции y(х) от каждого элемента вектора
х и записываются полученные значения в вектор-строку у.
Значения функции необходимо найти для каждого из элементов
вектор-строки х, поэтому операции в выражении для функции должны
выполняться поэлементно.

63
» х = [0.2 0.3 0.5 0.8 1.3 1.7 2.5]
х =
0.2000 0.3000 0.5000 0.8000 1.3000 1.7000 2.5000
» у = sin(x).^2./(l+cos(x))+exp(-x).*log(x)
У =
-1.2978 -0.8473 -0.2980 0.2030 0.8040 1.2258
1.8764

Обратите внимание, что при попытке использования операций


возведения в степень ^, деления / и умножения * (которые не относятся к
поэлементным) выводится сообщение об ошибке уже при возведении sin(x)
в квадрат:

» у = sin(х)^2/(1+соз(х))+exp(-x)*log(x)
??? Error using ==> ^
Matrix must be square.

В MATLAB операции * и ^ применяются для перемножения матриц


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

» х
х =
0.2000 0.3000 0.5000 0.8000 1.3000 1.7000 2.5000
» у
у =
-1.2978 -0.8473 -0.2980 0.2030 0.8040 1.2258
1.8764

64
Часто требуется вывести значение функции в точках отрезка,
отстоящих друг от друга на равное расстояние (шаг). Предположим, что
необходимо вывести таблицу значений функции y(х) на отрезке [1, 2] с
шагом 0.2. Можно, конечно, ввести вектор-строку значений аргумента
х = [1, 1.2, 1.4, 1.6, 1.8, 2.0] из командной строки и вычислить все значения
функции так, как описано выше. Однако если шаг будет не 0.2 а, например
0.01, то предстоит большая работа по вводу вектора х.
В MATLAB предусмотрено простое создание векторов, каждый
элемент которых отличается от предшествующего на постоянную
величину, т.е. на шаг. Для ввода таких векторов служит двоеточие (не
путайте с индексацией при помощи двоеточия). Следующие два оператора
приводят к формированию одинаковых вектор-строк. Условно можно
записать

» х = [1, 1.2, 1.4, 1.6, 1.8, 2.0]


х =
1.0000 1.2000 1.4000 1.6000 1.8000 2.0000
» х = [1:0.2:2]
х =
1.0000 1.2000 1.4000 1.6000 1.8000 2.0000

где х = [начальное значение : шаг : конечное значение].


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

» х = [1:0.2:1.9]
х =
1.0000 1.2000 1.4000 1.6000 1.8000

65
Вектор-строка заполнится до элемента, не превосходящего
определенное нами конечное значение. Шаг может быть и отрицательным:

» х = [1.9:-0.2:1]
х =
1.9000 1.7000 1.5000 1.3000 1.1000

В случае отрицательного шага для получения непустой вектор-


строки начальное значение должно быть больше конечного.
Для заполнения вектор-столбца элементами, начинающимися с нуля
и заканчивающимися 0.5 с шагом 0.1, следует заполнить вектор-строку, а
затем использовать операцию транспонирования:

» х = [0:0.1:0.5]'
х =
0
0.1000
0.2000
0.3000
0.4000
0.5000

Обратите внимание, что элементы вектора, заполняемого при


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

» х = [1:5]

66
х =
1 2 3 4 5

Пусть требуется вывести таблицу значений функции

y( x)  e  x sin(10 x)

на отрезке [0, 1] с шагом 0,05.


Для выполнения этого задания необходимо произвести следующие
действия:
1. Сформировать вектор-строку х при помощи двоеточия.
2. Вычислить значения у(х) от элементов х.
3. Записать результат в вектор-строку y.
4. Вывести х и у.

» х = [0:0.05:1];
» у = ехр(-х).*sin(10*x);
» х
х =
Columns 1 through 7
0 0.0500 0.1000 0.1500 0.2000 0.2500 0.3000
Columns 8 through 14
0.3500 0.4000 0.4500 0.5000 0.5500 0.6000 0.6500
Columns 15 through 21
0.7000 0.7500 0.8000 0.8500 0.9000 0.9500 1.0000
» у
У = Columns 1 through 7
0 0.4560 0.7614 0.8586 0.7445 0.4661 0.1045
Columns 8 through 14

67
-0.2472 -0.5073 -0.6233 -0.5816 -0.4071 -0.1533
0.1123
Columns 15 through 21
0.3262 0.4431 0.4445 0.3413 0.1676 -0.0291 -
0.2001

Вектор-строки x и y состоят из двадцати одного элемента и не


помещаются на экране в одну строку, поэтому выводятся по частям.
Поскольку х и y хранятся в двухмерных массивах размерностью один на
двадцать один, то выводятся по столбцам, каждый из которых состоит из
одного элемента. Сначала выводятся столбцы с первого по седьмой
(columns 1 through 7), затем  с восьмого по четырнадцатый (columns 8
through 14) и, наконец,  с пятнадцатого по двадцать первый (columns 15
through 21). Более наглядным и удобным является графическое
представление функции.

4.1.2. Построение графиков функции одной переменной


Графики функций в линейном масштабе
MATLAB обладает хорошо развитыми графическими
возможностями для визуализации данных. Рассмотрим вначале построение
простейшего графика функции одной переменной на примере функции

y( x)  e  x sin(10 x) ,

определенной на отрезке [0, 1]. Вывод функции в виде графика состоит из


следующих этапов:
1. Задание вектора значений аргумента х.
2. Вычисление вектора у значений функции y(х).
3. Вызов команды plot для построения графика.

68
Команды для задания вектора х и вычисления функции лучше
завершать точкой с запятой для подавления вывода в командное окно их
значений (после команды plot точку с запятой ставить необязательно, т. к.
она ничего не выводит в командное окно)

» х = [0:0.05:1];
» у = ехр(-х).*sin(10*x);
» plot(x, у)

После выполнения команд на экране появляется окно Figure No. 1 с


графиком функции. Окно содержит меню, панель инструментов и область
графика. В дальнейшем будут описаны команды, специально
предназначенные для оформления графика. Сейчас нас интересует сам
принцип построения графиков и некоторые простейшие возможности
визуализации функций.
Для построения графика функции в рабочей среде MATLAB должны
быть определены два вектора одинаковой размерности, например х и у.
Соответствующий массив х содержит значения аргументов, а у – значения
функции от этих аргументов. Команда plot соединяет точки с
координатами (x(i), y(i)) прямыми линиями, автоматически масштабируя
оси для оптимального расположения графика в окне. При построении
графиков удобно расположить на экране основное окно MATLAB и окно с
графиком рядом так, чтобы они не перекрывались.
Построенный график функции имеет изломы. Для более точного
построения графика функцию необходимо вычислить y(х) в большем числе
точек на отрезке [0, 1], т.е. задать меньший шаг при вводе вектора х:

» х = [0:0.01:1];
» у = ехр(-х).*sin(10*x);
» plot(x, у)

69
В результате получается график функции в виде более плавной
кривой.
Сравнение нескольких функций удобно производить, отобразив их
графики на одних осях. Например, построим на отрезке [1, 0.3] графики
 1   1,2 
функций f ( x)  sin  2  , f ( x)  sin  2  при помощи следующей
x  x 
последовательности команд:

» х = [1:0.005:0.3];
» f = sin(x.^-2);
» g = sin(1.2*x.^-2);
» plot(x, f, x, g)

Функции необязательно должны быть определены на одном и том же


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

» х1 = [1:0.005:0.3];
» f = sin(x1.^-2);
» х2 = [1:0.005:0.3];
» g = sin(1.2*x2.^-2);
» plot(x1, f, x2, g)

Аналогичным образом при помощи задания в plot через запятую пар


аргументов (вектор абсцисс, вектор ординат), осуществляется построение
графиков произвольного числа функций.

70
Замечание 1
Использование plot с одним аргументом  вектором  приводит к
построению "графика вектора", т.е. зависимости значений элементов
вектора от их номеров. Аргументом plot может быть и матрица, в этом
случае на одни координатные оси выводятся графики столбцов.
Иногда требуется сравнить поведение двух функций, значения
которых сильно отличаются друг от друга. График функции с небольшими
значениями практически сливается с осью абсцисс, и установить его вид не
удается. В этой ситуации помогает функция plotyy, которая выводит
графики в окно с двумя вертикальными осями, имеющими подходящий
масштаб.
Сравните, например, две функции: f ( x)  x 3 и

F ( x)  1000  ( x  0,5) 4 .

» х = [0.5:0.01:3];
» f = х.^-3;
» F = 1000*(х+0.5).^-4;
» plotyy(x, f, x, F)

При выполнении этого примера обратите внимание, что цвет


графика совпадает с цветом соответствующей ему оси ординат.
Функция plot использует линейный масштаб по обеим координатным
осям. Однако MATLAB предоставляет пользователю возможность строить
графики функций одной переменной в логарифмическом или
полулогарифмическом масштабе.
Графики функций в логарифмических масштабах
Для построения графиков в логарифмическом и
полулогарифмическом масштабах служат следующие функции:
 loglog (логарифмический масштаб по обеим осям);

71
 semilogx (логарифмический масштаб только по оси абсцисс);
 semilogy (логарифмический масштаб только по оси ординат).
Аргументы loglog, semilogx и semilogy задаются в виде пары векторов
значений абсцисс и ординат так же, как для функции plot, описанной в
предыдущем пункте. Построим, например, графики функций
f ( x  ln( 0,5x) и g ( x)  sin(ln( x)) на отрезке [0,1, 5] в логарифмическом
масштабе по оси х:

» х = [0.1:0.01:10];
» f = log(0.5*x);
» g = sin(log(x));
» semilogx(x, f, x ,g)

Задание свойств линий на графиках функций


Построенные графики функций должны быть максимально
удобными для восприятия. Часто требуется нанести маркеры, изменить
цвет линий, а при подготовке к монохромной печати – задать тип линии
(сплошная, пунктирная, штрих-пунктирная и т.д.). MATLAB
предоставляет возможность управлять видом графиков, построенных при
помощи plot, loglog, semilogx и semilogy, для чего служит дополнительный
аргумент, помещаемый за каждой парой векторов. Этот аргумент
заключается в апострофы и состоит из трех символов, которые
определяют: цвет, тип маркера и тип линии. Используется одна, две или
три позиции, в зависимости от требуемых изменений. В таблице 4.1
приведены возможные значения данного аргумента с указанием
результата.
Если, например, необходимо построить первый график красными
точечными маркерами без линии, а вторй график  черной пунктирной
линией, то следует использовать команду plot(x, f, 'r.', х, g, 'k:').

72
Таблица 4.1 – Возможные значения аргумента
Цвет Тип маркера Тип линии
y желтый . точка - сплошная
m розовый  кружок : пунктирная
c голубой х крестик -. штрих-пунктирная
r красный + знак "плюс" -- штриховая
g зеленый * звездочка
b синий s квадрат
w белый d ромб
Треугольник вершиной
k черный v
вниз
Треугольник вершиной
^
вверх
Треугольник вершиной
<
влево
треугольник вершиной
>
вправо
p пятиконечная звезда
h шестиконечная звезда

Оформление графиков функций


Удобство использования графиков во многом зависит от
дополнительных элементов оформления: координатной сетки, подписей к
осям, заголовка и легенды. Сетка наносится командой grid on, подписи к
осям размещаются при помощи xlabel, ylabel, заголовок дается командой
title. Наличие нескольких графиков на одних осях требует помещения
легенды командой legend с информацией о линиях. Все перечисленные
команды применимы к графикам как в линейном, так и в логарифмическом
и полулогарифмическом масштабах. Следующие команды выводят
графики изменения суточной температуры, которые снабжены всей
необходимой информацией

» time = [0 4 7 9 10 11 12 13 13.5 14 14.5 15 16 17


18 20 22];
» temp1 = [14 15 14 16 18 17 20 22 24 28 25 20 16 13
13 14 13];
73
» temp2 = [12 13 13 14 16 18 20 20 23 25 25 20 16 12
12 11 10];
» plot(time, temp1, 'ro-', time, temp2, 'go-')
» grid on
» title('Суточные температуры')
» xlabel('Время (час.)')
» ylabel('Температура (С)')
» legend('10 мая1, 11 мая')

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


аргументов команды legend должны соответствовать линиям на графике.
Последним дополнительным аргументом может быть положение легенды в
графическом окне:
 1  вне графика в правом верхнем углу графического окна;
 0  выбирается лучшее положение в пределах графика так, чтобы
как можно меньше перекрывать сами графики;
 1  в верхнем правом углу графика (это положение используется
по умолчанию);
 2  в верхнем левом углу графика;
 3  в нижнем левом углу графика;
 4  в нижнем правом углу графика.
В заголовке графика, легенде и подписях осей допускается
добавление формул и изменение стилей шрифта при помощи формата ТеХ.
MATLAB выводит графики разным цветом. Монохромный принтер
напечатает графики различными оттенками серого цвета, что не всегда
удобно. Команда plot позволяет легко задать стиль и цвет линий,
например,

» plot(x,f,'k-',x,g,'k:')

74
осуществляет построение первого графика сплошной черной линией, а
второго  черной пунктирной. Аргументы 'k-' и 'k:' задают стиль и цвет
первой и второй линий. Здесь k означает черный цвет, а дефис или
двоеточие  сплошную или пунктирную линию. Окно с графиком можно
закрыть, нажав на кнопку с крестиком в правом верхнем углу.

4.1.3. Построение графиков функций двух переменных


Построение графика функции двух переменных в MATLAB на
прямоугольной области определения переменных включает два
предварительных этапа:
1. Разбиение области определения прямоугольной сеткой.
2. Вычисление значений функции в точках пересечения линий сетки
и запись их в матрицу.
Построим график функции z(x, у) = х2 + у2 на области определения в
виде квадрата х  [0, l], y  [0, l]. Необходимо разбить квадрат
равномерной сеткой (например, с шагом 0.2) и вычислить значения
функций в узлах, обозначенных точками.
Удобно использовать два двухмерных массива х и у, размерностью
шесть на шесть, для хранения информации о координатах узлов. Массив х
состоит из одинаковых строк, в которых записаны координаты xl, х2, ..., х6,
а массив у содержит одинаковые столбцы с yl, у2, ..., у6. Значения функции
в узлах сетки запишем в массив z такой же размерности (6  6), причем для
вычисления матрицы Z используем выражение для функции, но с
поэлементными матричными операциями. Тогда, например, z(3,4) как раз
будет равно значению функции z(x, y) в точке (х3, у4). Для генерации
массивов сетки х и у по координатам узлов в MATLAB предусмотрена
функция meshgrid, для построения графика в виде каркасной
поверхности  функция mesh. Следующие операторы приводят к
появлению на экране окна с графиком функции (точка с запятой в конце
операторов не ставится, чтобы проконтролировать генерацию массивов):
75
» [X, У] = meshgrid(0:0.2:1,0:0.2:1)
X =
0 0.2000 0.4000 0.6000 0.8000 1.0000
0 0.2000 0.4000 0.6000 0.8000 1.0000
0 0.2000 0.4000 0.6000 0.8000 1.0000
0 0.2000 0.4000 0.6000 0.8000 1.0000
0 0.2000 0.4000 0.6000 0.8000 1.0000
0 0.2000 0.4000 0.6000 0.8000 1.0000

y =
0 0 0 0 0 0
0.2000 0.2000 0.2000 0.2000 0.2000 0.2000
0.4000 0.4000 0.4000 0.4000 0.4000 0.4000
0.6000 0.6000 0.6000 0.6000 0.6000 0.6000
0.8000 0.8000 0.8000 0.8000 0.8000 0.8000
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000

» Z = X.^2+Y.^2
Z =
0 0.0400 0.1600 0.3600 0.6400 1.0000
0.0400 0.0800 0.2000 0.4000 0.6800 1.0400
0.1600 0.2000 0.3200 0.5200 0.8000 1.1600
0.3600 0.4000 0.5200 0.7200 1.0000 1.3600
0.6400 0.6800 0.8000 1.0000 1.2800 1.6400
1.0000 1.0400 1.1600 1.3600 1.6400 2.0000
» mesh(X,Y,Z)

MATLAB позволяет наносить на график дополнительную


информацию, в частности, соответствие цветов значениям функции. Сетка
генерируется при помощи команды meshgrid, вызываемой с двумя

76
аргументами. Аргументами являются векторы, элементы которых
соответствуют сетке на прямоугольной области построения функции.
Можно использовать один аргумент, если область построения функции 
квадрат. Для вычисления функции следует использовать поэлементные
операции.
Рассмотрим основные возможности, предоставляемые MATLAB для
визуализации функций двух переменных, на примере построения графика
функции

z ( x , y)  4sin( 2x)  cos(1,5y)  (1  x 2 )  y  (1  y)

на прямоугольной области определения х  [l, l], y  [0, l].


Подготовим матрицы с координатами узлов сетки и значениями
функции:

» [X, Y] = meshgrid(-l:0.05:l, 0:0.05:1);


» Z=4*sin(2*pi*X).*cos(1.5*pi*Y).*(1-Х.^2).*Y.*(1-Y);

Для построения каркасной поверхности используется функция mesh,


вызываемая с тремя аргументами:

» mesh(X,Y,Z)

Цвет линий поверхности соответствует значениям функции.


MATLAB рисует только видимую часть поверхности.
При помощи команды hidden off можно сделать каркасную
поверхность "прозрачной", добавив скрытую часть. Команда hidden on
убирает невидимую часть поверхности, возвращая графику прежний вид.
Функция surf строит каркасную поверхность графика функции и заливает
каждую клетку поверхности определенным цветом, зависящим от
77
значений функции в точках, соответствующих углам клетки. В пределах
каждой клетки цвет постоянный. Посмотрите результаты выполнения
команды

» surf(X,Y,Z)

Команда shading flat позволяет убирать каркасные линии. Для


получения поверхности, плавно залитой цветом, зависящим от значений
функции, предназначена команда shading interp.
При помощи shading faceted можно вернуться к поверхности с
каркасными линиями.
Трехмерные графики, получаемые с помощью описанных выше
команд, удобны для получения представления о форме поверхности,
однако по ним трудно судить о значениях функции. В MATLAB
определена команда colorbar, которая выводит рядом с графиком столбец,
устанавливающий соответствие между цветом и значением функции.
Постройте при помощи surf график поверхности и дополните его
информацией о цвете

» surf(X,Y,Z)
» colorbar

Команду colorbar можно применять в сочетании со всеми


функциями, строящими трехмерные объекты.
Пользуясь цветной поверхностью, трудно сделать вывод о значении
функции в той или иной точке плоскости xy. Команды meshc или surfc
позволяют получить более точное представление о поведении функции.
Эти команды строят каркасную поверхность или залитую цветом
каркасную поверхность и размещают на плоскости xy линии уровня
функции (линии постоянства значений функции):

78
» surfc(X,Y,Z)
» colorbar

MATLAB позволяет построить поверхность, состоящую из линий


уровня, при помощи функции contour3. Эту функцию можно использовать
так же, как и описанные выше mesh, surf, meshc и surfc с тремя
аргументами. При этом число линий уровня выбирается автоматически.
Имеется возможность задать четвертым аргументом в contour3 либо число
линий уровня, либо вектор, элементы которого равны значениям функции,
отображаемым в виде линий уровня. Задание вектора (четвертого
аргумента levels) удобно, когда требуется исследовать поведение функции
в некоторой области ее значений (срез функции). Постройте, например,
поверхность, состоящую из линий уровня, соответствующих значениям
функции от 0 до 0,5 с шагом 0,01:

» levels = [0:0.01:0.5];
» contour3(X, Y, Z, levels)
» colorbar

4.1.4. Построение контурных графиков функций двух переменных


MATLAB предоставляет возможность получать различные типы
контурных графиков при помощи функций contour и contourf. Рассмотрим
их возможности на примере функции

z ( x , y)  4sin( 2x)  cos(1,5y)  (1  x 2 )  y  (1  y) .

Использование contour с тремя аргументами contour(X,Y,Z)


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

79
из линий уровня. Использование команды colorbar также не позволит
точно определить значения функции. Каждой линии уровня можно
присвоить значение, которое принимает на ней исследуемая функция, при
помощи определенной в MATLAB функции clabel. Функция clabel
вызывается с двумя аргументами: матрицей, содержащей информацию о
линиях уровня и указателем на график, на котором следует нанести
разметку. Пользователю не нужно самому создавать аргументы clabel.
Функция contour, вызванная с двумя выходными параметрами, не только
строит линии уровня, но и находит требуемые для clabel параметры.
Используйте contour с выходными аргументами CMatr и h (в массиве
CMatr содержится информация о линиях уровня, а в массиве h 
указатели). Завершите вызов contour точкой с запятой для подавления
вывода на экран значений выходных параметров и нанесите на график
сетку:

» [CMatr, h] = contour(X, Y, Z);


» clabel(CMatr, h)
» grid on

Дополнительным аргументом функции contour (так же, как и


contour3, описанной выше) может быть или число линий уровня, или
вектор, содержащий значения функции, для которых требуется построить
линии уровня.
Наглядную информацию об изменении функции дает заливка
прямоугольника на плоскости xy цветом, зависящим от значения функции
в точках плоскости. Для построения таких графиков предназначена
функция contourf, использование которой не отличается от применения
contour. В следующем примере выводится график, который состоит из
двадцати линий уровня, а промежутки между ними заполнены цветами,
соответствующими значениям исследуемой функции:

80
» contourf(X, Y, Z, 20)
» colorbar

4.1.5. Оформление графиков функций


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

» surfc(X, Y, Z)
» colorbar
» colormap(gray)
» title('График функции z(x,y)')
» xlabel('x')
» ylabel('у')
» zlabel('z')

Обратите внимание, что команда colormap(gray) изменяет палитру


графического окна, т.е. следующие графики будут выводиться в этом окне
также в серых тонах. Для восстановления первоначального значения
палитры следует применить команду colormap('default'). Цветовые
палитры, доступные в MATLAB, приведены в табл. 4.2.

4.1.6. Вывод нескольких графиков на одни оси


Для отображения нескольких графиков функций одной переменной
на одних осях использовались возможности функций plot, plotyy, semilogx,
semilogy, loglog. Они позволяют выводить графики нескольких функций,
задавая соответствующие векторные аргументы парами, например

81
plot(x, f, x, g). Однако для объединения трехмерных графиков их
использовать нельзя.

Таблица 4.2 – Цветовые палитры


Палитра Изменение цвета
autumn Плавное изменение красный  оранжевый  желтый
bone Похожа на палитру gray, но с легким оттенком синего цвета
colorcube Каждый цвет изменяется от темного к яркому
cool Оттенки голубого и пурпурного цветов
copper Оттенки медного цвета
flag Циклическое изменение красный  белый  синий  черный
gray Оттенки серого
hot Плавное изменение черный  красный  оранжевый 
желтый  белый
hsv Плавное изменение как цветов радуги
jet Плавное изменение синий  голубой  красный  зеленый 
желтый  красный
pink Похожа на палитру gray, но с легким оттенком коричневого
цвета
prism Циклическое изменение красный  оранжевый  желтый 
зеленый  синий  фиолетовый
spring Оттенки пурпурного и желтого
summer Оттенки зеленого и желтого
vga Палитра Windows из шестнадцати цветов
white Один белый цвет
winter Оттенок синего и зеленого

Для объединения таких графиков предназначена команда hold on, которую


нужно задать перед построением графика. В следующем примере
объединение двух графиков (плоскости и конуса) приводит к их
пересечению. Конус задается параметрически следующими
зависимостями:

x(u ,v)  0,3  u  cos v ; y(u ,v)  0,3  u  sin v ; z (u ,v)  0,6  u ; u ,v [2, 2] .

82
Для графического отображения конуса сначала необходимо
сгенерировать с помощью двоеточия вектор-столбец и вектор-строку,
содержащие значения параметров на заданном интервале (важно, что u 
вектор-столбец, а v  вектор-строка):

» u = [-2*pi:0.1*pi:2*pi]';
» v = [-2*pi:0.1*pi:2*pi];

Далее формируются матрицы X, Y, содержащие значения функций


x(u ,v) и y(u ,v) в точках, соответствующих значениям параметров.
Формирование матриц выполняется с помощью внешнего произведения
векторов.
Замечание 2
Внешним произведением векторов a  (a1 ,...,a j ,...,a N ) ,

b  (b1 ,...,bk ,...,bM ) называется матрица C  (c jk ), j  1, N , k  1, M размера

N  M, элементы которой вычисляются по формуле c jk  a jbk .

Вектор а является вектор-столбцом и в MATLAB представляется в


виде двухмерного массива размера N на один. Вектор-столбец b при
транспонировании переходит в вектор-строку размера один на М. Вектор-
столбец и вектор-строка есть матрицы, у которых один из размеров равен
единице. Фактически, С = abT, где умножение происходит по правилу
матричного произведения. Для вычисления матричного произведения в
MATLAB используется оператор "звездочка". Определим внешнее
произведение для двух векторов:

» a = [1;2;3];
» b = [5;6;7];
» C = a*b'

83
C =
5 6 7
10 12 14
15 18 21

Сформируем матрицы X, Y, необходимые для графического


отображения конуса:

» X = 0.3*u*cos(v);
» Y = 0.3*u*sin(v);

Матрица Z должна быть того же размера, что и матрицы X и Y. Кроме


того, она должна содержать значения, соответствующие значениям
параметров. Если бы в функцию z (u ,v) входило произведение и и v, то
матрицу Z можно было заполнить аналогично матрицам X и Y при помощи
внешнего произведения. С другой стороны, функцию z(u,v) можно
представить в виде z (u ,v)  0,6  u  g (v) , где g (v)  1 . Поэтому для
вычисления Z можно применить внешнее произведение векторов u и g (v) ,
где вектор-строка g (v) имеет ту же размерность, что v, но состоит из
единиц:

» Z = 0.6*u*ones(size(v));

Все требуемые матрицы для отображения конуса созданы. Задание


плоскости выполняется следующим образом:

» [X,Y] = meshgrid(-2:0.1:2);
» Z = 0.5*X+0.4*Y;

84
Теперь не сложно записать и полную последовательность команд для
построения пересекающихся конуса и плоскости:

» u = [-2*pi:0.1*pi:2*pi]';
» v = [-2*pi:0.1*pi:2*pi];
» X = 0.3*u*cos(v);
» Y = 0.3*u*sin(v);
» Z = 0.6*u*ones(size(v));
» surf(X, Y, Z)
» [X,Y] = meshgrid(-2:0.1:2);
» Z = 0.5*X+0.4*Y;
» hold on
» mesh(X, Y, Z)
» hidden off

В результате работы программы получим геометрическую фигуру,


приведенную на рис. 4.1.
Команда hidden off применена для того, чтобы показать часть конуса,
находящуюся под плоскостью.
Обратите внимание, что команда hold on распространяется на все
последующие выводы графиков в текущее окно. Для размещения графиков
в новых окнах следует выполнить команду hold off. Команда hold on может
применяться и для расположения нескольких графиков функций одной
переменной, например,

» plot(x,f,х,g)

эквивалентно последовательности

» plot(х,f)

85
» hold on
» plot(x,g)

Рис. 4.1. Результат работы программы

4.2. Индивидуальные задания

1. В соответствии с номером N по списку в журнале группы,


записанном в виде N = СМ, где С  старшая цифра, М  младшая цифра, в
целочисленном интервале [N, N+5] рассчитайте таблицу значений для
выражения, заданного с помощью табл. 4.3 и табл. 4.4.
2. Выполните задание 1, используя отрицательный шаг 1.
3. Отобразите в линейном масштабе на одних осях два графика
функции f (x) из задания один с шагами 1.0 и 0.05 в интервале [N, N+5].

86
С помощью функции plotyy постройте с шагом 0.1 в интервале
[N, N+5] графики функций f (x) и 102  f ( x)  sin( x) .
4. Выполните задание 3, используя:
 логарифмический масштаб по обеим осям;
 логарифмический масштаб по оси абсцисс;
 логарифмический масштаб по оси ординат.
При выполнении этого пункта используйте шесть типов маркеров,
шесть различных цветов линий и разные типы линий.
5. Сформируйте матрицу и вектор размерами соответственно не
менее 56 и 17, первыми элементами которых является Ваш номер по
списку в журнале группы. Постройте графики вектора и матрицы.
6. Приведите график функции z(x, у) = х2 + у2 на области определения
в виде квадрата х  [0, l], y  [0, l] с шагом 0.2 и график функции с
меньшим шагом сетки.
7. Постройте прозрачную и непрозрачную каркасную поверхность
для функции z ( x, y)  4sin( 2x)  cos(1,5y)  (1  x 2 )  y  (1  y) на
прямоугольной области определения х  [l, l], y  [0, l].
Измените функцию z ( x , y) каким-либо образом, но таким, чтобы в
выражении функции фигурировал Ваш номер по списку в журнале группы.
Приведите в отчете прозрачную и непрозрачную каркасную поверхность
для вашей функции.
8. Постройте каркасную поверхность функции z ( x , y) с помощью
команд surf(X,Y,Z), shading flat, shading interp и приведите их в отчете.
9. Постройте каркасную поверхность функции z ( x , y) с помощью
команд surf(X,Y,Z) и colorbar. Результаты приведите в отчете.
10. Постройте каркасную поверхность функции z ( x , y) с помощью
команд surfс, meshc и colorbar. Результаты приведите в отчете.

87
11. Постройте поверхности функции z ( x , y) , состоящие из линий
уровня, с помощью функции contour3 с тремя и четырьмя аргументами.
Результаты приведите в отчете.
12. Постройте контурные графики функции z ( x , y) с помощью
функций contour, contourf, clabel. Результаты приведите в отчете.
13. Выполните три различных цветовых оформления графика
функции z ( x , y) . Результаты приведите в отчете.
14. Выполните построение пересекающихся конуса и плоскости.
15. Выполните пересечение конуса двумя различными плоскостями.
16. Оформить отчет по лабораторной работе.

Таблица 4.3 – Индивидуальное задание по младшей цифре М


Младшая
0 или 5 1 или 6 2 или 7 3 или 8 4 или 9
цифра М
A2 / 3  C 3 ABC A B C2/ 5  D AC  3 D
Выражение 1
( B  D) 2 A2  D D1 / 3 / C 2 B3 
5
A2 C 2 / 3  B2

Таблица 4.4 – Индивидуальное задание по старшей цифре С


Старшая
A B C D
цифра С
0 (sin( N )cos(N ))2 (ln( N  2)) / N (exp( N / N 2 ))2 A B
1 1  (cos(N  1))2 (ln( N 2 ))2 exp(N )  1 AC
2 (tg( N ))2  N 1 (log( N ))2 1  N / exp( N ) B/C
3 sin( N ) / (ctg(N ))4 log( N 3  N 3 ) N / exp( N ) C /( A  B)

88
Лабораторная работа 5

ИССЛЕДОВАНИЕ СПОСОБОВ ФОРМИРОВАНИЯ НЕЧЕТКИХ


МНОЖЕСТВ И ОПЕРАЦИЙ НАД НИМИ

Цель лабораторной работы: получение и закрепление знаний,


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

5.1. Краткие сведения из теории

5.1.1. Функции принадлежности


Треугольная функция принадлежности
Инструментарий нечеткой логики (ИНЛ) в составе пакета MATLAB
содержит 11 встроенных типов функций принадлежности (ФП),
формируемых на основе кусочно-линейных функций, распределения
Гаусса, сигмоидной кривой, квадратических и кубических
полиномиальных кривых. К наиболее простым ФП можно отнести
треугольную и трапециевидную. Наименование треугольной ФП – trimf
(triangle membership function). В параметрическом виде она представляет
собой не что иное, как набор трех точек, образующих треугольник.
Описание функции:

у = trimf (x, [a, b, с]),

где вектор х – базовое множество, на котором определяется ФП. Величины


а и с задают основание треугольника, b – его вершину.

89
В аналитическом виде треугольная ФП может быть задана
следующим образом (рис. 5.1, а):

0, x  a,
x  a
, a  x  b,
 b  a
f ( x, a, b, c)  
cx
 , b  x  c,
c  b
0, x  c.

а б
Рис. 5.1. Треугольная (а) и трапециевидная (б) функции принадлежности

Далее рассмотрим примеры использования различных ФП в системе.


Примеры представляют собой фрагменты программ и комментариев
на языке пакета MATLAB.
Пример 5.1. Программа использования ФП trimf.

» х = 0 : 0,1 : 10;
» у = trimf (x, [3 6 8]);
» plot (х, у);
» xlabel ('trimf (x, P), P = [3 6 8]');

90
Трапециевидная функция принадлежности
Трапециевидная ФП – trapmf (trapezoid membership function) –
отличается от предыдущей функции лишь тем, что имеет верхнее
основание.
Описание функции:

у = trapmf (х, [a, b, с, d]),

где параметры а и d – нижнее основание трапеции; b и с – верхнее


основание трапеции (рис. 5.1, б).
Аналитическая запись трапециевидной функции имеет вид:

0, x  a,
x  a
 b  a , a  x  b,

f ( x, a, b, c, d )  1, b  x  c,
d  x
d  c , c  x  d,
0, x  d .

Простая и двухсторонняя функция принадлежности Гаусса


На основе функции распределения Гаусса можно построить ФП двух
видов: простую функцию принадлежности Гаусса и двухстороннюю,
образованную с помощью различных функций распределения Гаусса.
Первая из них обозначается gaussmf, а вторая – gauss2mf.
Описание функции:

у = gaussmf (x, [σ, с]).

Пример 5.2. Программа использования ФП gaussmf.

» X = -20 : 1 : 20;
91
» Y = gaussmf (х, [4 5]);
» plot (х, у);

Симметричная функция Гаусса зависит от двух параметров σ и с


(рис. 5.2, а):
( x c) 2
f ( x, , c)  e 2 2 .

а б
Рис. 5.2. Простая (а) и двухсторонняя (б) функции принадлежности Гаусса

Описание функции:

у = gauss2mf (x, [σ1, с1, σ2, c2]).

Последнее выражение является комбинацией двух различных


функций распределения Гаусса. Первая определяется параметрами σ1 и с1 и
задает форму левой стороны, а вторая (параметры σ2, c2) – правой стороны
ФП.
Если с1 < c2, то в этом случае функция gauss2mf достигает своего
максимального значения на уровне 1. Иначе – максимальное значение
функции меньше 1 (рис. 5.2, б).

92
Пример 5.3. Программа использования ФП gauss2mf.

» x= [-20 : 30]';
» y1 = gauss2mf (x, [4 3 6 7]);
» y2 = gauss2mf (x, [4 4 6 8]);
» y3 = gauss2mf (x, [4 5 6 9]);
» plot (x,[y1 y2 y3]);

Символ < ' > в строке определения базового множества х показывает


транспонированность базового множества.

Функция принадлежности "обобщенный колокол"


Следующей функцией, которая позволяет представлять нечеткие
субъективные предпочтения, является ФП "обобщенный колокол"
(рис. 5.3) и обозначается gbellmf (generalized bell shape membership
function).

I
Рис. 5.3. Функция принадлежности "обобщенный колокол"

93
Ее отличие от рассмотренных ранее ФП заключается в добавлении
третьего параметра, что позволяет осуществлять плавный переход между
нечеткими множествами.
Описание функции:

у = gbellmf (x, [а, b, с]).

Функция "обобщенный колокол" зависит от трех параметров и имеет


следующую аналитическую запись:

1
f ( x ,a ,b ,c)  2b
,
xc
1
a

где с – определяет расположение центра ФП; а и b – оказывают влияние на


форму кривой (рис. 5.3).
Пример 5.4. Программа использования gbellmf.

» x= [-20 : 20];

» y = gbellmf (x, [4 5 6]);

» plot (x,y);

Функции принадлежности на основе функции распределения Гаусса


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

94
Симметричные и закрытые функции синтезируют с использованием двух
дополнительных сигмоидов.

Сигмоидные функции принадлежности


Основная сигмоидная ФП обозначается sigmf, а дополнительные –
dsigmf и psigmf.
Описание основной сигмоидной функции:

у = sigmf (х, [a, с]).

В аналитической форме сигмоидная функция sigmf записывается


следующим образом:

1
f ( x , a , c)   a ( x c )
.
1 e

В зависимости от знака параметра a рассматриваемая ФП будет


открыта или справа, или слева (рис. 5.4, а), что позволит применять ее при
описании таких нечетких понятий, как "очень большой", "крайне
отрицательно" и др.
Описание дополнительной сигмоидной функции:

у = dsigmf (x, (a1, c1, а2, с2]) .

ФП dsigmf зависит от четырех параметров a1, c1, а2, с2 и определяется


как разность двух сигмоидных функций: f(х, a1, c1) – f(x, а2, с2) (рис. 5.4, б).
Описание дополнительной сигмоидной функции:

у = psigmf (x, [a1, c1, а2, с2]) .

95
ФП psigmf, так же как и предыдущая функция, зависит от четырех
параметров a1, c1, а2, с2 и определяется как произведение двух сигмоидных
функций f(х, a1, c1) · f(x, а2, с2) (рис. 5.4, в).

а б в
Рис. 5.4. Сигмоидные функции принадлежности

Пример 5.5. Программа использования сигмоидных функций.

» x= [0 : 10];
» subplot (1, 3, 1);
» y=sigmf (x,[4 5]);
» plot (x, y);
» subplot (1, 3, 2);
» y = dsigmf (x, [4 5 6 9]);
» plot (x, y);
» subplot (1, 3, 3);
» y = psigmf (x, [4 5 6 9]);
» plot (x, y);

96
Функции принадлежности на основе полиномиальных кривых
Инструментарий нечеткой логики (fuzzy logic toolbox) в составе
MATLAB предоставляет возможность формирования ФП на основе
полиномиальных кривых. Соответствующие функции называются
Z-функции (zmf), РI-функции (pimf) и S-функции (smf). Функция zmf
представляет собой асимметричную полиномиальную кривую, открытую
слева (рис. 5.5, а), функция smf – зеркальное отображение функции zmf
(рис. 5.5, в). Соответственно функция pimf равна нулю в правом и левом
пределах и принимает значение, равное единице, в середине некоторого
отрезка (рис. 5.5, б).

а б в
Рис. 5.5. Полиномиальные функции принадлежности

Описание функции:

у = zmf(x, [a, b]).

97
Параметры а и b определяют экстремальные значения кривой
(рис. 5.5, а).
Описание функции:

у = pimf (x, [a, b, с, d]).

Параметры а и d задают переход функции в нулевое значение, а


параметры b и с – в единичное (рис. 5.5, б).
Описание функции:

у = smf (х, [а, b]).

Параметры а и b определяют экстремальные значения кривой


(рис. 5.5, в).
Пример 5.6. Программа использования полиномиальных кривых.

» x= [3 : 10];
» subplot(1, 3, 1);
» y = zmf(x, [4 5]);
» plot (x, y);
» xlabel (' zmf, P = [4 5]');
» subplot (1, 3, 2);
» y = pimf(x, [4 5 6 9]);
» plot (x, y);
» xlabel ('pimf, P = [4 5 6 9]');
» subplot (1, 3, 3);
» y = smf (x, [6 9]);
» plot(x, y);
» xlabel ('smf, P=[6 9]')

98
Помимо рассмотренных выше функций, позволяющих представлять
нечеткие множества, в MATLAB имеется возможность формировать
собственные ФП или модифицировать встроенные.

5.1.2. Операции с нечеткими множествами


Выделяют три основные логические операции с нечеткими
множествами: конъюнкцию, дизъюнкцию и логическое отрицание. В среде
MATLAB существует возможность определять конъюнктивные и
дизъюнктивные операторы с точки зрения минимаксной и вероятностной
интерпретаций.
Рассмотрим минимаксную интерпретацию логических операторов, в
которой конъюнктивный оператор представляет нахождение минимума –
min (рис. 5.6, а), а дизъюнктивный – максимума – max (рис. 5.6, б).

а б
Рис. 5.6. Пересечение (а) и объединение (б) нечетких множеств
(минимаксная интерпретация)
99
Описание конъюнктивной функции: у = min ([у1; у2]).
Описание дизъюнктивной функции: у = mах ([у1; у2]).
Параметры у1 и у2 представляют собой исходные ФП. Функция min
работает со списком ФП. В MATLAB список оформляется квадратными
скобками, а элементы списка разделяются точкой с запятой.
Пример 5.7. Программа использования операций min и max.

» x = 3 : 0,1 : 10;
» subplot (1, 2, 1);
» y1 = gaussmf (x, [4 5]);
» у2 = gaussmf (x, [4 7]);
» у3 = min ([y1; y2]);
» plot (x, [y1; у2],':');
» hold on;
» plot (x, у3);
» hold off;
» subplot (1, 2, 2);
» у4 = max([y1; у2]);
» plot(x, [y1; у2], ':');
» hold on;
» plot (x, y4);
» hold off.

Пунктирной линией на графиках изображены исходные ФП, а


сплошной линией – результат действия логических операторов.
Минимаксная интерпретация является наиболее распространенной
при построении нечетких систем. Тем не менее, на практике довольно
часто используется альтернативная вероятностная интерпретация
конъюнктивных и дизъюнктивных операторов. MATLAB содержит
соответствующие функции.

100
В рамках данной интерпретации конъюнктивный оператор
представляет собой оператор вычисления алгебраического произведения –
prod (рис. 5.7, а), а дизъюнктивный оператор – оператор вычисления
алгебраической суммы – рrоbоr (рис. 5.7, б).

а б
Рис. 5.7. Пересечение (a) и объединение (б) нечетких множеств
(вероятностная интерпретация)

Описание функции: у = prod ([y1; у2])


Описание функции: у = probor([y1; у2]).
Параметры y1 и у2 представляют собой исходные ФП.
Пример 5.8. Программа использования вероятностных операторов
конъюнкции и дизъюнкции.

» х = 0 : 0,1 : 10;
» subplot (1, 2, 1);
» y1 = gaussmf (x, [4 5]);
» y2 = gaussmf (x, [4 7]);
» у3 = prod ([y1; y2]);
101
» plot (x, [y1; у2],':');
» hold on;
» plot(x, y3);
» hold off;
» subplot (1, 2, 2);
» y4 = probor ([y1; y2]);
» plot (x, [y1; y2], ':');
» hold on;
» plot(x, y4);
» hold off.

Дополнение нечеткого множества есть не что иное, как


математическое представление вербального выражения «НЕ А» (рис. 5.8),
где А – нечеткое множество, описывающее некоторое размытое суждение.

Рис. 5.8. Дополнение нечеткого множества

Описание функции дополнения: y = 1 – y*, где у* – исходная ФП.

102
Пример 5.9. Программа использования операции дополнения.

» x= [0 : 10];
» y1 = gaussmf (x, [3 5]);
» y= 1 - y1;
» plot (x, y1, ':');
» hold on;
» plot(x, y);
» hold off

5.2. Индивидуальные задания

1. Построить треугольную и трапециевидную функцию


принадлежности.
2. Построить простую и двухстороннюю функцию принадлежности
Гаусса, образованную с помощью различных функций распределения.
3. Построить функцию принадлежности "обобщенный колокол",
которая позволяет представлять нечеткие субъективные предпочтения.
4. Построить набор сигмоидных функций:
 Основную одностороннюю, которая открыта слева или справа;
 Дополнительную двухстороннюю;
 Дополнительную несимметричную.
5. Построить набор полиномиальных функций принадлежности (Z-,
PI- и S-функций).
6. Построить минимаксную интерпретацию логических операторов с
использованием операций поиска минимума и максимума.
7. Построить вероятностную интерпретацию конъюнктивных и
дизъюнктивных операторов.

103
8. Построить дополнение нечеткого множества, которое описывает
некоторое размытое суждение и представляет собой математическое
описание вербального выражения, отрицающего это нечеткое множество.
При выполнении пунктов 1 – 8 индивидуального задания, значения
переменных a, b, c, d и т.д. необходимо выбирать произвольным образом.
9. Оформите отчет по лабораторной работе.

104
Лабораторная работа 6

М-ФАЙЛЫ И ОСНОВЫ ПРОГРАММИРОВАНИЯ В MATLAB

Цель лабораторной работы: получение и закрепление знаний,


формирование практических навыков работы с пакетом MATLAB при
использовании М-файлов и выполнении программ с нелинейной
структурой.

6.1. Краткие сведения из теории

6.1.1. Работа в редакторе М-файлов


Работа из командной строки MATLAB затруднена, если требуется
вводить много команд и часто их изменять. Ведение дневника при помощи
команды diary и сохранение рабочей среды лишь незначительно облегчает
работу. Самым удобным способом выполнения команд MATLAB является
использование М-файлов, в которых можно набирать команды, выполнять
их все сразу или частями, сохранять в файле и использовать в дальнейшем.
Для работы с М-файлами предназначен редактор М-файлов. При помощи
этого редактора можно создавать собственные функции и вызывать их, в
том числе и из командной строки.
Раскройте меню File основного окна MATLAB и в пункте New
выберите подпункт M-file. Новый файл открывается в окне редактора
М-файлов.
Наберите в редакторе команды, приводящие к построению двух
графиков в одном графическом окне:

» x = [0:0.1:7];
» f = exp(-x);
» subplot(1, 2, 1)

105
» plot(x, f)
» g = sin(x);
» subplot(1, 2, 2)
» plot(x, g)

Сохраните теперь файл с именем mydemo.m в подкаталоге work


основного каталога MATLAB, выбрав пункт Save as меню File редактора.
Для запуска на выполнение всех команд, содержащихся в файле, следует
выбрать пункт Run в меню Debug. На экране появится графическое окно
Figure No.1, содержащее графики функций. Если Вы решили построить
график косинуса вместо синуса, то просто измените строку g = sin(x) в
М-файле на g = cos(x) и запустите все команды снова.
Замечание 1
Если при наборе сделана ошибка и MATLAB не может распознать
команду, то происходит выполнение команд до неправильно введенной,
после чего выводится сообщение об ошибке в командное окно.
Очень удобной возможностью, предоставляемой редактором
М-файлов, является выполнение части команд. Закройте графическое окно
Figure No.1. Выделите при помощи мыши, удерживая левую кнопку, или
клавишами со стрелками при нажатой клавише <Shift>, первые четыре
команды программы и выполните их из пункта Evaluate Selection меню
Text. Обратите внимание, что в графическое окно вывелся только один
график, соответствующий выполненным командам. Запомните, что для
выполнения части команд их следует выделить и нажать <F9>. Выполните
оставшиеся три команды программы и проследите за состоянием
графического окна. Потренируйтесь самостоятельно, наберите какие-либо
примеры из предыдущих лабораторных работ в редакторе М-файлов и
запустите их.
Отдельные блоки М-файла можно снабжать комментариями,
которые пропускаются при выполнении, но удобны при работе с

106
М-файлом. Комментарии в MATLAB начинаются со знака процента и
автоматически выделяются зеленым цветом, например:

%построение графика sin(x) в отдельном окне

В редакторе М-файлов может быть одновременно открыто несколько


файлов. Переход между файлами осуществляется при помощи закладок с
именами файлов, расположенных внизу окна редактора.
Открытие существующего М-файла производится при помощи
пункта Open меню File рабочей среды, либо редактора М-файлов. Открыть
файл в редакторе можно и командой MATLAB edit из командной строки,
указав в качестве аргумента имя файла, например:

» edit mydemo

Команда edit без аргумента приводит к созданию нового файла.


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

6.1.2. Типы М-файлов


М-файлы в MATLAB бывают двух типов: файл-программы (Script
M-Files), содержащие последовательность команд, и файл-функции
(Function M-Files), в которых описываются функции, определяемые
пользователем.
Файл-программу (файл-процедуру) Вы создали при прочтении
предыдущего подраздела. Все переменные, объявленные в файл-
программе, становятся доступными в рабочей среде после ее выполнения.

107
Выполните в редакторе М-файлов файл-программу, приведенную в
подразделе 6.1.1, и наберите команду whos в командной строке для
просмотра содержимого рабочей среды. В командном окне появится
описание переменных:

» whos
Name Size Bytes Class
f 1x71 568 double array
g 1x71 568 double array
x 1x71 568 double array
Grand total is 213 elements using 1704 bytes

Переменные, определенные в одной файле-программе, можно


использовать в других файл-программах и в командах, выполняемых из
командной строки. Выполнение команд, содержащихся в файл-программе,
осуществляется двумя способами:
1) из редактора М-файлов так, как описано выше;
2) из командной строки или другой файл-программы, при этом в
качестве команды используется имя М-файла.
Применение второго способа намного удобнее, особенно, если
созданная файл-программа будет неоднократно использоваться
впоследствии. Фактически, созданный М-файл становится командой,
которую понимает MATLAB. Закройте все графические окна и наберите в
командной строке mydemo, появляется графическое окно,
соответствующее командам файл-программы mydemo.m. После ввода
команды mydemo MATLAB производит следующие действия:
 проверяет, является ли введенная команда именем какой-либо из
переменных, определенных в рабочей среде. Если введена переменная, то
выводится ее значение;
 если введена не переменная, то MATLAB ищет введенную

108
команду среди встроенных функций. Если команда оказывается
встроенной функцией, то происходит ее выполнение.
Если введена не переменная и не встроенная функция, то MATLAB
начинает поиск М-файла с названием команды и расширением m. Поиск
начинается с текущего каталога (Current Directory), если М-файл в нем не
найден, то MATLAB просматривает каталоги, установленные в пути
поиска (Path). Найденный М-файл выполняется в MATLAB.
Если ни одно из вышеперечисленных действий не привело к успеху,
то выводится сообщение в командное окно, например:

» mydem
??? Undefined function or variable 'mydem'.

Как правило, М-файлы хранятся в каталоге пользователя. Для того


чтобы система MATLAB могла найти их, следует установить пути,
указывающие расположение М-файлов.
Замечание 2
Хранить собственные М-файлы вне основного каталога MATLAB
следует по двум причинам. Во-первых, при переустановке MATLAB
файлы, которые содержатся в подкаталогах основного каталога MATLAB,
могут быть уничтожены. Во-вторых, при запуске MATLAB все файлы
подкаталога toolbox размещаются в памяти компьютера некоторым
оптимальным образом так, чтобы увеличить производительность работы.
Если вы записали М-файл в этот каталог, то воспользоваться им можно
будет только после перезапуска MATLAB.

6.1.3. Установка путей


Начиная с 6-й версии MATLAB есть возможность определения
текущего каталога и пути поиска. Установка этих свойств производится

109
либо при помощи соответствующих диалоговых окон, либо командами из
командной строки.
Текущий каталог определяется в диалоговом окне Current Directory
рабочей среды. Окно присутствует в рабочей среде, если выбран пункт
Current Directory меню View рабочей среды.
Текущий каталог выбирается из списка. Если его нет в списке, то его
можно добавить из диалогового окна Browse for Folder, вызываемого
нажатием на кнопку, расположенную справа от списка. Содержимое
текущего каталога отображается в таблице файлов.
Определение путей поиска производится в диалоговом окне Set Path
навигатора путей, доступ к которому осуществляется из пункта Set Path
меню File рабочей среды.
Для добавления каталога нажмите кнопку Add Folder и в
появившемся диалоговом окне Browse for Path выберите требуемый
каталог. Добавление каталога со всеми его подкаталогами осуществляется
при нажатии на кнопку Add with Subfolders. Путь к добавленному каталогу
появляется в поле MATLAB search path. Порядок поиска соответствует
расположению путей в этом поле, первым просматривается каталог, путь к
которому размещен вверху списка. Порядок поиска можно изменить или
вообще удалить путь к какому-либо каталогу, для чего выделите каталог в
поле MATLAB search path и определите его положение при помощи
следующих кнопок:
Move to Top  поместить вверх списка;
Move Up  переместить вверх на одну позицию;
Remove  удалить из списка;
Move Down  переместить вниз на одну позицию;
Move to Bottom  поместить вниз списка.
После внесения изменений следует сохранить информацию о путях
поиска, нажав кнопку Save. При помощи кнопки Default можно

110
восстановить стандартные установки, a Revert предназначена для возврата
к сохраненным.
Команды для установки путей
Действия по установке путей в MATLAB 6.x дублируются
командами. Текущий каталог устанавливается командой cd, например
cd c:\users\igor. Команда cd, вызванная без аргумента, выводит путь к
текущему каталогу. Для установки путей служит команда path,
вызываемая с двумя аргументами:

path (path, 'c:\users\igor')  добавляет каталог c:\users\igor с низшим


приоритетом поиска;
path ('с: \users\igor',path)  добавляет каталог c:\users\igor с высшим
приоритетом поиска.

Использование команды path без аргументов приводит к


отображению на экране списка путей поиска. Удалить путь из списка
можно при помощи команды rmpath:

rmpath ('с:\users\igor') удаляет путь к каталогу c:\users\igor из списка


путей.

Замечание 3
Не удаляйте без необходимости пути к каталогам, особенно к тем, в
назначении которых вы не уверены. Удаление может привести к тому, что
часть функций, определенных в MATLAB, станет недоступной.

Пример 6.1. Создайте в корневом каталоге диска D (или любом


другом диске или каталоге, где студентам разрешено создавать свои
каталоги) каталог со своей фамилией, например, WORK_IVANOV и
запишите туда М-файл mydemo.m под именем mydemo3.m. Установите

111
пути к файлу и продемонстрируйте доступность файла из командной
строки. Результаты приведите в отчете по лабораторной работе.
Вариант решения:
1. В корневом каталоге диска D создается каталог WORK_IVANOV.
2. В каталог WORK_IVANOV записывается М-файл mydemo.m под
именем mydemo3.m.
3. Открывается диалоговое окно Set Path меню File рабочей среды
MATLAB.
4. Нажимается кнопка Add Folder, и в появившемся диалоговом окне
Browse for Path выбирается каталог WORK_IVANOV.
5. Добавление каталога со всеми его подкаталогами осуществляется
при нажатии на кнопку Add with Subfolders. Путь к добавленному каталогу
появляется в поле MATLAB search path.
6. Для запоминания пути нажимается клавиша Save диалогового окна
Set Path.
7. Выполняется проверка правильности всех действий путем набора
команды mydemo3 из командной строки. На экране появится графическое
окно Figure No.1, содержащее графики функций.
Рассмотренные выше файл-программы являются
последовательностью команд MATLAB, они не имеют входных и
выходных аргументов. Для использования численных методов и при
программировании собственных приложений в MATLAB необходимо
уметь составлять файл-функции, которые производят необходимые
действия с входными аргументами и возвращают результат в выходных
аргументах. В этом подразделе разобрано несколько простых примеров,
позволяющих понять работу с файл-функциями. Файл-функции, так же как
и файл-процедуры, создаются в редакторе М-файлов.

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

x x2  1
e .
x 4  0,1

Целесообразно один раз написать файл-функцию, а потом вызывать её


всюду, где необходимо вычисление этой функции. Откройте в редакторе
М-файлов новый файл и наберите текст листинга

function f = myfun(x)
f= ехр(-х)*sqrt((х^2+1)/(х^4+0.1));

Слово function в первой строке определяет, что данный файл


содержит файл-функцию. Первая строка является заголовком функции, в
которой размещается имя функции и списки входных и выходных
аргументов. В примере, приведенном в листинге, имя функции myfun, один
входной аргумент х и один выходной  f. После заголовка следует тело
функции (оно в данном примере состоит из одной строки), где и
вычисляется ее значение. Важно, что вычисленное значение записывается
в f. Точка с запятой поставлена для предотвращения вывода лишней
информации на экран.
Теперь сохраните файл в рабочем каталоге. Обратите внимание, что
выбор пункта Save или Save as меню File приводит к появлению
диалогового окна сохранения файла, в поле File name которого уже
содержится название myfun. He изменяйте его, сохраните файл-функцию в
файле с предложенным именем.

113
Теперь созданную функцию можно использовать так же, как и
встроенные sin, cos и другие, например из командной строки:

» у = myfun(1.3)
у =
0.2600

Вызов собственных функций может осуществляться из файл-


программы и из другой файл-функции.

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

» х = [1.3 7.2];
» у = myfun(x)
??? Error using ==> ^
Matrix must be square.
Error in ==> C:\MATLABRll\work\myfun.m
On line 2 ==> f = exp(-x)*sqrt((х^2+1)/(х^4+1));

Если вы изучили работу с массивами, то устранение этого


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

114
Измените тело функции, как указано в следующем листинге (не
забудьте сохранить изменения в файле myfun.m)

function f = myfun(x)
f = ехр(-х).*sqrt((х.^2+1)./(х.^4+0.1));

Теперь аргументом функции myfun может быть как число, так и


вектор или матрица значений, например:

» х = [1.3 7.2];
» у = myfun(x)
У =
0.2600 0.0001

Переменная у, в которую записывается результат вызова функции


myfun, автоматически становится вектором нужного размера.
Постройте график функции myfun на отрезке [0, 4] из командной
строки или при помощи файл-программы:

x = [0:0.5:4];
у = myfun(x);
plot(x, у)

MATLAB предоставляет еще одну возможность работы с файл-


функциями  использование их в качестве аргументов некоторых команд.
Например, для построения графика служит специальная функция fplot,
заменяющая последовательность команд, приведенную выше. При вызове
fplot имя функции, график которой требуется построить, заключается в
апострофы, пределы построения указываются в вектор-строке из двух
элементов fplot('myfun', [0, 4]).

115
Постройте графики myfun при помощи plot и fplot на одних осях, при
помощи hold on. Обратите внимание, что график, построенный при
помощи fplot, более точно отражает поведение функции, т.к. fplot сама
подбирает шаг аргумента, уменьшая его на участках быстрого изменения
отображаемой функции. Результаты приведите в отчете по лабораторной
работе.
Файл-функции с несколькими входными аргументами
Написание файл-функций с несколькими входными аргументами
практически не отличается от случая с одним аргументом. Все входные
аргументы размещаются в списке через запятую. Например, следующий
листинг содержит файл-функцию, вычисляющую длину радиус-вектора

точки трехмерного пространства x2  y2  z 2 .


Листинг файл-функции с несколькими аргументами

function r = radius3(x, у, z)
r = sqrt(х.^2 + у.^2 + z.^2);

Для вычисления длины радиус-вектора теперь можно использовать


функцию radius3, например:

» R = radius3(1, 1, 1)
R =
1.732

Кроме функций с несколькими входными аргументами, MATLAB


позволяет создавать функции, возвращающие несколько значений, т.е.
имеющие несколько выходных аргументов.
Файл-функции с несколькими выходными аргументами
Файл-функции с несколькими выходными аргументами удобны при
вычислении функций, возвращающих несколько значений (в математике
116
они называются вектор-функциями). Выходные аргументы добавляются
через запятую в список выходных аргументов, а сам список заключается в
квадратные скобки. Хорошим примером является функция, переводящая
время, заданное в секундах, в часы, минуты и секунды. Данная файл-
функция приведена в следующем листинге.
Листинг функции перевода секунд в часы, минуты и секунды

function [hour, minute, second] = hms(sec)


hour = floor(sec/3600);
minute = floor((sec-hour*3600)/60);
second = sec-hour*3600-minute*60;

При вызове файл-функций с несколькими выходными аргументами


результат следует записывать в вектор соответствующей длины

» [Н, М, S] = hms(10000)
H =
2
М =
46
S =
40

6.1.5. Основы программирования в MATLAB


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

117
основные операторы, задающие последовательности выполнения команд
MATLAB. Операторы можно использовать как в файл-процедурах, так и в
функциях, что позволяет создавать программы со сложной разветвленной
структурой.
Оператор цикла for
Оператор предназначен для выполнения заданного числа
повторяющихся действий. Самое простое использование оператора for
осуществляется следующим образом:

for count = start:step:final


% Далее идет текст программы из команд MATLAB

end

Здесь count  переменная цикла, start  ее начальное значение, final 


конечное значение, а step  шаг, на который увеличивается count при
каждом следующем заходе в цикл. Цикл заканчивается, как только
значение count становится больше final. Переменная цикла может
принимать не только целые, но и вещественные значения любого знака.
Разберем применение оператора цикла for на некоторых характерных
примерах.
Пусть требуется вывести семейство кривых для x  [0, 2] , которое

задано функцией, зависящей от параметра y( x, a)  e  ax sin x , для значений


параметра от 0,1 до 0,1.
Наберите текст файл-процедуры в редакторе М-файлов и сохраните в
файле FORdem1.m, и запустите его на выполнение (из редактора
М-файлов или из командной строки, набрав в ней команду FORdem1 и
нажав <Enter>):

118
% файл-программа для построения семейства кривых
x = [0:pi/30:2*pi];
for a = -0.1:0.02:0.1
y = exp(-a*x).*sin(x);
hold on
plot(x, y)
end

В результате выполнения FORdem1 появится графическое окно


(рис. 6.1), которое содержит требуемое семейство кривых.

Рис. 6.1. Результат выполнения FORdem1

Замечание 4
Редактор М-файлов автоматически предлагает расположить
операторы внутри цикла с отступом от левого края. Используйте эту
возможность для удобства работы с текстом программы.

119
Напишите файл-программу для вычисления суммы

10 1
S  k! .
k 1

Алгоритм вычисления суммы использует накопление результата, т.е.


сначала сумма равна нулю (S = 0), затем в переменную k заносится
единица, вычисляется 1/k!, добавляется к S и результат снова заносится в S.
Далее k увеличивается на единицу, и процесс продолжается, пока
последним слагаемым не станет 1/10!. Файл-программа Fordem2,
приведенная в следующем листинге, вычисляет искомую сумму.
Листинг файл-программы Fordem2 для вычисления суммы

% ФАЙЛ-ПРОГРАММА ДЛЯ ВЫЧИСЛЕНИЯ СУММЫ


% 1/1!+1/2!+ … +1/10!

% Обнуление S для накопления суммы


S = 0;
% накопление суммы в цикле
for k = 1:10
S = S + 1/factorial(k);
End
% вывод результата в командное окно
S

Наберите файл-программу в редакторе М-файлов, сохраните её в


текущем каталоге в файле Fordem2.m и выполните. Результат отобразится
в командном окне, т.к. в последней строке файл-программы S содержится
без точки с запятой для вывода значения переменной S

120
S =
1.7183

Обратите внимание, что остальные строки файл-программы, которые


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

» help Fordem2
ФАЙЛ-ПРОГРАММА ДЛЯ ВЫЧИСЛЕНИЯ СУММЫ
1/1!+1/2!+ … +1/10!

При написании файл-программ и файл-функций не пренебрегайте


комментариями!
Все переменные, использующиеся в файл-программе, становятся
доступными в рабочей среде. Они являются, так называемыми,
глобальными переменными. С другой стороны, в файл-программе могут
использоваться все переменные, введенные в рабочей среде.
Рассмотрим задачу вычисления суммы, похожую на предыдущую, но
зависящую от переменной x

10 xk
S  k! .
k 1

Для вычисления данной суммы в файл-программе Fordem2 требуется


изменить строку внутри цикла for на

121
S = S + x.^k/factorial(k);

Перед запуском программы следует определить переменную x в


командной строке при помощи следующих команд:

» x = 1.5;
» Fordem2
S =
3.4817

В качестве x может быть вектор или матрица, так как в файл-


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

function S = sumN(x, N)
% файл-функция для вычисления суммы
% x/1!+x^2/2!+ … +x^N/N!
% использование: S = sumN(x, N)

% обнуление S для накопления суммы


S = 0;
% накопление суммы в цикле

122
for m = 1:1:N
S = S + x.^m/factorial(m);
end

Об использовании функции sumN пользователь может узнать, набрав


в командной строке help sumN. В командное окно выведутся первые три
строки с комментариями, отделенные от текста файл-функции пустой
строкой.
Обратите внимание, что переменные файл-функции не являются
глобальными (m в файл-функции sumN). Попытка просмотра значения
переменной m из командной строки приводит к сообщению о том, что m не
определена. Если в рабочей среде имеется глобальная переменная с тем же
именем, определенная из командной строки или в файл-программе, то она
никак не связана с локальной переменной в файл-функции. Как правило,
лучше оформлять собственные алгоритмы в виде файл-функций для того,
чтобы переменные, используемые в алгоритме, не изменяли значения
одноименных глобальных переменных рабочей среды.
Циклы for могут быть вложены друг в друга, при этом переменные
вложенных циклов должны быть разными.
Цикл for оказывается полезным при выполнении повторяющихся
похожих действий в том случае, когда их число заранее определено.
Обойти это ограничение позволяет более гибкий цикл while.
Оператор цикла while
Рассмотрим пример на вычисление суммы, похожий на пример из
предыдущего пункта. Требуется найти сумму ряда для заданного x
(разложение в ряд sin x ):

 x 2k 1
S ( x)   (1) k
.
k 0 (2k  1)!

123
Сумму можно накапливать до тех пор, пока слагаемые являются не
слишком маленькими, скажем больше по модулю 10 10 . Циклом for здесь
не обойтись, так как заранее неизвестно число слагаемых. Выход состоит в
применении цикла while, который работает, пока выполняется условие
цикла:

while условие цикла


команды MATLAB
end

В данном примере условие цикла предусматривает, что текущее


слагаемое x k / k! больше 10 10 . Для записи этого условия используется
знак больше (>). Текст файл-функции mysin, вычисляющей сумму ряда,
приведен в следующем листинге.
Листинг файл-функции mysin, вычисляющей синус разложением в
ряд

function S = mysin(x)
% Вычисление синуса разложением в ряд
% Использование: y = mysin(x), -pi<x<pi
S = 0;
k = 0;
while abs(x.^(2*k+1)/factorial(2*k+1))>1.0e-10
S = S + (-1)^k*x.^(2*k+1)/factorial(2*k+1);
k = k + 1;
end

Обратите внимание, что у цикла while, в отличие от for, нет


переменной цикла, поэтому пришлось до начала цикла k присвоить нуль, а
внутри цикла увеличивать k на единицу.

124
Условие цикла while может содержать не только знак >. Для задания
условия выполнения цикла допустимы также другие операции отношения,
приведенные в табл. 6.1.

Таблица 6.1 – Операции отношения


Обозначение Операция отношения
== Равенство
< Меньше
> Больше
<= Меньше или равно
>= Больше или равно
= Не равно

Задание более сложных условий производится с применением


логических операторов. Например, условие 1  x  2 состоит в
одновременном выполнении двух неравенств x  1 и x2 и
записывается при помощи логического оператора and

and(x >= -1, x < 2)

или эквивалентным образом с символом &

(x >= -1) & (x < 2)

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


табл. 6.2.

Таблица 6.2 – Логические операторы


Оператор Условие Запись в MATLAB Эквивалентная запись
Логическое "И" x  3 и k  4 and(x < 3, k == 4) (x < 3) & (k == 4)
Логическое
x  1, 2 оr(x == 1,x == 2) (x == 1)  (x == 2)
"ИЛИ"
Отрицание "НЕ" a  1.9 not(a == 1.9) (a == 1.9)

125
При вычислении суммы бесконечного ряда имеет смысл ограничить
число слагаемых. Если ряд расходится из-за того, что его члены не
стремятся к нулю, то условие на малое значение текущего слагаемого
может никогда не выполниться и программа зациклится. Выполните
суммирование, добавив в условие цикла while файл-функции mysin
ограничение на число слагаемых:

while(abs(x.^(2*k+1)/factorial(2*k+1))>1.0e-10)&
(k<=10000))

или в эквивалентной форме

while and(abs(x.^(2*k+1)/factorial(2*k+1))>1.0e-10),
k<=10000)

Организация повторяющихся действий в виде циклов делает


программу простой и понятной, однако часто требуется выполнить тот или
иной блок команд в зависимости от некоторых условий, т.е. использовать
ветвление алгоритма.
Условный оператор if
Условный оператор if позволяет создать разветвляющийся алгоритм
выполнения команд, в котором при выполнении определенных условий
работает соответствующий блок операторов или команд MATLAB.
Оператор if может применяться в простом виде для выполнения
блока команд при удовлетворении некоторого условия или в конструкции
if-elseif-else для написания разветвляющихся алгоритмов.

Пусть требуется вычислить выражение x 2  1 . Предположим, что


вычисления выполняются в области действительных чисел и требуется
вывести предупреждение о том, что результат является комплексным
числом. Перед вычислением функции следует произвести проверку
126
значения аргумента x и вывести в командное окно предупреждение, если
модуль x не превосходит единицы. Здесь необходимо применение
условного оператора if, применение которого в самом простом случае
выглядит так:

if условие
команды MATLAB
end

Если условие выполняется, то реализуются команды MATLAB,


размещенные между if и end, а если условие не выполняется, то
происходит переход к командам, расположенным после end. При записи
условия используются операции, приведенные в табл. 6.1.
Файл-функция, проверяющая значение аргумента, приведена в
следующем листинге. Команда warning служит для вывода
предупреждения в командное окно.
Листинг файл-функции Rfun, проверяющей значение аргумента

function f = Rfun(x)
% вычисляет sqrt(x^2-1)
% выводит предупреждение, если результат комплексный
% использование y = Rfun(x)
% проверка аргумента
if abs(x)<1
warning('результат комплексный')
end
% вычисление функции
f = sqrt(x^2-1);

127
Теперь вызов Rfun от аргумента, меньшего единицы, приведет к
выводу в командное окно предупреждения:

» y = Rfun(0.2)
результат комплексный
y =
0 + 0.97979589711327i

Файл-функция Rfun только предупреждает о том, что ее значение


комплексное, а все вычисления с ней продолжаются. Если же комплексный
результат означает ошибку вычислений, то следует прекратить
выполнение функции, используя команду error вместо warning.

Оператор ветвления if-elseif-else


В общем случае применение оператора ветвления if-elseif-else
выглядит следующим образом:

if условие 1
команды MATLAB
elseif условие 2
команды MATLAB
………………………
elseif условие N
команды MATLAB
else
команды MATLAB
end

В зависимости от выполнения того или иного из N условий работает


соответствующая ветвь программы, если не выполняется ни одно из N

128
условий, то реализуются команды MATLAB, размещенные после else.
После выполнения любой из ветвей происходит выход из оператора.
Ветвей может быть сколько угодно или только две. В случае двух ветвей
используется завершающее else, а elseif пропускается. Оператор ветвления
должен всегда заканчиваться оператором end.
Пример использования оператора if-elseif-else, в котором
анализируется значение переменной а и выводится сообщение о величине
а, приведен в следующем листинге

function ifdem(a)
% пример использования оператора if-elseif-else
if (a == 0)
warning('а равно нулю')
elseif a == 1
warning('а равно единице')
elseif a == 2
warning('а равно двум')
elseif a >= 3
warning('а, больше или равно трем')
else
warning('а меньше трех, и не равно нулю, единице,
двум')
end

Оператор ветвления switch


Для осуществления множественного выбора или ветвления может
применяться оператор switch. Он является альтернативой оператору
if-elseif-else. В общем случае применение оператора ветвления switch
выглядит следующим образом:

129
switch выражение
case значение 1
команды MATLAB
case значение 2
команды MATLAB
…………………………………
case значение N
команды MATLAB
case {значение N+1, значение N+2, …}
команды MATLAB
…………………………………
case {значение NM+1, значение NM+2,…}
otherwise
команды MATLAB
end

В данном операторе сначала вычисляется значение выражения (это


может быть скалярное числовое значение либо строка символов). Затем это
значение сравнивается со значениями: значение 1, значение 2, …, значение
N, значение N+1, значение N+2, …, значение NM+1, значение NM+2,…
(которые также могут быть числовыми либо строковыми). Если найдено
совпадение, то выполняются команды MATLAB, стоящие после
соответствующего ключевого слова case. В противном случае
выполняются команды MATLAB, расположенные между ключевыми
словами otherwise и end.
Строк с ключевым словом case может быть сколько угодно, но
строка с ключевым словом otherwise должна быть одна.
После выполнения какой-либо из ветвей происходит выход из switch,
при этом значения, заданные в других case не проверяются.

130
Применение switch поясняет следующий пример:

function demswitch(x)
a = 10/5 + x
switch a
case -1
warning('a = -1')
case 0
warning('a = 0')
case 1
warning('a = 1')
case {2, 3, 4}
warning('a равно 2 или 3 или 4')
otherwise
warning('a не равно -1, 0, 1, 2, 3, 4')
end

» x = -4
demswitch(x)
a = -2
» x = 1
demswitch(x)
a = 3
Warning:a равно 2 или 3 или 4

Оператор прерывания цикла break


При организации циклических вычислений следует заботиться о том,
чтобы внутри цикла не возникло ошибок. Например, пусть задан массив x,
состоящий из целых чисел, и требуется сформировать новый массив y по
правилу y(i) = x(i + 1) / x(i). Очевидно, что задача может быть решена при

131
помощи цикла for. Но если один из элементов исходного массива равен
нулю, то при делении получится inf, и последующие вычисления могут
оказаться бесполезными. Предотвратить эту ситуацию можно выходом из
цикла, если текущее значение x(i) равно нулю. Следующий фрагмент
программы демонстрирует использование оператора break для прерывания
цикла:

for x = 1:20
z = x-8;
if z==0
break
end
y = x/z
end

Как только переменная z принимает значение 0, цикл прерывается.


Оператор break позволяет досрочно прервать выполнение циклов for
и while. Вне этих циклов оператор break не работает.
Если оператор break применяется во вложенном цикле, то он
осуществляет выход только из внутреннего цикла.

6.2. Индивидуальные задания

1. Создайте М-файл mydemo.m.


2. Создайте в корневом каталоге диска D (или любом другом диске
или каталоге, где студентам разрешено создавать свои каталоги) каталог со
своей фамилией, например, WORK_IVANOV и запишите туда М-файл
mydemo.m под именем mydemo3.m. Установите пути к файлу и
продемонстрируйте доступность файла из командной строки.

132
3. Постройте графики файл-функции myfun при помощи команд plot
и fplot на одних осях (при помощи hold on).
4. Напишите файл-функцию root2, которая находит только
вещественные корни квадратного уравнения, а при наличии комплексных
корней выдает сообщение об ошибке. В демонстрационных примерах
второй коэффициент квадратного уравнения должен быть равен Вашему
номеру по списку в журнале группы.
5. Напишите файл-функцию, которая находит наибольший общий
делитель (НОД) z двух натуральных чисел x и y с помощью алгоритма
Евклида. В одном из демонстрационных примеров наибольший общий
делитель должен быть равен 3N+1, где N  Ваш номер по списку в журнале
группы.
Справочная информация. Идея алгоритма Евклида основана на том,
что если z  НОД ( x , y), то при равенстве чисел x и y НОД z совпадает с x и
y, а в случае неравенства чисел x и y их разность между большим и
меньшим вместе с меньшим числом имеет тот же самый наибольший
общий делитель. Алгоритм определения НОД Евклида можно записать
следующим образом:
Шаг 1. Если x > y, то перейти на шаг 4.
Шаг 2. Если x < y, то перейти на шаг 5, иначе перейти на шаг 3.
Шаг 3. z = x. Конец.
Шаг 4. Из x отнять y и считать, что эта разность теперь равна
значению x. Перейти на шаг 1.
Шаг 5. Из y отнять x и считать, что эта разность теперь равна
значению y. Перейти на шаг 1.
6. Напишите файл-функцию, которая находит простые числа, не
превосходящие 150+10N, где N  номер по списку в журнале группы.
Справочная информация. Простыми называются целые
положительные числа, большие единицы, которые без остатка делятся
только на самих себя и единицу. Одним из наиболее простых алгоритмов
133
получения простых чисел, не превосходящих n, является алгоритм
Эратосфена, получивший название решета Эратосфена. Он состоит из
следующих шагов:
Шаг 1. Выписать последовательно все целые числа, начиная с двух и
заканчивая n.
Шаг 2. Задаться числом p = 2.
Шаг 3. Если p 2  n , то перейти на шаг 4, иначе перейти на шаг 6.
Шаг 4. В последовательности чисел, начиная с числа p + 1,
зачеркнуть все числа кратные p, не обращая внимания на то, что часть
чисел могла быть уже зачеркнута.
Шаг 5. Первое после числа p незачеркнутое число
последовательности считать новым значением числа p. Вернуться на шаг 3
алгоритма.
Шаг 6. Процесс окончен. Все незачеркнутые числа
последовательности являются простыми.
7. Вычислите сумму простых чисел, найденных в задании 6.
8. Оформите отчет по лабораторной работе.

134
Лабораторная работа 7

ИССЛЕДОВАНИЕ АЛГОРИТМА НЕЧЕТКОЙ КЛАСТЕРИЗАЦИИ

Цель лабораторной работы: получение и закрепление знаний про


алгоритм нечеткой кластеризации, формирование практических навыков
решения задач кластеризации методами нечеткой логики.

7.1. Краткие сведения из теории

7.1.1. FCM-алгоритм кластеризации


Алгоритм нечеткой кластеризации называют FCM-алгоритмом
(Fuzzy Classifier Means, Fuzzy C-Means). Целью FCM-алгоритма
кластеризации является автоматическая классификация множества
объектов, которые задаются векторами признаков в пространстве
признаков. Другими словами, такой алгоритм определяет кластеры и
соответственно классифицирует объекты. Кластеры представляются
нечеткими множествами, и, кроме того, границы между кластерами также
являются нечеткими.
FCM-алгоритм кластеризации предполагает, что объекты
принадлежат всем кластерам с определенной ФП. Степень
принадлежности определяется расстоянием от объекта до
соответствующих кластерных центров. Данный алгоритм итерационно
вычисляет центры кластеров и новые степени принадлежности объектов.
Для заданного числа K входных векторов хk ( k  1, K ) и N

выделяемых кластеров сj ( j  1, N ) предполагается, что любой хk

принадлежит любому сj ( j  1, N ) с принадлежностью µjk  [0,1], где


j – номер кластера, а k – номер входного вектора.

135
Принимаются во внимание следующие условия нормирования для
µjk:

N
  jk  1, k  1,...,K ;
j 1
N
0    jk  K , j  1,...,N .
k 1

Цель алгоритма – минимизация суммы всех взвешенных расстояний


xk  c j

N K
  ( jk ) q xk  c j  min ,
j 1k 1

где q – фиксированный параметр, задаваемый перед итерациями.


Для достижения вышеуказанной цели необходимо решить
следующую систему уравнений:

N K 
    ( jk ) q xk  c j   0, j  1, N , k  1, K ,
 jk  j 1k 1 
 
N K 
    ( jk ) q xk  c j   0, j  1, N .
c j  j 1k 1 
 

Совместно с условиями нормирования µjk данная система уравнений


имеет следующее решение:

N
 ( jk ) q  xk
j 1
cj  K
, j  1, N .
 ( jk ) q
k 1

136
(взвешенный центр гравитации) и

1
1
xk  c j ( q 1 )
 jk  , j  1, N , k  1, K .
N 


 1
1 
j 1 xk  c j ( q 1 ) 

Алгоритм нечеткой кластеризации выполняется по шагам.


Шаг 1. Инициализация.
Выбираются следующие параметры:
– необходимое количество кластеров N, 2 < N < К;
– тип расстояний (например, расстояние по Евклиду);
– фиксированный параметр q (обычно 1,5);
– начальная (на нулевой итерации) матрица функций
принадлежности U ( 0 )  ( jk ) (0) объектов хk ( k  1, K ) с учетом заданных

начальных центров кластеров сj ( j  1, N ).

Шаг 2. Регулирование позиций c (tj ) центров кластеров.

На t-м итерационном шаге при известной матрице  (tjk) вычисляется

c (tj ) в соответствии с вышеприведенным решением системы уравнений.

Шаг 3. Корректировка значений принадлежности µjk.

Учитывая известные c (tj ) , вычисляются  (tjk) , если xk  c j , в

противном случае:

1, если k  j ,
 (jkt 1)  
0, если k  j.

Шаг 4. Остановка алгоритма.

137
Алгоритм нечеткой кластеризации останавливается при выполнении
следующего условия:

U (t 1)  U (t )  ,

где || || – матричная норма (например, Евклидова норма);  – заранее


задаваемый уровень точности.

7.1.2. Решение задач кластеризации


Существуют два способа решения задач кластеризации в MATLAB: с
использованием командной строки или графического интерфейса
пользователя. Рассмотрим первый из указанных способов.
Для нахождения центров кластеров в MATLAB имеется встроенная
функция fcm, описание которой представлено ниже.
Описание функции: [center ,U , obj_fcn]  fcm(data, cluster_n ).
Аргументами данной функции являются:
1) data – множество данных, подлежащих кластеризации, каждая
строка описывает точку в многомерном пространстве характеристик;
2) cluster_n – количество кластеров (более одного).
Функцией возвращаются следующие параметры:
1) center – матрица центров кластеров, каждая строка которой
содержит координаты центра отдельного кластера;
2) U – результирующая матрица функции принадлежности;
3) obj_fcn – значение целевой функции на каждой итерации.

Пример 7.1. Программа нечеткой кластеризации.


//загрузка данных, подлежащих кластеризации, из файла
» load fcmdata.dat;
//определение центра кластеризации (два кластера)

138
» [center, U, obj_fcm] = fcm( fсmdata, 2);
//определение максимальной степени принадлежности
//отдельного элемента данных кластеру
»maxU = max(U);
//распределение строк матрицы данных между
//соответствующими кластерами
»index1 = find (U(1, :) == maxU);
»index2 = find(U(2, :) = maxU);
//построение данных, соответствующих первому кластеру
»plot (fcmdata (index1, 1), fcmdata (index1, 2),'
ko', 'markersize', 5, 'LineWidth' ,1);
»hold on
//построение данных, соответствующих второму кластеру
»plot(fcmdata (index2, 1), fcmdata(index2, 2), 'kx',
'markersize', 5, 'LineWidth', 1);
// построение кластерных центров
»plot(center(1, 1), center(1, 2), 'ko', 'markersize',
15, 'LineWidth', 2)
»plot (center (2, 1), center (2, 2), 'kx',
'markersize', 15, 'LineWidth', 2)

На рис. 7.1 представлено множество данных, подлежащих


кластеризации, и найденные центры кластеров для примера 7.1.
Функция fcm выполняется итерационно до тех пор, пока изменения
целевой функции превышают некоторый заданный порог.
На каждом шаге в командном окне МАTLAB выводятся порядковый
номер итерации и соответствующее текущее значение целевой функции
(табл. 7.1).

139
Рис. 7.1. Множество анализируемых данных и центры кластеров

Таблица 7.1 – Изменение целевой функции


Номер Значения целевой Номер Значения целевой
итерации функции итерации функции
1 8,94 7 3,81
2 7,31 8 3,80
3 6,90 9 3,79
4 5,41 10 3,79
5 4,08 11 3,79
6 3,83 12 3,78

Для оценки динамики изменения значений целевой функции


используется команда построения графика plot(obj_fcm). Результаты
примера 7.1 показаны на рис. 7.2.

140
Рис. 7.2. График изменения значений целевой функции

Функцию кластеризации можно вызвать с дополнительным набором


параметров: fcm (data, cluster_n, options). Дополнительные аргументы
используются для управления процессом кластеризации:
– options(1) – показатель степени для матрицы U (по умолчанию:
2.0);
– options(2) – максимальное количество итераций (по умолчанию:
100);
– options(3) – минимально допустимое изменение значений целевой
функции (по умолчанию: 1е–5);
– options(4) – отображение информации на каждом шаге (по
умолчанию: 1).
Пример определения функции fcm с дополнительными параметрами:
[center, U, obj_fcn] = fсm(fcmdata, 2, [2, 100, le–5, 1]).

141
Второй способ решения задач кластеризации в MATLAB вызывается
командой findcluster. Главное окно инструмента кластеризации показано
на рис. 7.3.

Рис. 7.3. Главное окно кластеризации в MATLAB

Кнопка <Load Data> используется для загрузки подлежащих


кластеризации исходных данных следующего формата: каждая строка
представляет собой точку в многомерном пространстве характеристик,
количество строк соответствует количеству точек (элементов данных).
Графическую интерпретацию исходных данных можно наблюдать в
одноименном окне главного окна инструмента.
Выбор типа алгоритма кластеризации осуществляется с
использованием ниспадающего меню Methods (пункт меню – fcm). Далее
определяются параметры алгоритма кластеризации:

142
– количество кластеров (строка ввода – Cluster Num);
– максимальное количество итераций (строка ввода – Мах Iteration);
– минимальное значение улучшения целевой функции (строка
ввода – Min. Improvement);
– показатель степени при матрице ФП (строка ввода – Exponent).
После определения необходимых значений указанных параметров
осуществляется запуск алгоритма кластеризации с помощью кнопки
<Start>. Количество произведенных итераций и значение целевой функции
можно просмотреть в нижней части главного окна инструмента
кластеризации.
Координаты найденных центров кластеров можно сохранить,
щелкнув мышью по кнопке <Save Center...>. Каждая строка матрицы в
файле представляет собой набор координат отдельного кластера.
Количество строк соответствует количеству кластеров.

7.2. Индивидуальные задания

1. Необходимо сформулировать задачу из области вычислительной


техники или программирования, для которой была бы необходима
автоматическая классификация множества объектов, которые задаются
векторами признаков в пространстве признаков.
2. Решить в MATLAB сформулированную задачу с использованием
механизма кластеризации методами нечеткой логики, при этом используя
командную строку и графический интерфейс пользователя. При
использовании командной строки функцию кластеризации необходимо
вызвать с дополнительным набором параметров.
3. Найти центры кластеров и построить график изменения значений
целевой функции.
4. Оформите отчет по лабораторной работе.

143
Лабораторная работа 8

МОДЕЛИРОВАНИЕ НЕЧЕТКОЙ СИСТЕМЫ СРЕДСТВАМИ


ИНСТРУМЕНТАРИЯ НЕЧЕТКОЙ ЛОГИКИ

Цель лабораторной работы: получение и закрепление знаний,


формирование практических навыков построения нечеткой системы
средствами инструментария нечеткой логики.

8.1. Краткие сведения из теории

В составе MATLAB присутствуют пять основных средств


графического интерфейса пользователя (ГИП), которые обеспечивают
доступ к инструментарию нечеткой логики (ИНЛ): редакторы системы
нечеткого вывода (СНВ), функции принадлежности, правила вывода, а
также средства просмотра правил и поверхности вывода. Эти средства
связаны между собой динамически, и производимые изменения в одном из
них влекут изменения в других.
Редактор СНВ предоставляет возможность формирования
проектируемой системы на высоком уровне абстракции: количество
входных и выходных переменных, наименование переменных.
Редактор функций принадлежности (ФП) используется для
определения формы ФП, ассоциированных с каждой переменной.
Редактор правил вывода применяется для редактирования списка
правил, которые определяют поведение проектируемой системы.
Средство просмотра правил вывода используется в целях
диагностики и может показывать, например, активность правил или форму
влияния отдельных ФП на результат нечеткого вывода.
Средство просмотра поверхности вывода используется для
отображения зависимости выхода системы от одного или двух входов.

144
Другими словами, оно генерирует и выводит карту поверхности вывода
разработанной СНВ.
Редактор СНВ. Построение нечетких систем по Мамдани. Для
построения создаваемой системы в командной строке основного окна
MATLAB необходимо набрать команду fuzzy. Окно редактора новой СНВ
содержит входную, обозначенную input1 и выходную – output1
переменные. По умолчанию ИНЛ предлагает создавать СНВ типа
Мамдани.
Для того чтобы добавить новую переменную, необходимо выбрать в
меню Edit соответствующий пункт (для входной переменной – Add input,
для выходной – Add output). Изменение наименования переменной
происходит по шагам.
Шаг 1. Отмечается переменная, которую необходимо переименовать.
Шаг 2. В поле редактирования изменяется наименование переменной
по умолчанию на имя, предложенное пользователем.
Сохранение проектируемой системы в рабочее пространство среды
MATLAB (в переменную) производится с помощью пункта меню File –
Save to workspace as... . В этом случае данные сохраняются до окончания
сеанса работы с MATLAB. Для сохранения данных на диске после
окончания сеанса работы применяется соответствующий пункт того же
меню – Save to disk as... .
Редактор ФП. Следующим шагом в построении нечеткой модели
средствами ИНЛ является ассоциирование набора ФП с каждой входной и
выходной переменной. Данная операция производится в редакторе ФП
тремя способами, активизировать который можно:
– выбором в меню View пункта Edit Membership Functions...;
– двойным щелчком мыши на изображении соответствующей
переменной (входной или выходной);
– набором в командной строке оператора mfedit.

145
С помощью редактора ФП можно отображать и редактировать
любые ФП, ассоциированные (связанные) со всеми входными и
выходными переменными разрабатываемой СНВ.
Связывание ФП с именем переменной происходит следующим
образом:
– выбирается переменная по имени из набора графических объектов
окна редактора ФП;
– указывается диапазон изменения значений для базовой и видимый
диапазон для текущей переменных;
– в меню Edit выбирается пункт Add MFs... . В появившемся окне
выбирают вид ФП и их количество.
Редактируют ФП текущей переменной двумя способами: используя
графическое окно ФП или изменяя характеристики ФП (наименование, тип
и числовые параметры). При выборе необходимой ФП в графическом окне
допускается плавное изменение кривой с помощью мыши.
Таким образом, при построении СНВ необходимо с помощью
редактора ФП определить соответствующие функции для каждой из
входных и выходных переменных.
Редактор правил вывода. После того как указано количество
входных и выходных переменных, определены их наименования и
построены соответствующие ФП, в СНВ необходимо включить правила
вывода. Для этого в меню View выбирается пункт Edit Rules... или в
командной строке MATLAB набирается команда ruleedit.
Основываясь на описаниях входных и выходных переменных,
определенных в редакторе ФП, редактор правил вывода формирует
структуру правила автоматически. От пользователя требуется лишь связать
значения входных и выходных переменных, выбирая из списка заданных
ранее ФП и определить логические связки между ними. Также допускается
использование логического отрицания (НЕ) и изменение весов правил в
диапазоне от 0 до 1.

146
Правила вывода могут отображаться в окне в различных форматах,
которые определяются путем выбора соответствующего пункта подменю
Format меню Options. По умолчанию используется расширенный формат
отображения правил вывода (verbose form):

If (input_1 is[not] mf_1j1) <and, or>...(input_i is[not] mf_iji)...<and,or>


(input_n is[not] mf__njn) then
(output_1 is[not] mf_n + 1jn+1) <and, or>...
(output_k is[not] mf_k + njk+n) <and, or>...
(output_m is[not] mf_m + njm+n) (w),

где i – номер входной переменной; ji – номер ФП i-й переменной;


k – номер выходной переменной; n – количество входных переменных;
т – количество выходных переменных; w – вес правила.
Круглые скобки заключают в себе обязательные параметры,
квадратные – необязательные, а угловые – альтернативные параметры
(один на выбор).
Кроме формата по умолчанию, существуют еще два вида форматов
отображения правил: символьный (symbolic form) и индексный (indexed
form). Символьный формат имеет следующий вид:

(input_1<~=,==>mf_1j1)<&, | >...
(input_i<~=,==>mf_iji)…<&, | >
(input_n<~=,==>mf_njn)=>
(output_1<~=,==>mf_n + 1jn+1)...<&, | >
(output_k<~=,==>mf_k + njk+n) <&, | >...
(output_m<~=,==>mf_m + njm≠n) (W)

Отличие символьного формата от расширенного состоит в том, что


вместо словесной интерпретации связок используется символьная

147
(символы <&> и <|> – соответственно определяют логическое И и
логическое ИЛИ, символ <~> – логическое отрицание, а символ < => >
является разделителем условной и заключительной частей правила
(антецендента и консеквента).
Общее описание правила вывода в индексном формате может быть
представлено в следующем виде:

[–]1j1…[–]iji…[–]njn[–]n + 1jn + 1…[–]k + njk +1…[–]m + njm + n(w):<1,2>.

Здесь порядок следования чисел соответствует очередности


вводимых переменных, причем символ < , > разделяет правило на
условную и заключительную части. До двоеточия записывается
порядковый номер соответствующей ФП, после двоеточия – вид
логической связки (< 1 > – логическое И, < 2 > – логическое ИЛИ).
Логическое отрицание задается символом < – >.
После определения правил вывода в одноименном редакторе можно
утверждать, что СНВ полностью создана.
Пример 8.1. Создание СНВ.
Рассмотрим следующую ситуацию. Необходимо оценить степень
инвестиционной привлекательности конкретного бизнес-проекта на
основании данных о ставке дисконтирования и периоде окупаемости.
Шаг 1. Вызываем редактор для создания СНВ, набирая в командной
строке fuzzy. Добавляем входную переменную посредством выбора в меню
Edit пункта Add input. В результате получаем следующую структуру СНВ:
два входа, механизм нечеткого вывода по Мамдани, один выход.
Объявляем первую переменную как discont, а вторую – period, которые
соответственно будут представлять ставку дисконтирования и период
окупаемости бизнес-проекта. Наименование выходной переменной, на
основании которой принимается решение о степени инвестиционной
привлекательности бизнес-проекта, задается как rate. Сохраним

148
создаваемую модель под именем Invest. На рис. 8.1 представлено текущее
состояние окна редактора СНВ.

Рис. 8.1. Окно редактора системы нечеткого вывода

Шаг 2. Каждой входной и выходной переменной поставим в


соответствие набор ФП. Данная процедура реализуется в редакторе ФП.
Для discont определяем диапазон базовой переменной (Range) от 5 до 50
(единица измерения – проценты). Такой же диапазон выбираем для ее
отображения (Display Range). Добавим три ФП, тип которых – trimf.
Последовательно выделяя мышью отдельные ФП, присвоим наименования
– small, middle, big соответственно небольшой, средней и большой ставке
дисконтирования. Окно редактора ФП в текущем состоянии показано на
рис. 8.2. Переменной period диапазон базовой переменной определен
равным [3, 36] (единица измерения – месяцы), поставлены в соответствие
три ФП типа gaussmfc наименованиями – short, normal, long. Таким
образом, переменная срока окупаемости бизнес-проекта будет принимать
следующие значения: короткий, обычный и длительный срок окупаемости.
149
Рис. 8.2. Окно редактора ФП

Наконец, для переменной rate определяем: базовая переменная изменяет


значение в диапазоне [0, 1], семантика описывается тремя ФП типа trimf' с
наименованиями: bad, normal, good.
Шаг 3. Заключительным этапом построения СНВ является
определение набора правил, которые задают связь входных переменных с
выходными. Для этого в редакторе правил вывода определим:

ЕСЛИ discont = small И period = short TO rate = good


ЕСЛИ discont = HE small И period = long TO rate = bad
ЕСЛИ discont = middle И period = normal TO rate = normal
ЕСЛИ discont = big И period = short TO rate = normal

Текущее состояние окна редактора правил вывода показано на


рис. 8.3. В расширенном формате отображения указанные правила вывода
представляются следующим образом:

150
if(discont is small) and (period is short) then (rate is goad) (1)
if(discont is not small) and (period is long) then (rate is bad) (1)
if(discont is middle) and (period is normal) then (rate is normal) (1)
if(discont is big) and (period is short) then (rate is normal) (1)

Рис. 8.3. Окно редактора правил вывода

При изменении формата на символьный правила вывода будут иметь


вид:

(discont == small) & (period == short) => (rate == good) (1)


(discont ~= small) & (period == long) => (rate == bad) (1)
(discont == middle) & (period == normal) => (rate== normal) (1)
(discont == big) & (period == short) => (rate == normal) (1)

Средство просмотра правил вывода. Данное средство просмотра


правил вывода позволяет отобразить процесс нечеткого вывода и получить
результат. Главное окно средства просмотра состоит из нескольких
графических окон, располагаемых по строкам и столбцам. Количество
строк соответствует числу правил нечеткого вывода, а количество
151
столбцов – числу входных и выходных переменных, заданных в
разрабатываемой СНВ. Дополнительное графическое окно служит для
отображения результата нечеткого вывода и операции дефазификации. В
каждом окне отображается соответствующая ФП, уровень ее среза (для
входных переменных) и вклад отдельной ФП в общий результат (для
выходных переменных).
В нижней части главного окна можно отобразить номера правил
вывода в различных форматах вывода, отмечая их мышью. Для изменения
формата в меню Options выбирается пункт Rule display format.
Изменение значений входных переменных допустимо двумя
способами:
1) путем ввода в поле Input записи входного вектора, размерность
которого равна количеству входных переменных;
2) щелчком мыши в любом графическом окне, которое относится к
входной переменной.
Входной вектор в каждом из этих вариантов определения исходных
данных будет задавать набор красных вертикальных прямых.
Для СНВ, рассмотренной в примере 8.1, при входном векторе [15 10]
(ставка дисконтирования – 15 %, период окупаемости бизнес-проекта – 10
месяцев) результат (степень инвестиционной привлекательности) будет
составлять 0,639 (рис. 8.4).
Средство просмотра поверхности вывода. Средство просмотра
поверхности вывода позволяет строить трехмерную поверхность как
зависимость одной из выходных переменных от двух входных. Выбор
входных и выходных переменных осуществляется посредством
ниспадающих меню главного окна рассматриваемого программного
средства. Количество выводимых линий по осям X и Y определяется в
полях ввода X grids, Y grids. Поверхность вывода, соответствующая
правилам вывода примера 8.1, показана на рис. 8.5.

152
Построение нечетких систем типа Сугено. Рассмотрим построение
СНВ двумя редакторами – СНВ и ФП. Для построения СНВ типа Сугено
необходимо в меню File выбрать пункт New FIS  Sugeno. Количество
входных и выходных переменных определяется так же, как и при
построении СНВ типа Мамдани.

Рис. 8.4. Окно средства просмотра правил вывода

Рис. 8.5. Окно просмотра поверхности решений


153
Редактор ФП. Для СНВ типа Сугено изменения касаются только
схемы определения ФП для выходных переменных. ИНЛ в среде MATLAB
позволяет разрабатывать два вида нечетких моделей. Первая модель – это
нечеткая модель Сугено нулевого порядка. Нечеткое правило вывода
имеет следующий вид:

if x is A and у is В then z = k,

где А и В – нечеткие множества антецедента; k – четко заданная константа


консеквента.
Для построения такой модели при добавлении ФП необходимо
выбрать тип – константа (constant) и задать в качестве параметра ФП
численное значение соответствующей константы. Вторая модель –
нечеткая модель Сугено первого порядка. Для нее нечеткое правило
вывода записывается следующим образом:

if x as A and у is В then z = p · x + q · y + r,

где р, q и r – константы.
В данном случае тип ФП – линейная зависимость (linear). Для
определения параметров ФП необходимо ввести вектор, элементы
которого соответствуют численным значениям констант консеквента.
Работа с редактором правил вывода, а также со средствами
просмотра правил и поверхности вывода выполняется аналогично случаю
построения СНВ по Мамдани.
Пример нечеткого вывода по Сугено с использованием нечеткой
модели нулевого порядка и правил вывода, определенных выше,
представлен на рис. 8.6 (выходная переменная имеет три значения: bad,
normal, good, которые задаются соответственно тремя константами –
0, 0.5, 1).

154
Рис. 8.6. Окно просмотра правил вывода (вывод по Сугено)

8.2. Индивидуальные задания

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


вычислительной техники или программирования и построить для нее
нечеткую систему с использованием графического интерфейса
пользователя, который обеспечивает доступ к инструментарию нечеткой
логики и редактору системы нечеткого вывода. При этом построение
нечеткой системы, в первом случае, должно основываться на принципе
Мамдани, а во втором, должно основываться на принципе Сугено.
2. При выполнении пункта 1 индивидуального задания задаться
различными диапазонами изменения входных и выходных переменных
нечеткой системы, а также разными типами ФП.
3. Построить графическое отображение правил вывода и
поверхности решений, сформулированной абстрактной ситуации.
4. Выполнить сравнительный анализ двух нечетких систем
построенных на принципе Мамдани и Сугено.
5. Оформите отчет по лабораторной работе.

155
Лабораторная работа 9

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

Цель лабораторной работы: получение и закрепление знаний о


методах проектирования нечетких контроллеров, формирование
практических навыков работы при управлении сложными объектами или
динамическими процесами.

9.1. Краткие сведения из теории

9.1.1. Введение в теорию нечеткого управления


Методы нечеткого вывода, кроме задач построения экспертных
систем, широко используются в разработке нечетких контроллеров.
Основное назначение контроллера – это управление объектом, при котором
поведение управляемого объекта описывается нечеткими правилами.
Пусть Y – основной параметр объекта;
Y* – желаемое значение параметра;
Е = [Y* – Y] – ошибка текущего состояния;
U – управляющее воздействие, вырабатываемое контроллером;
U(K) – значение управляющего воздействия;

U(K) = F(U(K – 1), ...,U(K –  ), E(K – 1), ..., E(K –  ));

 – глубина рассмотрения предыстории.


Обычно нечеткий контроллер работает с глубиной  = 1:

U(K) = F(U(K – 1), E(K – 1)); или U(K) = F(U(K – 1), ΔE(K – 1));

где ΔE – изменение ошибки, а правило формирования управляющего

156
воздействия задается с помощью базы нечетких правил. Обычно управляющее
воздействие учитывает предыдущее воздействие и последнее изменение
ошибки.
Процесс управления описывается набором переменных, относящихся
к классу лингвистических переменных. Сущности управляемого процесса
можно классифицировать как "входные переменные" и "выходные
переменные" процесса. В общем случае входные переменные определяют
зависящие от времени потоки, в то время как выходные описывают
моментальные состояния процесса. Входные переменные, которыми могут
управлять люди или компьютеры, называют управляемыми переменными
процесса. Управление в широком смысле означает манипулирование
процессом в контуре обратной связи с целью получения наилучшего
результата, т.е. получения оптимального значения определенных выходных
переменных.
Для управления необходимо:
1) определить текущие значения значимых выходных переменных;
2) сравнить текущие выходные значения с заданными целевыми
значениями;
3) подобрать значения управляемых переменных так, чтобы достичь
целевых значений;
4) повторять пункт 1 – 3 до тех пор, пока не будут получены целевые
значения.
Рассмотрим нечеткий контроллер, причем управляемый процесс
имеет три входные переменные с двумя управляемыми переменными (вход
2 и вход 3) и одной случайной переменной (вход 1), а также три выходные
переменные. Нечеткий контроллер согласно определенному алгоритму
преобразует три выходные переменные в две управляющие переменные,
которые затем возвращаются на объект управления. Сравнение выходных
значений с целевыми значениями выполняется самим контроллером.
В отличие от большинства стандартных контроллеров, использующих

157
математические вычисления, нечеткий контроллер применяет так
называемые правила, подобно человеку-оператору.
Пример 9.1. Правила управления:
 ЕСЛИ давление низкое, ТО открыть кран
(процесс химического производства).
 ЕСЛИ процент по кредиту высок, ТО сократить заимствования
(процесс финансового планирования).
 ЕСЛИ уровень потребления энергии низкий, ТО сократить
выходную мощность генератора (процесс управления мощностью).

Термины, набранные прямым шрифтом, – это имена объектных


переменных, слова, набранные курсивом, – нечеткие значения
соответствующих переменных. Подобные правила используются
человеком в процессе управления. Опытный оператор понимает значения
нечетких терминов: "давление низкое" или "немного открыть кран", в то
время как устройство автоматического контроля работает с четкими
значениями: выходные переменные многих технических процессов
обрабатываются аналого-цифровыми преобразователями, управляющие
переменные – цифро-аналоговыми преобразователями; оба вида устройств
сводятся к обработке цифровых значений.
Итак, чтобы реализовать нечеткий контроллер, необходимо:
 преобразовать четкие значения выходных переменных процесса
в нечеткие;
 использовать правила преобразования нечетких выходных
переменных в нечеткие значения управляющих;
 преобразовать нечеткие значения управляющих переменных в
четкие.
Для каждой переменной А процесса определим функцию
принадлежности (a, f ) , которая связывает любое четкое значение
переменной А с нечетким.
158
9.1.2. Правила и импликация
Правила
Правила в системе нечеткого контроллера имеют вид ЕСЛИ f0, ТО g0,
где f0 и g0 – любые фиксированные нечеткие значения некоторой выходной
переменной A и некоторой управляющей переменной В соответственно.

Пример 9.2. Нечеткий контроллер.


Пусть процесс содержит:
 три выходные переменные с нечеткими значениями:
1) давление (низкое, среднее, высокое);
2) температура (холодно, довольно тепло, тепло, горячо);
3) влажность (сухо, влажно, сыро);
 две управляющие переменные с нечеткими значениями:
1) подача воды (отсутствует, средняя, максимальная);
2) интенсивность нагрева (отсутствует, низкий, средний,
максимальный);
 два правила:
1) ЕСЛИ давление низкое ТО вентиль наполовину открыт.
Значение f0 – давление низкое означает, что нечеткое значение
выходной переменной "давление" низкое. Значение g0 – вентиль
наполовину открыт означает, что "вентиль" открыт наполовину.
2) ЕСЛИ температура холодно И влажность сыро ТО
нагреватель, максимальный.
Посылка правила f0 – температура холодно И влажность сыро
комбинирует нечеткие значения выходных переменных "температура" и
"влажность". Значение g0 – нагреватель, максимальный означает, что
нечеткое значение управляющей переменной "нагреватель" максимально.
Значение f0 в условной части правила может быть либо простым
нечетким значением одной выходной переменной, либо комбинацией
нечетких значений нескольких выходных переменных. Нечеткое значение

159
g0 в заключительной части правила почти всегда представляет простое
нечеткое значение только одной управляющей переменной.
Импликация
Правила, подобные "ЕСЛИ f0, ТО g0", в булевой логике называются
импликацией, где f0 и g0 – булевские сущности со значениями истинности 0
или 1. Формально импликацию записывают в виде f0  g0 каждой пары
значений, она возвращает результат согласно табл. 9.1.

Таблица 9.1 – Таблица истинности


f0 g0 f0  g0 НЕ f0 ˅ g0
0 0 1 1
0 1 1 1
1 1 1 1
1 0 0 0

Из табл. 9.1 видно, что операция f0  g0 эквивалентна (НЕ f0)  g0.


В нечеткой логике импликация нечетких значений f0 и g0, f0  g0
определяется как новое комбинированное нечеткое значение.
Например, нечеткая импликация: (НЕ f0) ИЛИ g0.
Функция принадлежности:

 (а, b, f0  g0) =  [a, b, (НЕ f0) ИЛИ g0] = S[1 –  (а, f0), n(b, g0)],

где а и b – любые два базовых значения объектных переменных A и В,


соответственно f0  А и g0  В,  (а, f0) и n(b, g0) – частичные функции
принадлежности А и В.
Сопоставление состояния процесса и правил нечеткого
контроллера
Рассмотрим процесс с выходной переменной А, управляющей
переменной В и правилом, связывающим нечеткие значения f0 сущности А
и g0 сущности В (табл. 9.2).

160
Таблица 9.2 – Характеристики управляемого процесса
Входная Управляющая
Значение
переменная А переменная В
Базовое значение {a} {b}
Нечеткое значение {f} {g}
Функция принадлежности μ(a, f) n(b, g)
Выбранное нечеткое значение f0  {f} b0  {g}
Представляющие четкие значения α(t)  {a} β  {b}
Правило ЕСЛИ f0 ТО b0 Не существует

В любое время t четкое значение α(t) выходной переменной А


сопоставляется с нечетким значением f0, т.е. с функцией принадлежности
 (α, f0), и в любое время t, и для любого четкого значения b управляющей
переменной В пара (α, b) сопоставляется с правилом f0  g0 = (НЕ f0) ИЛИ
g0 с принадлежностью

 (α, b, f0  g0) = S[1 –  (α, f0), n(b, g0)].

Согласно условию необходимо рассмотреть конъюнкцию нечеткого


значения и правила, а именно f0 И [f0  g0] = f0 И [(НЕ f0) ИЛИ g0].
В любое время t и для всякого четкого значения b от множества В
пара (α, b) принадлежит новому нечеткому множеству с принадлежностью

 (α, b, f0 И [(НЕ f0) ИЛИ g0]) = T{  (α, f0), S[1 –  (α, f0), n(b, g0)]}.

Для фиксированного времени t и фиксированного значения α(t)


указанная функция зависит от b.

Выбор четкого значения управляющей переменной


Для любого фиксированного t = t0 четкое значение b = β(t0).
Управляющая переменная В выбирается так, чтобы значение
принадлежности пары [α(t0), b], т. е. значение выражения

161
 (b) = f0 И [(НЕ f0) ИЛИ g0] = T{  (α, f0), S[1 –  (α, f0), n(b, g0)]}

было максимально для b = β(t) = bmax.


Рассмотрим использование функции  (b) в ситуации, когда выход
процесса соответствует условной части правила.
Допустим, что выходная переменная имеет необходимое значение с
высокой достоверностью. Это означает, что  ≈ 1, и следовательно,  (b) ≈
≈ Т{1, S[0, п(b, g0)]} = T{1, n(b, g0)]) = п(b, g0). Согласно закону управления
значение b должно быть выбрано так, чтобы принадлежность n(b, g0) была
максимальной.
Рассмотрим ситуацию, в которой выход процесса более или менее
соответствует правилу.
Допустим, что значения выходных переменных процесса более или
менее приемлемы (µ  0,5), тогда

S[1 –  , n(b, g0)]  max[1 –  , n(b, g0)]  0,5  

и, следовательно,

 (b) = Т{  , S[1 –  , n(b, g0)]}  min {  , S[1 –  , n(b, g0)]}   .

Чем меньше значение  , тем ниже степень принадлежности  (b) для


любого b, поэтому выбор b в меньшей мере обоснован, следовательно,
правило определения управляющей переменной только более или менее
приемлемо.
Рассмотрим ситуацию – выход процесса неудовлетворителен (  ≈ 0).
Функция  (b) ≈ Т{0, S[1, п(b, g0)]} = Т{0, 1} = 0 независимо от b, и
выбор b не подходит для любого значения. Согласно ежедневному опыту
правила, условия которых не удовлетворяются, не используют.

162
9.1.3. Комбинирование условий
Правила с комбинированием условий подобны следующим

ЕСЛИ давление низкое ИЛИ давление среднее ТО вентиль открыт


или
ЕСЛИ температура холодно И влажность сыро ТО нагреватель,
максимальный

обрабатываются аналогично. Не имеет значения, комбинируются ли


условия, ссылающиеся на одну или более выходных переменных. Во всех
случаях для четких выходных значений α1(t), ..., αN(t) во время t
определяется степень принадлежности µ(α1(t), …, αN(t), f0) к
комбинированному нечеткому значению f0. Далее вычисления проводятся
следующим образом: определяется функция ρ(b) = Т{µ(α1(t), …, αN(t), f0),
п(b, g)}, и находится оптимальное значение b.

9.1.4. Накопление результатов и дефазификация


Агрегация результатов нескольких правил
Рассмотрим множество правил вождения автомобиля.
Пример 9.3. Агрегация результатов правил:
ЕСЛИ до препятствия близко ТО скорость медленно.
ЕСЛИ время мало ТО скорость быстро.
ЕСЛИ дата конец недели ТО скорость быстро.
ЕСЛИ топливо пусто ТО скорость стоп.
ЕСЛИ средства мало ТО скорость экономия.

Все правила содержат выходную переменную "скорость" с нечеткими


значениями "стоп", "медленно", "экономия" и "быстро".
Выполнение правил может привести к несогласованным или
противоречивым заключениям, зависящим от того, какие условия работали

163
в определенной ситуации. Если, например, время и деньги малы
одновременно, должен ли автомобиль ехать "быстро" и "экономно"? Если
используется несколько правил одновременно, необходимо решить, какое
из них выполняется. Операция ИЛИ в этом контексте означает
"исключительное ИЛИ".
Правило с условием f0 и заключением g0 эквивалентно нечеткому
значению (f0 И g0). В любое время t и при определенном b четкое выходное
значение процесса получается из функций принадлежности
ρ(b) = Т{µ(α1(t), …, αN(t), f0), п(b, g)} для f0 И g0. Приведем несколько
правил, которые выполняются вместе и эквивалентны комбинации
нечетких значений:

(f1 И g1) ИЛИ (f2 И g2) ИЛИ ... ИЛИ (fN И gN)

с функциями принадлежности ρ(b) = S{ρ1(b), ρ2(b), .... ρN(b)}, где

ρ1(b) = Т{µ(α1(t), …, αN(t), f0), п(b, g1)};


ρ2(b) = Т{µ(α1(t), …, αN(t), f0), п(b, g2)};
…………………………………………
ρN(b) = Т{µ(α1(t), …, αN(t), f0), п(b, gN)}.

В рассмотренном выше выражении ρ(b) = S{ρ1(b), ρ2(b), .... ρN(b)} в


любое фиксированное время t функция b отличается от оптимального
значения b = β.
Дефазификация
Далее рассмотрим, как получить четкое оптимальное значение β
управляющей переменной b. Эта процедура называется дефазификацией и
является последним шагом каждого управляющего цикла в нечеткой
системе. В общем случае переменная b = β имеет частичную функцию
принадлежности

164
ρ(b) = S{ρ1(b), ρ2(b), .... ρN(b)} = S{Т [µ(α1(t), п(b, g1)], Т [µ(α2(t), п(b, g2)], …,
Т[µ(αN(t), п(b, gN)]}.

Для дефазификации нечеткого результата на практике используют


три метода, которые рассмотрим ниже.
Метод максимальной высоты. Применяется, если функция ρ(b) имеет
определенный абсолютный максимум, как некоторое значение b = bmах, при
котором ρ(bmах) > ρ(b) для всех b. Преимущество метода заключается в
простоте применения, а недостаток состоит в том, что функция ρ(b) не
рассматривается во всей области определения, а только в максимальных
позициях, что может привести к неприемлемым результатам.
Метод среднего максимума. Если функция ρ(b) имеет несколько
относительных максимумов, то можно взять взвешенное среднее.
Учитывая общую форму выражения ρ(b), этот метод лучше предыдущего.
Он также применим, если ρ(b) постоянна на определенных интервалах b
(что часто случается на практике), так как можно взять центры каждого
такого интервала как "относительные локальные максимумы" и усреднить
затем эти значения.
Метод центра гравитации. Графическое представление функции ρ(b)
в декартовых координатах – это кривая, которая вместе с осью абсцисс X,
верхней и нижней границами b ограничивает плоскую область. Абсцисса β
центра гравитации такой фигуры берется как желаемый оптимум

d d
M   b   (b) db , F    (b) db , bopt=M/F.
c c

Если ρ(b) определяется только для дискретных значений b (так


называемые синглетоны), то вычисление центра гравитации
модифицируется следующим образом:

165
M   bn   (bn ) db , F    (bn ) db , bopt=M/F.
n n

9.2. Нечеткие системы управления динамическими процессами

9.2.1. Моделирование качения шара по качели


Ввод команды slbb в окне Command Window пакета MATLAB
приводит к появлению в окне Simulink структурной схемы нечеткой
системы управления (рис. 9.1). Задачей управления в данном случае
является поддержание такого состояния перекатывающегося на качелях
шара, при котором он не мог бы с них скатиться.

Рис. 9.1. Структурная схема нечеткой системы управления

Запуск моделирования приводит к появлению анимационной


картинки (рис. 9.2), иллюстрирующей как представленная система,
вырабатывая управляющие воздействия, "подталкивающие" то левую, то
правую половину качелей, не дает шарику скатиться с них. Точка толчка
отображается вершиной треугольника, перемещаемого вдоль коромысла
качелей.
166
Рис. 9.2. Динамическая система "шар на качели"

При желании пользователь может просмотреть основные сигналы


системы (рис. 9.3).

Рис. 9.3. Основные сигналы системы – значение требуемого и текущего


местоположения шара на качеле
167
Двойной щелчок мышью на блоке диаграммы модели позволяет
вывести окно с параметрами соответствующего блока. Так, на рис. 9.4
показано такое окно для блока нечеткой логики. Нетрудно заметить, что он
характеризуется единственным параметром – именем файла, задающим
структуру блока.

Рис. 9.4. Окно блока нечеткой логики

Список Target Position (рис. 9.2) позволяет выбрать одно из четырех


видов воздействий:
 Sinusoid Wave – синусоидальная волна;
 Square Wave – прямоугольная волна;
 Saw Wave – треугольная волна;
 Mouse-Driver – воздействие, задаваемое мышью.
Опция Show Trails, позволяющая накапливать изменения положения
шара, коромысла качелей и точки воздействия на них. Благодаря этому
можно получить более четкое представление о динамике работы
анализируемой системы. Пример накопления информации о положении
шара, коромысла качелей и точек воздействия приведен на рис. 9.5.

9.2.2. Моделирование отскоков шара от качелей


Похожий на описанный выше пример с названием juggler имитирует
более сложное движение шара (рис. 9.6).

168
Рис. 9.5. Иллюстрация управляемого объекта в режиме накопления

Рис. 9.6. Динамика отскоков шара при использовании нечеткой логики

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

Рис. 9.7. Динамика отскоков шара при использовании математической


модели

Наряду с окном модели, в этом примере выводится окно контроля


Rule Viewer, показанное на рис. 9.8. Оно позволяет уточнить параметры
отскоков шарика.
Данный пример реализован без применения Simulink. Код МATLAB

170
реализующей его программы можно просмотреть, активизировав мышью
гиперссылку View code for juggler в окне демонстрации этого примера.
Программа занимает немного больше 700 строк и просматривается в
редакторе программ системы МATLAB.

Рис. 9.8. Окно контроля Rule Viewer

9.2.3. Система управления смесителем воды


Ввод команды shower в окне Command Window пакета MATLAB
приводит к появлению в окне Simulink структурной схемы нечеткой
системы управления смесителем холодной и горячей воды.
С работой смесителя холодной и горячей воды мы сталкиваемся
практически ежедневно. Если напор воды постоянен, то особой
необходимости в управлении этим простым устройством нет – достаточно
ручку смешения установить в нужное положение и проконтролировать

171
рукой температуру воды. Но, если напор воды постоянно меняется, то без
автоматического регулятора температуры не обойтись. В
демонстрационном примере рассматривается замкнутая система
регулирования температуры с использованием нечеткой логики. Simulink-
диаграммы системы приведены на рис. 9.9.

Рис. 9.9. Simulink-диаграммы системы управления смесителем воды

В системе предусмотрен контроль температуры воды, как при


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

9.2.4. Система управления перевернутым маятником.


Ввод команды slcp1 в окне Command Window пакета MATLAB
приводит к появлению в окне Simulink структурной схемы нечеткой
системы управления перевернутым маятником (рис. 9.10).

172
Рис. 9.10. Структурная схема нечеткой системы управления
"перевернутый маятник"

Запуск моделирования приводит к появлению анимационной


картинки (рис. 9.11) иллюстрирующей перемещение в пространстве
динамической системы "перевернутый маятник".

9.2.5. Система управления двумя перевернутыми маятниками


Ввод команды slcpp1 в окне Command Window пакета MATLAB
приводит к появлению в окне Simulink структурной схемы нечеткой
системы управления двумя перевернутыми маятниками (рис. 9.12).
Запуск моделирования приводит к появлению анимационной
картинки (рис. 9.13), иллюстрирующей перемещение в пространстве
динамической системы "перевернутые маятники".
173
Рис. 9.11. Динамическая система "перевернутый маятник"

Рис. 9.12. Структурная схема нечеткой системы управления

174
Рис. 9.13. Динамическая система "перевернутые маятники"

9.3. Индивидуальные задания

1. Необходимо изучить методы построения нечетких контроллеров


средствами нечеткой логики и блоков моделирования Simulink.
2. Промоделировать в Simulink все пять нечетких контроллеров,
которые управляют различными динамическими процессами.
3. Получить и привести в отчете словесное описание и графическое
отображение правил нечеткого вывода рассмотренных нечетких
регуляторов.
4. Описать условия и определить параметры системы, при которых
происходит "срыв" управления всех пяти нечетких контроллеров, которые
управляют различными динамическими процессами.
5. Оформите отчет по лабораторной работе.

175
Лабораторная работа 10

РЕГУЛИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ НЕЧЕТКОГО


КОНТРОЛЛЕРА

Цель лабораторной работы: получение и закрепление знаний,


формирование практических навыков работы с методами построения
нечетких контроллеров средствами инструментария нечеткой логики
(Fuzzy Logic) и блоков моделирования Simulink пакета MATLAB.

10.1. Краткие сведения из теории

Пакет нечеткой логики для системы MATLAB – это пакет


прикладных программ, относящихся к теории нечетких множеств и
позволяющих конструировать так называемые нечеткие экспертные и
управляющие системы. Основные возможности пакета:
1. Построение систем нечеткого вывода (экспертных систем,
регуляторов, аппроксиматоров зависимостей).
2. Построение адаптивных нечетких систем (гибридных нейронных
сетей).
3. Интерактивное динамическое моделирование в Simulink.
В состав программных средств Fuzzy Logic Toolbox входят
следующие основные программы, имеющие графический интерфейс,
редактор нечеткой системы вывода Fuzzy Inference System Editor (FIS-
редактор) вместе со вспомогательными программами: редактором функций
принадлежности (Membership Function Editor), редактором правил (Rule
editor), просмотрщиком правил (Rule Viewer) и просмотрщиком
поверхности отклика (Surface Viewer). FIS-редактор запускается из
командной строки командой Fuzzy.

176
Системы нечеткого вывода, созданные тем или иным образом с
помощью пакета Fuzzy Logic Toolbox, допускают интеграцию с
инструментами пакета Simulink, что позволяет выполнять моделирование
систем в рамках последнего.
Рассмотрим пример построения нечеткого контроллера средствами
инструментария нечеткой логики (ИНЛ) Fuzzy Logic и блоков
моделирования Simulink, который осуществляет контроль уровня воды в
баке. На рис. 10.1 изображен объект управления в виде бака с водой, к
которому подходят две трубы: через одну трубу, снабженную краном, вода
затекает в бак, через другую – вытекает.

Рис. 10.1. Схематическое представление объекта управления (бак с водой)

Подачу воды в бак можно регулировать, больше или меньше


открывая кран. Расход воды является неконтролируемым и зависит от
диаметра выходной трубы (он фиксирован) и от текущего уровня воды в
баке. Если понимать под выходной (регулируемой) переменной уровень
воды, а под регулирующим элементом – кран, то можно отметить, что
подобный объект регулирования, с точки зрения его математического
описания, является динамическим и нелинейным.

177
Определим цель управления здесь как установление уровня воды в
баке на требуемом (изменяющемся) уровне и попробуем решить
соответствующую задачу управления средствами нечеткой логики.
Очевидно, в регулятор, обеспечивающий достижение цели
управления, должна поступать информация о несоответствии (разности)
требуемого и фактического уровней воды, при этом данный регулятор
должен вырабатывать управляющий сигнал на регулирующий элемент
(кран).
Порядок построения нечеткого контроллера:
1. Задать для каждой из входных и выходных переменных функции
принадлежности.
2. Разработать базу правил для реализуемой нечёткой системы.
3. Выбрать алгоритм нечёткого логического вывода (Мамдани или
Сугено) и выполнить анализ результатов работы созданной системы.
В первом приближении функционирование регулятора можно
описать набором из следующих правил:
1. If (level is okay) then (valve is no_change);
2. If (level is low) then (valve is open_fast);
3. If (level is high) then (valve is close_fast);
4. If (level is okay) and (rate is positive) then (valve is close_slow);
5. If (level is okay and (rate is negative) then (valve is open_slow),
что в переводе означает:
1. ЕСЛИ уровень соответствует заданному, ТО кран без изменения;
2. ЕСЛИ уровень низкий, ТО кран быстро открыть;
3. ЕСЛИ уровень высокий, ТО кран быстро закрыть;
4. ЕСЛИ уровень соответствует заданному И его прирост –
положительный, ТО кран надо медленно закрывать;
5. ЕСЛИ уровень соответствует заданному И его прирост –
отрицательный, ТО кран надо медленно открывать.

178
10.1.1. Формирование функции принадлежности
Командой Fuzzy запустить FIS-редактор. По умолчанию
предлагается алгоритм вывода типа Мамдани. Поскольку в системе
должно быть два входа, то через пункт меню Edit/Add input надо добавить
в систему второй вход (в окне редактора появляется второй желтый блок с
именем input2). Делая далее однократный щелчок на блоке input1,
изменить его имя на "level", завершая ввод нового имени нажатием
клавиши <Enter>. Аналогичным образом установить имя "rate" блоку
input2 и "valve" – выходному блоку (справа вверху) output1. Присвоить имя
всей системе, например "LevelControl", выполнив это через пункт меню
File/Save to Workspace. Вид окна редактора после указанных действий
приведен на рис. 10.2.

Рис. 10.2. Вид окна FIS-редактора после задания структуры системы

179
Для того чтобы сформировать функции принадлежности для
переменных, следует выбрать пункт меню View/Edit membership functions и
задать параметры системы в соответствии с табл. 10.1. Здесь используются
следующие функции. Гауссова функция Gaussmf имеет вид

y = Gaussmf(x, [c, σ]) = exp(– (x – c)2 / (2σ)2).

Функция треугольной формы Trimf определяется следующим


образом:
0, x  a ,
x  a
 b  a , a  x  b ,
f ( x ,a ,b ,c )  
cx
 , b  x  c,
 c  b
0, x  c.

Таблица 10.1 – Параметры функций принадлежности для


переменных level, rate, valve
Название Название
входных функции Тип функции принадлежности
переменных принадлежности
High Gaussmf [0,3; –1]
level Okay Gaussmf [0,3; 0]
Low Gaussmf [0,3; 1]
Negative Gaussmf [0,03; –0,1]
rate None Gaussmf [0,03; 0]
Positive Gaussmf [0,03; 0,1]
Close_fast Trimf [–1; –0,9; –0,8]
Close_low Trimf [–0,6; –0,5; –0,4]
valve No_change Trimf [–0,1; 0; 0,1]
Open_low Trimf [0,2; 0,3; 0,4]
Open_fast Trimf [0,8; 0,9; 1]

Сформировать правила вывода, используя Rule Editor. Для этого


надо ввести соответствующие правила из подраздела 10.1, как показано на
рис. 10.3.
180
Рис. 10.3. Окно редактора правил

Открыть через пункт меню View/View rules окно просмотра правил и


установить значения переменных level и rate. Результат для выхода valve
должен быть показан так же, как на рис. 10.4.

Рис. 10.4. Окна просмотра правил в задаче при level = 0 и rate = 0


181
Открыть через пункт меню View/View surface окно просмотра
графической зависимости выходной переменной от входных.
При необходимости можно выполнить экспорт и импорт
результатов. При использовании пунктов меню File/Save to disk на диске
создается текстовый (ASCII) файл с расширением fis. Его можно
просматривать, при необходимости редактировать вне системы MATLAB,
а также использовать повторно при последующих сеансах работы с
системой.

10.1.2. Создание пользовательских функций принадлежности


Если ни одна из встроенных функций принадлежности не подходит
для решаемой задачи, то можно определить и использовать собственную
функцию. Такая функция должна быть создана как M-файл, возвращать
значение в диапазоне от 0 до 1 и иметь число аргументов не более 16.
Объявление функции (например, custmf) выполняется в следующей
последовательности:
1. Создать файл с именем cutmf.m.
2. Выбрать пункт меню Edit/Add custm MF в меню редактора
функций принадлежности.
3. В поле М-File function появившегося диалогового окна Add
customized membership function ввести имя созданного M-файла (custmf).
4. В поле Parameter List данного окна ввести необходимые числовые
параметры.
5. В поле MF name ввести какое-либо уникальное имя задаваемой
функции, например, polymf.
6. Завершение определения функции подтверждается нажатием
кнопки <ok> (рис. 10.5).

182
Рис. 10.5. Окно задания функции принадлежности пользователя

10.1.3. Модель системы управления уровнем воды в баке


Модель системы управления уровнем воды в баке с нечетким
регулятором изображена на рис. 10.6.

Рис. 10.6. Блок-диаграмма модели системы управления уровнем воды в


баке с нечетким регулятором

При этом настраиваемые параметры основных блоков системы


управления уровнем воды в баке с нечетким регулятором (рис. 10.6) имеют
значения, приведенные на рис. 10.7.
Запуск анимации осуществляется командой Start меню Simulation.
После этого появится анимационное окно (окно Tank Demo на рис. 10.1).

183
Текущий уровень воды показан черным цветом. Необходимый уровень
воды отмечен черной линией. Анимация запускается автоматически по
открытию окна.

Рис. 10.7. Настраиваемые параметры основных блоков системы


управления уровнем воды в баке

184
Нечеткий контроллер реализован системой нечеткого вывода с двумя
входами: разница между требуемым и текущим уровнями воды и скорость
изменения этой разницы. Временные диаграммы требуемого и текущего
уровней воды показаны в окне Scope1 (рис. 10.8) светлой и темной
линиями соответственно. В окне change scope (рис. 10.9) приведена
временная диаграмма скорости изменения разности требуемого и текущего
уровней воды. Эти окна открываются по нажатию кнопки мыши по
пиктограммам Scope1 и change scope в Simulink-модели системы "Водяной
бак с нечетким контроллером". Пользователь может аналогичным образом
вывести на экран временные диаграммы расхода воды (Scope4) и сигнала
переполнения бака (Scope2).

Рис. 10.8. Диаграмма требуемого и текущего уровней воды

Как видно из рисунка, переходный процесс в системе имеет


апериодическую форму и заканчивается достаточно быстро, т.е. качество
регулирования следует признать хорошим.
Нечеткий контроллер использует пять правил для расчета
управляющего воздействия (рис. 10.10).

185
Рис. 10.9. Временная диаграмма скорости изменения разности требуемого
и текущего уровней воды

Рис. 10.10. Нечеткие правила для расчета управляющего воздействия

Для лингвистической оценки входной переменной level (разница


между требуемым и текущим уровнями воды) используются три терма с
гауссовыми функциями принадлежности, для оценки входной переменной
rate (скорость изменения разницы между требуемым и текущим уровнями
воды) – два терма с гауссовыми функциями принадлежности и для
выходной переменной valve (изменение положения вентиля) – пять термов

186
с треугольными функциями принадлежности. Для просмотра нечеткого
контроллера в Simulink-формате (рис. 10.11) необходимо щелкнуть правой
кнопкой мыши по блоку Fuzzy Controller (см. рис. 10.6) и в появившемся
меню выбрать команду Look under mask. Затем в новом графическом окне
Link: sltankrule/Fuzzy Logic Controller with Ruleviewer (рис. 10.12) щелкнуть
правой кнопкой мыши по блоку Fuzzy Logic Controller и снова в
появившемся меню выбрать команду Look under mask. Затем в новом
графическом окне Link: sltankrule/Fuzzy Logic Controller with
Ruleviewer/Fuzzy Logic Controller щелкнуть правой кнопкой мыши по
блоку FIS Wizard и снова в появившемся меню выбрать команду Look
under mask.

Рис. 10.11. Нечеткий контроллер уровня воды в баке в Simulink-формате

Рис. 10.12. Структура блока Fuzzy Logic Controller with Ruleviewer

187
Можно попытаться изменить характер функционирования системы,
внося, например, с помощью рассмотренных программ с графическим
интерфейсом (типа FIS редактора и т.п.) определенные изменения в
систему, задаваемую файлом tank.fis (изменяя правила, функции
принадлежности, метод приведения к четкости и т. д.). Разумеется, все это
лучше делать, остановив процесс моделирования.
Выполнив (в режиме командной строки) команду sltankrule, можно
перейти к блок-диаграмме той же системы управления, но с нечетким
регулятором и просмотрщиком правил (Fuzzy Logic Controller with
Ruleviewer).

10.2. Индивидуальные задания

1. Необходимо изучить методы построения нечетких контроллеров


средствами инструментария нечеткой логики и блоков моделирования
Simulink.
2. Промоделировать нечеткий контроллер, управляющий уровнем
воды в баке, в Simulink.
3. Получить и привести в отчете словесное описание и графическое
отображение правил нечеткого вывода построенного регулятора.
4. Описать принцип работы схемы и пояснить полученные
результаты.
5. Внести изменения в правила нечеткого вывода и объяснить, как
внесенные изменения повлияют на работу всего устройства.
Следующие параметры являются общими для всех вариантов
(табл. 10.2).
Индивидуальные варианты заданий для функций принадлежности
переменной level приводятся в табл. 10.3. В ней используются следующие
обозначения:
exp(a0  ...  an x n )
polymf ( x , A)  ; A  a0 , a1,...,an .
1  exp(a0  ...  an x n )
188
Таблица 10.2 – Параметры функций принадлежности для
переменных valve и ratre
Название Название
входных функции Тип функции принадлежности
переменных принадлежности
Close_fast Trimf [–1; –0,9; –0,8]
Close_low Trimf [–0,6; –0,5; –0,4]
valve No_change Trimf [–0,1; 0; 0,1]
Open_low Trimf [0,2; 0,3; 0,4]
Open_fast Trimf [0,8; 0,9; 1]
rate Negative Gaussmf [0,03; –0,1]
None Gaussmf [0,03; 0]
Positive Gaussmf [0,03; 0,1]

Таблица 10.3 – Параметры функции принадлежности для


переменной level
№ High Okay Low
polymf ( x , A) polymf ( x , A) polymf ( x , A)
1 2 3 4
1 [–3,535; –2,925; 4,293] [1,604; –1,723; -9,023] [–2,908; 2,732; 3,256]
2 [–2,591; –2,978; 3,049] [2,284; 0,697; –8,499] [–3,724; 3,836; 4,227]
3 [–3,252; –3,353; 3,829] [2,104; 0,967; –9,367] [–3,238; 1,977; 3,823]
4 [–4,149; –2,777; 5,561] [1,638; 0,4058; –8,782] [–2,559; 2,687; 2,4026]
5 [–3,553; –3,939; 5,266] [1,443; –0,218; –6,373] [–3,323; 3,4241; 2,833]
6 [–2,916; –2,883; 2,781] [1,736; –0,234; –6,048] [–2,696; 3,001; 2,9796]
7 [–2,241; –2,435; 2,177] [2,094; 0,2477; –9,948] [–1,733; 2,522; 2,3055]
8 [–3,9789; –2,825; 4,47] [1,941; –0,189; –8,253] [–2,441; 2,131; 2,3544]
9 [–2,503; –2,979; 2,271] [1,968; 1,24; –10,8512] [–2,441; 2,131; 2,3543]
10 [–2,526; –2,787; 2,974] [2,444; 0,9028; –15,06] [–3,326; 3,185; 4,0171]
11 [–3,691; –3,016; 3,816] [1,038; 0,8638; –8,122] [–2,742; 2,483; 3,4183]
12 [–2,952; –3,167; 3,316] [1,706; –1,023; –6,489] [–2,764; 2,392; 2,5585]
13 [–3,124; –3,482; 3,972] [0,941; –0,3953; –5,63] [–3,134; 2,372; 3,4613]
14 [–3,662; –3,621; 5,183] [1,869; –0,291; –8,634] [–2,95; 3,132; 3,24231]
15 [–3,113; –2,659; 2,983] [2,038; –2,138; –11,24] [–3,407; 2,763; 3,8331]

6. Оформите отчет по лабораторной работе.

189
Лабораторная работа 11

СИМВОЛИЧЕСКИЕ ВЫЧИСЛЕНИЯ В ПАКЕТЕ MATLAB

Цель лабораторной работы: получение и закрепление знаний,


формирование практических навыков работы с пакетом MATLAB при
вычислениях в символическом виде.

11.1. Краткие сведения из теории

11.1.1. Символические переменные и функции


В состав MATLAB входит ToolBox Symbolic Math, предназначенный
для вычислений в символическом виде. Преобразование выражений,
определение аналитических решений задач линейной алгебры,
дифференциального и интегрального исчисления, получение численных
результатов с любой точностью  далеко не полный перечень
возможностей, предоставляемых ToolBox.
Символические переменные и функции являются объектами класса
sym object, в отличие от числовых переменных, которые содержатся в
массивах double array. Символический объект создается при помощи
функции syms. Команда

» syms x a b

создает три символические переменные x, a, b. Конструирование


символических функций от переменных класса sym object производится с
помощью обычных арифметических операций и обозначений для
встроенных математических функций, например:

» f=(sin(x)+a)^2*(cos(x)+b)^2/sqrt(abs(a+b))

190
f=
(sin(x)+a)^2*(cos(x)+b)^2/abs(a+b)^(1/2)

Запись формулы в одну строку не всегда удобна, более естественный


вид дроби позволяет получить функция pretty:

» pretty(f)
2 2
(b + cos(x)) (a + sin(x))
---------------------------
1/2
|a + b|

Определенная функция f также является символической, в чем не


трудно убедиться при помощи команды whos.
Имеющиеся символические переменные и функции позволяют
образовывать новые символические выражения:

» syms y
» g=(exp(-y)+1)/exp(y)
g =
(exp(-y)+1)/exp(y)
» h=f*g
h =
(sin(x)+a)^2*(cos(x)+b)^2/abs(a+b)^(1/2)*(exp(-y)
+1)/exp(y)

» pretty(h)
2 / 1 \ 2
(b + cos(x)) | ------ + 1 | (a + sin(x))
\ exp(y) /
------------------------------------------
1/2
exp(y) |a + b|
191
Символическую функцию можно создать без предварительного
объявления переменных при помощи функции sym, входным аргументом
которой является строка с выражением, заключенным в апострофы:

» z=sym('c^2/(d+1)')
z =
c^2/(d+1)
» pretty(z)
2
c
-----
d + 1

Замечание 1
Функция sym может быть использована для объявления
символических переменных. Команда syms a b с эквивалентна
последовательности команд a = sym('a'), b = sym('b'), с = sym('c'):

» syms a b c
» whos a b c
Name Size Bytes Class
a 1x1 126 sym object
b 1x1 126 sym object
c 1x1 126 sym object
Grand total is 6 elements using 378 bytes
» a1=sym('a1'), b1=sym('b1'), c1=sym('c1')
a1 =
a1
b1 =
b1
c1 =
c1
192
» whos a1 b1 c1
Name Size Bytes Class
a1 1x1 128 sym object
b1 1x1 128 sym object
c1 1x1 128 sym object
Grand total is 9 elements using 384 bytes

При работе в области комплексных чисел следует указать, что


определяемые переменные являются в общем случае комплексными.
Комплексные символические переменные задаются командой syms с
опцией unreal. Опция real означает, что переменные трактуются как
вещественные.
Рассмотрим пример, где результат символических вычислений
зависит от того, какие символические переменные используются 
вещественные или комплексные. Объявим две вещественные переменные
a и b и образуем комплексное число, считая, что a является
действительной частью, а b  мнимой, затем найдем сопряженное к нему
число при помощи conj:

» syms a b real
» p=conj(a+i*b)
p = a-i*b

Произведем аналогичные действия, предварительно объявив a и b


комплексными символьными переменными

» syms a b unreal
» q=conj(a+i*b)
q = conj(a+i*b)

Таким образом, в общем случае p  q.

193
Символические переменные могут являться элементами векторов и
матриц. Элементы строк матриц при вводе отделяются пробелами или
запятыми, а столбцов  точкой с запятой, так же как и при вводе обычных
матриц. В результате образуются символические матрицы и векторы, к
которым применимы матричные и поэлементные операции, а также
встроенные функции. Рассмотрим пример ввода и умножения двух
символических матриц:

» syms a b c d e f g h
» A=[a b;c d]
A =
[ a, b]
[ c, d]
» B=[e f; g h]
B =
[ e, f]
[ g, h]
» C=A*B
C =
[ a*e+b*g, a*f+b*h]
[ c*e+d*g, c*f+d*h]

Функция sym позволяет преобразовывать значения числовых


переменных в символические. Введите числовую матрицу A и
преобразуйте ее в символическую матрицу B:

» A=[1.3 -2.1 4.9; 6.9 3.7 8.5]


A =
1.3000 -2.1000 4.9000
6.9000 3.7000 8.5000

194
» B=sym(A)
B =
[ 13/10, -21/10, 49/10]
[ 69/10, 37/10, 17/2]

При переходе от числовых выражений к символическим


используется запись числа в виде рациональной дроби. Использование
рациональных дробей при выполнении символических вычислений
позволяет всегда получать точный результат, не содержащий погрешности
округления. Убедиться в этом можно на следующем простом примере.
Установите формат long для отображения максимально возможного числа
значащих цифр для значений числовых переменных и найдите сумму
чисел 1010 и 1010

» format long
» 1.0e10+1.0e-10
ans =
1.000000000000000e+010

Теперь преобразуйте числа в символические переменные и снова


вычислите сумму:

» large=sym(1.0e10);
» small=sym(1.0e-10);
» s=large+small
s = 100000000000000000001/10000000000

Рациональная дробь является точным значением суммы. Понятно,


что символические вычисления требуют больших временных затрат по
сравнению с обычными.

195
Вычисление символических выражений производится с помощью
функции vpa, например

» c=sym('sqrt(2)');
» cn=vpa(c)
cn =
1.4142135623730950488016887242097

По умолчанию сохраняется тридцать две значащие цифры. Второй


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

» cn=vpa(c,45)
cn =
1.41421356237309504880168872420969807856967187

Выходное значение функции vpa является символической


переменной, но его можно использовать в обычных вычислениях,
например

» cn=vpa(c,45)
cn =
1.41421356237309504880168872420969807856967187
» cn+2
ans =
3.41421356237309504880168872420969807856967187
» cn*2
ans =
2.82842712474619009760337744841939615713934375

196
Результат арифметических операций в этих случаях получается в
символических переменных. Для перевода символических переменных в
числовые, т.е. переменные типа double array, используется функция double:

» cnd=double(cn)
cnd = 1.41421356237310

Визуализация символических функций одной переменной


осуществляется при помощи ezplot. Самый простой вариант использования
ezplot состоит в указании символической функции в качестве
единственного входного аргумента, при этом в графическое окно
выводится график функции на отрезке [2, 2]. Например:

» f=sym('x*sin(x^2)^3');
» ezplot(f)

Обратите внимание (рис. 11.1), что автоматически создается


соответствующий заголовок.

Рис. 11.1. График символической функции

197
Вторым аргументом может быть задан вектор с границами отрезка, на
котором требуется построить график функции:

» ezplot(f,[-9 7])

Функция ezplot имеет некоторые отличия от своего аналога 


функции fplot, применяемой к числовым функциям. В частности, возможно
указание символической функции, зависящей от двух аргументов:

» z=sym('x^2+a^3');
» ezplot(z,[-2 1 -3 4])

Пределы изменения аргументов определяются их названиями.


Первые два числа соответствуют первому по алфавиту аргументу, а
последние  второму. В рассматриваемом примере a изменяется от 2 до 1,
а x изменяется от 3 до 4. В графическое окно выводится линия,
удовлетворяющая выражению x^2+a^3=0.
ToolBox Symbolic Math предоставляет пользователю целый набор
средств для визуализации символических функций [1, 2].

11.1.2. Упрощение и преобразование выражений


Сложные алгебраические и тригонометрические выражения часто
могут быть приведены к эквивалентным путем упрощения. ToolBox
Symbolic Math имеет целый ряд сервисных функций, предназначенных для
различных преобразований символических выражений. Операции с
полиномами реализуют четыре функции: collect, expand, factor, horner.
Вычисление коэффициентов при степенях независимой переменной
производится с помощью функции collect. Введите полином и отобразите
его в командном окне при помощи pretty:

198
» p=sym('(x+a)^4+(x-1)^3-(x-a)^2-a*x+x-3');
» pretty(p)
3 4 2
x + (x - 1) - a x + (a + x) - (a - x) - 3

Затем примените к полиному функцию collect:

» pc=collect(p);
» pretty(pc)
4 3 2 2
x + (4 a + 1) x + (6 a - 4) x +
3 4 2
+ (4 a + a + 4) x + a - a - 4

По умолчанию в качестве независимой переменной в полиноме


выбирается x, однако можно считать, что a  независимая переменная, а x
входит в коэффициенты полинома, зависящего от a. Второй аргумент
функции collect предназначен для указания переменной, при степенях
которой следует найти коэффициенты:

» pca=collect(p,'a');
» pretty(pca)
4 3 2 2 3
a + (4 x) a + (6 x - 1) a + (4 x + x) a + x +
3 2 4
+ (x - 1) - x + x - 3

Функция expand представляет полином суммой одночленов:

» pe=expand(p);
» pretty(pe)
4 3 2 2 2 3
a + 4 a x + 6 a x - a + 4 a x +
4 3 2
+ a x + x + x - 4 x + 4 x - 4

199
Аргументом expand может быть не только полином, но и
символическое выражение, содержащее тригонометрические,
экспоненциальные и логарифмические функции:

» pk=sym('(sin(x)+cos(x))^3+(sin(x)+cos(x))^2+
(sin(x)+cos(x))')
pk =
(sin(x)+cos(x))^3+(sin(x)+cos(x))^2+(sin(x)+cos(x
))
» pk2=expand(pk);
» pretty(pk2)
3 2 2 2
cos(x) + 3 cos(x) sin(x) + cos(x) + 3 cos(x) sin(x) +
3 2
+ 2 cos(x) sin(x) + cos(x) + sin(x) + sin(x) + sin(x)

Аргументами функций expand, collect может быть не только


отдельно полином или тригонометрические, или экспоненциальные, или
логарифмические функции, но и их сочетания, например:

» p=sym('(x+a)^4+(x-1)^3+(sin(x)+cos(x))^4');
» pretty(p)
3 4 4
(x - 1) + (cos(x) + sin(x)) + (a + x)
» p1=collect(p)
p1 =
x^4+(1+4*a)*x^3+(-3+6*a^2)*x^2+(3+4*a^3)*x+a^4-
-1+(sin(x)+cos(x))^4
» p2=expand(p1)

200
p2 =
x^4+x^3+4*x^3*a-3*x^2+6*x^2*a^2+3*x+4*x*a^3+a^4-
1+sin(x)^4+4*sin(x)^3*cos(x)+6*sin(x)^2*cos(x)^2+4*si
n(x)*cos(x)^3+cos(x)^4
» pretty(p2)
4 3 2 2 3 4
2 3
a + 4 a x + 6 a x + 4 a x + x + x - 3 x + 3 x +
4 3 2 2
+ cos(x) + 4 cos(x) sin(x) + 6 cos(x) sin(x) + 4*
3 4
* cos(x) sin(x) + sin(x) - 1

Символические полиномы разлагаются на множители функцией


factor, если получающиеся множители имеют рациональные
коэффициенты:

» p=sym('7*x^5-56*x^4+105*x^3+140*x^2-532*x+336');
» p1=factor(p)
p1 =
7*(x-2)*(x-3)*(x-4)*(x+2)*(x-1)

Функция factor может также представлять числа в виде произведения


простых чисел

» syms a
» a=sym('2738470');
» a1=factor(a)
a1 = (2)*(5)*(7)*(19)*(29)*(71)

Обратите внимание, что обращение

» a2=factor(2738470)
a2 = 2 5 7 19 29 71
201
выводит в командное окно аналогичный результат, однако переменная a1
является символьной, а переменная a2  вещественной, в чем несложно
убедиться при помощи whos:

» whos a1 a2
Name Size Bytes Class
a1 1x1 176 sym object
a2 1x6 48 double array
Grand total is 33 elements using 224 bytes

MATLAB является объектно-ориентированной средой, числовые


переменные double array образуют класс со своей функцией factor, а
функция factor для символических переменных реализована в другой
файл-функции. MATLAB определяет по типу аргумента соответствующий
класс, а затем и необходимую функцию.
Функция horner позволяет представить полином по схеме Горнера
(Horner polynomial representation):

» horner(p1)
ans =
336 +(-532+(140+(105+(-56+7*x)*x)*x)*x)*x

Упрощение выражений общего вида производится при помощи


функций simple, simplify, которые основаны на разных подходах. Функция
simplify реализует мощный алгоритм упрощения выражений, содержащих
как тригонометрические, экспоненциальную и логарифмическую
функцию, так и специальные функции. Кроме того, функция simplify
способна преобразовывать выражения, содержащие символическое
возведение в степень, суммирование и интегрирование. Алгоритм,
заложенный в simple, пытается получить выражение, которое

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

» v=sym('(((2+sqrt(3))/(sqrt(2)+sqrt(2+sqrt(3))))+(2-
sqrt(3))/(sqrt(2)-sqrt(2-sqrt(3))))^2')
v =
((3^(1/2) - 2)/(2^(1/2) - (2 - 3^(1/2))^(1/2)) -
-(3^(1/2) + 2)/((3^(1/2) + 2)^(1/2) + 2^(1/2)))^2
» pretty(v)
/ 1/2 1/2 \2
| 3 - 2 3 + 2 |
| -------------------- - -------------------- |
| 1/2 1/2 1/2 1/2 1/2 1/2 |
\ 2 - (2 - 3 ) (3 + 2) + 2 /

» v2=simplify(v)
» pretty(v2)

/ 1/2 1/2 \2
| 3 - 2 3 + 2 |
| -------------------- - -------------------- |
| 1/2 1/2 1/2 1/2 1/2 1/2 |
\ 2 - (2 - 3 ) (3 + 2) + 2 /

» v1=simple(v)

v1 = 2

Таким образом, в этом примере лучший результат получен с


помощью функции simple.
Функция subs позволяет произвести подстановку одного выражения
в другое. В общем случае функция вызывается с тремя входными

203
аргументами: именем символической функции, переменной, подлежащей
замене, и выражением, которое следует подставить в выражение. Функция
subs, в частности, облегчает ввод громоздких символических выражений.
Например:

» f=sym('((N^2-x^2)/(N+x)^2)+(sin(2*x)/A)*(sqrt(B*C))
+(A/B)^2+(cos(x)/C)^2')
» pretty(f)
2 2 2 2 1/2
N - x cos(x) A sin(2 x) (B C)
-------- + ------- + -- + -----------------
2 2 2 A
(N + x) C B

» f=subs(f,'A','sin(x)');
» f=subs(f,'B','tan(x)');
» f=subs(f,'C','cot(x)');
» pretty(f)
2 2 2 2 1/2
N - x cos(x) sin(x) sin(2 x) (cot(x) tan(x))
-------- + ------- + ------- + ---------------------------
2 2 2 sin(x)
(N + x) cot(x) tan(x)

Упростим полученное выражение с помощью функции simple:

» f2=simple(f)
f2 =
(2*sin(x)*N+sin(2*x)*N+sin(2*x)*x)/(N+x)/sin(x)
» pretty(f2)

2 sin(x) N + sin(2 x) N + sin(2 x) x


------------------------------------
(N + x) sin(x)
204
Подстановка вместо переменной ее числового значения приводит к
вычислению символической функции от значения аргумента, например

» f=sym('((N^2-x^2)/(N+x)^2)+(sin(2*x)/A)*(sqrt(B*C))
+(A/B)^2+(cos(x)/C)^2')
» pretty(f)
2 2 2 2 1/2
N - x cos(x) A sin(2 x) (B C)
-------- + ------- + -- + -----------------
2 2 2 A
(N + x) C B

» q=subs(f,'x',0)
q =
1+A^2/B^2+1/C^2
» f3=sym('sin(x)+exp(x)+tan(x)');
» q1=subs(f3,'x',0)
q1 =
1

11.1.3. Разложение в ряд Тейлора и определение символических


выражений для сумм
Разложение математических функций в ряд Тейлора позволяет
производить функция taylor, например:

» f=sym('sin(x)');
» tf=taylor(f);
» pretty(tf)
5 3
x x
--- - -- + x
120 6

205
По умолчанию выводится шесть членов ряда разложения в
окрестности точки нуль. Число членов разложения можно задать во втором
дополнительном параметре функции taylor. Третий параметр указывает, по
какой из переменных следует производить разложение в том случае, когда
символическая функция определена от нескольких переменных. Точка, в
окрестности которой проводится разложение, указывается в четвертом
входном аргументе функции taylor, например

» syms x;
» f=sym('sin(x)');
» tf=taylor(f, 5, x, pi/4);
» pretty(tf)
1/2 / pi \3 1/2 / pi \2 1/2 / pi \4
2 | -- - x | 2 | -- - x | 2 | -- - x |
\ 4 / \ 4 / \ 4 /
2 \ 4 /
---------------- - ---------------- + ---------------- +
12 4 48

1/2 / pi \
1/2 2 | -- - x |
2 \ 4 /
+ ---- - ---------------
2 2

Нахождение символических выражений для сумм, в том числе и


бесконечных, позволяет осуществить функция symsum. Обращение к
symsum в общем случае предполагает задание четырех аргументов:
слагаемого в символической форме, зависящего от индекса, самого
индекса и верхнего и нижнего предела суммы. Если в слагаемые входит
факториал, то следует применить к выражению для факториала функцию
sym. Найдите значение бесконечной суммы, являющейся разложением в
ряд функции sin(x)
 x 2 k 1
s   (1)k

k 0 (2k  1)!

206
» syms k x
» s=symsum((-1)^(k)*x^(2*k+1)/sym('(2*k+1)!'),
k,0,inf)
s =
sin(x)

11.1.4. Определение пределов, дифференцирование и интегрирование


Функция limit находит предел функции в некоторой точке, включая
плюс или минус бесконечность. Первым входным аргументом limit
является символическое выражение, вторым  переменная, а третьим –
точка, в которой определяется предел. Пусть, например, требуется
вычислить
1
lim (1  ) ax
x  x

» syms a x
» limit((1+1/x)^(x*a),x,Inf)
ans = exp(a)

Функция limit позволяет находить односторонние пределы. Для


нахождения предела справа следует указать четвертый дополнительный
аргумент 'right', а слева  'left'. Найдите решение следующих двух задач

lim (10  x)1 / x ; lim (10  x)1 / x .


x 0 x 0

» syms x
» limit((10+x)^(1/x),x,0, 'left')
ans = 0
» limit((10+x)^(1/x),x,0, 'right')
ans = inf
207
Обратите внимание, что обычный предел в точке нуль не
существует:

» limit((10+x)^(1/x),x,0)
ans =
NaN

Определение производной через предел позволяет применять limit


для дифференцирования функций. Например, найдем первую производную
функции arctg(x) , используя равенство

d arctg(x  h)  arctg(x)
arctg ( x)  lim
dx h0 h

» syms h x
» L=limit((atan(x+h)-atan(x))/h, h, 0);
» pretty(L)
1
------
2
1 + x

Вычисление производных любого порядка проще производить при


помощи функции diff. Символическая запись функции указывается в
первом входном аргументе, переменная, по которой производится
дифференцирование  во втором, а порядок производной  в третьем.
Применим diff для вычисления первой и второй производных
функции arctg (x) :

» P=diff('atan(x)',x,1);
» pretty(P)

208
1
------
2
x + 1

» P=diff('atan(x)',x,2);
» pretty(P)
2 x
- ---------
2 2
(x + 1)

Символическое интегрирование является значительно более сложной


задачей, чем дифференцирование. ToolBox Symbolic Math позволяет
работать как с неопределенными интегралами, так и с определенными.
Неопределенные интегралы от символических функций вычисляются при
помощи функции int. В качестве входных аргументов указываются
символическая функция и переменная, по которой производится
интегрирование, например, пусть необходимо вычислить неопределенный
интеграл f   exp(2 x)dx , тогда получим:

» syms x
» f=sym('exp(2*x)');
» I=int(f,x)
» pretty(I)
1/2 exp(2 x)

Разумеется, что функция іnt не позволяет получить неопределенный


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

209
» syms x a b
» f=sym('exp(2*x)');
» I=int(f,x,a,b);
» pretty(I)
1/2 exp(2 b) - 1/2 exp(2 a)

Двойные интегралы вычисляются двукратным применением


функции int. Пусть, например, необходимо вычислить интеграл
db
  ysin( x)dxdy , тогда для его определения необходимо задать
ca

символические переменные a, b, c, d, x, y, подынтегральную функцию f от x


и y и проинтегрировать сначала по одной переменной, а затем по другой

» syms a b c d x y
» f=sym('y*sin(x)');
» Ix=int(f,x,a,b)
Ix =
-y*cos(b)+y*cos(a)
» Iy=int(Ix,y,c,d)
Iy =
1/2*(-cos(b)+cos(a))*(d^2-c^2)
» pretty(Iy)
2 2
(c - d ) (cos(a) - cos(b))
- ---------------------------
2

Аналогичным образом вычисляются любые кратные интегралы в


символическом виде.

210
11.2. Индивидуальные задания

1. Задайте с помощью символических переменных две


символические матрицы A и B, размерами 33. Определите произведение
матриц A и B.
2. Задайте числовую матрицу D, размерами 33, содержащую в
качестве элементов числа N, N+1, N1, 0.9N, 2.4, 3.5 и т.д., где N  ваш
номер по списку в журнале группы. Получите из числовой матрицы
символическую.
3. С помощью символических вычислений определите сумму чисел
1010  1010  10 N  10 N , где N  ваш номер по списку в журнале группы.
4. С помощью символических вычислений определите корень
квадратный из числа N.N с сорока двумя значащими цифрами.
5. Постройте графики символических функций:

f  N 2sin( Nx ), 2 < x < 2;

f1  ( x  N ) 2  ( y  N )3 , 10  x  10; 10  y  10,

где N  Ваш номер по списку в журнале группы.


6. Полином

y  ( x  N )5  ( x  2 N )3  ( x  N ) 2  x  N , (11.1)

где N  ваш номер по списку в журнале группы, с помощью команды pretty


отобразите в командном окне, затем преобразуйте его к виду,
содержащему степени x с соответствующими коэффициентами.
7. Определите коэффициенты полинома (11.1) при переменной N.
8. Представьте полином (11.1) в виде суммы одночленов.
9. Разложите полином (11.1) на множители.
211
10. Примените к полиному (11.1) функцию horner.
11. Представьте число 1000 N+2 N в виде произведения простых
чисел.
12. Упростите выражение

y  sin( a)sin(b  c)cos(b  c  a)  sin(b)sin(c  a)cos(c  a  b) 


 sin(c)sin(a  b)cos(a  b  c).

13. Получите семь членов ряда Тейлора в окрестности точки нуль


для функции y  N (sin( x)  cos(x)).

x 2k
14. Определите сумму членов ряда s   N (1) . k

k 0 ( 2 k )!

sin( x)
15. Определите предел lim N , где N  ваш номер по списку в
x0 x
журнале группы.
1 1
16. Определите пределы lim arctg( ) и lim arctg( ) .
x 0  x x 0  x
17. Определите первые три производные от функции
y  N (sin( x))2  N 2 x 3  e Nx , где N  ваш номер по списку в журнале
группы.
ba
x2 y2
18. Вычислите интеграл   (  )dxdy .
00
2 p 2q

19. Оформите отчет по лабораторной работе.

212
Лабораторная работа 12

ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ ПРИ


ОПРЕДЕЛЕНИИ ЭКСТРЕМУМОВ ФУНКЦИЙ

Цель лабораторной работы: получение и закрепление знаний,


формирование практических навыков по определению экстремумов
функций с помощью генетических алгоритмов в пакете MATLAB.

12.1. Краткие сведения из теории

Генетические алгоритмы (ГА) относятся к эвристическим


алгоритмам поиска, используемым для решения задач оптимизации и
моделирования путём случайного подбора, комбинирования и вариации
искомых параметров с использованием механизмов, напоминающих
биологическую эволюцию. ГА является разновидностью эволюционных
вычислений, с помощью которых решаются оптимизационные задачи с
использованием методов естественной эволюции, таких как наследование,
мутации, отбор и кроссинговер. Отличительной особенностью ГА является
использование оператора "скрещивание", который производит операцию
рекомбинации решений-кандидатов, роль которой аналогична роли
скрещивания в живой природе.
Типичными применениями ГА являются следующие: поиск
экстремумов функций; оптимизация запросов в базах данных; задачи на
графах (задача коммивояжера, раскраска, нахождение паросочетаний);
настройка и обучение искусственной нейронной сети; задачи компоновки;
составление расписаний; игровые стратегии; теория приближений и др.
Основной идеей ГА является организация "борьбы за
существование" и "естественный отбор" среди пробных (примерных)

213
решений задачи. Поскольку ГА используют биологические аналогии, то
применяющаяся терминология напоминает биологическую.
Как известно, эволюционная теория утверждает, что жизнь на нашей
планете возникла вначале лишь в простейших ее формах – в виде
одноклеточных организмов. Эти формы постепенно усложнялись,
приспосабливаясь к окружающей среде и порождая новые виды, и только
через многие миллионы лет появились первые животные и люди. Можно
сказать, что каждый биологический вид с течением времени улучшает свои
качества так, чтобы наиболее эффективно справляться с важнейшими
задачами выживания, самозащиты, размножения и т.д. Так возникла
защитная окраска у многих рыб и насекомых, панцирь у черепахи, яд у
скорпиона и многие другие полезные приспособления.
С помощью эволюции природа постоянно оптимизирует все живое,
находя подчас самые неординарные решения. С первого взгляда неясно, за
счет чего происходит этот прогресс, однако ему есть научное объяснение.
Дать это объяснение можно, основываясь всего на двух биологических
механизмах – естественном отборе и генетическом наследовании.
Ключевую роль в эволюционной теории играет естественный отбор.
Его суть состоит в том, что наиболее приспособленные особи лучше
выживают и приносят больше потомства, чем менее приспособленные.
Заметим, что сам по себе естественный отбор еще не обеспечивает
развития биологического вида. Действительно, если предположить, что все
потомки рождаются примерно одинаковыми, то различные поколения
будут отличаться только по численности, но не по приспособленности.
Поэтому очень важно изучить, каким образом происходит наследование,
т.е. как свойства потомка зависят от свойств родителей.
Основной закон наследования интуитивно понятен каждому – он
состоит в том, что потомки похожи на родителей. В частности, потомки
более приспособленных родителей будут, скорее всего, одними из
наиболее приспособленных в своем поколении. Чтобы понять, на чем

214
основана эта похожесть, нам потребуется немного углубиться в строение
клетки животного – в мир генов и хромосом.
В клетках любого животного имеется набор хромосом, несущих
информацию об этом животном. Основная часть хромосомы – нить ДНК
(молекула дезоксирибонуклеиновой кислоты), которая состоит из четырех
видов специальных соединений – нуклеотидов, идущих в определенной
последовательности. Нуклеотиды обозначаются буквами A, T, C и G, и
именно порядок их следования кодирует все генетические свойства
данного организма. Говоря более точно, ДНК определяет, какие
химические реакции будут происходить в данной клетке, как она будет
развиваться и какие функции выполнять.
Ген – это отрезок цепи ДНК, отвечающий за определенное свойство
особи, например, за цвет глаз, тип волос, цвет кожи и т.д. Вся
совокупность генетических признаков человека кодируется посредством
примерно 60 тыс. генов, суммарная длина которых составляет более
90 млн нуклеотидов.
Различают два вида клеток: половые и соматические. В каждой
соматической клетке человека содержится 46 хромосом. Эти 46 хромосом
– на самом деле 23 пары, причем в каждой паре одна из хромосом
получена от отца, а вторая – от матери. Парные хромосомы отвечают за
одни и те же признаки – например, отцовская хромосома может содержать
ген черного цвета глаз, а парная ей материнская – ген голубоглазости.
Существуют определенные законы, управляющие участием тех или иных
генов в развитии особи. В частности, в нашем примере потомок будет
черноглазым, так как ген голубых глаз является "слабым" (рецессивным) и
подавляется геном любого другого цвета.
В половых клетках хромосом только 23, и они непарные. При
оплодотворении происходит слияние мужской и женской половых клеток
и образуется клетка зародыша, содержащая как раз 46 хромосом. Какие
свойства потомок получит от отца, а какие – от матери?

215
Это зависит от того, какие именно половые клетки участвовали в
оплодотворении. Дело в том, что процесс выработки половых клеток (так
называемый мейоз) в организме подвержен случайностям, благодаря
которым потомки все же во многом отличаются от своих родителей. При
мейозе, в частности, происходит следующее: парные хромосомы
соматической клетки сближаются вплотную, затем их нити ДНК
разрываются в нескольких случайных местах и хромосомы обмениваются
своими частями (рис. 12.1).

Рис. 12.1. Условная схема кроссовера

Этот процесс обеспечивает появление новых вариантов хромосом и


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

216
Как уже было отмечено выше, эволюция – это процесс постоянной
оптимизации биологических видов. Естественный отбор гарантирует, что
наиболее приспособленные особи дадут достаточно большое потомство, а
благодаря генетическому наследованию мы можем быть уверены, что
часть этого потомства не только сохранит высокую приспособленность
родителей, но будет обладать и некоторыми новыми свойствами. Если эти
новые свойства окажутся полезными, то с большой вероятностью они
перейдут и в следующее поколение. Таким образом, происходит
накопление полезных качеств и постепенное повышение
приспособляемости биологического вида в целом. Зная, как решается
задача оптимизации видов в природе, мы теперь применим похожий метод
для решения различных реальных задач.
Введем обозначения и приведем несколько классических примеров.
Как правило, в задаче оптимизации мы можем управлять несколькими
параметрами (обозначим их значения через x1, x2, ..., xn, а нашей целью
является максимизация (или минимизация) некоторой функции
f(x1, x2, ..., xn), зависящей от этих параметров. Функция f называется
целевой функцией. Например, если требуется максимизировать целевую
функцию "доход компании", то управляемыми параметрами будут число
сотрудников компании, объем производства, затраты на рекламу, цены на
конечные продукты и т.д. Важно отметить, что эти параметры связаны
между собой – в частности, при уменьшении числа сотрудников скорее
всего упадет и объем производства.
Для такого рода задач было разработано несколько методов
решений. В случае, если целевая функция достаточно гладкая и имеет
только один локальный максимум (унимодальна), то оптимальное решение
можно получить методом градиентного спуска. Идея этого метода состоит
в том, что оптимальное решение получается итерациями. Берется
случайная начальная точка, а затем в цикле происходит сдвиг этой точки
на малый шаг, причем шаг делается в том направлении, в котором целевая

217
функция растет быстрее всего. Недостатком градиентного алгоритма
являются слишком высокие требования к функции – на практике
унимодальность встречается крайне редко, а для неунимодальной функции
градиентный метод часто приводит к неоптимальному ответу.
Аналогичные проблемы возникают и с применением других
математических методов. Во многих важных задачах параметры могут
принимать лишь определенные значения, причем во всех остальных точках
целевая функция не определена. Конечно, в этом случае не может быть и
речи о ее гладкости и требуются принципиально другие подходы.
Представим себе искусственный мир, населенный множеством
существ (особей), причем каждое существо – это некоторое решение
нашей задачи. Будем считать особь тем более приспособленной, чем лучше
соответствующее решение (чем большее значение целевой функции оно
дает). Тогда задача максимизации целевой функции сводится к поиску
наиболее приспособленного существа. Конечно, мы не можем поселить в
наш виртуальный мир все существа сразу, так как их очень много. Вместо
этого мы будем рассматривать много поколений, сменяющих друг друга.
Теперь, если мы сумеем ввести в действие естественный отбор и
генетическое наследование, то полученный мир будет подчиняться
законам эволюции. Заметим, что в соответствии с нашим определением
приспособленности целью этой искусственной эволюции будет как раз
создание наилучших решений. Очевидно, эволюция – бесконечный
процесс, в ходе которого приспособленность особей постепенно
повышается. Принудительно остановив этот процесс через достаточно
долгое время после его начала и выбрав наиболее приспособленную особь
в текущем поколении, мы можем получить ответ близкий к оптимальному,
но можем такой ответ и не получить, поскольку это случайный поиск.
Такова, вкратце, идея генетического алгоритма. Перейдем теперь к точным
определениям и опишем работу генетического алгоритма более детально.

218
Для того чтобы говорить о генетическом наследовании, нужно
снабдить наши существа хромосомами. В генетическом алгоритме
хромосома – это некоторый числовой вектор, соответствующий
подбираемому параметру, а набор хромосом данной особи определяет
решение задачи. Какие именно векторы следует рассматривать в
конкретной задаче, решает сам пользователь. Каждая из позиций вектора
хромосомы называется геном.
Определим теперь понятия, соответствующие мутации и кроссоверу
в генетическом алгоритме.
Мутация – это преобразование хромосомы, случайно изменяющее
одну или несколько ее позиций (генов). Наиболее распространенный вид
мутаций – случайное изменение только одного из генов хромосомы.
Кроссовер (в литературе по ГА также употребляется название
кроссинговер и скрещивание) – это операция, при которой из двух
хромосом порождается одна или несколько новых хромосом. В
простейшем случае кроссовер в генетическом алгоритме реализуется так
же, как и в биологии (см. рис. 12.1). При этом хромосомы разрезаются в
случайной точке и обмениваются частями между собой. Например, если
хромосомы (1, 2, 3, 4, 5) и (0, 0, 0, 0, 0) разрезать между третьим и
четвертым генами и обменять их части, то получатся потомки (1, 2, 3, 0, 0)
и (0, 0, 0, 4, 5).
Схема генетического алгоритма изображена на рис. 12.2.
Вначале генерируется начальная популяция особей (индивидуумов),
т.е. некоторый набор решений задачи. Как правило, это делается
случайным образом. Затем мы должны смоделировать размножение
внутри этой популяции. Для этого случайно отбираются несколько пар
индивидуумов, производится скрещивание между хромосомами в каждой
паре, а полученные новые хромосомы помещаются в популяцию нового
поколения. В генетическом алгоритме сохраняется основной принцип
естественного отбора – чем приспособленнее индивидуум (чем больше

219
соответствующее ему значение целевой функции), тем с большей
вероятностью он будет участвовать в скрещивании. Теперь моделируются
мутации – в нескольких случайно выбранных особях нового поколения
изменяются некоторые гены. Затем старая популяция частично или
полностью уничтожается, и мы переходим к рассмотрению следующего
поколения. Популяция следующего поколения в большинстве реализаций
ГА содержит столько же особей, сколько начальная, но в силу отбора
приспособленность в ней в среднем выше. Теперь описанные процессы
отбора, скрещивания и мутации повторяются уже для этой популяции и
т.д.

Создание начальной
Отбор
популяции

Скрещивание

Переход к
новому
поколению
Мутация

Ответ

Рис. 12.2. Блок-схема генетического алгоритма

В каждом следующем поколении мы будем наблюдать


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

220
гарантий, и даже самый приспособленный тигр может погибнуть от
ружейного выстрела, не оставив потомства. Имитируя эволюцию на
компьютере, мы можем избегать подобных нежелательных событий и
всегда сохранять жизнь лучшему из индивидуумов текущего поколения –
такая методика называется "стратегией элитизма".

12.2. Реализация генетических алгоритмов с помощью консоли


MATLAB

В MATLAB возможность использования ГА для вычислений


реализована с помощью вкладки Genetic Algorithm and Direct Sarch
Toolbox, которая расширяет возможности пакета Optimization Toolbox
генетическими алгоритмами. Такие алгоритмы чаще всего используются в
случае, когда искомая целевая функция является разрывной, существенно
нелинейной, стохастической и не имеет производных, или эти
производные являются недостаточно определенными. Работать с
генетическими алгоритмами теперь можно в двух тулбоксах.
Собственно генетические алгоритмы относятся к разделу Genetic
Algorithm и вызываются из командной сроки с помощью gatool или ga.
Генетические алгоритмы и их комбинации с другими оптимизационными
методами можно найти в разделе Direct Search Toolbox. Для этого в
командной строке необходимо набрать psearchtool. Рассмотрим первый
вариант работы с ГА. Существуют 4 основные функции для работы с
алгоритмом:
ga – функция для нахождения минимума целевой функции;
gaoptimget – возвращает параметры используемого генетического
алгоритма;
gaoptimset – устанавливает параметры генетического алгоритма;
gatool – открывает окно Genetic Algorithm Tool.

221
Для того чтобы применить ГА к поставленной функции цели,
необходимо, в первую очередь записать её в M-файл и сохранить в
текущей папке.

12.2.1. Функция ga
Функция ga вызывается в командной строке согласно
нижеприведенному синтаксису:

[x fval] = ga(@fitnessfun, nvars, options),

где fitnessfun – имя M-файл, содержащего поставленную целевую


функцию, nvars – число независимых переменных в целевой функции,
options – структура, содержащая параметры используемого ГА. Если
параметры не изменять, то их значения возьмутся по умолчанию.
Результаты вычислений сохранятся в переменных: fval – окончательное
значение целевой функции, x – точка, в которой достигнуто оптимальное
значение.
Существуют и другие варианты вызова функции ga:

x = ga(fitnessfun, nvars)
x = ga(fitnessfun, nvars, options)
x = ga(problem)
[x, fval]=ga(...)
[x, fval, reason]=ga(...)
[x, fval, reason, output]=ga(...)
[x, fval, reason, output, population]=ga(...)
[x, fval, reason, output, population, scores]=ga(...)

Описание x = ga(fitnessfun, nvars) применяется для решения


оптимизационной задачи, fitnessfun – минимизируемая целевая функция и

222
nvars – длина вектора решений x, соответствующего наилучшей особи.
x = ga(fitnessfun, nvars, options) применяется для решения
оптимизационной задачи, используя параметры (options) алгоритма.
x = ga(problem) находит минимум функции, структура которой
описывается тремя полями:
fitnessfcn – целевая функция;
nvars – число независимых переменных целевой функции;
options – параметры структуры ГА, задаваемые функцией gaoptimset.
[x, fval] = ga(...) возвращает fval, значение целевой функции по x.
[x, fval, reason] = ga(...) возвращает reason – строку, содержащую
параметры остановки алгоритма.
[x, fval, reason, output] = ga(...) возвращает output совокупность
сведений о каждом поколении и другой информации о реализации
алгоритма. Структура output состоит из следующих полей:
Randstate или (randnstate) – начальное состояние популяции,
сгенерированное случайным образом (различие функций состоит в разных
выводах);
generations – количество вычисляемых поколений;
funccount – количество вычислений функции;
message – параметры остановки алгоритма. Это сообщение выводит
несколько аргументов завершения алгоритма.
[x, fval, reason, output, population] = ga(...) возвращает матрицу
популяции, строки которой соответствуют особи конечной популяции.
[x, fval, reason, output, population, scores] = ga(...) возвращает расчеты
финальной популяции.
Замечание 1
Для всех оптимизационных задач популяция должна быть
представлена в виде вещественных чисел. Функция ga не работает для
функций с комплексными переменными. Для решения задач включающих
комплексные числа, нужно записать целевую функцию в виде допустимого

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

[x fval, reason] = ga(@rastriginsFcn, 10)


x =
Columns 1 through 7
0.9977 0.9598 0.0085 0.0097 –0.0274 –0.0173 0.965
Columns 8 through 10
–0.0021 –0.0210 0.0065
fval =
3.7456
reason =
generations

12.2.2. Функция gaoptimset


Для настройки генетического алгоритма используется функция
gaoptimset. Она позволяет построить ГА, комбинируя операторы по
желанию пользователя. Синтаксис данной функции выглядит следующим
образом:

options = gaoptimset
gaoptimset
options = gaoptimset(’param1’, value1, ’param2’,
value2,...)
options = gaoptimset(oldopts,’param1’,value1,...)
options = gaoptimset(oldopts,newopts)

Описание функции:
options = gaoptimset (здесь аргументы не вводятся) с помощью
данной конструкции задается структура ГА, отличная от структуры ГА по

224
умолчанию.
gaoptimset не требует ввода или вывода аргументов. В результате
сформирует список параметров и их действительных значений.
options = gaoptimset(’param1’,value1,’param2’,value2,...) генерирует
структуру с множеством параметров их значений. Для нескольких
неспециальных параметров можно использовать значения по умолчанию.
options = gaoptimset(oldopts,’param1’,value1,...) создает копию
oldopts, модифицированную выбранными специальными параметрами и их
значениями.
options = gaoptimset(oldopts, newopts) комбинирует параметры
существующей структуры oldopts, с параметрами новых структур newopts.
Некоторые параметры с ненулевыми значениями в newopts могут
быть заменены или могут быть присвоены старым параметрам в oldopts.

12.3. Реализация генетических алгоритмов с помощью диалогового


окна MATLAB

Другой наиболее наглядный способ работы с ГА заключается в


вызове окна с помощью функции gatool. Диалоговое окно представлено на
рис. 12.3.
Как видно из рисунка, окно сопровождено справкой по всем
компонентам, и работа пользователя заключается в виде установки
параметров и нажатии кнопки "start". Результат будет тем же, что и в
случае последовательного применения функций gaoptimset и ga. В разделе
plots можно выбрать переменные, изменение которых будет отображаться
графически.
В диалоговом окне ГА предусмотрена векторизация функций,
благодаря чему вычисления происходят заметно быстрее. Смысл данного
метода заключается в том, что в качестве параметров функции выступают
векторы, тогда для текущей популяции целевая функция будет вызываться

225
лишь один раз, вычисляя приспособленность всех особей. Например,
рассмотрим функцию f(x1, x2) = x21 – 2x1x2 + 6x1 + x22 – 6x2.

Рис. 12.3. Диалоговое окно по генетическим алгоритмам

Запишем для неё M-файл, используя следующий код:

» z =x(:,1)./ 2 – 2*x(:,1).*x(:,2) + 6*x(:,1) +


x(:,2)./ 2–6*x(:,2);

226
Здесь x(:, 1) представляет собой вектор, а ./ и .* – операции
поэлементного соответственно возведения в степень и умножения.
В окне тулбокса в списке Vectorize option следует установить
значение On.
Убедиться в эффективности векторизации можно на примере
функции Растригина. В командной строке введем следующее выражение:

» tic;
» ga(@rastriginsfcn,20);
» toc;

В результате можно узнать время, затраченное на вычисления:

Elapsed time is 4.366073 seconds.

Проделаем тоже самое, но используя векторизацию функции Растригина:

» options=gaoptimset(’Vectorize’,’on’);
» tic;
» ga(@rastriginsfcn,20,options);
» toc;

Узнаем время, затраченное на векторизацию:

Elapsed time is 0.581 seconds.

Как видно, метод векторизации работает намного быстрее.

227
12.4. Применение генетических алгоритмов для поиска минимума
функции

Найдем минимум функции одной переменной вида:

f ( x)  8 x  16  123 ( x  4) 2 .

Напишем M-файл для данной функции и сохраним его в текущей


папке под именем ex2.m.

function y = ex2(x)
y=8*x–16–12*((x+4)^(2/3));

Вызовем окно тулбокса с помощью gatool.


В поле fitness function введем имя целевой функции @ex2.
Установим значения параметров ГА: количество особей в популяции
равно 10, количество поколений равно 100 (в окне критерия остановки
алгоритма), начальный отрезок [–4; 1]. В разделе plots установим флажки
для best fitness, best individual, distance и нажмем кнопку start.
В результате завершения процесса в окне final point появится
значение переменной x, соответствующее минимуму функции, а в окне
status and result можно увидеть найденное минимальное значение целевой
функции.
Для данной задачи результаты получились следующие:
 минимум функции достигается в точке x = –2.99;
 значение функции f(–2.99) = –51.999858021760915.
На рис. 12.4 отображается изменение значения целевой функции,
наилучшая особь и расстояния между особями в поколениях. Из данных,
полученных на рис. 12.4, видно, что, начиная примерно с 80 популяции,

228
алгоритм сошелся к решению. Особи становятся одинаковыми (расстояние
по Хеммингу равно 0) в последних 18 поколениях.

Рис. 12.4. Графический анализ решения

ГА нужно запускать несколько раз, а потом выбирать оптимальное


решение. Это связано с тем, что начальная популяция формируется с
использованием генератора случайных чисел. Убедиться в правильности
решения можно, построив график функции (рис. 12.5).
То же самое можно было бы получить, используя функции
gaoptimset и ga. Чтобы посмотреть M-файл, выбирете в меню File окна
Genetic Algoritm Tool команду Generate M-file, сохраните файл под другим
именем и просмотрите код.

229
Рис. 12.5. График функции

Для данной задачи получили:

function [x,fval,exitflag,output,population,score] =
ex2q(nvars,PopInitRange_Data,PopulationSize_Data,InitialPo
pulation_Data)
% This is an auto generated M-file from Optimization Tool.
% Start with the default options
options = gaoptimset;
% Modify options setting
options = gaoptimset(options,'PopInitRange',
PopInitRange_Data);
options = gaoptimset(options,'PopulationSize',
PopulationSize_Data);
options = gaoptimset(options,'InitialPopulation',
InitialPopulation_Data);
options = gaoptimset(options,'Display', 'off');
options = gaoptimset(options,'PlotFcns', { @gaplotbestf
@gaplotbestindiv @gaplotdistance });
230
[x,fval,exitflag,output,population,score] = ...
ga(@ex2,nvars,[],[],[],[],[],[],[],options);

12.5. Применение генетических алгоритмов для поиска максимума


функции

Найдем максимум функции двух переменных вида:

z ( x , y)  exp( x 2  y 2 )  sin( x  y).

В диалоговом окне ГА можно решить только задачи минимизации.


Для нахождения максимума функции f(x) следует минимизировать
функцию –f(x). Это объясняется тем, что точка минимума –f(x) является
некоторой точкой f(x), в которой достигается максимум.
Напишем M-файл для функции z(x) = –f(x) и сохраним его в текущей
папке под именем ex13.m:

function z = ex13(x)
z=–(exp(–x(1)^2–x(2)^2)+sin(x(1)+x(2)));

Вызовем диалоговое окно с помощью gatool.


В поле fitness function введем имя целевой функции @ex13.
Установим значения параметров ГА: количество переменных, равное 2,
количество особей в популяции, равное 10, количество поколений, равное
100 (в окне критерия остановки алгоритма), начальный отрезок, равный
[–1; 3]. Для построения графиков в разделе plots установим флажки для
best fitness, best individual, distance и нажмем кнопку start.
В результате завершения процесса в окне final point появится
значение переменной x, соответствующее минимуму функции, а в окне

231
status and result можно увидеть найденное минимальное значение целевой
функции z(x).
Для данной задачи результаты получились следующие:
 максимум функции достигается в точке x = 0.46419, y = 0.42406;
 значение функции f(0.46419; 0.42406) = 1.449.
Также можно сконструировать другие ГА, моделируя операторы
(выбор родительских пар, кроссинговер, мутация, миграция, отбор особей
в новую популяцию, критерии завершения алгоритма) и параметры
алгоритма.
Дальнейшее изучение оптимизации с помощью ГА можно
продолжить, рассматривая Direct Search Toolbox. Для вызова окна можно в
командной строке просто прописать psearchtool.

12.6. Индивидуальные задания

1. По номеру в журнале группы из табл. 12.1 выбрать функцию для


определения экстремумов с помощью ГА в пакете MATLAB.
2. Осуществить поиск минимума и максимума выбранной функции с
помощью командной строки и графического интерфейса ГА пакета
MATLAB, используя при этом функции gaoptimset и ga. При этом
обосновать выбор всех параметров и критериев остановки работы ГА.
3. Просчитать время, затраченное на поиск экстремумов функции,
при реализации ГА с помощью командной строки пакета MATLAB.
4. Построить график функции для того, чтобы убедиться в
правильности найденных с помощью ГА экстремумов.
5. Сгенерировать коды M-файлов для каждой задачи поиска
экстремумов функции с помощью ГА.
6. Пояснить различие между полученными результатами при
многократных запусках ГА во время поиска оптимального решения.
7. Оформите отчет по лабораторной работе.

232
Таблица 12.1 – Функции для определения экстремумов с помощью
генетического алгоритма
Номер в
журнале Название и вид функции для определения экстремумов
группы
Синусоидальная функция:
1, 8, 15 f ( x)  x1  sin 4 x1  1,1  x2  sin2 x2 .
Функция Растригина:
2, 9, 16
f ( x)  20  x12  x22  10  (cos2πx1  cos2πx2 ) .
Модифицированная функция Растригина:
n
3, 10, 17 f ( x)  10n   ( xi2  10  cos2πxi ), для n  2 .
i 1
Функция Швефеля:
n
4, 11, 18 f ( x)  418,9829n   ( xi  sin xi ), для n  2 .
i 1
Функция Эккли ( n  2 ):
5, 12, 19 f ( x)  20  e  20  exp  0,2 1 n x 2   exp 1 n cos 2x  .
  i
n i 1  n i
  i 1 
Функция Михалевича:
6, 13, 20 n ixi2
f ( x)   (sin xi  sin ), для n  2 .
i 1 
Функция Негневицкого:
7, 14, 21
f ( x)  ( x1  x13  x23 )exp( x12  x22 )  (1  x1 ) 2 exp( x12  ( x2  1) 2 ) .

233
Лабораторная работа 13

ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ В ЗАДАЧАХ


ОПТИМИЗАЦИИ

Цель лабораторной работы: получение и закрепление знаний,


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

13.1. Краткие сведения из теории

13.1.1. Применение генетических алгоритмов к задаче оптимизации


вычислительной сети
Объектом генетической оптимизации будет служить разветвленная
вычислительная сеть (ВС). Основой сети является опорное кольцо, или
бэкбон, представляющее собой последовательно соединенные
концентраторы. К концентраторам подключаются хосты, которые, в свою
очередь, могут являться маршрутизаторами для подсетей второго уровня.
Каждый хост может быть подключен к любому маршрутизатору. Задачей
оптимизации является нахождение такой схемы подключения хостов, при
которой трафик на бэкбоне будет минимальным. Расчет трафика на
бэкбоне строится на основе статистических данных, накопленных за
достаточно большой промежуток времени, позволяющий оценить объем
трафика между двумя хостами.
Для оптимизации трафика необходимо решить следующие
инженерные задачи:
 разработать и реализовать систему снятия статистики трафика на
бэкбоне, состоящем из концентраторов;
 разработать систему представления входных данных для
генетического алгоритма (ГА);

234
 разработать и реализовать генетический алгоритм.
Модель вычислительной сети организации
Опишем текущее состояние ВС с точки зрения оптимизации.
Считаем, что на некотором этапе развития ВС принято решение о
прокладке центральной магистрали, закупке и установке
коммуникационного оборудования. Перечень рабочих станций (узлов) ВС
известен, причем для узлов решена задача размещения, т.е. известны
координаты узлов. Размещение узлов в условиях учреждения подчиняется
сложившейся структуре подразделений, поэтому техническую
оптимизацию целесообразно ограничить рамками размещения
коммуникационного оборудования. Коммуникационное оборудование
представлено маршрутизаторами, концентраторами и/или коммутаторами.
Каждый узел (рабочая станция) может быть подключен только к одному
коммутатору/концентратору (комм/конц), таким образом каждый
комм/конц определяет сегмент ВС. Разбиение узлов по комм/конц считаем
известным.
Пусть в ВС имеется n комм/конц и т узлов. Обозначим узлы ui,
i = 1, ..., m, а коммутаторы/концентраторы qj, j = 1, ..., n. Каналы связи
между ql и qk будем обозначать Slk. Ограничения с точки зрения задачи
размещения представлены ограничениями на допустимые длины каналов
связи. Каналы Slk в большинстве реальных ВС соединены последовательно
(рис. 13.1). Каналы, замыкающие кольцо (на рис. 13.1 – точечная линия),
необходимы для повышения надежности за счет оперативного
формирования новой магистрали в случае повреждения каналов связи.
В контексте задачи существуют два вида каналов связи:
 <узел> – <коммутатор/концентратор>;
 <коммутатор/концентратор> – <коммутатор/концентратор>.
В любой ВС имеется т каналов первого типа (по числу узлов) и не
более п · (п – 1)/2 – каналов второго типа.

235
u1 u5 u6
s1 s5 s6
s2
u2 u7
s7
q1 q2
s3
u4 u8
s8
s4
u5

q3 u9
s9

s10 s11
u10 u11

Рис. 13.1. Пример ВС с коммутацией

В процессе модернизации ВС изменение топологии представлено


следующими действиями: переподключение узлов к другим
коммутаторам/концентраторам или прокладка новых каналов связи.
Эффективность каждого нового канала связи оценивается по влиянию на
суммарный трафик всех каналов связи. Функцию эффективности

F l  min Tk  Pk , для  k  1, ..., K

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


Переменная Тk выражает трафик канала k, а переменная Рk выражает
максимальную пропускную способность канала, K – количество каналов
связи. Задача переподключения узлов к другим
коммутаторам/концентраторам – это задача разбиения m рабочих станций
на п групп. Для каждой i-й группы имеется ограничение на nimax
количества подключенных станций.

236
Решение задачи переподключения рабочих станций – это процесс
направленного перебора вариантов подключения с целью оптимизации.
Размерность задачи велика даже для вычислительной сети среднего
размера (до 1000 узлов), поэтому представляется целесообразным решить
задачу с помощью генетического алгоритма.
Кодирование решения задачи (хромосомы) может быть следующим.
Вариант разбиения узлов на сегменты, т.е. решение удобно представлять
рядом целых чисел. Пусть все узлы имеют уникальные номера от 1 до m и
упорядочены в соответствии с этими номерами. Позиция i содержит номер
коммутатора/концентратора (от 1 до n), к которому подключен узел i.
Пример кодирования топологии ВС, изображенной на рис. 13.1, приведен в
табл. 13.1.

Таблица 13.1 – Пример кодирования подключения узлов ВС


Коммутатор/концентратор 1 1 1 1 2 2 2 2 3 3 3
Номер узла 1 2 3 4 5 6 7 8 9 10 11

Для двоичного кодирования номера qi коммутатора/концентратора


необходимо: [log2 n] бит, где [] – операция округления в большую сторону.
Для вышерассмотренного примера хромосома с использованием
двоичного кодирования приведена в табл. 13.2.

Таблица 13.2 – Хромосома с двоичным кодированием


Хромосома 01 01 01 01 10 10 10 10 11 11 11
Номер гена 1 2 3 4 5 6 7 8 9 10 11

При таком способе кодирования и при свободном механизме


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

237
 случайный выбор гена (вероятность 0,001);
 случайный выбор бита;
 инверсия выбранного бита;
 операция по модулю п над геном, содержащим результат
инверсии modn(x).
Оператор рекомбинации выполняется традиционно, но граница для
разрезания родительских хромосом должна быть границей генов.
Наибольшую важность имеет определение функции оптимальности
хромосомы, так как определение влияет на сходимость эволюции. В
качестве функции оптимальности может быть взята следующая функция:

max min Tk  Pk , для  l , l  L,  k , k  K ,


l k

где Тk – трафик канала k; Рk – пропускная способность канала;


L – множество всех вариантов выбора коммуникационного оборудования;
K – количество каналов связи.
Вид коммуникационного оборудования значительно влияет на
загруженность каналов связи. Реальная ВС часто содержит как
коммутаторы, так и концентраторы. Улучшить пропускные способности
каналов связи можно за счет оптимального выбора коммутаторов или
концентраторов. Задача выбора коммуникационного оборудования
задается на уровне каналов связи, каждый канал k характеризуется
пропускной способностью – реальной Рk и максимальной Рkmax (бит/с).
Интенсивность взаимодействия (передачи сообщений) любой пары узлов –
это величина Bij (бит/с). Величина Bij измеряется в течение длительного
промежутка времени и усредняется. Усреднение может быть представлено
или вычислением среднего значения Bijcp, или построением на основе
гистограммы распределения вероятностей.

238
Суммарный трафик, приходящийся на канал связи, зависит от типа
канала. Будем рассматривать только каналы типа:
 <коммутатор/концентратор> – <коммутатор/концентратор>.
Тогда можно выделить следующие подвиды каналов:
 <коммутатор> – <коммутатор>;
 концентратор> – <концентратор>;
 коммутатор> – <концентратор>.
Суммарный трафик выражается по-разному для трех подвидов
каналов связи. Рассмотрим суммарный трафик канала типа
<коммутатор> – <коммутатор>:

n n
Tk    Bij .
jM1 jM 2

Множество вершин М1 и множество вершин M2 – это множества


узлов по одну и другую стороны от канала связи. Суммарный трафик
канала <концентратор> – <концентратор> измеряется по-другому, так как
канал, образованный концентраторами, составляет общую магистраль:

n n
Tk   Bij .
j1 j1
i j i j

Суммарный трафик канала <концентратор> – <коммутатор> может


быть вычислен следующим образом:

n n
Tk    Bij .
j1 jM 2
i j

239
Необходимость модернизации ВС определяется по степени близости
суммарного трафика и пропускных способностей каналов связи. Для
нахождения оптимального подключения используется следующий
генетический алгоритм.
Шаг 1. Генерируется популяция хромосом случайным образом с
проверкой корректности, т.е. возможности подключения, закодированного
в хромосоме.
Шаг 2. Для каждой хромосомы рассчитывается значение функции
оптимальности, т.е. величина трафика на бэкбоне при подключении,
закодированном в хромосоме.
Шаг 3. В соответствии со значением функции оптимальности
производится ранжирование хромосом, хромосомы упорядочиваются по
мере убывания эффективности.
Шаг 4. Для каждой хромосомы вычисляется вероятность отбора

f (ait )
Ps (ait )  
,
 f (a tj )
j 1

где Ps – вероятность отбора; ait – i-я хромосома в t-м поколении;


f – функция оптимальности; t – номер поколения; λ – размер популяции.
Шаг 5. Проводится масштабирование вероятностей отбора,
наибольшая вероятность принимается за единицу, наименьшая – за нуль,
остальные пропорционально масштабируются:

Psi  Pmin
Psl  ,
Pmax  Pmin

240
где Psl – масштабированная вероятность; Psi – вероятность отбора;

Pmin – минимальная вероятность в популяции; Pmах – максимальная


вероятность в популяции.
Шаг 6. Начинается формирование новой популяции: производится
элитный отбор, т.е. определенное число "старых" хромосом переносится в
новую популяцию.
Шаг 7. Производится кроссинговер случайно выбранных хромосом.
Точка кроссинговера выбирается случайно. Процесс продолжается до тех
пор, пока размер новой популяции не будет равен размеру исходной.
Шаг 8. Переход к шагу 2, и цикл повторяется заданное число раз.
Шаг 9. Останов.

13.1.2. Применение генетических алгоритмов к задаче размещения


радиоэлементов в корпусе устройства
Структура задачи размещения разногабаритных элементов в
пространстве задается следующим образом:
 ограничения пространства объема размещения (например,
габариты конкретного корпуса, определенные стандартом предприятия);
 элементы размещения, заданные своими габаритами (объемами).
На практике задача размещения в пространстве часто заменяется
размещением на установочной площади, которую называют монтажным
полем. Каждый элемент, предназначенный для размещения, в таком случае
представляется своей установочной площадью, которая грубо является
прямоугольником, т.е. двумя габаритами: длиной и шириной.
Допустим, что монтажное поле тоже представляет собой
прямоугольник. По степени сложности различают более простую задачу
размещения одинаковых элементов на поле с кратными габаритами и
более сложную задачу размещения элементов с различными
установочными площадями. Решим задачу размещения разногабаритных
элементов на ограниченном монтажном поле.
241
Исходными данными являются: а, b – габариты монтажного
пространства; {(а1, b1), ..., (аi, bi), ..., (ап, bп)) – множество элементов
размещения; С – матрица связей элементов размещения, представляющая
собой матрицу связности. Необходимо найти вариант размещения
элементов на монтажном пространстве

Z = ((x1, y1), ..., (xi, yi), ..., (xп, yп)),

где xi, уi – координаты центра тяжести установочной площади элемента


размещения i такой, чтобы площадь перекрытия площадей размещенных
элементов была равна нулю, а суммарная длина соединений – минимальна.
Задача размещения ставится как задача оптимизации функции,
выражающей нормированную оценку суммы штрафа за перекрытие
площадей размещаемых электронных радиоэлементов (ЭРЭ) и общей
длины соединений:

F  min (k  O( L( z j ))  P(S общ ( z j )),


z j Z

где k – весовой коэффициент; O(L(zj)) – оценка общей длины соединений,


приведенная к интервалу [0, 1]; zj – вариант размещения; Р(Sобщ(zj)) –
функция штрафа за перекрытие площадей, принимающая значения из
интервала [0,1]; Sобщ – общая площадь перекрытия площадей
размещаемых элементов.
Общая длина соединений рассчитывается по формуле:

n n
L   dij  cij ,
i 1 j 1

где dij – расстояние между позициями установки элементов

dij  ( xi  x j )2  ( yi  y j )2 ; сij – число связей между элементами i и j из

исходной матрицы смежности С.

242
Нормирование общей длины соединений можно провести, вычисляя
отношение L(zj) к Lmax, где

Lmax  n 2  a 2  b 2 ;
O(L(zj))= L(zj) / Lmax.

Общая площадь перекрытия вычисляется по следующей формуле:

n n
Sпер   Sij ,
i 1 j 1

где Sij – площадь перекрытий элементов zi и zj,

Sij  [0,5(a2  a1 )  x2  x1 ][0,5(b2  b1)  y2  y1 ].

Функция штрафа за перекрытие площадей

P(Sобщ )  Sобщ /nab.

13.1.3. Исследование эффективности генетических алгоритмов для


задачи размещения радиоэлементов в корпусе устройства
Исследуем результативность генетического алгоритма при решении
задачи размещения элементов на плоскости. Характерной особенностью
использования стандартного генетического алгоритма для решения
практических задач является необходимость уточнения его параметров.
Для создания программной реализации генетического алгоритма
размещения разногабаритных радиоэлектронных элементов необходима
следующая модификация ГА.
1. Хромосома представляет собой связанный список пар координат

243
центров тяжестей элементов размещения. Каждая координата описывается
вещественным числом.
2. В качестве оператора мутации используется вероятностное
изменение случайной позиции хромосомы. В качестве оператора
рекомбинации используется одноточечный вариант кроссовера.
3. Условие завершения эволюции задается в виде определения числа
поколений либо в виде условия достижения нулевого перекрытия
элементов.
Результаты анализа поведения генетического алгоритма в
зависимости от значений вероятности мутации приведены на рис. 13.2.
Эксперимент проводился для значений вероятностей мутации в диапазоне
от 0,1 до 0,6 с шагом 0,1. Значение вероятности более 0,6 нарушает
сходимость функции оптимальности ГА.

Рис. 13.2. Диаграмма: длительность эволюции в зависимости от значения


вероятности мутации

Кроме стандартного ГА, для решения задачи размещения можно


использовать эволюционные стратегии: стратегию "только мутация" с
пропорциональным оператором селекции; стратегию с рекомбинацией

244
(т, k). Такой оператор рекомбинации предполагает т родителей и k
потомков. Параметры m и k устанавливает пользователь. Теоретически
ограничения на параметры имеют следующий вид: т = 1, ..., l – 1;
k = 1, ..., т. Параметр l – длина хромосомы (или в нашем случае
количество элементов размещения). Экспериментально исследовались
следующие сочетания родителей и потомков: (2, 2), (3, 1), (3, 2), (3, 3),
(4, 1), (4, 2), (4, 3), (4, 4). Следует отметить, что при сочетании (2, 1) мы
получаем в качестве оператора рекомбинации обычный одноточечный
кроссинговер, в котором участвуют два родителя и один потомок,
выбираемый случайным образом. На рис. 13.3 и 13.4 показаны для
сравнения виды графиков оптимальности генетического алгоритма.
Ряд экспериментов с алгоритмом, применяющим стратегию с
альтернативным оператором рекомбинации, выявил особую
результативность оператора рекомбинации (3, 3), хотя в целом результаты
данного вида алгоритма хуже, чем в случае со стандартным генетическим
алгоритмом с одноточечным кроссинговером. В первую очередь, это
связано с тем, что значительное увеличение точек разреза хромосом ведет
к разрушению хороших подобластей потенциальных решений. На рис. 13.4
это заметно по многочисленным "всплескам" на графике.

Рис. 13.3. График функции оптимальности ГА при одноточечном


крассовере

245
Рис. 13.4. График функции оптимальности ГА при стратегии с
рекомбинацией (m, k)

При применении мобильного генетического алгоритма на практике


возникают трудности, как с формулировкой первоначальной популяции
решений, так и с функцией оптимальности. Структура хромосомы
представляет собой список пар координат, упорядоченных по номеру
элемента: ((1, х1, y1), ..., (i, хi, yi), ..., (v, хv, yv)).
В мобильном генетическом алгоритме хромосома кодируется
списком пар <номер гена, значение гена>. При решении задачи
размещения номер гена совпадает с номером размещаемого элемента, а
значение гена – с парой координат. Таким образом, номер гена – это целое
число, а координаты – два вещественных числа.
На этапе инициализации генерируется λ строк случайным образом.
Параметр λ – размер популяции, задается пользователем. Функция
оптимальности для каждой хромосомы вычисляется, как площадь
перекрытия элементов.
Эффективность мобильного ГА для задач структурного синтеза
можно проверить на следующих четырех тестовых наборах: "большое
монтажное поле и мало элементов размещения"; "много элементов
размещения" (высокая плотность упаковки); "низкая плотность упаковки,

246
но разные элементы размещения"; "высокая плотность упаковки и велико
разнообразие". Результаты экспериментов представлены в табл. 13.3.

Таблица 13.3 – Параметры стандартного ГА


Сходимость
Номер Общая площадь Общая длина
(количество
эксперимента перекрытий соединений
поколений)
1 0 5796 37
2 0 5224 11
3 0 646628 6
4 0 668482 8
5 0 43835 47
6 0 38897 13
7 Алгоритм не сошелся
8 0 103325 8

В табл. 13.3 под четными номерами приведены результаты работы


стандартного ГА, а под нечетными – мобильного ГА. На основании
проведенных экспериментов можно сделать вывод о результативности
мобильного генетического алгоритма.

13.2. Индивидуальные задания

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


написать программу, на любом языке высокого уровня, реализующую
решение сформулированной задачи оптимизации вычислительной сети с
использованием описанного генетического алгоритма, а для студентов с
нечетными номерами в журнале группы – программу, реализующую
решение сформулированной задачи размещения радиоэлементов в корпусе
устройства.
2. Обосновать выбор всех параметров и критериев остановки работы
генетического алгоритма.
3. Оформите отчет по лабораторной работе.

247
Лабораторная работа 14

ПРИМЕНЕНИЕ MATLAB ДЛЯ МОДЕЛИРОВАНИЯ


НЕЙРОННОЙ СЕТИ ХЕББА

Цель лабораторной работы: получение и закрепление знаний,


формирование практических навыков работы с пакетом MATLAB при
использовании М-файлов и разработке программ для решения задач
искусственного интеллекта.

14.1. Краткие сведения из теории

14.1.1. Формальные нейроны искусственных нейронных сетей


При моделировании нейронных сетей в качестве искусственных
нейронов обычно используется простой процессорный элемент,
изображенный на рис. 14.1. На его входы поступает вектор Х = (х1, …, хп)
входных сигналов, являющихся выходными сигналами других нейронов, а
также единичный сигнал смещения. Все входные сигналы, включая и
сигнал смещения, умножаются на весовые коэффициенты своих связей и
суммируются:

n
S   xi wi  w0 , (14.1)
i 1

где S – суммарный входной сигнал; wi ( i  1, n ) – весовые коэффициенты


связей входных сигналов х1, …, хп; w0 – весовой коэффициент связи
сигнала смещения.

248
w0

1
w1
x1 S y
 ƒ

xn

wn
Рис. 14.1. Процессорный элемент, используемый в обычных
нейросетях

Полученный сигнал S поступает на вход блока, реализующего


функцию f активации нейрона. Типичными функциями активации
являются бинарная

1, если S  0,
y (14.2)
0, если S  0
или биполярная
1, если S  0,
y (14.3)
 1, если S  0.

Многие авторы при описании модели нейрона используют не сигнал


смещения, а порог  нейрона, что приводит к эквивалентной модели
элемента. В этом случае выражения (14.2) и (14.3) принимают
соответственно вид:

1, если S  ,
y (14.4)
0, если S  ,
1, если S  ,
y (14.5)
 1, если S  ,

249
где
n
S   wi xi . (14.6)
i 1

Графическое изображение бинарной и биполярной функций


активации для этого случая представлено на рис. 14.2, а и 14.2, b.

Рис. 14.2. Функции активации нейронов

Из сопоставления выражений (14.1) – (14.3) и (14.4) – (14.6) следует,


что каждому значению порога  нейрона может быть поставлен в
соответствие весовой коэффициент w0 связи сигнала смещения и наоборот.
Реже используются линейные бинарные или биполярные функции
активации (рис. 14.2, с и 14.2, d):

 a, при S  1 ,

y   k S  a0 , при 1  S  2 , (14.7)
 1, при S   ,
 2

где а равно нулю для бинарных выходных сигналов нейронов и а равно


минус единице для биполярных сигналов; k, a0  постоянные
коэффициенты.

250
Кроме приведенных в теории нейронных сетей используются также
часто следующие нелинейные функции активации:
 бинарная сигмоидальная (рис. 14.2, e):

1
y , (14.8)
1  e  S

где τ – постоянный коэффициент;


 биполярная сигмоидальная (рис. 14.2, f):

2
y 1. (14.9)
1  e  S

Приведенные модели искусственных нейронов игнорируют многие


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

251
14.1.2. Решение задач распознавания на основе отдельных нейронов
(правило Хебба)
Искусственные нейронные сети, предназначенные для решения
разнообразных конкретных задач, могут содержать от нескольких
нейронов до тысяч и даже миллионов элементов. Однако уже отдельный
нейрон (см. рис. 14.1) с биполярной или бинарной функцией активации
может быть использован для решения простых задач распознавания и
классификации изображений. Выбор биполярного (1, –1) или бинарного
(1, 0) представления сигналов в нейросетях осуществляется исходя из
решаемой задачи, и во многих случаях он равноценен. Имеется спектр
задач, в которых бинарное кодирование сигналов более удобно, однако в
общем, биполярное представление информации более предпочтительно.
Поскольку выходной сигнал у двоичного нейрона (см. рис. 14.1)
принимает только два значения, то нейрон можно использовать для
классификации предъявляемых изображений на два класса.
Пусть имеется множество М изображений, для которых известна
корректная классификация на два класса: X 1 = {X 11, X 12, …, X 1q},
X 2 = {X 21, X 22, …, X 2р}, X 1  X 2 = M, X 1  X 2 = Ø. И пусть первому классу
X 1 соответствует выходной сигнал у = 1, а классу X 2 – сигнал у = –1. Если,
например, предъявлено некоторое изображение X   ( X1 , ..., X n ) ,

X   M , и его взвешенная сумма входных сигналов превышает нулевое

значение:

n
S   xi wi  w0  0,
i 1

то выходной сигнал у = 1 и, следовательно, входное изображение X α


принадлежит классу X 1. Если S  0, то у = –1 и предъявленное
изображение принадлежит второму классу.

252
Возможно использование отдельного нейрона и для выделения из
множества классов М = {X 1 = {X 11, …, X 1k}, …, X i = {X i1, …, X iq}, …,
X p = {X p1, …, X pm}} изображений единственного класса X i. В этом случае
полагают, что один из двух возможных выходных сигналов нейрона
(например, 1) соответствует классу X i, а второй – всем остальным классам.

Поэтому, если входное изображение Х приводит к появлению сигналa
у = 1, то Х   X i, если у = –1 (или у = 0, если используется бинарное
кодирование), то это означает, что предъявленное изображение не
принадлежит выделяемому классу.
Система распознавания на основе единственного нейрона делит все
пространство возможных решений на две области с помощью
гиперплоскости

x1w1 + x2w2 + … + xnwn + w0 = 0.

Для двухмерных входных векторов границей между двумя классами


изображений является прямая линия: входные векторы, расположенные
выше этой прямой, принадлежат к одному классу, а ниже – к другому.
Для адаптации, настройки или обучения весов связей нейрона может
использоваться несколько методов. Рассмотрим один из них, получивший
название "правило Хебба". Хебб, исследуя механизмы функционирования
центральной нервной системы, предположил, что обучение происходит
путем усиления связей между нейронами, активность которых совпадает
по времени. Хотя в биологических системах это предположение
выполняется далеко не всегда и не исчерпывает всех видов обучения,
однако при обучении однослойных нейросетей с биполярными сигналами
оно весьма эффективно.
В соответствии с правилом Хебба, если предъявленному
биполярному изображению X = (x1, …, xn) соответствует неправильный

253
выходной сигнал у, то веса wi (i  1, n.) связей нейрона адаптируются по
формуле

wi (t + 1) = wi (t) + xi у, i  0,n , (14.10)

где wi (t), wi (t + 1) соответственно вес i-й связи нейрона до и после


адаптации; xi ( i  1, n, ) – компоненты входного изображения; х0  1 –
сигнал смещения; у – выходной сигнал нейрона.
В более полной и строгой форме алгоритм настройки весов связей
нейрона с использованием правила Хебба выглядит следующим образом:
Шаг 1. Задается множество M = {(Х 1, t1), …, (X m, tm)}, состоящее из
 
пар (входное изображение Xk = x1k , ..., xnk , необходимый выходной сигнал

нейрона tk, k  1, m ). Инициируются веса связей нейрона:

wi = 0, i  0, n.

Шаг 2. Для каждой пары (X k, t k), k  1, m пока не соблюдаются


условия останова, выполняются шаги 3 – 5.
Шаг 3. Инициируется множество входов нейрона:

x0 = 1, xi = xik, i  1, n.

Шаг 4. Инициируется выходной сигнал нейрона: y = t k.


Шаг 5. Корректируются веса связей нейрона по правилу

wi new  wi old   xi y, i  0, n .

Шаг 6. Проверка условий останова.


Для каждого входного изображения Xk рассчитывается
254
соответствующий ему выходной сигнал y k:


1, если S  0,
k
y k
k  1, m,

 1, если S  0,
k

где
n
S k   xik wi  w0 .
i 1

Если вектор (y1, …, ym) рассчитанных выходных сигналов равен


вектору (t1, …, tm) заданных сигналов нейрона, т.е. каждому входному
изображению соответствует заданный выходной сигнал, то вычисления
прекращаются (переход к шагу 7), если же (y1, …, ym) ≠ (t1, …, tm), то
переход к шагу 2 алгоритма.
Шаг 7. Останов.

Пример 1. Пусть требуется обучить биполярный нейрон


распознаванию изображений X 1 и Х 2, приведенных на рис. 14.3.

X1 X2

1 2 3 1 2 3
4 5 6 4 5 6
7 8 9 7 8 9

Рис. 14.3. Входные изображения

При этом потребуем, чтобы изображению Х 1 соответствовал


выходной сигнал нейрона "+1", а изображению Х 2  сигнал "–1".
Применение алгоритма Хебба дает следующие результаты:
Шаг 1. Задается множество

255
М = {(Х 1 = (1, –1, 1, 1, 1, 1,–1, –1, 1), 1),
(Х 2 = ( 1, 1, 1, 1, –1, 1, 1, –1, 1 ), –1)};

инициируются веса связей нейрона: wi = 0, i  0, 9.


Шаг 2. Для каждой из двух пар (Х 1, 1), (Х 2, –1) выполняются шаги
3 – 5 алгоритма.
Шаг 3. Инициируется множество входов нейрона для изображения
первой пары: х0 = 1, хi = xi1, i  0, 9.
Шаг 4. Инициируется выходной сигнал нейрона для изображения
первой пары: у = t1 = 1.
Шаг 5. Корректируются веса связей нейрона по правилу Хебба

wi  wi  x1i y (i  0, n ) :

w0  w0  x0 y  0  11  1; w1  w1  x11 y  0  11  1;


w1  w3  w4  w5  w6  w9  1; w2  w2  x12 y  0   1 1  1;
w2  w7  w8  1.

Шаг 3. Инициируется множество входов нейрона для изображения


Х 2 второй пары:

х0 = 1, хi = хi2, i  0, 9.

Шаг 4. Инициируется выходной сигнал нейрона для изображения


второй пары (Х 2, t 2):

у = t 2 = –1.

Шаг 5. Корректируются веса связей нейрона:

256
w0  w0  x0 y  1  1  1  0 ;
w1  w1  x12 y  1  1  1  0 ;
w1  w3  w4  w6  w9  0 ;
w2  w2  x22 y  1  1   1  2 ;
w2  w7  2 ;
w5  w5  x52 y  1   1   1  2 ;

w8  w8  x82 y  1   1   1  0 .

Шаг 6. Проверяются условия останова.


Рассчитываются входные и выходной сигналы нейрона при
предъявлении изображения X 1:

9
S   x1i wi  w0  1  0   1   2  1  0  1  0  1  2  1  0   1   2 
1

i 1
  1  0  1  0  0  6,
y1 = 1, так как S1 > 0.

Рассчитываются входной и выходной сигналы нейрона при


предъявлении изображения Х 2:

9
S 2   xi2 wi  w0  1  0  1   2  1  0  1  0   1  2  1  0  1   2 
i 1
  1  0  1  0  0  6,
y2 = –1, так как S2 < 0.

Поскольку вектор (y1, y2) = (1, –1) равен вектору (t1, t2), то вычисления
прекращаются, так как цель достигнута – нейрон правильно распознает
заданные изображения.
Шаг 7. Останов.

257
14.1.3. Нейронная сеть Хебба
Использование группы из m биполярных нейронов A1, …, Am
(рис. 14.4) позволяет существенно расширить возможности нейронной
сети и распознавать до 2m различных изображений. Правда, применение
этой сети для распознавания 2m (или близких к 2m чисел) различных
изображений может приводить к неразрешимым проблемам адаптации
весов связей нейросети. Поэтому часто рекомендуют использовать данную
архитектуру для распознавания только m различных изображений, задавая
каждому из них единичный выход только на выходе одного А-элемента
(выходы остальных при этом должны принимать значение "–1" для
биполярных нейронов или "0" – для бинарных).

w11 y1
х1 A1
w1i wj1
w1m




wn1
wji yi
xj Аj
wni




wjm
ym
xn Ат
wnm

Рис. 14.4. Нейронная сеть из m элементов

Однослойная нейронная сеть с двоичными нейронами, приведенная


на рис. 14.4, может быть обучена с помощью алгоритма на основе правила
Хебба. В этом случае она называется сетью Хебба. Использование других
алгоритмов обучения этой же сети приводит и к изменению названия
нейронной сети. Использование в названии сетей их алгоритмов обучения

258
характерно для теории нейронных сетей. Для биполярного представления
сигналов возможно обучение нейросети с помощью следующего
алгоритма:
Шаг 1. Задается множество M = {(Х 1, t1), …, (Х m, t m)}, состоящее из
 
пар (входное изображение X k = x1k ,...,xnk , необходимый выходной сигнал

нейрона t k, k  1, m ). Инициируются веса связей нейрона:

wji = 0, j  0, n , i  1, m.

Шаг 2. Каждая пара (Х k, t k) проверяется на правильность реакции


нейронной сети на входное изображение. Если полученный выходной
вектор сети ( y1k , …, y mk ) отличается от заданного t1 = ( t1k , …, t mk ), то
выполняют шаги 3 – 5.
Шаг 3. Инициируется множество входов нейронов: x0 = 1, xj = xjk,

j  1, n.

Шаг 4. Инициируются выходные сигналы нейронов: yi = tik , i  0, m .


Шаг 5. Корректируются веса связей нейронов по правилу:

w ji new  w ji old   x j yi , j  0, n, i  0, m .

Шаг 6. Проверяются условия останова, т.е. правильности


функционирования сети при предъявлении каждого входного
изображения. Если условия не выполняются, то переход к шагу 2
алгоритма, иначе – прекращение вычислений (переход к шагу 7).
Шаг 7. Останов.

259
14.2. Индивидуальные задания

1. Разработайте структуру сети Хебба, которая способна


распознавать четыре различные буквы вашего имени или фамилии.
2. Разработайте алгоритм и программу в М-файле, моделирующую
сеть Хебба. При этом в алгоритме обязательно предусмотрите
возможность возникновения ситуаций с неразрешимыми проблемами
адаптации весов связей нейросети.
3. Обучите нейронную сеть Хебба распознаванию четырех заданных
букв вашего имени или фамилии.
4. Продемонстрируйте работоспособность сети при предъявлении
обучающих изображений и изображений, содержащих ошибки.
5. Оформите отчет по лабораторной работе.

260
Лабораторная работа 15

НЕЙРО-НЕЧЕТКОЕ МОДЕЛИРОВАНИЕ В СРЕДЕ MATLAB

Цель лабораторной работы: получение и закрепление знаний о


методах моделирования и принципах функционирования нейронечетких
систем, а также формирование практических навыков по конструированию
нейронечетких сетей в пакете MATLAB.

15.1. Краткие сведения из теории

Как правило, в состоянии нестабильной экономики,


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

261
входными и выходными переменными системы, при этом в процессе
обучения сети настраиваются параметры (веса) получаемых
функциональных отношений. (Как правило, выявление и определение
данной зависимости в явном виде не представляется возможным в силу
вышеуказанных причин). Модель нейронной сети позиционируется как
"черный ящик" вследствие того, что внутренний алгоритм ее настройки не
"прозрачен", и полученные результаты и взаимосвязи сложно
интерпретировать.
Нечеткие нейронные сети или гибридные сети призваны объединить
в себе достоинства нейронных сетей и систем нечеткого вывода. С одной
стороны, они позволяют разрабатывать и представлять модели систем в
форме правил нечетких продукций, которые обладают наглядностью и
простотой содержательной интерпретации. С другой стороны, для
построения правил нечетких продукций используются методы нейронных
сетей, что является более удобным и менее трудоемким процессом для
системных аналитиков.
В данных методических указаниях рассматриваются основные
понятия нейронечетких сетей, а также средства их разработки,
предоставляемые системой МATLAB.
Для прогнозирования используем нечеткую сеть TSK. Обобщенную
схему вывода модели TSK при использовании M правил и N переменных xj
можно представить в виде:

IF (x1 IS A1(1)) AND (x2 IS A2(1)) AND … AND (xn IS An(1)),


N
THEN y1 = p10 +  p1 j x j
j 1
…………………………………………………
IF (x1 IS A1(M)) AND (x2 IS A2(M)) AND … AND (xn IS An(M)),
N
THEN yM = pM0 +  pMj x j .
j 1

262
Условие IF ( xi IS Ai) реализуется функцией фазификации, которая
представляется обобщенной функцией Гаусса отдельно для каждой
переменной xi :

1
 A ( xi )  2bi
, (15.1)
 x c 
1   i i 
 i 

где  A ( xi ) представляет оператор Ai. В нечетких сетях целесообразно


задавать это условие в форме алгебраического произведения, из которого
следует, что для k-го правила вывода

 
 
N  
1
 A ( x)   
(k ) . (15.2)
 2 b j 
(k )

  xi  c j 
j 1 (k )

1 
  (k )  
  j  

При M правилах вывода агрегирование выходного результата сети


производится по формуле

M
wi  N 
y N pi 0   pij x j  , (15.3)
 
i 1
 j
w  j 1 
j 1

которую можно представить в виде

M
1 
y ( x)  N   wk yk ( x)  , (15.4)
 wk  k 1 
k 1

263
N
где yk ( x)  pk 0   pkj x j .
j 1

Присутствующие в этом выражении веса wk интерпретируются как

значимость компонентов (Ak ) ( x) , определенных формулой (15.1). При этом


условии формуле (15.4) можно сопоставить многослойную структуру сети
(рис. 15.1). В такой сети выделяется пять слоев:
 первый слой выполняет раздельную фазификацию каждой
переменной x i (i = 1, 2, …, N), определяя для каждого k-го правила вывода

значение коэффициента принадлежности  (Ak ) ( xi ) в соответствии с


применяемой функцией фазификации. Это параметрический слой с

j ,  j , b j , подлежащими адаптации в процессе


параметрами c (k ) (k ) (k )

обучения;
 второй слой (непараметрический) выполняет агрегирование
отдельных переменных xi , определяя результирующее значение

коэффициента принадлежности wk  (Ak ) ( x) для вектора x (уровень


активизации правила вывода) в соответствии с формулой (15.2);
 третий слой представляет собой генератор функции TSK,
N
рассчитывающий значения yk ( x)  pk 0   pkj x j . В этом слое также
j 1

производится умножение сигналов yk (x) на значения wk , сформированные


на предыдущем слое. Это параметрический слой, в котором адаптации
подлежат линейные веса pkj для k = 1, 2, …, M и j = 1, 2, …, N,

определяющие функцию следствия модели TSK;


 четвертый слой (непараметрический) составляют два нейрона-
сумматора, один из которых рассчитывает взвешенную сумму сигналов
M
yk (x) , а второй определяет сумму весов  wk ;
k 1

264
 последний, пятый слой (нормализующий), состоит из
единственного выходного нейрона, в котором веса подвергаются
нормализации в соответствии с формулой (15.4). Выходной сигнал y(x)
определяется выражением, соответствующим зависимости (15.3),

f1
y ( x)  f ( x)  . (15.5)
f2

Рис. 15.1. Структура нечеткой нейронной сети TSK

Из приведенного описания следует, что нечеткая сеть TSK содержит


только два параметрических слоя (первый и третий), параметры которых
265
уточняются в процессе обучения. Параметры первого слоя будем называть
нелинейными параметрами, поскольку они относятся к нелинейной
функции (15.1), а параметры третьего слоя – линейными весами, т.к. они
относятся к параметрам pkj линейной функции TSK.
При уточнении функциональной зависимости (15.4) для сети TSK
получаем:

1 M  N (k )  N 
y ( x) 
M  N 
  A j k 0  kj j .
  ( x )   p  p x (15.6)
k 1  j 1   
   (Ak ) ( x j ) 
j 1

k 1 
 j 1 

Если принять, что в конкретный момент времени параметры


условия зафиксированы, то функция y(x) является линейной относительно
переменных xi (i = 1, 2, …, N).
При наличии N входных переменных каждое правило формирует
N+1 переменных pj(k) линейной зависимости TSK. При M правилах вывода
это дает M(N+1) линейных параметров сети. В свою очередь, каждая
функция принадлежности использует три параметра (с, s, b), подлежащих
адаптации. Если принять, что каждая переменная xi характеризуется
собственной функцией принадлежности, то при М правилах вывода мы
получим 3MN нелинейных параметров. В сумме это дает M(4N+1)
линейных и нелинейных параметров, значения которых должны
подбираться в процессе обучения сети.
На практике для уменьшения количества адаптируемых параметров
оперируют меньшим количеством независимых функций принадлежности
для отдельных переменных, руководствуясь правилами, в которых
комбинируются функции принадлежности различных переменных. Если
принять, что каждая переменная xi имеет т различных функций
принадлежности, то максимальное количество правил, которые можно
создать при их комбинировании, составит: M = mN (при трех функциях
266
принадлежности, распространяющихся на две переменные, это 32 = 9
правил вывода). Таким образом, суммарное количество нелинейных
параметров сети при М правилах вывода уменьшается с 3MN в общем
случае до 3NM1/N. Количество линейных параметров при подобной
модификации остается без изменений, т.е. M(N+1).
Гибридная сеть как адаптивная система нейронечеткого вывода.
Гибридная сеть представляет собой многослойную нейронную сеть
специальной структуры без обратных связей, в которой используются
обычные (не нечеткие) сигналы, веса и функции активации, а выполнение
операции суммирования основано на использовании фиксированной
Т-нормы, S-кнормы или некоторой другой непрерывной операции. При
этом значения входов, выходов и весов гибридной нейронной сети
представляют собой вещественные числа из отрезка [0, 1].
Основная идея, положенная в основу модели гибридных сетей,
заключается в том, чтобы использовать существующую выборку данных
для определения параметров функций принадлежности, которые лучше
всего соответствуют некоторой системе нечеткого вывода. При этом для
нахождения параметров функций принадлежности используются
известные процедуры обучения нейронных сетей.
В пакете Fuzzy Logic Toolbox системы МATLAB гибридные сети
реализованы в форме так называемой адаптивной системы нейронечеткого
вывода ANFIS. С одной стороны, гибридная сеть ANFIS – это нейронная
сеть с единственным выходом и несколькими входами, которые
представляют собой нечеткие лингвистические переменные. При этом
термы входных лингвистических переменных описываются стандартными
для системы МATLAB функциями принадлежности, а термы выходной
переменной представляются линейной или постоянной функцией
принадлежности.
С другой стороны, гибридная сеть ANFIS представляет собой
систему нечеткого вывода FIS типа Сугено нулевого или первого порядка,

267
в которой каждое из правил нечетких продукций имеет постоянный вес,
равный 1.

15.2. Моделирование и реализация нейронечеткой сети

в среде МATLAB

В пакете Fuzzy Logic Toolbox системы МATLAB гибридные сети


реализованы в форме адаптивных систем нейро-нечеткого вывода ANFIS.
При этом разработка и исследование гибридных сетей оказывается
возможной:
 в интерактивном режиме с помощью специального графического
редактора адаптивных сетей, получившего название редактора ANFIS;
 в режиме командной строки с помощью ввода имен
соответствующих функций с необходимыми аргументами непосредственно
в окно команд системы МATLAB.
Редактор ANFIS позволяет создавать или загружать конкретную
модель адаптивной системы нейронечеткого вывода, выполнять ее
обучение, визуализировать ее структуру, изменять и настраивать ее
параметры, а также использовать настроенную сеть для получения
результатов нечеткого вывода.

15.2.1. Описание ANFIS-редактора

ANFIS является аббревиатурой Adaptive Neuro-Fuzzy Inference


System – (адаптивная нейронечеткая система). ANFIS-редактор позволяет
автоматически синтезировать из экспериментальных данных нейро-
нечеткие сети. Нейронечеткую сеть можно рассматривать как одну из
разновидностей систем нечеткого логического вывода типа Сугэно. При
этом функции принадлежности синтезированных систем настроены
(обучены) так, чтобы минимизировать отклонения между результатами

268
нечеткого моделирования и экспериментальными данными. Загрузка
ANFIS-редактора осуществляется по команде anfisedit. В результате
выполнения этой команды появится графическое окно (рис. 15.2), на
котором размещены функциональные области ANFIS-редактора.

Рис. 15.2. Основное окно ANFIS-редактора

ANFIS-редактор содержит 3 верхних меню – File, Edit и View, область


визуализации, область свойств ANFIS, область загрузки данных, область
генерирования исходной системы нечеткого логического вывода, область
обучения, область тестирования, область вывода текущей информации, а

269
также кнопки Help и Close, которые позволяют вызвать окно справки и
закрыть ANFIS-редактор, соответственно.
Меню File и View одинаковые для всех GUI-модулей, используемых
с системами нечеткого логического вывода.
Меню Edit. Общий вид меню приведен на рис. 15.3.

Рис. 15.3. Меню Edit

Команда Undo отменяет ранее совершенное действие. Выполняется


также по нажатию <Ctrl+Z>.
Команда FIS Properties… открывает FIS-редактор. Эта команда
может быть также выполнена нажатием <Ctrl+1>.
Команда Membership Functions… открывает редактор функций
принадлежностей. Эта команда может быть также выполнена нажатием
<Ctrl+2>.
Команда Rules… открывает редактор базы знаний. Эта команда
может быть также выполнена нажатием <Ctrl+3>.
Команда Anfis… открывает ANFIS-редактор. Эта команда может быть
также выполнена нажатием <Ctrl+3>. Заметим, что данная команда,
запущенная из ANFIS-редактора, не приводит к выполнению каких-либо
действий, так этот редактор уже открыт. Однако в меню Edit других GUI-
модулей, используемых с системами нечеткого логического вывода,
добавляется команда Anfis…, позволяющая открыть ANFIS-редактор из
этих модулей.
Область визуализации. В этой области выводится два типа
информации:

270
 при обучении системы – кривая обучения в виде графика
зависимости ошибки обучения от порядкового номера итерации;
 при загрузке данных и тестировании системы –
экспериментальные данные и результаты моделирования.
Экспериментальные данные и результаты моделирования выводятся
в виде множества точек в двухмерном пространстве. При этом по оси
абсцисс откладывается порядковый номер строчки данных в выборке
(обучающей, тестирующей или контрольной), а по оси ординат – значение
выходной переменной для данной строчки выборки. Используются
следующие маркеры:
 голубая точка (.) – тестирующая выборка;
 голубая окружность (o) – обучающая выборка;
 голубой плюс (+) – контрольная выборка;
 красная звездочка (*) – результаты моделирования.
Область свойств ANFIS. В области свойств ANFIS (ANFIS info)
выводится информация о количестве входных и выходных переменных, о
количестве функций принадлежностей для каждой входной переменной, а
также о количестве строчек в выборках. В этой области расположены две
кнопки: Structure и Clear Plot.
Нажатие кнопки Structure открывает новое графическое окно, в
котором система нечеткого логического вывода представляется в виде
нейронечеткой сети. В качестве иллюстрации приведена нейронечеткая
сеть, содержащая четыре входных переменных и одну выходную
(рис. 15.4). В этой системе по три лингвистических термы используются
для оценки каждой из входных переменных и четыре термы – для
выходной.
Нажатие кнопки Clear Plot позволяет очистить область
визуализации.

271
Рис. 15.4. Пример структуры нейронечеткой сети

Область загрузки данных. В области загрузки данных (Load data)


расположены:
 меню выбора типа данных (Type), содержащее альтернативы
(Traning – обучающая выборка; Testing – тестирующая выборка; Checking –
контрольная выборка; Demo – демонстрационный пример);
 меню выбора источника данных (From), содержащее
альтернативы (disk – диск; worksp – рабочая область MATLAB);
 кнопка загрузки данных Load Data…, по нажатию которой
появляется диалоговое окно выбора файла, если загрузка данных
происходит с диска, или окно ввода идентификатора выборки, если
загрузка данных происходит из рабочей области;
 кнопка очистки данных Clear Data.

272
В течение одного сеанса работы ANFIS-редактора можно загружать
данные одного формата, т.е. количество входных переменных в выборках
должно быть одинаковым.
Область генерирования исходной системы нечеткого логического
вывода. В области генерирования (Generate FIS) расположено меню
выбора способа создания исходной системы нечеткого логического
вывода. Меню содержит следующие альтернативы:
 Load from disk – загрузка системы с диска;
 Load from worksp – загрузка системы из рабочей области
MATLAB;
 Grid partition – генерирование системы по методу решетки (без
кластеризации);
 Sub. Clustering – генерирование системы по методу
субкластеризации.
В области также расположена кнопка Generate, по нажатию которой
генерируется исходная система нечеткого логического вывода.
При выборе Load from disk появляется стандартное диалоговое окно
открытия файла.
При выборе Load from worksp появляется стандартное диалоговое
окно ввода идентификатора системы нечеткого логического вывода.
При выборе Grid partition появляется окно ввода параметров метода
решетки (рис. 15.5), в котором нужно указать количество термов для
каждой входной переменной и тип функций принадлежности для входных
и выходной переменных.
При выборе Sub. clustering появляется окно ввода следующих
параметров метода субкластеризации (рис. 15.6):
 Range of influence – уровни влияния входных переменных;
 Squash factor – коэффициент подавления;
 Accept ratio – коэффициент, устанавливающий во сколько раз
потенциал данной точки должен быть выше потенциала центра первого
273
кластера для того, чтобы центром одного из кластеров была назначена
рассматриваемая точка;
 Reject ratio – коэффициент, устанавливающий во сколько раз
потенциал данной точки должен быть ниже потенциала центра первого
кластера, чтобы рассматриваемая точка была исключена из возможных
центров кластеров.

Рис. 15.5. Окно ввода параметров для метода решетки

Рис. 15.6. Окно ввода параметров для метода субкластеризации


274
Область обучения. В области обучения (Train FIS) расположены
меню выбора метода оптимизации (Optim. method), поле задания требуемой
точности обучения (Error tolerance), поле задания количества итераций
обучения (Epochs) и кнопка Train Now, нажатие которой запускает режим
обучение. Промежуточные результаты обучения выводятся в область
визуализации и в рабочую область MATLAB. В ANFIS-редакторе
реализованы два метода обучения:
 backpropa – метод обратного распространения ошибки,
основанный на идеях метода наискорейшего спуска;
 hybrid – гибридный метод, объединяющий метод обратного
распространения ошибки с методом наименьших квадратов.
Область тестирования. В области тестирования (Test FIS)
расположены меню выбора выборки и кнопка Test Now, по нажатию
которой происходит тестирование нечеткой системы с выводом
результатов в область визуализации.
Область вывода текущей информации. В этой области выводится
наиболее существенная текущая информация, например, сообщения об
окончании выполнений операций, значение ошибки обучения или
тестирования и т.п.

15.2.2. Синтез нейронечеткой сети в среде МATLAB

Описание задачи: имеются исходные данные изменения финансового


индекса РТС за период с 01.03.2012 по 30.04.2012. Требуется построить
нейронечеткую сеть и спрогнозировать значение индекса на 1.05.2012.
Общая последовательность процесса разработки модели гибридной
сети может быть представлена в следующем виде.
1. Подготовка файла с обучающими данными (табл. 15.1).
Целесообразно воспользоваться редактором электронных таблиц MS Excel.
Обучающую выборку необходимо сохранить во внешнем файле с
расширением *.dat. Алгоритм прогнозирования подразумевает то, что
275
каждое последующее значение рассчитывается на основе нескольких
предыдущих.

Таблица 15.1 – Набор данных для обучения нейронечеткой сети


Первая входная Вторая входная Третья входная Выходная
переменная переменная переменная переменная
688,72 686,21 667,27 669,26
686,21 667,27 669,26 673,25
667,27 669,26 673,25 688,68
669,26 673,25 688,68 680,86
673,25 688,68 680,86 671,33
688,68 680,86 671,33 669,55
680,86 671,33 669,55 676,20
671,33 669,55 676,20 680,57
669,55 676,20 680,57 698,70
676,20 680,57 698,70 708,59
680,57 698,70 708,59 721,81
698,70 708,59 721,81 712,88
708,59 721,81 712,88 713,15
721,81 712,88 713,14 705,16
712,88 713,14 705,16 706,71
713,14 705,16 706,71 716,55
705,16 706,71 716,55 721,35
706,71 716,55 721,35 736,28
688,72 686,21 667,27 669,26
686,21 667,27 669,26 673,25
667,27 669,26 673,25 688,68
669,26 673,25 688,68 680,86
673,25 688,68 680,86 671,33
688,68 680,86 671,33 669,55
680,86 671,33 669,55 676,20
671,33 669,55 676,20 680,57

2. Открыть редактор ANFIS. Загрузить файл с обучающими данными.


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

276
Внешний вид редактора ANFIS с загруженными обучающими
данными изображен на рис. 15.7.

Рис. 15.7. Графический интерфейс редактора ANFIS после загрузки


обучающих данных

3. После подготовки и загрузки обучающих данных можно


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

277
Перед генерацией структуры системы нечеткого вывода типа Сугено
после вызова диалогового окна свойств зададим для каждой из входных
переменных по три лингвистических терма, а в качестве типа их функций
принадлежности выберем треугольные функции.
После нажатия кнопки Generate FIS вызывается диалоговое окно с
указанием числа и типа функций принадлежности для отдельных термов
входных переменных и выходной переменной (рис. 15.8).

Рис. 15.8. Диалоговое окно для задания количества и типа функций


принадлежности

4. После генерации структуры гибридной сети можно


визуализировать ее структуру, для чего следует нажать кнопку Structure в
правой части графического окна (рис. 15.9).
Для рассматриваемого примера система нечеткого вывода содержит
три входных переменных с тремя термами каждая, 27 правил нечетких
продукций, одну выходную переменную с 27 термами.
278
Рис. 15.9. Структура сгенерированной системы нечеткого вывода

5. Перед обучением гибридной сети необходимо задать параметры


обучения, для чего следует воспользоваться следующей группой опций в
правой нижней части рабочего окна:
1. Выбрать метод обучения гибридной сети – обратного
распространения (backpropo) или гибридный (hybrid), представляющий
собой комбинацию метода наименьших квадратов и метода убывания
обратного градиента.
2. Установить уровень ошибки обучения (Error Tolerance) – по
умолчанию значение 0 (изменять не рекомендуется).
3. Задать количество циклов обучения (Epochs) – по умолчанию
значение 3 (рекомендуется увеличить для рассматриваемого примера
задать его значение равным 40).
Для обучения сети следует нажать кнопку Train now. При этом ход
процесса обучения иллюстрируется в окне визуализации в форме графика
зависимости ошибки от количества циклов обучения (рис. 15.10).

279
Рис. 15.10. График зависимости ошибок обучения от количества циклов
обучения

Дальнейшая настройка параметров построенной и обученной


гибридной сети может быть выполнена с помощью стандартных
графических средств пакета Fuzzy Logic Toolbox (рис. 15.11 – 15.14). Для
этого рекомендуется сохранить созданную систему нечеткого вывода во
внешнем файле с расширением *.fis, после чего следует загрузить этот
файл в редактор систем нечеткого вывода FIS.
6. Выполним проверку адекватности построенной нечеткой модели
гибридной сети. Для этого можно спрогнозировать курс доллара на
определенный день. Для решения этой задачи необходимо воспользоваться
функцией evalfis.

280
Рис. 15.11. Графический интерфейс редактора FIS для сгенерированной
системы нечеткого вывода

Рис. 15.12. Графический интерфейс редактора функций принадлежности


построенной системы нечеткого вывода

281
Рис. 15.13. Графический интерфейс просмотра правил сгенерированной
системы нечеткого вывода

Рис. 15.14. Фрагмент базы нечетких правил

282
15.3. Индивидуальные задания

1. Сформулировать задачу из области вычислительной техники, для


решения которой было бы обосновано применение гибридной
нейронечеткой сети.
2. Сформировать выборку для обучения гибридной нейронной сети.
3. Сгенерировать и визуализировать структуру гибридной нейронной
сети в системе MATLAB.
4. Обучить гибридную нейронную сеть, при этом задать и
обосновать параметры ее обучения.
5. Построить систему нечеткого вывода для полученной гибридной
нейронной сети.
6. Выполнить проверку адекватности построенной нечеткой модели
гибридной сети.
7. Оформите отчет по лабораторной работе.

283
Лабораторная работа 16

РЕШЕНИЕ ЗАДАЧИ ПРОГНОЗИРОВАНИЯ С ПОМОЩЬЮ


НЕЧЕТКИХ НЕЙРОННЫХ СЕТЕЙ

Цель лабораторной работы: получение и закрепление знаний,


формирование практических навыков построения нейронных сетей и
гибридных нейронных сетей для прогнозирования в пакете MATLAB.

16.1. Краткие сведения из теории

Нейронные сети и нечеткая логика являются универсальными


аппроксиматорами сложных (нелинейных) функциональных зависимостей
во многих интеллектуальных задачах кибернетики: прогнозирования,
диагностики, распознавания образов и др.
Достоинством нечеткой логики является возможность использования
экспертных знаний о структуре объекта в виде лингвистических
высказываний: если <входы>, то <выход>. Однако аппарат нечеткой
логики не содержит механизмов обучения. Поэтому полученные с его
помощью результаты сильно зависят от вида функций принадлежности,
которыми формализуются нечеткие термы. Кроме того, эксперту
необходимо определить все правила. Такой алгоритм во многом статичен.
Необходимость его изменения повлечет за собой довольно трудоемкую
экспертную процедуру.
Главной особенностью нейронных сетей является их способность к
обучению. Для обучения нейронной сети не требуется никакой априорной
информации о структуре искомой функциональной зависимости. Нужна
лишь обучающая выборка в виде пар <входы – выход>.
Вместо определения всех функций принадлежности
лингвистических переменных и правил необходимо создать обучающую

284
выборку достаточного объема. Одним из критериев "достаточности"
служит следующий: число обучающих пар <входы – выход> должно
превышать число настраиваемых параметров сети.
Преимущество данного метода заключается в возможности
самонастройки параметров сети в процессе работы.
Объединение нечеткой логики с нейронными сетями дает
принципиально новое качество. Получаемая в результате такого
объединения нейронечеткая сеть обладает двумя важнейшими
человеческими (интеллектуальными) свойствами:
 лингвистичностью, т.е. использованием знаний на естественном
языке;
 обучаемостью в реальном масштабе времени.
В соответствии с анализом, проведенным в ряде работ, для класса
задач, к которым применимы нейронечеткие сети, нейронные сети при
обучении требуют значительно больше итераций. Поскольку любая
итерация занимает определенное машинное время, то и общее время
обучения НС больше.
Существует две основных разновидности нейронечетких сетей:
Сугено-Такаги-Канга и Ванга-Менделя. Структура сети Ванга-Менделя
приведена на рис. 16.1.
Слой I состоит из нейронов-фазификаторов и выполняет раздельную
фазификацию каждой переменной по функциям принадлежности (FP).
Выходы данного слоя рассчитываются с помощью обобщенной функции
Гаусса:

 ( x  C[i  M  j ]) 2  B 
FP[i  M  j ]  exp   2 
 , (16.1)
 2 D[i  M  j ]  
 

представленной в рациональной форме:

285
1
FP[i  M  j ]  2 B[i  M  j ]
, (16.2)
 X [i ]  C[i  M  j ] 
1   
 D[i  M  j ] 

где i  0, N  1, j  0,M  1; M – количество функций принадлежности для


каждой переменной; N – число входных переменных; C[iM + j]
(смещение); D[iM + j] (масштаб); B[iM + j] (форма) – это нелинейные
параметры сети, описывающие функцию Гаусса (подлежат настройке при
обучении).

Рис. 16.1. Структура ННС Ванга-Менделя

Слой II состоит из нейронов-правил и определяет уровни активации


правил вывода (PV). Выходы данного слоя рассчитываются по формуле:

N 1
PV [i ]   FP[ j ] , (16.3)
j 0

где i  0, K  1, а K  M N .

286
Слой III состоит из двух типов нейронов-сумматоров, один из
которых (S1) производит агрегирование правил вывода, а второй (S2) –
агрегирование взвешенных правил вывода. Выходы нейронов
рассчитываются по формулам:

K 1
S1[ j ]  W [ j, i]  PV [i] , (16.4)
i 0
K 1
S2[ j]   PV [i] , (16.5)
i 0

где j  0, L  1 , L – количество выходов сети; W[j, i] – линейные параметры


сети, определяющие весовые коэффициенты применяемого правила
(подлежат настройке при обучении).
Слой IV содержит нейроны-нормализаторы и нормализует выходные
переменные сети Y. Его выход рассчитывается по формуле:

Y [i]  S1[i] / S2[i] , (16.6)

где i  0, K  1.
Данная сеть содержит два параметрических слоя – первый и третий.
В первом слое каждый нейрон хранит три нелинейных параметра сети C, D
и B, которые определяют функцию принадлежности Гаусса. В третьем
слое хранятся линейные параметры сети W, определяющие весовые
коэффициенты правил и значения выходных переменных.

287
16.2. Построение нейронных сетей и гибридных нейронных сетей для
прогнозирования в пакете MATLAB

Одной из основных возможностей нейронных сетей (НС) является


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

16.2.1. Построение нейронной сети


Построим нейронную сеть, которая по данным о курсе валюты за
четыре банковских дня предсказывает курс на пятый день
(экстраполирует). Используются данные с 01.01.2012 по 10.03.2012 г. о
курсе доллара США. Обучающие данные – с 01.01.2012 по 01.03.2012 г.
Создадим матрицу обучающих данных:

» obych=[ 31.5673 31.6053 31.6117 31.6113 31.6123


31.6053 31.6117 31.6113 31.6123 31.6268
31.6117 31.6113 31.6123 31.6268 31.6302
31.6113 31.6123 31.6268 31.6302 31.6409
………………………………………………………………
31.8382 31.8423 31.8445 31.8424 31.844];

288
Создадим матрицу входных значений:

» vxod=obych(:,1:4);

Создадим матрицу ожидаемых выходных значений:

» vixod=obych(:,5);

Создадим нейронную сеть для прогнозирования:

» prognoz=newff(minmax(vxod'),[15 1],{'logsig'
'purelin'});

Обучим нейронную сеть:

» prognoz=train(prognoz,vxod',vixod');

В результате обучения нейронной сети получим окно, приведенное


на рис. 16.2.
Создадим тестовую выборку для проверки результатов обучения:

test =
31.8400 31.8400 31.8424 31.8547 31.8584
31.8400 31.8424 31.8547 31.8584 31.8596
31.8424 31.8547 31.8584 31.8596 31.8578
31.8547 31.8584 31.8596 31.8578 31.8600
» test_vxod=test(:,1:4);
» test_vixod=test(:,5);

289
Рис. 16.2. Результаты обучения НС

Проведем моделирование обученной сети на тестовых данных:

» sim(prognoz,test_vxod)
ans =
31.8455 31.8467 31.8467 31.8463
» test_vixod
test_vixod=
31.8584
31.8596
31.8578
31.8600

Результаты моделирования и истинные значения курса валют


отличаются в достаточной степени.
290
16.2.2. Построение гибридной нейронной сети
Построим гибридную нейронную сеть, которая по данным о курсе
валюты за четыре банковских дня предсказывает курс на пятый день
(экстраполирует). Используются данные с 01.01.2012 по 10.03.2012 г. о
курсе доллара США. Обучающие данные – с 01.01.2012 по 01.03.2012 г.,
тестирующие – с 1.01.2012 по 9.01.2012 г., проверочные – на 10.01.2012 г.
Создадим файлы данных .dat: training.gat, testing.dat, cheking.dat. В
них будут содержаться данные, необходимые для обучения и проверки
нейронной сети. Данные в них – матрицы, в каждой из которых по 5
столбцов – 4 банковских дня (вход) и 1 день (выход). В первом файле – 40
строк, во втором – 4, в третьем – 1.
Файл Training.dat
31.5673 31.6053 31.6117 31.6113 31.6123
31.6053 31.6117 31.6113 31.6123 31.6268
31.6117 31.6113 31.6123 31.6268 31.6302
31.6113 31.6123 31.6268 31.6302 31.6409
………………………………………………………………
31.8382 31.8423 31.8445 31.8424 31.8424

Файл Testing.dat
31.8422 31.8445 31.8424 31.8547 31.8584
31.8423 31.8424 31.8547 31.8584 31.8596
31.8424 31.8547 31.8584 31.8596 31.8578
31.8547 31.8584 31.8596 31.8578 31.8634

Файл Cheking.dat
31.8584 31.8596 31.8578 31.8623 31.8597

Для построения нечетких нейронных сетей в MATLAB используется


редактор Anfis Editor (рис. 16.3).

291
Запустим редактор командой anfisedit.

Рис. 16.3. Главное окно Anfis editor

В меню Load data следует выбрать Training и From disk, нажать


кнопку load data. В появившемся окне следует выбрать созданный ранее
training.dat.
В меню Load data следует выбрать Testing и From disk, нажать
кнопку load data. В появившемся окне следует выбрать созданный ранее
testing.dat.
В меню Load data следует выбрать Cheking и From disk, нажать
кнопку load data. В появившемся окне следует выбрать созданный ранее
cheking.dat.
Данные для обучения и проверки загружены (рис. 16.4).

292
Рис. 16.4. Вид главного окна редактора после загрузки обучающих данных

Далее, установив переключатель меню Generate FIS в положение


Grid partition, следует нажать кнопку Generate FIS (рис. 16.5).

Рис. 16.5. Параметры генерируемой сети


293
В данном случае в модели 4 входных переменных, каждой из
которых соответствуют по 3 терма типа gaussmf. Выходная переменная
задается линейной функцией.
Нажав на кнопку Structure меню Anfis info, можно увидеть структуру
сети (рис. 16.6).

Рис. 16.6. Структура нечеткой нейронной сети

Далее следует выбрать гибридный метод обучения, требуемую


ошибку обучения – 0 и количество циклов обучения – 10, как показано на
рис. 16.7. Затем следует нажать кнопку Train Now.
Ошибка обучения установилась на уровне 0.00010501.
Проведем тестирование сети. Для этого в разделе Test FIS главного
окна следует выбрать соответствующую выборку и нажать кнопку Nest
Now. В результате, для обучающих данных ошибка установилась на уровне
0.00014247 (рис. 16.8), для тестирующих данных ошибка установилась на
294
уровне 0.020429 (рис. 16.9), а для проверочных (контрольных) данных
ошибка установилась на уровне 0.002094 (рис. 16.10).

Рис. 16.7. Результаты обучения ННС

С помощью команды FIS Properties меню Edit возможно


просмотреть полученную нечеткую нейронную сеть как систему нечеткого
логического вывода.
Далее экспортируем результаты в рабочую область Export->To
workspace.
Воспользуемся командой evalfis для точного определения значения
прогноза:

» out=evalfis([31.8584 31.8596 31.8578 31.86], anfis)


out= 31.8568

295
Рис. 16.8. Результаты моделирования ННС для обучающих данных

Рис. 16.9. Результаты моделирования ННС для тестирующих данных


296
Рис. 16.10. Результаты моделирования ННС для контрольных данных

Рис. 16.11. Экспорт результатов

Действительное же значение прогноза равно 31.8597.


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

297
16.3. Индивидуальное задание

1. Сформулировать задачу прогнозирования из области


вычислительной техники, для решения которой было бы обосновано
применение НС и ННС.
2. Сформировать обучающую выборку для НС и ННС.
3. Построить НС и, экспериментируя с количеством нейронов во
входных и скрытых слоях, функциями активации, методами обучения,
добиться наилучшего результата по прогнозированию.
4. Визуализировать полученную структуру НС в системе MATLAB.
5. Построить ННС и, экспериментируя с методами обучения,
количеством функций принадлежности во входном слое, добиться
наилучшего результата прогнозирования. Количество входов взять таким
же, как и в п. 3 индивидуального задания.
6. Визуализировать полученную структуру ННС в системе MATLAB.
7. Построить систему нечеткого логического вывода для полученной
ННС.
8. Сравнить полученные с помощью НС и ННС результаты
(численно) и сделать выводы.
9. Оформите отчет по лабораторной работе.

298
ТРЕБОВАНИЯ К ОФОРМЛЕНИЮ ОТЧЕТОВ

Отчеты оформляются на украинском языке в редакторе Microsoft


Word шрифтом Times New Roman без переносов. Межстрочный интервал –
полуторный, абзацный отступ – 1,25 см. Объем отчета – не более 10
печатных страниц. Отчет готовится на листах формата А4, ориентация –
книжная. Поля: верхнее, нижнее и правое – по 2,0 см, левое – 3,0 см.
Размеры колонтитулов: верхнего – 0 см, нижнего – 2,0 см. Нумерация
выполняется внизу страницы, размер шрифта 14 pt, выравнивание по
центру.
В первой строке печатается фамилия и инициалы студента, а также
номер академической группы. Размер шрифта 12 pt, полужирный, курсив,
выравнивание по правому краю.
На второй сроке печатается номер работы прописными буквами
(шрифт  прямой, полужирный, 14 pt, выравнивание по центру).
Далее печатается тема работы прописными буквами через одну
пустую строку после номера работы (шрифт  прямой, полужирный, 14 pt,
выравнивание по центру).
Затем печатается цель работы, через одну пустую строку после тема
работы. Размер шрифта 14 pt, отступ 1,25 пт, выравнивание  по ширине.
Далее печатаются результаты выполнения всех пунктов
индивидуального задания. Текст печатается шрифтом – 14 pt, абзацный
отступ – 1,25 см, выравнивание по ширине.
В конце приводятся выводы по работе. Они печатаются, через одну
пустую строку после результатов выполнения работы. Размер шрифта
14 pt, отступ 1,25 пт, выравнивание  по ширине.

299
СПИСОК ЛИТЕРАТУРЫ

1. Ануфриев И. Е. Самоучитель MATLAB 7 / И. Е. Ануфриев,


А. Б. Смирнов, Е. Н. Смирнова.  С.Пб. : БХВ-Петербург, 2005.  1104 с.
2. Ануфриев И. Е. Самоучитель MATLAB 5.3/6x / И. Е. Ануфриев.
 С.Пб. : БХВ-Петербург, 2004.  736 с.
3. Кетков Ю. MATLAB 6x: программирование численных методов /
Ю. Кетков.  С.Пб. : БХВ-Петербург, 2004.  672 с.
4. Борисов В. В. Нечеткие модели и сети / В. В. Борисов,
В. В. Круглов, А. С. Федулов. – М. : Горячая линияТелеком, 2007.
5. Дьяконов В. П. MATLAB 6: учебный курс / В. П. Дьяконов.
– С.Пб. : Питер, 2001. – 592 с.
6. Дьяконов В. П. Математические пакеты расширения MATLAB:
спец. справ. / В. П. Дьяконов, В. В. Круглов. – С.Пб. : Питер, 2001. – 480 с.
7. Чен К. MATLAB в математических исследованиях / К. Чен,
П. Джиблин, А. Ирвинг. – М. : Мир, 2001. – 346 с.
8. Леоненков А. В. Нечеткое моделирование в среде MATLAB и
fuzzyTECH / А. В. Леоненков. – С.Пб. : БХВ-Петербург, 2003.
9. Дьяконов В. П. MATLAB 6/6.1/6.5 + SIMULINK 4/5 в математике
и моделировании / В. П. Дьяконов. – М. : СОЛОН-Пресс, 2003. – 565 с.
10. Дьяконов В. П. MATLAB 6.5 SP1/7/7 SP1/7 SP2 + SIMULINK 5/6.
Инструменты искусственного интеллекта и биоинформатики /
В. П. Дьяконов. – М. : СОЛОН-Пресс, 2006. – 456 с.
11. Круглов В. В. Нечёткая логика и искусственные нейронные сети:
Учеб. пособие / В. В. Круглов, М. И. Дли, Р. Ю. Голунов. – М. : Изд-во
физико-математической литературы, 2001. – 224 с.
12. Галушкин А. И. Применения нейрокомпьютеров в финансовой
деятельности / А. И. Галушкин. – Новосибирск: Наука, 2002. – 215 с.
13. Ефимов Д. В. Нейросетевые системы управления / Д. В. Ефимов.
– М. : Высшая школа, 2002. – 184 с.
300
14. Уоссермен Ф. Нейрокомпьютерная техника: Теория и практика /
Ф. Уоссермен. – М. : Мир, 2006. – 240 с.
15. Ярушкина Н. Г. Основы теории нечетких и гибридных систем:
учеб. пособие / Н. Г. Ярушкина. – M. : Финансы и статистика, 2004.
– 320 с.
16. Гостев В. И. Синтез нечетких регуляторов систем
автоматического управления / В. И. Гостев. – К. : Радіоаматор, 2005.
– 708 с.
17. Генетические алгоритмы, искусственные нейронные сети и
проблемы виртуальной реальности / Г. К. Вороновский, К. В. Махотило,
С. Н. Петрашев, С. А. Сергеев. – Х. : Основа, 1997. – 112 с.
18. Мэтьюз Д. Г. Численные методы. Использование MATLAB /
Д. Г. Мэтьюз, К. Д. Финк. – 3-е изд.; пер. с англ. – М. : Изд. дом "Вильямс",
2001. – 720 с.
19. Усков А. А. Интеллектуальные технологии управления.
Искусственные нейронные сети и нечеткая логика / А. А. Усков,
А. В. Кузьмин. – М. : Горячая линия-Телеком, 2004. – 143 с.
20. Пономарев А. С. Нечеткие множества в задачах
автоматизированного управления и принятия решений: учеб. пособие /
А. С. Пономарев.  Х. : НТУ "ХПИ", 2005.  232 с.

301
СОДЕРЖАНИЕ

Вступление .......................................................................................................... 3
Лабораторная работа 1. Простейшие вычисления в пакете MATLAB ....... 5
1.1. Краткие сведения из теории ........................................................................ 5
1.1.1. Рабочая среда пакета MATLAB ............................................................... 5
1.1.2. Арифметические вычисления................................................................... 7
1.1.3. Форматы вывода результата вычислений ..................................................... 8
1.1.4. Использование элементарных функций ................................................................. 11
1.1.5. Работа с комплексными числами ....................................................... 15
1.2. Индивидуальные задания .......................................................................... 17
Лабораторная работа 2. Простейшие вычисления в пакете MATLAB
с использованием переменных и векторов ..................................................... 19
2.1. Краткие сведения из теории ...................................................................... 19
2.1.1. Использование переменных в пакете MATLAB .................................. 19
2.1.2. Сохранение рабочей среды .................................................................... 22
2.1.3. Просмотр переменных ............................................................................ 25
2.1.4. Работа с массивами ................................................................................. 26
2.2. Индивидуальные задания .......................................................................... 40
Лабораторная работа 3. Простейшие вычисления в пакете MATLAB
с использованием матриц ................................................................................. 42
3.1. Краткие сведения из теории ...................................................................... 42
3.1.1. Различные способы ввода матриц в пакете MATLAB ........................ 42
3.1.2. Обращение к элементам матриц в пакете MATLAB ........................... 44
3.1.3. Операции над матрицами в пакете MATLAB: сложение, вычитание,
умножение, транспонирование и возведение в степень................................ 45
3.1.4. Умножение матриц и векторов .............................................................. 49
3.1.5. Решение систем линейных уравнений .................................................. 50
3.1.6. Блочные матрицы .................................................................................... 50
3.1.7. Удаление строк и столбцов .................................................................... 52
3.1.8. Заполнение матриц при помощи индексации ...................................... 53

302
3.1.9. Создание матриц специального вида .................................................... 55
3.1.10. Поэлементные операции с матрицами ................................................ 58
3.1.11. Визуализация матриц ............................................................................ 59
3.2. Индивидуальные задания .......................................................................... 60
Лабораторная работа 4. Построение таблиц значений и графиков
функций в пакете MATLAB ............................................................................. 63
4.1. Краткие сведения из теории ...................................................................... 63
4.1.1. Построение таблиц значений функции одной переменной в пакете
MATLAB ............................................................................................................ 63
4.1.2. Построение графиков функции одной переменной............................. 68
4.1.3. Построение графиков функций двух переменных .............................. 75
4.1.4. Построение контурных графиков функций двух переменных ........... 79
4.1.5. Оформление графиков функций ............................................................ 81
4.1.6. Вывод нескольких графиков на одни оси ............................................. 81
4.2. Индивидуальные задания .......................................................................... 86
Лабораторная работа 5. Исследование способов формирования нечетких
множеств и операций над ними ....................................................................... 89
5.1. Краткие сведения из теории ...................................................................... 89
5.1.1. Функции принадлежности...................................................................... 89
5.1.2. Операции с нечеткими множествами .................................................... 99
5.2. Индивидуальные задания ........................................................................ 103
Лабораторная работа 6. М-файлы и основы программирования в
MATLAB .......................................................................................................... 105
6.1. Краткие сведения из теории .................................................................... 105
6.1.1. Работа в редакторе М-файлов .............................................................. 105
6.1.2. Типы М-файлов ..................................................................................... 107
6.1.3. Установка путей .................................................................................... 109
6.1.4. Файл-функции ....................................................................................... 113
6.1.5. Основы программирования в MATLAB ............................................. 117
6.2. Индивидуальные задания ........................................................................ 132

303
Лабораторная работа 7. Исследование алгоритма нечеткой
кластеризации .................................................................................................. 135
7.1. Краткие сведения из теории .................................................................... 135
7.1.1. FCM-алгоритм кластеризации ............................................................. 135
7.1.2. Решение задач кластеризации .............................................................. 138
7.2. Индивидуальные задания ........................................................................ 143
Лабораторная работа 8. Моделирование нечеткой системы средствами
инструментария нечеткой логики .................................................................. 144
8.1. Краткие сведения из теории .................................................................... 144
8.2. Индивидуальные задания ........................................................................ 155
Лабораторная работа 9. Нечеткое управление динамическими
процессами................................................................................................................ 156
9.1. Краткие сведения из теории .................................................................... 156
9.1.1. Введение в теорию нечеткого управления ............................................156
9.1.2. Правила и импликация ......................................................................... 159
9.1.3. Комбинирование условий ..................................................................... 163
9.1.4. Накопление результатов и дефазификация ........................................ 163
9.2. Нечеткие системы управления динамическими процессами .............. 166
9.2.1. Моделирование качания шара по качели ........................................... 166
9.2.2. Моделирование отскоков шара от качелей ........................................ 168
9.2.3. Система управления смесителем воды ............................................... 171
9.2.4. Система управления перевернутым маятником ................................ 172
9.2.5. Система управления двумя перевернутыми маятниками ................. 173
9.3. Индивидуальные задания ........................................................................ 175
Лабораторная работа 10. Регулирование с использованием нечеткого
контролера........................................................................................................ 176
10.1. Краткие сведения из теории .................................................................. 176
10.1.1. Формирование функции принадлежности ....................................... 179
10.1.2. Создание пользовательских функций принадлежности ................. 182
10.1.3. Модель системы управления уровнем воды в баке ......................... 183
10.2. Индивидуальные задания ...................................................................... 188

304
Лабораторная работа 11. Символические вычисления в пакете
MATLAB .......................................................................................................... 190
11.1. Краткие сведения из теории .................................................................. 190
11.1.1. Символические переменные и функции ........................................... 190
11.1.2. Упрощение и преобразование выражений ....................................... 198
11.1.3. Разложение в ряд Тейлора и определение символических
выражений для сумм ....................................................................................... 205
11.1.4. Определение пределов, дифференцирование и
интегрирование ................................................................................................ 207
11.2. Индивидуальные задания ...................................................................... 211
Лабораторная работа 12. Применение генетических алгоритмов при
определении экстремумов функций .............................................................. 213
12.1. Краткие сведения из теории .................................................................. 213
12.2. Реализация генетических алгоритмов с помощью консоли
MATLAB .......................................................................................................... 221
12.2.1. Функция ga........................................................................................... 222
12.2.2. Функция gaoptimset ............................................................................. 224
12.3. Реализация генетических алгоритмов с помощью диалогового
окна MATLAB ................................................................................................. 225
12.4. Применение генетических алгоритмов для поиска минимума
функции ............................................................................................................ 228
12.5. Применение генетических алгоритмов для поиска максимума
функции ............................................................................................................ 231
12.6. Индивидуальные задания ...................................................................... 232
Лабораторная работа 13. Применение генетических алгоритмов в задачах
оптимизации..................................................................................................... 234
13.1. Краткие сведения из теории .................................................................. 234
13.1.1. Применение генетических алгоритмов к задаче оптимизации
вычислительной сети ...................................................................................... 234
13.1.2. Применение генетических алгоритмов к задаче размещения
радиоэлементов в корпусе устройства .......................................................... 241

305
13.1.3. Исследование эффективности генетических алгоритмов для задачи
размещения радиоэлементов в корпусе устройства .................................... 243
13.2. Индивидуальные задания ...................................................................... 247
Лабораторная работа 14. Применение MATLAB для моделирования
нейронной сети Хебба .................................................................................... 248
14.1. Краткие сведения из теории .................................................................. 248
14.1.1. Формальные нейроны искусственных нейронных сетей ................ 248
14.1.2. Решение задач распознавания на основе отдельных нейронов
(правило Хебба) ............................................................................................... 252
14.1.3. Нейронная сеть Хебба......................................................................... 258
14.2. Индивидуальные задания ...................................................................... 260
Лабораторная работа 15. Нейро-нечеткое моделирование в среде
MATLAB .......................................................................................................... 261
15.1. Краткие сведения из теории .................................................................. 261
15.2. Моделирование и реализация нейро-нечеткой сети в среде
MATLAB .......................................................................................................... 268
15.2.1. Описание ANFIS-редактора ................................................................ 268
15.2.2. Синтез нейро-нечеткой сети в среде MATLAB ............................... 275
15.3. Индивидуальные задания ...................................................................... 283
Лабораторная работа 16. Решение задачи прогнозирования с помощью
нечетких нейронных сетей ............................................................................. 284
16.1. Краткие сведения из теории .................................................................. 284
16.2. Построение нейронных сетей и гибридных нейронных сетей для
прогнозирования в пакете MATLAB ............................................................ 288
16.2.1. Построение нейронной сети ............................................................... 288
16.2.2. Построение гибридной нейронной сети ........................................... 291
16.3. Индивидуальное задание ....................................................................... 298
Требования к оформлению отчетов .......................................................... 299
Список литературы....................................................................................... 300

306
ДЛЯ ЗАМЕТОК
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________

307
Навчальне видання

ЗАКОВОРОТНИЙ Олександр Юрійович

ОСНОВИ ОБЧИСЛЮВАЛЬНОГО ІНТЕЛЕКТУ

Лабораторний практикум
для студентів денної та заочної форм навчання за напрямком
"Комп’ютерна інженерія" й "Комп’ютерні науки"
(Рос. мовою)

Роботу до видання рекомендував М. Й. Заполовський


Відповідальний за випуск С. Ю. Гавриленко
Редактор О. В. Козюк

План 2013 р., п. 17

Підп. до друку 23.04.2013. Формат 60 × 84 1 .


16 Папір Copy Paper.
Друк – ризографія. Гарнітура Times New Roman. Обл.-вид. арк. 12,6.
Наклад 300 прим. Ціна договірна.

Видавничий центр "НТМТ".


Свідоцтво про державну реєстрацію ДК № 1748 від 15.04.2004 р.
61072, Харків, пр. Леніна, 58, к. 106
Віддруковано в друкарні ТОВ "Цифра принт"
на цифровому лазерному комплексі Xerox DocuTech 6135.
Свідоцтво про державну реєстрацію А01 № 432705 від 03.08.2009 р.
61024 Україна, м. Харків, вул. Культури, 22–Б.

Вам также может понравиться