Академический Документы
Профессиональный Документы
Культура Документы
А. Ю. Заковоротный
Лабораторный практикум
для студентов дневной и заочной форм обучения по направлению
"Компьютерная инженерия" и "Компьютерные науки"
Утверждено
редакционно-издательским
советом университета НТУ "ХПИ",
протокол № 2 от 06.12.2012 г.
Харьков
HTMT
2013
УДК 004.89
ББК 32.973-02
З 19
Рецензенты:
Г. А. Кучук, канд. техн. наук, ст. науч. сотр., Харьковский университет
воздушных сил имени Ивана Кожедуба;
А. А. Серков, д-р техн. наук, профессор, заслуженный изобретатель
Украины, академик Академии наук прикладной радиоэлектроники,
НТУ "ХПИ"
УДК 004.89
ББК 32.973-02
ISBN 978-617-578-129-6 А. Ю. Заковоротный, 2013
ВСТУПЛЕНИЕ
3
математиков и инженеров. Несколько позже Бартоломеем Коско была
доказана теорема о нечеткой аппроксимации (Fuzzy Approximation
Theorem), согласно которой любая математическая система может быть
аппроксимирована системой, основанной на нечеткой логике. Другими
словами, с помощью естественно-языковых высказываний-правил "Если –
то", с последующей их формализацией средствами теории нечетких
множеств, можно сколько угодно точно отразить произвольную
взаимосвязь "входы – выход" без использования сложного аппарата
дифференциального и интегрального исчислений, традиционно
применяемого в управлении и идентификации.
Системы, основанные на нечетких множествах, разработаны и
успешно внедрены в таких областях, как управление технологическими
процессами, управление транспортом, медицинская диагностика,
техническая диагностика, финансовый менеджмент, биржевое
прогнозирование, распознавание образов и т.д. Спектр приложений очень
широкий – от видеокамер и бытовых стиральных машин до средств
наведения ракет ПВО и управления боевыми вертолетами. Практический
опыт разработки систем нечеткого логического вывода свидетельствует,
что сроки и стоимость их проектирования значительно меньше, чем при
использовании традиционного математического аппарата, при этом
обеспечивается требуемый уровень робастности и прозрачности моделей.
4
Лабораторная работа 1
» 1+2
ans =
3
7
Наберите в командной строке ans / 4.5 (при вводе десятичных дробей
используется точка) и нажмите <Enter>, получается:
» ans/4.5
ans =
0.6667
Замечание 2
Вид, в котором выводится результат вычислений, зависит от формата
вывода, установленного в MATLAB. Далее объяснено, как задать основные
форматы вывода.
» 100/3
ans = 33.3333
8
Этот формат вывода сохранится для всех последующих
вычислений, если только не будет установлен другой формат. Заметьте,
что в MATLAB возможна ситуация, когда при отображении слишком
большого или малого числа результат не укладывается в формат short.
Вычислите 100000/3, результат выводится в экспоненциальной форме:
» 100000/3
ans =
З.ЗЗЗЗе+004
» 1/3000
ans =
З.ЗЗЗЗе004
» 10 е9
??? 10 е9
Missing operator, comma, or semi-colon.
9
Если требуется получить результат вычислений более точно, то
следует выбрать в раскрывающемся списке long. Результат будет
отображаться в длинном формате с плавающей точкой long с
четырнадцатью цифрами после десятичной точки. Форматы short e и
long e предназначены для вывода результата в экспоненциальной форме
с четырьмя и пятнадцатью цифрами после десятичной точки
соответственно. Информацию о форматах можно получить, набрав в
командной строке команду help с аргументом format:
» help format
» format long e
» 1.25/3.11
ans =
4.019292604501608е001
10
» FORMAT LONG E
??? FORMAT LONG.
Missing operator, comma, or semi-colon.
e 2,5 (ln 11,3) 0,3 (sin 2,45 cos 3,78) / (tg 3,3) .
» ехр(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 ,
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
» exp(-2.5)*log(11.3)^0.3+
((sin.(2.45*pi)+cos(3.78*pi))/tan(3.3))^2
ans =
1.212446016556763e+002
» 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
» 0/0
Warning: Divide by zero.
ans = NaN
»sqrt(1.0)
ans = 0 + l.0000i
»(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
» 23i'
ans =
2.0000 + 3.0000i
» sin(2+3i)
ans =
9.1545 4.1689i
16
» complex(2.3, 5.8)
ans =
2.3000 + 5.8000i
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 A5 D
Выражение
BD DCA D1 / 5 / C B A5
3
C B4
18
Лабораторная работа 2
» z = 1.45
z =
1.4500
19
начинающаяся с буквы. Строчные и прописные буквы различаются,
например, MZ и mz являются двумя разными переменными. Количество
воспринимаемых MATLAB символов в имени переменной составляет 31.
В качестве упражнения на использование переменных найдите
значение следующего выражения:
» х = 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
» (x-y)^(3/2)
ans =
-0.8139 + 0.3547i
21
Вызов функций в MATLAB обладает достаточной гибкостью.
Например, вычислить е3,5 можно, вызвав функцию ехр из командной
строки:
» ехр(3.5)
ans =
33.1155
» t = ехр(3.5)
t =
33.1155
22
выбрать в меню File пункт Exit MATLAB;
нажать клавиши <Ctrl>+<Q>;
набрать команду Exit в командной строке и нажать <Enter>;
нажать на кнопку с крестиком в правом верхнем углу окна
программы MATLAB.
В следующем сеансе работы для восстановления значений
переменных следует открыть файл work20-06-12.mat при помощи пункта
Open меню File. Теперь все переменные, определенные в прошлом сеансе,
стали доступными. Их можно использовать во вновь вводимых командах.
Сохранение и восстановление переменных рабочей среды можно
выполнить и из командной строки. Для этого служат команды save и load.
В конце сеанса работы с MATLAB надо выполнить команду
» save work20-06-12
» load work20-06-12
Замечание 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
al = 3;
а2 = 2.5;
а3 = al+a2
а3 =
5.5000
24
save work20-02-06
quit
» who
Your variables are:
al a2 a3
»
Name Size Bytes Class
whos
al 8 double
1l
a2 1l 8 double
a3 ll 8 array
double
arrayusing 24 bytes
Grand total is 3 elements
array
25
последнем столбике Class указан тип переменных double array, т.е.
массив, состоящий из чисел двойной точности. В строке под таблицей
написано, что в итоге три элемента, т.е. переменные, занимают двадцать
четыре байта. Оказывается, что представление всех данных в MATLAB в
виде массивов дает определенные преимущества.
Для освобождения из памяти всех переменных используется команда
clear. Если в аргументах указать список переменных (через пробел), то
только они будут освобождены из памяти, например:
» clear al аЗ
» who
Your variables are:
a2
26
Массив упорядоченная, пронумерованная совокупность
однородных данных. У массива должно быть имя. Массивы различаются
по числу размерностей или измерений: одномерные, двухмерные,
многомерные. Доступ к элементам осуществляется при помощи индекса. В
MATLAB нумерация элементов массивов начинается с единицы. Это
значит, что индексы должны быть больше или равны единице.
Важно понять, что вектор, вектор-строка или матрица являются
математическими объектами, а одномерные, двухмерные или многомерные
массивы способы хранения этих объектов в компьютере. Далее будут
использоваться слова вектор и матрица, если больший интерес
представляет сам объект, чем способ его хранения. Вектор может быть
записан в столбик (вектор-столбец) и в строку (вектор-строка). Вектор-
столбцы и вектор-строки часто будут называться просто векторами,
различие будет сделано в тех случаях, если важен способ хранения вектора
в MATLAB. Векторы и матрицы обозначаются курсивом, а
соответствующие им массивы прямым моноширинным шрифтом,
например: "вектор а содержится в массиве а", "запишите матрицу R в
массив R".
Ввод, сложение и вычитание векторов
Работу с массивами начнем с простого примера вычисления суммы
векторов:
1,3 7,1
a 5,4 , b 3,5 .
6,9 8,2
27
» a = [1.3; 5.4; 6.9]
a =
1.3000
5.4000
6.9000
» с = а + b
с =
8.4000
8.9000
15.1000
» 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
» 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
» d = sin(с)
d =
0.8546
0.5010
0.5712
» 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
34
Работа с элементами векторов
Доступ к элементам вектор-столбца или вектор-строки
осуществляется при помощи индекса, заключаемого в круглые скобки
после имени массива, в котором хранится вектор. Если среди переменных
рабочей среды есть массив v, определенный вектор-строкой
» v(4)
ans =
8.2000
» v(2) = 555
v =
1.3000 555.0000 7.4000 8.2000 0.9000
35
Для помещения определенных элементов вектора в другой вектор в
заданном порядке служит индексация при помощи вектора. Запись в
массив w четвертого, второго и пятого элементов v производится
следующим образом:
» ind = [4 2 5];
» w = v(ind)
w =
8.2000 555.0000 0.9000
36
» wl = w(3:5)
wl =
3.3000 5.1000 2.6000
» w2 = [w(l:3) w(5:7)]
w2 =
0.1000 2.9000 3.3000 2.6000 7.1000 9.8000
» gm = (u(l)*u(2)*u(3))^(l/3)
gm =
17.4779
» z = [3; 2; 1; 4; 6; 5];
» р = prod(z)
37
p =
720
» sum(z)/length(z)
ans =
3.5000
» mean(z)
ans =
3.5000
» m1 = max(z)
m1 =
6
» m2 = min(z)
m2 =
1
38
этом случае встроенные функции min и max необходимо использовать с
двумя выходными аргументами, например
» [m, k] = min(z)
m =
1
k =
3
» 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
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
3 1 1
A .
2 4 3
» А =[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
2 7 0
-5 1 2]
B = 4 3 -1
2 7 0
-5 1 2
Еще один способ ввода матриц состоит в том, что матрицу можно
трактовать как вектор-строку, каждый элемент которой является вектор-
столбцом. Например, матрицу два на три
3 1 7
C
4 2 0
43
можно ввести при помощи команды:
» С(2, 3)
ans =
0
44
Расположение элементов матрицы в памяти компьютера определяет
еще один способ обращения к ним. Матрица А размера m на n хранится в
виде вектора длины mn, в котором элементы матрицы расположены один
за другим по столбцам
» С(1)
ans =
3
» С(5)
ans =
7
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 есть произвольная матрица
размера nm, то матрица, транспонированная по отношению к А, есть
матрица размера mn: A aki , k 1, m, i 1, n . Таким образом, строки
матрицы A становятся столбцами матрицы A , а столбцы матрицы A
становятся строками матрицы A .
47
Комплексно-сопряженная матрица получается из исходной в два
этапа: выполняется транспонирование исходной матрицы, а затем все
комплексные числа заменяются на комплексно-сопряженные.
Сопряжение и транспонирование матриц, содержащих комплексные
числа, приведут к созданию разных матриц:
Замечание 2
При вводе вектор-строк их элементы можно разделять или
пробелами, или запятыми. При вводе матрицы К применены запятые для
более наглядного разделения комплексных чисел в строке.
Возведение квадратной матрицы в целую степень производится с
использованием оператора ^:
» В2 = В^2
B2 =
27 32 -6
22 55 -2
-28 -6 9
48
Проверьте полученный результат, умножив матрицу саму на себя.
Убедитесь, что вы освоили простейшие операции с матрицами в
MATLAB. Найдите значение следующего выражения
(A + С) В3 (A С)Т.
» (А+С)*В^3*(А-С)'
ans =
1848 1914
10290 3612
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
» x = A\b
x =
1.0000
1.0000
1.0000
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
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
»p = Р(2, 2:end)
p =
10 12 5
52
» М =[2 0 3; 1 1 4; 6 1 3];
» M(1,:)=[];
» M
M =
1 1 4
6 1 3
» size(M)
ans =
2 3
» М(:, 2:3) = []
M =
1
6
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
» 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
» A = zeros(2, 6)
A =
0 0 0 0 0 0
0 0 0 0 0 0
» 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
» 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
» 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
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
» 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
» A = [10 1 2; 1 20 3; 2 3 30];
57
» d = diag(A)
d =
10
20
30
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
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)
» imagesc(G)
» colorbar
» colormap(gray)
60
комплексных чисел, а элементы матрицы B комплексными частями, т.е.
между элементами матриц должно выполняться соотношение:
ckj akj bkj i, k, j =1, 2, 3.
61
17. Выполните известные Вам поэлементные операции над
матрицами A и B.
18. Выполните визуализацию блочной матрицы, используя команды
spy, imagesc, colorbar, colormap(gray).
19. Приведите из журнала выполнения лабораторной работы
несколько первых и последних строк.
20. Оформите отчет по лабораторной работе.
sin 2 x
y ( x) e x ln x
1 cos x
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(х)^2/(1+соз(х))+exp(-x)*log(x)
??? Error using ==> ^
Matrix must be square.
» х
х =
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: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: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: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
y( x) e x sin(10 x) ,
68
Команды для задания вектора х и вычисления функции лучше
завершать точкой с запятой для подавления вывода в командное окно их
значений (после команды plot точку с запятой ставить необязательно, т. к.
она ничего не выводит в командное окно)
» х = [0:0.05:1];
» у = ехр(-х).*sin(10*x);
» plot(x, у)
» х = [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)
» х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)
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)
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)
72
Таблица 4.1 – Возможные значения аргумента
Цвет Тип маркера Тип линии
y желтый . точка - сплошная
m розовый кружок : пунктирная
c голубой х крестик -. штрих-пунктирная
r красный + знак "плюс" -- штриховая
g зеленый * звездочка
b синий s квадрат
w белый d ромб
Треугольник вершиной
k черный v
вниз
Треугольник вершиной
^
вверх
Треугольник вершиной
<
влево
треугольник вершиной
>
вправо
p пятиконечная звезда
h шестиконечная звезда
» plot(x,f,'k-',x,g,'k:')
74
осуществляет построение первого графика сплошной черной линией, а
второго черной пунктирной. Аргументы 'k-' и 'k:' задают стиль и цвет
первой и второй линий. Здесь k означает черный цвет, а дефис или
двоеточие сплошную или пунктирную линию. Окно с графиком можно
закрыть, нажав на кнопку с крестиком в правом верхнем углу.
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)
76
аргументами. Аргументами являются векторы, элементы которых
соответствуют сетке на прямоугольной области построения функции.
Можно использовать один аргумент, если область построения функции
квадрат. Для вычисления функции следует использовать поэлементные
операции.
Рассмотрим основные возможности, предоставляемые MATLAB для
визуализации функций двух переменных, на примере построения графика
функции
» mesh(X,Y,Z)
» surf(X,Y,Z)
» surf(X,Y,Z)
» colorbar
78
» surfc(X,Y,Z)
» colorbar
» levels = [0:0.01:0.5];
» contour3(X, Y, Z, levels)
» colorbar
79
из линий уровня. Использование команды colorbar также не позволит
точно определить значения функции. Каждой линии уровня можно
присвоить значение, которое принимает на ней исследуемая функция, при
помощи определенной в MATLAB функции clabel. Функция clabel
вызывается с двумя аргументами: матрицей, содержащей информацию о
линиях уровня и указателем на график, на котором следует нанести
разметку. Пользователю не нужно самому создавать аргументы clabel.
Функция contour, вызванная с двумя выходными параметрами, не только
строит линии уровня, но и находит требуемые для clabel параметры.
Используйте contour с выходными аргументами CMatr и h (в массиве
CMatr содержится информация о линиях уровня, а в массиве h
указатели). Завершите вызов contour точкой с запятой для подавления
вывода на экран значений выходных параметров и нанесите на график
сетку:
80
» contourf(X, Y, Z, 20)
» colorbar
» surfc(X, Y, Z)
» colorbar
» colormap(gray)
» title('График функции z(x,y)')
» xlabel('x')
» ylabel('у')
» zlabel('z')
81
plot(x, f, x, g). Однако для объединения трехмерных графиков их
использовать нельзя.
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];
» a = [1;2;3];
» b = [5;6;7];
» C = a*b'
83
C =
5 6 7
10 12 14
15 18 21
» X = 0.3*u*cos(v);
» Y = 0.3*u*sin(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
» plot(x,f,х,g)
эквивалентно последовательности
» plot(х,f)
85
» hold on
» plot(x,g)
86
С помощью функции plotyy постройте с шагом 0.1 в интервале
[N, N+5] графики функций f (x) и 102 f ( x) sin( x) .
4. Выполните задание 3, используя:
логарифмический масштаб по обеим осям;
логарифмический масштаб по оси абсцисс;
логарифмический масштаб по оси ординат.
При выполнении этого пункта используйте шесть типов маркеров,
шесть различных цветов линий и разные типы линий.
5. Сформируйте матрицу и вектор размерами соответственно не
менее 56 и 17, первыми элементами которых является Ваш номер по
списку в журнале группы. Постройте графики вектора и матрицы.
6. Приведите график функции z(x, у) = х2 + у2 на области определения
в виде квадрата х [0, l], y [0, l] с шагом 0.2 и график функции с
меньшим шагом сетки.
7. Постройте прозрачную и непрозрачную каркасную поверхность
для функции z ( x, y) 4sin( 2x) cos(1,5y) (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. Оформить отчет по лабораторной работе.
88
Лабораторная работа 5
89
В аналитическом виде треугольная ФП может быть задана
следующим образом (рис. 5.1, а):
0, x a,
x a
, a x b,
b a
f ( x, a, b, c)
cx
, b x c,
c b
0, x c.
а б
Рис. 5.1. Треугольная (а) и трапециевидная (б) функции принадлежности
» х = 0 : 0,1 : 10;
» у = trimf (x, [3 6 8]);
» plot (х, у);
» xlabel ('trimf (x, P), P = [3 6 8]');
90
Трапециевидная функция принадлежности
Трапециевидная ФП – trapmf (trapezoid membership function) –
отличается от предыдущей функции лишь тем, что имеет верхнее
основание.
Описание функции:
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 .
» X = -20 : 1 : 20;
91
» Y = gaussmf (х, [4 5]);
» plot (х, у);
а б
Рис. 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]);
I
Рис. 5.3. Функция принадлежности "обобщенный колокол"
93
Ее отличие от рассмотренных ранее ФП заключается в добавлении
третьего параметра, что позволяет осуществлять плавный переход между
нечеткими множествами.
Описание функции:
1
f ( x ,a ,b ,c) 2b
,
xc
1
a
» x= [-20 : 20];
» plot (x,y);
94
Симметричные и закрытые функции синтезируют с использованием двух
дополнительных сигмоидов.
1
f ( x , a , c) a ( x c )
.
1 e
95
ФП psigmf, так же как и предыдущая функция, зависит от четырех
параметров a1, c1, а2, с2 и определяется как произведение двух сигмоидных
функций f(х, a1, c1) · f(x, а2, с2) (рис. 5.4, в).
а б в
Рис. 5.4. Сигмоидные функции принадлежности
» 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. Полиномиальные функции принадлежности
Описание функции:
97
Параметры а и b определяют экстремальные значения кривой
(рис. 5.5, а).
Описание функции:
» 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.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.
100
В рамках данной интерпретации конъюнктивный оператор
представляет собой оператор вычисления алгебраического произведения –
prod (рис. 5.7, а), а дизъюнктивный оператор – оператор вычисления
алгебраической суммы – рrоbоr (рис. 5.7, б).
а б
Рис. 5.7. Пересечение (a) и объединение (б) нечетких множеств
(вероятностная интерпретация)
» х = 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.
102
Пример 5.9. Программа использования операции дополнения.
» x= [0 : 10];
» y1 = gaussmf (x, [3 5]);
» y= 1 - y1;
» plot (x, y1, ':');
» hold on;
» plot(x, y);
» hold off
103
8. Построить дополнение нечеткого множества, которое описывает
некоторое размытое суждение и представляет собой математическое
описание вербального выражения, отрицающего это нечеткое множество.
При выполнении пунктов 1 – 8 индивидуального задания, значения
переменных a, b, c, d и т.д. необходимо выбирать произвольным образом.
9. Оформите отчет по лабораторной работе.
104
Лабораторная работа 6
» 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)
106
М-файлом. Комментарии в MATLAB начинаются со знака процента и
автоматически выделяются зеленым цветом, например:
» edit mydemo
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
108
команду среди встроенных функций. Если команда оказывается
встроенной функцией, то происходит ее выполнение.
Если введена не переменная и не встроенная функция, то MATLAB
начинает поиск М-файла с названием команды и расширением m. Поиск
начинается с текущего каталога (Current Directory), если М-файл в нем не
найден, то MATLAB просматривает каталоги, установленные в пути
поиска (Path). Найденный М-файл выполняется в MATLAB.
Если ни одно из вышеперечисленных действий не привело к успеху,
то выводится сообщение в командное окно, например:
» mydem
??? Undefined function or variable 'mydem'.
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,
вызываемая с двумя аргументами:
Замечание 3
Не удаляйте без необходимости пути к каталогам, особенно к тем, в
назначении которых вы не уверены. Удаление может привести к тому, что
часть функций, определенных в MATLAB, станет недоступной.
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));
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));
» х = [1.3 7.2];
» у = myfun(x)
У =
0.2600 0.0001
x = [0:0.5:4];
у = myfun(x);
plot(x, у)
115
Постройте графики myfun при помощи plot и fplot на одних осях, при
помощи hold on. Обратите внимание, что график, построенный при
помощи fplot, более точно отражает поведение функции, т.к. fplot сама
подбирает шаг аргумента, уменьшая его на участках быстрого изменения
отображаемой функции. Результаты приведите в отчете по лабораторной
работе.
Файл-функции с несколькими входными аргументами
Написание файл-функций с несколькими входными аргументами
практически не отличается от случая с одним аргументом. Все входные
аргументы размещаются в списке через запятую. Например, следующий
листинг содержит файл-функцию, вычисляющую длину радиус-вектора
function r = radius3(x, у, z)
r = sqrt(х.^2 + у.^2 + z.^2);
» R = radius3(1, 1, 1)
R =
1.732
» [Н, М, S] = hms(10000)
H =
2
М =
46
S =
40
117
основные операторы, задающие последовательности выполнения команд
MATLAB. Операторы можно использовать как в файл-процедурах, так и в
функциях, что позволяет создавать программы со сложной разветвленной
структурой.
Оператор цикла for
Оператор предназначен для выполнения заданного числа
повторяющихся действий. Самое простое использование оператора for
осуществляется следующим образом:
end
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
Замечание 4
Редактор М-файлов автоматически предлагает расположить
операторы внутри цикла с отступом от левого края. Используйте эту
возможность для удобства работы с текстом программы.
119
Напишите файл-программу для вычисления суммы
10 1
S k! .
k 1
120
S =
1.7183
» help Fordem2
ФАЙЛ-ПРОГРАММА ДЛЯ ВЫЧИСЛЕНИЯ СУММЫ
1/1!+1/2!+ … +1/10!
10 xk
S k! .
k 1
121
S = S + x.^k/factorial(k);
» x = 1.5;
» Fordem2
S =
3.4817
function S = sumN(x, N)
% файл-функция для вычисления суммы
% x/1!+x^2/2!+ … +x^N/N!
% использование: S = sumN(x, N)
122
for m = 1:1:N
S = S + x.^m/factorial(m);
end
x 2k 1
S ( x) (1) k
.
k 0 (2k 1)!
123
Сумму можно накапливать до тех пор, пока слагаемые являются не
слишком маленькими, скажем больше по модулю 10 10 . Циклом for здесь
не обойтись, так как заранее неизвестно число слагаемых. Выход состоит в
применении цикла while, который работает, пока выполняется условие
цикла:
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
124
Условие цикла while может содержать не только знак >. Для задания
условия выполнения цикла допустимы также другие операции отношения,
приведенные в табл. 6.1.
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 условие
команды MATLAB
end
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
if условие 1
команды MATLAB
elseif условие 2
команды MATLAB
………………………
elseif условие N
команды MATLAB
else
команды MATLAB
end
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
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
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
131
помощи цикла for. Но если один из элементов исходного массива равен
нулю, то при делении получится inf, и последующие вычисления могут
оказаться бесполезными. Предотвратить эту ситуацию можно выходом из
цикла, если текущее значение x(i) равно нулю. Следующий фрагмент
программы демонстрирует использование оператора break для прерывания
цикла:
for x = 1:20
z = x-8;
if z==0
break
end
y = x/z
end
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
135
Принимаются во внимание следующие условия нормирования для
µjk:
N
jk 1, k 1,...,K ;
j 1
N
0 jk K , j 1,...,N .
k 1
N K
( jk ) q xk c j min ,
j 1k 1
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
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, если k j ,
(jkt 1)
0, если k j.
137
Алгоритм нечеткой кластеризации останавливается при выполнении
следующего условия:
U (t 1) U (t ) ,
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)
139
Рис. 7.1. Множество анализируемых данных и центры кластеров
140
Рис. 7.2. График изменения значений целевой функции
141
Второй способ решения задач кластеризации в MATLAB вызывается
командой findcluster. Главное окно инструмента кластеризации показано
на рис. 7.3.
142
– количество кластеров (строка ввода – Cluster Num);
– максимальное количество итераций (строка ввода – Мах Iteration);
– минимальное значение улучшения целевой функции (строка
ввода – Min. Improvement);
– показатель степени при матрице ФП (строка ввода – Exponent).
После определения необходимых значений указанных параметров
осуществляется запуск алгоритма кластеризации с помощью кнопки
<Start>. Количество произведенных итераций и значение целевой функции
можно просмотреть в нижней части главного окна инструмента
кластеризации.
Координаты найденных центров кластеров можно сохранить,
щелкнув мышью по кнопке <Save Center...>. Каждая строка матрицы в
файле представляет собой набор координат отдельного кластера.
Количество строк соответствует количеству кластеров.
143
Лабораторная работа 8
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):
(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
(символы <&> и <|> – соответственно определяют логическое И и
логическое ИЛИ, символ <~> – логическое отрицание, а символ < => >
является разделителем условной и заключительной частей правила
(антецендента и консеквента).
Общее описание правила вывода в индексном формате может быть
представлено в следующем виде:
148
создаваемую модель под именем Invest. На рис. 8.1 представлено текущее
состояние окна редактора СНВ.
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)
152
Построение нечетких систем типа Сугено. Рассмотрим построение
СНВ двумя редакторами – СНВ и ФП. Для построения СНВ типа Сугено
необходимо в меню File выбрать пункт New FIS Sugeno. Количество
входных и выходных переменных определяется так же, как и при
построении СНВ типа Мамдани.
if x is A and у is В then z = k,
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. Окно просмотра правил вывода (вывод по Сугено)
155
Лабораторная работа 9
U(K) = F(U(K – 1), E(K – 1)); или U(K) = F(U(K – 1), ΔE(K – 1));
156
воздействия задается с помощью базы нечетких правил. Обычно управляющее
воздействие учитывает предыдущее воздействие и последнее изменение
ошибки.
Процесс управления описывается набором переменных, относящихся
к классу лингвистических переменных. Сущности управляемого процесса
можно классифицировать как "входные переменные" и "выходные
переменные" процесса. В общем случае входные переменные определяют
зависящие от времени потоки, в то время как выходные описывают
моментальные состояния процесса. Входные переменные, которыми могут
управлять люди или компьютеры, называют управляемыми переменными
процесса. Управление в широком смысле означает манипулирование
процессом в контуре обратной связи с целью получения наилучшего
результата, т.е. получения оптимального значения определенных выходных
переменных.
Для управления необходимо:
1) определить текущие значения значимых выходных переменных;
2) сравнить текущие выходные значения с заданными целевыми
значениями;
3) подобрать значения управляемых переменных так, чтобы достичь
целевых значений;
4) повторять пункт 1 – 3 до тех пор, пока не будут получены целевые
значения.
Рассмотрим нечеткий контроллер, причем управляемый процесс
имеет три входные переменные с двумя управляемыми переменными (вход
2 и вход 3) и одной случайной переменной (вход 1), а также три выходные
переменные. Нечеткий контроллер согласно определенному алгоритму
преобразует три выходные переменные в две управляющие переменные,
которые затем возвращаются на объект управления. Сравнение выходных
значений с целевыми значениями выполняется самим контроллером.
В отличие от большинства стандартных контроллеров, использующих
157
математические вычисления, нечеткий контроллер применяет так
называемые правила, подобно человеку-оператору.
Пример 9.1. Правила управления:
ЕСЛИ давление низкое, ТО открыть кран
(процесс химического производства).
ЕСЛИ процент по кредиту высок, ТО сократить заимствования
(процесс финансового планирования).
ЕСЛИ уровень потребления энергии низкий, ТО сократить
выходную мощность генератора (процесс управления мощностью).
159
g0 в заключительной части правила почти всегда представляет простое
нечеткое значение только одной управляющей переменной.
Импликация
Правила, подобные "ЕСЛИ f0, ТО g0", в булевой логике называются
импликацией, где f0 и g0 – булевские сущности со значениями истинности 0
или 1. Формально импликацию записывают в виде f0 g0 каждой пары
значений, она возвращает результат согласно табл. 9.1.
(а, b, f0 g0) = [a, b, (НЕ f0) ИЛИ g0] = S[1 – (а, f0), n(b, g0)],
160
Таблица 9.2 – Характеристики управляемого процесса
Входная Управляющая
Значение
переменная А переменная В
Базовое значение {a} {b}
Нечеткое значение {f} {g}
Функция принадлежности μ(a, f) n(b, g)
Выбранное нечеткое значение f0 {f} b0 {g}
Представляющие четкие значения α(t) {a} β {b}
Правило ЕСЛИ f0 ТО b0 Не существует
(α, b, f0 И [(НЕ f0) ИЛИ g0]) = T{ (α, f0), S[1 – (α, f0), n(b, g0)]}.
161
(b) = f0 И [(НЕ f0) ИЛИ g0] = T{ (α, f0), S[1 – (α, f0), n(b, g0)]}
и, следовательно,
162
9.1.3. Комбинирование условий
Правила с комбинированием условий подобны следующим
163
в определенной ситуации. Если, например, время и деньги малы
одновременно, должен ли автомобиль ехать "быстро" и "экономно"? Если
используется несколько правил одновременно, необходимо решить, какое
из них выполняется. Операция ИЛИ в этом контексте означает
"исключительное ИЛИ".
Правило с условием f0 и заключением g0 эквивалентно нечеткому
значению (f0 И g0). В любое время t и при определенном b четкое выходное
значение процесса получается из функций принадлежности
ρ(b) = Т{µ(α1(t), …, αN(t), f0), п(b, g)} для f0 И g0. Приведем несколько
правил, которые выполняются вместе и эквивалентны комбинации
нечетких значений:
(f1 И g1) ИЛИ (f2 И g2) ИЛИ ... ИЛИ (fN И gN)
164
ρ(b) = S{ρ1(b), ρ2(b), .... ρN(b)} = S{Т [µ(α1(t), п(b, g1)], Т [µ(α2(t), п(b, g2)], …,
Т[µ(αN(t), п(b, gN)]}.
d d
M b (b) db , F (b) db , bopt=M/F.
c c
165
M bn (bn ) db , F (bn ) db , bopt=M/F.
n n
168
Рис. 9.5. Иллюстрация управляемого объекта в режиме накопления
169
Здесь шар отскакивает от коромысла качелей, которые перемещаются в
точку падения шара. При этом исходное положение коромысла меняется
таким образом, чтобы шар при возможности отскакивал вертикально
вверх. Выброс шара за пределы области перемещения качелей
исключается с учетом отскоков от левой или правой стенок.
В этом примере особенно ценной является возможность
моделирования в двух режимах отскока шарика от коромысла качелей – с
использованием нечеткой логики и математической модели. Последний
случай представлен на рис. 9.7. Нетрудно заметить, что в этом случае
вообще не удается добиться отскока шарика строго вертикально вверх –
действует правило "угол отражения равен углу падения".
170
реализующей его программы можно просмотреть, активизировав мышью
гиперссылку View code for juggler в окне демонстрации этого примера.
Программа занимает немного больше 700 строк и просматривается в
редакторе программ системы МATLAB.
171
рукой температуру воды. Но, если напор воды постоянно меняется, то без
автоматического регулятора температуры не обойтись. В
демонстрационном примере рассматривается замкнутая система
регулирования температуры с использованием нечеткой логики. Simulink-
диаграммы системы приведены на рис. 9.9.
172
Рис. 9.10. Структурная схема нечеткой системы управления
"перевернутый маятник"
174
Рис. 9.13. Динамическая система "перевернутые маятники"
175
Лабораторная работа 10
176
Системы нечеткого вывода, созданные тем или иным образом с
помощью пакета Fuzzy Logic Toolbox, допускают интеграцию с
инструментами пакета Simulink, что позволяет выполнять моделирование
систем в рамках последнего.
Рассмотрим пример построения нечеткого контроллера средствами
инструментария нечеткой логики (ИНЛ) Fuzzy Logic и блоков
моделирования Simulink, который осуществляет контроль уровня воды в
баке. На рис. 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.
179
Для того чтобы сформировать функции принадлежности для
переменных, следует выбрать пункт меню View/Edit membership functions и
задать параметры системы в соответствии с табл. 10.1. Здесь используются
следующие функции. Гауссова функция Gaussmf имеет вид
182
Рис. 10.5. Окно задания функции принадлежности пользователя
183
Текущий уровень воды показан черным цветом. Необходимый уровень
воды отмечен черной линией. Анимация запускается автоматически по
открытию окна.
184
Нечеткий контроллер реализован системой нечеткого вывода с двумя
входами: разница между требуемым и текущим уровнями воды и скорость
изменения этой разницы. Временные диаграммы требуемого и текущего
уровней воды показаны в окне Scope1 (рис. 10.8) светлой и темной
линиями соответственно. В окне change scope (рис. 10.9) приведена
временная диаграмма скорости изменения разности требуемого и текущего
уровней воды. Эти окна открываются по нажатию кнопки мыши по
пиктограммам Scope1 и change scope в Simulink-модели системы "Водяной
бак с нечетким контроллером". Пользователь может аналогичным образом
вывести на экран временные диаграммы расхода воды (Scope4) и сигнала
переполнения бака (Scope2).
185
Рис. 10.9. Временная диаграмма скорости изменения разности требуемого
и текущего уровней воды
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.
187
Можно попытаться изменить характер функционирования системы,
внося, например, с помощью рассмотренных программ с графическим
интерфейсом (типа FIS редактора и т.п.) определенные изменения в
систему, задаваемую файлом tank.fis (изменяя правила, функции
принадлежности, метод приведения к четкости и т. д.). Разумеется, все это
лучше делать, остановив процесс моделирования.
Выполнив (в режиме командной строки) команду sltankrule, можно
перейти к блок-диаграмме той же системы управления, но с нечетким
регулятором и просмотрщиком правил (Fuzzy Logic Controller with
Ruleviewer).
189
Лабораторная работа 11
» syms x a b
» 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(f)
2 2
(b + cos(x)) (a + sin(x))
---------------------------
1/2
|a + b|
» 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 a b real
» p=conj(a+i*b)
p = a-i*b
» syms a b unreal
» q=conj(a+i*b)
q = conj(a+i*b)
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]
194
» B=sym(A)
B =
[ 13/10, -21/10, 49/10]
[ 69/10, 37/10, 17/2]
» 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
» cn=vpa(c,45)
cn =
1.41421356237309504880168872420969807856967187
» 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
» f=sym('x*sin(x^2)^3');
» ezplot(f)
197
Вторым аргументом может быть задан вектор с границами отрезка, на
котором требуется построить график функции:
» ezplot(f,[-9 7])
» z=sym('x^2+a^3');
» ezplot(z,[-2 1 -3 4])
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
» 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
» 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
» 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)
» 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
» 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)
» 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
» horner(p1)
ans =
336 +(-532+(140+(105+(-56+7*x)*x)*x)*x)*x
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
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)
» f2=simple(f)
f2 =
(2*sin(x)*N+sin(2*x)*N+sin(2*x)*x)/(N+x)/sin(x)
» pretty(f2)
» 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
» 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
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)
» syms a x
» limit((1+1/x)^(x*a),x,Inf)
ans = exp(a)
» 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
d arctg(x h) arctg(x)
arctg ( x) lim
dx h0 h
» syms h x
» L=limit((atan(x+h)-atan(x))/h, h, 0);
» pretty(L)
1
------
2
1 + 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)
» syms x
» f=sym('exp(2*x)');
» I=int(f,x)
» pretty(I)
1/2 exp(2 x)
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)
» 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. Индивидуальные задания
y ( x N )5 ( x 2 N )3 ( x N ) 2 x N , (11.1)
k 0 ( 2 k )!
sin( x)
15. Определите предел lim N , где N ваш номер по списку в
x0 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
212
Лабораторная работа 12
213
решений задачи. Поскольку ГА используют биологические аналогии, то
применяющаяся терминология напоминает биологическую.
Как известно, эволюционная теория утверждает, что жизнь на нашей
планете возникла вначале лишь в простейших ее формах – в виде
одноклеточных организмов. Эти формы постепенно усложнялись,
приспосабливаясь к окружающей среде и порождая новые виды, и только
через многие миллионы лет появились первые животные и люди. Можно
сказать, что каждый биологический вид с течением времени улучшает свои
качества так, чтобы наиболее эффективно справляться с важнейшими
задачами выживания, самозащиты, размножения и т.д. Так возникла
защитная окраска у многих рыб и насекомых, панцирь у черепахи, яд у
скорпиона и многие другие полезные приспособления.
С помощью эволюции природа постоянно оптимизирует все живое,
находя подчас самые неординарные решения. С первого взгляда неясно, за
счет чего происходит этот прогресс, однако ему есть научное объяснение.
Дать это объяснение можно, основываясь всего на двух биологических
механизмах – естественном отборе и генетическом наследовании.
Ключевую роль в эволюционной теории играет естественный отбор.
Его суть состоит в том, что наиболее приспособленные особи лучше
выживают и приносят больше потомства, чем менее приспособленные.
Заметим, что сам по себе естественный отбор еще не обеспечивает
развития биологического вида. Действительно, если предположить, что все
потомки рождаются примерно одинаковыми, то различные поколения
будут отличаться только по численности, но не по приспособленности.
Поэтому очень важно изучить, каким образом происходит наследование,
т.е. как свойства потомка зависят от свойств родителей.
Основной закон наследования интуитивно понятен каждому – он
состоит в том, что потомки похожи на родителей. В частности, потомки
более приспособленных родителей будут, скорее всего, одними из
наиболее приспособленных в своем поколении. Чтобы понять, на чем
214
основана эта похожесть, нам потребуется немного углубиться в строение
клетки животного – в мир генов и хромосом.
В клетках любого животного имеется набор хромосом, несущих
информацию об этом животном. Основная часть хромосомы – нить ДНК
(молекула дезоксирибонуклеиновой кислоты), которая состоит из четырех
видов специальных соединений – нуклеотидов, идущих в определенной
последовательности. Нуклеотиды обозначаются буквами A, T, C и G, и
именно порядок их следования кодирует все генетические свойства
данного организма. Говоря более точно, ДНК определяет, какие
химические реакции будут происходить в данной клетке, как она будет
развиваться и какие функции выполнять.
Ген – это отрезок цепи ДНК, отвечающий за определенное свойство
особи, например, за цвет глаз, тип волос, цвет кожи и т.д. Вся
совокупность генетических признаков человека кодируется посредством
примерно 60 тыс. генов, суммарная длина которых составляет более
90 млн нуклеотидов.
Различают два вида клеток: половые и соматические. В каждой
соматической клетке человека содержится 46 хромосом. Эти 46 хромосом
– на самом деле 23 пары, причем в каждой паре одна из хромосом
получена от отца, а вторая – от матери. Парные хромосомы отвечают за
одни и те же признаки – например, отцовская хромосома может содержать
ген черного цвета глаз, а парная ей материнская – ген голубоглазости.
Существуют определенные законы, управляющие участием тех или иных
генов в развитии особи. В частности, в нашем примере потомок будет
черноглазым, так как ген голубых глаз является "слабым" (рецессивным) и
подавляется геном любого другого цвета.
В половых клетках хромосом только 23, и они непарные. При
оплодотворении происходит слияние мужской и женской половых клеток
и образуется клетка зародыша, содержащая как раз 46 хромосом. Какие
свойства потомок получит от отца, а какие – от матери?
215
Это зависит от того, какие именно половые клетки участвовали в
оплодотворении. Дело в том, что процесс выработки половых клеток (так
называемый мейоз) в организме подвержен случайностям, благодаря
которым потомки все же во многом отличаются от своих родителей. При
мейозе, в частности, происходит следующее: парные хромосомы
соматической клетки сближаются вплотную, затем их нити ДНК
разрываются в нескольких случайных местах и хромосомы обмениваются
своими частями (рис. 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
соответствующее ему значение целевой функции), тем с большей
вероятностью он будет участвовать в скрещивании. Теперь моделируются
мутации – в нескольких случайно выбранных особях нового поколения
изменяются некоторые гены. Затем старая популяция частично или
полностью уничтожается, и мы переходим к рассмотрению следующего
поколения. Популяция следующего поколения в большинстве реализаций
ГА содержит столько же особей, сколько начальная, но в силу отбора
приспособленность в ней в среднем выше. Теперь описанные процессы
отбора, скрещивания и мутации повторяются уже для этой популяции и
т.д.
Создание начальной
Отбор
популяции
Скрещивание
Переход к
новому
поколению
Мутация
Ответ
220
гарантий, и даже самый приспособленный тигр может погибнуть от
ружейного выстрела, не оставив потомства. Имитируя эволюцию на
компьютере, мы можем избегать подобных нежелательных событий и
всегда сохранять жизнь лучшему из индивидуумов текущего поколения –
такая методика называется "стратегией элитизма".
221
Для того чтобы применить ГА к поставленной функции цели,
необходимо, в первую очередь записать её в M-файл и сохранить в
текущей папке.
12.2.1. Функция ga
Функция 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(...)
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
вещественного вектора, отделив вещественные и комплексные части.
Такая целевая функция может выглядеть следующим образом:
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.
225
лишь один раз, вычисляя приспособленность всех особей. Например,
рассмотрим функцию f(x1, x2) = x21 – 2x1x2 + 6x1 + x22 – 6x2.
226
Здесь x(:, 1) представляет собой вектор, а ./ и .* – операции
поэлементного соответственно возведения в степень и умножения.
В окне тулбокса в списке Vectorize option следует установить
значение On.
Убедиться в эффективности векторизации можно на примере
функции Растригина. В командной строке введем следующее выражение:
» tic;
» ga(@rastriginsfcn,20);
» toc;
» options=gaoptimset(’Vectorize’,’on’);
» tic;
» ga(@rastriginsfcn,20,options);
» toc;
227
12.4. Применение генетических алгоритмов для поиска минимума
функции
f ( x) 8 x 16 123 ( x 4) 2 .
function y = ex2(x)
y=8*x–16–12*((x+4)^(2/3));
228
алгоритм сошелся к решению. Особи становятся одинаковыми (расстояние
по Хеммингу равно 0) в последних 18 поколениях.
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);
function z = ex13(x)
z=–(exp(–x(1)^2–x(2)^2)+sin(x(1)+x(2)));
231
status and result можно увидеть найденное минимальное значение целевой
функции z(x).
Для данной задачи результаты получились следующие:
максимум функции достигается в точке x = 0.46419, y = 0.42406;
значение функции f(0.46419; 0.42406) = 1.449.
Также можно сконструировать другие ГА, моделируя операторы
(выбор родительских пар, кроссинговер, мутация, миграция, отбор особей
в новую популяцию, критерии завершения алгоритма) и параметры
алгоритма.
Дальнейшее изучение оптимизации с помощью ГА можно
продолжить, рассматривая Direct Search Toolbox. Для вызова окна можно в
командной строке просто прописать psearchtool.
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 2x .
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
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
236
Решение задачи переподключения рабочих станций – это процесс
направленного перебора вариантов подключения с целью оптимизации.
Размерность задачи велика даже для вычислительной сети среднего
размера (до 1000 узлов), поэтому представляется целесообразным решить
задачу с помощью генетического алгоритма.
Кодирование решения задачи (хромосомы) может быть следующим.
Вариант разбиения узлов на сегменты, т.е. решение удобно представлять
рядом целых чисел. Пусть все узлы имеют уникальные номера от 1 до m и
упорядочены в соответствии с этими номерами. Позиция i содержит номер
коммутатора/концентратора (от 1 до n), к которому подключен узел i.
Пример кодирования топологии ВС, изображенной на рис. 13.1, приведен в
табл. 13.1.
237
случайный выбор гена (вероятность 0,001);
случайный выбор бита;
инверсия выбранного бита;
операция по модулю п над геном, содержащим результат
инверсии modn(x).
Оператор рекомбинации выполняется традиционно, но граница для
разрезания родительских хромосом должна быть границей генов.
Наибольшую важность имеет определение функции оптимальности
хромосомы, так как определение влияет на сходимость эволюции. В
качестве функции оптимальности может быть взята следующая функция:
238
Суммарный трафик, приходящийся на канал связи, зависит от типа
канала. Будем рассматривать только каналы типа:
<коммутатор/концентратор> – <коммутатор/концентратор>.
Тогда можно выделить следующие подвиды каналов:
<коммутатор> – <коммутатор>;
концентратор> – <концентратор>;
коммутатор> – <концентратор>.
Суммарный трафик выражается по-разному для трех подвидов
каналов связи. Рассмотрим суммарный трафик канала типа
<коммутатор> – <коммутатор>:
n n
Tk Bij .
jM1 jM 2
n n
Tk Bij .
j1 j1
i j i j
n n
Tk Bij .
j1 jM 2
i j
239
Необходимость модернизации ВС определяется по степени близости
суммарного трафика и пропускных способностей каналов связи. Для
нахождения оптимального подключения используется следующий
генетический алгоритм.
Шаг 1. Генерируется популяция хромосом случайным образом с
проверкой корректности, т.е. возможности подключения, закодированного
в хромосоме.
Шаг 2. Для каждой хромосомы рассчитывается значение функции
оптимальности, т.е. величина трафика на бэкбоне при подключении,
закодированном в хромосоме.
Шаг 3. В соответствии со значением функции оптимальности
производится ранжирование хромосом, хромосомы упорядочиваются по
мере убывания эффективности.
Шаг 4. Для каждой хромосомы вычисляется вероятность отбора
f (ait )
Ps (ait )
,
f (a tj )
j 1
Psi Pmin
Psl ,
Pmax Pmin
240
где Psl – масштабированная вероятность; Psi – вероятность отбора;
n n
L dij cij ,
i 1 j 1
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
243
центров тяжестей элементов размещения. Каждая координата описывается
вещественным числом.
2. В качестве оператора мутации используется вероятностное
изменение случайной позиции хромосомы. В качестве оператора
рекомбинации используется одноточечный вариант кроссовера.
3. Условие завершения эволюции задается в виде определения числа
поколений либо в виде условия достижения нулевого перекрытия
элементов.
Результаты анализа поведения генетического алгоритма в
зависимости от значений вероятности мутации приведены на рис. 13.2.
Эксперимент проводился для значений вероятностей мутации в диапазоне
от 0,1 до 0,6 с шагом 0,1. Значение вероятности более 0,6 нарушает
сходимость функции оптимальности ГА.
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
это заметно по многочисленным "всплескам" на графике.
245
Рис. 13.4. График функции оптимальности ГА при стратегии с
рекомбинацией (m, k)
246
но разные элементы размещения"; "высокая плотность упаковки и велико
разнообразие". Результаты экспериментов представлены в табл. 13.3.
247
Лабораторная работа 14
n
S xi wi w0 , (14.1)
i 1
248
w0
1
w1
x1 S y
ƒ
xn
wn
Рис. 14.1. Процессорный элемент, используемый в обычных
нейросетях
1, если S 0,
y (14.2)
0, если S 0
или биполярная
1, если S 0,
y (14.3)
1, если S 0.
1, если S ,
y (14.4)
0, если S ,
1, если S ,
y (14.5)
1, если S ,
249
где
n
S wi xi . (14.6)
i 1
a, при S 1 ,
y k S a0 , при 1 S 2 , (14.7)
1, при S ,
2
250
Кроме приведенных в теории нейронных сетей используются также
часто следующие нелинейные функции активации:
бинарная сигмоидальная (рис. 14.2, e):
1
y , (14.8)
1 e S
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 ) ,
значение:
n
S xi wi w0 0,
i 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, если используется бинарное
кодирование), то это означает, что предъявленное изображение не
принадлежит выделяемому классу.
Система распознавания на основе единственного нейрона делит все
пространство возможных решений на две области с помощью
гиперплоскости
253
выходной сигнал у, то веса wi (i 1, n.) связей нейрона адаптируются по
формуле
wi = 0, i 0, n.
x0 = 1, xi = xik, i 1, n.
wi new wi old xi y, i 0, n .
1, если S 0,
k
y k
k 1, m,
1, если S 0,
k
где
n
S k xik wi w0 .
i 1
X1 X2
1 2 3 1 2 3
4 5 6 4 5 6
7 8 9 7 8 9
255
М = {(Х 1 = (1, –1, 1, 1, 1, 1,–1, –1, 1), 1),
(Х 2 = ( 1, 1, 1, 1, –1, 1, 1, –1, 1 ), –1)};
wi wi x1i y (i 0, n ) :
х0 = 1, хi = хi2, i 0, 9.
у = t 2 = –1.
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 .
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.
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
258
характерно для теории нейронных сетей. Для биполярного представления
сигналов возможно обучение нейросети с помощью следующего
алгоритма:
Шаг 1. Задается множество M = {(Х 1, t1), …, (Х m, t m)}, состоящее из
пар (входное изображение X k = x1k ,...,xnk , необходимый выходной сигнал
wji = 0, j 0, n , i 1, m.
j 1, n.
w ji new w ji old x j yi , j 0, n, i 0, m .
259
14.2. Индивидуальные задания
260
Лабораторная работа 15
261
входными и выходными переменными системы, при этом в процессе
обучения сети настраиваются параметры (веса) получаемых
функциональных отношений. (Как правило, выявление и определение
данной зависимости в явном виде не представляется возможным в силу
вышеуказанных причин). Модель нейронной сети позиционируется как
"черный ящик" вследствие того, что внутренний алгоритм ее настройки не
"прозрачен", и полученные результаты и взаимосвязи сложно
интерпретировать.
Нечеткие нейронные сети или гибридные сети призваны объединить
в себе достоинства нейронных сетей и систем нечеткого вывода. С одной
стороны, они позволяют разрабатывать и представлять модели систем в
форме правил нечетких продукций, которые обладают наглядностью и
простотой содержательной интерпретации. С другой стороны, для
построения правил нечетких продукций используются методы нейронных
сетей, что является более удобным и менее трудоемким процессом для
системных аналитиков.
В данных методических указаниях рассматриваются основные
понятия нейронечетких сетей, а также средства их разработки,
предоставляемые системой МATLAB.
Для прогнозирования используем нечеткую сеть TSK. Обобщенную
схему вывода модели TSK при использовании M правил и N переменных xj
можно представить в виде:
262
Условие IF ( xi IS Ai) реализуется функцией фазификации, которая
представляется обобщенной функцией Гаусса отдельно для каждой
переменной xi :
1
A ( xi ) 2bi
, (15.1)
x c
1 i i
i
N
1
A ( x)
(k ) . (15.2)
2 b j
(k )
xi c j
j 1 (k )
1
(k )
j
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
обучения;
второй слой (непараметрический) выполняет агрегирование
отдельных переменных xi , определяя результирующее значение
264
последний, пятый слой (нормализующий), состоит из
единственного выходного нейрона, в котором веса подвергаются
нормализации в соответствии с формулой (15.4). Выходной сигнал y(x)
определяется выражением, соответствующим зависимости (15.3),
f1
y ( x) f ( x) . (15.5)
f2
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
267
в которой каждое из правил нечетких продукций имеет постоянный вес,
равный 1.
в среде МATLAB
268
нечеткого моделирования и экспериментальными данными. Загрузка
ANFIS-редактора осуществляется по команде anfisedit. В результате
выполнения этой команды появится графическое окно (рис. 15.2), на
котором размещены функциональные области ANFIS-редактора.
269
также кнопки Help и Close, которые позволяют вызвать окно справки и
закрыть ANFIS-редактор, соответственно.
Меню File и View одинаковые для всех GUI-модулей, используемых
с системами нечеткого логического вывода.
Меню Edit. Общий вид меню приведен на рис. 15.3.
270
при обучении системы – кривая обучения в виде графика
зависимости ошибки обучения от порядкового номера итерации;
при загрузке данных и тестировании системы –
экспериментальные данные и результаты моделирования.
Экспериментальные данные и результаты моделирования выводятся
в виде множества точек в двухмерном пространстве. При этом по оси
абсцисс откладывается порядковый номер строчки данных в выборке
(обучающей, тестирующей или контрольной), а по оси ординат – значение
выходной переменной для данной строчки выборки. Используются
следующие маркеры:
голубая точка (.) – тестирующая выборка;
голубая окружность (o) – обучающая выборка;
голубой плюс (+) – контрольная выборка;
красная звездочка (*) – результаты моделирования.
Область свойств ANFIS. В области свойств ANFIS (ANFIS info)
выводится информация о количестве входных и выходных переменных, о
количестве функций принадлежностей для каждой входной переменной, а
также о количестве строчек в выборках. В этой области расположены две
кнопки: Structure и Clear Plot.
Нажатие кнопки Structure открывает новое графическое окно, в
котором система нечеткого логического вывода представляется в виде
нейронечеткой сети. В качестве иллюстрации приведена нейронечеткая
сеть, содержащая четыре входных переменных и одну выходную
(рис. 15.4). В этой системе по три лингвистических термы используются
для оценки каждой из входных переменных и четыре термы – для
выходной.
Нажатие кнопки Clear Plot позволяет очистить область
визуализации.
271
Рис. 15.4. Пример структуры нейронечеткой сети
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 – коэффициент, устанавливающий во сколько раз
потенциал данной точки должен быть ниже потенциала центра первого
кластера, чтобы рассматриваемая точка была исключена из возможных
центров кластеров.
276
Внешний вид редактора ANFIS с загруженными обучающими
данными изображен на рис. 15.7.
277
Перед генерацией структуры системы нечеткого вывода типа Сугено
после вызова диалогового окна свойств зададим для каждой из входных
переменных по три лингвистических терма, а в качестве типа их функций
принадлежности выберем треугольные функции.
После нажатия кнопки Generate FIS вызывается диалоговое окно с
указанием числа и типа функций принадлежности для отдельных термов
входных переменных и выходной переменной (рис. 15.8).
279
Рис. 15.10. График зависимости ошибок обучения от количества циклов
обучения
280
Рис. 15.11. Графический интерфейс редактора FIS для сгенерированной
системы нечеткого вывода
281
Рис. 15.13. Графический интерфейс просмотра правил сгенерированной
системы нечеткого вывода
282
15.3. Индивидуальные задания
283
Лабораторная работа 16
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 ]
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
где i 0, K 1.
Данная сеть содержит два параметрических слоя – первый и третий.
В первом слое каждый нейрон хранит три нелинейных параметра сети C, D
и B, которые определяют функцию принадлежности Гаусса. В третьем
слое хранятся линейные параметры сети W, определяющие весовые
коэффициенты правил и значения выходных переменных.
287
16.2. Построение нейронных сетей и гибридных нейронных сетей для
прогнозирования в пакете MATLAB
288
Создадим матрицу входных значений:
» vxod=obych(:,1:4);
» vixod=obych(:,5);
» prognoz=newff(minmax(vxod'),[15 1],{'logsig'
'purelin'});
» prognoz=train(prognoz,vxod',vixod');
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
Файл 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
291
Запустим редактор командой anfisedit.
292
Рис. 16.4. Вид главного окна редактора после загрузки обучающих данных
295
Рис. 16.8. Результаты моделирования ННС для обучающих данных
297
16.3. Индивидуальное задание
298
ТРЕБОВАНИЯ К ОФОРМЛЕНИЮ ОТЧЕТОВ
299
СПИСОК ЛИТЕРАТУРЫ
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
Навчальне видання
Лабораторний практикум
для студентів денної та заочної форм навчання за напрямком
"Комп’ютерна інженерія" й "Комп’ютерні науки"
(Рос. мовою)