Главная              Рефераты - Информатика

Книга: Система математических расчетов MATLAB

ГОСУДАРСТВЕННЫЙ ИНЖЕНЕРНЫЙ УНИВЕРСИТЕТ АРМЕНИИ

MATLAB

УЧЕБНОЕ ПОСОБИЕ

Гаспарян Олег Николаевич

Д.т.н, с.н.с

2005


СОДЕРЖАНИЕ

Система математических расчетов MATLAB 4

Рабочий стол (desktop) системы MATLAB 5

Общие свойства и возможности рабочего стола MATLAB 5

Получение справок (Getting Help) 7

Рабочее пространство системы MATLAB 13

Просмотр и редактирование массивов данных при помощи 13

редактора Array Editor 16

Пути доступа системы MATLAB 18

Операции с файлами 20

Дуальность (двойственность) команд и функций 23

Действия над матрицами в системе MATLAB 24

Двоеточие (Colon) 28

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

Степени матриц и матричные экспоненты 35

Собственные значения и собственные векторы 37

Полиномы и интерполяция 41

Анализ данных и статистика 50

Многомерные Массивы 65

Создание Многомерных Массивов 66

Организация и хранение данных 74

Массивы структур 75

Массивы ячеек 86

Програмирование на MATLAB-е 97

Типы данных 108

Команды управления данными ( Flow Control) 114

Приложение 1. Тематические направления системы MATLAB 121

Приложение 2 . Команды общего назначения

(General purpose commands) 123

Приложение 3. Операторы и специальные символы 126

Приложение 4. Элементарные математические функции

(Elementary math functions). 127

Приложение 5. Элементарные матрицы и операции над ними

(Elementary matrices and matrix manipulation)

Приложение 6. - Матричные функции и линейная алгебра

(Matrix functions - numerical linear algebra) 129

Приложение 7. Полиномы и интерполяция

(Interpolation and polynomials) 132

Приложение 8. Анализ данных и преобразование Фурье

(Data analysis and Fourier transforms) 133

Приложение 9. Функции обработки символьных строк

(Character strings) 135

Справочник по базовым функциям

системы MATLAB 137

Система математических расчетов MATLAB

Система MATLAB (сокращение от MATrix LABoratory - МАТричная Лаборатория) разработана фирмой The MathWorks, Inc. (США, г.Нейтик, шт. Массачусетс) и является интерактивной системой для выполнения инженерных и научных расчетов, которая ориентирована на работу с массивами данных. Система использует математический сопроцессор и допускает обращения к программам, написанным на языках Fortran, C и C++ .

Наиболее известные области применения системы MATLAB:

· математика и вычисления;

· разработка алгоритмов;

· вычислительный эксперимент, имитационное моделирование;

· анализ данных, исследование и визуализация результатов;

· научная и инженерная графика;

· разработка приложений, включая графический интерфейс

пользователя.

MATLAB – это интерактивная система, основным объектом которой является массив, для которого не требуется указывать размерность явно. Это позволяет решать многие вычислительные задачи, связанные с векторно-матричными формулировками, существенно сокращая время, необходимое для программирования на скалярных языках типа Fortran или C. Будучи ориентированной на работу с реальными данными, эта система выполняет все вычисления в арифметике с плавающей точкой, в отличие от систем компьютерной алгебры REDUCE, MACSYMA, DERIVE, Maple, Mathematica, Theorist, где преобладает целочисленное представление и символьная обработка данных.

Система MATLAB – это одновременно и операционная среда и язык программирования. Одна из наиболее сильных сторон системы состоит в том, что на языке MATLAB могут быть написаны программы для многократного использования. Пользователь может сам написать специализированные функции и программы, которые оформляются в виде М-файлов. По мере увеличения количества созданных программ возникают проблемы их классификации и тогда можно попытаться собрать родственные функции в специальные папки. Это приводит к концепции пакетов прикладных программ (Application Toolboxes или просто Toolboxes), которые представляют собой коллекции М-файлов для решения определенной задачи или проблемы.

В действительности Toolboxes – это нечто большое, чем просто набор полезных функ-ций; часто это результат работы многих исследователей по всему миру, которые объеди- няются в группы по самым различным интересам, начиная от нейтронных сетей, дифференциальных уравнений в частных производных, сплайн-аппроксимации, статистики и размытых множеств до проектирования робастных систем управления, теории сигналов, идентификации, а также моделирования линейных и нелинейных динамических систем с помощью исключительно эффективного пакета SIMULINK. Именно поэтому пакеты прикладных программ MATLAB Application Toolboxes, входящие в состав семейства продуктов MATLAB, позволяют находиться на уровне самых современных мировых достижений в разных областях науки и техники.

Вызов и выход из MATLAB

Вызов MATLAB-а . Для вызова системы MATLAB требуется двойное нажатие на иконку в рабочем столе Windows. При инсталляции MATLAB-а стартовой директорией по умол-чанию является $matlabroot\work, где $matlabroot есть директория, где установлены файл-ы системы MATLAB.

При вызове, система MATLAB автоматически выполняет главный М-файл (master M-file) matlabrc.m., и файл startup.m (есди последний существует). Файл matlabrc.m , которые расположен в директории local , зарезервирован фирмой The MathWorks, а в многопользова-тельских системах может быть использован также системным менеджером. Файл startup.m предназначен для задания ряда стартовых опций (возможностей) по усмотрению пользователя. Вы можете изменить исходные пути доступа (см. далее), ввести заранее определенные переменные в рабочее пространство, изменить текущую директорию и т.д. Стартовый файл startup.m следует ввести в директорию $matlabroot\toolbox\local (более подробно с данным вопросом можно ознакомиться в справочных пособиях по MATLAB-у).

Выход из MATLAB-а. Для окончания сеанса работы с MATLAB следует выбрать опцию Exit MATLAB (Выход из MATLAB) в меню File на рабочем столе MATLAB-а, или напеча-тать quit (Выход) в командном окне Command Window.

При выходе, MATLAB выполняет специальный файл finish.m , относящийся к типу сценари-ев (см. далее) , если только данный файл существует в текущей директории или где-либо на пути доступа системы MATLAB. Файл finish.m создается пользователем. Он должен содер-жать функции или операции, которые пользователь желает автоматически выполнить при выходе из системы MATLAB, например, такие как сохранение рабочего пространства или вызов диалогового окна, запрашивающего подтверждения выхода. В указанной выше дирек-тории $matlabroot\toolbox\local имеются два файла, которые пользователь может использо-вать в качества образца при создании своего файла finish.m :

•finishsav.m – Включает функцию save , что приводит к автоматическому запоминанию рабо-чего пространства при выходе из MATLAB-а.

•finishdlg.m – Выводит на экран подтверждающее диалоговое окно, которое позволяет анну-лировать выход.

Рабочий стол (desktop) системы MATLAB

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

• Command Window (Командное Окно) – Выполняет все функции и команды системы

MATLAB.

• Command History (История Команд) – Просмотр функций, введенных ранее в

Command Window , их копирование и выполнение.

• Launch Pad (Окно Запуска) – Запускает все инструменты и обеспечивает доступ ко

всем пакетам системы MATLAB .

• Current Directory Browser (Окно Просмотра Текущего Каталога) – Просмотр файлов

MATLAB, а также сопутствующих файлов, а также выполнение таких операций

над файлами, как поиск и открытие файлов.

• Help Browser (Окно Просмотра Помощи) – Поиск и просмотр документации по всем

функциям и средствам системы MATLAB.

• Workspace Browser (Окно Просмотра Рабочего Пространства) – Просмотр и изменение

содержания рабочего пространства (workspace) системы MATLAB.

• Array Editor (Редактор Массивов Данных) – Просмотр содержимого массивов данных,

записанных в виде таблицы и редактирование данных.

• Editor/Debugger (Редактор/Отладчик) – Для создания, редактирования и отладки

М-файлов, т.е. файлов, содержащих функции системы MATLAB.

Общий вид рабочего окна MATLAB представлен ниже (рис.1). Каждое из перечисленных окон может быть выведено из конфигурации рабочего стола нажатием кнопки со стрелкой в верхнем правом углу окна (см. рис. 1). Обратная операция, то есть ввод в общую конфигурацию, осуществляется выбором опции Dock в меню View сответствующего окна. Можно также изменить конфигурацию рабочего стола путем перемещения любого откры-того окна в новое положение. Для этого нужно просто нажать левой клавишей мыши на выбранное название окна (Title Bar) и «перетащить» его в желаемое положение.

Для восстановления стандартной конфигурации рабочего стола MATLAB необходимо выбрать опцию Default (По Умолчанию) в подменю Desktop Layout (План Рабочего Стола) в меню View (Вид) любого открытого окна системы. Все окна MATLAB содержат также контекстное меню (context menu), которое вызывается нажатием правой кнопки мыши и содержит наиболее часто применяемые опции (функции), связанные с данным окном.

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

Просмотр продуктов Просмотр или Кнопка для

и демонстрационных Вызов изменение текущей вывода окна из состава

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

Просмотр и вызов Переход к рабочему Нажатием левой клавиши мыши и перемещением

введенных ранее команд пространству (Workspace) можно изменять границы окон

и к окну текущего каталога

Рис. 1. Общий вид рабочего стола системы MATLAB

Общие свойства и возможности рабочего стола MATLAB

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

Создать новый

М-файл Копировать Создать новую модельSimulink

Просмотр или изменение

Открыть файл Undo текущего каталогаю

Выбор использованных ранее

Вырезать Вставить Redo Вызов Помощи (Help ) каталогов

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

описывающее кнопку текущего каталога

Undo – отмена последнего действия; Redo – повторение последнего действия.

Рис. 2. Инструментальная линейка (Toolbar) рабочего стола

Command Window (Командное окно)

1. Выполнение функций и ввод переменных

Приглашение к вводу команды (>>) в Command Window означает, что MATLAB готов к приему. При появлении приглашения >> вы можете ввести переменную или выполнить ко-манду. Например, для создания 3х3 матрицы А следует напечатать

A = [1 2 3; 4 5 6; 7 8 10]

При нажатии клавиш Enter (или Return ) после набора строки, MATLAB реагирует выводом следующей записи

A =

1 2 3

4 5 6

7 8 10.

При этом переменная (матрица) запоминается в рабочем пространстве (workspace) MATLAB.

Внимание! Система MATLAB чувствительна к выбору регистра, т.е. MATLAB разли-чает переменные а и А ! При написании команды (функции) также не следует использо- вать заглавные буквы !

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

magic(2)

получим

ans =

1 3

4 2.

Если вы хотите ввести несколько командных строк без их немедленного выполнения, вос-пользуйтесь комбинациями Shift+Enter после ввода каждой строки. Последующее нажатие Enter приведет к выполнению всех введенных строк.

Приглашение K>> в командном окне означает, что MATLAB находится в режиме отладки (debug mode). Данный режим будет подробно рассмотрен в дальнейшем.

2. Вычисление выделенных функций и выражений (Evaluating a Selection )

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

3. Открытие выделения ( Opening a Selection)

Для открытия М-файла некоторой функции следует выделить эту функцию в командном окне и выбрать в контекстном меню опцию Open Selection . Это приведет к открытию данно- го файла в окне Редактора/Отладчика (Editor/Debugger ).

Внимание! Вы можете одновременно выполнять на MATLAB-е только одну функцию. Если MATLAB выполняет некоторую команду, то все последующие введенные команды запоминаются и выполняются только при окончании предыдущей !

4. Ввод нескольких функций в одну строку

Для ввода нескольких функций в одну командную строку, их нужно разделить точкой с запятой ( ; ). Например, запись трех следующих функций в одной командной строке

format short; x = (1:10)'; logs = [x log10(x)]

и нажатие Enter приведет к выполнению этих функций слева направо и к распечатке таблицы десятичных логарифмов в пределах от 1 до 10.

5. Ввод длинных функций

Если запись не помещается на одной строке, следует использовать три точки, (... ) для обозначения того, что запись будет продолжена на следующей строке; нажать Enter для перехода к следующей строке, и затем продолжить ввод записи. Например,

s = 1 – 1/2 + 1/3 – 1/4 + 1/5 – 1/6 + 1/7 ...

– 1/8 + 1/9 – 1/10 + 1/11 – 1/12;

Для записей с одинарными кавычками, такими как строки символов, кавычки следует ста-вить на каждой строке. Например, вводя следующую длинную строку

headers = ['Author Last Name, Author First Name, ’ ...

'Author Middle Initial’]

получим

headers =

Author Last Name, Author First Name, Author Middle Initial

Максимальное количество символов в одной строке равно 4096.

6. Окраска и выделение синтаксиса

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

  • При записи строки с начальной кавычкой, она окрашена в лиловый цвет. Когда вы закрываете кавычку, строка становится коричнево-красной.
  • При написании ключевых слов, таких как зарезервированных для программирования (например, for, else, while и т.д.), а также троеточия (... ), они окрашиваются в синий цвет. Слова, записанные между зарезервированными приобретают структурирован-ный вид, т.е. имеют отступы, облегчающие чтение текста.
  • Двойное нажатие на начальную или конечную скобку (например, обычную, квадрат-ную [ ], или фигурную { }) приводит к селекции (окрашиванию) всех символов между данной скобкой и ее парой. При введении конечной скобки происходит кратковремен-ное высвечивание соответствующей начальной.
  • При напечатании символа процента (%), который в системе MATLAB является приз-наком начала строки комментария (эти строки не выполняются), соответствующая строка окрашивается в зеленый цвет.
  • При вводе команды обращения к операционной системе, которые начинаются с воск- лицательного знака (! ), строка окрашивается в золотой цвет.
  • Сообщения об ошибках имеют красный цвет.

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

7. Редактирование командной строки

Ниже приводятся некоторые свойства системы MATLAB, дающие экономию времени при вводе:

Свойства буффера обмена. При работе в командном окне целесообразно использовать опции Cut (Вырезать), Copy (Копировать), Paste (Вставить), Undo (Отмена последнего действия), Redo (П овторение последнего действия) из меню Edit (Редактирование), или соответствующие кнопки инструментальной панели (см. рис. 2). Некоторые из этих опций доступны также из контекстного меню командного окна.

Свойства клавиши Tab (Табуляция). MATLAB автоматически завершает имя функции, переменной, названия файла или свойства дескриптора графического объекта (handle graphics property), если вы наберете соответствующие первые несколько букв и нажмете кла-вишу Tab . Если это однозначно определяемое имя, то оно будет автоматически завершено. Если же данные буквы входят в название нескольких функций, то повторное нажатие клавиши Tab вызовет список всех возможных функций. Например, напечатайте cos и наж- мите Tab . Система MATLAB не отреагирует, что означает наличие многих имен начинаю-щихся с cos . При повторном нажатии Tab MATLAB отобразит список всех имеющихся в на- личии подходящих функций:

cos cosh costfun

cos_tr cosint costs_march.

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

rho = (1+ sqt(5))/2

При нажатии Enter MATLAB ответит:

Undefined function or variable 'sqt'.

(Неизвестная функция или переменная sqt ),

поскольку вы неправильно ввели функцию sqrt (квадратный корень). Вместо того чтобы перепечатывать всю строку, можно нажать клавишу . Предыдущая строка будет повторно отображена. Используя клавишу можно привести курсор в требуемое положение и доба-вить недостающую букву r . Повторные нажатия клавиши вызовут раннее введенные стро-ки. Все вводимые вами функции запоминаются в буфере обмена. При этом можно воспользо- ваться свойством «интеллектуального повторного вызова» (smart recall ) для повторного вы-зова ранее введенных функций, которое заключается в том, что достаточно набрать только первые несколько символов из названия требуемой функции. Например, напечатав буквы plo и нажав клавишу мы вызовем последнюю функцию, которая начинается с plo . Данное свойство чувствительно к выбору регистра.

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

Клавиши

Клавиши управления

Результат операции

Ctrl+p

Вызов предыдущей строки

Ctrl+n

Вызов следующей строки.

Ctrl+b

Переход на один символ назад .

Ctrl+f

Переход на один символ вперед.

Ctrl+

Ctrl+r

Переход на одно слово направо .

Ctrl+

Ctrl+l

Переход на одно слово влево .

Home

Ctrl+a

Переход к началу строки.

End

Ctrl+e

Переход к концу строки.

Esc

Ctrl+u

Очистить строку.

Delete

Ctrl+d

Удалить символ после курсора.

Backspace

Ctrl+h

Удалить символ перед курсором.

Ctrl+k

Удалить от курсора до конца строки.

Shift+home

Выделить до начала строки.

Shift+end

Выделить до конца строки.

8. Очистка командного окна

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

Эквивалентная функция ! Для очистки командного окна можно воспользоваться функцией clc . Подобно clc , функция home переносит приглашение к вводу системы MATLAB (>>) к верхнему левому углу командного окна, но при этом содержимое всего окна не очищается и может быть прочитано стандарными приемами просмотра.

9. Подавление вывода результатов на экран

Если вы заканчиваете строку точкой с запятой ( ; ), то при нажатии Enter MATLAB выпол-няет задачу (программу), но не выводит результаты на экран монитора. Это может быть осо-бенно полезным при генерации больших матриц. Например, при вводе

A = magic(100);

и нажатии Enter MATLAB создает в рабочем пространстве матрицу A размера 100х100, но не выводит ее на экран.

10. Разбиение экранного вывода на страницы

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

Клавиша

Действие

Enter

Переход к следующей строке

Пробел

Переход к следующей странице

q

Остановка вывода на экран

Постраничный вывод можно блокировать вводом функции more off .

11. Выбор формата и интервала между строками для числовых данных

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

Эквивалентная функция ! Для выбора формата выводимых на экран числовых данных можно воспользоваться функцией format. Данная функция имеет силу только в процессе текущего сеанса работы, то есть при выходе из MATLAB-а ее действие аннулируется и вос-станавливается стандартное представление данных.

Примеры форматов данных. Ниже даны несколько примеров различных форматов двумер-ного вектора

x = [4/3 1.2345e–6]

формат short e

1.3333e+000 1.2345e–006

формат short

1.3333 0.0000

формат +

++

Полное описание допустимых форматов дается в справках (Help) по данной функции. Допол-нительные возможности контроля вывода дают функции sprintf и fprintf .

Выбор интервала между строками. Воспользовавшись опцией Preferences в меню File мо-жно также контролировать промежуток между строками. Команда format compact подавля-ет пустые строки, что дает возможность обозрения большего количества информации в ко- мандном окне. Для возврата к пустым строкам, которые облегчают чтение и восприятие ин-формации на экране, нужно воспользоваться командой format loose.

12. Распечатка содержания командного окна

Для распечатки содержания всего командного окна следует выбрать Print из меню File. Для распечатки только части текста нужно сперва выделить эту часть, и затем выбрать Print Selection в том же меню File .

13. Выполнение программ

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

Прерывание выполнения программы. Вы можете прервать выполнение программы путем нажатия Ctrl+c или Ctrl+Break в любое время.

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

Открытие М-файла в окне Редактора/Отладчика. Для открытия М-файла следует выде-лить имя файла или функции в командном окне и затем, вызвав контекстное меню нажатием правой кнопки мыши, выбрать опцию Open Selection . Соответствующий М-файл будет открыт в окне Редактора/Отладчика (Editor/Debugger) .

Анализ ошибок. Если при выполнении М-файла появляется сообщение об ошибке, то нужно подвести курсор к данному сообщению и нажать клавишу Enter . Произойдет открытие «нехорошего» M-файла в окне Редактора (Editor ), причем файл будет «прокручен» до стро-ки, содержащей ошибку.

Сохранение сеанса работы. Для сохранения в памяти сеанса работы в системе MATLAB предусмотрена специальная функция diary (Дневник). Эта команда создает копию вашего сеанса работы в специальном файле на диске, включая все команды ввода и отклики системы MATLAB, но исключая графики. Вы можете затем просматривать и редактировать получен-ный текстовой файл используя любой текстовой редактор. Например, для создания на вашем диске файла, названного допустим sept23 («23 сентября»), который содержал бы все введен-ные вами в этот день функции и отклики системы MATLAB, следует ввестив командное окно функцию diary('sept23.out') . Для прекращения записи сеанса вводится : diary('off')

Примечание. В окне Command History (История Команд) содержится запись всех функций, выполненных в текущем и предыдущий сеансах.

Получение справок (Getting Help)

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

1 . HELP. Оперативная справка, отображающая текст в командном окне.

Команда help , сама по себе, выводит на экран (в командную строку) все тематические направления системы MATLAB. Каждое тематическое направление соответствует имени определенного каталога (директории) в MATLAB-е (см. Приложение 1 ).

Команда help (‘topic’) или help topic , где topic есть определенная директория (например, matlab\polyfun), выводит список всех функций в данном каталоге.

Команда help fun , где fun – имя функции, выводит на экран справку по данной функции, как она записана в соответствующем М-файле.

2 . HELPWIN. Обеспечивает те же функции, что и help , но справка выводится в Окно Просмотра Помощи (Help Browser) (см. рис. 1).

3. LOOKFOR. Осуществляет поиск в первой строке комментариев по всем М-файлам по заданному ключевому слову. Так, например, lookfor XYZ осуществляет поиск слова XYZ в первой строке текста справки (HELP text) во всех М-файлах на так называемом пути доступа MATLAB (MATLABPATH). Для всех файлов где встречается это слово, команда lookfor выводит на экран названия файлов и первые строки комментариев.

Рабочее пространство системы MATLAB

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

t = 0 : pi/4 : 2* pi; y = sin( t); z = 5;

то рабочее пространство будет содержать две переменные y и t , каждая из которых имеет девять значений, и одну скалярную переменную z .

.

Окно Просмотра Рабочего Пространства (Workspace Browser )

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

  • Из меню View рабочего стола MATLAB выбрать Workspace .

В Окне Запуска (Launch Pad) нажать дважды на Workspace .

Ввести команду workspace из командной строки MATLAB-а.

При этом получаем следующее окно (для некоторого конкретного набора переменных):

Рис. 3. Общий вид Окна Просмотра Рабочего Пространства

Просмотр текущего рабочего пространства. ОПРП показывает имя каждой переменной, размерность ее массива, размер в байтах и ее класс. Иконка в поле Name перед именем каж-дой переменной указывает на ее класс (классы переменных будут рассмотрены позднее).

Эквивалентные функции ! Команда who выводит в командное окно список всех перемен-ных текущего рабочего пространства. Команда whos добавляет к списку переменных также информацию об их размерах и классе. Например, при вводе who система MATLAB отвечает:

Your variables are (вашими переменными являются):

A M S v

а при вводе whos имеем:

Name Size Bytes Class

A 4x4 128 double array

M 8x1 2368 cell array

S 1x1 398 struct array

v 5x9 90 char array

Grand total is 286 elements using 2984 bytes

где в последней строке указано общее число элементов и количество используемых байтов, и присутствуют следующие классы : double array – массив чисел удвоенной точности, cell array – массив ячеек, struct array – массив структур, char array – массив символов.

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

Сохранение всех переменных. Для сохранения всех переменных рабочего простанства с ис-пользованием ОПРП следует:

1 . Из меню File или контекстного меню выбрать Save Workspace As , или щелкнуть мышью по кнопке инструментальной линейки ОПРП. Откроется диалоговое окно Save.

2. Задать местоположение и имя файла (File name) . MATLAB автоматически добавит расширение .mat .

3. Щелкнуть Save .

Переменные рабочего простанства при этом запомнятся в MAT-файле с выбранным вами именем.

Сохранение части переменных. Для этого надо:

1. Выбрать переменную в ОПРП. Для выбора нескольких переменных следует использо-вать клавиши Shift или Ctrl .

1. Вызвать щелчком правой кнопки контекстное меню и выбрать Save Selection As . Дальнейшие действия описаны выше.

Эквивалентные функции ! Для сохранения переменных рабочего пространства можно ис-пользовать команду save с указанием имени файла куда вы хотите запомнить данные. Напри-мер, команда save('june10') запоминает все переменные рабочего пространства в бинарном файле june10.mat . Если вы не задаете имя файла, рабочее простанство запоминается в специ- альном файле под названием matlab.mat в текущей рабочей директории. Вы можете задать какие переменные сохранять, а также формат запоминания данных, например ascii . Так, ко-манда save 'june10' X Y сохраняет в названном файле только переменные X Y .

Загрузка запомненного рабочего пространства. Для загрузки предварительно запомненно-нго рабочего пространства следует:

1. Щелкнуть на кнопку загрузки данных на инструментальной линейке ОПРП, или щел-кнуть правой кнопкой на ОПРП и выбрать в контекстном меню опцию Import Data. Откро-ется диалоговое окно Open (Открыть).

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

Эквивалентные функции ! Функция load предназначена для загрузки запомненного рабо-чего пространства. Например, команда load('june10') загружает в рабочее пространство все переменные из файла june10.mat .

Примечание. Если в сохраненном MAT-файле june10 содержатся переменные обозначен-ные A , B , и C , то загрузка june10 помещает эти переменные в рабочее пространство. Если переменные с этими именами уже существуют в рабочем пространстве, то они заменяются новыми переменными из june10 .

Очистка переменных рабочего пространства. С помощью ОПРП вы можете удалить лю-бые переменные из рабочего пространства. Для этого нужно:

1. Выбрать переменную в ОПРП (или несколько перменных с использованием клавиш Shift или Ctrl ). Для выбора всех переменых нужно выбрать опцию Select All из меню Edit или контекстного меню.

2. Выполнить любое из перечисленных действий:

- Нажать клавишу Delete .

- Выбрать опцию Delete из меню Edit .

- Щелкнуть по кнопке на инструментальной панели ОПРП.

- Выбрать опцию Delete Selection из контекстного меню.

3. Если появиться диалоговое окно подтверждения, щелкнуть Yes .

Для удаления сразу всех переменных нужно выбрать опцию Clear Workspace из меню Edit или контекстного меню ОПРП.

Эквивалентная функция ! Функция clear выполняет те же функции. Например, команда

clear A M

удаляет переменные A и M из рабочего пространства, а команда clear без обозначения аргу-ментов удаляет все переменные . Наконец, команда clear all удаляет все переменные и функ- ции, т.е. полностью очищает рабочее пространство системы MATLAB

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

Построение графиков переменных. Вы можете построить график любой переменной из рабочего пространства. Для этого надо щелкнуть правой кнопкой мыши на переменную в ОПРП, которую вы хотите отобразить графически, и из появившегося контекстного меню выбрать опцию Graph Selection и далее выбрать тип графика, который вы хотите построить. Соответствующий график появится в открывшемся специальном окне представления гра-фической информации (figure window). В дальнешем для краткости эти окна буде называть графическими окнами.

Просмотр и редактирование массивов данных при помощи

редактора Array Editor

Редактор Массива Данных (РМД) Array Editor предназначен для визуального просмотра и редактирования одно- и двумерных числовых массивов, символьных строк и ячеек сим-вольных строк.

Открытие РМД. Для вызова РМД из ОПРП следует:

1. Выделить в ОПРП желаемую переменную или переменные обычным образом.

2. Щелкнуть по кнопке в инструментальной линейке ОПРП или выбрать из контекст-ного меню опцию Open Selection . В случае одной перменной можно также ограничиться двойным щелчком по выбранной переменной.

В результате появится следующее окно:

Изменение значений Изменение формата

элементов массива представления данных Изменение размерностей массива

Выбор различных переменных для просмотра

Рис.4. Общий вид окна Редактора Массива Данных

Повторение перечисленных выше шагов приведет к открытию дополнительных переменных в РМД. Доступ к каждой переменной осуществляется через ярлыки внизу окна РМД (см. рис. 4) или посредством меню Window .

Эквивалнтная функция ! Для просмотра содержания переменной рабочего пространства достаточно напечатать ее имя в командной строке. Так, например, при вводе в командной строке переменной m (см. рис. 4) , MATLAB ответит

m =

16 2 3 13

5 11 10 8

9 7 6 12

4 14 15 1

Для открытия РМД с требуемой переменной из командной строки MATLAB-а, можно вос-пользоваться функцией openvar с соответствующей переменной в качестве аргумента. На-пример, при вводе openvar('m') MATLAB откроет РМД с переменной m .

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

Пути доступа системы MATLAB

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

Внимание ! Если вы создаете свой собственный М-файл или модифицируете любой имею-щийся М-файл, поставленный с системой MATLAB, сохраняйте их в директории, которая не находится на пути $matlabroot/toolbox/matlab , где $matlabroot – корневая директория системы MATLAB на вашем компьютере. Если вы храните какие-либо свои файлы в дирек-тории $matlabroot/toolbox/matlab , они будут уничтожены при переустановке или установке новой версии MATLAB-а на вашем компьютере.

Суть концепции путей доступа. Все используемые вами файлы рассматриваются как нахо-дящиеся на путях доступа системы MATLAB. Когда вы включаете новую директорию в пути доступа, вы добавляете ее к имеющимся путям. Поддиректории (subdirectories) должны быть добавлены в пути доступа явным образом; они не включаются в пути доступа автоматически, при включении их родительских директорий. Пути доступа системы MATLAB хранятся в файле pathdef.m . Порядок расположения директорий на путях доступа имеет существенное значение. Система MATLAB ищет любой объект (переменную, функцию и т.д.), например, названный foo , следующим образом. Если вы вводите foo в командной строке, то система MATLAB выполняет следующие действия:

1. Ищет foo как переменную.

2. Проверяет, не является ли foo встроенной функцией.

3. Ищет в текущей директории файл названный foo.m .

4. Ищет по очереди во всех директориях на пути доступа MATLAB файл foo.m .

Хотя в действительности схема поиска является более сложной, эта упрощенная схема явля-ется достаточно точной для обычных М-файлов, с которыми имеет дело потребитель.

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

Просмотр и изменение путей доступа. Для просмотра и изменения путей доступа системы MATLAB предусмотрено диалоговое окно Set Path , а также ряд эквивалентных команд (фу-нкций), которые можно выполнить из командной строки. Для открытия указанного окна ну-жно выбрать опцию Set Path из меню File рабочего стола, или ввести команду pathtool из командной строки MATLAB –а. Откроется следующее диалоговое окно

При нажатии на эти кнопки происходят изменения

в путях доступа текущего сеанса, но эти пути доступа

не сохраняются автоматически дл будущих сеансов


Кнопки для изменения

путей доступа Директории текущих путей доступа системы MATLAB

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

Рис. 5. Диалоговой окно Set Path для модификации путей доступа

На рис. 5 имеем следующие кнопки:

Add Folder… - Добавить директорию (папку).

Add with Subfolders… - Добавить директорию с поддиректориями.

Move to Top - Перенести директорию в начало пути.

Move Up - Перенести директорию на один шаг вверх.

Remove - Удалить директорию.

Move Down - Перенести директорию на один шаг вниз.

Move to Bottom - Перенести директорию в конец пути.

Default - Восстановить исходные пути доступа (по умолчанию).

Назначение данных кнопок ясно из их названий.

Операции с файлами

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

Поле текущей директории. Быстрый путь просмотра или изменения текущей директории состоит в использовании поля Current Directory (Текущая Директория) в инструментальной панели рабочего стола

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

Впечатать в данное поле путь к новой текущей директории.

Щелкнуть на правой кнопке со стрелкой, что откроет список ранее использованных рабо-чих директорий, и выбрать из них желаемую.

Щелкнуть на кнопку (...) (см. рис. 2) для выбора новой директории.

Окно Просмотра Текущего Каталога (Current Directory Browser ) . Для поиска, просмот-ра, открывания и ввода изменений в директориях системы MATLAB можно воспользоваться Окном Просмотра Текущего Каталога (ОПТК). Все основные функции данного окна можно также выполнить задавая соответствующие команды из командной строки системы MATLAB. Если ОПТК не присутствует в рабочем столе MATLAB-а, то его можно открыть выбором опции Current Directory в меню View, или же введя команду filebrowser из коман-дного окна (Command Window ). При этом появится следующее окно

Данное поле позволяет произвести быстрый

просмотр и изменение директорий

Щелкнув по кнопке «бинокль» можно исследовать содержимое

любого М-файла (операция поиска по заданным символам)

Рис. 6. Окно просмотра текущего каталога

Двойной щелчок по любому выделенному файлу откроет его содержание в соответствующем окне Редактора/Отладчика. В нижней части ОПТК (см. рис. 6) показана часть справки (help) для выделенного файла.

Изменение текущей директории и просмотр ее содержания в ОПТК. Для изменения теку-щей директории из ОПТК можно воспользоваться полем Current Directory этого окна, со-вершенно аналогично тому, как это было описано выше.

Эквивалентные функции ! Команда dir выводит в командное окно все содержимое теку-щей директории или любой другой директории, заданной как аргумент функции dir. Кома-нда what действует аналогично, но выводит только те файлы, которые относятся к системе MATLAB. Команда which FileName , где FileName – имя файла, выводит путь доступа к данному файлу.

ОПТК позволяет также произвести любые добавление директорий к путям доступа системы MATLAB, а также создавать, копировать, переименовывать директории и т.д. (см. Руковод-ство Пользователя).

Поиск и замена содержимого файлов. Из ОПТК можно осуществить поиск любой заданной строки символов в содержании файла. Если же файл открыт в окне Редактора/Отладчика, то можно также и заменить заданную строку на другую.

Поиск заданной строки в пределах файла (файлов). Для поиска заданной строки следует:

1. Щелкнуть по кнопке инструментальной панели ОПТК (рис. 6). Появится следующее диалоговое окно «Найти и Заменить» (Find & Replace ):

2. Для нахождения всех случаев наличия требуемой строки в файлах следует:

- Впечатать строку в поле Find what .

- Выбрать директорию поиска в поле Look in , или просто непосредственно напечатать имя директории в данном поле.

- Ограничить поиск выбором опций Match case (Учитывать регистр) и Whole word (Слово целиком).

- Выбрать опцию Subdirectories (Поддиректории), если вы хотите также просматривать и файлы в поддиректориях.

3. Щелкнуть по кнопке Find .

Результат поиска при этом будет отображен в нижней части далогового окна Find & Replace как это показано на следующем рисунке. Этот результат включает название файла, номер со- ответствующей строки и содержимое данной строки.

Двойной щелчок по файлу приведет к

его открытию

Кнопка закрытия окна

Результаты предыдущих операций поиска результатов поиска

доступны через эти ярлыки

4. Для открытия любого из М-файлов в списке результатов поиска нужно выполнить одно из нижеприведенных действий:

- Дважды щелкнуть по файлу.

- Выделить файл и нажать клавишу Enter.

- Щелкнуть правой кнопкой по файлу и выбрать опцию Open из контекстного меню.

Соответсвующий файл будет открыт в Редакторе/Отладчике, причем он будет «прокручен» до той строки, которая содержит результат поиска.

5. Если вы до того проводили другой поиск (поиски), то все результаты предыдущих поисков будут доступны через «ярлыки» внизу текущего списка результатов поиска (см. рис.).

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

1. Открыть М-файл в окне Редактора/Отладчика системы MATLAB Editor. При этом нужно убедиться, что данный файл является текущим в окне Редактора/Отладчика.

2. Выбрать в поле Look in в диалоговом окне Find & Replace имя того файла, в котором вы хотите заменить строку. Кнопка Replace (Заменить) при этом активизируется.

3. Впечатать в поле Replace with текст, на который вы хотите заменить выбранную строку.

4. Щелкнуть Replace для замены строки символов в выбранной строке файла, или же щелк- нуть по кнопке Replace All , если вы хотите заменить все найденные совпадения в текущем файле.

Текст будет заменен.

5. Для сохранения изменений нужно выбрать опцию Save из меню File в окне Редактора/ От-ладчика.

Дуальность (двойственность) команд и функций

Команды системы MATLAB это выражения вида load или help . Многие команды допускают модификацию за счет определения операндов, например:

load August17.dat

help magic

type rank.

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

load('August17.dat')

help('magic')

type(' rank')

В этом состоит дуальность команд/функций системы MATLAB. Любая команда в форме

command argument

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

command('argument')

Преимущество функциональной формы записи проявляется когда символьный аргумент формируется машиной программно, из ряда разных кусков. Например, следующий пример загружает в рабочее пространство переменные из 31-го МАТ-файла под названиями August1.dat, August2.dat, и т.д.

for d = 1:31

s = ['August' int2str(d) '.dat']

load(s)

end

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

Действия над матрицами в системе MATLAB

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

Формирование матриц в системе MATLAB

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

A = pascal (3)

то система ответит

A =

1 1 1

1 2 3

1 3 6

Второй пример представляет несимметричную матрицу, известную под названием «волшеб-ный квадрат» (magic square):

B = magic(3)

B =

8 1 6

3 5 7

4 9 2

Еще один пример использования стандартной матрицы представляет собой прямоугольную 3х2 матрицу случайных целых чисел:

C = fix(10* rand(3,2))

C =

9 4

2 8

6 7.

Здесь функция rand(3,2) генерирует 3х2 матрицу равномерно распределенных случайных чисел в диапазоне от 0 до 1, а функция fix осуществляет округление путем отбрасывания дробной части.

Вектор-столбец есть матрица размера mх1 matrix, вектор-строка – матрица размера 1х n , а скаляр есть матрица размера 1х1. Объединение отдельных чисел в массивы осуществляется при помощи квадратных скобок, причем отдельные строки разделяются точкой с запятой, а переменные в каждой строке – запятой или пробелом (число пробелов может быть любым). Выражения

u = [3; 1; 4]

v = [2 0 -1]

s = 7

дают вектор-столбец u , вектор-строку v и скаляр s (эти векторы также будут использоваться в дальнейшем при решении примеров):

u =

3

1

4

v =

2 0 –1

s =

7

Сложение и вычитание матриц

Сложение и вычитание матриц определяется как и для массивов, то есть поэлементно. Эти операции требуют чтобы обе матрицы имели одинаковую размерность, или одна из них была скаляром (в последнем случае MATLAB прибавляет (или вычитывает) данный скаляр из всех элементов матрицы). Если размерности матриц не совпадают, в командное окно выдается со-общение об ошибке (красным цветом)

Error using ==> +

Matrix dimensions must agree.

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

Вектор-строка и вектор-столбец могут быть перемножены в любом порядке (оператор умно-жения * расположен на верхнем регистре клавиши с цифрой 8). Результатом будет или ска-ляр (внутреннее произведение) или матрица (внешнее произведение). Для приведенных выше векторов v и u имеем :

x = v* u

x =

2

X = u* v

X =

6 0 -3

2 0 -1

8 0 -4

Для действительных матриц, операция транспонирования меняет взаимное местоположение элементов aij aji , симметричных относительно главной диагонали. Для обозначения транс-понирования MATLAB использует одиночную кавычку (апостроф) (‘). Для нашей симметри-чной матрицы Паскаля A’ = A. Однако матрица В не является симметричной и поэтому:

X = B'

X =

8 3 4

1 5 9

6 7 2

Транспонирование превращает вектор-строку в вектор-столбец и наоборот. Если x и y оба яв-ляются действительными векторами, то произведение x*y не определено, но оба произве-дения x'*y и y'*x дают один и тот же скаляр. Это соотношение используется так часто, что имеет три различных имени: скалярное произведение, внутреннее произведение и точечное произведение.

Для комплексного вектора или матрицы, z , величина z' обозначет комплексно-сопряженное транспонирование. В MATLAB-е предусмотрены также поэлементные операции над элеме-нтами массивов. Признаком поэлементных операций служит точка после обозначения пере-менной. Так, транспонирование элементов матрицы z как массива чисел обозначается z.' , по аналогии с другими операциями на массивами чисел. Например, если

z = [1+2i 3+4i]

то

z' =

1-2 i

3-4 i

тогда как z.' есть

z.' =

1+2 i

3+4 i

Для комплексных векторов, два скалярных произведения x'*y и y'*x комплексно сопряжены, а скалярное произведение x'*x комплексного вектора с самим собой есть действительное число.

Произведение матриц

Для произведения двух совместимых А и В матриц в MATLAB–е достаточно записать в ко-мандной строке С = А*В . MATLAB самостоятельно проверит совместимость размерностей матриц и выдаст результат. Если матрицы несовместимы, выдается сообщение об ошибке:

Error using ==> *

Inner matrix dimensions must agree.

Индексирование (Subscripts)

Для краткого рассмотрения некоторых основных понятий, связанных с индексированием дву-мерных массивов (матриц), введем «волшебную» матрицу 4-го порядка:

F = magic(4)

F =

16 2 3 13

5 11 10 8

9 7 6 12

4 14 15 1

Элемент в i -ой строке и j-ом столбце матрицы F обозначается через F (i,j) . Например, F (4,2) есть число в четвертой строке и втором столбце. Для нашего волшебного квадрата, F(4,2) есть 14. Таким образом, можно вычислить сумму элементов четвертого столбца матрицы F, напечатав

F (1,4) + F (2,4) + F (3,4) + F (4,4)

Это дает ответ

ans =

34

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

Имеется также возможность обращения к элементам матрицы при помощи одного индекса, F(k) . Это обычный способ обращения к элементам векторов (строк или столбцов). Но в MATLAB-е такой способ индексирования можно применить и к двумерным (в общем случае – многомерным) матрицам, так как система MATLAB хранит все многомерные массивы чи-сел в виде одного длинного вектора-столбца, сформированного из столбцов исходной матри-цы. Так, для нашего волшебного квадрата, F (8) есть другой способ обращения к начени 14 хранящемуся в F (4 ,2).

Если вы попытаетесь использовать элемент, находящийся вне размеров матрицы, это приве-дет к сообщению об ошибке

t = F (4,5)

Index exceeds matrix dimensions

(Индекс превышает размерность матрицы)

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

X = A;

X(4,5) = 17

X =

16 3 2 13 0

5 0 11 8 0

9 6 7 12 0

4 15 14 1 17

Двоеточие (Colon)

Двоеточие, : , является одним из наиболее важных операторов MATLAB-а. Оно встречается в нескольких разных формах. Выражение 1:10 есть вектор-строка, содержащий целвые числа от 1 до 10 :

1 2 3 4 5 6 7 8 9 10

Чтобы получить неединичное приращение, нужно задать приращение. Например,

100 : -7 : 50

есть

100 93 86 79 72 65 58 51

а

0 : pi/4 : pi

есть

0 0.7854 1.5708 2.3562 3.1416

Индексы, содержащие двоеточия, допускают обращение к частям матриц. Так, выражение

F (1:k, j)

дает первые k элементов j -го столбца матрицы F. То есть,

sum(F (1:4, 4))

вычисляет, как и в примере выше, сумму элементов 4-го столбца. Но есть еще лучший путь. Двоеточие само по себе означает обращение ко всем элементам строки или столбца матрицы, а зарезервированное слово end есть обращение к последним строке или столбцу матрицы (в случае векторов-строк или столбцов слово end есть обращение к последнему элементу векто-ра). Значит,

sum( F (:, end))

вычисляет сумму элементов последнего столбца матрицы F . Ответ: ans = 34 . Почему маги-ческая сумма для волшебного квадрата 4 х 4 равна 34 ? Дело в том, что если целые числа от 1 до 16 (число элементов матрицы размера 4 х 4) упорядочены в четыре группы с равными сум-мами элементов, эта сумма должна быть равна

sum(1:16)/4

что, конечно, дает ans = 34.

Единичная матрица, нулевая матрицы и матрица из единиц.

Двумерные массивы случайных чисел

Единичная матрица, то есть матрица имеющая единицы на главной диагонали и нулевые ос-тальные элементы, в MATLAB-е обозначается eye , причем eye(n) есть единичная квадратная матрица размера nxn, eye(m,n) - прямоугольная единичная матрица размера mxn, а eye(size(A)) есть единичная матрица, имеющая размерность матрицы A. Например,

I = eye(3)

I =

1 0 0

0 1 0

0 0 1

I = eye (3,5)

I =

1 0 0 0 0

0 1 0 0 0

0 0 1 0 0

I = eye (4,2)

I =

1 0

0 1

0 0

0 0

Нулевая матрица, то есть матрица состоящая из нулей (массив нулей), в MATLAB-е обоз-начается zeros , причем zeros (n) есть нулевая квадратная матрица размера nxn, zeros (m,n) - прямоугольная нулевая матрица размера mxn, а zeros (size(A)) есть нулевая матрица имею-щая размерность матрицы A.

Z = zeros(2,4)

Z =

0 0 0 0

0 0 0 0

Наконец, матрица состоящая из единиц (массив единиц), в MATLAB-е обозначается ones , причем ones (n) есть квадратный массив единиц размера nxn, ones (m,n) – прямоугольный массив единиц размера mxn, а ones (size(A)) есть массив единиц, имеющий размерность матрицы A.

S = 5* ones(3, 3)

S =

5 5 5

5 5 5

5 5 5

Аналогично, функция rand дает возможность сформировать соответствующие массивы слу-чайных чисел в диапазоне от 0 до 1, распределенных по равномерному закону, а функция randn – по нормальному закону.

N = fix(10*rand(1,10))

N =

4 9 4 4 8 5 2 6 8 0

R = randn(4,4)

R =

1.0668 0.2944 -0.6918 -1.4410

0.0593 -1.3362 0.8580 0.5711

-0.0956 0.7143 1.2540 -0.3999

-0.8323 1.6236 -1.5937 0.6900

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

Одной из важнейших задач в технических приложениях и расчетах является задача решения систем линейных уравнений. В матричных обозначениях, данная задача может быть сформу-лирована следующим образом. При заданных двух матрицах A and B , существует ли такая единственная матрица X , что AX = B или XA = B ?

Для наглядности рассмотрим одномерный пример. Имеет ли уравнение

7x = 21

единственное решение? Ответ, разумеется, да. Это уравнение имеет единственное решение x = 3 . Решение может быть легко получено обычным делением .

x = 21/7 = 3

Решение при этом обычно не состоит в определении обратной величины от числа 7 (т.е. ве-личины 7-1 = 0.142857…), и последующим умножением числа 7-1 на число 21. Это было бы более трудоемко и, если число 7-1 представлено конечным числом цифр (разрядов), менее точно. Аналогичные рассуждения применимы и к системам линейных алгебраических уравнений с более чем одной неизвестной; MATLAB решает такие уравнения без вычисле-ния обратной матрицы. Хотя это и не является стандартным математическим обозначением, система MATLAB использует терминологию, связанную с обычным делением в одномерном случае, для описания общего случая решения совместной системы нескольких линейных уравнений. Два символа деления / (косая черта (по английски - slash )) и \ (обратная косая че-рта (backslash )) используются в двух случаях, когда неизвестная матрица появляется слева или справа от матрицы коэффициентов:

X = A\B обозначает решение матричного уравнения AX = B

X = B/A обозначает решение матричного уравнения XA = B.

Вы можете представлять себе это как процесс «деления» обеих частей уравнения AX = B или XA = B на A . Матрица коэффициентов A всегда находится в «знаменателе».Условие сов-местимости размерностей для X = A\B требует чтобы две матрицы A и B имели одинаковое число строк. Решение X тогда имеет такое же число столбцов как и B , а число ее строк будет равно числу столбцов A . Для X = B/A , строки и столбцы меняются ролями. На практике, ли-нейные уравнения в виде AX = B встречаются более часто, чем в виде XA = B . Следователь-но, обратная наклонная черта \ используется более часто, чем прямая / . Поэтому, в остав-шейся части данного раздела мы ограничимся рассмотрением оператора \ ; соответствующие свойства оператора / можно вывести из тождества

( B/ A)' = ( A'\ B')

В общем случае не требуется, чтобы матрица коэффициентов A была бы квадратной. Если A имеет размер mхn, то возможны три случая:

  1. m = n Квадратная система. Ищется точное решение.
  2. m > n Переопределенная система. Ищется решение методом наименьших квадратов.
  3. m < n Недоопределенная система. Находится базовое решение с самым большим

числом m ненулевых компонент.

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

Перестановки треугольных матриц

Симметричные, положительно определенные матрицы

Квадратные невырожденные матрицы

Прямоугольные, переопределенные системы

Прямоугольные, недоопределенные системы

Квадратные системы

Наиболее часто встречающейся ситуацией является квадратная матрица коэффициентов A и одномерный вектор-столбец b справа, т.е. Ax = b . Решение x = A\b имеет при этом тот же ра-змер, что и вектор b . Например,

x = A\ u

x =

10

-12

5

где матрица А есть приведенная выше матрица Паскаля. Легко удостовериться, что A*x в точности равно вектору u (численные значения этого вектора даны выше).

Если A и B являются квадратными и имеют одинаковый размер, то X = A\B имеет тот же ра-змер, например

X = A\B

X =

19 -3 -1

-17 4 13

6 0 -6

Легко убедиться, что A*X в точности равно B .

Оба этих примера имеют точное решение в виде целых чисел. Это связано с тем, что в каче-стве матрицы коэффициентов была выбрана матрица Паскаля pascal(3) , чей детерминант равен единице. Далее будут рассмотрены примеры влияния ошибок округления, возникаю-щих в более реальных системах.

Квадратная матрица A является сингулярной , если ее столбцы не являются линейно незави-симыми. Если A – сингулярна, то решение AX = B или не существует, или не является един-ственным. Оператор \ , A\B , выдает предупреждающее сообщение, если матрица A близка к сингулярной и сообщение об ошибке, если определено равенство нулю детерминанта матри-цы А .

Переопределенные системы

Переопределенные системы совместных линейных уравнений часто встречаются в задачах аппроксимации экспериментальных данных при помощи различных эмпирических кривых. Рассмотрим следующий гипотетический пример. Величина y измеряется при различных зна-чениях времени t , что дает следующие результаты

t y

0.0 0.82

0.3 0.72

0.8 0.63

1.1 0.60

1.6 0.55

2.3 0.50

Эти данные могут быть введены в MATLAB при помощи выражений:

t = [0 .3 .8 1.1 1.6 2.3]';

y = [0.82 0.72 0.63 0.60 0.55 0.50]';

Данные могут быть аппроксимированы при помощи убывающей экспоненциальной функ-ции.

y(t) = c1 + c2 e-t

Это уравнение показывает, что вектор y может быть представлен в виде линейной комбина-ции двух векторов, один из которых является постоянным вектором, содержащим все едини-цы, а второй вектор имеет компоненты e-t . Неизвестные коэффициенты c1 и c2 могут быть найдены подгонкой кривых по методу наименьших квадратов, которая основана на миними-зации суммы квадратов отклонений экспериментальных данных от модели. Мы имеем шесть уравнений с двумя неизвестными, представленными 6х2 матрицей

E = [ ones( size( t)) exp(- t)]

E =

1.0000 1.0000

1.0000 0.7408

1.0000 0.4493

1.0000 0.3329

1.0000 0.2019

1.0000 0.1003

Решение методом наименьших квадратов находится при помощи оператора \ :

c = E\ y

c =

0.4760

0.3413

Иными словами, подгонка методом наименьших квадратов дает

y( t) = 0.476 + 0.3413 e- t

Следующие выражения оценивают модель при равномерно распределенных моментах време-ни (с шагом 0.1), а затем строят график вместе с результатами экспериментальных данных.

T = (0 : 0.1 : 2.5)';

Y = [ones(size(T)) exp(-T)]*c;

plot(T, Y, '-', t, y, 'o')

Можно видеть, что значения E*c не совсем точно совпадают со значениями эксперименталь-ных данных y , но эти отклонения могут быть сравнимы с ошибками измерений.

Прямоугольная матрица A называется матрицей неполного ранга , если ее столбцы линейно-независимы. Если матрица A имеет неполный ранг, то решение AX = B не является единст-венным. Оператор \ при этом выдает предупреждающее сообщение и определяет основное решение, которое дает минимально возможное число ненулевых решений.

Недоопределенные системы

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

R = fix (10* rand(2,4))

R =

6 8 7 3

3 5 4 1

b = fix (10*rand(2,1))

b =

1

2

Система уравнений Rx = b содержит два уравнения с четырьмя неизвестными. Поскольку матрица коэффициентов R содержит небольшие по величине целые числа, целесообразно представить решение в формате rational (в виде отношения двух целых чисел). Частное ре-шение представленное в указанном формате есть:

p = R\ b

p =

0

5/7

0

-11/7

Одно из ненулевых решений есть p(2), потому что второй столбец матрицы R имеет наи-большую норму. Вторая ненулевая компонента есть p(4) поскольку четвертый столбец матрицы R становится доминирующим после исключение второго столбца (решение нахо-дится методом QR-факторизации с выбором опорного столбца).

Обратные матрицы и детерминанты

Если матрица А является квадратной и невырожденной, уравнения AX = I и XA = I имеют одинаковое решение X . Это решение называется матрицей обратной к A , обозначается через A -1 и вычисляется при помощи функции inv . Понятие детерминанта (определителя) матрицы полезно при теоретических выкладках и некоторых типах символьных вычислений, но его масштабирование и неизбежные ошибки округления делают его не столь привлекательным при числовых вычислениях. Тем не менее, если это требуется, функция det вычисляет определитель квадратной матрицы. Например,

A = pascal (3)

A =

1 1 1

1 2 3

1 3 6

d = det (A)

X = inv (A)

d =

1

X =

3 -3 1

-3 5 -2

1 -2 1

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

B = magic(3)

B =

8 1 6

3 5 7

4 9 2

d = det( B)

X = inv( B)

d =

-360

X =

0.1472 -0.1444 0.0639

-0.0611 0.0222 0.1056

-0.0194 0.1889 -0.1028

Внимательное изучение элементов матрицы X , или использование формата rational , показы-вает, что они являются целыми числами, разделенными на 360.

Если матрица A является квадратной и несингулярной, то, пренебрегая ошибками округле-ния, выражение X = inv(A)*B теоретически означает то же, что и X = A\B , а Y = B*inv(A) теоретически есть то же, что и Y = B/A . Однако вычисления включающие операторы \ и / более предпочтительны, поскольку требуют меньше рабочего времени, меньшей памяти и имеют лучшие свойства с точки зрения определения ошибок.

Псевдообратные матрицы

Прямоугольные матрицы не имеют детерминантов и обратных матриц. Для таких матриц по крайней мере одно из уравнений AX = I или XA = I не имеет решения. Частично данный про-бел восполняется так называемой псевдообратной матрицей Мура-Пенроуза, или просто псевдообратной матрицей, которая вычисляется при помощи функции pinv . На практике необходимость в этой операции встречается довольно редко. Желающие могут всегда обра-титься к соответствующим справочным пособиям.

Степени матриц и матричные экспоненты

Положительные целые степени

Если А есть некоторая квадратная матрица, а р – положительное целое число, то A^p эквива-лентно умножению A на себя р раз.

X = A^2

X =

3 6 10

6 14 25

10 25 46

Отрицательные и дробные степени

Если А является квадратной и невырожденной, то A^(-p) эквивалентно умножению inv(A) на себя p раз.

Y = B^(-3)

Y =

0.0053 -0.0068 0.0018

-0.0034 0.0001 0.0036

-0.0016 0.0070 -0.0051

Дробные степени, например A^(2/3) , также допускаются; результаты при этом зависят от ра-спределения собственных значений матрицы А .

Поэлементное возведение в степень

Оператор .^ (с точкой !) осуществляет поэлементное возведение в степень. Например,

X = A.^2

A =

1 1 1

1 4 9

1 9 36

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

Для невырожденных квадратных матриц А функция sqrtm вычисляет главное значение квад-ратного корня , т.е. если X = sqrtm(A) , то X*X = A . Буква m в sqrtm означает, что выпол-няется матричная операция. Это отличает данную функцию от sqrt(A), которая, подобно A.^(1/2) (обратите внимание на точку !), выполняет операцию извленчения корня поэлемен-тно .

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

dx/dt = Ax

где x = x(t) есть векторная функция от t, а A есть постоянная матрица не зависящая от t .

Решение данной системы может быть выражено в виде матричной экспоненты .

x( t) = At x(0)

Функция expm(A) вычисляет матричную экспоненту. Рассмотрим пример системы диффере-нциальных уравнений со следующей 3х3 матрицей коэффициентов

A =

0 -6 -1

6 2 -16

-5 20 -10

и начальными условиями x(0)

x0 = [ 1 1 1]’.

Использование матричной экспоненты для вычисления решения дифференциального уравне-ния в 101 точке с шагом 0.01 на интервале 0 ≤ t ≤ 1 записывается в виде

X = [ ];

for t = 0 : 0.01 : 1

X = [ X expm( t* A)* x0];

end

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

plot3(X(1,:), X(2,:), X(3,:), '-o')

Решение имеет вид спиральной функции сходящейся к началу координат (см. рис. ниже). Та-кое решение обусловлено комплексными собственными значениями матрицы коэффициен-тов А .

Собственные значения и собственные векторы

Собственным значением и собственным вектором квадратной матрицы А называются ска-ляр λ и вектор v , удовлетворяющие условию

Av = λv

Диагональная декомпозиция

Имея диагональную матрицу Λ, составленную из собственных значений λ матрицы А и мат-рицу V , составленную из соответствующих собственных векторов v, можно записать

AV = VΛ

Если матрица V несингулярная, на основании данного выражения получаем спектральное разложение матрицы А

А = V ΛV-1

Неплохой пример использования спектрального разложения дает рассмотренная выше мат-рица коэффициентов линейного дифференциального уравнения. Ввод выражения

lambda = eig(A)

дает следующий вектор-столбец собственных значений (два из них являются комплексно-сопряженными)

lambda =

-3.0710

-2.4645 + 17.6008i

-2.4645 - 17.6008i

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

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

.

[V,D] = eig(A)

V =

-0.8326 0.2003 - 0.1394i 0.2003 + 0.1394i

-0.3553 -0.2110 - 0.6447i -0.2110 + 0.6447i

-0.4248 -0.6930 -0.6930

D =

-3.0710 0 0

0 -2.4645+17.6008i 0

0 0 -2.4645-17.6008i

Первый собственный вектор (первый столбец матрицы V) является действительным, а два других являются комплексно-сопряженными. Все три вектора являются нормализованными по длине, т.е. их Евклидова норма norm(v,2) , равна единице.

Матрица V*D*inv(V) , которая в более сжатой форме может быть записана как V*D/V , равна, в пределах погрешностей округления, матрице А . Аналогично, inv(V)*A*V , или V\A*V , рав-на, в пределах погрешностей округления, матрице D .

Дефектные матрицы

Некоторые матрицы не имеют спектрального разложения. Такие матрицы называются дефек-тными или не диагонализируемыми . Например, пусть матрица А имеет вид

A =

6 12 19

-9 -20 -33

4 9 15

Для этой матрицы ввод [V, D] = eig(A) дает

V =

-0.4741 -0.4082 -0.4082

0.8127 0.8165 0.8165

-0.3386 -0.4082 -0.4082

D =

-1.0000 0 0

0 1.0000 0

0 0 1.0000

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

Сингулярное разложение матриц

Сингулярным значением и соответствующими сингулярными векторами прямоугольной ма-трицы A называются скаляр σ и пара векторов u и v такие, что удовлетворяются соотноше-ния

Av = σ u

AT u = σ v

Имея диагональную матрицу сингулярных чисел Σ и две ортогональные матрицы U и V , сформированные из соответствующих собственных векторов, можно записать

AV = U Σ

AT U = V Σ

Поскольку U и V являются ортогональными матрицами, это можно записать в виде сингуляр-ного разложения

A = U ΣVT

Полное сингулярное разложение матрицы А размера m хn включает m хm матрицу U , mхn матрицу Σ , и nхn матрицу V . Другими словами, обе матрицы U и V являются квадратными , а матрица Σ имеет тот же размер, что и A . Если A имеет намного больше строк чем столб-цов, результирующая матрица U может быть достаточно большой, но большинство ее столб-цов умножаются на нули в Σ . В таких ситуациях может быть использована так называемая экономичная декомпозиция, которая сберегает как время так и память, за счет вывода матри-цы U размера mхn, матрицы Σ размера nхn и той же матрицы V .

Спектральное разложение является подходящим инструментом анализа матрицы, когда пос-ледняя осуществляет преобразование векторного пространства в себя, как это было в рас-смотренном выше примере дифференциальных уравнений. С другой стороны, сингулярное разложение матриц удобно при отображении одного векторного пространства в другое, возможно с иной размерностью. Большинство систем совместных линейных уравнений отно-сятся ко второй категории. Если матрица А является квадратной, симметричной и поло-жительно-определенной, то ее спектральное и сингулярное разложения совпадают. Но при отклонении A от симметричной и положительно-определенной матрицы, разница между двумя разложениями возрастает. В частности, сингулярное разложение действительной мат-рицы всегда действительно, но спектральное разложение действительной несимметричной матрицы может быть и комплексным.

Для матрицы

A =

9 4

6 8

2 7

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

[ U, S, V] = svd( A)

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

U =

-0.6105 0.7174 0.3355

-0.6646 -0.2336 -0.7098

-0.4308 -0.6563 0.6194

S =

14.9359 0

0 5.1883

0 0

V =

-0.6925 0.7214

-0.7214 -0.6925

Вы можете убедиться, что матрица U*S*V' равна А с точностью до ошибок округления. Для этого примера экономичная декомпозиция дает незначительный эффект.

[ U, S, V] = svd( A,0)

U =

-0.6105 0.7174

-0.6646 -0.2336

-0.4308 -0.6563

S =

14.9359 0

0 5.1883

V =

-0.6925 0.7214

-0.7214 -0.6925

Как и в первом случае, матрица U*S*V' равна A с точностью до ошибок округления.

Полиномы и интерполяция

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

Полиномы и действия над ними

Обзор полиномиальных функций

Функция

Описание

conv

Умножение полиномов.

deconv

Деление полиномов.

poly

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

polyder

Вычисление производных от полиномов.

polyfit

Аппроксимация данных полиномом.

polyval

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

polyvalm

Вычисление значений матричного полинома.

residue

Разложение на простые дроби (вычисление вычетов).

roots

Вычисление корней полинома.

Представление полиномов

MATLAB представляет полиномы как векторы-строки, содержащие коэффициенты полино-мов по убывающим степеням. Например, рассмотрим следующее уравнение

p( x) = x3 – 2 x – 5

Это известный пример Валлиса (Wallis), использованный при первом представлении метода Ньютона во Французкой Академии. Мы будем использовать его в дальнейшем при рассмот-рении примеров использования различных функций. Для ввода данного полинома в MATLAB, следует записать

p = [1 0 -2 -5].

Корни полинома

Корни полинома вычисляются при помощи функци roots :

r = roots( p)

r =

2.0946

-1.0473 + 1.1359i

-1.0473 - 1.1359i

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

p2 = poly( r)

p2 =

1 8.8818e-16 -2 -5

Функции poly и roots являются взаимно-обратными функциями, с точностью до упорядоче- ния коэффициентов, масштабирования и ошибок округления.

Характеристические полиномы

Функция poly вычисляет также коэффициенты характеристического полинома матрицы:

A = [1.2 3 -0.9; 5 1.75 6; 9 0 1];

poly( A)

ans =

1.0000 -3.9500 -1.8500 -163.2750

Корни данного полинома, вычисленные при помощи функции roots , являются собственными значениями (характеристическими числами) матрицы А . (При практических расчетах, для вычисления собственных значений матриц целесообразно вычислять их посредством функ-ции eig .)

Вычисление значений полинома

Функция polyval вычисляет значение полинома в заданных точках. Для вычисления p в точ-ке s = 5 , следует записать

polyval( p,5)

ans =

110

Можно также вычислить значение матричного полинома. Так, вместо полинома Валлиса мо-жно записать:

p( X) = X3 - 2 X – 5 I

где X является квадратной матрицей, а I - единичной матрицей. Например, сформируем сле-дующую квадратную матрицу X

X = [2 4 5; -1 0 3; 7 1 5];

и вычислим значение заданного выше полинома p(X) на данной матрице.

Y = polyvalm(p, X)

Y =

377 179 439

111 81 136

490 253 639

Умножение и деление полиномов

Для умножения и деления полиномов предназначены соответственно функции conv и deconv. Рассмотрим полиномы a(s) = s2 + 2s + 3 и b(s) = 4s2 + 5s + 6 . Для вычисления их произведения следует ввести

a = [1 2 3]; b = [4 5 6];

c = conv( a, b)

MATLAB возвращает

c =

4 13 28 27 18

Для получения из с полинома b воспользуемся функцией deconv:

[q, r] = deconv(c, a)

q =

4 5 6

r =

0 0 0 0 0

где r – остаток после деления (в данном случае нулевой вектор). В общем случае для поли-номов q, r , c, a в функции deconv справедливо соотношение

c = conv( q, a) + r

Вычисление производных от полиномов

Функция polyder вычисляет производную любого полинома. Для получения производной от нашего полинома p = [1 0 -2 -5] , введем

q = polyder( p)

q =

3 0 - 2

Функция polyder вычисляет также производные от произведения или частного двух полино-мов. Например, создадим два полинома a и b:

a = [1 3 5]; b = [2 4 6];

Вычислим производную произведения a*b вводом функции polyder с двумя входными аргу-ментами a и b и одним выходным:

c = polyder(a, b)

c =

8 30 56 38

Вычислим производную от частного a/b путем ввода функции polyder с двумя выходными аргументами:

[q, d] = polyder(a, b)

q =

-2 -8 -2

d =

4 16 40 48 36

где отношение двух полиномов q/d является результатом операции дифференцирования.

Аппроксимация кривых полиномами

Функция polyfit находит коэффициенты полинома заданной степени n , который аппрокси-мирует данные (или функцию y(x) ) в смысле метода наименьших квадратов:

p = polyfit(x, y, n)

где x и y есть векторы, содержащие данные x и y, которые нужно аппроксимировать полино-мом. Например, рассмотрим совокупность данных x-y , полученную экспериментальным пу-тем

x = [1 2 3 4 5]; y = [5.5 43.1 128 290.7 498.4].

Аппроксимация функциональной зависимости y(x) в виде полинома третьего порядка

p = polyfit( x, y,3)

дает коэффициенты полинома

p =

-0.1917 31.5821 -60.3262 35.3400

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

x2 = 1 : 0.1 : 5;

y2 = polyval(p, x2);

plot(x, y, 'o', x2, y2); grid on

где функция grid on служит для нанесения координатной сетки, а экспериментальные дан-ные на графике отмечены маркерами о .

.

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

Разложение на простые дроби

Функция residue вычисляет вычеты, полюса и многочлен целой части отношения двух поли-номов. Это особенно полезно при представлении систем управления в виде передаточных функций. Для полиномов a(s) и b(s), при отсутствии кратных корней имеем

где r есть вектор-столбец вычетов , p есть вектор-столбец полюсов , а k есть вектор-строка це-лой части дробно-рациональной функции. Рассмотрим передаточную функцию

Для полиномов числителя и знаменателя этой функции имеем:

b = [-4 8]; a = [1 6 8].

Введя

[r, p, k] = residue(b, a)

получим

r =

-12

8

p =

-4

-2

k =

[ ]

Функция residue с тремя входными (r, p, и k ) и двумя выходными (b2, a2 ) аргументами вы-полняет обратную функцию свертки имеющегося разложения на простые дроби, в дробно-рациональную функцию отношения двух полиномов.

[b2, a2] = residue(r, p, k)

b2 =

-4 8

a2 =

1 6 8

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

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

Интерполяция

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

Обзор функций интерполяции

Функции

Описание

griddata

Двумерная интерполяция на неравномерной сетке.

griddata3

Трехмерная интерполяция на неравномерной сетке.

griddatan

Многомерная интерполяция (n >= 3).

interp1

Одномерная табличная интерполяция.

interp2

Двухмерная табличная интерполяция.

interp3

Трехмерная табличная интерполяция.

interpft

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

interpn

Многомерная табличная интерполяция.

pchip

Кубическая интерполяция при помощи полинома Эрмита.

spline

Интерполяция кубическим сплайном.

Одномерная интерполяция

Двумя основными типами одномерной интерполяции в MATLAB-е являются полиномиаль-ная интерполяция и интерполяция на основе быстрого преобразования Фурье.

1. Полиномиальная интерполяция

Функция interp1 осуществляет одномерную интерполяцию – важную операцию в области анализа данных и аппроксимации кривых. Эта функция использует полиномиальные методы, аппроксимируя имеющийся массив данных полиномиальными функциями и вычисляя соот-ветствующие функции на заданных (желаемых) точках. В наиболее общей форме эта функ-ция имеет вид

yi = interp1( x, y, xi, method)

где y есть вектор, содержащий значения функции; x – вектор такой же длины, содержащий те точки (значения аргумента), в которых заданы значения y ; вектор xi содержит те точки, в ко-торых мы хотим найти значения вектора y путем интерполяции; method – дополнительная строка, задающая метод интерполяции. Имеются следующие возможности для выбора мето-да:

Ступенчатая интерполяция (method = 'nearest'). Этот метод приравнивает значение функ-ции в интерполируемой точке к ее значению в ближайшей существующей точке имеющихся данных.

Линейная интерполяция (method = 'linear'). Этот метод аппроксимирует функцию между любыми двумя существующими соседними значениями как линейную функцию, и возвр-ащает соответствующее значение для точки в xi (метод используется по умолчанию).

Интерполяция кубическими сплайнами (method = 'spline'). Этот метод аппроксимирует ин-терполируемую функцию между любыми двумя соседними значениями при помощи куби-ческих функций, и использует сплайны для осуществления интерполяции.

Кубическая интерполяция (method = 'pchip' или 'cubic'). Эти методы идентичны. Они ис-пользуют кусочную кубическую Эрмитову аппроксимацию и сохраняют монотонность и форму данных.

Если какой-либо из элементов вектора xi находится вне интервала, заданного вектором x , то выбранный метод интерполяции используется также и для экстраполяции. Как альтернатива,

функция yi = interp1(x, y, xi, method, extrapval) заменяет экстраполированные значения теми, которые заданы вектором extrapval . Для последнего часто используется нечисловое значение NaN .

Все методы работают на неравномерной сетке значений вектора x .

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

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

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

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

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

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

2. Интерполяция на основе быстрого преобразования Фурье _

Функция interpft осуществляет одномерную интерполяцию с использованием быстрого пре-образование Фурье (FFT). Этот метод вычисляет преобразование Фурье от вектора, который содержит значения периодической функции. Затем вычисляется обратное преобразование Фурье с использованием большего числа точек. Функция записывается в форме

y = interpft( x, n)

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

Двумерная интерполяция

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

ZI = interp2( X, Y, Z, XI, YI, method)

где Z есть прямоугольный массив, содержащий значения двумерной функции; X и Y являют-ся массивами одинаковых размеров, содержащие точки в которых заданы значения двумер-ной функции; XI и YI есть матрицы, содержащие точки интерполяции (то есть промежуточ-ные точки, в которых нужно вычислить значения функции); method – строка, определяющая метод интерполяции. В случае двумерной интерполяции возможны три различных метода:

Ступенчатая интерполяция (method = 'nearest' ). Этот метод дает кусочно-постоянную поверхность на области значений. Значение функции в интерполируемой точке равно значе-нию функции в ближайшей заданной точке.

Билинейная интерполяция (method = 'linear' ). Метод обеспечивает аппроксимацию данных при помощи билинейной поверхности (плоскости) на множестве заданных значений двумер-ной функции. Значение в точке интерполяции является комбинацией значений четырех бли-жайших точек. Данный метод можно считать «кусочно-билинейным»; он быстрее и требует меньше памяти, чем бикубическая интерполяция.

Бикубическая интерполяция (method = 'cubic' ). Данный метод аппроксимирует поверх-ность при помощи бикубических поверхностей. Значение в точке интерполяции является комбинацией значений в шестнадцати ближайших точках. Метод обеспечивает значительно более гладкую поверхность по сравнению с билинейной интерполяцией. Это может быть ключевым преимуществом в приложениях типа обработки изображений. Особенно эффек-тивным данный метод является в ситуациях, когда требуется непрерывность как интерполи-руемых данных, так и их производных.

Все эти методы требуют, чтобы X и Y были монотонными, то есть или всегда возрастающи-ми или всегда убывающими от точки к точке. Эти матрицы следует сформировать с исполь-зованием функции meshgrid , или же, в противном случае, нужно убедиться, что «схема» то-чек имитирует сетку, полученную функцией meshgrid . Перед интерполяцией, каждый из указанных методов автоматически отображает входные данные в равномерно распреде-ленную сетку. Если X и Y уже распределены равномерно, вы можете ускорить вычисления добавляя звездочку к строке метода, например, '*cubic' .

Сравнение методов интерполяции

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

  1. Сформируем функцию peaks на «грубой» сетке (с единичным шагом).

[x, y] = meshgrid(-3 : 1 : 3);

z = peaks(x,y);

surf( x, y, z)

где функция meshgrid (-3:1:3) задает сетку на плоскости x и y в виде двумерных массивов размера 7х7; функция peaks (x ,y ) является двумерной функцией, используемой в MATLAB-е в качестве стандартных примеров, а surf (x ,y ,z ) строит окрашенную параметрическую повер-хность. Соответствующий график показан ниже.

  1. Создадим теперь более мелкую сетку для интерполяции (с шагом 0.25).

[xi,yi] = meshgrid(-3:0.25:3);

  1. Осуществим интерполяция перечисленными выше методами.

zi1 = interp2(x,y,z,xi,yi,'nearest');

zi2 = interp2(x,y,z,xi,yi,'bilinear');

zi3 = interp2(x,y,z,xi,yi,'bicubic');

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

surf(xi,yi,zi1) surf(xi,yi,zi2) surf(xi,yi,zi3)

Метод ‘nearest’ Метод ‘bilinear’ Метод ‘bicubic’

Интересно также сравнить линии уровней данных поверхностей, построенных при помощи специальной функции contour.

contour(xi,yi,zi1) contour(xi,yi,zi2) contour(xi,yi,zi3)

Метод ‘nearest’ Метод ‘bilinear’ Метод ‘bicubic’

Отметим, что бикубический метод производит обычно более гладкие контуры. Это, однако, не всегда является основной заботой. Для некоторых приложений, таких, например, как об-работка изображений в медицине, метод типа ступенчатой интерполяции может быть более предпочтительным, так как он не «производит» никаких «новых» результатов наблюдений.

Анализ данных и статистика

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

  • Optimization – Нелинейные методы обработки данных и оптимизация.
  • Signal Processing – Обработка сигналов, фильтрация и частотный анализ.
  • Spline – Аппроксимация сплайнами.
  • Statistics – Углубленный статистический анализ, нелинейная аппроксимация и

регрессия.

  • Wavelet - Импульсная декомпозиция сигналов и изображений.

Внимание ! MATLAB выполняет обработку данных, записанных в виде двумерных массивов по столбцам ! Одномерные статистические данные обычно хранятся в отдельных векорах, причем n -мерные векторы могут иметь размерность 1х n или n х1. Для многомерных данных матрица является естественным представлением, но здесь имеются две возможности для ориентации данных. По принятому в системе MATLAB соглашению, различные пере-менные должны образовывать столбцы, а соответствующие наблюдения - строки. Поэтому, например, набор данных, состоящий из 24 выборок 3 переменных записывается в виде мат-рицы размера 24х3.

Основные функции обработки данных

Перечень функций обработки данных, расположенных в директории MATLAB-а datafun приведен в Приложении 8 .

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

count =

11 11 9

7 13 11

14 17 20

11 13 9

43 51 69

38 46 76

61 132 186

75 135 180

38 88 115

28 36 55

12 12 14

18 27 30

18 19 29

17 15 18

19 36 48

32 47 10

42 65 92

57 66 151

44 55 90

114 145 257

35 58 68

11 12 15

13 9 15

10 9 7

Таким образом, мы имеем 24 наблюдения трех переменных. Создадим вектор времени, t , со-стоящий из целых чисел от 1 до 24: t = 1 : 24. Построим теперь зависимости столбцов матри-цы counts от времени и надпишем график:

plot(t, count)

legend('Location 1','Location 2','Location 3',0)

xlabel('Time')

ylabel('Vehicle Count')

grid on

где функция plot(t, count) строит зависимости трех векторов-столбцов от времени; функция

legend('Location 1','Location 2','Location 3',0) показывает тип кривых; функции xlabel и ylabel надписывают координатные оси, а grid on выводит координатную сетку. Соответству-ющий график показан ниже.

Применим к матрице count функции max (максимальное значение), mean (среднее значение) и std (стандартное, или среднеквадратическое отклонение).

mx = max(count)

mu = mean(count)

sigma = std( count)

В результате получим

mx =

114 145 257

mu =

32.00 46.5417 65.5833

sigma =

25.3703 41.4057 68.0281

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

[mx,indx] = min(count)

mx =

7 9 7

indx =

2 23 24

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

Вы можете вычесть среднее значение из каждого столбца данных, используя внешнее произ-ведение вектора, составленного из единиц и вектора mu (вектора средних значений)

e = ones(24, 1)

x = count - e*mu

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

min(count(:))

что приводит к результату

ans =

7

Запись count(:) в данном случае привела к перегруппировке матрицы размера 24х3 в вектор-столбец размера 72х1.

Матрица ковариаций и коэффициенты корреляции

Для статистической обработки в MATLAB-е имеются две основные функции для вычисле-ния ковариации и коэффициентов корреляции:

  • cov – В случае вектора данных эта функция выдает дисперсию, то есть меру распреде-

ления (отклонения) наблюдаемой переменной от ее среднего значения. В случае

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

определяемая недиагональными элементами.

  • corrcoef – Коэффициенты корреляции – нормализованная мера линейной вероятност-ной зависимости между перменными.

Применим функцию cov к первому столбцу матрицы count

cov(count(:,1))

Результатом будет дисперсия числа машин на первом пункте наблюдения

ans =

643.6522

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

Функция corrcoef вычисляет матрицу коэффициентов корреляции для массива данных, где каждая строка есть наблюдение, а каждый столбец – переменная. Коэффициент корреляции – это нормализованная мера линейной зависимости между двумя переменными. Для некор-релированных (линейно-независимых) данных коэффициент корреляции равен нулю; экива-лентные данные имеют единичный коэффициент корреляции. Для матрицы mхn, соответст-вующая матрица коэффициентов корреляции имеет размер nхn. Расположение элементов в матрице коэффициентов корреляции аналогично расположению элементов в рассмотренной выше матрице ковариаций. Для нашего примера подсчета количества машин, при вводе

corrcoef( count)

получим

ans =

1.0000 0.9331 0.9599

0.9331 1.0000 0.9553

0.9599 0.9553 1.0000

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

Конечные разности

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

Функция

Описание

diff

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

gradient

Приближенное вычисление градиента функции.

del2

Пятиточечная аппроксимация Лапласиана.

Функция diff вычисляет разность между последовательными элементами числового вектора, то есть diff(X) есть [X(2) -X(1) X(3) -X(2) ... X(n) -X(n-1)] . Так, для вектора A ,

A = [9 -2 3 0 1 5 4];

diff(A)

MATLAB возвращает

ans =

-11 5 -3 1 4 -1

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

Применение (тест)

Описание

diff(x) == 0

Тест на определение повторяющихся элементов

all(diff(x) > 0)

Тест на монотонность

all(diff(diff(x)) == 0)

Тест на опредедление равных приращений

Обработка данных

В данном разделе рассматривается как поступать с:

  • Отсутствующими значениями
  • Выбросами значений или несовместимыми («неуместными») значениями

Отсутствующие значения

Специальное обозначение NaN, соответствует в MATLAB-е нечисловое значение. В соответ-ствие с принятыми соглашениями NaN является результатом неопределенных выражений та-ких как 0/0. Надлежащее обращение с отсутствующими данными является сложной пробле-мой и зачастую меняется в различных ситуациях. Для целей анализа данных, часто удобно использовать NaN для представления отсутствующих значений или данных которые недос-тупны . MATLAB обращается со значениями NaN единообразным и строгим образом. Эти значения сохраняются в процессе вычислений вплоть до конечных результатов. Любое мате-матическое действие, производимое над значением NaN, в результате также производит NaN. Например, рассмотрим матрицу, содержащую волшебный квадрат размера 3х3, где це-нтральный элемент установлен равным NaN.

a = magic(3); a(2,2) = NaN;

a =

8 1 6

3 NaN 7

4 9 2

Вычислим сумму элементов всех столбцов матрицы:

sum( a)

ans =

15 NaN 15

Любые математические действия над NaN распространяют NaN вплоть до конечного резуль-тата. Перед проведением любых статистических вычислений вам следует удалить все NaN-ы из имеющихся данных. Вот некоторые возможные пути выполнения данной операции.

Программа

Описание

i = find( ~ isnan(x));

x = x(i)

Найти индексы всех эементов вектора, не равных

NaN, и затем сохранить только эти элементы

x = x (find( ~ isnan(x)))

Удалить все NaN-ы из вектора

x = x ( ~ isnan(x));

Удалить все NaN-ы из вектора (быстрее).

x (isnan(x)) = [ ];

Удалить все NaN-ы из вектора

X (any(isnan(X’)), :) = [ ];

Удалить все строки матрицы X содержащие NaN-ы

Внимание. Для нахождения нечисловых значений NaN вам следует использовать специаль-ную функцию isnan , поскольку при принятом в MATLAB-е соглашении, логическое сравне-ние NaN == NaN всегда выдает 0. Вы не можете использовать запись x(x==NaN) = [ ] для удаления NaN-ов из ваших данных.

Если вам часто приходится удалять NaN-ы, воспользуйтесь короткой программой, записан-ной в виде М-файла.

function X = excise(X)

X(any(isnan(X')),:) = [ ];

Тогда. напечатав

X = excise(X);

вы выполните требуемое действие (excise по английски означает вырезать )

Удаление выбросов значений

Вы можете удалить выбросы значений или несовместимые данные при помощи процедур, весьма схожих с удалением NaN-ов. Для нашей транспортной задачи, с матрицей данных count , средние значения и стандартные (среднеквадратические) отклонения каждого столбца матрицы count равны

mu = mean(count)

sigma = std(count)

mu =

32.0000 46.5417 65.5833

sigma =

25.3703 41.4057 68.0281

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

[n, p] = size(count)

outliers = abs(count - mu(ones(n, 1),:)) > 3*sigma(ones(n, 1),:);

nout = sum( outliers)

nout =

1 0 0

Имеется только один выброс в первом столбце. Удалим все наблюдение при помощи выра-жения

count( any( outliers'),:) = [ ];

Регрессия и подгонка кривых

Часто бывает полезным или необходимым найти функцию, которая описывает взаимосвязь между некоторыми наблюдаемыми (или найденными экспериментально) переменными. Оп-ределение коэффициентов такой функции ведет к решению задачи переопределенной систе-мы линейных уравнений, то есть системы, у которой число уравнений превышает число не-известных. Указанные коэффициенты можно легко найти с использованием оператора обрат-ного деления \ (backslash ). Допустим, вы производили измерения переменной y при разных значениях времени t .

t = [0 0.3 0.8 1.1 1.6 2.3]';

y = [0.5 0.82 1.14 1.25 1.35 1.40]';

plot(t,y,'o'); grid on

В следующих разделах мы рассмотрим три способа моделирования (аппроксимации) этих данных:

  • Методом полиномиальной регрессии
  • Методом линейно-параметрической (linear-in-the-parameters) регрессии
  • Методом множественной регрессии

Полиномиальная регрессия

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

y = a 0 + a 1 t + a 2 t 2

Неизвестные коэффициенты a0 , a1 и a2 могут быть найдены методом среднеквадратичес-кой подгонки (аппроксимации) , которая основана на минимизации суммы квадратов отклоне-ний данных от модели. Мы имеем шесть уравнений относительно трех неизвестных,

представляемых следующей матрицей 6х3:

X = [ ones( size( t)) t t.^2]

X = 1.0000 0 0

1.0000 0.3000 0.0900

1.0000 0.8000 0.6400

1.0000 1.1000 1.2100

1.0000 1.6000 2.5600

1.0000 2.3000 5.2900

Решение находится при помощи оператора \ :

a = X\ y

a =

0.5318

0.9191

- 0.2387

Следовательно, полиномиальная модель второго порядка наших данных будет иметь вид

y = 0.5318 + 0.9191 t – 0.2387 t2

Оценим теперь значения модели на равноотстоящих точках (с шагом 0.1) и нанесем кривую на график с исходными данными.

T = (0 : 0.1 : 2.5)';

Y = [ones(size(T)) T T.^2]*a;

plot(T,Y,'-',t,y,'o'); grid on

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

Линейно-параметрическая регрессия[1]

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

y = a 0 + a 1 - t + a 2 t - t

Здесь также, неизвестные коэффициенты a0 , a1 и a2 могут быть найдены методом наимень-ших квадратов . Составим и решим систему совместных уравнений, сформировав регресси-онную матрицу X , и применив для определения коэффициентов оператор \ :

X = [ones(size(t)) exp(- t) t.*exp(- t)];

a = X\ y

a =

1.3974

- 0.8988

0.4097

Значит, наша модель данных имеет вид

y = 1.3974 – 0.8988 - t + 0.4097 t - t

Оценим теперь, как и раньше, значения модели на равноотстоящих точках (с шагом 0.1) и на-несем эту кривую на график с исходными данными.

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

Множественная регрессия

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

x1 = [0.2 0.5 0.6 0.8 1.0 1.1]' ;

x2 = [0.1 0.3 0.4 0.9 1.1 1.4]' ;

y = [0.17 0.26 0.28 0.23 0.27 0.24]' ;

Множественную модель данных будем искать в виде

y = a 0 + a 1 x 1 + a 2 x 2

Методы множественной регрессии решают задачу определения неизвестных коэффициентов a0 , a1 и a2 путем минимизации среднеквадратической ошибки приближения. Составим сов-местную систему уравнений, сформировав матрицу регрессии X и решив уравнения отно-сительно неизвестных коэффициентов, применяя оператор \ .

X = [ones(size(x1)) x1 x2];

a = X\ y

a =

0.1018

0.4844

-0.2847

Следовательно, модель дающая минимальную среднеквадратическую ошибку аппроксима-ции имеет вид

y = 0.1018 + 0.4844x1 – 0.2847x2

Для проверки точности подгонки найдем максимальное значение абсолютного значения от-клонений экспериментальных и расчетных данных.

Y = X*a;

MaxErr = max(abs(Y - y))

MaxErr =

0.0038

Эта ошибка дает основание утверждать, что наша модель достаточно адекватно отражает ре-зультаты наблюдений.

Графический интерфейс подгонки кривых

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

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

Основываясь на ваших конкретных задачах и приложениях, вы можете использовать ИПК, возможности, предоставляемыми командным окном, или же комбинировать эти две возмож-ности. Отметим, что ИПК предназначен только для работы с одномерными и двумерными данными.

Рассмотрение основных свойств ИПК

Общий вид ИПК показан ниже.

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

  1. Построить какой либо график данных.
  2. Выбрать опцию Basic Fitting из меню Tools вашего графического окна.
  3. Нажать дважды на кнопку More в нижней части ИПК. В результате откроется окно c тремя панелями (см. рисунок), а сама надпись заменится на Less .

Рассмотрим основные опции ИПК.

Select data (Выбор данных) – В данном окне расположен список всех переменных, построен-ных на активном графике, с которым связан ИПК (на графике может быть построено неско-лько кривых). Используйте данный список для выбора требуемого (текущего) набора дан-ных. Под текущим подразумевается тот набор данных, для которого вы хотите осуществить подгонку. За один раз вы можете осуществлять действия только с одним набором данных. С другой стороны, вы можете произвести различные подгонки для текущего набора данных за счет изменения названия этих данных. С этой целью можно воспользоваться так называемым Редактором Графиков (Plot Editor), который будет рассмотрен в дальнейшем.

Center and scale X data (Центрирование и масштабирование данных X ) – Если данная опция выбрана, то данные центрируются (нуль переносится в среднее значение данных) и масшта-бируются к единичному стандартному отклонению (делятся на исходное стандартное откло-нение). Это может потребоваться для повышения точности последующих математических вычислений. Если подгонка приводит к результатам, которые могут быть неточными, соот-ветствующее предупреждение выводится на экран.

Plot fits (Подгонка кривых) – Эта панель позволяет визуально просмотреть результаты одной или более подгонок текущего набора данных.

  • Check to display fits on figure (Отметьте методы для вывода на график) – Выберите методы подгонок, которые вы хотели бы использовать и вывести на график. Здесь имеются две основные возможности – выбор интерполянтов и выбор полиномов. Сплайновый интерполянт использует для аппроксимации сплайны, тогда как эрми-товый интерполянт использует специальную функцию pchip (Piecewise Cubic Hermite Interpolating Polynomial - Кусочно-кубический Эрмитовый Интерполяционный Поли-ном). Полиномиальная подгонка использует функцию polyfit . Вы можете одновре-менно выбрать любые методы подгонки для аппроксимации ваших данных. Если ваш набор данных содержит N точек, вам следует использовать для аппроксимации поли-номы с не более чем N коэффициентами. В противном случае, ИПК автоматически приравнивает избыточное число коэффициентов нулю, что приводит к недоопреде-ленности системы. Укажем, что при этом на дисплей выдается соответствующее сооб-щение.
  • Show equations (Показать уравнения) – При выборе данной опции, уравнение подгон-ки выводится на ваш график.
  • Significant digits (Значащие разряды) – Выберите число значащих разрядов для выво-да на дисплей.
  • Plot residuals (Построить графики разностей (невязок)) – При выборе данной опции, на график выводятся разности подгонок. Под разностью подгонки понимается раз-ность между исходными данными и результатами подгонки для каждого значения ар-гумента исходных данных. Вы можете построить графики невязок как столбчатую ди-аграмму (bar plot), как график рассеяния (scatter plot), или же как линейный график. Построения можно осуществлять как в том же графическом окне, так и в отдельном. При использовании подграфиков (subplots) для построения графиков многомерных данных, графики разностей могут быть построены только в отдельном графическом окне.
  • Show norm of residuals (Показать норму разностей) – При выборе опции, на график выводятся также значения норм разностей. Норма разности является мерой качества подгонки, где меньшее значение нормы соответствует лучшему качеству. Норма рас-считывается при помощи функции norm(V,2) , где V есть вектор невязок.

Numerical results (Численные результаты) – Данная панель позволяет изучать численные характеристики каждой отдельной подгонки для текущего набора данных, без построения графиков.

  • Fit (Метод подгонки) – Выберите метод подгонки. Соответствующие результаты бу-дут представлены в окне под меню выбора метода. Заметим, что выбор метода в дан-ной панели не оказывает воздействия на панель Plot fits . Поэтому, если вы хотите по-лучить графическое представление, следует выбрать соответствующую опцию в пане-ли Plot fits .
  • Coefficients and norm of residuals (Коэффициенты и норма невязок) – В данном окне выводятся численные выражения для уравнения подгонки, выбранного в Fit . Отме-тим, что при первом открытии панели Numerical Results , в рассматриваемом окне выдаются результаты последней подгонки, выбранной вами в панели Plot fits .
  • Save to workspace ( Запомнить в рабочем пространстве) – Вызывает диалоговое окно, которое позволяет запомнить в рабочем пространстве результаты вашей подгонки.

Find Y = f(X) – Данная панель дает возможность произвести интерполяцию или экстраполя-цию текущей подгонки.

· Enter value(s) (Введите данные) – Введите любое выражение, совместимое с систе-мой MATLAB для оценки вашей текущей подгонки в промежуточных или выходя-щих за пределы заданных аргументов точек. Выражение будет вычислено после на-жатия кнопки Evaluate (Вычислить), а результаты в табличной форме будут выве-дены в соответствующее окно ниже. Метод текущей подгонки при этом указан в ме-ню Fit .

· Save to workspace ( Запомнить в рабочем пространстве) – Вызывает диалоговое окно, которое позволяет запомнить в рабочем пространстве результаты вашей интерполя-ции.

· Plot results (Построить графики) – При выборе данной опции, результаты интерполя-выводятся в графической форме на график данных.

Уравнения в конечных разностях и фильтрация

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

Функция

y = filter(b, a, x)

обрабатывает данные в векторе x посредством фильтра, описываемого векторами a и b , вы-давая фильтрованные данные y . Функция filter может рассматриваться как эффективная реа-лизация уравнения в конечных разностях. Структура функции filter является обобщенной структурой фильтра, образованного при помощи линий задержки, который описывается приведенными ниже уравнениями в конечных разностях, где n есть индекс (номер) текущей выборки, na есть порядок полинома, описываемого вектором a , а nb есть порядок полино-ма,описываемого вектором b . Выход y(n) является линейной комбинацией текущего и пре-дыдущих входов, то есть x(n) x(n-1) ..., и предыдущих выходов y(n-1) y(n-2) ...

a(1) y(n) = b(1) x(n) + b(2) x(n-1) + … + b(nb) x(n-nb+1) –

- a(2) y(n-1) - … - a(na) y(n-na+1)

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

y(n) = (1/4) x(n) + (1/4) x(n-1) + (1/4) x(n-2) + (1/4) x(n-3)

Соответствующие векторы равны:

a = 1; b = [1/4 1/4 1/4 1/4];

Воспользуемся данными матрицы count из раздела Анализ данных и статистика. Для на-шего примера, обозначим первый столбец матрицы count через вектор x :

x = count (:, 1);

Усредненные за 4 часа данные могут быть легко вычислены при помощи приведенной выше функции y = filter(b, a, x). Сравним исходные и сглаженные данные, построив их на одном графике.

t = 1:length(x) ;

plot(t, x, '-.', t, y, '-'); grid on

legend('Original Data','Smoothed Data',2)

Исходные данные наблюдения представлены здесь штрих-пунктирной линией, а сглаженные за 4 часа данные – сплошной линией.

Для различных практических приложений, в специальном пакете Signal Processing Toolbox предусмотрены многочисленные функции для анализа сигналов и проектирования дискрет-ных фильтров.

Многомерные Массивы

Многомерные массивы в системе MATLAB являются распространением обычных двумерных матриц. Как известно, матрицы имеют две размерности – строки (row) и столбцы (column).

Вы можете выделить любой элемент двумерной матрицы при помощи двух индексов, где первый является индексом (номером) строки, а второй – индексом столбца. Многомерные массивы имеют дополнительную индексацию. Например, трехмерные массивы имеют три индекса:

  • Первый индекс указывает размерность 1 , то есть строки.
  • Второй индекс указывает размерность 2. то есть столбцы.
  • Третий индекс указывает на размерность 3. В данном пособии используется концепция страницы (page ) для представления размерности 3 и выше.

Для обращения, например, к элементу второй строки и третьего столбца на странице 2 нужно воспользоваться индексацией (2,3,2) (см. рисунок ниже).

Если вы добавляете размерности к массиву, вы также добавляете индексы. Четырехмерный массив, например, имеет 4 индекса. Первые два из них указывают на пару строка-столбец, а следующие два характеризуют третью и четвертую размерности.

Отметиим, что общие функции обращения с многомерными массивами находятся в директории datatypes.

Создание Многомерных Массивов

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

Создание массивов с использованием индексации

Один из способов формирования многомерного массива состоит в создании двумерного массива и соответствующего его расширения. Например, начнем с простого двумерного массива А .

A = [5 7 8; 0 1 9; 4 3 6];

А является массивом 3х3, то есть его размерности строк и столбцов равны трем. Для добавления третьей размерности к А запишем

A(:,:,2) = [1 0 4; 3 5 6; 9 8 7].

MATLAB выдаст

A(:, : ,1) =

5 7 8

0 1 9

4 3 6

A(:, :, 2) =

1 0 4

3 5 6

9 8 7

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

Расширение Многомерных Массивов. Для расширения любой размерности массива А нужно:

  • Увеличить или добавить соответствующий индекс и задать требуемые значения.
  • Добавить такое же количество элементов к соответствующим размерностям массива. Так, для числовых массивов все строки должны иметь одинаковое число элементов, все страницы должны иметь одинаковое число строк и столбцов и т.д.

Вы можете воспользоваться свойством скалярного распространения системы MATLAB, совместно с оператором двоеточия, для заполнения всей размерности единственным числом:

A(:, :, 3) = 5;

A(:, :, 3)

ans =

5 5 5

5 5 5

5 5 5

Для превращения А в четырехмерный массив размерности 3х3х3х2 введите

A(:, :, 1, 2) = [1 2 3; 4 5 6; 7 8 9];

A(:, :, 2, 2) = [9 8 7; 6 5 4; 3 2 1];

A(:, :, 3, 2) = [1 0 1; 1 1 0; 0 1 1];

Отметим, что после первых двух вводов MATLAB добавляет в A требуемое количество нулей, чтобы поддержать соответствующие размеры размерностей (речь идет о первом элементе по четвертой размерности, то есть при четвертом индексе равном единице, массив А будет содержать три нулевые матрицы размера 3х3).

Создание масивом с применением функций MATLAB -а.

Вы можете использовать для создания многомерных массивов такие функции MATLAB-а как randn, ones, и zeros , совершенно аналогично способу используемому для двумерных матриц. Каждый вводимый аргумент представляет размер соответствующей размерности в результирующем массиве. Например, для создания массива нормально распределенных случайных чисел размера 4х3х2 следует записать:

B = randn(4,3,2).

Для создания массива, заполненного единственным постоянным значением можно восполь-зоваться функцией repmat . Эта функция копирует массив (в нашем случае массив размера 1х1) вдоль вектора размерностей массива.

B = repmat(5,[3 4 2])

B(:, :, 1) =

5 5 5 5

5 5 5 5

5 5 5 5

B(:, :, 2) =

5 5 5 5

5 5 5 5

5 5 5 5

Внимание! Любая размерность массива может иметь размер 0, что просто дает пустой массив (empty array) . Так, размер 10х0х20 является допустимым размером многомерного массива.

Создание многомерного массива при помощи функции cat .