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

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

Факультет прикладной математики и информатики

Кафедра вычислительной математики

ЧИСЛЕННЫЕ МЕТОДЫ И ВИЗУАЛИЗАЦИЯ


ДАННЫХ В СРЕДЕ MATLAB

Методическое пособие

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


Минск-2001

2
Утверждено Советом факультета
25 сентября 2001г., протокол № 1

Авторы: Краков М.С., доктор физ.-мат. наук, профессор, БГПА;


Никифоров И.В., кандидат физ.-мат. наук, БГУ

Предназначено для студентов 3 и 4 курсов

3
ВВЕДЕНИЕ....................................................................................................................................6
КОМАНДНОЕ ОКНО...................................................................................................................7
Редактирование командной строки. ........................................................................................7
Длинные командные строки....................................................................................................7
Вывод на печать командного окна...........................................................................................8
Запуск внешних программ........................................................................................................8
Команда format...........................................................................................................................8
ВЫРАЖЕНИЯ................................................................................................................................9
Переменные................................................................................................................................9
Числа.........................................................................................................................................10
Операторы................................................................................................................................10
Функции....................................................................................................................................11
Текстовые комментарии и символьные константы..............................................................11
ОПЕРАЦИИ С РАБОЧЕЙ ОБЛАСТЬЮ...................................................................................11
ОПЕРАЦИИ С ФАЙЛАМИ........................................................................................................13
ДНЕВНИК КОМАНДНОГО ОКНА..........................................................................................14
ОПЕРАЦИИ С ВЕКТОРАМИ И МАТРИЦАМИ.....................................................................14
Оператор «двоеточие».............................................................................................................16
Векторные индексы.................................................................................................................16
Удаление строк и столбцов.....................................................................................................17
Объединение матриц...............................................................................................................17
Транспонирование матриц......................................................................................................18
Создание матриц с заданными свойствами...........................................................................18
Создание вектора равноотстоящих точек..............................................................................19
Создание вектора равноотстоящих точек в логарифмическом масштабе.........................20
Разреженные матрицы.............................................................................................................20
ГРАФИКА....................................................................................................................................21
Команда plot.............................................................................................................................22
Графические объекты..............................................................................................................24
Окна изображений...................................................................................................................25
Добавление кривых на существующий график....................................................................25
Управление осями....................................................................................................................26
Разбиение графического окна.................................................................................................27
Подписи к осям и заголовки...................................................................................................28
Графики в полярной системе координат...............................................................................28
Контурные графики и графики полей градиентов...............................................................29
Создание массивов данных для трехмерной графики..........................................................30
Построение графиков трехмерных поверхностей................................................................30
ПРОГРАММИРОВАНИЕ В СИСТЕМЕ MATLAB.................................................................32
Основные типы данных...........................................................................................................33
Арифметические операторы и массивы................................................................................33
Операторы отношения.............................................................................................................36
Логические операторы и функции.........................................................................................36
Приоритет выполнения операторов. .....................................................................................37
Структура файлов сценариев..................................................................................................38
Структура m-файлов функций................................................................................................38
Использование подфункций...................................................................................................39
Операторная функция..............................................................................................................40
Передача данных через глобальные переменные.................................................................40
Параметры функционального типа........................................................................................40
Функции с переменным числом аргументов.........................................................................41

4
Управление потоками..............................................................................................................42
Диалоговый ввод......................................................................................................................44
ЧИСЛЕННЫЕ МЕТОДЫ И ОБРАБОТКА ДАННЫХ.............................................................45
Решение систем линейных алгебраических уравнений.......................................................45
Решение систем линейных уравнений итерационными методами.....................................48
Обратная матрица и определитель.........................................................................................48
Факторизация Холецкого........................................................................................................49
LU факторизация.....................................................................................................................49
QR факторизация.....................................................................................................................50
Матричная экспонента............................................................................................................52
Собственные значения и собственные вектора....................................................................53
Нормальная форма Жордана..................................................................................................53
Разложение Шура....................................................................................................................54
Сингулярное разложение........................................................................................................55
Численное интегрирование.....................................................................................................56
Представление полиномов в среде MATLAB.......................................................................56
Умножение и деление многочленов......................................................................................56
Вычисление производной от многочлена.............................................................................57
Вычисление значения многочлена.........................................................................................57
Нахождение корней многочлена............................................................................................58
Построение многочлена по его корням. ...............................................................................58
Построение характеристического многочлена.....................................................................58
Минимизация функций...........................................................................................................58
Решение систем нелинейных уравнений...............................................................................60
Преобразование Фурье............................................................................................................61
Решение обыкновенных дифференциальных уравнений....................................................63
Численное решение дифференциальных уравнений в частных производных..................64
ЛИТЕРАТУРА.............................................................................................................................68

5
ВВЕДЕНИЕ

MATLAB – это высокопроизводительный язык для технических расчетов. Он объединяет


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

MATLAB – это интерактивная система, в которой основным элементом данных является


массив. Система позволяет решать различные задачи, связанные с техническими
вычислениями, использующими матрицы и вектора, в несколько раз быстрее, чем
позволяют такие скалярные языки программирования как C или FORTRAN.
Слово MATLAB означает матричная лаборатория (matrix laboratory). MATLAB был
специально написан для обеспечения легкого доступа к современным программным
средствам матричных вычислений - LINPACK и EISPACK. Настоящее учебно-
методическое пособие по системе MATLAB основано на программной документации
фирмы-разработчика MathWorks, Inc. Более подробное описание можно найти в
прилагаемом списке литературы [1-9], а также на сайте фирмы MathWorks, Inc.
(http://www.mathworks.com).

Система MATLAB (матричная лаборатория) состоит из пяти основных частей:

Среда программирования MATLAB представляет собой набор инструментов и


мощных программных средств подготовки, редактирования и отладки приложений.
Язык MATLAB – это язык высокого уровня с управлением потоками, функциями,
структурами данных, вводом-выводом и особенностями объектно-ориентированного
программирования.
Графическая система MATLAB включает в себя команды высокого и низкого
уровней. Первые используются для визуализации двух- и трехмерных данных, обработки
изображений, анимации и иллюстрированной графики. Вторые позволяют редактировать
внешний вид графики и создавать графический интерфейс пользователя в MATLAB
приложениях.
Библиотека математических функций MATLAB представляет обширную коллекцию
алгоритмов вычисления как элементарных функций типа синус, косинус, сумма, операции
с комплексными числами, так и функций более сложных – обращение матриц,
нахождение собственных значений, быстрое преобразование Фурье.
Программный интерфейс – библиотека, позволяющая писать программы на C и
FORTRAN, которые взаимодействуют с MATLAB. Позволяет вызывать программы из
MATLAB (динамическая связь), вызывать MATLAB как вычислительный инструмент,
читать-записывать MAT-файлы.

При запуске MATLAB выводит на экран свой рабочий стол (desktop), который можно
рассматривать как панель следующих инструментов:
• Command Window – командное окно, служит для выполнения функций;
• Command History – список выполненных ранее функций;
• Launch Pad – панель инструментов, которые не входят в рабочий стол;

6
• Current Directory Browser – просмотр файловой структуры;
• Help Browser – справка, просмотр и поиск документации ;
• Workspace Browser – просмотр рабочей области;
• Array Editor- редактор массивов;
• Editor/Debugger – редактор/отладчик M-файлов (файлы с программным кодом).

КОМАНДНОЕ ОКНО

Командное окно используется для ввода переменных, выполнения функций и M-


файлов. Для выполнения команд используется клавиша Enter. Результаты вычислений
MATLAB также выдает в командное окно. Работу любой программы можно прервать
по команде Ctrl+c или Ctrl+Break.

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


Различные стрелки и управляющие клавиши клавиатуры позволяют вызывать,
редактировать и многократно использовать команды, набранные ранее. Например, на ввод
ошибочного оператора
rho = (1 + sqt(5))/2

MATLAB выдает предупреждение

Undefined function or variable 'sqt' –

неопределенная функция или переменная ‘sqt’. Ошибка в написании имени функции,


вычисляющей квадратный корень – sqrt. Вместо повторного набора строки следует
просто нажать клавишу ↑. В командной строке появится предыдущая команда с ошибкой.
Исправить ошибку можно с помощью клавиш перемещения курсора ← и →. Повторное
нажатие клавиши ↑ вызовет предыдущие строки, а нажатие клавиши ↓ – последующие
строки. Наберите несколько символов, и тогда клавиша ↑ найдет предыдущую строку,
которая начинается с них.
Если набрать несколько первых символов имени переменной, функции, файла или
графического указателя и нажать клавишу Tab, то MATLAB проведет поиск по
набранному фрагменту и выполнит подстановку полного имени, если оно единственное.
В противном случае, надо еще раз нажать Tab и просмотреть полный список имен,
начинающихся с данного фрагмента текста.
Для редактирования командной строки можно использовать также следующие клавиши:
• Home – переход на начало строки;
• End – переход на конец строки;
• Esc – очистка строки;
• Delete – удаление символа за курсором;
• Backspace – удаление символа перед курсором.

При работе с командным окном можно использовать операции правки из меню Edit:
Cut – вырезать, Copy – копировать, Paste – вставить, Undo- отменить ввод, и Redo –
повторить ввод.
Для очистки командного окна можно использовать команду clc.

Длинные командные строки.

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


Enter:

7
S = 1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 + 1/7 + …
1/8 + 1/9 + 1/10 + 1/11 + 1/12;
Пробелы между отдельными операндами добавлены для лучшего восприятия текста
выражения и не влияют на конечный результат.
Если вы хотите сначала набрать ряд команд, занимающих много строк, и только
потом их выполнить, следует каждую строку, кроме последней, оканчивать вводом
Shift+Enter. Затем надо нажать Enter и выполнить все команды. Для ввода
нескольких команд в одной строке в конце каждой команды следует ставить точку с
запятой:

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

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

Управление выводом данных на экран.


Если вы наберете в командной строке выражение и нажмете клавишу Enter, MATLAB
выдаст результат на экран. Для отмены вывода данных на экран в конце выражения
следует ставить точку с запятой (как в языке Паскаль). Это требуется, например, при
создании больших матриц:
A = magic(100);

Большой объем выводимых в командное окно данных можно просмотреть, если


предварительно задать режим постраничного вывода командой more on. После вывода
первой страницы данных, переход к последующим страницам происходит при нажатии
клавиши Space Bar (пробел), переход к следующей строке – при нажатии Enter,
отмена вывода – при нажатии клавиши q. Отмена постраничного вывода происходит по
команде more off (данный режим используется по умолчанию).

Вывод на печать командного окна.


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

Запуск внешних программ.


Вызов внешних приложений из командной строки можно выполнять, используя в качестве
префикса перед именем программы знак восклицания. Например, системная программа
«Блокнот» вызывается по команде
!notepad
После завершения работы внешней программы операционная система передает контроль
MATLAB.

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

format short; pi
ans = 3.1416

format short e; pi
ans = 3.1416+000

8
format short g; pi
ans = 3.1416+000

format long; pi
ans = 3.14159265358979

format long e; pi
ans = 3.14159265358979+000

format long g; pi
ans = 3.14159265358979+000

format hex; pi
ans = 400921fb54442d18

format rat; pi
ans = 355/113

Если вводимое выражение не присваивается переменной MATLAB, то для него


автоматически генерируется переменная ans (ответ). Значение текущего формата
можно узнать по команде get(0,’Format’).

ВЫРАЖЕНИЯ

Как и другие языки программирования, MATLAB предоставляет возможность


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

Переменные.
MATLAB не требует описания типа переменных или размерности. Когда MATLAB
встречает новое имя переменной, он автоматически создает переменную и отводит
соответствующий объем памяти. Если переменная уже существует, MATLAB изменяет ее
значение, а при необходимости и ее тип. Имена переменных состоят из букв, цифр или
символов подчеркивания. Первым символом в имени должна быть буква. Число символов
в имени не более 31. MATLAB различает заглавные и строчные буквы, поэтому Abc и
аbc – это разные переменные. Чтобы увидеть значение переменной, надо просто ввести
ее имя и нажать Enter. В памяти компьютера переменные занимают определенное место,
называемое рабочим пространством (workspace). Для уничтожения всех переменных в
рабочем пространстве используется команда clear без аргументов. В качестве
аргументов указываются имена переменных, которые надо удалить. Например, команда
clear аbc, а уничтожает переменные аbc и а.
Ряд переменных генерируется системой при ее загрузке. Такие переменные принято
называть системными. Приведем список основных системных переменных:

pi 3.14159265...
i корень из -1
j аналогично i

9
eps относительная точность числа с плавающей точкой, 2-52
realmin наименьшее число с плавающей точкой, 2-1022
realmax наибольшее число с плавающей точкой, (2-ε )1023
Inf бесконечность
NaN не число

Бесконечность появляется при делении на нуль или при выполнении математического


выражения, приводящего к переполнению, т.е. к превышению realmax. Не число –
NaN генерируется при вычислении выражений типа 0/0, или Inf – Inf, которые не
имеют определенного математического смысла.
Имена функций не являются зарезервированными, поэтому можно изменять их значения,
например,
eps = 1.e-6

Далее можно использовать это значение в последующих вычислениях. Начальное


значение системной переменной может быть восстановлено командой clear:
clear eps.

Числа.
MATLAB использует десятичную систему счисления с необязательной десятичной точкой
и знаками плюс-минус. Формат с плавающей точкой использует букву e для определения
множителя степени десяти. Мнимые числа используют i или j как суффикс. Функция
real(z)возвращает действительную часть комплексного числа z , а функция imag(z) –
мнимую. Для получения модуля комплексного числа используется функция abs(z), а
для вычисления фазы – angle(z). Примеры правильной записи чисел:

3 -99 0.0001
9.6397238 1.60210e-20 6.02252e23
1i -3.14159j 3e5i
Все числа для хранения используют формат long,определенный стандартом плавающей
точки IEEE. Числа с плавающей точкой обладают ограниченной точностью –
приблизительно 16 значащих цифр и ограниченным диапазоном – приблизительно от
10-308 до 10+308 .

Операторы.
Выражения используют обычные арифметические операции и правила старшинства.
+ сложение
– вычитание
* умножение
/ деление
\ левое деление
^ степень
‘ комплексно-сопряженное транспонирование
() определение порядка вычисления
Полный список операторов можно получить, используя команду help ops.
Следует отметить, что многие операторы умеют работать с векторами и матрицами, т.е.
являются матричными. Рассмотрим пример с экспонентой.
v=[1 2 3]; exp(v)
ans =
2.7183 7.3891 20.0855

10
Функции.
MATLAB предоставляет большое количество элементарных математических функций,
таких как abs, sqrt, exp, sin и др. Вычисление квадратного корня или логарифма
отрицательного числа не является ошибкой: в этом случае результатом является
соответствующее комплексное число. MATLAB также предоставляет и более сложные
Функции, включая Гамма-функцию и функции Бесселя. Большинство из этих функций
имеют комплексные аргументы. Для вывода списка всех элементарных математических
функций следует выполнить команду help elfun. Перечень более сложных
математических и матричных функций можно получить по командам help specfun
и help elmat соответственно. Некоторые функции, такие как sqrt и sin, являются
встроенными. Они являются частью MATLAB и очень эффективны, но код их реализации
недоступен. Другие функции, такие как gamma и sinh, реализованы в М-файлах.
Поэтому можно легко просмотреть их код и, при необходимости, модифицировать его.
Приведем несколько примеров использования выражений в MATLAB вместе с
результатами выполнения:

rho = (1+sqrt(5))/2
rho =
1.6180
a = abs(3+4i)
a =
5
z = sqrt(besselk(4/3,rho-i))
z =
0.3730+ 0.3214i
huge = exp(log(realmax))
huge =
1.7977e+308
toobig = pi*huge
toobig =
Inf

Текстовые комментарии и символьные константы.


Текстовые комментарии вводятся с помощью символа %, например:
% magic(N) создает магический квадрат для всех N > 2.
Комментарии обычно используются для пояснения программного кода в m-файлах.
Обычно первые строки m-файлов служат для описания их назначения, которое выводится
на экран командой help имя_файла. Например, help magic.
Символьная константа – это цепочка символов, заключенных в апострофы, например:
‘текстовый комментарий’.

ОПЕРАЦИИ С РАБОЧЕЙ ОБЛАСТЬЮ

Сеанс работы с MATLAB принято именовать сессией (session). Сессия отражает работу
пользователя с системой. В ней имеются строки ввода-вывода и сообщения об ошибках.
Переменные и определения новых функций в системе MATLAB хранятся в особой
области памяти – рабочей области. MATLAB позволяет сохранять значения переменных в
виде бинарных файлов с расширением mat с помощью команды save:
save filename – рабочая область сохраняется в файле filename.mat,
save filename x y – записываются только переменные x и y.
После параметров команды save можно указать ключи, уточняющие формат записи
файлов:
11
• –mat – двоичный формат, используемый по умолчанию;
• –ascii – ASCII формат одинарной точности (8 цифр);
• –ascii –double – ASCII формат двойной точности (16 цифр);
• –append – добавление в существующий mat–файл.

При необходимости можно сохранить не только рабочую область, но и весь текст сессии
со всеми сообщениями с помощью команды diary:
diary filename – запись на диск ввода-вывода в тестовый файл с именем filename,
diary off – приостанавливает запись в файл,
diary on – возобновляет запись в файл.

Для просмотра текстового файла в командном окне следует использовать команду type,
например, type fname.txt.

Для загрузки сохраненной ранее рабочей области используется команда load с теми же
ключами, что и у команды save. Операции с рабочей областью можно выполнять не
только из командной строки, но и с помощью окна броузера рабочей области. Достаточно
щелкнуть по нему правой кнопкой мыши и выбрать из контекстного меню требуемую
команду. Например, для загрузки рабочей области выбираем из контекстного меню
команду Import Data и из диалогового окна выбираем нужный m–файл.

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


других приложений. Рассмотрим программный код из DELPHI, который записывает
трехмерный массив действительных чисел в двоичный файл с именем t.dat.

FileHandle:=FileCreate(‘t.dat’);
for k:=1 to 21 do
for i:=1 to 21 do
for j:=1 to 21 do
FileWrite(FileHandle,T[i,j,k],SizeOf(double));
FileClose(FileHandle);

Для ввода записанных данных в рабочую область MATLAB достаточно выполнить


команды:

fid=fopen('t.dat');
T=fread(fid,inf,'double');
fclose(fid);
T=reshape(T,21,21,21);

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


реляционных баз данных, а также экспортировать свои данные в таблицы баз данных.

Окно просмотра ресурсов позволяет просматривать существующие в памяти объекты,


редактировать их содержимое и удалять из памяти. Для вывода содержимого объекта
следует выделить его имя и щелкнуть на кнопке Open Selection. Объект можно
открыть и двойным щелчком на его имени в списке. Откроется окно редактора массива
(Array Editor). В этом окне надо щелкнуть на ячейке, содержимое которой следует
отредактировать и ввести новое значение. Окно редактора позволяет также изменять
размерность массивов и численный формат.

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

ОПЕРАЦИИ С ФАЙЛАМИ

Файловые операции используют текущий каталог в качестве отправной точки.


Любой файл, который вы собираетесь использовать, должен либо находиться в текущем
каталоге, либо входить в маршрут поиска. MATLAB использует маршрут поиска,
упорядоченный список директорий, для того, чтобы определить, как выполнять функции,
которые вы вызываете. Когда вызывается стандартная функция, MATLAB исполняет
первый m-файл на своем пути, который имеет заданное имя. Маршрут поиска можно
изменить командами addpath и setpath или, что более удобно, вызвать диалоговое
окно настройки путей файловой системы командой Set Path из меню File . В
командном режиме пути файловой системы выводятся с использованием функции path .

Основным инструментом для работы с файлами является броузер файловой системы.


Открыть и закрыть окно броузера можно выбрав опцию Current Directory из меню
View.
Проще всего определить или изменить текущий каталог можно с помощью поля со
списком Current Directory, которое располагается в верхней части броузера.
Сделать новый каталог текущим можно одним из следующих способов:
• ввести в поле Current Directory путь к новому каталогу и нажать Enter;
• щелкнуть кнопку на поле Current Directory и выбрать каталог из списка;
• щелкнуть кнопку просмотра (…) и выбрать новый каталог.

Броузер позволяет добавлять каталоги в перечень путей MATLAB. Для этого надо
щелкнуть правой кнопкой на окне броузера и выбрать из контекстного меню пункт Add
to Path и сделать выбор из перечня:
• Current Directory – добавить текущий каталог к списку путей;
• Selected Folders – добавить каталог, выбранный с помощью броузера, к
списку путей;
• Selected Folder and Subfolders – добавляет вместе с каталогом все
его подкаталоги к списку путей.

Отфильтровать файлы в окне просмотра по их типу можно с помощью операции File


Filter контекстного меню броузера или пункта Current Directory Filter из
меню View. Например, можно вывести в окно броузера только m-файлы.

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


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

Создать новый файл в текущем каталоге можно, выбрав в контекстном меню пункт New
а затем M-file. По умолчанию файл получает имя Untitled.m, которое можно
заменить на желаемое.

Новый каталог создается аналогично, выбором New -> Folder из контекстного меню.
Новая папка получает по умолчанию имя NewFolder, которое можно отредактировать.

13
Файлы в текущем каталоге можно переименовать, вырезать или удалить с помощью
команд Rename, Cut и Delete соответственно. Для копирования и вставки файлов
следует использовать команды Copy и Paste.

Файлы можно открыть для просмотра командой Open из контекстного меню или двойным
щелчком на имени. Для запуска m-файла, его надо выделить и выбрать команду Run из
контекстного меню.

Поиск файла по фрагменту текста, а также поиск с заменой в текущем каталоге можно
провести, если щелкнуть на кнопке с изображением бинокля (Find in Files). В
открывшейся странице поиска находим поле Find what и вводим текст поиска, после
чего нажимаем кнопку Поиск (Find). Имена найденных файлов выводятся в нижнюю
часть страницы поиска. Причем каждая строка кроме имени найденного файла содержит
также номер строки, содержащей образец поиска, и текст этой строки.
Для замены фрагмента текста в одном из найденных файлах, надо его открыть двойным
щелчком, затем в поле со списком Look in выбрать его имя. В результате кнопки
Replace и Replace All в окне поиска станут доступными, можно заполнить поле
Replace with текстом замены и провести полную или частичную замену.

ДНЕВНИК КОМАНДНОГО ОКНА

Просмотреть выполненные ранее команды текущей сессии, а также предшествующих


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

• Delete Selection – удаление выделенной строки;


• Delete to Selection – удаление всех строк перед выделенной;
• Delete Entire History – полная очистка дневника.

Для очистки дневника можно также выполнить команду Clear Command History из
меню Edit. Сделав двойной щелчок на записи дневника можно выполнить
соответствующую команду. Например, двойной щелчок на записи edit myfile
откроет файл myfile.m в режиме редактора. Строчки из дневника можно копировать и
переносить в командное окно с помощью команд Copy и Past контекстного меню. Окно
дневника выводится и убирается командой Command History из меню View.

ОПЕРАЦИИ С ВЕКТОРАМИ И МАТРИЦАМИ

Матрицы представляют собой самые распространенные объекты системы MATLAB,


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

Рассмотрим способы построения матриц. В следующих примерах вектор–столбец


является матрицей размером 3x1, вектор–строка является матрицей размером 1x3, а
скаляр матрицей 1x1:

14
u = [3; 1; 4]
u =
3
1
4

v = [2 0 -1]
v =
2 0 -1
s = 7
s =
7

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

M = [1 2 3; 4 5 6; 7 8 9];

задает квадратную матрицу, которую можно вывести, набрав в командной строке M и


нажав клавишу Enter:
M=
123
456
789

В качестве элементов матриц можно использовать арифметические выражения, например:

V = [2+3*5 exp(2) sqrt(2)]


V =
17.0000 7.3891 1.4142

Для указания отдельного элемента матрицы используются индексы. Элемент в строке I и


столбце J матрицы A обозначается A(I, J). Если элементу A(2, 3) надо присвоить
значение 10, следует ввести команду:

A(2, 3)=10;

Выражение M(I) с одним индексом дает доступ к элементам матрицы развернутым в


один столбец. В этом случае массив рассматривается как длинный вектор,
сформированный из столбцов исходной матрицы. Так, для рассмотренного ранее примера
с матрицей M, M(4)– это другой способ ссылаться на значение 2, хранящееся в M(1, 2).
Если попытаться использовать значение элемента вне матрицы, MATLAB выдаст ошибку:

M(4, 2)
??? Index exceeds matrix dimensions.

Однако, если элементу матрицы с индексами, превышающими ее размерность, присвоить


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

M(2, 5)= 1
M =
1 2 3 0 0

15
4 5 6 0 1
7 8 9 0 0

Оператор «двоеточие».
Двоеточие – это один из наиболее важных операторов MATLAB. Он используется в
различных выражениях. Для создания вектор–строки с целочисленными компонентами от
1 до 10 достаточно выполнить команду:

M = 1:10
M =
1 2 3 4 5 6 7 8 9 10

Для получения обратного интервала, введем приращение:

M = 100:-7:50
M =
100 93 86 79 72 65 58 51

или

M = 0:pi/4:pi
M =
0 0.7854 1.5708 2.3562 3.1416

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


векторов, матриц и многомерных массивов:

• M(:, J) – это J-й столбец из M;


• M(I, :) – это I-я строка из M;
• M(:, :) – это матрица M;
• M(J:K) – это M(J), M(J+1),…, M(K);
• M(:, J:K) – это M(:, J), M(:, J+1),…, M(:, K);
• M(:, :, K) – это K-я страница трехмерного массива M;
• M(I, J, K, :) – вектор, выделенный из четырехмерного массива M. Вектор включает
элементы M(I, J, K, 1), M(I, J, K, 2), M(I, J, K, 3) и т.д.;
• M(:) записывает все элементы массива M в виде столбца.

Векторные индексы.
Из предыдущего примера следует, что в качестве индексов могут использоваться векторы.
Если X и V векторы, то X(V) можно представить как вектор [X(V(1)), X(V(2)),…,
X(V(n))]. Элементы вектора V должны быть целыми числами, чтобы их можно было
использовать как индексы элементов массива X. Ошибка выдается в том случае, если
индекс элемента меньше единицы или больше, чем size(X). Такой же принцип
индексирования действителен и для матриц. Если вектор V имеет m компонент, а вектор W
– n компонент, то M(V, W) будет матрицей размером mxn, сформированной из элементов
матрицы M, индексы которой – элементы векторов V и W.
Векторные индексы можно использовать в операциях присваивания, например:
M(I, J) = B присваивает значения массива B элементам прямоугольной подматрицы M,
которые определяются векторами I и J. Массив B должен иметь length(I) строк и

16
length(J) столбцов. В следующем примере векторный индекс используется для
перестановки 2 и 3 столбцов матрицы B, результат помещается в матрицу A:
A = B(:, [1 3 2 4]);

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


Строки и столбцы матрицы можно удалить, используя пустые квадратные скобки [].
Создадим магическую матрицу размером 4x4 :

M=magic(4)
M =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1

Затем удалим второй столбец:

M(:, 2) = []
M =
16 3 13
5 10 8
9 6 12
4 15 1

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

M(2:2:10) = []
M =
16 9 3 6 13 12 1

Объединение матриц.
Объединение матриц – это процесс соединения нескольких матриц в одну большую.
Фактически, исходная матрица создается объединением ее отдельных элементов.
Оператор объединения – это пара квадратных скобок. Так, [A, B] – горизонтальная
конкатенация (объединение) матриц A и B, которые должны иметь одинаковое количество
строк. Горизонтальная конкатенация может быть применена для любого числа матриц в
пределах одних скобок: [A, B, C]. При вертикальной конкатенации матрицы в
квадратных скобках разделяются точкой с запятой: [A; B; C]. Горизонтальная и
вертикальная конкатенации могут использоваться одновременно.
Приведем пример:

M=[1 2; 3 4]
M =
1 2
3 4

B=[M M+4; M+6 M+2]


B =
1 2 5 6
3 4 7 8

17
7 8 3 4
9 10 5 6

Транспонирование матриц.
Матрицы можно транспонировать с помощью оператора ‘ (апостроф), например A’ –
транспонированная матрица A. Для комплексных матриц транспонирование дополняется
комплексным сопряжением. Строки транспонированной матрицы соответствуют
столбцам исходной матрицы.

Создание матриц с заданными свойствами.


Для создания единичной матрицы служит функция eye:
• eye(n) – возвращает единичную матрицу размером nxn;
• eye(m, n) – возвращает матрицу размером mxn с единицами на главной
диагонали;
• eye(size(A)) – возвращает единичную матрицу того же размера, что и A.
Пример использования функции eye:

M = eye(4, 5)
M =
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0

Для создания матриц, все элементы которых – единицы, используется функция ones:
• ones(n) – возвращает матрицу размером nxn, все элементы которых – единицы;
• ones(m, n) – возвращает матрицу размером mxn, состоящую из единиц;
• ones(d1, d2, d3,…) – возвращает массив из единиц с размером d1xd2xd3,…;
• ones(size(A)) – возвращает массив единиц такой же размерности, что и A.
Пример:

M = ones(3, 4)
M =
1 1 1 1
1 1 1 1
1 1 1 1

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

Создавать матрицы с заданными диагональными элементами позволяет функция diag:


• X = diag(v,k) – для вектора v, состоящего из n компонент, возвращает
квадратную матрицу X порядка n + abs(k) с элементами v на k-й диагонали,
при k = 0 это главная диагональ, при k > 0 – одна из верхних диагоналей, при k < 0
– одна из нижних диагоналей. Остальные элементы матрицы – нули;
• X = diag(v) – помещает вектор v на главную диагональ;
• V = diag(X, k) – для матрицы X возвращает вектор-столбец, состоящий из
элементов k-й диагонали матрицы X;
• V = diag(X) – возвращает главную диагональ матрицы X.

18
Для создания матриц, состоящих из других матриц, служат следующие функции:
• repmat(A, m, n) возвращает матрицу A, состоящую из mxn копий матрицы A;
• repmat(A, n) возвращает матрицу A, состоящую из nxn копий матрицы A;
• repmat(A, [m n p…]) возвращает многомерный массив, состоящий из копий
матрицы A. Матрица A может быть многомерной;
• repmat(a, m, n) возвращает матрицу размером mxn со значениями элементов,
заданных скаляром a.
Пример:
A=[1 2; 3 4]

A =
1 2
3 4

repmat(A, 2, 3)
ans =
1 2 1 2 1 2
3 4 3 4 3 4
1 2 1 2 1 2
3 4 3 4 3 4

• reshape(A, m, n) возвращает матрицу размером mxn, сформированную из A


путем последовательной выборки по столбцам. Если число элементов A не равно
mxn, то выдается сообщение об ошибке;
• reshape(A, m, n, p,…) возвращает N-мерный массив с элементами из A, но
имеющий размер mxnxp…равный prod(size(A));
• reshape(A, v) возвращает N-мерный массив с элементами из A, но
перестроенный к размеру, заданному вектором v.
Пример:

M=1:6
M =
1 2 3 4 5 6

A=reshape(M, 2, 3)
A =
1 3 5
2 4 6

Создание вектора равноотстоящих точек.


Функция linspace формирует линейный массив равноотстоящих узлов. Формы
применения:
• linspace(a, b) формирует линейный массив из 100 точек, равномерно
распределенных на отрезке от a до b;
• linspace(a, b, n) формирует линейный массив из n точек, равномерно
распределенных на отрезке от a до b;
Пример:

M = linspace(1, 2, 5)

19
M =
1.0 1.2500 1.5000 1.7500 2.0000

Создание вектора равноотстоящих точек в логарифмическом масштабе.


Функция logspace генерирует вектор равноотстоящих в логарифмическом масштабе
точек. Формы применения:
• logspace(a, b) формирует вектор-строку из 50 равноотстоящих в
логарифмическом масштабе точек между декадами 10a и 10b;
• logspace(a, b, n) возвращает n точек между декадами 10a и 10b;
• logspace(a, pi) возвращает точки в интервале между 10a и π .

Все аргументы функции logspace должны быть скалярными величинами.

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

• [B, d] = spdiags(A) создает разреженную матрицу B, столбцами которой


являются ненулевые диагонали матрицы A. Вектор d содержит номера ненулевых
диагоналей;
• B = spdiags(A, d) создает разреженную матрицу B, столбцами которой являются
ненулевые диагонали матрицы A, определенные вектором d;
• A = spdiags(B, d, A) заменяет диагонали матрицы A, определенные вектором d,
столбцами матрицы B;
• A = spdiags(B, d, m, n) создает разреженную матрицу A размером mxn,
размещая столбцы матрицы B вдоль диагоналей, определяемых вектором d;
• full( S) преобразует разреженную матрицу S в полную;
• S=sparse(A) преобразует полную матрицу в разреженную;
• S=sparse(i, j, s, m, n)создает разреженную матрицу S размером mxn. Векторы
i и j задают позиции элементов и являются целочисленными, а вектор s
определяет действительное или комплексное числовое значение элемента матрицы.
Векторы i, j и s должны иметь одну и ту же длину.

Построим матрицу системы уравнений, которая возникает при аппроксимации второй


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

n=5; e = ones(n, 1);


A = spdiags([e -2*e e], -1:1, n, n);
full(A)
ans =
-2 1 0 0 0
1 -2 1 0 0
0 1 -2 1 0

20
0 0 1 -2 1
0 0 0 1 -2

Построим разреженную матрицу A размером 4x4 из столбцов матрицы B, помещенных в


дагонали матриы A, номера которых указаны в векторе d:

B=[ 41 11 0
52 22 0
63 33 13
74 44 24 ];
d = [ -3
0
2];

A = spdiags(B, d, 4, 4);
full(A)
ans =
11 0 13 0
0 22 0 24
0 0 33 0
41 0 0 44

Конвертируем матрицу из полного формата в разреженный, используя функцию sparse:

A=[ 0 0 0 5
0 2 0 0
1 3 0 0
0 0 4 0];
S = sparse(A)

S=
(3, 1) 1
(2, 2) 2
(3, 2) 3
(4, 3) 4
(1, 4) 5

В списке вывода перечислены ненулевые элементы матрицы S вместе с индексами строк и


столбцов. Все элементы отсортированы по столбцам. Разреженную матрицу S из данного
примера можно создать напрямую без конвертации:

S = sparse([3 2 3 4 1],[1 2 2 3 4],[1 2 3 4 5], 4, 4)

ГРАФИКА

MATLAB обладает широким набором графических средств, начиная от команд


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

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

Команда plot.
Команда plot имеет различные формы, связанные с входными параметрами, например
plot(y) создает кусочно–линейный график зависимости компонент вектора y от их
индексов. Если задать два вектора в качестве аргументов, plot(x,y)создаст график
зависимости y от x. Например, для построения графика функции sin(x) на отрезке от 0
до 2π , надо выполнить всего три команды:

t = 0 : pi/100 : 2*pi;
y = sin(t);
plot(t, y)

0.5

-0.5

-1
0 2 4 6 8
Вызов функции plot с несколькими парами x-y создаст несколько кривых на одном
графике. MATLAB автоматически присвоит каждой кривой свой цвет (если это не сделать
самому). В дополнение к вектору y построим еще два набора данных и выведем все три
кривые на одном графике:

y2 = sin(t – .25);
y3 = sin(t – .5);
plot(t, y, t, y2, t, y3);

22
1
sin(x)
sin(x-.25)
0.5 sin(x-.5)

-0.5

-1
0 2 4 6 8
Для идентификации каждой кривой можно применить команду legend:

legend('sin(x)','sin(x-.25)','sin(x-.5)')

Можно изменять цвет, стиль линий и маркеры линий следующим образом:

plot( x, y, ‘цвет_стиль_маркер’),

где цвет_стиль_маркер это 1-, 2-, 3- строковая константа, составленная из символа


цвета, стиля линий и маркеров:

• Символы цвета: ‘c’, ‘m’, ‘y’, ‘r’, ‘g’, ‘b’, ‘w’ и ‘k’ обозначают голубой, малиновый,
желтый, красный, зеленый, синий, белый и черный цвета соответственно;
• Символы типа линий: ‘– ‘ для сплошной, ‘––‘ для разрывной, ‘:’ для
пунктирной, ‘–.’ для штрихпунктирной линий и ‘none’ для ее отсутствия;
• Наиболее часто встречающиеся маркеры: ‘+’, ‘o’, ‘*’, и ‘x’.

Например, команда plot( x, y, ‘y:+’) строит желтый пунктирный график и помещает


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

x1 = 0:pi/100:2*pi;
x2 = 0:pi/10:2*pi;
plot(x1, sin(x1), 'r:', x2, sin(x2), 'r+')

23
1

0.5

-0.5

-1
0 2 4 6 8
Графические объекты.
Графические средства MATLAB базируются на низкоуровневой графике, которая
называется дескрипторной или описательной (Handle Graphics). MATLAB создает график,
используя различные графические объекты, такие как линия, текст, поверхность и оси.
Каждый объект имеет ряд свойств, которые контролируют его представление на экране.
Например, объект «линия» (line) имеет такие свойства, как цвет, ширина, стиль, тип
маркера и ряд других. Данный объект создается низкоуровневой командой line,
которую используют команды высокого уровня, например plot.
Когда MATLAB создает графический объект, он назначает ему идентификатор
(описатель). Этот описатель можно использовать для доступа к свойствам объекта. В
качестве примера рассмотрим использование функции line для создания тени некоторой
кривой. Вначале нарисуем график кривой sin(t) и сохраним ее описатель.

t = 0:pi/20:2*pi;
hline1 = plot(t, sin(t), 'k');

Затем добавим тень с помощью отступа по x координатам. Сделаем оттеняющую линию


светло–серого цвета (значение свойства ‘Color’) и более толстую (значение свойства
‘LineWidth’), по сравнению с толщиной исходной линии.

hline2 = line(t+.08, sin(t), 'LineWidth', 4, 'Color', [.9 .9 .9]);

Наконец, выведем первую кривую на передний план.

set(gca, 'Children', [hline1 hline2]);

24
1

0.5

-0.5

-1
0 2 4 6 8
Команда set в данном примере служит для установки свойств графического объекта
(текущих координатных осей, описатель которых возвращает команда gca). Команда
get(name) выводит свойства объекта с заданным именем. Так, для вывода на экран всех
свойств оттеняющей кривой линии следует выполнить команду get(hline2).
Последовательность графических команд можно записать в m-файл и выполнять
записанный сценарий много раз.

Окна изображений.
Функция plot автоматически открывает новое окно изображения, если до этого его не
было на экране. Если же окно существует, то plot использует его по умолчанию. Новое
окно открывается по команде figure. Если окон изображения несколько, то для выбора
одного из них в качестве текущего окна следует использовать команду figure(n), где
n – это номер в заголовке окна. Результаты всех команд будут выводиться в текущее окно.

Окно изображений обладает широким набором средств редактирования созданного


графика. Для перехода в режим редактирования достаточно щелкнуть на кнопке  (Edit
Plot) или выбрать аналогичный пункт из меню Tools. Затем можно выделить объект
редактирования и либо использовать команды меню Edit (правка), Insert (вставка),
Tools (сервис) либо вызвать контекстное меню и изменить свойства объекта.

Добавление кривых на существующий график.


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

Построим в качестве примера график функции sin(x) и с помощью команды hold on


наложим на него график многоугольника:

x=-5:.1:5;
plot(x, sin(x));

25
axis equal
hold on
t = 0:pi/10:2*pi;
plot(3*exp(i*t), '-o')

3
2
1
0
-1
-2
-3

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

Управление осями.
По умолчанию графики выводятся без указания наименований осей в режиме
автоматического масштабирования. При этом масштабные коэффициенты
пропорциональны размерам графического окна, что позволяет использовать пространство
окна оптимальным образом. Функция axis используется для настройки масштаба,
ориентации и коэффициента сжатия. Рассмотрим некоторые варианты применения
команды axis:

• axis([xmin xmax ymin ymax]) – установка диапазонов координат по осям


x и y для двумерного графика;
• axis auto – установка параметров осей по умолчанию;
• axis – возвращает вектор строку с текущими диапазонами координат;
• axis manual – замораживает масштабирование в текущем состоянии, чтобы
при использовании команды hold on следующие графики использовали те же
параметры осей;
• axis tight – устанавливает диапазоны координат по осям в соответствии с
диапазонами данных;
• axis ij – задает систему координат с началом в левом верхнем углу;
• axis equal – включает масштаб с одинаковым расстоянием между метками по
осям x, y и z;
• axis square – устанавливает текущие оси в виде квадрата (или куба в
трехмерном случае);
• axis off – убирает с осей их обозначения и маркеры;

26
• axis on – восстанавливает ранее введенные обозначения осей и маркеры.

Нарисуем эллипс в режимах axis auto, который используется по умолчанию, axis


square, который делает оси x и y равными и axis equal, который делает единицы
измерения на осях равными:

t = 0:pi/20:2*pi;
subplot(1,3,1);
plot(sin(t), 2*cos(t))
grid on
subplot(1,3,2);
plot(sin(t), 2*cos(t))
grid on
axis square
subplot(1,3,3);
plot(sin(t), 2*cos(t))
grid on
axis equal

2 2
2
1 1

0 0 0

-
1 -
1
-
2
-
2 -
1 0 1-
2
-
1 0 1 -
1 0 1

Для того, чтобы координатные оси вплотную примыкали к эллипсу, следует использовать
опцию tight, например: axis equal tight.

Разбиение графического окна.


Команда subplot, приведенная в предыдущем примере, используется для разбиения
графического окна на подокна:

• subplot(m,n,p) разбивает графическое окно на mxn подокон, при этом m –


число подокон по горизонтали, этом n – число подокон по вертикали, p- номер
подокна, в котором будет строиться текущий график (нумерация идет по строкам);
• subplot(h) делает подокно с указателем h текущим;
• subplot('Position', [left bottom width height]) создает подокно с
заданными нормализованными координатами (в пределах от 0.0 до 1.0);
• subplot(1,1,1) удаляет все подокна и возвращает графическое окно в обычное
состояние.

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

Подписи к осям и заголовки.


Функции xlabel, ylabel и zlabel добавляют подписи к соответствующим осям,
функция title добавляет заголовок в верхнюю часть окна, а функция text вставляет
текст в любое место графика. Использование TEX представления позволяет применять
греческие буквы, математические символы и различные шрифты. Следующий пример
демонстрирует эти возможности.

x = -pi:.1:pi;
y = sin(x);
plot(x, y)
set(gca, 'XTick', -pi:pi/2:pi)
set(gca,'XTickLabel', {'-pi', '-pi/2', '0', 'pi/2', 'pi'})
xlabel('-\pi \leq \Theta \leq \pi')
ylabel('sin(\Theta)')
title('Plot of sin(\Theta)')
text(-pi/4, sin(-pi/4), '\leftarrow sin(-\pi\div4)',...
'HorizontalAlignment', 'left')
set(findobj(gca, 'Type', 'line', 'Color', [0 0 1]),...
'Color', 'red',...
'LineWidth',2)

В этом примере команда findobj находит описатель объекта line, созданного командой
plot. Последний оператор set меняет цвет кривой с черного на красный и
устанавливает толщину линии равной 2.

Ãðàô èê sin(Θ)
1

0.5
sin(Θ)

-0.5
←sin(- π÷4)
-1
-pi -pi/2 0 pi/2 pi
-π ≤ Θ≤ π

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


В полярной системе координат любая точка представляется как конец радиус–вектора,
исходящего из начала системы координат, имеющего длину  и угол . Для построения
графика используется команда polar:

28
t = 0:.01:2*pi;
polar(t, sin(2*t).*cos(2*t),'--r')

90 0.5
120 60
0.4
0.3
150 30
0.2
0.1

180 0

210 330

240 300
270

В данном примере оператор .* используется для декартового (почленного) умножения


массивов.

Контурные графики и графики полей градиентов.


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

• contour(Z) строит график по данным матрицы Z c автоматическим заданием


диапазонов изменения x и y;
• contour(X, Y, Z) строит график по данным матрицы Z с указанием
спецификаций для x и y;
• contour(Z, N) и contour(X, Y, Z, N) строят контурные графики с явным
заданием N линий равного уровня;
• contour(Z, V) и contour(X, Y, Z, V) строят линии равного уровня для высот,
указанных значениями элементов вектора V;
• [C, h] = contour(...) возвращает контурную матрицу C и вектор указателей
графических объектов. Команда clabel использует матрицу C для создания
меток.

Для построения графиков полей градиента служит команда quiver:


• quiver(u, v) строит векторы в равнорасположенных точках на плоскости (x, y),
причем элементы массивов u и v указывают направление и размер векторов;
• quiver(x, y, u, v) строит векторы в точках, задаваемых векторами x и y;
• quiver(...,scale) автоматически масштабирует векторы, а затем вытягивает их в
соответствии с коэффициентом scale.

Рассмотрим в качестве примера построение контурного графика и график поля градиентов


для функции z=exp(-x*x-y*y):

29
[x y] = meshgrid(-2:.2:0,-2:.2:2);
z = x.*exp(-x.^2-y.^2);
[dx, dy] = gradient(z,.2,.2);
subplot(1, 2, 1);
[c h]=contour(x, y, z);
clabel(c, h, 'manual');
subplot(1, 2, 2);
quiver(x, y, dx, dy);
axis([-2 0 -2 2])
2 2

.05
-0 .1
-0
1 1
.2
-0

.4
0 -0 0
-0
.15

-
1 -
1

-
2 -
2
-2 -
1.
5 -
1 -
0.
5 0 -2 -
1.
5 -
1 -
0.
5 0

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


В приведенном выше примере функция meshgrid используется при создании матриц x
и y, которые служат для построения трехмерных графиков. Формат команды meshgrid:

• [X, Y] = meshgrid(x, y) преобразует область определения, заданную


векторами x и y, в матрицы X и Y, используемых при вычислении функции двух
переменных и построении трехмерных графиков. Строки матрицы X дублируют
вектор x, а столбцы Y – вектор y;
• [X,Y] = meshgrid(x) – аналогична [X,Y] = meshgrid(x,x);
• [X, Y, Z] = meshgrid(x, y, z) возвращает трехмерные массивы, используемые
для вычисления функций трех переменных и построения трехмерных графиков.

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


Команда plot3 является трехмерным аналогом команды plot. Она строит
аксонометрическое изображение поверхностей и представлена следующими формами:

• plot3(x, y, z) строит массив точек, представленных векторами x, y, z и


соединяет их отрезками прямых;
• plot3(X, Y, Z)строит линии по точкам, координаты которых берутся из столбцов
матриц X, Y, Z.
В качестве примера рассмотрим построение трехмерной спирали и графика функции
z = x*x+y*y:

30
subplot(1, 2, 1);
t = 0:pi/50:10*pi;
plot3(sin(t), cos(t), t);
axis square; grid on; box on;
subplot(1,2,2);
[x y]=meshgrid([-3:.25:3]);
z=x.^2+y.^2;
plot3(x, y, z);
axis tight; box on;

4
0
1
5

2
0 1
0

0 0
1
1 2
0 0 2
0 0
-
2 -
2
-
1-1

Наиболее представительными и наглядными являются сетчатые графики трехмерных


поверхностей с заданной или функциональной окраской. Для построения сетчатых
параметрических поверхностей используются команды mesh, meshc, и meshz:

• mesh(X, Y, Z, C) строит сетчатую поверхность Z(X, Y), цвет определяется


матрицей C. Если X и Y – векторы, то их размерность должна определяться
соотношениями: length(X) = n и length(Y) = m, где
[m, n] = size(Z). В этом случае точки пересечения сеточных линий имеют
координаты (X(j), Y(i), Z(i, j)), а X и Y соответствуют столбцам и строкам
матрицы Z соответственно. Если X и Y – матрицы, то узлы сетки имеют
координаты (X(i, j), Y(i, j), Z(i, j));
• mesh(X, Y, Z) – аналог предыдущей команды, цвет определяется высотой
поверхности;
• mesh(Z) – строит сетчатую поверхность, используя по умолчанию соотношения:
X = 1:n и Y = 1:m, где [m, n] = size(Z);
• meshс(…)– помимо графика трехмерной поверхности строит ее проекцию в виде
линий равного уровня (графика типа contour);
• meshz(…)– строит трехмерную поверхность в виде многочисленных столбиков.

В качестве примера рассмотрим построение графика функции sin(r)/r:

[X, Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;

31
Z = sin(R)./R;
subplot(1, 2, 1);
mesh(Z, 'EdgeColor', 'k');
subplot(1, 2, 2);
surfl(X, Y, Z);
shading interp; colormap(gray);

здесь константа eps используется для того, чтобы избежать деления на ноль. Команда
surfl строит сетчатые графики с использованием закраски ячеек сетки и подсветкой от
точечного источника света. Команда colormap(gray) задает окраску тонами серого
цвета, а команда shading interp обеспечивает устранение изображения сетки и задает
интерполяцию для оттенков цвета объемной поверхности.

1 1

0
.5 0
.5

0 0

-0
.5 -0
.5
40 10
4
0 1
0
2
0 0
2
0 0
00 -1
0 -1
0

ПРОГРАММИРОВАНИЕ В СИСТЕМЕ MATLAB.

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


расширения и адаптации к решению специфических задач. Большинство объектов этого
языка, в частности все команды, операторы и функции, могут использоваться в
командном режиме работы. Программы на языке программирования MATLAB
сохраняются в виде текстовых m-файлов. При этом могут сохраняться как целые
программы в виде файлов-сценариев, так и отдельные программные модули – функции.
Язык программирования MATLAB является интерпретатором. Это означает, что
MATLAB не создает исполняемых конечных программ. Для выполнения программ
необходима среда MATLAB. Для создания исполняемых программ следует
воспользоваться специально разработанными компиляторами, например – MATLAB
Compiler, транслирующими программы MATLAB в коды языков программирования C и
C++.
С позиций программиста язык MATLAB является проблемно-ориентированным
языком программирования высокого уровня, который содержит множество встроенных
сложных функций и операторов. К таким функциям можно отнести матричные функции,
функции быстрого преобразования Фурье и другие, а к операторам – операторы
построения разнообразных графиков, генерации матриц определенного вида и т.д.

32
Основные типы данных.
В MATLAB определены 14 основных типов данных (или классов), представляющих собой
форму массива. Массивы могут быть многомерными или иметь размерность 0x0.
Двумерные массивы принято называть матрицами. Типы данных кратко описаны в
следующей таблице:

Тип данных Пример Описание


single 3*10^38 Числовой массив с одинарной точностью. Не
может использоваться в математических
операциях.
double 3*10^300 Числовой массив с двойной точностью.
5+6i Наиболее часто используемый тип данных.
sparse speye(5) Разреженные матрицы с элементами-числами
удвоенной точности.
int8, uint8, uint8(magic(3)) Целочисленные массивы со знаком и без знака,
int16,uint16,int32 длина элементов которых равна 8,16 и 32
,uint32 разрядам. Математические операции с этими
типами не предусмотрены.
char 'Hello' Строчные массивы с элементами-символами.
cell {17 'hello' Массивы ячеек; ячейки, в свою очередь также
eye(2)} могут быть массивами.
structure a.day = 12; Массивы записей с полями, которые также
a.color = 'Red'; могут содержать массивы.
a.mat =
magic(3);
user class inline('sin(x)') Тип данных, определяемый пользователем.
Строится на основе функций MATLAB.
java class java.awt.Frame Java класс. Вы можете использовать классы
уже определенные в Java API или создать свои
собственные на языке Java.
function handle @humps Указатель функции MATLAB. Указатель
может передаваться в списке аргументов или
определяться командой feval.

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

Арифметические операторы и массивы.


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

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

A = magic(3)
A =
8 1 6

33
3 5 7
4 9 2

3 * A
ans =
24 3 18
9 15 21
12 27 6

Для возведения матрицы в степень следует использовать оператор ‘^’, например:

B = A^2
B=
91 67 67
67 91 67
67 67 91

здесь A – магическая матрица из предыдущего примера. Для возведения в степень каждого


отдельного элемента матрицы A следует использовать оператор ‘.^’, например:

C = A.^2
C=
64 1 36
9 25 49
16 81 4

Для правого матричного деления используется оператор ‘/’, по определению B/A =


(A'\B')':

B/A
ans =
8.0000 1.0000 6.0000
3.0000 5.0000 7.0000
4.0000 9.0000 2.0000

Почленное правое деление С./A образует матрицу с элементами C(i, j)/ A(i, j) :

C./A
ans =
8 1 6
3 5 7
4 9 2

Для левого матричного деления используется оператор ‘\’, грубо говоря, A\B означает то
же, что и inv(A)*B, за исключением способа реализации:

A\B
ans =

8.0000 1.0000 6.0000


3.0000 5.0000 7.0000
4.0000 9.0000 2.0000

34
Eсли A – квадратная матрица с размерностью nxn, а B – вектор-столбец с n компонентами
или матрица с несколькими такими столбцами, то X = A\B есть решение системы
уравнений AX = B вычисленное методом исключения Гаусса. Если матрица A плохо
масштабирована или близка к сингулярной (определитель матрицы равен нулю), то
система выдает соответствующее предупреждение. Если A не является квадратной
матрицей, то X = A\B является квази-решением недоопределенной (число уравнений
меньше числа неизвестных) или переопределенной (число уравнений больше числа
неизвестных) системы уравнений AX = B.

Оператор почленного левого деления A.\B создает матрицу с элементами


B(i,j)/A(i,j). Матрицы A и B должны иметь одинаковую размерность. Пример:

A.\C
ans =
8 1 6
3 5 7
4 9 2

Оператор матричного транспонирования (‘) меняет местами строки и столбцы исходной


матрицы. Если элементы матрицы являются комплексными числами, то при
транспонировании они заменяются своими комплексно-сопряженными значениями:

D=[1 1-2i; 1+3i 2]


D =
1.0000 1.0000 - 2.0000i
1.0000 + 3.0000i 2.0000

Почленное транспонирование комплексной матрицы операцию комплексного сопряжения


не проводит:

D.'
ans =
1.0000 1.0000 + 3.0000i
1.0000 - 2.0000i 2.0000

При сложении двух матриц A+B (или вычитании A-B) требуется, чтобы они имели
одинаковую размерность. Если одна из матриц является константой, то при сложении эта
константа прибавляется к каждому элементу другой матрицы:

A+B
ans =
99 68 73
70 96 74
71 76 93

A+4
ans =
12 5 10
7 9 11
8 13 6

35
Следует отметить, что каждый арифметический оператор имеет аналогичную по своему
названию функцию. Например, вместо оператора матричного сложения A+B можно
использовать функцию plus(A, B). Полный список операторов можно получить по
команде help ops. Соответствие функций операторам позволяет одновременно
использовать элементы как операторного, так и функционального программирования.

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

Функция Оператор Описание Пример


lt < Меньше чем X<Y
le <= Меньше или равно X<=Y
gt > Больше чем X>Y
ge >= Больше или равно X>=Y
eq == Равно X==Y
ne ~= Не равно X~=Y

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


размерности и возвращают значение 1 (True), если элементы идентичны, и значение 0
(False) в противном случае. Результат операции отношения выдается в виде массива той
же размерности, что и размерность операндов отношения:

A=[1 2; 2 3]; B=[1 2; 2 4];


A==B
ans =
1 1
1 0

В данном примере нулевой элемент результирующей матрицы означает несовпадение


соответствующих элементов матриц A и B.

Логические операторы и функции.


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

Оператор Функция Название


& and Логическое И
| or Логическое ИЛИ
~ not Логическое НЕ
xor Исключающее ИЛИ
any Истина, если все элементы массива нулевые
all Истина, если все элементы массива ненулевые

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


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

Рассмотрим примеры:

A=[1 2; 2 0]; B=[0 1; 1 0];

36
A&B
ans =
0 1
1 0

В результирующей матрице A&B единица (истина) означает, что в матрицах A и B оба


соответствующих элемента отличны от нуля. В противном случае ставится ноль.

A|B
ans =

1 1
1 0

В результирующей матрице A|B единица (истина) означает, что в матрицах A и B хотя бы


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

~B
ans =
1 0
0 1

В результирующей матрице ~B единица (истина) означает, что в матрице B


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

xor(A, B)
ans =
1 0
0 0

Элемент результирующей матрицы равен единице (истине) если соответствующие


элементы исходных матриц имеют значения единица и ноль (истина и ложь).

Приоритет выполнения операторов.


В математических выражениях операторы имеют определенный приоритет исполнения.
Перечислим операторы в порядке убывания их приоритета:

1) выполняются операторы, заключенные в скобки ()


2) транспонирование (.'), возведение в степень (.^), комплексно-сопряженное
транспонирование ('), матричное возведение в степень (^)
3) унарное сложение (+), унарное вычитание (–), логическое отрицание (~)
4) умножение (.*), правое деление (./), левое деление (.\), матричное умножение
(*), матричное правое деление (/), матричное левое деление (\)
5) сложение (+), вычитание (–)
6) оператор двоеточие (:)
7) меньше чем (<), меньше или равно (<=), больше чем (>), больше или равно (>=),
равно (==), не равно (~=)
8) логическое И (&)
9) логическое ИЛИ (|)

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

A = [3 9 5]; B = [2 1 5];

C = A./B.^2
C =
0.7500 9.0000 0.2000

C = (A./B).^2
C =
2.2500 81.0000 1.0000

Структура файлов сценариев.


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

%Основной комментарий
%Дополнительный комментарий
Тело файла с любыми выражениями

Основным комментарием является первая строка текстовых комментариев, а


дополнительным – последующие строки. Основной комментарий выводится при
выполнении команд lookfor и help имя_каталога. Полный комментарий выводится
при выполнении команды help имя_файла.
Рассмотрим пример построения файла-сценария. Откроем окно Редактора/Отладчика
щелчком по кнопке “New M-File” на панели инструментов и введем текст сценария:

%Polar plot
%Строит график функции y= 2*sin(5*x)^2
x = -pi:0.01:pi;
polar(x, 2*sin(5*x).^2)

Сохраним файл под именем pl. После сохранения в текущем каталоге будет
создан файл pl.m. Командой type pl можно вывести листинг файла, а командой pl
запустить его на выполнение.

Структура m-файлов функций.


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

function [var1,var2,…] = f_name(Список параметров)


%Основной комментарий
%Дополнительный комментарий
Тело файла
var1=…
var2=…
….

38
Файл-функция всегда начинается с объявления function, за которым следует один или
несколько идентификаторов выходных параметров, имя функции и список ее входных
параметров. Входные параметры указываются в квадратных скобках. Если входной
параметр один, то скобки можно опустить. Все переменные, имеющиеся в модуле
функции, являются локальными, то есть, доступны только в пределах данной функции.
Связь с другими модулями проходит через входные и выходные параметры. При вызове
функции происходит замена формальных параметров фактическими параметрами.
Рассмотрим в качестве примера функцию, которая вычисляет значение n! (факториал
числа n):

function f = fact(n) % Function definition line


% FACT Factorial. % Основной комментарий
% FACT(N) факториал числа N, % Дополнительный комментарий
% обычное обозначение N!
% Ввод команды FACT(N) эквивалентен PROD(1:N).
f = prod(1:n); % Тело функции

Сохранив функцию в m-файле, ее всегда можно вызвать из командной строки или из


другой функции. Например:

fact(3)
ans =
6

Использование подфункций.
Подфункции объявляются и записываются в теле основных функций и имеют
аналогичную структуру. Подфункции доступны только в пределах m-файла,
определяющего основную (primary) функцию. Рассмотрим код функции newstats с
двумя подфункциями mean и median для вычисления среднего значения и медианы
статистической выборки:

function [avg, med] = newstats(u) % Primary function


% NEWSTATS Find mean and median with internal functions.
n = length(u);
avg = mean(u, n);
med = median(u, n);

function a = mean(v, n) % Subfunction


% Calculate average.
a = sum(v)/n;

function m = median(v, n) % Subfunction


% Calculate median.
w = sort(v);
if rem(n, 2) == 1
m = w((n+1)/2);
else
m = (w(n/2)+w(n/2+1))/2;
end

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

v=[1 2 3 8 9];
[a, m] = newstats(v)
a=
4.6000
m=
3

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

• g = inline(expr)
• g = inline(expr, arg1, arg2, ...)
• g = inline(expr, n)

здесь expr – строковая константа, определяющая математическое выражение, arg1, arg2,...


– список входных параметров, n – скаляр означает, что список формальных входных
параметров состоит из x, P1, P2,…Pn. Рассмотрим пример:

g = inline('sin(alpha*x)', 'x', 'alpha')


g=
Inline function:
g(x, alpha) = sin(alpha*x)

g(3.149, 0.5)
ans =
1.0000

Передача данных через глобальные переменные.


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

global X Y Z

объявляет переменные X, Y, Z модуля-функции глобальными. Чтобы несколько


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

Параметры функционального типа.


Часто во многих функциях возникает необходимость передачи им в качестве параметров
имени других функций. Например, необходимо написать функцию для вычисления
интеграла, когда вид подынтегральной функции заранее не известен. В таких случаях в
MATLAB используют параметры функционального типа.
Описание переменной функционального типа имеет вид:
fhandle = @fname;

40
Здесь имя fname – функции, @fname – дескриптор (указатель) функции, fhandle –
переменная функционального типа. Для определения значение функции с помощью ее
функционального указателя можно использовать функцию feval, имеющую структуру:

feval(fhandle, arg1, arg2, ..., argn)

Рассмотрим пример:

s=@sin;
sin(1)
ans =
0.8415
feval(s, 1)
ans =
0.8415

10
Напишем функцию для вычисления суммы ∑F (i ) , когда вид функции F(x) заранее
i =1
неизвестен.

function f=sm(fh)
f=0;
for i=1:10
f=f+feval(fh, i);
end;

Тогда для вычисления суммы, например функции sin(x), достаточно выполнить


оператор:

sm(@sin)
ans =
1.4112

Функции с переменным числом аргументов.


При создании функций с переменным числом аргументов полезно использовать две
функции:
• nargin – возвращает число входных параметров данной функции
• nargout – возвращает число выходных параметров данной функции

В качестве примера рассмотрим часть кода функции myplot с переменным числом


аргументов:

function [x0, y0] = myplot(fname, lims, npts, angl, subdiv)


% MYPLOT График функции.
% MYPLOT(fname, lims, npts, angl, subdiv)
% Первые два аргумента обязательны,
% три других имеют значение по умолчанию.
...
if nargin < 5, subdiv = 20; end
if nargin < 4, angl = 10; end

41
if nargin < 3, npts = 25; end
...
if nargout == 0
plot(x, y)
else
x0 = x;
y0 = y;
end

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

• оператор if
• оператор switch
• циклы for
• циклы while
• оператор break

Оператор if имеет следующую структуру:

if expression1
statements
elseif expression2
statements
else
statements
end

Оператор if вычисляет логическое выражение expression1 и выполняет группу


операторов statements, если выражение истинно. Необязательные ключевые слова
elseif и else служат для выполнения альтернативных групп операторов. Ключевое
слово end, которое согласуется с if, завершает последнюю группу операторов.
Рассмотрим в качестве примера построение квадратной трехдиагональной матрицы,
которая возникает при аппроксимации производной второго порядка на равномерной
сетке узлов:

for i=1:5
for j=1:5
if i == j
a(i, j) = 2;
elseif abs(i–j) == 1
a(i, j) = –1;
else
a(i, j) = 0;
end
end
end

a=

42
2 -1 0 0 0
-1 2 -1 0 0
0 -1 2 -1 0
0 0 -1 2 -1
0 0 0 -1 2

Оператор switch имеет следующую структуру:

switch switch_expr
case case_expr
statement,...,statement
case {case_expr1, case_expr2, case_expr3,...}
statement,...,statement
...
otherwise
statement,...,statement
end

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


выражении switch_expr. Ключевые слова case и otherwise разделяют эти группы.
Выполняется только первый соответствующий случай. Необходимо использовать end для
согласования с switch. Предыдущий пример можно переписать, используя оператор
switch следующим образом:

for i=1:5
for j=1:5
switch i–j
case 0
a(i, j) = 2;
case {1, –1}
a(i, j) = –1;
otherwise
a(i, j) = 0;
end
end
end

В отличие от языка Си, оператор switch в MATLAB “не проваливается”. Если первый
случай является истинным, другие случаи не рассматриваются. Таким образом, нет
необходимости использовать оператор break.

Оператор цикла for повторяет группу операторов фиксированное число раз. Ключевое
слово end ограничивает тело цикла. Циклы могут быть вложенными, как показано в
предыдущем примере.

Оператор цикла while повторяет группу операторов определенное число раз, пока
выполняется логическое условие. Ключевое слово end ограничивает тело цикла.
Рассмотрим программу, иллюстрирующую работу операторов while и if для нахождения
одного из корней многочлена x3-2x-5. В программе реализован метод дихотомии.

43
a = 0; fa = –Inf;
b = 3; fb = Inf;
while b–a > eps*b
x = (a+b)/2;
fx = x^3-2*x-5;
if sign(fx) == sign(fa)
a = x; fa = fx;
else
b = x; fb = fx;
end
end

x
x =
2.0946

Оператор break позволяет досрочно выходить из циклов for или while. Во вложенных
циклах break осуществляет выход только из самого внутреннего цикла. В качестве
примера рассмотрим цикл while, который используется для чтения m-файла fft.m в
символьный массив. Оператор break используется для выхода из цикла, как только будет
встречена первая нулевая строка. В результате символьный массив будет содержать
описание fft программы.

fid = fopen('fft.m', 'r');


s = '';
while ~feof(fid)
line = fgetl(fid);
if isempty(line), break, end
s = strvcat(s, line);
end

Диалоговый ввод.
Диалоговый ввод можно организовать с помощью команды input, имеющей формат:

user_entry = input('prompt', 's')

При выполнении этой команды на экран выводится запрос prompt в виде строки, затем
происходит остановка работы и ожидание ввода с клавиатуры. Необязательный параметр
s указывает, что введенный текст является строкой, а не числом. Примеры:

i = input('Введите значение. i=');


i = input('Do you want more? Y/N [Y]: ', 's');

Пауза.
Для организации паузы в ходе выполнения программы служит команда pause.
Выполнение программы будет продолжаться после нажатия любой клавиши. Для
организации паузы в n секунд, следует использовать команду pause(n).

44
ЧИСЛЕННЫЕ МЕТОДЫ И ОБРАБОТКА ДАННЫХ

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


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

Решение систем линейных алгебраических уравнений.


Система линейных уравнений обычно решается с помощью операторов правого ‘/’ и
левого ‘\’ деления:

• выражение X=B/A дает решение ряда систем линейных уравнений AX=B, где A –
матрица размером mxn и B – матрица размером nxk;
• выражение X=B\A дает решение ряда систем линейных уравнений XA=B, где A –
матрица размером mxn и B – матрица размером nxk;

В дальнейших примерах будем использовать две матрицы A и B размером 3x3:


матрицу Паскаля –

A = pascal(3)
A =
1 1 1
1 2 3
1 3 6

и магическую матрицу –

B = magic(3)
B =
8 1 6
3 5 7
4 9 2

а также два вектора: вектор-столбец u = [3; 1; 4] и вектор-строку v = [2 0 -1].

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


правой части b. Вектор решения x = A\b имеет тот же размер, что и вектор b. Например,

x = A\u
x=
10
-12
5

Проверка подтверждает, что произведение A*x равняется вектору u.


Если матрицы A и B являются квадратными и имеют одинаковый размер, то решение
является квадратной матрицей такого же размера:

X = A\B
X=
19 -3 -1
-17 4 13
6 0 -6

45
В рассмотренных примерах найденное решение совпадает с точным, поскольку
определитель матрицы A равен единице, а ее элементы являются целыми числами.

Квадратная матрица A называется сингулярной, если ее столбцы являются линейно


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

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


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

y 0.82 0.72 0.63 0.6 0.55 0.5


t 0.0 0.3 0.8 1.1 1.6 2.3

Эти данные можно ввести с помощью операторов:

t = [0 .3 .8 1.1 1.6 2.3]'; y = [.82 .72 .63 .60 .55 .50]';

Будем искать приближение табличной функции в виде y (t ) ≈ c1 + c2 e −t . Из этой формулы


следует, что вектор y разыскивается в виде линейной комбинации вектора с единичными
компонентами и вектора с компонентами exp(-t). Неизвестные коэффициенты c1 и c 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.4760 + 0.3413 e −t .


Нарисуем график аппроксимирующей кривой вместе с исходными табличными данными:

T = (0:0.1:2.5)';
Y = [ones(size(T)) exp(-T)]*c;
plot(T, Y, '-', t, y, 'o')

46
0.9

0.8

0.7

0.6

0.5
0 1 2 3

Из рисунка видно, что табличные данные, представленные на графике кружками,


достаточно хорошо аппроксимируются кривой.

Рассмотрим решение системы с недоопределенной матрицей. Решение такой системы не


бывает единственным. MATLAB находит частное решение, которое имеет m ненулевых
компонент (m – ранг матрицы), но и оно не является единственным. Частное решение
определяется с помощью алгоритма QR факторизации с выбором ведущего элемента по
столбцу. Рассмотрим пример:

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 состоит из двух уравнений относительно четырех неизвестных.


Решение такой системы удобно выводить на экран в рациональном формате:

format rat
p = R\b
p =
0
5/7
0
-11/7

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

Z = null(R, 'r')
Z=
-1/2 -7/6
-1/2 1/2

47
1 0
0 1

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


Общее решение исходной системы можно представить в следующем виде: x = p + Z*q,
где q – произвольный вектор.

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


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

Построим матрицу системы с три диагональной структурой и размером 10x10:

n = 10;
on = ones(n, 1);
A = spdiags([-2*on 4*on -on],-1:1, n, n);

В качестве элементов вектора правой части возьмем сумму элементов матрицы A в


соответствующих строках:

b = sum(A, 2);

Для решения системы Ax=b применим один из одиннадцати существующих форматов


вызова функции bigcg:

x = bicg(A, b);
bicg converged at iteration 10 to a solution with relative residual 8.6e-014

В результате система выдает сообщение о сходимости итерационного процесса и


приводит относительную погрешность.

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


Определитель квадратной матрицы находится с помощью функции det:

det(A)
ans =
1

Обратная матрица находится с помощью функции inv:

inv(A)
ans =
3 -3 1
-3 5 -2
1 -2 1

48
Факторизация Холецкого.
Если матрица системы является симметричной (или эрмитовой) и положительно
определенной, то ее можно представить в виде произведения двух треугольных матриц:
A=R’R, где R – верхняя треугольная матрица, R’ – транспонированная. Факторизация
Холецкого выполняется с помощью функции chol:

R = chol(A)
R=
1 1 1
0 1 2
0 0 1

Легко проверить, что произведение R’R дает исходную матрицу Паскаля. Факторизация
Холецкого приводит систему Ax=u к виду R’Rx=u. Поскольку оператор ‘\’ распознает
системы с треугольными матрицами, приведенную систему можно решить очень быстро:

x = R\(R'\u)
x=
10
-12
5

LU факторизация.
LU факторизация, или гауссово исключение, выражает любую квадратную матрицу A как
произведение перестановки нижней треугольной матрицы L и верхней треугольной
матрицы U, где матрица L имеет единичную главную диагональ. Перестановки важны как
0 1
с теоретической, так и с практической точки зрения. Так, матрицу  невозможно
 1 0

представить в виде произведения двух треугольных матриц без перестановки двух строк.
ε 1
С другой стороны, хотя матрицу   можно представить в виде произведения двух
1 0
треугольных матриц, при малом значении  элементы матриц-сомножителей будут очень
большими, что приведет к большой численной погрешности. Для выполнения разложения
служит функция lu:

• [L, U] = lu(X) возвращает верхнюю треугольную матрицу U и нижнюю


треугольную матрицу L (точнее, произведение нижней треугольной матрицы и
матрицы перестановок), так что X = L*U;
• [L, U, P] = lu(X) возвращает верхнюю треугольную матрицу U, нижнюю
треугольную матрицу L и матрицу перестановок P, так что L*U = P*X;
• B=lu(X) возвращает матрицу B такую что, B(i, j) = U(i, j) для всех индексов
ji и B(i, j) = L(i, j) для всех индексов j<i. Поскольку диагональные
элементы матрицы L равны единице, их можно не хранить.

Рассмотрим факторизацию магической матрицы B:

[L U] = lu(B)
L =
1.0000 0 0
0.3750 0.5441 1.0000

49
0.5000 1.0000 0

U =
8.0000 1.0000 6.0000
0 8.5000 -1.0000
0 0 5.2941

Отметим, что строки матрицы L переставлены местами. Легко проверить, что B = L*U.
LU факторизация матрицы B позволяет очень быстро решить систему Bx=u:

x = U\(L\u)
x=
0.5528
0.2611
-0.2806

Получим представление матрицы перестановок P:

[L, U, P] = lu(B)

L=
1.0000 0 0
0.5000 1.0000 0
0.3750 0.5441 1.0000

U=
8.0000 1.0000 6.0000
0 8.5000 -1.0000
0 0 5.2941

P=
1 0 0
0 0 1
0 1 0

Строки матрицы L стоят на своих местах. Легко проверить, что L*U = P*B. Определитель
и обратную матрицу из LU разложения можно найти по формулам:
det(B) = det(L)*det(U) и inv(B) = inv(U)*inv(L).

QR факторизация.
Функция qr выполняет QR разложение матрицы. Эта операция полезна как для
квадратных, так и для прямоугольных матриц. Исходная матрица представляется в виде
произведения действительной ортонормальной или комплексной унитарной матрицы Q и
верхней треугольной матрицы R. Функция используется в следующих формах:

• [Q, R] = qr(A) вычисляет верхнюю треугольную матрицу R того же размера, что


и A, и унитарную матрицу Q, так что A = Q*R;
• [Q, R, E] = qr(A) вычисляет матрицу перестановок E, верхнюю треугольную
матрицу R c убывающими по модулю диагональными элементами и унитарную
матрицу Q, так что A*E = Q*R;

50
• [Q, R] = qr(A,0) и [Q, R, E] = qr(A, 0) вычисляют экономное разложение, в
котором E – вектор перестановок такой, что Q*R = A(:, E). Вектор E выбирается
так, чтобы диагональные элементы матрицы R убывали по модулю;
• X = qr(A) возвращает результат из пакета LAPACK так, что R есть triu(X) –
верхняя треугольная часть матрицы X. Матрица R позволяет избежать потери
точности при вычислении A'*A с помощью разложения Холецкого: A'*A =
R'*R .

В качестве примера рассмотрим QR разложение прямоугольной матрицы C:

C = fix(10*rand(3, 2))
C=
6 8
9 6
8 1

[Q, R] = qr(C)
Q=

-0.4460 0.7450 0.4961


-0.6690 0.0908 -0.7377
-0.5946 -0.6609 0.4579

R=
-13.4536 -8.1762
0 5.8437
0 0

Во многих случаях последние m-n столбцы матрицы Q можно отбросить, так как они
умножаются на последние нулевые строки матрицы R. Используя экономный формат
функции разложения, получим:
[Q, R] = qr(C, 0)
Q=

-0.4460 0.7450
-0.6690 0.0908
-0.5946 -0.6609

R=
-13.4536 -8.1762
0 5.8437

Решение системы Cx = u с факторизованной матрицей находится в два этапа:

y = Q'*u;
x = R\y

x=
0.3590
-0.0544

51
Поскольку матрица системы является переопределенной, то найденное решение является
наилучшим среднеквадратичным приближением. Отметим, что оператор x = C\u даст
такой же результат.

Матричная экспонента.
Матричная экспонента expm(X) возводит число e в матричную степень X. Рассмотрим в
качестве примера задачу Коши для системы обыкновенных дифференциальных уравнений
первого порядка с постоянными коэффициентами:

dx/dt=Ax, x(0)=u,

здесь x = x(t) – векторная функция, A – матрица коэффициентов, u – вектор начальных


условий. Решение задачи можно выразить через матричную экспоненту x(t)=etAx(0).
Положим:

A=[0 -6 -1; 6 2 -16; -5 20 -10];


u=[1; 1; 1];

Определим решение системы дифференциальных уравнений в узлах равномерной сетки с


шагом 0.1 на отрезке [0, 1] и построим трехмерный график фазовой траектории:

X = [];
for t = 0:.01:1
X = [X expm(t*A)*u];
end

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


box on

1.5

0.5

-0.5
1
0.5 1
0 0.5
-0.5 0

52
Собственные значения и собственные вектора.
Скаляр  и вектор v называются собственным значением и собственным вектором
матрицы A, если выполняется соотношение: Av=v. Пусть Λ – диагональная матрица, у
которой на диагонали стоят собственные значения матрицы A, а V – матрица, столбцами
которой являются собственные вектора матрицы A. Тогда справедливо соотношение:
AV = VΛ . Если V несингулярная матрица, то матрицу A можно представить в виде
разложения: A = VΛ V-1. Возьмем матрицу A из предыдущего примера:

A=
0 -6 -1
6 2 -16
-5 20 -10

Тогда функция eig(A) возвращает вектор собственных значений матрицы A:

lambda = eig(A)
lambda =
-3.0710
-2.4645 +17.6008i
-2.4645 -17.6008i

Так как действительная часть собственных значений является отрицательной, то e t


стремится к нулю с ростом t. Ненулевая мнимая часть двух собственных значений, ,
является осциллирующей, sin(t), компонентой решения дифференциального
уравнения.
Для вычисления собственных значений и собственных векторов матрицы A используется
формат команды 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, а собственные значения – в


диагональных элементах матрицы D. Собственные векторы масштабированы так, чтобы
евклидова норма каждого вектора равнялась единице.

Нормальная форма Жордана.


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

53
• J=jordan(A) возвращает жорданову нормальную форму J;
• [V,J] = jordan(A) вычисляет как жорданову форму J, так и матрицу
трансформации V, столбцами которой являются обобщенные собственные векторы.
Более точно, V\A*V=J.

Рассмотрим пример:

A = [12, 32, 66, 116; -25, -76, -164, -294;...


21, 66, 143, 256; -6, -19, -41, -73]

A =
12 32 66 116
-25 -76 -164 -294
21 66 143 256
-6 -19 -41 -73

[V, J] = jordan(A)
V =
4 -2 4 3
-6 8 -11 -8
4 -7 10 7
-1 2 -3 -2

J =
1 1 0 0
0 1 0 0
0 0 2 1
0 0 0 2

Очевидно, что матрица A имеет собственные значения 1 и 2, каждое из которых имеет


кратность два. Матрица имеет только два собственных вектора: V(:, 1) и V(:, 3),
которые удовлетворяют соотношениям:

A*V(:, 1) = 1*V(:, 1)
A*V(:, 3) = 2*V(:, 3)

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


удовлетворяющими соотношениям:

A*V(:, 2) = 1*V(:, 2) + V(:, 1)


A*V(:, 4) = 2*V(:, 4) + V(:, 3)

Или в математической нотации:

(A- 2I)v4=v3
(A- 1I)v2=v1

Разложение Шура.
С помощью функции schur можно представить матрицу A в виде произведения: A=USU’,
где U – унитарная матрица, а S – матрица Шура. Действительная форма Шура имеет
действительные собственные значения на диагонали, а комплексные собственные

54
значения представлены 2x2 блоками, занимающими нижнюю поддиагональ. Для матрицы
A из предыдущего примера имеем:

[U, S] = schur(A)

U=
0.4815 -0.8033 -0.3476 0.0440
-0.7223 -0.1404 -0.6539 0.1759
0.4815 0.5421 -0.5300 0.4398
-0.1204 -0.2028 0.4131 0.8796

S=
1.0000 -2.2351 -33.6613 470.5067
0.0000 1.0000 -5.9193 118.5827
0 0 2.0000 -16.7473
0 0 0 2.0000

Сингулярное разложение.
Скаляр  и векторы u, v называются сингулярным значением и сингулярными векторами
прямоугольной матрицы A, если выполняются соотношения:

Av = u и A’u = v.

Эти соотношения можно переписать в виде:

AV = U и A’U = V,

Где  – диагональная матрица, элементами которой являются сингулярные значения , U


и V – ортогональные матрицы, столбцы которых образуют соответствующие сингулярные
векторы u и v. В силу ортогональности матриц U и V справедливо разложение:

A = UV’

Сингулярное разложение проводится с помощью функции svd. Рассмотрим пример:

A =[9 4; 6 8; 2 7]
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

55
V=
-0.6925 0.7214
-0.7214 -0.6925

Численное интегрирование.
Численное интегрирование заключается в приближенном вычислении определенного
интеграла с помощью одной из квадратурных формул. Рассмотрим применение функции
quad, которая выполняет интегрирование по методу низкого порядка, используя
рекурсивное правило Симпсона.
Найдем значение определенного интеграла для функции f(x)=x3 на отрезке [0, 1] :

quad('x.^3', 0, 1, 1.e-8)
ans =
0.2500

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


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

q = dblquad(fun, xmin, xmax, ymin, ymax, tol)

здесь fun – подынтегральная функция, tol – относительная погрешность, а остальные


параметры задают пределы интегрирования.
Пример:

Q = dblquad(inline('y*sin(x)+x*cos(y)'), pi, 2*pi, 0, pi)


Q=
-9.8696

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


В системе MATLAB полином представляется с помощью вектора-строки, содержащего
упорядоченные по убыванию коэффициенты полинома. Например, чтобы представить
многочлен p(x)=x3-2x-5, следует создать вектор:

p = [1 0 -2 -5];

Умножение и деление многочленов.


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

a = [1 2 3]; b = [4 5 6];
c = conv(a, b)
c=
4 13 28 27 18

Разделим многочлен c на a:

56
[q, r] = deconv(c, a)
q=
4 5 6
r=

0 0 0 0 0

Вектор r представляет собой остаток.

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


Для определения производной от многочлена используется функция polyder. Вычислим
производную от многочлена p:

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, используя вызов функции с одним


выходным параметром:

c = polyder(a, b)
c =
8 30 56 38

Для вычисления производной от частного a/b, следует использовать вызов функции с


двумя выходными параметрами:

[q, d] = polyder(a, b)
q=
-2 -8 -2

d=
4 16 40 48 36

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

Вычисление значения многочлена.


Для вычисления значения многочлена следует использовать функцию polyvalm:

p = [1 0 -2 -5];
polyval(p, 5)

ans =
110

57
Функция polyvalm позволяет также вычислять матричный многочлен. Вычислим
значение многочлена p(X)=X3-2X-5I от квадратной матрицы X :

X = [2 4 5; -1 0 3; 7 1 5];
Y = polyvalm(p, X)

Y=

377 179 439


111 81 136
490 253 639

Нахождение корней многочлена.


Корни многочлена можно найти с помощью функции roots:

r = roots(p)
r=
2.0946
-1.0473 + 1.1359i
-1.0473 - 1.1359i

Здесь p – вектор из предыдущего примера, r – вектор, компонентами которого являются


корни многочлена.

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


Функция poly возвращает коэффициенты многочлена, если корни его известны:

p2 = poly(r)

p2 =
1.0000 0 -2.0000 -5.0000

Построение характеристического многочлена.


Если в качестве аргумента использовать матрицу, то функция poly возвращает
коэффициенты характеристического многочлена:

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

p = poly(A)
p=
1.0 -6.0000 -72.0000 -27.0000

Минимизация функций.
Для нахождения минимума функции одной переменной на заданном интервале следует
использовать функцию fminbnd. Найдем на интервале [0.2, 1] минимум функции

1 1
f ( x) = + −6
( x − 0.3) + 0.01 ( x − 0.9) 2 + 0.04
2

58
f = inline('1./((x-0.3).^2 + 0.01) + 1./((x-0.9).^2 + 0.04)-6');
x = fminbnd(f, 0.2, 1)

x =
0.6370
fplot(f,[0.2 1]); grid on;

100

80

60

40

20

0
0.2 0.4 0.6 0.8 1

Функция fplot используется для вывода графика операторной функции f на заданном


интервале [0.2, 1].
Для минимизации функций нескольких переменных можно использовать функцию
fminsearch. Поиск минимума основан на симплекс-методе Нелдера – Мида, который
сводится к построению симплекса в n-мерном пространстве, заданного n+1 вершиной. В
двумерном пространстве симплекс является треугольником, а в трехмерном – пирамидой.
На каждом итерационном шаге значение функции в новой точке (приближенном
решении) сравнивается со значениями функции в вершинах симплекса. В результате
новая точка заменяет ближайшую вершину симплекса. Итерации повторяются до тех пор,
пока размеры симплекса не станут меньше заданной погрешности метода.
В качестве примера рассмотрим поиск минимума тестовой функции Розенброка:

f ( x ) = 100 ( x 2 − x12 ) 2 + (1 − x1 ) 2

Минимальное значение этой функции равно нулю и достигается в точке [1, 1].

f = inline('100*(x(2)-x(1)^2)^2+(1-x(1))^2;');

[x, fval] = fminsearch(f,[-1.2, 1])


x=
1.0000 1.0000

fval =
8.1777e-010

Первый входной параметр функции fminsearch описывает функцию одной или


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

59
поверхность функции Розенброка и отмечает точками на графике каждый итерационный
шаг:

x=-2:.25:2; y=-1:.25:3;
[xx, yy]=meshgrid(x, y);
zz=100*(yy-xx.^2).^2+(1-xx).^2;
mesh(x, y, zz, 'FaceColor', 'non', 'EdgeColor', 'k');
axis off; view(13,32);
hold on;
plot3(-1.9, 2, 267.62,'ko','MarkerSize', 15,
'LineWidth', 2, 'EraseMode', 'none');
text(-1.9, 2.2, 267.62,' Begin', 'Color',[0 0 0], 'EraseMode','none');
plot3(1,1,0,'ko', 'MarkerSize',15, 'LineWidth',2, 'EraseMode','none');
text(0.8, 1.4, 0,' End', 'Color',[0 0 0], 'EraseMode','none');
x=[-1.9 2]; % Начальное приближение
f='[100*(x(2)-x(1)^2)^2+(1-x(1))^2; minfn(x)]';
[x, fval, exitflag, output] = fminsearch(f, x);

function out=minfn(currPos)
x1=currPos(1); y1=currPos(2);
z1=100*(y1-x1.^2).^2+(1-x1).^2;
plot3(x1,y1,z1,'r.', 'EraseMode','none', 'MarkerSize',25);
out = [];

Метки Begin и End обозначают начальное и конечное приближение. Функции fminbnd


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

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


Для решения системы нелинейных уравнений вида F(x)=0, где F(x) – векторная
функция, а x – радиус вектор можно использовать функцию fsolve из пакета Optimization
Toolbox. Рассмотрим в качестве примера систему из двух уравнений:

2 x1 − x2 − e − x1 = 0 ,
− x1 + 2 x2 − e − x2 = 0 .

60
x0 = [-5; -5]; % Нулевое приближение
F ='[2*x(1)-x(2)-exp(-x(1));-x(1)+2*x(2)-exp(-x(2))];'; % Вектор-
функция
options=optimset('Display','final'); % Задание управляющих параметров
x = fsolve(F, x0, options) % Вызов оптимизирующей функции
Optimization terminated successfully:
Relative function value changing by less than OPTIONS.TolFun
x=
0.5671
0.5671

Преобразование Фурье.
Дискретное преобразование Фурье (DFT) является основным средством цифровой
обработки сигнала. MATLAB содержит функции быстрого преобразования Фурье (FFT)
для одномерных, двумерных и многомерных массивов. Прямое и обратное
преобразования Фурье основаны на формулах:

N −1 N −1
1  2π 
X ( k + 1) = ∑x ( n + 1)Wnkn , x ( n + 1) = ∑ X (k +1)W
n
−kn
, W = e − j  N  .
n =0 N k =0 N

Прямое преобразование Фурье (функция fft) переводит описание сигнала (функции


времени) из временной области в частотную, а обратное преобразование Фурье (функция
ifft) – из частотной области во временную.

Создадим, например, вектор времени и сигнал:

t = (0:1/99:1); % Вектор времени


x = sin(2*pi*15*t) + sin(2*pi*40*t); % Сигнал

Найдем частотное описание сигнала, его амплитуду и фазу:

y = fft(x); % Вычисление DFT of x


m = abs(y); p = unwrap(angle(y)); % Расчет амплитуды и фазы

Построим графики зависимости амплитуды и фазы от частоты:

subplot(1,2,1);
f = (0:length(y)-1)*99/length(y); % Частотный вектор
plot(f, m); title('Magnitude');
set(gca,'XTick',[15 40 60 85]);
subplot(1, 2, 2);
plot(f,p*180/pi); title('Phase');
set(gca,'XTick',[15 40 60 85]);

61
M
a
gn
itu
de P
h
as
e
5
0 0

4
0 -2
00

-4
00
3
0
-6
00
2
0
-8
00
1
0 -1
00
0

0 -1
20
0
1
5 4
0 6
0 8
5 1
5 4
0 6
0 8
5

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


двухчастотный сигнал в 50Гц и 120Гц на фоне сильного шума, создаваемого генератором
случайных чисел:

t = 0:0.001:0.6;
x = sin(2*pi*50*t)+sin(2*pi*120*t);
y = x + 2*randn(size(t));

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

Y = fft(y, 512);
Pyy = Y.* conj(Y) / 512;

Здесь использован n-точечный формат вызова функции fft. Метод является особенно
эффективным при n=2m, где m – целое положительное число.

Построим графики зашумленного и восстановленного сигналов:

subplot(1, 2, 1);
plot(y(1:50))
title('Искаженный сигнал')
xlabel('time (seconds)')

subplot(1, 2, 2);
f = 1000*(0:256)/512;
plot(f, Pyy(1:257))
title('Плотность спектра')
xlabel('частота (Hz)')

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


спектрограмма сигнала показывает два явных пика на общем шумовом фоне.

62
È ñêàæåí í û é ñèãí àë Ï ëî òí î ñòü ñï åêòðà
6 6
0
4 5
0
2 4
0
0 3
0
-
2 2
0
-
4 1
0
-
6 0
0 2
0 4
0 6
0 0 2
0
0 4
0
0 6
0
0
time (seconds) ÷àñòî òà (Hz)

Решение обыкновенных дифференциальных уравнений.


Для решения систем обыкновенных дифференциальных уравнений (ОДУ) в MATLAB
реализованы различные численные методы – решатели (solvers) ОДУ. Рассмотрим вначале
задачу Коши, записанную в векторной форме:

y ' = f (t , y )
y (t 0 ) = y 0

Перечислим решатели предназначенные для нежестких систем ОДУ:

• ode45 – одношаговые явные методы Рунге-Кутта 4-го и 5-го порядка точности.


Это классический метод, рекомендуемый для начальной пробы решения;
• ode23 – одношаговые явные методы Рунге-Кутта 2-го и 3-го порядка. При низких
требованиях к точности этот метод может оказаться более эффективным, чем
ode45;
• ode113 – многошаговый метод Адамса-Башворта-Мултона переменного порядка.
Это адаптивный метод, который может обеспечить высокую точность решения.

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


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

• ode15s – многошаговый метод переменного порядка (от 1-го до 5-го) основанный


на формулах численного дифференцирования. Это адаптивный метод, его стоит
применять, если решатель ode45 дает сбой;
• ode15s – одношаговый метод, использующий модифицированную формулу
Розенброка 2-го порядка. Обеспечивает высокую скорость вычислений при низкой
точности;
• ode23t – метод трапеций с интерполяцией. Используется для решения умеренно-
жестких задач;
• ode23tb – реализация неявного метода Рунге-Кутта. При низкой точности этот
метод может оказаться более эффективным, чем ode15s.

Покажем применение решателя ОДУ на классическом примере уравнения Ван-дер-Поля,


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

63
y '1 = y 2
y ' 2 = µ(1 − y12 ) y 2 − y1

Опишем правую часть системы уравнений для случая =1 с помощью функции vdp1:

function dydt = vdp1(t, y)


dydt = [y(2); (1-y(1)^2)*y(2)-y(1)];

Для решения системы на отрезке [0 20] с начальными условиями y(1) = 2 и y(2) = 0


будем использовать решатель ode45:

[t, y] = ode45(@vdp1,[0 20],[2; 0]);

Построим график решения:

plot(t, y(:, 1), '-', t, y(:, 2), '--')


title('Solution of van der Pol Equation, \mu = 1');
xlabel('time t');
ylabel('solution y');
legend('y_1','y_2')
SolutionofvanderPolEquation, µ=1
3
y
1
2 y2

1
solution y

-1

-2

-3
0 5 10 15 20
timet

Численное решение дифференциальных уравнений в частных производных.

Для численного решения систем дифференциальных уравнений (PDE) второго порядка


следует использовать пакет прикладных программ под названием Partial Differential
Equations Toolbox. Укажем основные возможности пакета:

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


• задание смешанных граничных условий, условий Дирихле и Неймана;
• использование нелинейных и адаптивных расчетных схем;
• визуализация решения.

64
∂2u
Для решения гиперболических PDE, имеющих вид d − ∇ ⋅ ( c∇u ) + au = f , служит
∂t 2
функция hyperbolic. Рассмотрим один из нескольких имеющихся форматов вызова:

u1=hyperbolic(u0, ut0, tlist, b, p, e, t, c, a, f, d).

Здесь параметры p, e и t описывают сетку расчетной области. Детали можно посмотреть


в описании функции initmesh, которая проводит триангуляцию расчетной области.
Параметр b отвечает за постановку граничных условий. Он может быть матрицей или
именем m-файла. Граничные условия могут зависеть от времени t. Подробности можно
найти в описаниях функций assemb и pdebound.
Коэффициенты c, a, d, и f можно задавать различными способами, они могут также
зависеть от времени t. Детали изложены в описании функции assempde.
Параметры u0 и ut0 задают значение функции и производной в начальный момент
времени.
В случае единственного уравнения, каждая строка матрицы u1 содержит решение в узлах
сетки, координаты которых задаются соответствующим столбцом в p. Каждый столбец в
u1 является решением в момент времени, который определяется соответствующей
координатой вектора tlist.
Если решается система из N уравнений на сетке из np узлов, то первые np строк из u1
описывают первую компоненту решения u; следующие np строк описывают вторую
компоненту u, и так далее.

Рассмотрим решение уравнения колебания мембраны


∂2 u
= ∆u
∂t 2
в квадратной области −1 ≤ x, y ≤1 (squareg), с граничными условиями Дирихле
u = 0 для x = ±1 ,

и граничными условиями Неймана

∂u
= 0 для y = ±1 (squareb3).
∂n
Положим

u ( 0) = arctan(cos (πx )) и ∂u (0) ∂t =3 sin( πx ) exp(cos( πy )) .

Решение будем искать на временном интервале от 0 до 5 с шагом 1/6.

[p, e, t]=initmesh('squareg');
x=p(1, :)'; y=p(2,:)';
u0=atan(cos(pi/2*x));
ut0=3*sin(pi*x).*exp(cos(pi*y));
tlist=linspace(0, 5, 31);
uu=hyperbolic(u0, ut0, tlist,'squareb3', p, e, t, 1, 0, 0, 1);

Построим график решения на третьем временном слое с помощью функции pdeplot:

umax=max(max(uu)); umin=min(min(uu)); i=3;

65
pdeplot(p, e, t, 'xydata', uu(:, i),'zdata', uu(:,i),'zstyle',
'continuous','mesh','on','colorbar','off');
axis([-1 1 -1 1 umin umax]); caxis([umin umax]);

-2
1
1
0 0
-1 -1
∂u
Для решения параболических PDE, имеющих вид d − ∇⋅ ( c∇u ) + au = f , служит
∂t
функция parabolic.

Рассмотрим решение уравнения теплопроводности

∂u ∂t =∆u
в квадратной области −1 ≤ x, y ≤1 (squareg), с граничными условиями Дирихле

u = 0 (squareb1).

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

u(0) = 1 при x 2 + y 2 < 0.4 2 , и u (0) = 0 в противном случае.

Решение будем искать на временном интервале от 0 до 0.1 с шагом 1/20.

[p, e, t]=initmesh('squareg');
[p, e, t]=refinemesh('squareg', p, e, t);
u0=zeros(size(p, 2), 1);
ix=find(sqrt(p(1,:).^2+p(2,:).^2)<0.4);
u0(ix)=ones(size(ix));
tlist=linspace(0, 0.1, 21);
uu=parabolic(u0, tlist, 'squareb1', p, e, t, 1, 0, 1, 1);

Построим график решения на одиннадцатом шаге по времени с помощью функции


pdeplot, используя команды из предыдущего примера:

66
1

0.5

0
1
1
0 0
-1 -1

Для решения эллиптических PDE, имеющих вид − ∇⋅ ( c∇u ) + au = f , служит функция


assempde.

Решим уравнение

− ∆u = 1 в области L – образной формы:


При решении будем использовать однородные граничные условия Дирихле.
Построим триангуляционную сетку узлов:

[p, e, t]=initmesh('lshapeg','Hmax', 0.2);


[p, e, t]=refinemesh('lshapeg', p, e, t);
pdemesh(p, e, t)

0.5

-0.5

-1
-1 -0.5 0 0.5 1

Решим уравнение Пуассона:

u=assempde('lshapeb', p, e, t, 1, 0, 1);

Построим график:

67
pdeplot(p,[],t,'xydata', u,'xystyle','flat','zdata',
u,'zstyle','continuous','mesh','on','colorbar','off');
colormap(cool);
view(164, 28);

0.2

0.15

0.1

0.05

0
-1

0
-0.5 -1
1 1 0.5 0

ЛИТЕРАТУРА

1. Гультяев А. MATLAB 5.2. Имитационное моделирование в среде Windows. – СПб.:


КОРОНА-принт, 1999.
2. Дьяконов В.П., Абраменкова B.В. MATLAB 5.0/5.3. Система символьной математики.
– М.: Нолидж, 1999.
3. Дьяконов В.П. MATLAB: учебный курс. - СПб: Питер, 2001.
4. Мартынов Н.Н., Иванов А.П. MATLAB 5.x. Вычисления, визуализация,
программирование. – М.: КУДИЦ-ОБРАЗ, 2000.
5. Потемкин В.Г. Система инженерных и научных расчетов MATLAB 5.x. В 2-х т. - М.:
ДИАЛОГ-МИФИ, 1999.
6. William W. Broenkow. Introduction to Programming with MATLAB for Scientists and
Engineers, 2e. – ML Books, 2001.
7. Gerald W. Recktenwald. Numerical Methods with MATLAB: Implementation and
Application. – Prentice Hall, 2000.
8. Peter R. Turner. Guide to Scientific Computing, 2e. – Macmillian Press, 2000.
9. Huiaichen Chen. MATLAB and Its Application Guide in Engineering Courses. – Xidian
University Press, 2000.

68