Методическое пособие
2
Утверждено Советом факультета
25 сентября 2001г., протокол № 1
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 выводит на экран свой рабочий стол (desktop), который можно
рассматривать как панель следующих инструментов:
• Command Window – командное окно, служит для выполнения функций;
• Command History – список выполненных ранее функций;
• Launch Pad – панель инструментов, которые не входят в рабочий стол;
6
• Current Directory Browser – просмотр файловой структуры;
• Help Browser – справка, просмотр и поиск документации ;
• Workspace Browser – просмотр рабочей области;
• Array Editor- редактор массивов;
• Editor/Debugger – редактор/отладчик M-файлов (файлы с программным кодом).
КОМАНДНОЕ ОКНО
При работе с командным окном можно использовать операции правки из меню Edit:
Cut – вырезать, Copy – копировать, Paste – вставить, Undo- отменить ввод, и Redo –
повторить ввод.
Для очистки командного окна можно использовать команду clc.
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.
Команда 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 не требует описания типа переменных или размерности. Когда 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 не число
Числа.
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
Сеанс работы с 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–файл.
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);
fid=fopen('t.dat');
T=fread(fid,inf,'double');
fclose(fid);
T=reshape(T,21,21,21);
12
По мере задания одних переменных и стирания других рабочая область перестает быть
непрерывной. Для избежания непроизводительных потерь памяти при работе с
объемными данными следует использовать команду pack, осуществляющую
дефрагментацию рабочей области.
ОПЕРАЦИИ С ФАЙЛАМИ
Броузер позволяет добавлять каталоги в перечень путей MATLAB. Для этого надо
щелкнуть правой кнопкой на окне броузера и выбрать из контекстного меню пункт Add
to Path и сделать выбор из перечня:
• Current Directory – добавить текущий каталог к списку путей;
• Selected Folders – добавить каталог, выбранный с помощью броузера, к
списку путей;
• Selected Folder and Subfolders – добавляет вместе с каталогом все
его подкаталоги к списку путей.
Создать новый файл в текущем каталоге можно, выбрав в контекстном меню пункт 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 текстом замены и провести полную или частичную замену.
Для очистки дневника можно также выполнить команду Clear Command History из
меню Edit. Сделав двойной щелчок на записи дневника можно выполнить
соответствующую команду. Например, двойной щелчок на записи edit myfile
откроет файл myfile.m в режиме редактора. Строчки из дневника можно копировать и
переносить в командное окно с помощью команд Copy и Past контекстного меню. Окно
дневника выводится и убирается командой Command History из меню View.
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];
A(2, 3)=10;
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
Векторные индексы.
Из предыдущего примера следует, что в качестве индексов могут использоваться векторы.
Если 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]);
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
17
7 8 3 4
9 10 5 6
Транспонирование матриц.
Матрицы можно транспонировать с помощью оператора ‘ (апостроф), например A’ –
транспонированная матрица A. Для комплексных матриц транспонирование дополняется
комплексным сопряжением. Строки транспонированной матрицы соответствуют
столбцам исходной матрицы.
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.
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
M=1:6
M =
1 2 3 4 5 6
A=reshape(M, 2, 3)
A =
1 3 5
2 4 6
M = linspace(1, 2, 5)
19
M =
1.0 1.2500 1.5000 1.7500 2.0000
Разреженные матрицы.
Матрицы, содержащие большое число элементов с нулевыми значениями называются
разреженными. Такие матрицы обычно возникают при решении краевых задач для систем
дифференциальных уравнений методом сеток. С разреженными матрицами удобно
работать, используя компактные схемы хранения только ненулевых элементов матрицы.
Помимо ненулевых элементов в разреженном формате необходимо хранить индексную
информацию, указывающую расположение каждого элемента в регулярном массиве. Эта
дополнительная информация является ценой, которую приходится платить за отказ от
хранения нулей. Для разреженных матриц в MATLAB имеется ряд функций, подборка из
которых приводится ниже:
20
0 0 1 -2 1
0 0 0 1 -2
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
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
ГРАФИКА
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, ‘цвет_стиль_маркер’),
• Символы цвета: ‘c’, ‘m’, ‘y’, ‘r’, ‘g’, ‘b’, ‘w’ и ‘k’ обозначают голубой, малиновый,
желтый, красный, зеленый, синий, белый и черный цвета соответственно;
• Символы типа линий: ‘– ‘ для сплошной, ‘––‘ для разрывной, ‘:’ для
пунктирной, ‘–.’ для штрихпунктирной линий и ‘none’ для ее отсутствия;
• Наиболее часто встречающиеся маркеры: ‘+’, ‘o’, ‘*’, и ‘x’.
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');
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 – это номер в заголовке окна. Результаты всех команд будут выводиться в текущее окно.
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:
26
• axis on – восстанавливает ранее введенные обозначения осей и маркеры.
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.
27
Следует отметить, что для всех графиков возможна индивидуальная установка
дополнительных объектов, например титульных надписей, надписей по осям и т.д.
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
-π ≤ Θ≤ π
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
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
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
[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
32
Основные типы данных.
В MATLAB определены 14 основных типов данных (или классов), представляющих собой
форму массива. Массивы могут быть многомерными или иметь размерность 0x0.
Двумерные массивы принято называть матрицами. Типы данных кратко описаны в
следующей таблице:
Каждому типу данных можно соотнести некоторые характерные для него операции,
называемые методами. Дочерние типы данных выводятся из родительских классов и
наследуют их методы. Поскольку в иерархии типов данных старшим является array, то все
типы в 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
C = A.^2
C=
64 1 36
9 25 49
16 81 4
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 =
34
Eсли A – квадратная матрица с размерностью nxn, а B – вектор-столбец с n компонентами
или матрица с несколькими такими столбцами, то X = A\B есть решение системы
уравнений AX = B вычисленное методом исключения Гаусса. Если матрица A плохо
масштабирована или близка к сингулярной (определитель матрицы равен нулю), то
система выдает соответствующее предупреждение. Если A не является квадратной
матрицей, то X = A\B является квази-решением недоопределенной (число уравнений
меньше числа неизвестных) или переопределенной (число уравнений больше числа
неизвестных) системы уравнений AX = B.
A.\C
ans =
8 1 6
3 5 7
4 9 2
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. Соответствие функций операторам позволяет одновременно
использовать элементы как операторного, так и функционального программирования.
Операторы отношения.
Операторы отношения служат для сравнения двух величин, векторов или матриц.
Следующая ниже таблица дает полную сводку по операторам отношения.
Рассмотрим примеры:
36
A&B
ans =
0 1
1 0
A|B
ans =
1 1
1 0
~B
ans =
1 0
0 1
xor(A, B)
ans =
1 0
0 0
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
%Основной комментарий
%Дополнительный комментарий
Тело файла с любыми выражениями
%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
запустить его на выполнение.
38
Файл-функция всегда начинается с объявления function, за которым следует один или
несколько идентификаторов выходных параметров, имя функции и список ее входных
параметров. Входные параметры указываются в квадратных скобках. Если входной
параметр один, то скобки можно опустить. Все переменные, имеющиеся в модуле
функции, являются локальными, то есть, доступны только в пределах данной функции.
Связь с другими модулями проходит через входные и выходные параметры. При вызове
функции происходит замена формальных параметров фактическими параметрами.
Рассмотрим в качестве примера функцию, которая вычисляет значение n! (факториал
числа n):
fact(3)
ans =
6
Использование подфункций.
Подфункции объявляются и записываются в теле основных функций и имеют
аналогичную структуру. Подфункции доступны только в пределах m-файла,
определяющего основную (primary) функцию. Рассмотрим код функции newstats с
двумя подфункциями mean и median для вычисления среднего значения и медианы
статистической выборки:
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)
g(3.149, 0.5)
ans =
1.0000
global X Y Z
40
Здесь имя fname – функции, @fname – дескриптор (указатель) функции, fhandle –
переменная функционального типа. Для определения значение функции с помощью ее
функционального указателя можно использовать функцию feval, имеющую структуру:
Рассмотрим пример:
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;
sm(@sin)
ans =
1.4112
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 expression1
statements
elseif expression2
statements
else
statements
end
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_expr
case case_expr
statement,...,statement
case {case_expr1, case_expr2, case_expr3,...}
statement,...,statement
...
otherwise
statement,...,statement
end
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 программы.
Диалоговый ввод.
Диалоговый ввод можно организовать с помощью команды input, имеющей формат:
При выполнении этой команды на экран выводится запрос prompt в виде строки, затем
происходит остановка работы и ожидание ввода с клавиатуры. Необязательный параметр
s указывает, что введенный текст является строкой, а не числом. Примеры:
Пауза.
Для организации паузы в ходе выполнения программы служит команда pause.
Выполнение программы будет продолжаться после нажатия любой клавиши. Для
организации паузы в n секунд, следует использовать команду pause(n).
44
ЧИСЛЕННЫЕ МЕТОДЫ И ОБРАБОТКА ДАННЫХ
• выражение X=B/A дает решение ряда систем линейных уравнений AX=B, где A –
матрица размером mxn и B – матрица размером nxk;
• выражение X=B\A дает решение ряда систем линейных уравнений XA=B, где A –
матрица размером mxn и B – матрица размером nxk;
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
x = A\u
x=
10
-12
5
X = A\B
X=
19 -3 -1
-17 4 13
6 0 -6
45
В рассмотренных примерах найденное решение совпадает с точным, поскольку
определитель матрицы A равен единице, а ее элементы являются целыми числами.
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
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
R = fix(10*rand(2,4))
R =
6 8 7 3
3 5 4 1
b = fix(10*rand(2,1))
b =
1
2
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
n = 10;
on = ones(n, 1);
A = spdiags([-2*on 4*on -on],-1:1, n, n);
b = sum(A, 2);
x = bicg(A, b);
bicg converged at iteration 10 to a solution with relative residual 8.6e-014
det(A)
ans =
1
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(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
[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. Функция используется в следующих формах:
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 .
C = fix(10*rand(3, 2))
C=
6 8
9 6
8 1
[Q, R] = qr(C)
Q=
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
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 = [];
for t = 0:.01:1
X = [X expm(t*A)*u];
end
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
lambda = eig(A)
lambda =
-3.0710
-2.4645 +17.6008i
-2.4645 -17.6008i
[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
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
[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*V(:, 1) = 1*V(:, 1)
A*V(:, 3) = 2*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,
A = UV’
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
p = [1 0 -2 -5];
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
p = [1 0 -2 -5];
q = polyder(p)
q=
3 0 -2
a = [1 3 5]; b = [2 4 6];
c = polyder(a, b)
c =
8 30 56 38
[q, d] = polyder(a, b)
q=
-2 -8 -2
d=
4 16 40 48 36
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=
r = roots(p)
r=
2.0946
-1.0473 + 1.1359i
-1.0473 - 1.1359i
p2 = poly(r)
p2 =
1.0000 0 -2.0000 -5.0000
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
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;');
fval =
8.1777e-010
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 = [];
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
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
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)
y ' = f (t , y )
y (t 0 ) = y 0
63
y '1 = y 2
y ' 2 = µ(1 − y12 ) y 2 − y1
Опишем правую часть системы уравнений для случая =1 с помощью функции vdp1:
1
solution y
-1
-2
-3
0 5 10 15 20
timet
64
∂2u
Для решения гиперболических PDE, имеющих вид d − ∇ ⋅ ( c∇u ) + au = f , служит
∂t 2
функция hyperbolic. Рассмотрим один из нескольких имеющихся форматов вызова:
∂u
= 0 для y = ±1 (squareb3).
∂n
Положим
[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);
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).
[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);
66
1
0.5
0
1
1
0 0
-1 -1
Решим уравнение
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
ЛИТЕРАТУРА
68