1. ОБЩИЕ СВЕДЕНИЯ О СИСТЕМЕ MATLAB По обилию функций и скорости вычислений MATLAB (MATrix LABoratory – матричная лаборатория) превосходит большинство систем компьютерной математики и является бесспорным лидером в области численных расчетов и математического моделирования различных систем и устройств. Система MATLAB – это и операционная среда и язык программирования, на котором могут быть написаны программы для многократного использования. На этом языке уже написано множество программ для решения самых разнообразных задач во многих областях науки и техники. Коллекции родственных программ, предназначенных для решения задач из той или иной области науки (или техники), объединяются в специальную папку, которую называют пакетом прикладных программ (ППП). Существует большое число ППП, которое непрерывно пополняется. Непрерывно расширяется и содержание каждого отдельного ППП. Насчитывается около 40 ППП (MATLAB Application Toolboxes). В их числе nntool – пакет по нейронным сетям и пакет SIMULINK – предназначен для математического моделирования динамических систем, представленных своей функциональной блок-схемой; Понятно, что ни один пакет не может охватить все многообразие проблем и задач, поэтому необходимо владение базовыми программными средствами системы MATLAB, как для решения конкретных задач, так и для понимания программ, входящих в ППП. Вместе с тем некоторые ППП оказались настолько интегрированными с системой MATLAB, что стали составной ее частью. Это относится к ППП Notebook (интеграция с текстовым процессором Word) и Simulink (моделирование динамических систем). Система MATLAB использует командный режим работы. Имеются возможности компилирования, проблемно-ориентированного и визуального программирования. Важным достоинством системы MATLAB является ее открытость и расширяемость. Большинство команд и функций данной системы оформлены в виде текстовых файлов (М-файлов) и файлов на языке С (С++). Пользователь может их модифицировать и создавать новые. MATLAB дает возможность писать самостоятельные программные модули на разных языках, однако штатными являются С++ и свой собственный М-язык Имеется возможность объединения системы с пакетом символьной математики Maple, пакетом Excel и некоторыми другими. Описанию системы автоматизации математических и научнотехнических расчетов MATLAB посвящено достаточно большое число работ, однако, ни один из известных нам литературных источников не может считаться исчерпывающим. Так или иначе, пользователю приходится обращаться к справочной документации в процессе практической работы. Система MATLAB поставляется с обширной документацией и развитой справочной системой, поэтому опытный пользователь может и без литературных источников освоить работу в данной системе. Определенным неудобством является только то, что документация и справочная система существуют пока только на английском языке. В системе MATLAB имеется широкий спектр демонстрационных примеров, которые можно модифицировать и использовать в своих целях. Таким образом, MATLAB - универсальная интегрированная система, предлагаемая ее разработчиками как язык программирования высокого уровня для технических вычислений. Этап компиляции полной программы отсутствует. Для выполнения программ необходимо находиться в среде MATLAB. Однако для программ на языке MATLAB созданы компиляторы, транслирующие программы на языке MATLAB в коды языков программирования C и C++. Это решает задачу создания исполняемых программ, изначально создаваемых в среде MATLAB. Следует упомянуть, что в MATLAB класс array – обобщенный класс объектов-массивов, является прародителем всех остальных встроенных классов. Матричная форма представления операций делает программирование в среде MATLAB очень лаконичным, что снижает трудоемкость работ и повышает надежность результатов. Учитывая, что читатель имеет начальную компьютерную подготовку, мы будем описывать лишь те элементы меню, инструментария и конструкций языка, которые необходимы для выполнения предлагаемых действий. Так как интерфейс среды MATLAB является стандартным для программных продуктов, работающих под операционной системой Windows, то на его описании мы тоже специально останавливаться не будем. Работа в среде MATLAB может осуществляться в двух режимах: – в командном режиме (режиме калькулятор или режиме непосредственных вычислений), т.е. вычисления производятся непосредственно после набора очередного оператора; – путем вызова программы, записанной на языке MATLAB. В обоих режимах пользователю доступны практически все вычислительные возможности системы. 2. ЗАПУСК СИСТЕМЫ И ЗНАКОМСТВО СО СПРАВОЧНОЙ СИСТЕМОЙ Запуск системы осуществляется стандартным для Windows способом (нажатием левой клавиши мыши на ярлыке MATLAB в рабочем меню операционной системы). После запуска программы MATLAB на дисплее компьютера появляется ее главное окно (рис.1), и система готова к проведению вычислений в командном режиме (режиме калькулятора). Окно содержит меню, инструментальную линейку с кнопками, указанием текущей папки (Current Directory) и ряд подокон, набор которых можно изменять по составу и количеству с помощью меню View (Вид). Рисунок 1. Рассмотрим основное из подокон – командное окно (Command Window). В нем отображаются символы команд, набираемые на клавиатуре, результаты выполнения этих команд, информация об ошибках выполнения программ и т.п. Признаком того, что программа MATLAB готова к восприятию и выполнению очередной команды, является наличие в последней строке текстового поля командного окна знака приглашения (>>), после которого стоит мигающая вертикальная черта. В верхней части окна MATLAB размещена строка меню: File, Edit, View, Web, Window, Help. Назначение пунктов меню будет даваться по мере необходимости. При этом в дальнейшем последовательность действий будет указываться перечислением пунктов меню через черточку, как в следующей фразе. Выход из системы MATLAB осуществляется закрытием главного окна, или выбором File - Exit MATLAB. Пункт меню Help - MATLAB Help (или кнопка ?) позволяет воспользоваться подробной справочной системой и демонстрационными примерами. На эти примеры можно также выйти, набрав в командном окне demo. В демонстрационных примерах содержится большое число серьезных задач. При необходимости можно ознакомиться с файлами примеров и даже перенести тексты программ в командное окно MATLAB, используя буфер промежуточного хранения (Ctrl+C – Ctrl+V или соответствующие кнопки). Окно справки состоит из двух подокон (рис.2). В левом – информация для поиска нужного раздела справочной системы, в правом – текст, активизированной слева темы. Для быстрой справки по какому-либо объекту надо в командном окне ввести: help имя объекта Если нет уверенности в правильном написании имени объекта или оно неизвестно, можно использовать поиск по ключевому слову или по последовательности слов. Для этого следует использовать команду lookfor Ключевое слово или lookfor 'Ключевые слова' Рисунок 2. 3. РАБОТА В КОМАНДНОМ РЕЖИМЕ 3.1. Сеанс работы с MATLAB Сеанс работы с MATLAB принято именовать сессией. Сессия, в сущности, является текущим документом, отражающим работу пользователя с системой MATLAB. В ней имеются строки ввода, вывода и сообщений об ошибках. Как говорилось, строка ввода начинается с приглашающего символа ». В строке вывода символ » отсутствует. Строка сообщений об ошибках начинается символами ???. Все значения переменных, вычисленные в течение текущего сеанса работы хранятся в специально зарезервированной области памяти компьютера, называемой рабочим пространством системы MATLAB (Workspace) Команды набираются на клавиатуре с помощью обычных операций строчного редактирования. Особое назначение имеют клавиши и . Они используются для подстановки после приглашения » ранее введенных строк, например, для их дублирования, исправления или дополнения. Полезно сразу усвоить следующие команды: clc - очищает экран и размещает курсор в левом верхнем углу пустого экрана; clear - уничтожает в рабочем пространстве определения всех переменных; clear x - уничтожает в рабочем пространстве определение переменной x; clear a,b,c - уничтожает в рабочем пространстве определения переменных списка. Уничтоженная (стертая в рабочем пространстве) переменная становится неопределенной. Использовать такие переменные нельзя, попытки сделать это сопровождаются выдачей сообщений об ошибке. По мере задания одних переменных и уничтожения других рабочая область перестает быть непрерывной и содержит "дыры" и всякий "мусор". Во избежание непроизводительных потерь памяти при работе с объемными данными следует использовать команду pack, осуществляющую дефрагментацию рабочей области. 3.2 Простейшие действия в командном окне После символа » можно сразу вводить исходные данные. Вычисления проходят в диалоговом режиме. Для арифметических операций используются обычные знаки: +, –, *, /, для возведения в степень взят символ ^, а для деления справа налево – \. Например, если ввести выражение >> R = 4.5^2*7.23 - pi*10.4 и нажать Enter, получим ответ: R= 113.7349 Здесь pi есть константа π Видно, что введенное значение присвоилось переменной R. Кстати, имена переменных и других элементов должны начинаться с буквы, они могут иметь любое число символов (запоминаются первые 31), заглавные и строчные буквы различаются системой. Остальные правила обычны. Если формат вывода Вас не устраивает, его можно установить через меню File – Preferenses. Полный список операций можно получить командой help ops. В общем случае форма ввода и вывода в командное окно имеет вид: имя переменной = выражение Если в выражение входит функция, то общая форма обращения к ней: имя функции(список имен аргументов или их значений) При вводе имя переменной указывать необязательно, результат в этом случае присвоится специальной системной переменной ans, например, >> sqrt(-2) ans = 0 + 1.4142i где sqrt – функция вычисления квадратного корня, i – мнимая единица. Полученное значение можно использовать в последующих вычислениях под именем ans, но следует помнить, что значение этой переменной изменится при первом же встретившемся вычислении без знака присваивания. Действия в командном окне подчиняются следующим правилам: - если запись оператора не заканчивается символом ";", то результат его действия сразу отображается в командном окне; если запись оператора заканчивается символом ";" (его еще называют символом блокировки вывода), то результат не отображается в командном окне; Кроме уже известных имен ans и pi используются и другие системные имена: i,j – мнимая единица (корень квадратный из –1); eps – погрешность для операций над числами с плавающей точкой (2-52); realmin – наименьшее число с плавающей точкой (2-1022); realmax – наибольшее число с плавающей точкой (21023); Inf – машинная бесконечность; NaN – указание на нечисловой характер данных (Not-a-Number). Примеры: >> eps ans = 2.2204e-016 >> realmin ans = 2.2251e-308 >> realmax ans = 1.7977e+308 >> 2/0 Warning: Divide by zero. ans = Inf >> 0/0 Warning: Divide by zero. ans = NaN 3.3 Массивы Массивы играют центральную роль в языке MATLAB. Все данные представлены в виде массивов, например, даже простая переменная представляется как массив размером 1 1 . Как и в других языках программирования, именованные наборы данных называют массивами. Всему массиву присваивается одно имя, а доступ к отдельным элементам массива осуществляется по целочисленному индексу, т.е. по номеру элемента в массиве. Правила использования аналогичны другим языкам. Основные отличия: массив заранее не определяется, а при вводе элементов допускается значительная свобода действий. Признаком массива являются прямые скобки, а элемента массива – имя с индексом в круглых скобках. Если массив представляет вектор-строку, то символы разделяются пробелами или запятыми, а если вектор-столбец, то символами ";", либо переводами строк. Примеры: >> a1 = [1 2 3] a1 = 1 2 3 >> a2 = [3,2,1] a2 = 3 2 1 >> [3;7;8] ans = 3 7 8 >> d = [4 3] d= 4 3 Массивы можно вводить частями, которые потом объединяются, например, объединим определенные выше массивы a1 и a2: >> b = [a1 a2] b= 1 2 3 3 2 1 Можно определять массив, прописывая каждый элемент: >> A(1) = 2; >> A(2) = 7; >> A(3) = 5 A= 2 7 5 или еще интересней: >> B(4) = 3 B= 0 0 0 3 т.е. создали массив из четырех элементов, где первые три нулевые. Если значения элементов изменяются с постоянным шагом, то для формирования массива удобно использовать оператор двоеточие – «:», например: >> x = 1:0.1:2 x= Columns 1 through 7 1.0000 1.1000 1.2000 1.3000 1.4000 1.5000 1.6000 Columns 8 through 11 1.7000 1.8000 1.9000 2.0000 Можно строить массивы, используя специальные встроенные функции, например, получить массив из пяти единиц: >> E=ones(1,5) E= 1 1 1 1 1 Для определения двумерных и многомерных массивов используются все те же приемы, а строки отделяются друг от друга записью с новой строки или символом «;». Примеры: >> [9 8 7 654 3 2 1] ans = 9 8 7 6 5 4 3 2 1 >> [1 2 3;4 5 6;7 8 9] ans = 1 2 3 4 5 6 7 8 9 Определим массив из единиц размером 3*5; >> E=ones(3,5) E= 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 По умолчанию элементы двумерного массива просматриваются по строкам, т.е. сначала изменяется второй индекс. В случае обработки многомерных массивов, сначала изменяется крайний правый индекс, затем второй справа и т.д. Упомянутый выше оператор двоеточие – «:» используется и для других целей – он как бы осуществляет перечисление всех элементов по данному индексу. Поясняют это примеры формирования массивов v, w, u из определенного выше двумерного массива ans: >> v = ans(:) v= 1 4 7 2 5 8 3 6 9 >> w = ans(:,1) w= 1 4 7 >> u = ans(2,:) u= 4 5 6 Пустой массив задается двумя квадратными скобками без символов между ними. Пустой массив можно, в частности, использовать для удаления элементов массива, например: удалить второй столбец из массива ans >> ans(:,2) = [] ans = 1 3 4 6 7 9 удалить третью строку из массива ans >> ans(3,:) = [] ans = 1 3 4 6 Аналогично строятся и используются многомерные массивы. Далее наряду с термином массив будем использовать термины вектор, матрица и т.п. Некоторые функции для работы с матрицами: eye – создание единичной матрицы; ones – создание матрицы из единиц; zeros – создание матрицы из нулей; linspace – формирует вектор-строку равноотстоящих узлов; cat – конкатенация матриц; diag – создание матриц с заданной диагональю; fliplr – перестановка столбцов матрицы относительно вертикальной оси; flipud – перестановка строк матрицы относительно горизонтальной оси; perms – формирует матрицу из перестановок элементов вектора; prod – произведение элементов массива; cumprod – произведение элементов массива с накоплением; sum – сумма элементов массива; cumsum – сумма элементов массива с накоплением; repmat – копирование матрицы; reshape – выборки из матрицы; rot90 – поворот матрицы на 90; tril – выделяет нижнюю треугольную часть матрицы; triu – выделяет верхнюю треугольную часть матрицы; length – количество элементов в одномерном массиве A; size – размер массива (например, число строк и число столбцов); ndims – размерность массива, т.е. количество индексов; и т.д. Количество функций достаточно велико, обращайтесь к системе Help. Все перечисленные функции имеют несколько вариантов применения, с разным числом аргументов. Далее мы будем описывать лишь те варианты использования функций, которые потребуются для примеров. Например, для определенных выше v и ans: >> d=length(v) d= 9 >> s = size(ans) s= 3 3 >> n = ndims(ans) n= 2 Можно использовать вложение функций: d=log((cumprod(1:6))') d= 0 0.6931 1.7918 3.1781 4.7875 6.5793 Здесь (1:6) – формирование массива [1 2 3 4 5 6]; функция cumprod – вычисляет факториалы элементов полученного массива: [1 2 6 24 120 720]; апостроф обозначает операцию транспонирования, и, наконец, функция log вычисляет натуральные логарифмы от факториалов и результат присваивается переменной d. 3.4 Простейшие операции с векторами и матрицами Уже из названия системы следует, что MATLAB специально предназначена для выполнения операций над матрицами. Даже обычную константу MATLAB рассматривает как матрицу размером (1,1). В этом легко убедиться: >> size(5) ans = 1 1 В простых вычислениях пользователь не замечает такого представления данных, а в более сложных это необходимо учитывать. В дальнейшем нам такие случаи встретятся. MATLAB представляет вектор-строку с N элементами – как матрицу размером (1,N), а аналогичный вектор-столбец как матрицу размером (N,1). Правила действий над векторами и матрицами делятся на две группы: 1) правила, которые предусмотрены векторным исчислением в математике; 2) правила по преобразованию элементов, которые не предусмотрены математикой, но удобны для программирования. Действия первой группы обозначаются так же, как действия над обычными математическими объектами. Сюда добавляется знак транспонирования – ' и функция обращения матрицы inv(A). Например: >> A = [1 2 3;4 5 6] A= 1 2 3 4 5 6 >> B = A' B= 1 4 2 5 3 6 >> C = [1 2 3 4]; >> D = inv(C) D= -2.0000 1.0000 1.5000 -0.5000 >> G = inv(D) G= 1.0000 2.0000 3.0000 4.0000 >> E=C*D E= 1.0000 0 0.0000 1.0000 Здесь матрица D получена обращением матрицы С, а G обращением D. Видно, что получили матрицу равную исходной. Матрица Е получена умножением матрицы С на обратную матрицу С-1 (т.е.D). Естественно, что Е – единичная матрица. Операцию обращения матрицы можно записывать в более естественном виде: >> H = C^(-1) H= -2.0000 1.0000 1.5000 -0.5000 Видно, что матрица Н совпала с матрицей D. Для удобства добавлены две операции, которых в математике нет: деление матриц слева направо – /, и деление справа налево – \. Операция В/А эквивалентна действиям В*inv(A), а операция А\В эквивалентна действиям inv(A)*B. Эти операции удобны при решении системы линейных уравнений A*X=B Можно умножить слева это уравнение на обратную матрицу A-1, получим решение: X = A-1B. Так, решение системы x1 + 2x2 +3x3 = 14 2x1 – x2 – 5x3 = –15 x1 – x2 – x3 = – 4 на MATLAB можно записать: >> A=[1 2 3 2 -1 -5 1 -1 -1]; >> B=[14;-15;-4]; >> X=A\B X= 1.0000 2.0000 3.0000 Отметим, что при решении систем линейных уравнений лучше пользоваться записью X=A\B, а не inv(A)*B, т.к. первая использует алгоритм Гаусса, а вторая использует обращение матрицы А. С помощью операции деления можно обращение матрицы A записать как E / A, где E – единичная матрица. Ко второй группе относятся операции поэлементного умножения, деления и возведения в степень. Эти действия обозначаются добавлением точки перед символом операции. Например: >> A = [1 2;3 4] A= 1 2 3 4 >> B = [2 1;3 1] B= 2 1 3 1 >> C = A .* B C= 2 2 9 4 Сравним с обычным умножением матриц >> C1=A*B C1 = 8 3 18 7 Если взять функцию от матрицы, то получим матрицу функций от ее элементов, например: >> D = [0 pi/6 pi/3 pi/2] D= 0 0.5236 1.0472 1.5708 >> F = sin(D) F= 0 0.5000 0.8660 1.0000 3.5 Сохранение и считывание данных сеанса работы (сессии) Все значения переменных, вычисленные в течение текущего сеанса работы, хранятся, как уже упоминалось, в рабочем пространстве системы MATLAB (Workspace). Посмотреть, что в нем находится, можно командой who, или выбором подокна Workspace (если подокна нет, его можно открыть, используя View – Workspace). Для просмотра значения любой переменной из рабочего пространства, достаточно сделать двойной щелчок левой кнопкой мыши (ЛКМ) на имени переменной, или набрать ее имя в командном окне и нажать Enter. Рабочее пространство можно очистить командой clear, а для удаления конкретных переменных следует использовать clear имя1 имя2 … Поcле окончания работы и выхода из MATLAB все ранее вычисленные переменные теряются. Чтобы сохранить рабочее пространство (не файл с текстом в командном окне!) до следующего сеанса, необходимо: выбрать в меню File – Save Workspace As…(Файл – Сохранить Рабочее Пространство как…). В открывшемся окне Save to MAT-file (Сохранить в .mat-файл) в строке File name (Имя файла) набрать имя файла, при необходимости выбрать нужную папку и нажать кнопку Save (Сохранить). Рабочее пространство будет сохранено в файле имя файла с расширением .mat. По умолчанию рабочее пространство сохраняется в текущей (активной) папке в файле имя файла с расширением .mat. Обычно текущей папкой является папка work, системы MATLAB. Чтобы сделать текущей другую папку, нужно воспользоваться раскрывающимся списком Current Directory (Текущая Директория) главного окна MATLAB и кнопкой справа от списка (с многотчием). При поиске файлов пользователя, система начинает просмотр с текущей паки, а затем просматривает все папки, указанные в списке путей известных системе MATLAB. Доступ к списку осуществляется через меню File – SetPath… . Загрузить рабочее пространство перед продолжением работы можно через меню: File – Open… (Файл – Открыть…). После загрузки файла появится сообщение: Variables created in current workspace. которое говорит об успешном восстановлении переменных в рабочем пространстве. В этом легко убедиться, посмотрев пространство или набрав, имя переменной и нажав ввод – на экране появится ее значение. 3.6 Упражнения 2 3 4 1 3 2 1 4 1 Ввести матрицу A различными способами: в pi 2i 4 j 2 * pi 1 2i 0 3 pi / 2 естественном виде; в виде одной строки; в виде одного столбца; в виде 2 8 и 8 2 . 2 Введенную выше матрицу А преобразовать в вектор-столбец, затем в вектор-строку. 3 Убедиться, что после выполнения действий: >> A = [1 2;3 4]; B = [4 3;2 1]; C = [5 6;7 8]; D = [8 7;7 6]; >> F=[A B;C D]; >> F(:,1)=[]; F(:,3)=[]; F(1,:)=[]; F(3,:)=[] получится следующий результат: F= 4 2 6 8 4 С помощью оператора ":" создать массив x = [0, 1, 2, 3, 4, 5], затем вычислить cos(x) и sin( x) . Если во второй функции получится одно число – x подумать в чем дело. 5 В полученном массиве x поменять порядок элементов на обратный и вычислить сумму элементов с накоплением, т.е. k x k xi , k 1,2,...6 . i 1 Воспользоваться функциями fliplr и cumsum. 6 Из массива x (см. выше) постройте матрицу Вандермонда. Напомним 1 1 общий вид такой матрицы: W 1 ... 1 x1 x2 x3 ... xn x12 x 22 x32 ... x n2 x13 x 23 x33 ... x n3 ... ... ... ... ... x1n 1 x 2n 1 x3n 1 . Желательно сделать ... x nn 1 все одной командой, можно воспользоваться функциями repmat, cumprod; 4. MATLAB. ПОСТРОЕНИЕ ГРАФИКОВ 4.1 Построение графиков функции одной переменной Построение двумерных графиков обеспечивает процедура plot . Общая форма обращения: plot(x1,y1,s1,x2,y2,s2,…) Здесь x1,y1 – заданные векторы, элементами которых являются массивы значений аргумента (x1) и функции (y1), соответствующих первой кривой графика, x2,y2 – массивы значений аргумента и функции второй кривой и т.д. При этом значения х откладываются по горизонтальной оси, а y по вертикальной. Переменные si являются символьными (их указание не обязательно). Каждая из них может содержать три специальных символа, которые определяют тип линии, цвет и тип проставляемых точек. Если s не указано, то берутся значения по умолчанию. Графики всегда выводятся в отдельном (графическом) окне, которое называют фигурой. Пример. Пусть требуется вывести график функции y = 3sin(x + π/3) на промежутке от –3π до 3π с шагом π/100. Сначала формируем массив значений аргумента х: х = –3*pi : pi/100 : 3*pi затем вычисляем массив соответствующих значений функции: y = 3*sin(x+pi/3) и, наконец, строим график y(x). В командном окне эта последовательность операций будет выглядеть так: >> x = -3*pi : pi/100 : 3*pi; >> y = 3*sin(x+pi/3); >> plot(x,y) В результате на экране появится окно с графиком (рис.3). Отметим, что при построении кривой функция plot использует линейную интерполяцию, т.е. соединяет соседние точки отрезком прямой. Поэтому, чем больше взято точек, тем более гладкой будет кривая. Если указать только массив y, >> plot(y) то в качестве аргумента, по умолчанию, будут взяты последовательные номера точек. Если необходима координатная сетка, то нужно добавить ключевое слово grid, а убрать сетку можно с помощью команды grid off. Заголовок графика можно вывести с помощью команды title. После обращения к процедуре plot вызвать title можно таким образом: title('текст') Сверху в поле фигуры появится текст, записанный между апострофами. Напомним, что текст всегда должен помещаться в апострофы. Аналогично можно вывести пояснения к графику, которые размещаются вдоль осей с помощью функций xlabel и ylabel. Рисунок 3 Например, совокупность операторов: >> x = -3*pi : pi/100 : 3*pi; >> y = 3*sin(x+pi/3); >> plot(x,y), grid >> title('ФУНКЦИЯ y = 3*sin(x+pi/3)'); >>xlabel('Ось X'); ylabel('Ось Y'); приведет к оформлению поля в виде, представленном на рис.4. Нетрудно вывести функцию, заданную параметрически. Пусть необходимо построить график функции y(x), которая задана формулами: x = 4 e-0.05tsin(t), y = 0.2 e-0.1tsin(2t) Выберем диапазон изменения параметра t от 0 до 50 с шагом 0.1. Тогда набирая совокупность операторов: >> t = 0 : 0.1 : 50; >> x = 4*exp(-0.05*t).*sin(t); >> y = 0.2*exp(-0.1*t).*sin(2*t); >> plot(x,y) >> title('ПАРАМЕТРИЧЕСКАЯ ФУНКЦИЯ'); >> grid Получим график на рис.5 Рисунок 4 Рассмотрим, как задавать стиль линии, т.е. параметр s в аргументах функции plot. Стили s задаются в виде набора трех символьных маркеров, заключенные в одиночные кавычки (апострофы). Маркер типа линии: Маркер -Тип Непрерывна Штрихов линии я ая : -. Пунктирная Штрихпунктирна я Маркер типа проставляемых точек: Маркер . + * o х s d Тип . + * ° х □ ◊ точки Маркер цвета: Маркер Цвет линии c Голубой m Фиолетовый y Желтый r Красный Маркер g b w k Цвет линии Зеленый Синий Белый Черный Есть и другие маркеры проставляемых точек. Можно указывать не все три маркера. Порядок тоже не имеет значения. Рисунок 5 В качестве примера рассмотрим графики двух функций: y = sin(x) и u = cos(x). >> x = 0:0.3:2*pi; >> y = sin(x); >> u = cos(x); >> plot(x,y,'ro:',x,u,'k*-.') Результат представлен на рис.6. В черно-белом изображении красная линия выглядит более бледной. Рисунок 6. Чтобы несколько последовательно вычисленных графиков, (т.е. выводимых разными командами plot) были отображены в одном графическом окне, можно использовать команду: >> hold on Тогда каждый следующий график будет строиться в том же предварительно открытом графическом окне, т.е. новая линия будет добавляться к ранее построенным. Команда hold off отключает этот режим. В некоторых случаях предыдущая информация в графическом окне мешает использованию новой, тогда предварительно можно очистить окно командой clf reset, или открыть новое окно командой figure. MATLAB имеет много других возможностей по "облагораживанию" графиков [7,8,9]: изменение размеров окна, размещение поясняющих надписей, объединение нескольких фигур в одно окно и т.д. Простейшее редактирование графиков выполняется с помощью линеек инструментов, которые вызываются в меню View (Вид) графического окна (см. рис.3 – 6). По умолчанию установлена линейка Figure Toolbar. Обозначения элементов линейки обычны для редакторов типа Word, за исключением стрелки справа от иконки принтера. Когда стрелка нажата, можно вызвать редактор графиков. Для этого следует выбрать редактируемую кривую и сделать на ней двойной щелчок ЛКМ. В окне редактора можно менять толщину, цвет, тип линии и т.п. 4.2 Построение трехмерных графиков Для построения трехмерных графиков можно использовать команду plot3. Правила её использования аналогичны команде plot2, только количество массивов для построения кривой должно быть три, например: >> t = 0:pi/50:10*pi; >> x=sin(t); y = cos(t); >> plot3(x,y,t); grid on Результат представлен на рис.7, где толщина траектории увеличена редактором графиков. Рисунок 7. Больший интерес представляют поверхности. Для их построения необходимо создать "объёмный" массив точек, который можно сформировать функцией meshgrid. Она создает два двумерных массива x и y, на которых строится сетка координат для вычисления переменной z. Например, meshgrid([0:3]) формирует массив 0 0 x 0 0 1 2 3 1 2 3 1 2 3 1 2 3 и массив 0 1 y 2 3 0 0 0 1 1 1 . 2 2 2 3 3 3 Для вычисления значений переменной z используются точки (x11,y11), (x12,y12),…, (xik,yik),…,(x44,y44). Построим трехмерную поверхность, z ( x, y) x 2 y 2 : >> [x y] = meshgrid([-3:0.15:3]); >> z = x.^2+y.^2; >> plot3(x,y,z) Результат представлен на рис.8. описываемую функцией Рисунок 8 Мы рассмотрели две самые простые команды, и в самых простых вариантах. Имеются и другие команды, например, если в последнем примере заменить plot3 на meshc, то получим: >> [x y] = meshgrid([-3:0.15:3]); >> z = x.^2+y.^2; >> meshc(x,y,z) Результат на рис.9, здесь изображение наглядней, и представлены линии уровня. Рисунок 9 4.3 Перечень некоторых команд построения графиков Система MATLAB содержит очень широкий набор команд и функций, как общих, так и специальных, для работы с графикой, вплоть до движущихся и озвученных кривых и поверхностей. Причем почти каждая функция имеет несколько вариантов применения, что вообще характерно для MATLAB. За всеми этими возможностями обращайтесь к системе help и литературе, например [7,8,9] и др. Здесь мы приведем имена лишь нескольких из них (это облегчит поиск родственных команд): loglog, semilogx, semilogy – для логарифмических и полулогарифмических графиков; feather – проекции векторов на плоскость; polar – графики в полярных координатах; bar, bar3 – столбиковые диаграммы; hist – гистограммы; stairs – лестничные графики; contour, contour3 – контурные графики (строят линии уровня); quiver – графики полей градиентов; mesh – выводит сетчатую поверхность функции z(x,y); surf, surfc, surfl – поверхности с функциональной окраской и подсветкой; slice – построение сечений 3D-поверхностей; subplot – создание в графическом окне нескольких подокон; comet3 – движение точки в пространстве; и т.д. Имеются также средства низкоуровневой дескрипторной графики [8,9], которые существенно расширяют возможности визуализации. 4.4 Упражнения Построить поверхности функций. Графики должны иметь названия и названия осей. Все характерные участки (выпуклости, вогнутости, экстремумы и т.п.) должны быть указаны и прокомментированы непосредственно на графике. Если будете использовать функцию plot3, то выделите любую линию и измените ее толщину с помощью редактора графика. При вычислении функций не забывайте об операции поэлементного умножения. № 1 2 3 4 5 Функция z sin( x) x y 2 0.3 Пределы изменения аргументов –3 : 0.1 : 3 2 z xe( x 2 y2 ) z e ( x y ) z x2 y2 2 2 z x 3 y 3 3xy –2 : 0.1 : 2 x = –2 : 0.1 : 2, y = –1 : 0.1 : 1 –2 : 0.1 : 2 –4 : 0.1 : 4 5. MATLAB. ПРОГРАММИРОВАНИЕ В MATLAB Кроме непосредственной работы в командном окне, MATLAB дает возможность писать самостоятельные программные модули на разных языках, однако штатными являются С++ и свой собственный М-язык. Так все, что мы до сих пор делали в командном окне [1], подчиняется синтаксису М-языка системы MATLAB, поэтому некоторое знакомство с ним мы уже получили. Язык имеет следующие средства: данные различного типа; константы и переменные; операторы, включая операторы математических выражений; встроенные команды и функции; функции пользователя; управляющие структуры; системные операторы и функции; средства расширения языка. М-язык является интерпретатором, т.е. каждая инструкция программы распознается и тут же исполняется. 5.1 Основные типы данных Кто не собирается программировать в MATLAB, может этот параграф пропустить. Структура типов данных системы MATLAB имеет вид (рис.10): array char numeric double cell struct unit8 sparse Рисунок 10 Типы данных array и numeric являются виртуальными, поскольку к ним нельзя отнести какие-либо переменные. Они служат для определения и комплектования некоторых типов данных. Т.е. по существу определено шесть типов данных: double – числовые массивы с числами удвоенной точности; char – строчные массивы с элементами-символами; sparse – разреженные матрицы с элементами-числами удвоенной точности; cell – массивы ячеек, которые в свою очередь могут быть массивами; struct – массивы записей с полями, которые также могут содержать массивы; unit8 – массивы 8-разрядных целых чисел без знаков (математические операции с ними не предусмотрены). Имеется еще тип данных определенный пользователем: UserObject. До сих пор мы имели дело с данными типов double и char. За описанием остальных обращайтесь к литературе и системе help. Отметим лишь, что ячейки cell представляют собой массивы с элементами разных типов. Для отличия от обычных массивов ячейки заключаются в фигурные скобки. В иерархии типов данных на самом верхнем уровне находятся данные типа array, это значит, что все виды данных являются массивами. Типы данных явно не объявляются М-язык имеет необходимые средства для различных видов программирования: процедурного; операторного; функционального; логического; структурного (модульного); объектно-ориентированного; визуально-ориентированного. 5.2 Программные модули на М-языке Программные модули на М-языке имеют расширение .m и называются m-файлами. В системе MATLAB имеются программы двух типов: Script-файлы (или сценарии, или управляющие программы) и m-функции (процедуры). И те, и другие имеют расширение .m. Причем при обращении к ним расширение не указывается. Главным внешним отличием текстов этих двух видов файлов является то, что m-функции имеют первую строку вида: function [var1,var2,…] = имя функции(par1,par2,…) Здесь var – выходные выражения (если оно одно, то скобки могут опускаться) par – входные параметры (аргументы функции). Сценарий такой строки не имеет. Он является просто записью последовательности команд без входных и выходных переменных. Принципиальное отличие заключается в разном восприятии системой имен переменных в этих файлах. В сценариях все переменные помещаются в рабочее пространство (Workspace), как и переменные командного окна. Интеграция с рабочим пространством делает эти файлы удобными для управления вычислительным процессом. m-функции располагают собственным пространством переменных, изолированным от рабочего пространства системы MATLAB. Поэтому совпадение имен из рабочего пространства и имен внутренних переменных m-функций не приводит к противоречиям. Переменные, которые используются в теле m-функции и не совпадают с именами формальных параметров этой функции, называются локальными. Их область действия полностью ограничена рамками тела данной mфункции. Они не видны из рабочего пространства системы MATLAB и из других m-функций. Основным каналом передачи информации из командного окна в mфункцию и из одной функции в другую является механизм параметров функции. Другим механизмом передачи информации в функцию являются глобальные переменные. Чтобы рабочая область системы MATLAB и (или) несколько mфункций могли совместно использовать некоторую переменную с заданным именем, ее всюду, где она используется, нужно объявить как глобальную с помощью ключевого слова global. Локальные переменные не сохраняют своих значений между вызовами функции. При необходимости это преодолевается с помощью статических переменных, которые объявляются с помощью ключевого слова persistent. Внутри m-функции могут размещаться другие процедуры (подфункции). Они подчиняются тем же правилам и располагаются в конце тела основной функции. Число входных и выходных параметров в m-функциях может быть переменным. MATLAB допускает построение рекурсивных алгоритмов. Основные особенности записи текста m-файлов. Если оператор не помещается в одной строке, то эта строка должна заканчиваться тремя точками … . В одной строке может помещаться несколько операторов, разделенных символом ";". Если очередной оператор не заканчивается символом ";", результат его действия при выполнении программы будет выведен в командное окно. Строка или часть строки, начинающаяся символом "%" рассматривается системой MATLAB как комментарий и не обрабатывается. Строки комментария, предшествующие первому исполнимому оператору, рассматриваются как описание программы. Оно может быть выведено по команде: help имя файла В М-языке переменные не описываются и не объявляются. Любое новое имя воспринимается как имя матрицы. Размер этой матрицы устанавливается при предварительном вводе значений ее элементов, либо определяется действиями по установлению значений ее элементов, описанными в предыдущем операторе или процедуре. Для выхода из программы в произвольной точке служит оператор return. 5.3 Основные операторы М-языка Ввод-вывод. Для ввода данных используется функция input. Существует два варианта этой функции, использование которых понятно из приведенных ниже примеров. Все действия выполнены непосредственно в командном окне. В строках, которые начинаются с символа приглашения ">>", подчеркиванием выделены символы, набираемые пользователем (на самом деле они не подчеркиваются). а) первый вариант >>R = input('Введите радиус окружности r = ') Введите радиус окружности r = 12 >> R R= 12 б) второй вариант >>W = input('Введите выражение ','s') Введите выражение 2*sin(pi/6) W= 2*sin(pi/6) >> eval(W) ans = 1.0000 Здесь 's' – второй параметр функции input, указывает, что будет введено строковое выражение. Мы присвоили это значение переменной W, а затем применили встроенную функцию eval, которая преобразует символьное выражение в числовое и выполняет вычисления. Простейший оператор для вывода результатов: disp (A) Он записывается с единственным аргументом, который может быть числовым или символьным массивом. Поэтому, если необходимо вывести несколько различных переменных, то их объединяют в массив. Для более гибкого оформления вывода можно использовать функцию sprintf. Она работает аналогично функции printf языка Си. За подробностями обращайтесь к литературе и системе help. Для любознательных напомним, что в MATLAB имеются средства организации графического интерфейса. Операторы управления Все операторы управления (if, while, switch, for) заканчиваются словом end. Операторы, расположенные между ними, воспринимаются системой, как части одного сложного оператора, выполнение которого не начнется до тех пор, пока не появится закрывающий его end. Поэтому их можно использовать и в командном окне в режиме калькулятора. Оператор условного перехода: if условие операторы1 else операторы2 end Конструкция else может отсутствовать. В качестве условия используется выражение типа: выражение1 операция сравнения выражение2 Операции сравнения: < меньше > больше <= меньше или равно >= больше или равно == равно ~= не равно Например: if 2 < v(tud) < 2.5 disp('Скорость в допуске') else disp('Скорость не в допуске') end Если функция v(tud) возвращает значение в диапазоне 2 – 2.5, то будет выведено сообщение: "Скорость в допуске". Истинность или ложность условия понимается как отличие или равенство нулю. Например: A = [1 2; 4 0]; if A b=1; else b=2; end Здесь переменная b получит значение 2, т.к. матрица А содержит один нулевой элемент и все условие считается ложным. Кстати, запись if A по своему действию эквивалентна записи if A ~= 0. Условие может быть составным, тогда они объединяются следующими логическими операциями: & логическая операция И (AND) | логическая операция ИЛИ (OR) ~ логическая операция НЕ (NOT) Возможна более сложная конструкция оператора if: if условие1 операторы1 elseif условие2 операторы2 elseif условие3 операторы3 . . . else операторы end которая позволяет организовать ветвление по нескольким направлениям. Например: >> A = [5 7; 4 0]; >> if A b=0 elseif A(1,1)==0 b=1 elseif A(1,2)==7 b=3 else b=4 end b= 3 Оператор переключения: switch выражение case {значение1} операторы1 case {значение2} операторы2 . . . otherwise операторы end например: switch var case {1,2,3} disp('Первый квартал') case {4,5,6} disp('Второй квартал') case {7,8,9} disp('Третий квартал') case {10,11,12} disp('Четвертый квартал') otherwise disp('Ошибка в задании') end Этот фрагмент в ответ на значение переменной var – номера месяца – определяет, к какому кварталу относится заданный месяц. Операторы цикла. while условие операторы end условие – задается так же, как в операторе if, а цикл выполняется до тех пор, пока условие сохраняет истинность. >> i=0; while i <= 20 i=i+1; end i i= 21 for имя = НЗ : Ш : КЗ операторы end Здесь имя – имя переменной цикла. НЗ – начальное значение переменной цикла, Ш – шаг ее изменения, КЗ – конечное значение переменной цикла. Если Ш = 1, то он может опускаться. Например, следующий фрагмент программы: str = []; % определение пустого массива str for i = 1:9; str = [str fact(i)]; % fact – вычисляет факториал значения пере% менной i end; disp(str); дает результат: >> disp(str'); 1 2 6 24 120 720 5040 40320 362880 Покажем работу цикла по шагам: i=1 str = [1] i=2 str = [1 2] i=3 str = [1 2 6] ……………. i=9 str = [1 2 6 24 120 720 5040 40320 362880] Чтобы досрочно выйти из цикла (обоих типов), применяют оператор break. 5.4 Подготовка к организации собственных m-файлов Напомним, что созданные пользователем m-файлы помещаются, по умолчанию, в рабочую папку work системы MATLAB. Рассмотрим пример оформления m-функции. В меню File выбрать пункты New , M-file. В открывшемся окне набрать текст: function w = rmovel(v, eps) % removel удаляет из вектора v совпадающие, % с заданной точностью, элементы % вызов функции: w = rmovel(v, eps) % используемые функции MATLAB: length, find % функции пользователя: нет % входные переменные: % v - исходный вектор, eps – точность % выходные переменные: % w - вектор не содержащий одинаковых элементов % автор примера В.Г.Потемкин МИФИ w = []; while length(v) > 0 w = [w v(1)]; I = find(abs(v-v(1)) < eps); v(I) = []; I = []; end Затем выбрать File – Save и в открывшемся окне Save file as в строке File name набрать имя m-файла. Оно должно совпадать (!) с именем функции, т.е. rmovel (система должна предлагать его по умолчанию), затем нажать кнопку Save. Приведенная программа работает следующим образом: Первый исполнимый оператор определяет пустой массив w. Затем открывается цикл, который работает до тех пор, пока массив v не пустой (встроенная функция length возвращает длину массива). В цикле: – к массиву w добавляется первый элемент массива v(1); – в массив I заносятся все номера элементов массива v, для которых выполняется условие v(i) v(1) eps i 1,2,...,n n длина массива . Встроенная функция find возвращает все элементы, отвечающие записанному в скобках условию; – из массива v удаляются все элементы с номерами I; – очищается массив I. К созданной m-функции можно обратиться из другого m-файла или командного окна. Например, определим в командном окне массив A, удалим из него повторяющиеся элементы и поместим оставшиеся члены в массив В. >> A = [2 7 7 3 2 2 7 7 7]; >> B = rmovel(A, 1e–6) B= 2 7 3 Распишем работу цикла по шагам (в модуле v = A): while 9 > 0 (да, т.к. length(v) = 9) w = [2]; I = [1 5 6]; v = [7 7 3 7 7 7]; I = []; while 6 > 0 (да, т.к. length(v) = 6) w = [2 7]; I = [1 2 4 5 6]; v = [3]; I = []; while 1 > 0 (да, т.к. length(v) = 1) w = [2 7 3]; I = [1]; v = []; I = []; while 0 > 0 (нет, т.к. length(v) = 0) w = [2 7 3] Обратите внимание на то, что переменных из m-функции нет в рабочем пространстве (Workspace). Если запросить информацию об m-функции rmovel: >>help rmovel то получим ответ: removel удаляет из вектора v совпадающие, с заданной точностью, элементы вызов функции: w = rmovel(v, eps) используемые функции MATLAB: length, find функции пользователя: нет входные переменные: v - исходный вектор, eps – точность выходные переменные: w - вектор не содержащий одинаковых элементов автор примера В.Г.Потемкин МИФИ Определим этот же файл как сценарий. Все действия будут те же только текст несколько изменится: % removel удаляет из вектора v совпадающие, % с заданной точностью, элементы % вызов функции: w = rmovel(v, eps) % используемые функции MATLAB: length, find % функции пользователя: нет % входные переменные: % v - исходный вектор, eps – точность % выходные переменные: % w - вектор не содержащий одинаковых элементов % автор примера В.Г.Потемкин МИФИ w = []; while length(v) > 0 w = [w v(1)]; I = find(abs(v-v(1)) < eps); v(I) = []; I = []; end w Сохранить его можно, например, под именем rmovel_scr. При обращении к нему, входных параметров задавать не нужно, но предварительно должен быть определен массив v и задана точность eps (именно под этими именами). Все переменные сценария можно увидеть в рабочем пространстве. Лабораторная работа № 1 Аппроксимация функции одной переменной 1.1. Цель работы Научиться работать с сетью прямой передачи сигнала, функция newff [1]. Разобраться с алгоритмом обратного распространения ошибки. 1.2. Краткие теоретические сведения В лабораторной работе рассматривается нейронная сеть с прямой передачей сигнала (с прямой связью) [2], то есть сеть, в которой сигналы передаются только в направлении от входного слоя к выходному, и элементы одного слоя связаны со всеми элементами следующего слоя. Важнейшим для реализации нейронных сетей является определение алгоритма обучения сети. В настоящее время одним из самых эффективных и обоснованных методов облучения нейронных сетей является алгоритм обратного распространения ошибки, который применим к однонаправленным многослойным сетям. В многослойных нейронных сетях имеется множество скрытых нейронов, входы и выходы которых не являются входами и выходами нейронной сети, а соединяют нейроны внутри сети, то есть скрытые нейроны. Занумеруем выходы нейронной сети индексом j 1,2,, n , а обучающие примеры индексом M 1,2,, M 0 . Тогда в качестве целевой функции можно выбрать функцию ошибки как сумму квадратов расстояний между реальными выходными состояниями y jM нейронной сети, выдаваемых сетью на входных данных примеров, и правильными значениями функции d jM , соответствующими этим примерам. Пусть x xi – столбец входных значений, где i=1,2,..,n. Тогда y { y j } – выходные значения, где j=1,2,…,m. В общем случае n≠m. Рассмотрим разность y jM d jM , где d ji – точное (правильное) значение из примера. Эта разность должна быть минимальна. Введем расстояния согласно евклидовой метрике, определив норму y d ( y d, y d ) 2 . (1) Пусть целевая функция имеет вид 1 E ( y j ,M d j ,M ) 2 . (2) 2 j ,M Коэффициент ½ выбран из соображений более короткой записи последующих формул. Задача обучения нейронной сети состоит в том, чтобы найти такие коэффициенты wk , при которых достигается минимум E (w) (Е 0). На рис. 1 показана архитектура нейронной сети с прямой передачей сигнала. Рис. 1. Схема архитектуры нейронной сети с прямой передачей сигнала Здесь приняты обозначения, используемые в [1], а именно, p1 - вектор входа, IW i , j , LW i , j - матрицы весов входа и выхода, b i - смещение, a i выход слоя, y - выход сети, tansig (гиперболическая тангенциальная), purelin (линейная) - соответствующие функции активации. Веса и смещения определяются с помощью алгоритма обратного распространения ошибок [3]. Обучение сети обратного распространения требует выполнения следующих операций: 1. Выбрать очередную обучающую пару из обучающего множества; подать входной вектор на вход сети. 2. Вычислить выход сети. 3. Вычислить разность между выходом сети и требуемым выходом (целевым вектором обучающей пары). 4. Скорректировать веса сети так, чтобы минимизировать ошибку. 5. Повторять шаги с 1 по 4 для каждого вектора обучающего множества до тех пор, пока ошибка на всем множестве не достигнет приемлемого уровня. 1.3. Пример решения типовой задачи Выполнение лабораторной работы состоит из следующих этапов: прежде всего, необходимо оцифровать график функции y=f(x), то есть получить ряд соответствующих значений по горизонтальной и вертикальной осям. y = f(x) 5 2.61 0.61 0 0 3.5 Рис. 2. Пример зависимости для функции одной переменной В примере, показанном на рис. 2 были получены два массива, каждый из которых состоит из 15 значений. По горизонтальной оси – [0.10 0.31 0.51 0.72 0.93 1.14 1.34 1.55 1.76 1.96 2.17 2.38 2.59 2.79 3.00].По вертикальной оси – [0.1010 0.3365 0.6551 1.1159 1.7632 2.5847 3.4686 4.2115 4.6152 4.6095 4.2887 3.8349 3.4160 3.1388 3.0603]. Ниже приводится программа создания, обучения нейронной сети и вывода результатов. x=[0.10 0.31 0.51 0.72 0.93 1.14 ... 1.34 1.55 1.76 1.96 2.17 2.38 ... 2.59 2.79 3.00]; y=[0.1010 0.3365 0.6551 1.1159 1.7632 2.5847 ... 3.4686 4.2115 4.6152 4.6095 4.2887 3.8349 ... 3.4160 3.1388 3.0603]; net=newff([0 3],[5,1],{'tansig','purelin'},'trainbfg'); net.trainParam.epochs=300; net.trainParam.show=50; net.trainParam.goal=1.37e-2; [net,tr]=train(net,x,y); an=sim(net,x); plot(x,y,'+r',x,an,'-g'); hold on; xx=[0.61 2.61]; v=sim(net,xx) plot(xx,v,'ob','MarkerSize',5,'LineWidth',2) В результате выполнения программы получаются результаты, отражённые на рис. 3 и 4: следующие Рис. 3. Характеристика точности обучения в зависимости от числа эпох обучения Рис. 4. Результаты моделирования сети: + - исходные данные; сплошная линия и символ «о» – результаты моделирования всей зависимости и в контрольных точках В массиве v содержатся приближённые значения для двух контрольных точек, указанных на графике (рис. 2) xx=[0.61 2.61]. При данных параметрах сети получены значения: v = [1.05 3.35]. Сравнив эти приближённые значения с точными значениями [0.85 3.37], можно сделать вывод о корректности построения нейронной сети. 1.4. Отчёт о выполнении работы Отчёт о выполнении лабораторной работы №1 должен быть выполнен на листах формата А4 и содержать следующие результаты: 1. Исходные данные (рис. 2); 2. Текст программы с подробными комментариями; 3. Характеристику точности обучения (рис. 3); 4. Результаты моделирования (рис. 4); 5. Сопоставление результатов в контрольных точках; 6. Краткие выводы о результатах работы. Лабораторная работа № 2 Аппроксимация функции двух переменных 1.1. Цель работы Научиться работать с радиальной базисной сетью, функции newrbe и newrb. 1.2. Краткие теоретические сведения Радиальные базисные сети предназначены для аппроксимации функций. Возьмем произвольную непрерывную функцию и представим ее с помощью суммы колоколообразных функций. Аналитически это означает представление f(x) в виде разложения по стандартному набору пространственно локализованных функций: (1) f ( x) wi x c i , i где wi - веса суммирования отдельных откликов, c i - центры базисных радиальных функций. Это формула нейронной сети на основе радиальной базисной функции. Расстояние x c определяется как расстояние в евклидовом пространстве: x c AB ( x1 c1 ) 2 ( x2 c2 ) 2 . (2) Функция newrbe формирует радиальную базисную сеть с нулевой ошибкой. Сеть с радиальными базисными функциями представляет собой, как правило, сеть с тремя слоями: обычным входным слоем, скрытым радиальным базисным слоем и выходным линейным слоем. Функция newrb формирует радиальную базисную сеть с ненулевой ошибкой в отличие от newrbe. На рис. 5 показана архитектура радиальной базисной сети. Рис. 5. Схема архитектуры радиальной базисной сети 1.3. Пример решения типовой задачи Пусть функция z e x e y задана на промежутках x [1,1] , y [1.5,1.5] ; количество точек разбиений по x есть nx, а по y - ny. Тогда, используя следующий алгоритм построения радиальной базисной сети, можно построить график функции z f ( x, y) : 2 2 x1=-1.0; x2=+1.0; y1=-1.5; y2=+1.5; nx=7; ny=9; step_x=(x2-x1)/(nx-1); step_y=(y2-y1)/(ny-1); step_min = min(step_x,step_y); [x,y]=meshgrid([x1:step_x:x2], [y1:step_y:y2]); z=exp(-x.^2).*exp(-y.^2); surf(x,y,z), title('PS. Press<enter>'); pause; xx=reshape(x,1,nx*ny); yy=reshape(y,1,nx*ny); zz=exp(-xx.^2).*exp(-yy.^2); p=[xx; yy]; t=zz; goal = 0.0371; spread = 1.0*step_min; net = newrb(p,t, goal,spread); net.layers{1}.size smlt=sim(net,p); [zz' smlt'] smltr=reshape(smlt,ny,nx); surf(x,y,smltr), title('AS. Press<enter>'); Рис. 6 иллюстрирует график исходной функции z e x e y . 2 2 Рис. 6. График исходной функции двух переменных На рис. 7 показана характеристика точности обучения радиальной базисной сети и допустимая среднеквадратичная ошибка сети Goal=0.0371. Рис. 7. Характеристика точности обучения в зависимости от количества эпох обучения На рис. 8 отображён результат аппроксимации нелинейной зависимости, построенный с помощью радиальной базисной функции. Рис. 8. Результат моделирования исходной функции Сопоставляя рис. 6 и рис. 8, можно сделать вывод об удовлетворительности полученных результатов. Лучших результатов можно добиться, варьируя параметры goal и spread. 1.4. Отчёт о выполнении работы Отчёт о выполнении лабораторной работы №2 должен быть выполнен на листах формата А4 и содержать следующие результаты: 1. Исходные данные – выбор функции двух переменных и области определения функции, построение графика функции (рис. 6); 2. Текст программы с подробными комментариями; 3. Результаты моделирования (рис. 7, 8); 4. Контрольный пример; 5. Объяснение результатов проделанной работы. Лабораторная работа № 3 Сеть Кохонена, самоорганизующаяся нейронная сеть 1.1. Цель работы Изучить функционирование и процедуру обучения сети Кохонена с помощью функции newc. 1.2. Краткие теоретические сведения Сети Кохонена, или самоорганизующиеся карты (Kohonen maps), предназначены для решения задач автоматической классификации, когда обучающая последовательность образов отсутствует (обучение без учителя). Сеть Кохонена является двухслойной. Она содержит слой входных нейронов и собственно слой Кохонена. Слой Кохонена может быть одномерным, двумерным и трехмерным. В первом случае нейроны расположены в цепочку; во втором – они образуют двумерную сетку (обычно в форме квадрата или прямоугольника), а в третьем – трехмерную систему. Определение весов нейронов слоя Кохонена основано на использовании алгоритмов автоматической классификации (кластеризации или самообучения). На вход сети подаются последовательно значения векторов x l ( x1 , x2 ,..., xn ) l , представляющих отдельные последовательные наборы данных для поиска кластеров, то есть различных классов образов, причем число этих кластеров заранее неизвестно. На стадии обучения (точнее самообучения) сети входной вектор x попарно сравнивается со всеми векторами w j всех нейронов сети Кохонена. Вводится некоторая функция близости d (например, в виде евклидова расстояния). Активный нейрон с номером c слоя Кохонена, для которого значение функции близости d (x, w c ) между входным вектором x , характеризующим некоторый образ, к векторам w c максимально, объявляется «победителем». При этом образ, характеризующийся вектором x , будет отнесен к классу, который представляется нейроном-«победителем». Рассмотрим алгоритм самообучения сетей Кохонена. Обозначим функцию близости z x w . Выигрывает нейрон c x w c min x w j . (1) Близость x и w можно переделить, пользуясь скалярным произведением, как n z j 1 (x, w j ) 1 xiwij . (2) i 1 На стадии самообучения сети Кохонена осуществляется коррекция весового вектора не только нейрона-«победителя», но и весовых векторов остальных активных нейронов слоя Кохонена, однако, естественно, в значительно меньшей степени – в зависимости от удаления от нейрона«победителя». При этом форма и величина окрестности вокруг нейрона«победителя», весовые коэффициенты нейронов которой также корректируются, в процессе обучения изменяются. Сначала начинают с очень большой области – она, в частности, может включать все нейроны слоя Кохонена. Изменение весовых векторов осуществляется по правилу (3) w j (t 1) w j (t ) (t )d cj (t )[x(t ) w j (t )] , j=1,2,…, n, где w j (t ) - значение весового вектора на шаге t самообучения сети, d cj (t ) функция близости между нейронами слоя Кохонена и (t ) - изменяемый во времени коэффициент шага коррекции. В качестве (t ) обычно выбирается монотонно убывающая функция (0< (t ) <1), то есть алгоритм самообучения начинается сравнительно большими шагами адаптации и заканчивается относительно малыми изменениями. В результате n-мерное входное пространство R n отобразится на mмерную сетку (слой Кохонена). Это отображение реализуется в результате рекуррентной (итеративной) процедуры самообучения (unsupervised learning). Отличительная особенность этого отображения – формирование кластеров (clusters) или классов. По завершении процесса самообучения на стадии реального использования сети Кохонена неизвестные входные образы относятся к одному из выявленных кластеров (классов) по близости к некоторому весу, принадлежащему определенному кластеру, выявленному на стадии самообучения. На рис. 9 показана архитектура слоя Кохонена. Рис. 9. Схема архитектуры слоя Кохонена 1.3. Пример решения типовой задачи Пусть заданы 28 случайных векторов, изображённых на графике крестами (рис. 10). Оцифровав данный график, можно получить массив входных данных P(1,:),P(2,:) (табл. 1). Y 3 1 -1 -1 1 3 5 X 7 Рис. 10. Распределение входных векторов Таблица 1 P(1,:) P(2,:) P(1,:) P(2,:) P(1,:) P(2,:) 3.0 -0.1 1.0 3.7 4.5 8.5 2.3 2.9 8.5 2.7 0.0 0.9 Массив входных данных 4.3 4.6 8.5 1.8 8.3 2.5 4.4 2.3 2.7 3.3 -0.1 1.2 2.2 8.2 2.7 0.2 4.4 4.6 3.2 0.1 0.8 4.0 4.5 2.2 0.1 4.3 4.7 8.5 2.1 8.3 4.0 4.4 1.9 2.5 3.5 -0.3 Следующий алгоритм демонстрирует самоорганизующейся нейронной сети Кохонена. plot(P(1,:), P(2,:), '+m'); title('Input vectors'); xlabel('P(1,:)'); ylabel('P(2,:)'); hold on; nclusters = 7; nvectors = 4; a1 = -10; a2 = +10; 0.2 3.6 8.3 2.4 4.6 4.7 2.0 3.3 процедуру обучения b1 = -5; b2 = +5; net = newc([a1 a2; b1 b2], nclusters, 0.1, 0.0005); wo = net.IW{1}; bo = net.b{1}; co = exp(1)./bo; net.trainParam.epochs=49; net.trainParam.show=7; net = train(net,P); w = net.IW{1}; bn = net.b{1}; cn = exp(1)./bn; plot(w(:,1),w(:,2),'kp'); На рис. 11 представлены исходные данные (кресты) и полученные центры кластеризации (звёзды). Рис. 11. Распределение входных данных (кресты) и положение центров кластеризации (звёзды) 1.4. Отчёт о выполнении работы Отчёт о выполнении лабораторной работы №3 должен быть выполнен на листах формата А4 и содержать следующие результаты: 1. Исходные данные (рис. 10); 2. 3. 4. 5. 6. Текст программы с подробными комментариями; Результаты моделирования (рис. 11); Краткое описание расположения центров кластеров; Список исходных точек с указанием принадлежности определенному кластеру; Контрольный пример. к Лабораторная работа № 4 Сеть Хопфилда 1.1. Цель работы Научиться работать с сетью устойчивость сети и её сходимость. 1.2. Хопфилда newhop, исследовать Краткие теоретические сведения Американский исследователь Хопфилд в 80-х годах 20-го века предложил специальный тип нейросетей. Названные в его честь сети Хопфилда являются рекуррентными или сетями с обратными связями и предназначены для распознавания образов. Обобщенная структура этой сети представляется, как правило, в виде системы с обратной связью выхода с входом. В сети Хопфилда входные сигналы нейронов являются одновременно и выходными сигналами сети: xi(k)=yi(k-1), при этом возбуждающий вектор особо не выделяется. В классической системе Хопфилда отсутствует связь нейрона с собственным выходом, что соответствует wii 0 , а вся матрица весов является симметричной: wij=wji Wˆ Wˆ T . (1) Симметричность матрицы весов гарантирует сходимость процесса обучения. Процесс обучения сети формирует зоны притяжения некоторых точек равновесия, соответствующих обучающим данным. При использовании ассоциативной памяти мы имеем дело с обучающим вектором x ( x1 , x2 , xn ) , либо с множеством этих векторов, которые в результате проводимого обучения определяют расположение конкретных точек притяжения (аттракторов). Каждый нейрон имеет функцию активации сигнум со значениями 1 : 1, a 0 . (2) sign(a) 1, a 0 Это означает, что выходной сигнал i-го нейрона определяется функцией: N yi sign( wij x j bi ) , (3) j 1 где N обозначает количество нейронов, N=n. Часто постоянная составляющая bi , определяющая порог срабатывания отдельных нейронов, равна 0. Тогда циклическое прохождение сигнала в сети Хопфилда можно представить соотношением: N y i (k ) sign( wij y j (k 1)) j 1 (4) с начальным условием y j (0) xi . В процессе функционирования сети Хопфилда можно выделить два режима: обучения и классификации. В режиме обучения на основе известных обучающих выборок x i подбираются весовые коэффициенты wij. В режиме классификации при зафиксированных значениях весов и вводе конкретного начального состояния нейронов y(0) x возникает переходный процесс, протекающий в соответствии с выражением (2) и заканчивающийся в одном из локальных устойчивых положений, задаваемом биполярным вектором со значениями y j 1, для которого y(k ) y(k 1) . Обучение не носит рекуррентного характера. Достаточно ввести значения (правило Хебба) весов, выразив их через проекции вектора точки притяжения эталонного образа: 1 (5) wij xi x j , N В соответствии с этим правилом сеть дает правильный результат при входном примере, совпадающим с эталонным образцом, поскольку: N N 1 N 1 (6) wij x j N xi ( x j x j ) xi 1 N xi , j 1 j 1 j 1 так как вследствие биполярности значений элементов вектора x всегда x 2j 1 . При вводе большого количества обучающих выборок x (k ) для k=1,2,…p веса wij подбираются согласно обобщенному правилу Хебба в соответствии с которым: 1 l (k ) (k ) (7) wij xi x j . N k 1 Благодаря такому режиму обучения веса принимают значения, определяемые усреднением множества обучаемых выборок. В случае множества обучаемых выборок актуальным становится вопрос о стабильности ассоциативной памяти. Сеть Хопфилда [2] является автоассоциативной сетью (рис. 12). Дискретная сеть Хопфилда имеет следующие характеристики: она содержит один слой элементов; каждый элемент связывается со всеми другими элементами, но не связан с самим собой; за один шаг работы обновляется только один элемент сети; элементы обновляются в случайном порядке; выход элемента ограничен значениями 0 или 1. Рис. 12. Схема архитектуры модифицированной сети Хопфилда 1.3. Пример решения типовой задачи Рассмотрим сеть Хопфилда [1] с четырьмя нейронами и определим четыре точки равновесия: T = [+1 -1; -1 +1; +1 +1; -1 -1]; T=T'; plot(T(1,:),T(2,:),'rh','MarkerSize',13), hold on; axis([-1.1 1.1 -1.1 1.1]); title('Hopfield Network State Space'); xlabel('a(1)'); ylabel('a(2)'); net = newhop(T); [Y,Pf,Af] = sim(net,4,[],T); Y Pf Af pause color = 'rgbmy'; for i=1:25 a = {rands(2,1)}; [y,Pf,Af] = sim(net,{1 20},{},a); record=[cell2mat(a) cell2mat(y)]; start=cell2mat(a); plot(start(1,1),start(2,1),'kx',record(1,:), record(2,:), color(rem(i,5)+1),'LineWidth',5) end На рис. 13 показано поведение обученной сети при случайных начальных условиях a. Рис. 13. Поведение сети Хопфилда при случайных начальных условиях a 1.4. Отчёт о выполнении работы Отчёт о выполнении лабораторной работы №4 должен быть выполнен на листах формата А4 и содержать следующие результаты: 1. Исходные данные; 2. Текст программы с подробными комментариями; 3. Результаты моделирования (рис. 13); 4. Контрольный пример; 5. Краткие письменные ответы на контрольные вопросы, содержащиеся в приложении. Библиографический список рекомендуемой литературы 1. Медведев В.С., Потемкин В.Г. Нейронные сети. Матлаб 6. М.: Диалог МИФИ, 2002. – 496с. 2. Каллан Р. Основные концепции нейронных сетей. М.: Издательский дом «Вильямс», 2001. – 287с. 3. Уоссермен Ф. Нейрокомпьютерная техника: Теория и практика. – М.: Мир, 1992. 4. Круглов В.В., Борисов В.В. Искусственные нейронные сети. М.: Горячая линия - Телеком, 2001. – 382с. 5. Осовский С. Нейронные сети для обработки информации. М.: Финансы и статистика, 2002. – 344с. 6. Тарков М.С. Нейрокомпьютерные системы. М.: БИНОМ, 2006. –142с. 7. Нейронные сети. STATISTICA Neural Networks. М.: Горячая линия Телеком, 2001. – 182с. 8. Зайцевский И.В., Свиридов А.П., Слесарев Д.А. Нейронные сети и их приложения. М.: МЭИ, 2002. – 95с. 9. Дьяконов В.П., Круглов В.В. MATLAB 6.5 SP1/7/7 SP1/7 SP2 Simulink 5/6. Инструменты искусственного интеллекта и биоинформатики. М.: СОЛОН-ПРЕСС, 2006. – 456с. ПРИЛОЖЕНИЕ Контрольные задания для лабораторной работы № 1 Вариант 01 5 Вариант 02 8 2.61 1.51 0.61 0 0 0 3.5 Вариант 03 3.62 11 3.51 0 6 0.4 Вариант 04 0.70 3.30 1.28 -8 -0.1 0.5 2 5.5 Вариант 05 -0.5 4.5 Вариант 06 6 2.75 1.71 0.75 -0.71 -0.25 -1 -0.1 4 3.5 Вариант 07 -0.71 2.5 Вариант 08 5 1.71 2.70 -1 -1.5 -1.5 8.70 -2 3 -1 12 Вариант 09 5 4 Вариант 10 -0.50 2.61 6.20 -2 0.61 -2 -1 7 -0.2 Контрольные задания для лабораторной работы № 2 3) z cos(x)cos(y), x, y [ , ] 2 2 sin( x) sin( y) z , x, y [1,1] x y z x 2 y 2 , x, y [1.5,1.5] 4) z x 3 sin( y) 1, x [1,1], y [1.5,1.5] 5) 6) z x 2 sin( y) 1, x [1,1], y [1.5,1.5] z e x 3 y, x [0,1], y [2,1] 7) z y 2 x 3 , x [1,1], y [2,2] 8) z y 3 x 2 , x [1,1], y [2,2] 1 z 2 , x, y [1,1] y x3 1 z 3 , x, y [1,1] y x2 z x 2 cos(y) 1, x [1,1], y [ , ] 4 4 3 z x cos(y) 1, x [0.5,0.5], y [ , ] 4 4 z y 2 x 4 , x, y [1,1] 1) 2) 9) 10) 11) 12) 13) 15) y 1, x [1,1], y [ , ] z sin 2 ( 1 x ) 2 2 z sin( x ) y , x [1.77,1.77], y [0.3,0.3] 16) 17) z cos(x 2 ) xy, x [0.886,0.886], y [0.3,0.3] z ( x 1) 2 exp( y 2 ), x [0.5, 2], y [1,1] 14) 3.3 18) 19) 20) cos(x) , x [5, 5], y [ , ] 2 2 2 x 1 z sin( x) sin( y), x, y [ ,0] z ln( x) ln( y), x, y [0.5,2] z Контрольные задания для лабораторной работы № 3 Вариант 01 Y 3 Вариант 02 Y 3 -1 -1 4 8 X Вариант 03 Y 1 5 Вариант 04 Y 4 9 X 2.5 1 -0.5 1 5 9 X Вариант 05 Y 4 -0.5 X Вариант 06 Y 3 2.5 8 -1 0 4 8 X -1 3 7 X Вариант 07 Y 3 2.5 0 -0.5 1 Y Вариант 08 Y 4 7 X Вариант 09 4 Y 4 4 8 X Вариант 10 1.5 -1 1 -1 3 7 X 3.5 5.5 7.5 X Контрольные вопросы для лабораторной работы № 4 1. Искусственный интеллект. Его истоки и проблемы. 2. Нейрофизиологические данные об обработке информации в биологических системах. 3. Искусственный нейрон. Идея и техническая реализация. 4. Модели нейронов. Типичные виды функций активации нейрона. 5. Многослойный персептрон. 6. Однонаправленные многослойные сети. Алгоритм обратного распространения ошибки. 7. Вывод конкретных формул алгоритма обратного распространения ошибки для двухслойных сетей с малым числом нейронов (2-3). 8. Градиентные методы. Алгоритм наискорейшего спуска. Недостатки метода. Метод моментов. 9. Радиальные нейронные сети. Обучение. Область применения. 10. Рекуррентные сети. Ассоциативная сеть Хопфилда. Обучение. Распознавание образов. 11. Сеть встречного распространения. 12. Обучение слоя Кохонена. Решение задач кластеризации. 13. Статистический подход к обучению нейронной сети. Машина Больцмана и ее модификации. 14. Применение нейронных сетей. Сбор данных для нейронных сетей. 15. Задача регрессии и прогнозирования временных рядов. 16. Основные характеристики пакета MATLAB. Простейшие вычисления. Работа с массивами. Графики функций. Сессия. М-файлы. Mat-файлы. 17. Нейронные сети в пакете MATLAB.