Загрузил Всеслав Корнеев

143 Matlab

реклама
Справочник по Matlab
Массивы, матрицы и операции с ними
Математические функции
Линейная алгебра
Анализ и обработка данных
Работа с разреженными матрицами
Графические команды и функции
Массивы, матрицы и операции с ними
Массивы являются основными объектами в системе MATLAB: в версиях 4.х
допускаются только одномерные массивы - векторы - и двумерные массивы - матрицы; в
версии 5.0 возможно использование многомерных массивов - тензоров. Ниже описаны
функции формирования массивов и матриц, операции над матрицами, специальные матрицы
в рамках системы MATLAB версий 4.х.
Формирование массивов специального вида
ZEROS - формирование массива нулей
ONES - формирование массива единиц
EYE - формирование единичной матрицы
RAND - формирование массива элементов, распределенных по равномерному закону
RANDN - формирование массива элементов, распределенных по нормальному закону
CROSS - векторное произведение
KRON - формирование тензорного произведения
LINSPACE - формирование линейного массива равноотстоящих узлов
LOGSPACE - формирование узлов логарифмической сетки
MESHGRID - формирование узлов двумерной и трехмерной сеток
: - формирование векторов и подматриц
Операции над матрицами
DIAG - формирование или извлечение диагоналей матрицы
TRIL - формирование нижнетреугольной матрицы (массива)
TRIU - формирование верхнетреугольной матрицы (массива)
FLIPLR - поворот матрицы относительно вертикальной оси
FLIPUD - поворот матрицы относительно горизонтальной оси
ROT90 - поворот матрицы на 90 градусов
RESHAPE - преобразование размеров матрицы
Специальные матрицы
COMPAN - сопровождающая матрица характеристического многочлена
HADAMARD - матрица Адамара (Hadamard matrix)
HANKEL - матрица Ганкеля (Hankel matrix)
HILB, INVHILB - матрица Гильберта (Hilbert matrix)
MAGIC - магический квадрат
PASCAL - матрица Паскаля (Pascal matrix)
ROSSER - матрица Рессера (Rosser matrix)
TOEPLITZ - матрица Теплица (Toeplitz matrix)
VANDER - матрица Вандермонда (Vandermonde matrix)
2
WILKINSON - матрица Уилкинсона (Wilkinson matrix)
Пакет программ Test Matrix Toolbox
ZEROS
Формирование массива нулей
Синтаксис:
Y = zeros(n)
Y = zeros(m, n)
Y = zeros(size(A))
Описание:
Функция Y = zeros(n) формирует массив нулей размера n х n.
Функция Y = zeros(m, n) формирует массив нулей размера m х n.
Функция Y = zeros(size(A)) формирует массив нулей соразмерный с массивом A.
Примеры:
Формирование одномерного массива из 1000 элементов можно выполнить двумя
способами:
в виде цикла с n = 1000
for i = 1 : n, x(i) = 0; end ,
что требует для реализации около 1.05 с на PC AT/486 (50 МГц);
в виде оператора присваивания
x = zeros(1, 1000);
что требует для реализации лишь 0.11 с на том же компьютере.
Сопутствующие функции: ONES, EYE, RAND, RANDN.
ONES
Формирование массива единиц
Синтаксис:
Y = ones(n)
Y = ones(m, n)
Y = ones(size(A))
Описание:
Функция Y = ones(n) формирует массив единиц размера n х n.
Функция Y = ones(m, n) формирует массив единиц размера m х n.
Функция Y = ones(size(A)) формирует массив единиц соразмерный с массивом A.
Сопутствующие функции: ZEROS, EYE, RAND, RANDN.
EYE
Формирование единичной матрицы
Синтаксис:
Y = eye(n)
Y = eye(m, n)
Y = eye(size(A))
Описание:
Функция Y = ones(n) формирует единичную матрицу размера n х n.
Функция Y = ones(m, n) формирует единичную матрицу размера m х n.
Функция Y = ones(size(A)) формирует единичную матрицу соразмерную с матрицей A.
Сопутствующие функции: ZEROS, ONES, RAND, RANDN.
Формирование массива элементов, распределенных по равномерному
RAND
закону
3
Синтаксис:
X = rand(n)
X = rand(m, n)
rand
rand(„seed‟)
X = rand(size(A)) rand(„seed‟, x0)
Описание:
Функция X = rand(n) формирует массив размера n х n, элементами которого являются
случайные величины, распределенные по равномерному закону в интервале (0, 1).
Функция X = rand(m, n) формирует массив размера m х n, элементами которого
являются случайные величины, распределенные по равномерному закону в интервале (0, 1).
Функция X = rand(size(A)) формирует массив соразмерный с матрицей A, элементами
которого являются случайные величины, распределенные по равномерному закону в
интервале (0, 1).
Функция rand без аргументов формирует одно случайное число, подчиняющееся
равномерному закону распределения в интервале (0, 1), которое изменяется при каждом
последующем вызове.
Функция rand(„seed‟) возвращает текущее значение базы (начального значения)
генератора случайных чисел.
Функция rand(„seed‟, x0) присваивает базе (начальному значению) генератора
случайных чисел значение x0.
Алгоритм:
Алгоритм генерации равномерно распределенных случайных чисел основан на
линейном конгруентном методе, описанном в работе [1]. Вычисление следующего
случайного числа реализовано согласно соотношению
seed = (77 х seed) (mod(231 -1).
Примеры:
Обращение к генератору равномерно распределенных случайных чисел реализуется
следующим образом
X = rand(3, 4)
X=
0.0579 0.0099 0.1987 0.1988
0.3529 0.1389 0.6038 0.0153
0.8132 0.2028 0.2722 0.7468
Этот результат может оказаться иным и зависит от версии системы и предыстории
сеанса работы.
Сопутствующие функции: RANDN, SPRANDN.
Ссылки:
1. Park S. K., Miller K. W. Random Number Generators: Good ones are hard to find//
Comm. ACM. N.10. Vol. 32, 1988, P. 1192-1201.
Формирование массива элементов, распределенных по
RANDN
нормальному закону
Синтаксис:
X = randn(n)
randn
X = randn(m, n)
X=
randn(size(A))
Описание:
randn(„seed‟)
randn(„seed‟, x0)
4
Функция X = randn(n) формирует массив размера n х n, элементами которого являются
случайные величины, распределенные по нормальному закону с математическим ожиданием
0 и среднеквадратическим отклонением 1.
Функция X = randn(m, n) формирует массив размера m х n, элементами которого
являются случайные величины, распределенные по нормальному закону с математическим
ожиданием 0 и среднеквадратическим отклонением 1.
Функция X = randn(size(A)) формирует массив соразмерный с матрицей A,
элементами которого являются случайные величины, распределенные по нормальному
закону с математическим ожиданием 0 и среднеквадратическим отклонением 1.
Команда randn без аргументов формирует одно случайное число, распределенное по
нормальному закону с математическим ожиданием 0 и среднеквадратическим отклонением
1, которое изменяется при каждом последующем вызове.
Команда randn(„seed‟) возвращает текущее значение базы (начального значения)
генератора нормально распределенных случайных чисел.
Команда randn(„seed‟, x0) присваивает базе (начальному значению) генератора
случайных чисел значение x0.
Алгоритм:
Алгоритм генерации нормально распределенных случайных чисел использует для
формирования несколько значений равномерно распределенных случайных чисел, которые
обрабатываются в соответствии с алгоритмом, описанным в работе [1].
Примеры:
Обращение к генератору нормально распределенных случайных чисел реализуется
следующим образом
X = randn(3, 4)
X=
-0.4326 0.2877 1.1892 0.1746
-1.6656 -1.1465 -0.0376 -0.1867
0.1253 1.1909 0.3273 0.7258
Этот результат может оказаться иным и зависит от версии системы и предыстории
сеанса работы.
Сопутствующие функции: RAND.
Ссылки:
1. Forsythe G. E., Malcolm M. A., Moler C. B. Computer Methods for Mathematical
Computations. Prentice-Hall, 1977.
CROSS
Векторное произведение
Синтаксис:
c = cross(a, b)
Описание:
Функция c = cross(a, b) формирует векторное произведение двух векторов в
трехмерном пространстве.
Результирующий вектор имеет следующее описание:
c = a x b = (aybz - azby)i + (azbx - axbz)j + (axby - aybx)k.
Сопутствующие функции: LINSPACE, KRON.
KRON
Синтаксис:
K = kron(X, Y)
Описание:
Формирование тензорного произведения
5
Функция K = kron(X, Y) формирует тензорное произведение (произведение
Кронекера) двух числовых массивов (матриц), так что результирующий массив (матрица)
имеет вид
K = X х Y = [xij * Y] =
Его размер равен m * size(Y, 1) х n * size(Y, 2).
Сопутствующие функции: CROSS, LINSPACE, MESHGRID.
LINSPACE
Формирование линейного массива равноотстоящих узлов
Синтаксис:
x = linspace(x1, x2)
x = linspace(x1, x2, n)
Описание:
Функция x = linspace(x1, x2) формирует линейный массив размера 1 х 100, начальным
и конечным элементами которого являются точки x1 и x2.
Функция x = linspace(x1, x2, n) формирует линейный массив размера 1 х n, начальным
и конечным элементами которого являются точки x1 и x2.
Сопутствующие функции: LOGSPACE, MESHGRID, :.
LOGSPACE
Формирование узлов логарифмической сетки
Синтаксис:
x = logspace(d1, d2)
x = logspace(d1, d2, n)
Описание:
Функция x = logspace(d1, d2) формирует вектор-строку, содержащую 50 равноотстоящих в
логарифмическом масштабе точек, которые покрывают диапазон от 10d1 до 10d2.
Функция x = logspace(d1, d2, n) формирует вектор-строку, содержащую n равноотстоящих в
логарифмическом масштабе точек, которые покрывают диапазон от 10d1 до 10d2.
Сопутствующие функции: LINSPACE, MESHGRID, :.
MESHGRID
Формирование узлов двумерной и трехмерной сеток
Синтаксис:
[X, Y] = meshgrid(x, y)
[X, Y] = meshgrid(x)
[X, Y, Z] = meshgrid(x, y, z)
Описание:
Функция [X, Y] = meshgrid(x, y) формирует массивы X и Y, которые определяют
координаты узлов прямоугольника, задаваемого векторами x и y. Этот прямоугольник задает
область определения функции от двух переменных, которую можно построить в виде 3Dповерхности.
Функция [X, Y] = meshgrid(x) является сокращенной формой записи функции [X, Y] =
meshgrid(x, x).
Функция [X, Y, Z] = meshgrid(x, y, z) формирует массивы X, Y и Z, которые
определяют координаты узлов параллелепипеда, задаваемого векторами x, y и z. Этот
параллелепипед задает область определения для вычисления функции от трех переменных и
построения 3D-параметрических поверхностей.
Пример:
Для вычисления функции
в области -2 < x < 2, -2 < y < 2 необходимо выполнить
следующую последовательность операций:
6
[X, Y] = meshgrid(-2:.2:2, -2:.2:2);
Z = X.*exp(-X.^2 - Y.^2);
mesh(Z)
Сопутствующие функции: SURF, SLICE.
Формирование векторов и подматриц
:
Синтаксис:
j:k
A(i1 : i2, j1 : j2)
j : i : k A(n1 : n2)
Описание:
Оператор : является очень полезным оператором языка MATLAB. Он применяется
для формирования векторов и матриц или для выделения из них подвекторов, подматриц,
подблоков массива.
Формирование векторов:
j:k
если j >= k, это вектор вида [j j+1 j+2 ... k];
если j < k, это пустой вектор;
j:i:k
если j >= k, это вектор вида [j j+i j+2i... k];
если i < 0 и j < k, или i > 0 и j>k, это пустой вектор.
Выделение подблоков:
A(i1 : i2, j1 : j2) - выделение подблока массива A со строками i1 : i2 и столбцами j1 : j2.
A(i, :) - i-я строка массива A;
A(:, j) - j-й столбец массива A.
Поскольку в языке MATLAB элементы массива упорядочены по столбцам, то допустимы
операторы вида A(n1:n2), которые выделяют пронумерованные элементы с номера n1 до
номера n2. Оператор A( : ) записывает все элементы массива A в виде столбца.
Сопутствующие функции: LINSPACE, LOGSPACE, MESHGRID.
DIAG
Синтаксис:
X = diag(v)
Формирование или извлечение диагоналей матрицы
v = diag(X)
X = diag(v, k)
v = diag(X, k)
Описание:
Функция X = diag(v) формирует квадратную матрицу X с вектором v на главной
диагонали.
Функция X = diag(v, k) формирует квадратную матрицу X порядка length(v)+abs(k) с
вектором v на k-й диагонали.
7
Функция v = diag(X) извлекает из матрицы X главную диагональ.
Функция v = diag(X, k) извлекает из матрицы X диагональ с номером k; при k > 0 это
номер k-й верхней диагонали, при k < 0 это номер k-й нижней диагонали.
Примеры:
diag(diag(X)) - диагональная матрица;
sum(diag(X)) - след матрицы X.
Оператор
diag(-m : m) + diag(ones(2*m, 1), 1) + diag(ones(2*m, 1), -1)
формирует трехдиагональную матрицу размера 2*m + 1.
Для m = 3 результирующая матрица имеет вид: m = 3;
diag(-m:m)+diag(ones(2*m,1),1)+diag(ones(2*m,1),-1)
ans =
1 0 0 0 0 0
3
1 -2 1
0
0 0 0
0 1
-1 1
0 0 0
0 0
1
0
1 0 0
0 0
0
1
1 1 0
0 0
0
0
1 2 1
0 0 0 0 0 1 3
Сопутствующие функции: TRIL, TRIU.
Формирование нижней треугольной матрицы (массива)
TRIL
Синтаксис:
L = tril(X)
L = tril(X, k)
Описание:
Функция L = tril(X) сохраняет нижнюю треугольную часть матрицы X.
Функция L = tril(X, k) сохраняет нижнюю треугольную часть матрицы X начиная с
диагонали с номером k. При k > 0 это номер k-й верхней диагонали, при k < 0 это номер k-й
нижней диагонали.
Пример:
Для массива X=[1 2 3; 4 5 6; 1 2 3; 4 5 6; 1 2 3; 4 5 6]
X=
tril(X) =
tril(X, -2) =
1
2
3
1
0
0
0
0
0
4
5
6
4
5
0
0
0
0
1
2
3
1
2
3
1
0
0
4
5
6
4
5
6
4
5
0
1
2
3
1
2
3
1
2
3
4
5
6
4
5
6
4
5
6
Сопутствующие функции: DIAG, TRIU
TRIU
Синтаксис:
Формирование верхней треугольной матрицы (массива)
8
U = triu(X)
U = triu(X, k)
Описание:
Функция U = triu(X) сохраняет верхнюю треугольную часть матрицы (массива) X.
Функция U = triu(X, k) сохраняет верхнюю треугольную часть матрицы (массива) X
начиная с диагонали с номером k. При k > 0 это номер k-й верхней диагонали, при k < 0 это
номер k-й нижней диагонали.
Пример:
Для массива X=[1 2 3; 4 5 6; 1 2 3; 4 5 6; 1 2 3; 4 5 6]
X=
triu(X) =
triu(X, -2) =
1
2
3
1
2
3
1
2
3
4
5
6
0
5
6
4
5
6
1
2
3
0
0
3
1
2
3
4
5
6
0
0
0
0
5
6
1
2
3
0
0
0
0
0
3
4
5
6
0
0
0
0
0
0
Сопутствующие функции: DIAG, TRIL.
Поворот массива относительно вертикальной оси
FLIPLR
Синтаксис:
B = fliplr(A)
Описание:
Функция B = fliplr(A) переставляет столбцы массива A симметрично относительно
вертикальной оси. Если массив A имеет нечетное число столбцов, то средний столбец
остается на своем месте.
Пример:
Для массива A = [1 2 3 4; 1 2 3 4 ; 1 2 3 4]
A=
fliplr(A) =
1
2
3
4
4
3
2
1
1
2
3
4
4
3
2
1
1
2
3
4
4
3
2
1
1
2
3
4
4
3
2
1
Сопутствующие функции: FLIPUD, ROT90
FLIPUD
Поворот массива относительно горизонтальной оси
Синтаксис:
B = flipud(A)
Описание:
Функция B = flipud(A) переставляет строки массива A симметрично относительно
горизонтальной оси. Если массив A имеет нечетное число строк, то средняя строка остается
на своем месте.
Пример:
Для массива A = [1 1 1; 2 2 2; 3 3 3; 4 4 4]
A=
flipud(A) =
9
1
1
1
4
4
4
2
2
2
3
3
3
3
3
3
2
2
2
4
4
4
1
1
1
Сопутствующие функции: FLIPLR, ROT90.
Поворот массива на 90 градусов
ROT90
Синтаксис:
B = rot90(A)
B = rot90(A, k)
Описание:
Функция B = rot90(A) осуществляет поворот массива A размером m х n на 90
градусов против часовой стрелки.
Функция B = rot90(A, k) осуществляет поворот массива A размером m х n на 90*k, где
k = 1, -1, 2, -2,...
Пример:
Для массива A = [ 1 2 3; 4 5 6]
A=
B = rot90(A) =
C = rot90(a, -2) =
1
2
3
3
6
6
5
4
4
5
6
2
5
3
2
1
1
4
Сопутствующие функции: VIEW, FLIPUD, FLIPLR.
Преобразование размеров массива
RESHAPE
Синтаксис:
B = reshape(A, m, n)
Описание:
Функция B = reshape(A, m, n) возвращает массив размером m х n, сформированный из
элементов массива A путем их последовательной выборки по столбцам. Если число
элементов массива A не равно произведению m * n, выводится сообщение об ошибке.
Алгоритм:
С помощью оператора ( : ) можно получить те же результаты, которые можно
получить и с помощью функции reshape. Функция reshape выражается через оператор ( : )
следующим образом:
B = zeros(m, n);
B( : ) = A;
Пример:
Для массива A = [ 1 2 3 4; 1 2 3 4; 1 2 3 4]
reshape(A, 6, 2) =
reshape(A, 2, 6) =
A=
1
2
3
4
1
3
1
1 2 3 3
4
1
2
3
4
1
3
1
2 2 3 4
4
1
2
3
4
1
3
2
4
10
2
4
2
4
Сопутствующие функции и операторы: FLIPLR, FLIPUD, ROT90.
Сопровождающая матрица характеристического
COMPAN
многочлена
Синтаксис:
C = compan(p)
Описание:
Функция C = compan(p) формирует сопровождающую матрицу С для входного
массива p, который состоит из коэффициентов некоторому многочлена степени n.
Пример:
Полиному (x-1)(x-2)(x-3) = x3 - 7x + 6 соответствует вектор коэффициентов p = [1 0 -7
6]; , для которого сопровождающая матрица имеет вид:
C = compan(p)
C=
0 7 -6
1 0 0
0 1 0
Сопутствующие функции: POLY, POLYVAL, POLYVALM.
Матрица Адамара (Hadamard matrix)
HADAMARD
Синтаксис:
H = hadamard(n)
Описание:
Функция H = hadamard(n) возвращает матрицу Адамара порядка n.
Матрицы Адамара встречаются в различных приложениях - комбинаторном и
численном анализе, обработке сигналов [1, 2]. Это матрицы, составленные из 1 и -1, столбцы
которых ортогональны, так что справедливо соотношение
H‟ * H = n * I,
где [n, n] = size(H) и I = eye(n, n).
Матрица Адамара порядка n > 2 существует только тогда, когда n кратно 4. Данный
алгоритм вычисляет матрицы Адамара для тех случаев, когда величины n, n/12, n/20
являются степенями по основанию 2 [3].
Пример:
H = hadamard(8)
H=
1 1 1 1 1 1 1 1
1 -1
1
-1
1 -1
1
-1
-1
1
1 -1
-1
1
1
1
1
1
1 -1
1
1
1
-1
1 -1
-1
1 -1
1 -1 -1
1 -1 -1
1
1 -1 -1 -1 -1
-1 -1
1 -1
-1 -1 -1
1 -1
1
1
1
1
1 -1
11
Картина линий уровня для этой матрицы напоминает ковер
contour(hadamard(8))
Сопутствующие функции: HANKEL, TOEPLITZ, COMPAN.
Ccылки:
1. Ryser H. J. Combinatorial Mathematics. New York: John Wiley&Sons, 1963.
2. Pratt W. K. Digital Signal Processing. New York: John Wiley&Sons, 1978.
3. Golomb S. W., Baumert L. D. The search for Hadamard matrices//Amer. Math. Monthly. Vol.
70, 1963. P. 12-17.
Матрица Ганкеля (Hankel matrix)
HANKEL
Синтаксис:
H = hankel(c)
H = hankel(c, r)
Описание:
Функция H = hankel(c) возвращает квадратную матрицу Ганкеля, первый столбец
которой совпадает с вектором c, а все элементы H(i, j), i + j > n, лежащие ниже второй
главной диагонали, равны нулю.
Функция H = hankel(c, r) возвращает матрицу Ганкеля, первый столбец которой
совпадает с вектором c, а последняя строка с вектором r. Если последний элемент вектора c
не равен первому элементу вектора r, то возникает конфликт на второй главной диагонали,
когда предпочтение отдается элементу вектора c.
Примеры:
c = [1 2 3];
H = hankel(c)
H=
1
2 3
1
2
0
3
0 0
c = 1:3; r = 7:10; H = hankel(c, r)
Warning: Column wins anti-diagonal conflict.
> In d:\matlab5\toolbox\matlab\elmat\hankel.m at line 27
H=
1
2 3
8
2
3
8
9
3
8
9
0
12
Warning: Column wins anti-diagonal conflict.
> In d:\matlab5\toolbox\matlab\elmat\hankel.m at line 27
Столбец выигрывает конфликт на второй главной диагонали
> В d:\matlab5\toolbox\matlab\elmat\hankel.m в строке 27
Сопутствующие функции: TOEPLITZ, VANDER, HADAMARD.
Матрица Гильберта (Hilbert matrix)
HILB, INVHILB
Синтаксис:
H = hilb(n)
H = invhilb(n)
Описание:
Функция H = hilb(n) формирует матрицу Гильберта порядка n. Элементы этой
матрицы определяются следующим образом:
H(i, j) =
.
Матрица Гильберта - это пример очень плохо обусловленной по отношению к
операции обращения матрицы [1].
Функция H = invhilb(n) формирует матрицу, обратную матрице Гильберта порядка n.
Точная обратная матрица - это матрица, элементами которой являются целые числа. Точное
представление такой матрицы в арифметике с плавающей точкой возможно только тогда,
когда порядок матрицы не превышает 13. Для больших значений n функция invhilb(n)
формирует только приближенную матрицу.
Сравнение функций invhilb(n) и inv(hilb(n)) позволяет выявить несколько источников
ошибок:
ошибки, вызванные функцией hilb(n);
ошибки, связанные с процедурой обращения;
ошибки, вызванные функцией invhilb(n).
Оказывается, что первый источник ошибок, связанный с представлением правильных
дробей вида 1/3 или 1/5 в арифметике с плавающей точкой, наиболее существенный.
Пример:
Матрица Гильберта порядка 4 имеет число обусловленности 1.5514e+004.
Ее обратная матрица - это целочисленная матрица вида
invhilb(4)
ans =
16
-120 240
-140
-120 1200
240
-2700 1680
-2700 6480
-4200
-140 1680 -4200 2800
а результат обращения в арифметике с плавающей точкой
format long e,
inv(hilb(4))
1.0e+ 003*
ans =
0.0160 -0.1200 0.2400 -0.1400
-0.1200 1.2000
0.2400
-2.7000 1.6800
-2.7000 6.4800
-0.1400 1.6800
-4.2000
-4.2000 2.8000
13
Ссылки:
1. Forsythe G. E., Moler C. B. Computer Solution of Linear Algebraic Systems. PrenticeHall, 1967.
MAGIC
Магический квадрат
Синтаксис:
M = magic(n)
Описание:
Функция M = magic(n) для n > 3 формирует специальную квадратную матрицу
порядка n, элементами которой являются целые числа от 1 до n2, суммы элементов которой
по строкам и столбцам равны. Эта функция магического квадрата была включена в состав
системы MATLAB в 1993 году и подробно описана в работе [1]. Cумму элементов по
строкам (столбцам) назовем инвариантом магического квадрата и обозначим mn. Значение
инварианта зависит от n и равно
mn = n(n2 +1)/2.
Если матрицу магического квадрата отнормировать делением на ее инвариант, то
получим дважды стохастическую матрицу, обладающую тем свойством, что ее матричная
норма любого порядка равна 1 [2].
Ранг матрицы M зависит от n следующим образом [2]:
rank(magic(n)) =
График функции rank(magic(n)) для 3 <= n< = 32 показан на рисунке:
Сопутствующие функции: RAND, ONES.
Ссылки:
1. Moler C. B. MATLAB‟s magical mystery tour//The MathWorks Newsletter. 1993. Vol.
7(1). 2. Higham N. J. The Test Matrix Toolbox for MATLAB (version 3.0)//Numerical Analysis
Report. Manchester, 1995. Vol. 276.
PASCAL
Матрица Паскаля (Pascal matrix)
Синтаксис:
P = pascal(n)
P = pascal(n, k)
Описание:
Функция P = pascal(n) формирует симметрическую положительно определенную
квадратную матрицу порядка n, которая составлена из элементов треугольника Паскаля.
Треугольник Паскаля представляет собой коэффициенты разложения бинома (1 + w) j,
записанные в следующем виде:
14
,
а матрицы Паскаля порядка 3 и 4 имеют следующий вид:
pascal(3)
pascal(4) =
=
1 1 1
1
1 1
1
1 2 3
1
2 3
4
1 3 6
1
3 6
10
1
4 10 20
Функция pascal(n, 0) равносильна функции pascal(n).
Матрица P = pascal(n, 1) - это нижняя треугольная матрица в разложении Холецкого
для матрицы pascal(n) с точностью до знаков чисел в столбцах. Эта матрица обладает
свойством P2 = I, где I - единичная матрица [1].
Матрица P = pascal(n, 2) - это матрица, полученная в результате транспонирования и
перестановок в матрице pascal(n, 1). Эта матрица обладает свойством P 3 = I, где I - единичная
матрица [2-3].
Пример:
Сформируем матрицы pascal(3), pascal(3, 1) и pascal(3, 2): P = pascal(3)
P=pascal(3) P1=pascal(3,1) P2=pascal(3,2)
P=
P1=
P2 =
1 1 1
1
0
0
0
1 2 3
1 -1
0
0 -1 2
1 3 6
1 -2
1
-1 -1 1
P1^2
P2^2
ans =
ans =
0 -1
1
0
0
1
0
0
0
1
0
0
1
0
0
0
1
0
0
1
Сопутствующие функции: Test Matrix Toolbox for MATLAB.
Ссылки:
1. Higham N. J. The Test Matrix Toolbox for MATLAB (version 3.0)//Numerical Analysis
Report. Manchester, 1995. Vol. 276.
2. Higham N. J. Accuracy and Stability of Numerical Algorithms. Society for Industrial and
Applied Mathematics, Philadelphia, 1996.
3. Brawer R., Pirovino M. The linear algebra of the Pascal matrix//Linear Algebra and Appl.
1992. Vol. 174. P. 13-23.
ROSSER
Матрица Рессера (Rosser matrix)
Синтаксис:
R = rosser
Описание:
Функция R = rosser формирует тестовую матрицу для классической симметрической
проблемы собственных значений. Эта матрица служила камнем преткновения для многих
15
алгоритмов вычисления собственных значений. Только QR-алгоритм Франсиса,
усовершенствованный Уилкинсоном [1] и реализованный в пакете программ EISPACK и в
системе MATLAB, позволяет справиться с указанной проблемой.
Матрица rosser - это матрица порядка 8 с целочисленными элементами, она обладает
следующим спектром собственных значений:
пара кратных значений;
3 близких собственных значения;
нулевое собственное значение;
малое ненулевое собственное значение.
Пример:
Матрица Рессера
R = rosser
R=
611 196 -192 407
-8
-52
-49
29
196 899 113 -192
-71
-43
-8
-44
-192 113 899 196
61
49
8
52
407 -192 196 611
8
44
59
-23
-8
-71
61
8 411 -599
208
208
-52
-43
49
44 -599 411
208
208
-49
-8
8
59 208 208
99 -911
29 -44 52 -23 208 208 -911
99
имеет следующие точные собственные значения:
10(1 + sqrt(10201))
1020
510 + 100sqrt(26)
1000
1000
510 - 100sqrt(26)
0
-10(1 + sqrt(10201))
Сопутствующие функции: EIG, WILKINSON.
Ссылки:
1. Уилкинсон, Райнш. Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра:
Пер. с англ. М.: Машиностроение, 1976. 390 с.
TOEPLITZ
Матрица Теплица (Toeplitz matrix)
Синтаксис:
T = toeplitz(c)
T = toeplitz(c, r)
Описание:
Функция T = toeplitz(c) возвращает симметрическую матрицу Теплица, определяемую
однозначно вектором c.
Функция T = toeplitz(c, r) возвращает несимметрическую матрицу Теплица, первый
столбец которой совпадает с вектором c, а первая строка с вектором r. Если первый элемент
16
вектора c не равен первому элементу вектора r, то возникает конфликт на главной диагонали,
когда предпочтение отдается элементу вектора c.
Примеры:
c=1:4; T = toeplitz(c)
T=
1 2 3 4
2 1 2 3
3 2 1 1
4 3 2 1
c=1:4; r=1.5:4.5; T=toeplitz(c,r)
Column wins diagonal conflict.
Столбец выигрывает конфликт на главной диагонали.
T=
1.0000 2.5000 3.5000 4.5000
2.0000 1.0000 2.5000 3.5000
3.0000 2.0000 1.0000 2.5000
4.0000 3.0000 2.0000 1.0000
Сопутствующие функции: HANKEL, VANDER.
Матрица Вандермонда (Vandermonde matrix)
VANDER
Синтаксис:
V = vander(x)
Описание:
Функция V = vander(x) возвращает матрицу Вандермонда порядка length(x), j-й
столбец которой определяется соотношением
V(:, j) = x^(n - j).
Примеры:
x = [1 2 3 4];
V = vander(x)
V=
1 1 1 1
8
4
2 1
27 9
3 1
64 16 4 1
Сопутствующие функции: POLYFIT, HANKEL, TOEPLITZ.
Матрица Уилкинсона (Wilkinson’s matrix)
WILKINSON
Синтаксис:
W = wilkinson(n)
Описание: Функция W = wilkinson(n) формирует тестовую матрицу Уилкинсона для
задачи на собственные значения. Это симметрическая трехдиагональная матрица,
наибольшие собственные значения которой попарно близки, но не являются кратными.
Матрица Уилкинсона порядка 7 имеет следующий вид:
W = wilkinson(7)
W=
3 1 0 0 0 0 0
1 2 1 0 0
0
0
17
0 1 1 1 0
0
0
0 0 1 0 1
0
0
0 0 0 1 1
1
0
0 0 0 0 1
2
1
0 0 0 0 0 1 3
Обычно в качестве тестовой используется матрица 21-го порядка, имеющая
следующие собственные значения:
eig(wilkinson(21))
ans =
1.074619418290340e+001
1.074619418290332e+001
9.210678647304920e+000
9.210678647361334e+000
8.038941115814275e+000
8.038941122829025e+000
7.003951798616376e+000
7.003952209528676e+000
6.000234031584169e+000
6.000217522257100e+000
5.000244425001915e+000
4.999782477742904e+000
4.004354023440856e+000
3.996048201383625e+000
3.043099292578824e+000
2.961058884185728e+000
2.130209219362503e+000
1.789321352695079e+000
9.475343675292900e-001
2.538058170966714e-001
-1.125441522119984e+000
Сопутствующие функции: EIG, ROSSER, PASCAL.
mesh(A)
mesh(pinv(A))
semilogy(svd(A))
fv(A)
mesh(A)
- поверхность, образованная значениями элементов матрицы А;
mesh(pinv(A))
- поверхность, образованная значениями элементов матрицы, обратной или
псевдообратной А;
semilogy(svd(A)) - график в полулогарифмическом масштабе сингулярных чисел матрицы А;
либо аппроксимация псевдоспектра при обращении see(A, 1);
fv(A)
- область расположения собственных значений, удовлетворяющая
отношениям Рэлея с указанием собственных значений, либо только
собственные значения при обращении see(A, -1).
18
Пример визуализации матрицы Чебышева порядка 8
Cheb8 = gallery('chebspec',8);
с помощью функции see
see((Cheb8)^3, -1)
Матрица
augment
caushy
chebspec
chebvand
chow
circul
clement
compan
condex
cycol
dingdong
dorr
dramadah
fiedler
forsythe
frank
gallery
gearm
gfpp
grcar
hadamard
hanowa
hilb
invhess
invol
обр.
плох.
дефект. симм.
+
+
+
+
+
полож. ортог.
+
+
+
+
+
+
+
+
+
собств.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
19
ipjfact
jordbloc
kahan
kms
krylov
lauchli
lehmer
lesp
lotkin
makejcf
minij
moler
neumann
ohess
orthog
parter
pascal
pdtoep
pei
pentoep
poisson
prolate
randsvd
redheff
riemann
rschur
smoke
tridiag
triw
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
vand
+
+
wathen
+
+
+
wilk
+
+
+
+
Функция fv строит область расположения собственных значений квадратной матрицы
A из Cnхn, удовлетворяющую отношениям Рэлея; сами собственные значения всегда
расположены внутри этой области.
Функция gersh строит круги Гершгорина для квадратной матрицы A из C nхn. Теорема
Гершгорина утверждает, что собственные значения матрицы А содержатся в некотором
объединении круговых областей.
20
Di =
.
Следствием теоремы Гершгорина является утверждение: если k кругов образуют
связную область, которая изолирована от других кругов, то в этой области содержится точно
k собственных значений.
Изолированные области построены с помощью функции gersh(ipjfact(8,1));
Две оставшиеся графические функции ps и pscont связаны с построением eпсевдоспектра матрицы A I Cnхn, который определяется как множество Le собственных
значений возмущенных матриц A + E, для всех матриц E с ||E||2<= e. Псевдоспектр
пятидиагональной матрицы Теплица построен с помощью функции
T=pentoep(32, 0, 1, 0, 0, 1/4);
ps(T)
Другой способ визуализации псевдоспектра - это построение функции
f(z) = smin(zI - A),
где smin - наименьшее сингулярное число матрицы zI - A.
Функция pscont строит график функции log10(f - 1 (z)) в трехмерном пространстве.
Псевдоспектр пятидиагональной матрицы Теплица построен с помощью функции
T=pentoep(32, 0, 1, 0, 0, 1/4);
pscont(T,2);
21
Кроме перечисленных М-функций, связанных с формированием и визуализацией
матриц, в состав пакета входит 10 функций, связанных с задачами декомпозиции, 3 функции,
связанные с задачами оптимизации, 24 вспомогательные функции и 2 демонстрационные
программы-сценария.
Наряду с пакетом тестовых матриц Test Matrix Toolbox существуют и другие
коллекции, среди которых следует отметить коллекцию разреженных матриц [2], коллекцию
плотных матриц больших размеров для несимметрической проблемы собственных значений
[3], а также коллекцию прямоугольных матриц [4].
Применение пакета тестовых матриц Test Matrix Toolbox следует настоятельно
рекомендовать всем, кто использует на практике методы и алгоритмы линейной алгебры.
Ссылки:
1. Higham N. J. The Test Matrix Toolbox for MATLAB (version 3.0)//Numerical Analysis
Report. Manchester, 1995. Vol. 276.
2. Duff I. S., Grimes R. G., Lewis J. G. Users‟ guide for the Harwell-Boeing sparse matrix
collection (release 1). Report RAL-92-086, Atlas Centre, Rutherford Appleton Labaratory, Didcot,
Oxon, UK. 1992. P. 84.
3. Bai Z. A collection of test matrices for large scale nonsymmetric eigenvalue problems
(version 1.0). Manuscript. 1994.
4. Zielke G. Report on test matrices for generalized inverses//Computing. 1986. Vol. 36. P.
105-162.
Математические функции
В системе MATLAB имеется обширная библиотека математических функций. Каждой
функции соответствует определенное имя. Функция ставит в соответствие значениям своих
аргументов значение результата.
Аргументы функции всегда указываются в круглых скобках после имени функции и,
если их больше одного, разделяются запятыми. В качестве аргументов могут использоваться
другие функции и любые выражения языка MATLAB (при условии соответствия типов
аргументов).
Элементарная математическая функция - это, как правило, функция от одной
переменной, и в этом случае устанавливается соответствие между массивами значений
аргумента и результата.
Аргумент указывается в круглых скобках после имени функции. Имя переменной,
которой присваивается значение функции, располагается слева от знака равенства. Если имя
присваиваемой переменной не указано, значение функции присваивается служебной
переменной ans.
Тип результата вычисления математической функции всегда совпадает с типом ее
аргумента. Например, если аргументом функции является вектор-столбец, то значением этой
функции также будет вектор-столбец.
Рассмотрим встроенные математические функции системы MATLAB, которые
применяются к числам, скалярным переменным и к массивам (поэлементно).
22
Базовые функции
ABS - абсолютное значение
ANGLE - аргумент комплексного числа
REAL, IMAG - действительная и мнимая части комплексного числа
CONJ - операция комплексного сопряжения
SIGN - вычисление знака числа
CEIL, FIX, FLOOR, ROUND - функции округления
REM - функция остатка
GCD - наибольший общий делитель
LCM - наименьшее общее кратное
RAT, RATS - представление результата в виде рационального числа или цепной дроби
Трансцендентные функции
SQRT - квадратный корень
EXP - экспоненциальная функция
LOG - функция натурального логарифма
POW2 - экспонента по основанию 2
NEXTPOW2 - ближайшая степень по основанию 2
LOG2 - фунции логарифма
LOG10 - функции логарифма
Тригонометрические функции
SIN, SINH - функции синуса
ASIN, ASINH - функции обратного синуса
CSC, CSCH - функции косеканса
ACSC, ACSCH - функции обратного косеканса
COS, COSH - функции косинуса
ACOS, ACOSH - функции обратного косинуса
SEC, SECH - функции секанса
ASEC, ASECH - функции обратного секанса
TAN, TANH - функции тангенса
ATAN, ATAN2, ATANH - функции обратного тангенса
COT, COTH - функции котангенса
ACOT, ACOTH - функции обратного котангенса
Преобразования системы координат
CART2POL - преобразование декартовой системы координат в полярную и
цилиндрическую
CART2SPH - преобразование декартовой системы координат в сферическую
POL2CART - преобразование полярной и цилиндрической систем координат в
декартову
SPH2CART - преобразование сферической системы координат в декартову
Специальные функции
BESSEL - функции Бесселя
BETA, BETACORE, BETAINC, BETALN - бета-функции
ELLIPJ - эллиптические функции Якоби
23
ELLIPKE - полные эллиптические интегралы
ERF, ERFCORE, ERFC, ERFCX, ERFINV - функции ошибок
GAMMA, GAMMAINC, GAMMALN - гамма-функции
ABS
Абсолютное значение
Синтаксис:
Y = abs(X)
Описание:
Для массива действительных чисел X функция Y = abs(X) возвращает массив Y
абсолютных значений элементов X.
Для массива комплексных чисел Z функция Y = abs(Z) возвращает массив Y модулей
комплексных элементов Z.
Для строковой переменной S функция Y = abs(S) возвращает вместо символов,
включая пробелы, их ASCII-коды.
Примеры:
abs(-5)
ans = 5
abs(3 + 4i)
ans = 5
ascii = abs('3 + 4I')
ascii = 51 32 43 32 52 73
setstr(ascii)
ans = 3 + 4I
Сопутствующие функции: SIGN, ANGLE, REAL, IMAG.
ANGLE
Аргумент комплексного числа
Синтаксис:
P = angle(Z)
Описание:
Для массивов комплексных чисел Z функция P = abs(Z) возвращает массив значений
аргументов для элементов Z. Значение аргумента измеряется в радианах и находится в
пределах от - до .
Пример:
Для комплексного числа z = x + iy = rei его модуль r и аргумент j вычисляются
следующим образом:
r = abs(z)
phi = angle(z),
а оператор
z = r .*exp(i*phi)
выполняет обратное преобразование.
Алгоритм:
Для вычисления аргумента комплексного числа используется следующее соотношение:
angle(z) = atan2(imag(z), real(z))
Сопутствующие функции: ABS, REAL, IMAG.
REAL, IMAG
Синтаксис:
X = real(Z)
Y = real(Z)
Описание:
Действительная и мнимая части комплексного числа
24
Для массивов комплексных чисел Z функция X = real(Z) возвращает массив
действительных, а Y = real(Z) - мнимых частей элементов Z.
Сопутствующие функции: ABS, ANGLE.
Операция комплексного сопряжения
CONJ
Синтаксис:
V = conj(Z)
Описание:
Для массивов комплексных чисел Z функция V = conj(Z) возвращает массив
комплексно-сопряженных значений для элементов Z.
Сопутствующие функции: IMAG, REAL.
Вычисление знака числа
SIGN
Синтаксис:
S = sign(Z)
Описание:
Для массивов действительных чисел X функция S = sign(X) возвращает массив S тех
же размеров, в котором на месте положительного числа стоит 1, на месте нулевого - 0, на
месте отрицательного - (-1).
Для массивов комплексных чисел Z функция S = sign(Z) возвращает массив
комплексных чисел S = Z ./abs(Z), модуль которых равен единице.
Сопутствующие функции: ABS, IMAG, REAL.
CEIL, FIX,
FLOOR,
ROUND
Функции округления
Синтаксис:
Y = ceil(X)
Y = fix(X)
Y = floor(X)
Y = round(X)
Описание:
Для массивов действительных чисел X:
функция Y = ceil(X) возвращает значения, округленные до ближайшего целого >=X;
функция Y = fix(X) возвращает значения с усечением дробной части числа;
функция Y = floor(X) возвращает значения, округленные до ближайшего целого<= X;
функция Y = round(X) возвращает значения, округленные до ближайшего целого.
Для массивов комплексных чисел Z эти функции применяются одновременно к
действительной и мнимой частям.
Примеры:
Задан одномерный массив действительных чисел
x = [-1.9 -0.2 3.4 5.6 7.0];
ceil(x)
ans = -1 0 4 6 7
fix(x)
ans = -1 0 3 5 7
floor(x)
ans = -2 -1 3 5 7
REM
Синтаксис:
rem(x, y)
round(x) ans = -2 0 3 6 7
Функции остатка
25
Описание:
Для действительных чисел x и y функция rem(x, y) вычисляет остаток от деления x на
y или, в других обозначениях, функцию x(mod y) = x - y*n, где n = fix(x/y) - ближайшее
целое.
Для массивов чисел эта функция применяется поэлементно.
Сопутствующие функции: CEIL, FIX, FLOOR, ROUND.
GCD
Наибольший общий делитель
Синтаксис:
g = gcd(m, n)
[g, c, d] = gcd(m, n)
Описание:
Функция g = gcd(m, n) вычисляет наибольший общий делитель двух целых чисел m и
n. Принято, что gcd(0, 0) = 0.
Функция [g, c, d] = gcd(m, n) кроме наибольшего общего делителя вычисляет два
множителя c и d, таких, что выполняется соотношение g = = m*c + n*d.
Для массивов чисел эту функцию применять нельзя.
Алгоритм:
if round(a) ~= a | round(b) ~= b
error(„Входные аргументы должны быть целыми числами.')
end
u = [1 0 abs(a)];
v = [0 1 abs(b)];
while v(3)
q = floor( u(3) / v(3) );
t = u - v*q;
u = v;
v = t;
end
c = u(1) * sign(a);
d = u(2) * sign(b);
g = u(3);
Пример:
[g, c, d] = gcd(45, 36);
[g c d] ans = 9 1 -1
Сопутствующие функции: ABS, FLOOR, ROUND, SIGN.
LCM
Наименьшее общее кратное
Синтаксис:
g = lcm(m, n)
Описание:
Функция g = lcm(m, n) вычисляет наименьшее общее кратное двух целых чисел m и n.
Для массивов чисел эту функцию применять нельзя.
Алгоритм:
if round(a) ~= a | round(b) ~= b | a < 1 | b < 1
error(„Входные аргументы должны быть целыми числами.')
end
c = a*b/gcd(a,b);
Пример:
g = lcm(45, 36)
g = 180
Сопутствующие функции: GCD, ROUND.
26
RAT, RATS
Синтаксис:
[N, D] = rat(X)
Представление результата в виде рационального числа
или цепной дроби
rat(X)
S = rats(X)
[N, D] = rat(X, tol) rat(X, tol)
S = rats(X, tol)
Описание:
Несмотря на то что все числа с плавающей точкой представлены в ком-пьютере в виде
рациональных чисел, иногда целесообразно представить число в виде отношения двух
относительно небольших целых чисел. Такое представление на основе цепных дробей и
реализуется с использованием вышеперечисленных функций.
Функция [N, D] = rat(X) определяет для входа x два таких целых числа n и d, при
которых выполняется условие n/d - x <= 1e-6*abs(x).
Функция [N, D] = rat(X, tol) позволяет указать точность приближения tol, отличную от
1e-6.
Функции rat(X) и rat(X, tol) позволяют вывести на экран результат в виде цепной
дроби.
Если в качестве входа задан массив чисел X, то результатом операций будут массивы
соответствующего размера.
Функция S = rats(X, k) использует функцию rat(X), чтобы вывести на экран результат в виде
простой дроби
s = [sprintf(['%' num2str(fix(k/2)), n) '/' sprintf(['%-' num2str(fix(k/2)) '.0f'], d)],
точность аппроксимации для которой составляет tol = 10^(-fix(k/2)) * abs(x).
Для функции S = rats(X) точность аппроксимации принимается по умолчанию равной
1e-6* abs(x), что соответствует значению k = 13.
Функция format rat равносильна функции rats.
Алгоритм:
Функция rat(X) аппроксимирует каждый элемент массива X цепной дробью
следующего вид:
Величины dk получены последовательным выделением целой части с последующим
обращением дробной части. Точность аппроксимации возрастает по степенному закону с
ростом числа членов. Самая медленная сходимость наблюдается при рациональной
аппроксимации числа x = sqrt(2). Погрешность аппроксимации с учетом k членов составляет
2.68 * (0.173)^k, так что учет каждого последующего члена увеличивает точность менее чем
на одну десятичную цифру, так что для достижения максимальной точности в арифметике с
плавающей точкой требуется 21 член.
Примеры:
Рассмотрим аппроксимацию числа p в виде цепной дроби и рационального числа
rat(pi)
ans = 3 + 1/(7 + 1/(16))
rat(pi, 1e-12)
ans = 3 + 1/(7 + 1/(16 + 1/(-294 + 1/(3 + 1/(-4 + 1/(5))))))
[n,d]=rat(pi);
[n d]
ans = 355 113
27
[n, d]=rat(pi, 1e-12);
[n d]
ans = 5419351 1725033
s = rats(pi)
s = 355/113
s = rats(pi, 26)
s = 5419351/1725033
Квадратный корень
SQRT
Синтаксис:
V = sqrt(Z)
Описание:
Функция V = sqrt(Z) вычисляет квадратные корни элементов массива Z. Для
отрицательных и комплексных значений результат является комплексным числом.
Пример:
w = sqrt((-2:2)')
w=
0+ 1.4142i
0+ 1.0000i
0
1.0000
1.4142
whos
Name Size
Bytes
Class
w
5x1
80
double array (complex)
Grand total is 5 elements using 80 bytes
Общее число элементов 5, используют 80 байтов.
Сопутствующие функции: EXP, LOG, SQRTM.
EXP
Экспоненциальная функция
Синтаксис:
V = exp(Z)
Описание:
Функция V = exp(Z) вычисляет экспоненты значений элементов массива Z. Для комплексных
значений z = x + iy справедлива формула Эйлера
ez = ex (cos(y) + i sin(y)).
Вычисление экспоненты от матрицы реализовано с помощью специальной функции expm.
Сопутствующие функции: LOG, LOG2, LOG10, EXPM.
LOG
Функция натурального логарифма
Синтаксис:
V = log(Z)
Описание:
Функция V = log(Z) вычисляет натуральный логарифм значений элементов массива Z.
Для комплексных значений z = x + iy справедлива формула
ln(z) = ln(abs(z)) + i atan2(y, x).
Вычисление функции натурального логарифма от матрицы реализовано с помощью
специальной функции logm.
Пример:
28
Одна из возможностей вычисления значения числа
log(-1)
ans = 0 +3.141592653589793e+000i
Сопутствующие функции: EXP, LOG2, LOG10, LOGM.
- это вычислить log(-1):
Экспонента по основанию 2
POW2
Синтаксис:
V = pow2(Z)
X = pow2([M, P])
Описание:
Функция V = pow2(Z) вычисляет массив степеней 2.^Z.
Функция X = pow2([M, P]) для действительных массивов M и P вычисляет массив X =
M.*(2.^P).
Пример:
Для компьютеров с IEEE-арифметикой, в которых определены объекты eps, realmax и
realmin, функция x = pow2([m, p]) вычисляет следующие величины:
m
p
x
1/2
1
1
pi/4
2
pi
-3/4
2
-3
1/2
-51
eps
1-eps/2
1024
realmax
1/2
-1021
Сопутствующие функции: LOG2, NEXTPOW2.
NEXTPOW2
realmin
Ближайшая степень по основанию 2
Синтаксис:
p = nextpow2(n)
p = nextpow2(x)
Описание:
Функция p = nextpow2(n) возвращает такой показатель степени p, что 2^p >= n.
Функция p = nextpow2(x) для одномерного массива x возвращает значение
nextpow2(length(x)). Эта операция широко применяется при вычислении быстрого
преобразования Фурье.
Пример:
Для любого целого числа n в диапазоне от 513 до 1024 функция nextpow2(n)
возвращает значение 10.
Сопутствующие функции: FFT, LOG2, POW2.
LOG2
Функции логарифма
Синтаксис:
V = log2(Z)
[M, P] = log2(X)
Описание:
Функция V = log2(Z) вычисляет логарифм по основанию 2 от значений элементов
массива Z.
Функция [M, P] = log2(X) для массива X действительных чисел возвращает массив M
значений мантисс и целочисленный массив P показателей степеней, позволяющих
29
представить любой элемент x в виде x = f*2^p; нулевому элементу соответствует
представление {f = 0, e = 0}.
Примеры:
Для компьютеров с IEEE-арифметикой, в которых определены объекты eps, realmax,
realmin, функция log2 вычисляет следующие величины:
log2(eps)
log2(realmax) log2(realmin)
ans = -52
ans = 1024
ans = -1022
а функция [M, P] = log2(X) строит следующие представления чисел:
x
m
p
1
1/2
1
pi
pi/4
2
-3
-3/4
2
eps
1/2
-51
realmax
1-eps/2
1024
realmin
1/2
Сопутствующие функции: NEXTPOW2, POW2.
LOG10
-1021
Функции логарифма
Синтаксис:
V = log10(Z)
Описание:
Функция V = log10(Z) вычисляет логарифм по основанию 10 от значений элементов
массива Z.
Примеры:
Для компьютеров с IEEE-арифметикой, в которых определены объекты eps, realmax
realmin, функция log10 вычисляет следующие величины:
log10(eps)
log10(realmax)
log10(realmin)
ans = -15.6536
ans = 308.2547
ans = -307.6527
Сопутствующие функции: EXP, LOG2, LOGM, POW2.
SIN, SINH
Функции синуса
Синтаксис:
V= sin(Z)
V = sinh(Z)
Описание:
Функция V = sin(Z) вычисляет синус от значений элементов массива Z.
Функция V = sinh(Z) вычисляет гиперболический синус от значений элементов
массива Z.
Массив Z допускает комплексные значения; углы измеряются в радианах.
Для вычисления функции от матрицы следует применять специальные функции funm
или expm.
Алгоритм:
Для вычисления функций синуса используются следующие соотношения:
sin(x + iy) = sin(x)ch(y) + icos(x)sh(y);
sh(z) =
;
sin(z) = - i sh(iz).
30
Сопутствующие функции: ASIN, ASINH, CSC, CSCH, ACSC, ACSCH, EXPM, FUNM.
ASIN,
ASINH
Функции обратного синуса
Синтаксис:
V = asin(Z)
V = asinh(Z)
Описание:
Функция V = asin(Z) вычисляет обратную функцию синуса от значений элементов
массива Z.
Функция V = sinh(Z) вычисляет обратную функцию гиперболического синуса от
значений элементов массива Z.
Массив Z допускает комплексные значения; углы V измеряются в радианах.
Функция Y = asin(X) для действительных значений -1<= x <= 1 определена в
интервале - /2<= x <= /2.
Для вычисления функции от матрицы следует применять специальную функцию
funm.
Алгоритм:
Для вычисления функций обратного синуса используются следующие соотношения:
arsh(z) = ln[z + (1 + z2)1/2];
arcsin(z) = - i arsh(iz).
Сопутствующие функции: SIN, SINH, CSC, CSCH, ACSC, ACSCH, FUNM.
CSC, CSCH
Функции косеканса
Синтаксис:
V = csc(Z)
V = csch(Z)
Описание:
Функция V = csc(Z) вычисляет косеканс от значений элементов массива Z.
Функция V = sinh(Z) вычисляет гиперболический косеканс от значений элементов
массива Z.
Массив Z допускает комплексные значения; углы измеряются в радианах.
Для вычисления функции от матрицы следует применять специальную функцию
funm.
Алгоритм:
Для вычисления функций косеканса используются следующие соотношения:
csc(z) = 1/sin(z);
csch(z) = 1/sinh(z).
Сопутствующие функции: SIN, SINH, ASIN, ASINH, FUNM.
ACSC, ACSCH
Функции обратного косеканса
Синтаксис:
V = acsc(Z)
V = acsch(Z)
Описание:
Функция V = acsc(Z) вычисляет обратную функцию косеканса от значений элементов
массива Z.
Функция V = acsch(Z) вычисляет обратную функцию гиперболического косеканса от
значений элементов массива Z.
Массив Z допускает комплексные значения; углы V измеряются в радианах.
31
Для вычисления функции от матрицы следует применять специальную функцию
funm.
Алгоритм:
Для вычисления функций обратного косеканса используются
соотношения:
arccosec(z) = arcsin(1/z);
arcosech(z) = arsinh(1/z).
Сопутствующие функции: SIN, SINH, CSC, CSCH, ASIN, ASINH, FUNM.
COS, COSH
следующие
Функции косинуса
Синтаксис:
V = cos(Z)
V = cosh(Z)
Описание:
Функция V = cos(Z) вычисляет косинус от значений элементов массива Z.
Функция V = cosh(Z) вычисляет гиперболический косинус от значений элементов
массива Z.
Массив Z допускает комплексные значения; углы измеряются в радианах.
Для вычисления функции от матрицы следует применять специальные функции funm
или expm.
Алгоритм:
Для вычисления функций косинуса используются следующие соотношения:
cos(x + iy) = cos(x)ch(y) - isin(x)sh(y);
ch(z) =
;
cos(z) = ch(iz).
Сопутствующие функции: ACOS, ACOSH, SEC, SECH, ASEC, ASECH, EXPM, FUNM.
ACOS, ACOSH
Функции обратного косинуса
Синтаксис:
V = acos(Z)
V = acosh(Z)
Описание:
Функция V = acos(Z) вычисляет обратную функцию косинуса от значений элементов
массива Z.
Функция V = acosh(Z) вычисляет обратную функцию гиперболического косинуса от
значений элементов массива Z.
Массив Z допускает комплексные значения; углы V измеряются в радианах.
Функция Y = acos(X) для действительных значений -1<= x <=1 определена в
интервале 0 <= x <= .
Для вычисления функции от матрицы следует применять специальную функцию
funm.
Алгоритм:
Для вычисления функций обратного косинуса используются следующие
соотношения:
arch(z) = ln[z + (z2- 1)1/2];
arccos(z) = -i arch(z).
Сопутствующие функции: COS, COSH, SEC, SECH, ASEC, ASECH, FUNM.
SEC, SECH
Функции секанса
32
Синтаксис:
V = sec(Z)
V = sech(Z)
Описание:
Функция V = sec(Z) вычисляет секанс от значений элементов массива Z.
Функция V = sech(Z) вычисляет гиперболический секанс от значений элементов
массива Z.
Массив Z допускает комплексные значения; углы измеряются в радианах.
Для вычисления функции от матрицы следует применять специальную функцию
funm.
Алгоритм:
Для вычисления функций секанса используются следующие соотношения:
sec(z) = 1/cos(z);
sech(z) = 1/cosh(z).
Сопутствующие функции: COS, COSH, ACOS, ACOSH, FUNM.
ASEC, ASECH
Функции обратного секанса
Синтаксис:
V = asec(Z)
V = asech(Z)
Описание:
Функция V = asec(Z) вычисляет обратную функцию секанса от значений элементов
массива Z.
Функция V = asech(Z) вычисляет обратную функцию гиперболического секанса от
значений элементов массива Z.
Массив Z допускает комплексные значения; углы V измеряются в радианах.
Для вычисления функции от матрицы следует применять специальную функцию
funm.
Алгоритм:
Для вычисления функций обратного секанса используются следующие соотношения:
arcsec(z) = arccos(1/z);
arsech(z) = arcosh(1/z).
Сопутствующие функции: SIN, SINH, CSC, CSCH, ASIN, ASINH, FUNM.
TAN,
TANH
Функции тангенса
Синтаксис:
V = tan(Z)
V = tanh(Z)
Описание:
Функция V = tan(Z) вычисляет тангенс от значений элементов массива Z.
Функция V = sinh(Z) вычисляет гиперболический тангенс от значений элементов массива Z.
Массив Z допускает комплексные значения; углы измеряются в радианах.
Для вычисления функции от матрицы следует применять специальную функцию funm.
Алгоритм:
Для вычисления функций тангенса используются следующие соотношения:
tg(z) =
th(z) =
;
.
33
Сопутствующие функции: ATAN, ATAN2, ATANH, COT, COTH, ACOT, ACOTH, FUNM.
ATAN, ATAN2,
ATANH
Функции обратного тангенса
Синтаксис:
V = atan(Z)
V = atan2(Y, X)
V = atanh(Z)
Описание:
Функция V = atan(Z) вычисляет обратную функцию тангенса от значений элементов
массива Z.
Функция V = atan2(Y, X) вычисляет обратную функцию тангенса от значений
элементов двух связанных действительных массивов Y и X. Если массивы оказались
комплексными, берутся их действительные части. Углы V вычисляются с учетом знаков Y и
X и определены в интервале - <= v <= .
Функция V = atanh(Z) вычисляет обратную функцию гиперболического тангенса от
значений элементов массива Z.
Массив Z допускает комплексные значения; углы V измеряются в радианах.
Для вычисления функции от матрицы следует применять специальную функцию
funm.
Алгоритм:
Для вычисления функций обратного тангенса используются следующие соотношения:
arth(z) =
;
arctg(z) = -i arth(iz);
Arctg(y, x) =
Сопутствующие функции: TAN, TANH, COT, COTH, ACOT, ACOTH, FUNM.
COT, COTH
Функции котангенса
Синтаксис:
V = cot(Z)
V = coth(Z)
Описание:
Функция V = csc(Z) вычисляет котангенс от значений элементов массива Z.
Функция V = sinh(Z) вычисляет гиперболический котангенс от значений элементов
массива Z.
Массив Z допускает комплексные значения; углы измеряются в радианах.
Для вычисления функции от матрицы следует применять специальную функцию
funm.
Алгоритм:
Для вычисления функций косеканса используются следующие соотношения:
ctg(z) = 1/tg(z);
cth(z) = 1/th(z).
Сопутствующие функции: TAN, TANH, ATAN, ATAN2, ATANH, FUNM.
34
ACOT,
ACOTH
Функции обратного котангенса
Синтаксис:
V = acot(Z)
V = acoth(Z)
Описание:
Функция V = acsc(Z) вычисляет обратную функцию котангенса от значений элементов
массива Z.
Функция V = acsch(Z) вычисляет обратную функцию гиперболического котангенса от
значений элементов массива Z.
Массив Z допускает комплексные значения; углы V измеряются в радианах.
Для вычисления функции от матрицы следует применять специальную функцию
funm.
Алгоритм:
Для вычисления функций обратного котангенса используются следующие
соотношения:
arсth(z) =
;
arcctg(z) = i arcth(iz).
Сопутствующие функции: TAN, TANH, COT, COTH, ATAN, ATAN2, ATANH, FUNM.
Преобразование декартовой системы координат в
CART2POL
полярную и цилиндрическую
Синтаксис:
[TH, R] = CART2POL(X, Y)
[TH, R, Z] = CART2POL(X, Y, Z)
Описание:
Функция [TH, R] = CART2POL(X, Y) преобразует точки декартовой системы
координат в точки полярной системы координат. Размеры массивов X и Y должны быть
согласованы. Угол TH измеряется в радианах.
Функция [TH, R, Z] = CART2POL(X, Y, Z) преобразует точки трехмерной декартовой
системы координат в точки цилиндрической системы координат. Размеры массивов X, Y и Z
должны быть согласованы. Угол TH измеряется в радианах.
Алгоритм:
Для вычисления используются следующие формулы преобразования:
r = sqrt(x.^2 + y.^2);
th = atan2(y, x).
Сопутствующие функции: POL2CART.
Преобразование декартовой системы координат в
CART2SPH
сферическую
Синтаксис:
[AZ, EL, R] = CART2SPH(X, Y, Z)
Описание:
Функция [AZ, EL, R] = CART2SPH(X, Y, Z) преобразует точки трехмерной
декартовой системы координат в точки сферической системы координат. Размеры массивов
X, Y и Z должны быть согласованы. Углы AZ, EL измеряются в радианах.
Алгоритм:
Для вычисления используются следующие формулы преобразования:
35
r = sqrt(x.^2 + y.^2 + z.^2);
elev = atan2(z, sqrt(x.^2 + y.^2));
az = atan2(y, x).
Сопутствующие функции: SPH2CART.
Преобразование полярной и цилиндрической систем
POL2CART
координат в декартову
Синтаксис:
[X, Y] = POL2CART(TH, R)
[X, Y, Z] = POL2CART(TH, R, Z)
Описание:
Функция [X, Y] = POL2CART(TH, R) преобразует точки полярной системы координат
в точки декартовой системы координат. Размеры массивов X и Y должны быть согласованы.
Угол TH измеряется в радианах.
Функция [TH, R, Z] = CART2POL(X, Y, Z) преобразует точки цилиндрической
системы координат в точки трехмерной декартовой системы координат. Размеры массивов
X, Y и Z должны быть согласованы. Угол TH измеряется в радианах.
Алгоритм:
Для вычисления используются следующие формулы преобразования:
x = r.*cos(th);
y = r.*sin(th);
z = z;
Сопутствующие функции: CART2POL.
Преобразование декартовой системы координат в
SPH2CART
сферическую
Синтаксис:
[AZ, EL, R] = CART2SPH(X, Y, Z)
Описание:
Функция [AZ, EL, R] = CART2SPH(X, Y, Z) преобразует точки трехмерной
декартовой системы координат в точки сферической системы координат. Размеры массивов
X, Y и Z должны быть согласованы. Углы AZ, EL измеряются в радианах.
Алгоритм:
Для вычисления используются следующие формулы преобразования:
z = r .* sin(elev);
x = r .* cos(elev) .* cos(az);
y = r .* cos(elev) .* sin(az).
Сопутствующие функции: CART2SPH.
BESSEL
Функции Бесселя
Синтаксис:
J = bessel(alpha, X)
Описание:
Линейное дифференциальное уравнение вида
,
где
- неотрицательная величина, называется уравнением Бесселя, а его решения
известны как функции Бесселя.
Для вычисления функций Бесселя разработан набор M-файлов, обеспечивающий
высокую точность их вычисления для действительных значений аргумента:
besselj(alpha, X) - функция Бесселя первого рода J (x);
bessely(alpha, X) - функция Бесселя второго рода Y (x);
36
besseli(alpha, X) - модифицированная функция Бесселя первого рода I (x);
besselk(alpha, X) - модифицированная функция Бесселя второго рода K (x).
Сохранена также функция [J, digits] = bessela(alpha, Z), которая допускает
комплексные значения аргумента и позволяет получать оценку количества правильных цифр
результата. Значение digits, равное 14 или 15, соответствует максимальной точности IEEEили VAX-арифметик; однако значение digits, равное единице или двум, означает, что
результату доверять нельзя. Для значений alpha и x, не превышающих 50, количество точных
цифр по крайней мере 8. На плоскости (alpha, x) область наименьшей точности расположена
вблизи прямой alpha = x, так что малые alpha и большие x, и наоборот, дают более точные
значения.
Функция J = bessel(alpha, X) вызывает:
функцию besselj(alpha, X), если X - массив действительных чисел;
функцию besseli(alpha, X), если X - массив чисто мнимых чисел;
функцию bessela(alpha, Z), если Z - массив комплексных чисел.
Примеры:
Функция besselj(3:9, (10:.2:20)') генерирует таблицу размера 51 х 7, воспроизведенную
на стр. 400 работы [1];
функция bessely(3:9,(10:.2:20)') генерирует таблицу размера 51 х 7, воспроизведенную
на стр. 401 работы [1];
функция besseli(3:9, [0:.2:9.8 10:.5:20], 1) генерирует таблицу размера 71 х 7,
воспроизведенную на стр. 423 работы [1];
функция besselk(3:9, [0:.2:9.8 10:.5:20], 1) генерирует таблицу размера 71 х 7,
воспроизведенную на стр. 424 работы [1].
Оценим точность вычисления функции Бесселя для разных значений alpha и x.
alpha
25
х
50
75
25
12
14
14
50
14
7
9
75
15
10
2
Ccылки:
Abramovitz M., Stegun I. A. Handbook of Mathematical Functions. National Bureau of Standards,
Applied Math. Series #55. Dover Publications, 1965.
BETA, BETACORE,
BETAINC, BETALN
Бета-функции
Синтаксис:
B = beta(p, q)
B = betacore(x, p, q)
I = betainc(x, p, q)
y = betaln(p, q)
Описание:
Полная бета-функция B = beta(p, q) определяется следующим образом [2]:
B(p, q) =
=
.
Неполная бета-функция B = betainc(p, q) определяется так [2]:
37
Ix(p, q) =
.
Для ее вычисления используется вспомогательная функция betacore(x, p, q).
Функция y = betaln(p, q) представляет натуральный логарифм полной бета-функции B
= beta(p, q). Поскольку бета-функция изменяется в широких пределах, знание ее логарифма
может оказаться более предпочтительным. Вычисление функции ln(B) реализуется без
вычисления функции beta(p, q).
Если p и q - массивы, то их размеры должны быть согласованы.
Алгоритм:
betaln(p, q) = gammaln(p) + gammaln(q) - gammaln(p + q)
beta(p, q) = exp(betaln(p, q))
Пример:
formt rar
beta((1:10)', 3)
ans =
0/0
1/3
1/12
1/30
1/60
1/105
1/168
1/252
1/360
1/495
1/660
В данном случае при целочисленных аргументах
beta(n, 3) = (n - 1)! * 2!/(n + 2)! = 2/((n * (n + 1) * (n + 2))
и представляет собой отношение двух сравнительно небольших целых чисел, так что
представление результата в формате format rat оказывается точным.
Для x = 510 betaln(x, x) = -708.8616, что для компьютеров с IEEE-арифметикой
немного меньше, чем log(realmin) = -708.3964, так что при вычислении функции beta(x, x)
следует проявлять осторожность.
Ccылки:
1. Abramovitz M., Stegun I. A. Handbook of Mathematical Functions. National Bureau of
Standards, Applied Math. Series #55. Dover Publications, 1965.
2. Корн Г., Корн Т. Справочник по математике для научных работников и инженеров.
М.: Наука, 1968. 720 с.
Эллиптические функции Якоби
ELLIPJ
Синтаксис:
[sn, cn, dn] = ellipj(m, phi)
Описание:
Введем интеграл
z=
;
38
функция
= am(z) называется амплитудой, функция sn(z) - синусом амплитуды,
функция cn(z) - косинусом амплитуды, и dn(z) - дельтой амплитуды.
Эти эллиптические функции Якоби связаны между собой следующим образом [1, 2]:
sn(z) = sin( ),
cn(z) = cos( ),
dn(z) = (1 - m sn(z))1/2.
Функция [sn, cn, dn] = ellipj(m, phi) вычисляет эллиптические функции Якоби sn, cn,
dn для заданных значений m и phi, которые могут быть как скалярами, так и массивами, но
обязательно одинаковых размеров.
Ограничения:
Входной параметр m должен принадлежать диапазону 0 <= m <= 1.
Сопутствующие функции: ELLIPKE.
Ccылки:
1. Abramovitz M., Stegun I. A. Handbook of Mathematical Functions. National Bureau of
Standards, Applied Math. Series #55. Dover Publications, 1965.
2. Корн Г., Корн Т. Справочник по математике для научных работников и инженеров.
М.:Наука, 1968. 720 с.
Полные эллиптические интегралы
ELLIPKE
Синтаксис:
K = ellipke(m)
[K, E] = ellipke(m)
Описания:
Полные эллиптические интегралы первого и второго рода определяются следующим
образом [1, 2]:
K(m) =
;
E(m) =
.
Ограничения:
Входной параметр m должен принадлежать диапазону 0 <= m <= 1.
Сопутствующие функции: ELLIPJ.
Ccылки:
1. Abramovitz M., Stegun I. A. Handbook of Mathematical Functions. National Bureau of
Standards, Applied Math. Series #55. Dover Publications, 1965
2. Корн Г., Корн Т. Справочник по математике для научных работников и инженеров.
М.:Наука, 1968. 720 с.
ERF, ERFCORE,
ERFC, ERFCX,
ERFINV
Синтаксис:
y = erf(x)
y = erfc(x)
y = erfcx(x)
x = erfinv(y)
Описание:
Функция ошибки erf(x) определяется следующим образом [2]:
Функции ошибок
39
erf(x) =
.
Функция y = erfc(x) задается соотношением
erfc(x) =
= 1 - erf(x).
Функция y = erfcx(x) определяется так:
erfcx(x) =
erfc(x).
Для вычисления этих функций используется вспомогательная функция erfcore(x, n). При
этом справедливо
erf(x) = erfcore(x, 0);
erfc(x) = erfcore(x, 1);
erfcx(x) = erfcore(x, 2).
Обратная функция ошибки x = erfinv(y) имеет область определения -1< y <1 и область
значений -Inf < x < Inf, причем erfinv(-1) = -Inf, erfinv(1) = Inf, а для значений abs(y) 1
erfinv(y) = NaN.
Алгоритм:
Алгоритм основан на работе [1] и представляет собой переработанную с языка
FORTRAN программу из раздела NETLIB/SPECFUN, написанную W. J. Cody (Argonne
National Laboratory, March 19, 1990).
Ccылки:
1. Cody W. J. Rational Chebyshev approximations for the error function//Math. Comp.,
1969. P. 631-638.
2. Корн Г., Корн Т. Справочник по математике для научных работников и инженеров.
М.:Наука, 1968. 720 с.
GAMMA,
GAMMAINC,
GAMMALN
Гамма-функции
Синтаксис:
y = gamma(a)
y = gammainc(x, a)
y = gammaln(a)
Описание:
Гамма-функция gamma(a) определяется следующим образом [2]:
gamma(a) = G(a) =
.
Неполная гамма-функция gammainc(x, a) задается соотношением
gammainc(x, a) = P(x, a) =
.
Логарифмическая гамма-функция определяется так:
gammaln(a) = ln G(a).
Алгоритм:
Алгоритм основан на работе [1] и представляет собой переработанную с языка
FORTRAN программу из раздела NETLIB/SPECFUN, написанную W. J. Cody (Argonne
National Laboratory, October 12, 1989).
Сопутствующие функции: ERF, ERFCORE, ERFC, ERFCX, ERFINV.
Ccылки:
40
1. Cody W. J. An Overview of Software Development for Special Functions//Lecture Notes
in Mathematics. Berlin, 1976. Vol. 506.
2. Корн Г., Корн Т. Справочник по математике для научных работников и инженеров.
М.:Наука, 1968. 720 с.
Линейная алгебра
Матрица как математический объект возникает при решении конкретных
вычислительных задач, и в первую очередь при решении систем линейных алгебраических
уравнений и задач на собственные значения. Матрица в виде прямоугольной таблицы чисел
очень схожа с массивом, однако прикладные задачи, которые порождают матрицы,
определяют для них специальную совокупность допустимых операций, среди которых
особое место занимает операция умножения. Для простейшего случая, когда умножается
вектор-строка на вектор-столбец, такой операцией является операция скалярного
произведения.
Матрицы широко используются при решении обыкновенных дифференциальных
уравнений (ОДУ) и уравнений в частных производных, решении оптимальных задач и т. п.
Алгебраические задачи, связанные с матрицами, объединяются в раздел математики,
получивший название линейной алгебры, который включает такие базисные задачи, как
обращение и псевдообращение матриц, спектральное и сингулярное разложение матриц.
В вычислительном плане раздел линейной алгебры поддержан пакетами прикладных
программ LINPACK, EISPACK, разработанными в 60-70-е годы ведущими специалистами, к
числу которых принадлежит и основатель фирмы The MathWorks, Inc. Моулер (C. Moler).
Изначальное назначение системы MATLAB состояло именно в том, чтобы создать
диалоговую среду для работы с пакетами программ линейной алгебры.
Несмотря на кажущуюся завершенность, этот раздел развивается и в настоящее время
в направлении создания новых операций: для работы с парами матриц (приведение пары
матриц к форме Шура, рекуррентное сингулярное разложение пары прямоугольных матриц),
решения матричных полиномов и полиномиальных матричных уравнений.
Рассмотрим функции системы MATLAB, которые поддерживают работу с матрицами,
в следующей последовательности: характеристики матриц, решение систем линейных
уравнений, вычисление собственных значений и сингулярных чисел, вычисление функций от
матриц, работа с алгебраическими полиномами.
Характеристики матриц
COND - число обусловленности матрицы
NORM - нормы векторов и матриц
RCOND - оценка числа обусловленности матрицы
RANK - ранг матрицы
DET - определитель матрицы
TRACE - след матрицы
NULL - нуль-пространство (ядро) матрицы
ORTH - ортонормальный базис матрицы
SUBSPACE - угол между двумя подпространствами
RREF - треугольная форма матрицы
Решение линейных уравнений
\, / - решатели систем линейных уравнений
CHOL - разложение Холецкого
LU - LU-разложение
INV - обращение матрицы
41
PINV - псевдообращение матрицы по Муру-Пенроузу
QR, QRDELETE, QRINSERT - QR-разложение
PLANEROT - преобразование Гивенса
NNLS - метод наименьших квадратов с ограничениями
LSCOV - метод наименьших квадратов в присутствии шумов
Вычисление собственных значений и сингулярных чисел
EIG, CDF2RDF - собственные значения и собственные векторы матрицы
BALANCE - масштабирование матрицы
HESS - приведение к форме Хессенберга
SCHUR, RSF2CSF - приведение к форме Шура
CPLXPAIR - сортировка комплексносопряженных пар
QZ - прведение пары матриц к обобщенной форме Шура
POLYEIG - вычисление собственных значений матричного полинома
SVD - сингулярное разложение матрицы
Вычисление функций от матриц
EXPM, EXPM1, EXPM2, EXPM3 - вычисление матричной экспоненты
LOGM - вычисление логарифма матрицы
SQRTM - вычисление функции A 1/2
FUNM - вычисление произвольных функций от матрицы
Полиномы и операции над ними
POLYVAL - вычисление полинома
POLYVALM - вычисление матричного полинома
CONV - умножение полиномов
DECONV - деление полиномов
POLYDER - вычисление производных
ROOTS - вычисление корней полиномов
POLY - вычисление характеристического полинома
RESIDUE, RESI2 - разложение на простые дроби
COND
Число обусловленности матрицы
Синтаксис:
k = cond(A)
Описание:
Функция k = cond(A) возвращает число обусловленности матрицы A по отношению к
операции обращения, которое равно отношению максимального сингулярного числа к
минимальному: k = max/ min.
Число обусловленности по отношению к операции обращения - это мера относительной
погрешности, равная
k = || (A-1)||/|| A||,
где || A|| - норма матрицы погрешностей исходных данных. Оно характеризует точность
операции обращения матрицы или решения системы линейных уравнений.
Эта функция неприменима для разреженных матриц.
Сопутствующие функции: CONDEST, RCOND, NORM, SVD.
Ссылки:
42
1. Dongarra J. J., Bunch J. R., Moler C. B., Stewart G. W. LINPACK User‟s Guide.
Philadelphia, 1979.
Нормы векторов и матриц
NORM
Синтаксис:
n = norm(v, p)
n = norm(A, p)
n = norm(v)
n = norm(A, „fro‟)
n = norm(A)
Описание:
Нормы векторов:
Функция n = norm(v, p) вычисляет p-норму вектора v, определяемую следующим
образом:
|| v ||p = sum(abs(v).^p)^1/p.
Cправедливы следующие соотношения:
norm(v) = norm(v, 2);
norm(v, inf) = max(abs(v));
norm(v, -inf) = min(abs(v)).
Нормы матриц:
Функция n = norm(A, p) вычисляет подчиненную p-норму матрицы A только для
значений p, равных 1, 2, inf.
Cправедливы следующие соотношения:
norm(A, 1) = max(sum(abs(A)));
norm(A, inf) = max(sum(abs(A‟)));
norm(A, „fro‟) = sqrt(sum(diag(A‟ * A)));
norm(A) = norm(A, 2) = smax(A).
Пример:
Нормы вектора:
Нормы матрицы:
v = -3 : 2;
A = toeplitz(1:5, 1.5:4.5);
norm(v, 1)
ans = 9.0000
norm(A, 1)
ans = 15
norm(v, 2)
ans = 4.3589
norm(A, 2)
ans = 12.1001
norm(v, 3)
ans = 3.5569
norm(A, inf)
ans = 14
norm(v, inf)
ans = 3
norm(A, 'fro')
ans = 12.9422
norm(v, -inf)
ans = 0
norm(A)
ans = 12.1001
norm(v)
ans = 4.3589
Сопутствующие функции: COND, RCOND, SVD, MIN, MAX.
RCOND
Оценка числа обусловленности матрицы
Синтаксис:
k_1 = rcond(A)
Описание:
Функция k_1 = rcond(A) возвращает величину, обратную значению числа
обусловленности матрицы A относительно 1-нормы. Если матрица A хорошо обусловлена,
43
то значение k_1 близко к единице; если матрица A плохо обусловлена, то значение k_1
близко к нулю.
Пример:
A = hilb(4);
1/rcond(A)
cond(A)
condest(A)
2.1523e+004
1.5514e+004
2.8375e+004
Сопутствующие функции: COND, NORM, SVD, RANK, CONDEST.
Ссылки:
1. Dongarra J. J., Bunch J. R., Moler C. B., Stewart G. W. LINPACK User‟s Guide.
Philadelphia, 1979.
RANK
Ранг матрицы
Синтаксис:
r = rank(A)
r = rank(A, tol)
Описание:
Функция r = rank(A) возвращает ранг матрицы, который определяется как количество
сингулярных чисел, превышающих порог max(size(A))*norm(A)*eps.
Функция r = rank(A, tol) возвращает ранг матрицы, который определяется как
количество сингулярных чисел, превышающих заданный порог tol.
Алгоритм:
Существует несколько подходов к вычислению ранга матрицы. В системе MATLAB
использован метод, основанный на вычислении сингулярных чисел матрицы A; он
реализован в виде функции svd. Это наиболее надежный метод, хотя и требующий
значительного времени на вычисление.
Сам алгоритм вычисления ранга достаточно прост:
s = svd(A);
tol = max(size(A)) * s(1) * eps;
r = sum(s > tol).
Сопутствующие функции: SVD.
Ссылки:
1. Dongarra J. J., Bunch J. R., Moler C. B., Stewart G. W. LINPACK User‟s Guide. Philadelphia,
1979.
DET
Определитель матрицы
Синтаксис:
d = det(A)
Описание:
Функция d = det(A) вычисляет определитель квадратной матрицы; если матрица A
целочисленная, то результатом является также целое число.
Алгоритм:
Определитель матрицы вычисляется на основе треугольного разложения методом
исключения Гаусса:
[L, U] = lu(A);
s = det(L);
d = s * prod(diag(U)).
Пример:
Вычисление определителя и ранга матриц Гильберта различного порядка.
n
3
4
5
6
7
8
9
10
11
det
4.6296 1.6534 3.7493 5.3673 4.8358 2.7371 9.7203 2.1645 3.0274
44
e-004
e-007
e-012
e-018
e-025
e-033
rank
3
4
5
6
7
8
Сопутствующие функции: INV, LU, RCOND, RREF, /, \.
e-043
e-053
e-065
9
10
11
След матрицы
TRACE
Синтаксис:
t = trace(A)
Описание:
Функция t = trace(A) вычисляет след квадратной матрицы, равный сумме ее
диагональных элементов.
Алгоритм:
Алгоритм вычисления следа матрицы на языке MATLAB - это однострочный М-файл
t = sum(diag(A)).
Пример:
Вычисление следа, определителя и ранга матриц Гильберта различного порядка.
n
3
4
5
6
7
8
9
10
11
trace
1.5333 1.6762 1.7873 1.8782 1.9551 2.0218 2.0806 2.1333 2.1809
det
4.6296 1.6534 3.7493 5.3673 4.8358 2.7371 9.7203 2.1645 3.0274
e-004 e-007 e-012 e-018 e-025 e-033 e-043 e-053 e-065
rank
3
4
5
Сопутствующие функции: DET, EIG.
6
7
8
9
10
11
Нуль-пространство (ядро) матрицы
NULL
Синтаксис:
Q = null(A)
Описание:
Функция Q = null(A) возвращает ортонормальный базис нуль-пространства матрицы
A; если Q - не пустая матрица, то справедливы следующие соотношения:
Q‟ * Q = eye(size(A));
A * Q = 0.
Количество столбцов матрицы Q определяет размерность нуль-пространства или
дефект матрицы A, что можно вычислить следующим образом:
defect = size(null(A), 2).
Пример:
Вычисление дефекта, следа, определителя и ранга матриц Гильберта различного порядка.
n
4
5
6
7
8
9
10
11
12
defect
0
0
0
0
0
0
0
0
1
trace
1.6762 1.7873 1.8782 1.9551 2.0218 2.0806 2.1333 2.1809 2.2244
det
1.6534 3.7493 5.3673 4.8358 2.7371 9.7203 2.1645 3.0274 2.7904
e-007 e-012 e-018 e-025 e-033 e-043 e-053 e-065 e-078
rank
4
5
6
7
8
Сопутствующие функции: QR, ORTH, SUBSPACE.
ORTH
Синтаксис:
Q = orth(A)
9
10
11
12
Ортонормальный базис матрицы
45
Описание:
Функция Q = orth(A) возвращает ортонормальный базис матрицы A; столбцы Q
определяют то же пространство, которая определяет и столбцы A, но столбцы Q
ортогональны, то есть
Q‟ * Q = eye(size(A)).
Количество столбцов матрицы Q определяет ранг матрицы A, что можно вычислить
следующим образом:
rank = size(orth(A), 2).
Пример:
Вычисление ранга матриц Гильберта различного порядка:
n
4
5
6
7
8
9
10
11
12
rank
4
5
6
7
8
Сопутствующие функции: QR, NULL, SUBSPACE.
SUBSPACE
9
10
10
11
Угол между двумя подпространствами
Синтаксис:
theta = subspace(A, B)
Описание:
Функция theta = subspace(A, B) возвращает угол между двумя подпространствами,
натянутыми на столбцы матриц A и B; если a и b - векторы единичной длины, то
вычисляется угол между двумя векторами theta = acos(a‟ * b).
Если некоторая реализация физического эксперимента описывается массивом A, а
другая реализация - массивом B, то функция subspace(A, B) определяет меру количества
новой информации, полученной из второго эксперимента и не связанную со случайными
ошибками.
Сопутствующие функции: NULL, QR, ORTH.
Треугольная форма матрицы
RREF
Синтаксис:
R = rref(A)
[R, jb] = rref(A)
rrefmovie(A)
R = rref(A, tol)
[R, jb] = rref(A, tol)
rrefmovie(A, tol)
rrefmovie
Описание:
Функция R = rref(A) осуществляет приведение матрицы к треугольной форме на
основе метода исключения Гаусса с частичным выбором ведущего элемента.
По умолчанию используется следующее значение порога для принятия решения о
малости исключаемого элемента:
tol = max(size(A) * eps * norm(A, inf).
Функция R = rref(A, tol) осуществляет приведение матрицы к треугольной форме на
основе метода исключения Гаусса с частичным выбором ведущего элемента для заданного
значения порога tol.
Функции [R, jb] = rref(A) и [R, jb] = rref(A, tol) кроме треугольной формы возвращают
также вектор jb, обладающий следующими свойствами:
r = length(jb) может служить оценкой ранга матрицы A;
при решении систем линейных уравнений Ax = b переменные x(jb) являются
связанными переменными;
столбцы A(:, jb) определяют базис матрицы A;
R(1 : r, jb) - единичная.
46
Функции R = rrefmovie(A) и R = rrefmovie(A, tol) реализуют пошаговую процедуру
приведения матрицы к треугольной форме с выводом на экран промежуточных матриц.
Функции R = rrefmovie демонстрирует пошаговую процедуру приведения некоторой
матрицы размера 8 х 6 с рангом 4 к треугольной форме.
Примеры:
A = magic(4), [R, jb]=rref(A)
A=
R=
16 2 3 13
1 0
0 1
5 11 10 8
0 1
0 3
9 7 6 12
0 0
1 -3
4 14 15 1
0 0
0 0
jb = 1 2 3
r = length(jb)
r=3
A(:, jb) =
R(:, jb) =
16 2 3
1
0
0
5 11 10
0
1
0
9 7 6
0
0
1
4 14 15
0
0
0
Сопутствующие функции: RANK, ORTH, LU, INV.
\, /
Решатели систем линейных уравнений
Синтаксис:
X=B\A
X=B/A
Описание:
Функция X = B \ A находит решение системы уравнений вида AX = B, где A прямоугольная матрица размера m х n и B - матрица размера n х k.
Функция X = B / A находит решение системы уравнений вида XA = B, где A прямоугольная матрица размера n х m и B - матрица размера m х k.
Алгоритм:
Решение систем линейных уравнений вида X = A \ B и X = B / A реализовано в
MATLAB с помощью специального монитора, который использует разные алгоритмы
решения в зависимости от структуры матрицы A.
Если A - треугольная матрица с точностью до перестановки ее строк или столбцов, то
решение таких систем уравнений может быть эффективно вычислено методом
обратной подстановки. Проверка матрицы, является ли она верхней треугольной,
осуществляется для полных матриц проверкой на нуль всех элементов, лежащих ниже
диагонали; для разреженных матриц - определением структуры ее элементов.
Большинство матриц нетреугольной структуры выявляются почти мгновенно, так что
такая проверка требует очень малого времени.
Если матрица A - симметрическая или эрмитова с положительными диагональными
элементами, то применяется разложение Холецкого (функция chol). Если A разреженная матрица, применяется алгоритм упорядочения по разреженности
(функции symmmd и spparms). Если при этом матрица A положительно определенна, то
алгоритм Холецкого позволяет эффективно найти решение. Матрицы, не являющиеся
47
положительно определенными, выявляются почти мгновенно. Разложение Холецкого
имеет вид:
A = L * LT,
где LT - верхняя треугольная матрица. После этого решение Х можно получить решая
последовательно две треугольные системы
X = LT \ (L \ B).
Если A - произвольная квадратная матрица, то треугольное разложение вычисляется
методом исключения Гаусса с частичным выбором главного элемента (функция lu).
Если A - разреженная матрица, применяется алгоритм упорядочения по разреженности
столбцов (функции colmmd и spparms). В результате имеем следующее разложение:
A = L * U,
где L - нижняя, а U - верхняя треугольные матрицы. После этого решение Х можно получить
решая последовательно две треугольные системы
X = U \ (L \ B).
Если A - прямоугольная полная матрица, то применяется QR-разложение на основе
преобразований Хаусхолдера следующего вида
A * P = Q * R,
где P - матрица преобразований, Q - ортогональная и R - верхняя треугольная (функция qr)
матрицы. Решение, соответствующее минимуму квадрата ошибки, находится согласно
следующему соотношению
X = P * (R \ (QT * B)).
Если A - прямоугольная разреженная матрица, то формируется вспомогательная
расширенная матрица следующего вида:
S = [c*I A; AT 0].
Это реализуется с помощью функции spaugment. По умолчанию значение коэффициента
масштабирования невязки c равно max(max(abs(A)))/1000 (функция spparms). Решение X в
соответствии с методом наименьших квадратов и матрица невязок R = B - A * X вычисляются
путем решения следующей системы:
S * [R / c; X] = [B; 0]
с использованием алгоритмов упорядочения по разреженности и исключения Гаусса с выбором
главного элемента.
Различные алгоритмы разложения матриц реализованы в системе MATLAB на основе ZGECO,
ZGEFA и ZGESL для квадратных и процедур ZQRDC и ZQRSL для прямоугольных матриц из
пакета LINPACK [1].
Диагностические сообщения:
При решении систем линейных уравнений:
если A - квадратная вырожденная матрица, выдается сообщение Matrix is singular to working
precision.
Для выбранной точности матрица вырожденна.
При поэлементном делении:
если массив-делитель имеет нулевые элементы, выдается сообщение
Divide by zero.
Деление на нуль.
48
На ЭВМ, где не реализован стандарт IEEE-арифметики, например на ЭВМ VAX, обе
вышеприведенные операции будут выдавать сообщения об ошибке. На ЭВМ, где реализован
стандарт IEEE-арифметики, например на РС, будут генерироваться только предупреждения.
При этом при решении систем будут возвращаться матрицы, часть элементов которых будет
иметь значение Inf; при поэлементном делении результатом могут быть как значения Inf, так
и значение NaN.
Если результат обращения матрицы не является надежным, выдается сообщение
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = xxx
Предупреждение: Матрица близка к вырожденной или плохо масштабирована.
Результаты могут быть неточными. Число обусловленности RCOND = xxx
При решении систем линейных уравнений:
если прямоугольная матрица А имеет неполный столбцовый ранг, выдается сообщение
Warning: Rank deficient, rank = xxx tol = xxx
Предупреждение: Неполный ранг, ранг rank = xxx точность tol = xxx
Сопутствующие функции: INV, QR, DET, LU, RCOND, ORTH, RREF.
Ссылки:
1. Dongarra J. J., Bunch J. R., Moler C. B., Stewart G. W. LINPACK User‟s Guide. Philadelphia,
1979.
Разложение Холецкого
CHOL
Синтаксис:
R = chol(A)
[R, p] = chol(A)
Описание:
Функция R = chol(A) находит разложение Холецкого для действительных
симметрических и комплексных эрмитовых матриц. Если A - положительно определенная
матрица, то матрица R - верхняя треугольная и удовлетворяет соотношению R‟ * R = A; в
противном случае появляется сообщение об ошибке.
Функция [R, p] = chol(A) никогда не генерирует сообщения об ошибке; если A положительно определенная матрица, то p = 0 и матрица R совпадает с предшествующим
случаем, в противном случае p > 0 и R - верхняя треугольная матрица порядка q = p -1 такая,
что R‟ * R = A(1 : q, 1 : q).
Примеры:
Рассмотрим матрицу Паскаля, составленную из биномиальных коэффициентов. Это
положительно определенная матрица, а ее разложение Холецкого также использует часть
биномиальных коэффициентов:
A = pascal(5)
A
R = chol(A)
eig(A)
1
1
1
1
1
1
1
1
1
1
0.0108
1
2
3
4
5
0
1
2
3
4
1.1812
1
3
6
10 15
0
0
1
3
6
1.0000
1
4 10 20 35
0
0
0
1
4
5.5175
1
5 15 35 70
0
0
0
0
1
92.2904
Разрушим положительную определенность этой матрицы, вычтя из ее последнего элемента
единицу:
A
[R, p] = chol(A)
eig(A)
1
1
1
1
1
1
1
1
1
0.0000
49
1
2
3
4
5
0
1
2
3
0.1500
1
3
6
10 15
0
0
1
3
0.9522
1
4 10 20 35
0
0
0
1
5.3531
1
5 15 35 69
p=5
91.5446
R' * R =
1
1
1
1
1
2
3
4
1
3
6
10
1
4
10 20
Сопутствующие функции: QR, LU.
Ссылки:
1. Dongarra J. J., Bunch J. R., Moler C. B., Stewart G. W. LINPACK User‟s Guide.
Philadelphia, 1979.
LU
LU-разложение
Синтаксис:
[L, U] = lu(A)
[L, U, P] = lu(A)
Описание:
Функция [L, U] = lu(A) находит LU-разложение для произвольной квадратной
матрицы A в виде произведения нижней треугольной матрицы L (возможно с
перестановками) и верхней треугольной матрицы U, так что A = L * U.
Функция [L, U, P] = lu(A) находит разложение для произвольной квадратной матрицы
A в виде трех составляющих - нижней треугольной матрицы L, верхней треугольной
матрицы U и матрицы перестановок P, так что P * A = L * U.
Все алгоритмы LU-разложения так или иначе основаны на методе исключения Гаусса.
LU-разложение используется при вычислении определителей, нахождении обратных матриц
и в решателях систем линейных уравнений.
Примеры:
Рассмотрим возмущенную отрицательно определенную матрицу Паскаля 3-го порядка
следующего вида:
A=
eig(A) =
[L, U] = lu(A)
L=
1 1
1
0.7024
1 2
3
-0.2185
1 3
4
6.5160
U=
L*U=
1.0000
0
0
1.0000
1.0000
1.0000
1
1 1
1.0000
0.5000
1.0000
0
2.0000
3.0000
1
2 3
1.0000
1.0000
0
0
0
0.5000
1
3 4
det(A) = det(L) * det(U) = -1;
[L, U, P] = lu(B)
L=
U=
1.0000
0
0
1.0000 1.0000 1.0000
P=
L*U=
1 0 0
1
1 1
50
1.0000
0.5000
0
0
2.0000 3.0000
0 0 1
1
2 3
1.0000
1.0000
1.0000
0
0
0 1 0
1
3 4
0.5000
det(A) = det(L) * det(U)/det(P) = -1;
Сопутствующие функции: QR, INV, DET, RCOND, RREF, \, /.
Ссылки:
1. Dongarra J. J., Bunch J. R., Moler C. B., Stewart G. W. LINPACK User‟s Guide.
Philadelphia, 1979.
Обращение матрицы
INV
Синтаксис:
Y = inv(A)
Описание:
Функция Y = inv(A) вычисляет матрицу, обратную квадратной матрице A. В случаях,
когда матрица A плохо масштабирована или близка к вырожденной, выдаются сообщения.
На практике вычисление явной обратной матрицы требуется не так часто. Как
правило, говоря о задаче обращения, имеют в виду нахождение решений систем линейных
уравнений. В рамках системы MATLAB для этих целей рекомендуется использовать
решатели систем, то есть операторы вида x = A\b или x = b/ A, а не операцию x = inv(A)*b.
Диагностические сообщения:
В процессе выполнения функции inv на рабочих станциях и компьютерах с IEEEарифметикой возможно появление следующего предупреждения:
Matrix is singular to working precision.
При заданной точности матрица вырожденна.
При этом формируется матрица, все элементы которой равны Inf.
На машинах без IEEE-арифметики, например на VAX, эта ситуация рассматривается как
ошибка.
Если выполненное обращение ненадежно, появляется сообщение
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = xxx
Предупреждение: Матрица близка к вырожденной. Результаты могут быть
неточными. RCOND = xxx
Примеры:
Рассмотрим пример, демонстрирующий различие в определении решения систем
линейных уравнений с помощью операций x = inv(A) * b и x = A \ b.
Cформируем матрицу Кахана A = kahan(100,1.35); со следующими характеристиками:
cond(A) = 1.6203e+010 norm(A) = 8.2970,
используя пакет Test Matrix Toolbox.
Затем сформируем результат в виде случайного вектора x = rand(100, 1);, а затем
вычислим вектор b = A * x.
Используя компьютер PC/AT 486 с тактовой частотой 50 МГц, выполним следующие
расчеты с фиксацией продолжительности вычислений:
t0 = clock;
t0 = clock;
y = inv(A) * b;
z = A \ b;
t = etime(clock, t0)
t = etime(clock, t0)
t = 1.0400
t = 0.0600
err = norm(y - x)
err = norm(z - x)
err = 2.3224e-008
err = 1.1668e-008
res = norm(A * y b)
res = norm(A * z - b)
51
res = 2.5831e-008
res = 1.0409e-014
Сравнивая оба подхода, можно убедиться, что расчеты с помощью решателя
выполняются значительно быстрее и с большей точностью.
Сопутствующие функции: DET, LU, RCOND, RREF, \, /.
Ссылки:
1. Dongarra J. J., Bunch J. R., Moler C. B., Stewart G. W. LINPACK User‟s Guide.
Philadelphia, 1979.
PINV
Псевдообращение матрицы по Муру-Пенроузу
Синтаксис:
P = pinv(A)
P = pinv(A, tol)
Описание:
Функция P = pinv(A) вычисляет матрицу, псевдообратную матрице A, которая имеет такие
же размеры, как и матрица A‟, и удовлетворяет следующим условиям [1]:
A * P * A = A;
P * A * P = P.
Вычисление матрицы P основано на использовании функции svd(A) и приравнивании
к нулю всех сингулярных чисел, меньших величины tol, которая по умолчанию принимается
равной tol = max(size(A)) * norm(A) * eps.
Функция P = pinv(A, tol) позволяет пользователю самому назначить порог tol.
Если матрица A квадратная и невырожденная, то вычисление обратной на основе
псевдообращения является слишком расточительной процедурой. Если A - квадратная и
вырожденная или прямоугольная матрица, то обратной матрицы не существует; в этих
случаях псевдообратная матрица обладает некоторыми, но не всеми свойствами обратной.
Если A имеет строк больше, чем столбцов, и не является матрицей полного ранга, то
возникает переопределенная задача наименьших квадратов
Вектор x минимизирует указанную норму тогда и только тогда, когда x имеет вид
x = pinv(A) * b + (I - pinv(A) * A) * z
для некоторого z.
Выберем два из бесконечного множества решений:
x = pinv(A) * b;
y = A \ b.
Эти решения характеризуются следующими свойствами: решение x имеет норму
norm(x), которая минимальна в сравнении с нормой любого другого решения; решение y
имеет минимальное количество ненулевых компонентов.
Пример:
Рассмотрим прямоугольную матрицу, которая генерируется следующим образом:
A = magic(8); A = A(:, 1:6).
Эта матрица размером 8 х 6 имеет ранг, равный 3.
Сформируем вектор b = 260 * ones(8, 1).
Тогда получим следующие решения
x = pinv(A) * b y = A \ b
x=
Warning: Rank deficient, rank = 3 tol = 1.8829e-013
1.1538
Предупреждение: Ранг неполный, rank = 3 tol = 1.8829e-013
y=
1.4615
3.0000
1.3846
1.3846
4.0000
52
1.4615
0
1.1538
norm(x) = 3.2817
0
1.0000
0
norm(y) = 5.0990
Вектор z, удовлетворяющий условию y = x + (I - pinv(A) * A) * z, равен
z‟ = [ 5.7517 9.6751 4.6404 5.8559 7.8906 1.5362 ]
Сопутствующие функции: RANK, INV, SVD, QR.
Ссылки:
1. Алберт А. Регрессия, псевдоинверсия и рекуррентное оценивание: Пер. с англ.
М.:Наука, 1977. 224 с.
QR,
QRDELETE,
QRINSERT
QR-разложение
Синтаксис:
[Q, R] = qr(A)
Q, R] = qrdelete(Q, R, j)
[Q, R] = qrinsert(Q, R, j, x)
[Q, R, P] = qr(A)
Y = qr(A)
Описание:
Функция [Q, R] = qr(A) находит QR-разложение для произвольной матрицы A в виде
произведения унитарной матрицы Q и верхней треугольной матрицы R, так что A = Q * R.
Функция [Q, R, P] = qr(A) находит разложение для произвольной квадратной матрицы
A в виде трех составляющих - унитарной матрицы Q, верхней треугольной матрицы R с
убывающими по модулю диагональными элементами и матрицы перестановок P, так что A *
P = Q * R.
Функция Y = qr(A) возвращает матрицу Y, которая связана с матрицей R
соотношением R = triu(Y).
Функция [Q, R] = qrdelete(Q, R, j) позволяет пересчитать известное QR-разложение
матрицы A для случая, когда в матрице A удален j-й столбец A(:, j). Функция [Q, R] =
qrinsert(Q, R, j, x) позволяет пересчитать известное QR-разложение матрицы A для случая,
когда в матрице A перед j-м столбцом A(:, j) вставлен дополнительный столбец x. Если
указать j = n+1, где n - число столбцов матрицы A, то дополнительный столбец x будет n+1-м
столбцом матрицы.
Примеры:
Рассмотрим операции, связанные с QR-разложением следующей прямоугольной
матрицы A:
[Q, R] = qr(A)
A=
Q=
R=
1
2
3
-0.0776 -0.8331 0.5444 0.0605
-12.8841 -14.5916 -16.2992
4
5
6
-0.3105 -0.4512 -0.7709 0.3251
0
-1.0413 -2.0826
7
8
9
-0.5433 -0.0694 -0.0913 -0.8317
0
0
0.0000
-0.7762 0.3124 0.3178 0.4461
0
0
0
10 11 12
Удалим второй столбец из матрицы A:
[Q1, R1] = qrdelete(Q, R, 2)
Q1 =
R1 =
53
-0.0776 -0.8331 0.5444 0.0605
-12.8841 -16.2992
-0.3105 -0.4512 -0.7709 0.3251
0
-2.0826
-0.5433 -0.0694 -0.0913 -0.8317
0
0
-0.7762 0.3124 0.3178 0.4461
0
0
Вставим второй столбец из матрицы A на место третьего:
[Q2, R2] = qrinsert(Q1, R1, 3, A(:,2))
Q2 =
R 2=
0.8331
0.0776
0.5458 0.0456
0.4512 0.6938 0.4676
0.3105
0.0694 0.2499
0.5433
0.7985
0.3764
0.7762 0.3124 0.3979
12.8841 16.2992 14.5916
0
2.0826
1.0413
0
0
0.0000
0
0
0
1
3
2
4
6
5
7
9
8
10 12 11
Сопутствующие функции: ORTH, NULL, LU, \, /.
Ссылки: 1. Dongarra J. J., Bunch J. R., Moler C. B., Stewart G. W. LINPACK User‟s
Guide. Philadelphia, 1979.
Преобразование Гивенса
PLANEROT
Синтаксис:
[G, y] = planerot(x)
Описание:
Функция [G, y] = planerot(x), где x - вектор-столбец из двух компонентов, возвращает
ортогональную матрицу G порядка 2, такую, что выполняется условие y = Gx и y(2) = 0.
Преобразование Гивенса применяется для исключения элементов матрицы с целью ее
приведения к более простой форме (Хессенберга, трехдиагональной и т. п.).
Сопутствующие функции: QRINSERT, QRDELETE.
NNLS
Метод наименьших квадратов с ограничениями
Синтаксис:
x = nnls(A, b)
[x, w] = nnls(A, b)
x = nnls(A, b, tol)
[x, w] = nnls(A, b, tol)
Описание:
Функция x = nnls(A, b) находит неотрицательные решения xj >= 0, j = 1,..., n для
системы уравнений вида Ax = b по методу наименьших квадратов. Для отбора таких
решений по умолчанию используется значение порога tol = max(size(A)) * norm(A,1) * eps.
Функция x = nnls(A, b, tol) позволяет пользователю самому установить значение
порога tol.
Функции [x, w] = nnls(A, b) и [x, w] = nnls(A, b, tol) позволяют в дополнение к
решению x возвратить также вектор двойственных переменных w. Векторы x и w связаны
между собой следующими соотношениями:
wi < 0, (i | xi = 0);
wi = 0, (i | xi > 0).
Пример:
Сравним решения задачи наименьших квадратов с ограничениями и без них. Пусть
задана следующая система уравнений, описываемая парой {A, b}
54
A=
b=
0.0372 0.2869
0.8587
0.6861 0.7071
0.1781
0.6233 0.6245
0.0747
0.6344 0.6170
0.8405
Вычислим решения без ограничений и с ограничениями на переменные, а также
нормы невязок:
[ A\b nnls(A, b) ] [norm(A * (A \ b) - b) norm(A * nnls(A, b) - b)]
-2.5627 0
0.6674
3.1108 0.6929
0.9118
Как следует из решения, невязка для решения без ограничений меньше, но при этом
один из компонентов вектора x отрицателен.
Найдем вектор двойственных переменных w:
[x, w] = nnls(A, b)
x=
w=
0
-0.1506
0.6929
0.0000
Сопутствующие функции: LSCOV.
Ссылки:
1. Lawson C. L., Hanson R. J. Solving Least Squares Problems. Prentice-Hall, 1974.
LSCOV
Метод наименьших квадратов в присутствии шумов
Синтаксис:
x = lscov(A, b, V)
Описание:
Функция x = lscov(A, b, V) возвращает решение x для следующей системы уравнений
Ax = b + v, где вектор шумов v имеет матрицу ковариаций V. Решение минимизирует по
методу наименьших квадратов следующую квадратичную форму:
(Ax - b)‟ * inv(V) * (Ax - b).
Решение задачи имеет вид [1, 2]:
x = inv(A‟ * inv(V) * A) * A‟ * inv(V) * b.
Реально алгоритм построен так, что обращения матрицы V не требуется.
Сопутствующие функции: QR, NNLS.
Ссылки:
1. Strang G. Introduction to Applied Mathematics. Wellesley-Cambridge, 1986.
2. Алберт А. Регрессия, псевдоинверсия и рекуррентное оценивание: Пер. с англ.
М.:Наука, 1977. 224 с.
EIG, CDF2RDF
Cобственные значения и собственные векторы матрицы
Синтаксис:
d = eig(A)
d = eig(A, B)
[R, D] = eig(A)
[V, D] = eig(A, B)
[R, D] = eig(A, „nobalance‟)
[R, D] = cdf2rdf(R, D)
Описание:
55
Проблема собственных значений состоит в нахождении нетривиальных решений
системы уравнений, которая может быть интерпретирована как алгебраический эквивалент
системы обыкновенных дифференциальных уравнений в явной форме Коши:
A = r,
где A - квадратная матрица порядка n;
r - вектор-столбец размера 1х n, называемый собственным вектором;
- скаляр, называемый собственным значением.
Функция d = eig(A) вычисляет собственные значения матрицы A.
Функция [R, D] = eig(A) вычисляет диагональную матрицу D собственных значений и
матрицу R правых собственных векторов, удовлетворяющих соотношению A * R = R * D.
Эти векторы нормированы так, что норма каждого из них равна единице.
Левые собственные векторы могут быть найдены следующим образом:
[L, D] = eig(A‟);
Матрицы собственных значений D для A и A‟ содержат одни и те же собственные
значения, хотя порядок их следования может быть различен. Матрица левых собственных
векторов удовлетворяет соотношению A‟ * L = L * D. Для согласования независимо
найденных систем правых и левых собственных векторов систему левых векторов
необходимо нормировать так, чтобы соблюдалось условие L * R = eye(n,n).
Функция [R, D] = cdf2rdf(R, D) преобразовывает комплексные выходы функции eig в
действительные, при этом комплексные собственные значения преобразовываются в блоки
размера 2 х 2, а комплексная матрица правых собственных векторов R преобразовывается в
действительную, столбцы которой, соответствующие действительным собственным
значениям, сохраняются, а соответствующие комплексным - расщепляются на два: [Re(ri)
Im(ri)].
Пример 1:
Рассмотрим матрицу порядка 3 с одним действительным и парой комплексно
сопряженных собственных значений и выполним вычисления с использованием
комплексных матриц.
Применяя функцию cdf2rdf, эти же вычисления можно реализовать, используя только
действительные матрицы, что позволяет более экономно расходовать память.
Функция [R, D] = eig(A, „nobalance‟) вычисляет собственные значения и собственные
векторы без предварительного масштабирования матрицы. Обычно, масштабирование
улучшает обусловленность матрицы, гарантируя большую точность вычислений. Однако
когда матрица содержит очень малые по величине элементы, которые находятся в пределах
ошибок округления, масштабирование может сделать их сравнимыми с другими элементами
матрицы, что может привести к неправильным результатам.
Пример 2:
Рассмотрим матрицу порядка 4, которая содержит элементы, сравнимые с ошибками
округления.
B=
[RB, DB] = eig(B);
;
RN, DN] = eig(B, 'nobalance');
DB =
DN =
5.5616 0
0
0
0
1.4384 0
0
0
0
1.0000 0
0
0
0
-1.0000
norm(B * RB - RB * DB) =
5.5616
1.4384
1.0000
-1.0000
norm(B*RN- RN*DN) = 0.9957e-015
56
1.24392
Как следует из этого примера, собственные значения в обоих случаях вычислены
правильно, но нормы невязок различаются очень существенно, что свидетельствует о том,
что собственные векторы в первом случае вычислены неверно.
Обобщенная проблема собственных значений состоит в нахождении нетривиальных
решений системы уравнений
Ar = Br,
где A, B - квадратные матрицы порядка n;
r - вектор-столбец размера 1 х n, называемый обобщенным собственным вектором;
- скаляр, называемый обобщенным собственным значением.
Вычисления с использованием комплексных матриц:
Вычисления с использованием только действительных матриц:
Если B - невырожденная матрица, то система может быть рассмотрена как
алгебраический эквивалент системы обыкновенных дифференциальных уравнений в неявной
форме Коши, а задача может быть сведена к обычной проблеме собственных значений
B-1Ar = r.
В случае, когда B - вырожденная матрица, система уравнений представляет собой
смешанную систему дифференциальных и алгебраических уравнений и для ее решения
необходимо применять специальные методы.
Функция d = eig(A, B) вычисляет обобщенные собственные значения матрицы A.
Функция [R, D] = eig(A, B) вычисляет диагональную матрицу D обобщенных
собственных значений и матрицу R правых обобщенных собственных векторов,
удовлетворяющих соотношению A * R = B * R * D. Эти векторы нормированы так, что
норма каждого из них равна единице.
Алгоритм:
Для действительных матриц функция eig(A) использует следующие модули пакета
EISPACK [1-2]: balance, balbak, orthes, ortran и hqr2. Модули balance и balbak связаны с
операциями масштабирования и восстановления; модуль orthes осуществляет приведение
57
матрицы к форме Хессенберга посредством ортогональных подобных преобразований;
модуль ortran запоминает все преобразования; модуль hqr2 вычисляет собственные значения
и векторы матрицы в верхней форме Хессенберга с использованием QR-алгоритма Франсиса
и Кублановской [3].
Функция eig(A, B) использует другие модули пакета EISPACK [1-2]: qzhes, qzit, qzval,
и qzvec, основанные на QZ-алгоритме.
Для комплексных матриц функция eig(A) использует QZ-алгоритм, решая задачу в
форме eig(A, eye(A)).
Диагностические сообщения:
Если в течение 30*n итераций собственные значения не найдены, выдается сообщение
Solution will not converge.
Решение не сходится.
Сопутствующие функции: BALANCE, HESS, QZ, SCHUR.
Ссылки:
1. Smith B. T., Boyle J. M., Dongarra J. J., Garbow B. S., Ikebe Y., Klema V., Moler C. B..
Matrix Eigensystem Routines - EISPACK//Guide. Lecture Notes in Computer Science. Berlin,
1976. Vol. 6.
2. Garbow B. S., Boyle J. M., Dongarra J. J., Moler C. B.. Matrix Eigensystem Routines EISPACK Guide Extension//Lecture Notes in Computer Science. Berlin, 1977. Vol. 51.
3. Уилкинсон, Райнш. Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра:
Пер. с англ. М.: Машиностроение, 1976. 390 с.
4. Moler C. B., Stewart G. W. An Algorithm for Generalized Matrix Eigenvalue
Problems//SIAM J. Numer. Anal. 1973. N 2. Vol. 10.
BALANCE
Масштабирование матрицы
Синтаксис:
B = balance(A)
[D, B] = balance(A)
Описание:
Несимметрические матрицы могут проявлять плохую обусловленность при
вычислении их собственных значений. Малые возмущения элементов матрицы, такие, как
ошибки округления, могут вызывать значительные погрешности в собственных значениях.
Величина, связывающая погрешность вычисления собственных значений с погрешностью
исходных данных, называется числом обусловленности задачи на собственные значения и
вычисляется следующим образом:
k = cond(R) = norm(R) * norm(inv(R)), где [R, D] = eig(A).
Цель масштабирования - перевести плохую обусловленность матрицы собственных
векторов в диагональное масштабирование. Масштабирование не может превратить
несимметрическую матрицу в симметрическую, но делается попытка выравнять нормы строк
и соответствующих столбцов. Поскольку масштабирование реализуется введением
множителей, которые являются степенями основания 2, то никаких ошибок округления при
этом не привносится.
Функция B = balance(A) возвращает масштабированную матрицу.
Функция [D, B] = balance(A) кроме масштабированной матрицы возвращает также
диагональную матрицу D, элементы которой являются степенями основания 2; матрица B это результат преобразования подобия
B = D \ A * D.
Функция eig(A) автоматически масштабирует A перед вычислением собственных
значений D. Масштабирование можно подавить, если использовать обращение вида eig(A,
„nobalance‟).
Пример:
58
Рассмотрим матрицу порядка 3, которая имеет большой разброс значений элементов большие наддиагональные и малые поддиагональные элементы.
A=
1
100
10000
0.01
1
0.0001 0.01
Вычислим собственные значения и векторы матрицы A.
[RA, DA] = eig(A)
A=
RA =
100
1
DA =
1.0e+004*
0.9999 -1.0000 -0.9998
3.0000 0
0
0.0001 0.0100 1.0000 0.0100 0.0054 0.0209
0
0.0000 0
0.0000 0.0001 0.0100 0.0001 0.0000 -0.0001
0
0
0.0000
0.0000 0.0000 0.0001 cond(RA) = 1.4073e+004
Матрица собственных векторов плохо обусловлена.
Выполним масштабирование матрицы A.
[D, B] = balance(A)
A=
D=
B=
1.0e+003 *
1.0e+004*
2.0480 0
0
1.0000 1.5625 1.2207
0.0001 0.0100 1.0000
0
0.0320 0
0.6400 1.0000 0.7813
0.0000 0.0001 0.0100
0
0
0.0003 0.8192 1.2800 1.0000
0.0000 0.0000 0.0001
cond(D) = 8192
После масштабирования значения элементов матрицы B оказались выравненными по
величине.
Вычислим собственные значения и векторы матрицы B.
[RB, DB] = eig(B)
B=
RB =
DB =
1.0000 1.5625 1.2207
0.6400 1.0000 0.7813
0.8192 1.2800 1.0000
0.6933 -0.8903 -0.5274
0.4437 0.3070 0.7064
0.5679 0.3364 -0.4721
cond(RB) = 1.9381
3.0000 0
0
0
0.0000 0
0
0
0.0000
Матрица собственных векторов очень хорошо обусловлена. Плохая обусловленность
сконцентрирована в диагональной матрице масштабирования D.
Алгоритм: Функция balance является встроенной функцией интерпретатора
MATLAB; она использует алгоритмы, первоначально написанные на языке АЛГОЛ [1], а
затем реализованные на языке FORTRAN в составе пакета EISPACK: balance, balbak [2].
Ограничения:
Обычно масштабирование улучшает обусловленность матрицы, гарантируя большую
точность вычислений. Однако когда матрица содержит очень малые по величине элементы,
которые находятся в пределах ошибок округления, масштабирование может сделать их
сравнимыми с другими элементами матрицы, что может привести к неправильным
результатам.
Диагностические сообщения:
59
Если матрица не квадратная, выдается сообщение
Matrix must be square.
Матрица должна быть квадратной.
Сопутствующие функции: EIG, HESS, SCHUR.
Ссылки:
1. Уилкинсон, Райнш. Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра:
Пер. с англ. М.: Машиностроение, 1976. 390 с.
2. Garbow B. S., Boyle J. M., Dongarra J. J., Moler C. B.. Matrix Eigensystem Routines EISPACK Guide Extension//Lecture Notes in Computer Science. Berlin, 1977. Vol. 51.
Приведение к форме Хессенберга
HESS
Синтаксис:
H = hess(A)
[P, H] = hess(A)
Описание:
Функция H = hess(A) возвращает матрицу в верхней форме Хессенберга, элементы
которой hij c номерами i > j + 1, то есть расположенные ниже первой поддиагонали, равны
нулю. Если матрица A симметрическая или эрмитова, то матрица Хессенберга вырождается
в трехдиагональную.
Функция [P, H] = hess(A) кроме матрицы в верхней форме Хессенберга возвращает
также унитарную матрицу преобразований P, которая удовлетворяет условиям
A = P * H * P, P‟ * P = eye(size(A)).
Пример:
Рассмотрим приведение матрицы A = magic(5) размером 5 х 5 к верхней форме
Хессенберга.
A = magic(5), H = hess(A)
A=
H=
17 24 1
8
15
17.0000 -28.9413 1.8470 -4.4603 2.2572
23 5
7
14 16
-27.6767 33.9399 26.1875 -2.2280 1.2675
4
13 20 22
6
0
25.0964 20.6871 -6.6055 -0.1973
10 12 19 21 3
0
0
-5.9630 -16.8163 -12.4454
11 18 25 2
0
0
0
9
-9.0122 10.1893
Алгоритм:
Для действительных матриц функция hess(A) использует следующие модули пакета
EISPACK [1-2]: ortran и orthes. Модуль orthes осуществляет приведение матрицы к верхней
форме Хессенберга посредством ортогональных подобных преобразований; модуль ortran
запоминает все преобразования.
Для комплексных матриц функция hess(A) использует модуль qzhes пакета EISPACK.
Сопутствующие функции: EIG, QZ, SCHUR.
Ссылки:
1. Smith B. T., Boyle J. M., Dongarra J. J., Garbow B. S., Ikebe Y., Klema V., Moler C. B..
Matrix Eigensystem Routines - EISPACK Guide//Lecture Notes in Computer Science. Berlin,
1976. 1976. Vol. 6.
2. Garbow B. S., Boyle J. M., Dongarra J. J., Moler C. B.. Matrix Eigensystem Routines EISPACK Guide Extension//Lecture Notes in Computer Science. Berlin, 1977. Vol. 51.
SCHUR,
RSF2CSF
Синтаксис:
Приведение к форме Шура
60
T = schur(A)
[U, T] = schur(A)
[U, T] = rsf2csf(U,T)
Описание:
Функция T = schur(A) возвращает матрицу в форме Шура. Комплексная форма Шура это верхняя треугольная матрица с собственными значениями на диагонали; действительная
форма Шура сохраняет на диагонали действительные собственные значения, а комплексные
представляются в виде блоков 2 х 2, частично занимая нижнюю поддиагональ.
Функция [U, T] = schur(A) кроме матрицы Шура T возвращает также унитарную
матрицу преобразований U, которая удовлетворяет условиям
A = U * H * U‟, U‟ * U = eye(size(A)).
Если исходная матрица A действительная, то возвращается действительная форма
Шура, если комплексная, то комплексная форма Шура. Функции cdf2rdf и rsf2csf
обеспечивают преобразование из одной формы в другую.
Функция [U, T] = rsf2csf(U, T) преобразовывает действительную квазитреугольную
форму Шура в комплексную треугольную.
Пример:
Рассмотрим приведение тестовой матрицы с двумя кратными комплексными и одним
действительным собственными значениями к действительной форме Шура [1].
A=
15 11 6 -9
-15
1
3
9
-3
-8
7
6
6
-3
-11
7
7
5
-3
-11
17
12 5
-10
-16
[U, T] = schur(A)
U=
0.2868
0.0207
0.7227
0.2502
-0.5766
0.4854
0.4640
-0.5919 0.1372
-0.4241
0.4192
0.0148
0.0802
0.6744
0.6023
0.3530
0.5466
0.3290
-0.5861 0.3533
0.6178
-0.6966 -0.1129 -0.3467 -0.0096
T=
-1.0000 20.1766 4.8432 33.1468 15.2146
0
-0.0399 -2.0829 -2.2176 8.8043
0
7.2596
3.0399 10.1089 -10.9556
0
0
0
0.7171
0
0
0
-4.9221 2.2829
2.7149
Преобразуем действительную квазитреугольную форму Шура в комплексную треугольную.
[U1, T1] = rsf2csf(U, T)
U1 =
0.2868 0.6332 + 0.0090i -0.1534 - 0.3133i 0.4310 + 0.1457I 0.2745 + 0.3358i
0.4854 -0.6085 + 0.2012i -0.2984 + 0.2566i 0.3230 + 0.0799I 0.1643 + 0.2470i
0.4192 0.0680 + 0.0064i -0.0280 - 0.0348i -0.5696 + 0.3928I 0.4645 - 0.3508i
0.3530 0.1878 + 0.2370i -0.5434 - 0.1426i -0.2088 - 0.3413I -0.5156 - 0.2058i
61
0.6178 0.0307 - 0.3020i 0.6352 + 0.0490i 0.0520 - 0.2019I -0.2771 + 0.0056i
T1 =
-1.0000 0.4967 + 8.7481i -18.6913 - 2.0999i 7.9820 +19.3046I 28.5534 + 8.8610i
0
1.5000 + 3.5707I -5.8300 - 1.5148i 7.3239 + 8.3731I 6.7070 + 7.8425i
0
0
1.5000 - 3.5707i
2.0252 + 3.2914I -1.9851 + 7.4522i
0
0
0
1.5000 - 3.5707I 2.4562 + 1.1359i
0
0
0
0
1.5000 - 3.5707i
Алгоритм:
Для действительных матриц функция schur(A) использует следующие модули пакета
EISPACK [2-3]: ortran, orthes и hqr2. Модуль orthes осуществляет приведение матрицы к
верхней форме Хессенберга посредством ортогональных подобных преобразований; модуль
ortran запоминает все преобразования. Модуль hqr2 вычисляет собственные значения
матрицы в верхней форме Хессенберга на основе QR-алгоритма Франсиса - Кублановской.
Для комплексных матриц функция schur(A) использует модули qzhes, qzit, qzval и
qzvec пакета EISPACK.
Сопутствующие функции: HESS, EIG, QZ.
Ссылки:
1. Уилкинсон, Райнш. Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра:
Пер. с англ. М.: Машиностроение, 1976. 390 с.
2. Smith B. T., Boyle J. M., Dongarra J. J., Garbow B. S., Ikebe Y., Klema V., Moler C. B..
Matrix Eigensystem Routines - EISPACK Guide//Lecture Notes in Computer Science. Berlin,
1976. Vol. 6.
3. Garbow B. S., Boyle J. M., Dongarra J. J., Moler C. B.. Matrix Eigensystem Routines EISPACK Guide Extension//Lecture Notes in Computer Science. Berlin, 1977. Vol. 51.
CPLXPAIR
Сортировка комплексносопряженных пар
Синтаксис:
y = cplxpair(x)
y = cplxpair(x, tol)
Описание:
Функция y = cplxpair(x) группирует комплексно сопряженные пары элементов вектора
в порядке возрастания их действительных частей. Внутри пары элемент с отрицательной
мнимой частью всегда является первым. Действительные элементы замыкают комплексно
сопряженные пары. Порог отделения комплексных элементов от действительных по
умолчанию равен imag(x(i))/abs(x(i)) < 100*eps.
Функция y="cplxpair(x," tol) позволяет пользователю указать свой порог отделения
комплексных элементов от действительных.
В результате выполнения этой функции все комплексно сопряженные пары, возможно
вычисленные неточно в пределах погрешности вычисления, выравниваются.
Пример: Произведем сортировку элементов вектора x="exp(2" * pi * i * (0 : 4) / 5),
расположенных на окружности единичного радиуса.
62
Приведение пары матриц к обобщенной форме Шура
QZ
Синтаксис:
[AA, BB, Q, Z, V] = qz(A, B)
Описание:
Многие задачи линейной алгебры - решение матричных уравнений Сильвестра и
Риккати, смешанныx систем дифференциальных и линейных алгебраических уравнений,
приводят к необходимости одновременного приведения пары матриц к форме Шура.
Функция [AA, BB, Q, Z, V] = qz(A, B) возвращает комплексные верхние треугольные
матрицы AA и BB, соответствующие матрицы приведения Q и Z, а также вектор
обобщенных собственных векторов V, так что
Q * A * Z = AA;
Q * B * Z = BB.
Обобщенные собственные значения могут быть найдены исходя из следующего
условия:
A * V * diag(BB) = B * V * diag(AA).
Пример:
Для системы обыкновенных дифференциальных уравнений в неявной форме Коши с
одним входом и одним выходом
задачи вычисления полюсов и нулей соответствующей передаточной функции
определяются следующим образом [1]:
вычисление полюсов
Rr = - Qr;
вычисление нулей
.
Нетрудно видеть, что обе задачи требуют решения обобщенной проблемы
собственных значений.
Описание системы:
Q=
R=
b=
1.0000 0
1.1190 -1.0000
0.1920 1.0000
36.4800 1.5380
C = [ 0.6299 0 ]
Расчет полюсов:
[AA, BB] = qz(R, -Q)
AA =
31.0960
0.1284
d = -0.0723
5.5039 + 2.7975i 24.8121 - 25.3646i
0.0000 + 0.0000i
BB =
5.5158 - 2.8036i
diag(AA)./diag(BB) =
63
-0.6457 + 0.7622i -0.1337 + 0.1378i
0
-1.4245 - 6.0143i
-0.6471 - 0.7638i
-1.4245 + 6.0143i
Расчет нулей:
B = [ -Q
zeros(size(b))
zeros(size(C))
0
]
A = [-R b
C d]
-1.1190 1.0000 0.1284
-1.0000 0
-36.4800 -1.5380 31.0960
-0.1920 -1.0000 0
0.6299
0
0
[AA, BB] = qz(A, B)
AA =
0.0723
BB =
0
0
0
diag(AA)./diag(BB) =
31.0963 -0.7165 -36.5109 0
0.9860
-0.2574
Inf
0.0000 1.0647 0.9229
0
0.0657
0.9964
16.2035
0
0
0
-0.0354
-14.4735
0.0000 0.5119
Алгоритм:
Средством вычисления формы Шура для пары матриц {A, B} является созданный
Моулером и Стьюартом QZ-алгоритм [2-3], который реализован в рамках пакета EISPACK
[4] и использует модули qzhes, qzit, qzval и qzvec.
Сопутствующие функции: EIG.
Ссылки:
1. Потемкин В. Г., Кутузова Г. Н. Особенности исследования дискретно-непрерывных
комплексов на ЭВМ. Учеб. пособие. М.: МИФИ, 1988. 56 с.
2. Икрамов Х. Д. Численное решение матричных уравнений. М.: Наука, 1984. 192 с.
3. Moler C. B., Stewart G. W. An Algorithm for Generalized Matrix Eigenvalue
Problems//SIAM J. Numer. Anal. 1973. N 2. Vol. 10.
4. Garbow B. S., Boyle J. M., Dongarra J. J., Moler C. B. Matrix Eigensystem Routines EISPACK Guide Extension//Lecture Notes in Computer Science. Berlin, 1977. Vol. 51.
POLYEIG
Вычисление собственных значений матричного полинома
Синтаксис:
[R, d] = polyeig(A0, A1, ..., Ap)
Описание:
Функция [R, d] = polyeig(A0, A1, ..., Ap) решает полную проблему собственных
значений для матричного полинома степени p вида
(A0 + l * A1 + ... + p * Ap) * r = 0.
Входными переменными этой функции являются p+1 квадратная матрица A 0, A1, ...,
Ap порядка n. Выходными переменными - матрица собственных векторов R размера n х (n х
p) и вектор собственных значений d длины n х p.
Для некоторых значений p и n функция polyeig становится равносильной другим
функциям системы MATLAB:
p = 0, функция polyeig(A) равносильна функции eig(A);
p = 1, функция polyeig(A, B) равносильна функции eig(A, -B);
n = 1, функция polyeig(a0, a1, ..., ap) для скаляров a0, ..., ap, равносильна функции
roots([ap .. a1 a0]).
Алгоритм:
64
Задача сводится к решению обобщенной проблемы собственных значений для пары
матриц A и B порядка n х p. В частном случае, когда p = 4, эти матрицы имеют вид
A=
;
B=
;
Если одна (но не обе) из матриц A0 или Ap вырожденна, то некоторые из собственных
значений могут оказаться равными нулю или Inf.
Если обе матрицы A0 и Ap вырожденны, то задача оказывается плохо обусловленной.
С точки зрения теории это означает, что решения может не существовать или оно может
быть неединственным. С вычислительной точки зрения решение может оказаться неточным.
В алгоритме сделана попытка выявить эту ситуацию и сформировать
соответствующее предупреждение.
Диагностические сообщения:
Если обе матрицы A0 и Ap близки к вырожденным, выдается сообщение
Warning: Rank deficient generalized eigenvalue problem.
Eigenvalues are not well determined. Results may be inaccurate.
Предупреждение: Неполный ранг для обобщенной проблемы.
Собственные значения плохо обусловлены. Результат может быть неточным.
Замечание:
Функция polyeig включена в систему MATLAB начиная с версии 4.2c.
Сопутствующие функции: EIG, ROOTS, QZ.
SVD
Cингулярное разложение матрицы
Синтаксис:
s = svd(A)
[U, S, V] = svd(A)
[U, S, V] = svd(A, 0)
Описание:
Если A - действительная матрица размера m х n (m >= n), то ее можно представить в
виде [1]:
A = U * S * VT,
где UTU = V * VT = In и S = diag(s1, ...sn).
Такое разложение называется сингулярным разложением матрицы A.
Матрица U сформирована из n ортонормированных собственных векторов,
соответствующих n наибольшим собственным значениям матрицы AAT, а матрица V - из
ортонормированных собственных векторов матрицы ATA. Диагональные элементы матрицы
S - неотрицательные значения квадратных корней из собственных значений матрицы A TA;
они называются сингулярными числами.
Допустим, что s1>= s2 >=... >= sn >= 0. Если ранг матрицы A равен r, то значения sr+1 =
sr+2 = ... = sn = 0.
Существует другое, более экономное сингулярное разложение:
A = Ur * Sr * VrT,
где UrTUr = Vr * VrT = Ir и Sr = diag(s1, ..., sr).
Функция s = svd(A) вычисляет только сингулярные числа матрицы A.
Функция [U, S, V] = svd(A) вычисляет диагональную матрицу S тех же размеров,
которые имеет и матрица A с неотрицательными диагональными элементами в порядке их
убывания, а также унитарные матрицы преобразований U и V.
Функция [U, S, V] = svd(A, 0) выполняет экономное сингулярное разложение.
Пример 1: Рассмотрим прямоугольную матрицу размера 4 х 2.
A=
1 2
65
Полное сингулярное разложение
[U, S, V] = svd(A)
U=
3
4
5
6
7
8
V=
S=
0.1525 0.8226 -0.3945 -0.3800
0.6414 -0.7672
14.2691
0
0.3499 0.4214 0.2428 0.8007
0.7672 0.6414
0
0.6268
0.5474 0.0201 0.6979 -0.4614
0
0
0.7448 -0.3812 -0.5462 0.0407
0
0
Экономное сингулярное разложение
[U, S, V] = svd(A, 0)
U=
V=
S=
0.1525 0.8226
0.6414 -0.7672
14.2691
0
0.3499 0.4214
0.7672 0.6414
0
0.6268
0.5474 0.0201
0.7448 -0.3812
Пример 2:
Рассмотрим матрицу порядка 5, которая в пределах ошибок округления имеет только
нулевые собственные значения [2].
A = chebspec(5)
A = 5.5000 -6.8284
2.0000
-1.1716
0.5000
1.7071
-0.7071
-1.4142
0.7071
-0.2929
-0.5000
1.4142
0.0000
-1.4142
0.5000
0.2929
-0.7071
1.4142
0.7071
-1.7071
1.1716
-2.0000
6.8284
-5.5000
-0.4472
-0.5412
0.2121
0.3588
0.4082
-0.4472
0.2245
-0.2794
-0.7106
0.0000
-0.4472
0.6753
-0.1695
0.5614
-0.4082
-0.4472
0.0819
0.7588
-0.2256
-0.5774
-0.4472
-0.4404
-0.5220
0.0159
0
0
0
-0.5000
[U, S, V] = svd(A^3)
U = 0.5774
S = 155.5378 0
0
32.8634
0
0
0
0
0
0.0000
0
0
0
0
0
0.0000
0
0
0
0
0
0.0000
-0.4082
0.6267
-0.5498
0.2588
-0.5345
0.5774
0.0315
-0.4589
0.4115
0.5345
0.0000
-0.5883
-0.1319
0.5923
V = 0.2673
66
-0.5345
-0.5774
-0.0528
0.3475
0.5073
0.2673
0.4082
0.5074
0.5908
0.3943
semilogy(svd(A3))
plot(eig(A3)
Из анализа графиков следует, что 3 сингулярных числа имеют значения меньше 10 -14
и существенно отличаются от остальных; собственные значения находятся в круге радиусом
0.5 * 10-6, то есть являются кратными. Дефект матрицы A3 равен трем.
В рассматриваемом случае это означает, что имеется 3 клетки Жордана, порядок
которых пока неизвестен. Применяя пакет прикладных программ JORD [3], можно
установить, что в данном случае имеется одна клетка первого и две клетки второго порядка.
Алгоритм:
Функция svd(A) использует модуль svd пакета LINPACK [4].
Пакет программ JORD можно запросить по следующему адресу электронной почты:
[email protected].
Диагностические сообщения:
Если в течение 75 итераций QR-преобразования сингулярные значения не найдены, выдается
сообщение
Solution will not converge.
Решение не сходится.
Ссылки:
1. Уилкинсон, Райнш. Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра:
Пер. с англ. М.: Машиностроение, 1976. 390 с.
2. Higham N. J. The Test Matrix Toolbox for MATLAB (version 3.0)//Numerical Analysis
Report. Manchester. 1995. Vol. 276.
3. Потемкин В. Г. Пакет программ JORD. М.: МИФИ, 1995.
4. Dongarra J. J., Bunch J. R., Moler C. B., Stewart G. W. LINPACK User‟s Guide.
Philadelphia, 1979.
EXPM,
EXPM1,
EXPM2,
EXPM3
Вычисление матричной экспоненты
Синтаксис:
Y = expm(A)
Y = expm2(A)
Y = expm1(A)
Y = expm3(A)
Описание:
Функция Y = expm(A) является встроенной функцией интерпретатора системы
MATLAB и вычисляет функцию eA от матрицы A.
Функция Y = expm1(A) является M-файлом, который полностью соответствует
встроенной функции expm(A). Он вычисляет функцию eA, используя разложение Паде
матрицы A [1].
67
Функция Y = expm2(A) вычисляет функцию eA, используя разложение Тейлора
матрицы A [2]. Этот метод имеет меньшую скорость сходимости по сравнению с
разложением Паде.
Функция Y = expm3(A) вычисляет функцию e A, используя спектральное разложение
матрицы A:
[R, D] = eig(A);
Y = R * diag(exp(diag(D))) / R;,
которое, строго говоря, справедливо только для случая различных собственных
значений.
Замечание:
Функцию матричной экспоненты expm(A) не следует путать с функцией exp(A),
которая вычисляет экспоненту от каждого элемента массива A.
Пример:
Рассмотрим тестовую матрицу порядка n = 5 с дефектом 1, имеющую 5 кратных
собственных значений, равных нулю [3].
norm(Y1 - Y)
norm(Y1 - Y2)
norm(Y1 - Y3)
0
1.0560e-013
0.0065
Как следует из анализа полученных данных, функции expm(A) и expm1(A) дают
совпадающие результаты, функция expm2(A) имеет погрешность в пределах ошибки
округления, однако функция expm3(A) имеет ошибки в третьем знаке, что является
следствием того, что исходная система меет кратные собственные значения.
Используя пакет программ JORD [4], можно выявить точную структуру формы
Жордана матрицы A.
R=
J=
0.2342 0.2342 0.0679 -0.0102 -0.0050
0
1
0
0 0
0.2342 0.1656 0.0093 -0.0210 0.0000
0
0
1
0 0
0.2342 0.0000 -0.0492 0.0000 0.0099
0
0
0
1 0
0.2342 -0.1656 0.0093 0.0210 0.0000
0
0
0
0 1
0.2342 -0.2342 0.0679 0.0102 -0.0050
0
0
0
0 0
В данном случае это 1 клетка Жордана порядка 5, характеризующая простую
однократную вырожденность.
Аналитическая функция f(J), где J - клетка Жордана, соответствующая собственному
значению , может быть вычислена следующим образом [4]:
68
f(J) =
.
J
В рассматриваемом случае матрица e равна
EJ =
1.0000 1.0000 0.5000 0.1667 0.0417
0
1.0000 1.0000 0.5000 0.1667
0
0
1.0000 1.0000 0.5000
0
0
0
1.0000 1.0000
0
0
0
0
1.0000
а матрица Y0 = e = R * e * R может быть вычислена так:
Y0 = R * EJ / R.
Вычисленная матрица Y0 имеет вид
Y0 =
21.0000 -32.4853 21.0000 -15.5147 7.0000
A
J
-1
11.1569 -15.7782 9.2426
-6.5355 2.9142
1.0000
0.0000
0.0000
0.0000
0.0000
-0.1569 0.5355
0.7574
-0.2218 0.0858
0.0000 0.0000 1.0000 0.0000 0.0000
Cчитая данное решение точным, оценим нормы невязок для предыдущих решений.
norm(Y0 - Y)
norm(Y0 - Y1)
norm(Y0 - Y2)
norm(Y0 - Y3)
1.2635e-013
1.2635e-013
6.3827e-014
0.0065
Из анализа следует, что функции expm1(A) и expm2(A) дают результаты с
погрешностью в пределах ошибки округления, а функция expm3(A) имеет ту же
погрешность.
Сопутствующие функции: EXP, FUNM, LOGM, SQRTM.
Ссылки:
1. Golub G. H., Van Loan. Matrix Computation. Oxford. John Hopkins University Press,
1983.
2. Moler C. B., Van Loan. Nineteen Dubious Ways to Compute the Exponential of a
Matrix//SIAM Review, 1979. Vol. 20. P. 801-836.
3. Higham N. J. The Test Matrix Toolbox for MATLAB (version 3.0)//Numerical Analysis
Report. Manchester, 1995. Vol. 276.
4. Потемкин В. Г. Пакет программ JORD. М.: МИФИ, 1995.
LOGM
Вычисление логарифма матрицы
Синтаксис:
Y = logm(A)
[Y, esterr] = logm(A)
Описание:
Функция Y = logm(A) вычисляет функцию log(A), такую, что для большинства матриц
A должно выполняться условие
logm(expm(A)) = A = expm(logm(A)).
69
При таком обращении возможно появление диагностического предупреждения
Warning:
LOGM
appears
inaccurate.
esterr
=
xxx
Предупреждение: функция LOGM вычислена неточно. esterr = xxx
Если матрица A - действительная симметрическая или комплексная эрмитова, то теми же
свойствами обладает и функция logm(A).
Функция [Y, esterr] = logm(A) кроме вычисленной матрицы возвращает оценку
погрешности в виде относительной невязки
norm(expm(Y) - A) / norm(A).
В этом случае диагностическое сообщение не выводится.
Замечание:
Функцию матричной экспоненты logm(A) не следует путать с функцией log(A),
которая вычисляет логарифм от каждого элемента массива A.
Пример:
Рассмотрим матрицу A = expm(chebspec(5)), вычисленную в предыдущем разделе.
A=
21.0000 -32.4853 21.0000 -15.5147 7.0000
11.1569 -15.7782 9.2426
-6.5355 2.9142
1.0000
0.0000
0.0000
0.0000
-0.1569 0.5355
0.7574
-0.2218 0.0858
0.0000
1.0000
0.0000
0.0000
0.0000
0.0000
logm(A)
Warning: LOGM appears inaccurate. esterr = 6.471e-007
Алгоритм:
Функция logm, как и другие функции от матриц, вычисляется с использованием
алгоритма Парлетта [1]. Этот алгоритм использует приведение к форме Шура и может давать
неточные или полностью несостоятельные результаты в случае кратных собственных
значений.
Сопутствующие функции: EXPM, FUNM, SQRTM.
Ссылки:
1. Golub G. H., Van Loan. Matrix Computation. Oxford. John Hopkins University Press,
1983.
SQRTM
Вычисление функции A1/2
Синтаксис:
Y = sqrtm(A)
[Y, esterr] = sqrtm(A)
Описание:
Функция Y = sqrtm(A) вычисляет одну из многих матриц, которые удовлетворяют условию Y
* Y = A.
При таком обращении возможно появление диагностического предупреждения
Warning: SQRTM appears inaccurate. esterr = xxx
Предупреждение: функция SQRTM вычислена неточно. esterr = xxx
Если матрица A - действительная симметрическая или комплексная эрмитова, то теми
же свойствами обладает и функция sqrtm(A).
70
Функция [Y, esterr] = sqrtm(A) кроме вычисленной матрицы возвращает оценку
погрешности в виде относительной невязки
norm(Y * Y - A) / norm(A).
В этом случае диагностическое сообщение не выводится.
Замечание:
Функцию sqrtm(A) не следует путать с функцией sqrt(A), которая вычисляет
положительный квадратный корень от каждого элемента массива.
Примеры:
Рассмотрим матричное представление разностного оператора 4-го порядка.
A=
5 -4 1 0 0
-4
6
-4 1 0
1
-4 6
0
1
-4 1
-4 6 -4
0 0 1 -4 5
Эта матрица симметрическая и положительно определенная; ее единственный положительно
определенный квадратный корень представляет собой разностный оператор 2-го порядка:
Y = sqrtm(A)
Y=
2.0000 -1.0000 0.0000 0.0000 0
-1.0000 2.0000 -1.0000 0.0000 0.0000
0.0000 -1.0000 2.0000 -1.0000 0.0000
0.0000 0.0000 -1.0000 2.0000 -1.0000
0.0000 0.0000 0.0000 -1.0000 2.0000
Матрица вида
X=
7
10
15 22
имеет 4 матрицы, являющиеся ее квадратным корнем.
Две из них следующие:
Y1 =
Y2 =
1.5667 1.7408
1
2
2.6112 4.1779
3
4
Две другие - соответственно -Y1 и -Y2.
Все 4 матрицы могут быть получены на основе спектрального разложения исходной
матрицы
[R, D] = eig(X).
R=
D=
-0.8246 -0.4160
0.1386 0
0.5658 -0.9094
0
S1 = sqrt(D)
28.8614
S2 =
0.3723 0
-0.3723 0
0
0
5.3723
5.3723
71
Y1 = R * S1 / R
Y2 = R * S2 / R
1.5667 1.7408
1.0000 2.0000
2.6112 4.1779
3.0000 4.0000
Функция sqrtm строит решение только для положительных значений квадратных
корней, и результатом является матрица Y1, хотя матрица Y2 представляется более
предпочтительным решением, поскольку она целочисленна.
Алгоритм:
Функция sqrtm является просто аббревиатурой для вызова функции funm(A, „sqrt‟).
Алгоритм, реализующий функцию funm, использует приведение к форме Шура и может
давать неточные или полностью несостоятельные результаты в случае кратных собственных
значений.
Сопутствующие функции: EXPM, FUNM, LOGM.
FUNM
Вычисление произвольных функций от матрицы
Синтаксис:
Y = funm(A, „<имя функции>„)
[Y, esterr] = funm(A, „<имя функции>„)
Описание:
Функция Y = funm(A, „<имя функции>„) позволяет вычислить любую функцию от
матрицы, если она имеет имя, составленное из латинских букв. Это могут быть, например,
все элементарные математические функции.
При таком обращении возможно появление диагностического предупреждения
Warning: Result from FUNM may be inaccurate. esterr = xxx
Предупреждение: Результат вычисления функции FUNM может быть неточным.esterr = xxx
Функция [Y, esterr] = logm(A) кроме вычисленной матрицы возвращает оценку
погрешности в виде относительной невязки norm(expm(Y) - A) / norm(A).
В этом случае диагностическое сообщение не выводится.
Функции funm(A, „sqrt„) и funm(A, „log„) эквивалентны функциям sqrtm(A) и logm(A).
Функции funm(A, „exp„) и expm(A) вычисляют одну и ту же функцию, но различными
способами; применение функции expm предпочтительнее.
Пример:
Следующие последовательности операторов в пределах ошибок округления должны
давать одинаковые результаты.
S = funm(A, „sin‟);
E = expm(i * A);
C = funm(A, „cos‟);
C = real(E);
S = imag(E);
В любом случае они удовлетворяют условию S*S + C*C = I, где I = eye(size(A)).
Алгоритм:
Функция funm вычисляется, функции от матриц с использованием алгоритма
Парлетта [1-2]. Этот алгоритм потенциально неустойчив. Если матрица имеет кратные или
близкие к ним собственные значения, то функция funm дает неточные или полностью
несостоятельные результаты. При разработке алгоритма была сделана попытка выявить эту
ситуацию и дать диагностическое сообщение. Однако выбранный критерий столь
чувствителен, что сообщение может быть выдано даже при точном результате.
Если матрица A - действительная симметрическая или комплексная эрмитова, то ее
форма Шура диагональна и результаты могут обладать очень высокой точностью.
Сопутствующие функции: EXPM, SQRTM, LOGM.
Ссылки:
72
1. Golub G. H., Van Loan. Matrix Computation. John Hopkins University Press, 1983.
2. Moler C. B., Van Loan. Nineteen Dubious Ways to Compute the Exponential of a
Matrix//SIAM Review. Berlin, 1979. Vol. 20. P.801-836.
Вычисление полинома
POLYVAL
Синтаксис:
y = polyval(p, s)
Y = polyval(p, S)
Описание:
Функция y = polyval(p, s), где p = [p1 p2 ... pn pn+1] - вектор коэффициентов полинома
p(x) = p1xn + p2xn-1 + ... + pnx + pn+1, вычисляет значение этого полинома в точке x = s.
Функция Y = polyval(p, S), где S - одномерный или двумерный массив, вычисляет
значение этого полинома для каждого элемента массива, поэтому size(Y) = size(V).
Пример:
Вычислим значение полинома p(x) = 3x2 + 2x +1 в точке x = 5.
p = [3 2 1]
p=3 2 1
y = polyval(p, 5)
y = 86
Сопутствующие функции: POLYDER, POLYVALM.
Вычисление матричного полинома
POLYVALM
Синтаксис:
Y = polyval(p, S)
Описание:
Функция Y = polyval(p, S), где p = [p1 p2 ... pn pn+1] - вектор коэффициентов матричного
полинома
p(X) = p1Xn + p2Xn-1 + ... + pnX + pn+1 ,
вычисляет значение этого полинома для матрицы X = S.
Пример:
Рассмотрим матрицу Паскаля порядка 4, составленную из биномиальных коэффициентов.
S = pascal(4)
S=
1 1 1 1
1
2
3
4
1
3
6
10
1 4 10 20
Вычислим характеристический полином этой матрицы.
p = poly(S)
p = 1.0000 -29.0000 72.0000 -29.0000 1.0000 3 2 1
Сравним результаты применения функций polyvalm и polyval.
polyvalm(p, S)
polyval(p, S)
1.0e-010 *
-0.0027 -0.0094 -0.0222 -0.0428
-0.0094 -0.0326 -0.0749 -0.1423
-0.0222 -0.0749 -0.1713 -0.3233
-0.0428 -0.1423 -0.3233 -0.6091
16.00
16.00
16.00
16.00
16.00
15.00
-140.00
-563.00
16.00 -140.00 -2549.00 -12089.00
16.00 -563.00 -12089.00 -43779.00
73
Матрица polyvalm(p, S) в пределах погрешности - нулевая матрица, что подтверждает
теорему Кэли - Гамильтона о том, что всякая матрица удовлетворяет своему
характеристическому уравнению.
Матрица polyval(p, S) - это массив значений полинома p для каждого элемента
матрицы S.
Сопутствующие функции: POLYDER, POLYVAL.
CONV
Умножение полиномов
Синтаксис:
c = conv(a, b)
Описание:
Если заданы полиномы a и b длины степеней соответственно m и n, то их
произведение - это полином c степени m + n, k-й элемент которого находится по формуле
.
Функция z = conv(x, y) вычисляет произведение двух полиномов a и b.
Пример:
Найдем произведение полиномов x3 + 2x2 + 3x + 4 и 10x2 + 20x + 30.
Для этого сформируем векторы a = [1 2 3 4] и b = [10 20 30] и вычислим
c = conv(a, b)
c = 10 40 100 160 170 120
Сопутствующие функции: DECONV, RESIDUE.
DECONV
Деление полиномов
Синтаксис:
[q, r] = deconv(c, a)
Описание:
Функция [q, r] = deconv(c, a) реализует деление полинома c на полином a; частное от
деления возвращается в виде вектора q, остаток - в виде вектора r, так что выполняется
соотношение c = conv(q, a) + r.
Пример:
Если c = [10 40 100 160 170 120] и a = [1 2 3 4], то деление этих полиномов дает
следующий результат:
[q, r] = deconv(c, a)
q = 10 20 30
r = 0 0 0 0 0 0,
и этот результат соответствует примеру из раздела CONV.
Сопутствующие функции: CONV.
POLYDER
Вычисление производных
Синтаксис:
dp = polyder(p)
dp = polyder(a, b)
[q, p] = polyder(b, a)
Описание:
Функция dp = polyder(p) возвращает производную полинома dp(x) / dx.
Функция dp = polyder(a, b) возвращает производную от произведения полиномов a(x)
* b(x).
Функция [q, p] = polyder(b, a) возвращает производную от отношения полиномов
b(x)/a(x) в виде отношения полиномов q(x)/p(x).
74
Примеры:
Вычислим производную полинома p(x) = 3x2 + 2x +1.
p = [3 2 1]; dp = polyder(p)
dp = 6 2
Вычислим производную произведения полиномов.
a
b
dp = polyder(a, b)
1 3 5 7
3 2 1
15 44 66 68 19
Вычислим производную отношения двух полиномов b(x)/a(x).
b
a
[q, p] = polyder(b, a)
1 3 5
7
Сопутствующие функции: POLYVAL, POLYVALM.
3 2 1
Вычисление корней полинома
ROOTS
Синтаксис:
r = roots(p)
Описание:
Функция r = roots(p), где p = [p1 p2 ... pn pn+1] - вектор-строка коэффициентов полинома
p(x) = p1xn + p2xn-1 + ... + pnx + pn+1, вычисляет вектор-столбец корней этого полинома.
Функция p = poly(r), где r - вектор-столбец корней некоторого полинома, вычисляет
вектор-строку коэффициентов этого полинома.
Пример:
Вычислим корни полинома p(x) = x3 + 3x2 + 5x +7.
p
r = roots(p)
1 3 5 7
p = poly(r)
p = 1.0000 3.0000 5.0000
Сопутствующие функции: POLY.
POLY
-2.1795
-0.4102 + 1.7445i
-0.4102 - 1.7445I
7.0000 + 0.0000i
Вычисление характеристического полинома
Синтаксис:
p = poly(A)
p = poly(r)
Описание:
Функция p = poly(A), где A - матрица порядка n, вычисляет вектор-строку
коэффициентов характеристического полинома p(s) = det(sI - A) = p1sn + p2sn-1 + ... + pns +
pn+1.
Функция p = poly(r), где r - вектор-столбец корней некоторого полинома, вычисляет
вектор-строку коэффициентов этого полинома.
Пример:
Рассмотрим рациональную матрицу А, вычисляя коэффициенты характеристического
полинома, его корни и по ним вновь восстановим характеристический полином:
A=
-5/3
-1
-2/3
-5/6
1/4
11/12
1/6
-17/4
-19/12
75
p = poly(A)
p=1 3 5 7
r = roots(p)
r = -2.1795
-0.4102 + 1.7445i
-0.4102 - 1.7445I
p = poly(r)
p = 1.0000 3.0000 5.0000 7.0000 + 0.0000i
Сопутствующие функции: ROOTS, RESIDUE.
RESIDUE,
RESI2
Разложение на простые дроби
Синтаксис:
[r, p, k] = residue(b, a)
coeff = resi2(u, v, pole, n, k)
[b, a] = residue(r, p, k)
Описание:
Функция p = [r, p, k] = residue(b, a) вычисляет вычеты, полюса и многочлен целой
части отношения двух полиномов b(s) и a(s):
простые корни:
;
входные переменные - векторы b и a определяют коэффициенты полиномов
числителя и знаменателя по убывающим степеням s;
выходные переменные - вектор-столбец r вычетов, вектор-столбец p полюсов и
вектор-строка k целой части дробно-рациональной функции;
количество полюсов определяется по формуле:
n = length(a) - 1 = length(r) = length(p);
вектор коэффициентов многочлена прямой передачи будет пустым, если length(b) <
length(a); в противном случае length(k) = length(b) -length(a) + 1;
кратные корни:
если p(j) = . . . =p(j+m-1) - полюс кратности m, то разложение на простые дроби включает
член [1]
.
Функция rj = resi2(b, a, pole, m, j) вычисляет вектор коэффициентов разложения
дробно-рациональной функции b(s)/a(s) для полюса pole, имеющего кратность m. Параметр j
указывает, какой из коэффициентов rj вычисляется при данном обращении к функции; по
умолчанию j = m; если не указано m, то оно принимается за 1, то есть функция определяет
вычеты для простых корней.
Функция [b, a] = residue(r, p, k) с тремя входными и двумя выходными параметрами
выполняет обратную функцию свертки разложения в дробно-рациональную функцию
отношения двух полиномов b(s) и a(s):
Пример 1:
Рассмотрим дробно-рациональную функцию отношения двух полиномов b(x)/a(x) с
некратными корнями.
;
[r, p, k] = residue(b, a)
76
r=
p=
1.7642
-2.1795
0.6179 + 0.7589i
-0.4102 + 1.7445i
k=
[]
0.6179 - 0.7589i
-0.4102 - 1.7445i
Поскольку порядок числителя меньше порядка знаменателя, целая часть функции
отсутствует.
Пример 2:
Поменяем местами числитель и знаменатель дробно-рациональной функции.
ra =
;
[ra, pa, ka] = residue(a, b)
pa =
ka =
0.5185 - 1.8332i
-0.3333 + 0.4714i
0.3333
0.7778
0.5185 + 1.8332i
В этом случае появляется целая часть функции, определяемая вектором ka.
Пример 3:
Обратимся к случаю кратных корней и рассмотрим следующую
рациональную функцию:
r1 = resi2(b, a1, -1, 3, 1)
;
r2 = resi2(b, a1, -1, 3, 2)
r3 = resi2(b, a, -1, 3)
3
-4
2
дробно-
Пример 4:
Обратимся к результатам примера 1. Зная их, восстановим исходную дробнорациональную функцию, используя следующее обращение:
[b1, a1] = residue(r, p, k)
norm(a - a1) = 4.3739e-015
В пределах погрешности компьютера результаты совпадают.
Ограничения:
В вычислительном плане разложение дробно-рациональной функции на простые
дроби плохо обусловлено. Если полином знаменателя имеет корни, близкие к кратным, то
малые возмущения исходных данных могут привести к большим погрешностям вычисления
полюсов и вычетов. Предпочтительнее использовать описание в пространстве состояний или
представление таких функций в виде нулей и полюсов.
Сопутствующие функции: POLY, ROOTS.
Ссылки:
1. Oppenheim A. V., Schafer R. W. Digital Signal Processing. Prentice-Hall, 1975, P. 56-58.
Анализ и обработка данных
В этой главе описаны функции системы MATLAB, которые предназначены для
анализа и обработки данных, заданных в виде числовых массивов. Наряду с простейшими
функциями вычисления среднего, медианы, коэффициентов корреляции элементов массива
рассмотрены функции вычисления конечных разностей, градиента и аппроксимации
Лапласиана. В отдельный раздел выделены функции аппроксимации и интерполяции.
Представлены функции численного интегрирования, решения задачи Коши для систем ОДУ,
а также минимизации функций одной и нескольких переменных. В состав функций
77
обработки сигналов включены дискретное преобразование Фурье, функции свертки и
фильтрации. В полном объеме функции обработки сигналов оформлены в виде
специализированного пакета программ Signal Processing Toolbox.
Основные операции
SUM, CUMSUM - суммирование элементов массива
PROD, CUMPROD - произведение элементов массива
SORT - сортировка элементов массива по возрастанию
MAX - определение максимальных элементов массива
MIN - определение минимальных элементов массива
MEDIAN - определение срединных значений (медиан) элементов массива
MEAN - определение средних значений элементов массива
STD - определение стандартных отклонений элементов массива
COV - определение ковариационной матрицы элементов массива
CORRCOEF - определение коэффициентов корреляции элементов массива
DIFF - вычисление конечных разностей и приближенное дифференцирование
GRADIENT - конечные разности и приближенное вычислениеградиента функции от
двух переменных
DEL2 - пятиточечная аппроксимация Лапласиана
Аппроксимация и интерполяция данных
POLYFIT - аппроксимация данных полиномом
INTERPFT - аппроксимация периодической функции на основе быстрого
преобразования Фурье
ICUBIC - кубическая интерполяция функции одной переменной
SPLINE, PPVAL, MKPP, UNMKPP - интерполяция функции одной переменной
кубическим сплайном
INTERP1 - одномерная табличная интерполяция
INTERP2 - двумерная табличная интерполяция
GRIDDATA - двумерная табличная интерполяция на неравномерной сетке
Численное интегрирование
TRAPZ - интегрирование методом трапеций
QUAD, QUAD8 - вычисление интегралов методом квадратур
Интегрирование обыкновенных дифференциальных уравнений (ОДУ)
ODE23, ODE45 - решение задачи Коши для систем ОДУ
Вычисление минимумов и нулей функции
FMIN, FORTIONS - минимизация функции одной переменной
FMINS - минимизация функции нескольких переменных
FZERO - нахождение нулей функции одной переменной
FPLOT - построение графиков функции одной переменной
Преобразование Фурье
FFT, IFFT - одномерное дискретное прямое и обратное преобразования Фурье
78
FFT2, IFFT2 - двумерное дискретное прямое и обратное преобразования Фурье
FFTSHIFT - перегруппировка выходных массивов преобразований Фурье
Свертка и фильтрация
CONV, DECONV - свертка одномерных массивов
CONV2 - свертка двумерных массивов
FILTER - дискретная одномерная фильтрация
FILTER2 - дискретная двумерная фильтрация
UNWRAP - корректировка фазовых углов
Суммирование элементов массива
SUM, CUMSUM
Синтаксис:
sx = sum(X)
csx = cumsum(X)
Описание:
Функция sx = sum(X) в случае одномерного массива возвращает сумму элементов
массива; в случае двумерного массива - это вектор-строка, содержащая суммы элементов
каждого столбца.
Функция csx = cumsum(X), кроме того, возвращает все промежуточные результаты
суммирования.
Пример:
Рассмотрим массив M = magic(3): M = magic(3)
M= 8 1 6
3
5 7
4
9 2
cumsum(M)
sum(M)
8 1 6
11 6 13
15 15 15
15 15 15
Сопутствующие функции: CUMPROD, PROD.
PROD,
CUMPROD
Произведение элементов массива
Синтаксис:
px = prod(X)
cpx = cumprod(X)
Описание:
Функция px = prod(X) в случае одномерного массива возвращает произведение
элементов массива; в случае двумерного массива - это вектор-строка, содержащая
произведения элементов каждого столбца.
Функция cpx = cumprod(X), кроме того, возвращает все промежуточные результаты.
Пример:
Рассмотрим массив M = magic(3).
M= 8 1 6
3
5 7
4
9 2
79
cumprod(M)
prod(M)
8 1 6
24 5 84
96 45 84
96 45 84
Сопутствующие функции: CUMSUM, SUM.
SORT
Сортировка элементов массива по возрастанию
Синтаксис:
Y = sort(X)
[Y, I] = sort(X)
Описание:
Функция Y = sort(X) в случае одномерного массива упорядочивает элементы массива
по возрастанию; в случае двумерного массива происходит упорядочение элементов каждого
столбца.
Функция [Y, I] = sort(X) кроме массива упорядоченных элементов по столбцам
возвращает массив индексов, позволяющих восстановить структуру исходного массива.
Такое восстановление можно реализовать с помощью следующего цикла:
for j = 1:3
X(I(:, j), j) = Y(:, j);
end
Если анализируемый массив содержит комплексные элементы, то сортировка
выполняется для массива abs(X).
Пример:
Рассмотрим массив M = magic(3).
M= 8 1 6
3
5 7
4
9 2
[Y, I] = sort(M)
Y= 3 1 2
I= 2
1 3
4 5 6
3
2 1
8 9 7
1 3 2
Сопутствующие функции: MIN, MAX, MEAN, MEDIAN, FIND.
MAX
Определение максимальных элементов массива
Синтаксис:
Y = max(X)
[Y, I] = max(X)
C = max(A, B)
Описание:
Функция Y= max(X) в случае одномерного массива возвращает наибольший элемент;
в случае двумерного массива - это вектор-строка, содержащая максимальные элементы
каждого столбца. Таким образом, max(max(X)) - это наибольший элемент массива.
Функция [Y, I] = max(X) кроме самих максимальных элементов возвращает векторстроку индексов этих элементов в данном столбце.
Функция C = max(A, B) возвращает массив C тех же размеров, какие имеют массивы
A и B, каждый элемент которого есть максимальный из соответствующих элементов этих
массивов.
80
Если анализируемый массив содержит комплексные элементы, то максимальные
элементы определяются из условия max(abs(X)). Если массив содержит один или несколько
элементов типа NaN, то результатом операции будет NaN.
Пример:
Рассмотрим массив M = magic(3).
M= 8 1 6
3
5 7
4
9 2
y = max(M)
[y, I] = max(M)
max(max(M))
y=8 9 7
y=8 9 7
I=1 3 2
9
Сопутствующие функции: MIN, SORT.
Определение минимальных элементов массива
MIN
Синтаксис:
Y = min(X)
[Y, I] = min(X)
C = min(A, B)
Описание:
Функция Y = min(X) в случае одномерного массива возвращает наименьший элемент;
в случае двумерного массива - это вектор-строка, содержащая минимальные элементы
каждого столбца. Таким образом, min(min(X)) - это наименьший элемент массива.
Функция [Y, I] = min(X) кроме самих минимальных элементов возвращает векторстроку индексов этих элементов в данном столбце.
Функция C = min(A, B) возвращает массив C тех же размеров, какие имеют массивы A
и B, каждый элемент которого есть минимальный из соответствующих элементов этих
массивов.
Если анализируемый массив содержит комплексные элементы, то минимальные
элементы определяются из условия min(abs(X)). Если массив содержит один или несколько
элементов типа NaN, то результатом операции min будет NaN.
Пример:
Рассмотрим массив M = magic(3).
M= 8 1 6
3
5 7
4
9 2
y = min(M)
[y, I] = min(M)
min(min(M))
y=3 1 2
y=3 1 2
I=2 1 3
1
Сопутствующие функции: MAX, SORT.
Определение срединных значений (медиан) элементов
MEDIAN
массива
Синтаксис:
mdx = median(X)
Описание:
Функция mdx = median(X) в случае одномерного массива возвращает значение
срединного элемента; в случае двумерного массива - это вектор-строка, содержащая
значение срединных элементов каждого столбца. Таким образом, median(median(X)) - это
срединный элемент (медиана) массива, что совпадает со значением median(X(:)).
81
Пример:
Рассмотрим массив M = magic(4).
M = 16 2
3
13
5
11 10 8
9
7
4
14 15 1
mdx = median(M)
6
12
median(median(M))
mdx = 7 9 8 10
ans = 8.5000
Сопутствующие функции: MEAN, STD, COV, CORRCOEF.
MEAN
Определение средних значений элементов массива
Синтаксис:
mx = mean(X)
Описание:
Функция mx = mean(X) в случае одномерного массива возвращает арифметическое
среднее элементов массива; в случае двумерного массива - это вектор-строка, содержащая
арифметическое среднее элементов каждого столбца. Таким образом, mean(mean(X)) - это
арифметическое среднее (математическое ожидание) элементов массива, что совпадает со
значением mean(X(:)).
Пример:
Рассмотрим массив M = magic(4).
M = 16 2 3 13
5
11 10 8
9
7
4
14 15 1
6
12
mx = mean(M)
mean(mean(M))
mx = 8.5000 8.5000 8.5000 8.5000
ans = 8.5000
Сопутствующие функции: MEDIAN, STD, COV, CORRCOEF.
STD
Определение стандартных отклонений элементов массива
Синтаксис:
sx = std(X)
Описание:
Функция sx = std(X) в случае одномерного массива возвращает стандартное
отклонение элементов массива; в случае двумерного массива - это вектор-строка,
содержащая стандартное отклонение элементов каждого столбца.
Пример:
Рассмотрим массив M = magic(4).
M = 16 2 3 13
5
11 10 8
9
7
4
14 15 1
6
12
sx = std(M)
sx = 5.4467 5.1962 5.1962 5.4467
Сопутствующие функции: MEDIAN, MEAN, COV, CORRCOEF.
82
Определение ковариационной матрицы элементов массива
COV
Синтаксис:
C = cov(X)
C = cov(X, y)
Описание:
Функция C = cov(X) в случае одномерного массива возвращает дисперсию
элементов массива; в случае двумерного массива, когда каждый столбец рассматривается как
переменная, а каждая строка - как наблюдение, cov(X) - это матрица ковариаций,
diag(cov(X)) - вектор дисперсий, sqrt(diag(cov(X))) - вектор стандартных отклонений для
каждого столбца.
Функция C = cov(X, y), где массивы X и Y имеют одинаковое количество строк,
равносильна функции cov([X Y]).
Пример: Рассмотрим массив M = magic(4)/norm(magic(4)).
M=
0.4706 0.0588 0.0882 0.3824
0.1471
0.3235 0.2941
0.2353
0.2647
0.2059 0.1765
0.3529
0.1176
0.4118 0.4412
0.0294
C = cov(X)
0.0257
diag(cov(X)) sqrt(diag(cov(X)))
0.0205
0.0239 0.0222
0.0234 0.0228
0.0239
0.0222
0.0257
0.1602
0.0234
0.1528
0.0228 0.0234
0.0222
0.0239
0.0234
0.1528
0.0257
0.1602
0.0205
0.0257
0.0222 0.0239
Алгоритм: Вычисление матрицы ковариаций реализуется следующим алгоритмом:
[n, p] = size(X);
X = X - ones(n, 1) * mean(X);
C = X‟ * X/(n - 1);
Сопутствующие функции: CORRCOEF, MEAN, STD.
CORRCOEF
Определение коэффициентов корреляции элементов массива
Синтаксис:
S = corrcoef(X)
S = corrcoef(X, Y)
Описание:
Функция S = corrcoef(X) возвращает матрицу коэффициентов корреляции для
двумерного массива, когда каждый столбец рассматривается как переменная, а каждая
строка - как наблюдение.
Элементы матрицы S = corrcoef(X) связаны с элементами матрицы ковариаций C =
cov(X) следующим соотношением:
.
Функция S = corrcoef(X, Y), где массивы X и Y имеют одинаковое количество строк,
равносильна функции corrcoef([X Y]).
Пример:
83
Рассмотрим массив M = magic(4)/norm(magic(4)).
M=
0.4706 0.0588 0.0882
S = corrcoef(M)
1.0000
0.3824
0.1471
0.3235 0.2941
0.2353
0.2647
0.2059 0.1765
0.3529
0.1176
0.4118 0.4412
0.0294
C = cov(X)
0.7978 0.0257
0.0205
0.9776 0.9069
0.0239 0.0222
1.0000 0.9753
0.0234 0.0228
0.9776
0.9069 0.0239
0.0222
0.9753 1.0000
0.0228 0.0234
0.9069
0.9776 0.0222
0.0239
0.7978
DIFF
1.0000 0.0205
0.0257
0.9069 0.9776
0.0222 0.0239
Сопутствующие функции: COV, MEAN, STD.
Вычисление конечных разностей и приближенное
дифференцирование
Синтаксис:
y = diff(x)
y = diff(x, n)
Описание:
Функция y = diff(x) вычисляет конечные разности. Если x - одномерный массив вида x
= [x(1) x(2) ... x(n)], то diff(x) - это вектор разностей соседних элементов diff(x) = [x(2) - x(1)
x(3) - x(2) ... x(n) - x(n-1)]. Количество элементов вектора x на единицу меньше количества
элементов вектора diff(x). Если X - двумерный массив, то берутся разности столбцов diff(X)
= X(2:m, :) - X(1:m-1, :).
Функция y = diff(x, n) вычисляет конечные разности порядка n, удовлетворяющие
рекуррентному соотношению diff(x, n) = diff(x, n-1).
Аппроксимацией производной n порядка является отношение diff(y, n)./diff(x, n).
При наличии специализированного пакета Symbolic Math Toolbox [1] возможно
реализовать точное дифференцирование в символьном виде, используя следующие функции
пакета:
diff(S) дифференцирует символьное выражение S по свободной переменной;
diff(S, „v‟) дифференцирует символьное выражение S по v;
diff(S, n) и diff(S, „v‟, n) дифференцирует n раз символьное выражение S;
diff без аргументов дифференцирует предшествующее выражение.
Сопутствующие функции: GRADIENT, DEL2.
Ссылки:
1. Symbolic Mathematics Toolbox. User‟s Guide. Natick: The MathWorks, Inc., 1994.
Конечные разности и приближенное вычисление
GRADIENT
градиента функции от двух переменных
Синтаксис:
[px, py] = gradient(F)
[px, py] = gradient(F, dx, dy)
Описание:
84
Функция [px, py] = gradient(F) вычисляет конечные разности функции F(x, y),
заданной на двумерной сетке и представляющей собой массив чисел.
Функция [px, py] = gradient(F, dx, dy) возвращает численные значения производных
функции F в виде массивов px = dF/dx и py = dF/dy, где dx и dy могут быть скалярами,
равными шагам разбиения сетки по осям x и y, либо векторами координат узлов сетки при
разбиении с переменным шагом.
Пример:
Рассмотрим расчет и построение поля направлений для функции
F=
с использованием функции gradient.
[x, y] = meshgrid(-2:.2:2, -2:.2:2);
z = x .* exp(-x.^2 - y.^2);
[px, py] = gradient(z, .2, .2);
contour(z), hold on, quiver(px, py), hold off
Сопутствующие функции: DIFF, DEL2, QUIVER, CONTOUR.
DEL2
Пятиточечная аппроксимация Лапласиана
Синтаксис:
V = del2(U)
Описание:
Функция V = del2(U) возвращает массив того же размера, каждый элемент которого
равен разности среднего значения соседних элементов и элемента рассматриваемого узла.
Узлы сетки во внутренней области имеют четырех соседей, а на границе и в углах - только
трех или двух соседей.
Если массив U рассматривать как функцию U(x, y), вычисленную в точках квадратной
сетки, то 4del2(U) является конечно-разностной аппроксимацией дифферренциального
оператора Лапласа, примененного к функции U.
.
Пример:
Функция u(x, y) = x2 + y2 имеет лапласиан, равный 2u = 4, в чем можно убедиться,
взглянув на графики этих функций.
[x, y] = meshgrid(-4:4, -3:3);
U = x.* x + y.* y,
U=
25 18 13 10 9 10 13 18 25
20 13 8
5
4
5
8
13 20
17 10 5
2
1
2
5
10 17
16 9
4
1
0
1
4
9
17 10 5
2
1
2
5
10 17
16
85
20 13 8
25 `8
5
4
13 10 9
5
8
13 20
10 13 18 25
V = 4 * del2(U),
V=
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
surfl(U), surfl(V)
Сопутствующие функции: GRADIENT, DIFF.
Аппроксимация данных полиномом
POLYFIT
Синтаксис:
p = polyfit(x, y, n)
Описание:
Функция p = polyfit(x, y, n) находит коэффициенты полинома p(x) степени n, который
аппроксимирует функцию y(x) в смысле метода наименьших квадратов. Выходом является
строка p длины n +1, содержащая коэффициенты аппроксимирующего полинома.
Пример:
Рассмотрим аппроксимацию функции ошибки erf(x), которая является ограниченной
сверху функцией, в то время как аппроксимирующие полиномы неограниченны, что
приводит к ошибкам аппроксимации.
x = (0:0.1:2.5)';
y = erf(x);
вычислим коэффициенты аппроксимирующего полинома степени 6:
p = polyfit(x, y, 6)
p = 0.0084 -0.0983 0.4217 -0.7435 0.1471 1.1064 0.0004
вычислим значения полинома в точках сетки:
f = polyval(p, x);
сформируем следующую таблицу данных:
table = [x y f y-f]
table =
0
0
0.0004 -0.0004 2.1000 0.9970 0.9969 0.0001
0.1000 0.1125 0.1119 0.0006
2.2000 0.9981 0.9982 -0.0001
0.2000 0.2227 0.2223 0.0004
2.3000 0.9989 0.9991 -0.0003
86
0.3000 0.3286 0.3287 -0.0001 2.4000 0.9993 0.9995 -0.0002
0.4000 0.4284 0.4288 -0.0004 2.5000 0.9996 0.9994 0.0002
....
....
....
....
Из таблицы видно, что на отрезке [0 2.5] точность аппроксимации находится в
пределах 3-4 знаков; построим графики функции и аппроксимирующего полинома на отрезке
[0 5].
x = (0:0.1:5)';
y = erf(x);
f = polyval(p, x);
plot(x, y, 'ob', x, f, '-g'), » axis([0 5 0 2])
Как следует из анализа графика, аппроксимация вне отрезка [0 2.5] расходится.
Алгоритм:
Аппроксимация полиномом связана с вычислением матрицы Вандермонда V,
элементами которой являются базисные функции
,
и последующим решением переопределенной системы линейных уравнений
Vp = y.
Пользователь может самостоятельно внести изменения в М-файл polyfit, чтобы
применить другие базисные функции.
Сопутствующие функции: POLY, POLYVAL, VANDER.
Аппроксимация периодической функции на основе
INTERPFT
быстрого преобразования Фурье
Синтаксис:
yp = interpft(y, n)
Описание:
Функция yp = interpft(y, n) возвращает одномерный массив чисел, который является
периодической функцией, определенной в n точках и аппроксимирующей одномерный
массив y. Если length(x) = m, а интервал дискретности dx, то интервал дискретности для y
определяется по формуле dy = dx * m/n, причем n всегда превышает m.
Пример:
Рассмотрим аппроксимацию функции y = sin(x), которая задана 11 точками на
интервале [0 10].
x = 0:10; y = sin(x);
xp = 0:0.25:10;
yp = interpft(y, 41);
xt = 0:0.01:10; yt = sin(xt);
plot(xt, yt, 'r'), hold on, plot(x, y, 'ob', xp, yp)
87
На графике построена точная функция y = sin(x) с указанием точек съема данных и ее
аппроксимация в 41 точке. Как видно из графика, аппроксимация вне интервала [0 1.5] имеет
нарастающую погрешность.
Сопутствующие функции: ICUBIC, SPLINE, INTERP1.
ICUBIC
Кубическая интерполяция функции одной переменной
Синтаксис:
yi = icubic(y, xi)
yi = icubic(x, y, xi)
Описание:
Функция yi = icubic(y, xi) интерполирует значения функции y в точках xi внутри
области определения функции, используя кубические полиномы. Если Y - двумерный
массив, то интерполирующая кривая строится для каждого столбца. Если указано значение xi
вне области определения функции, то результатом будет NaN.
Функция yi = icubic(x, y, xi) позволяет использовать более мелкую сетку xi при
условии, что аргумент x изменяется монотонно и сетка равномерна.
Пример:
Зададим синусоиду всего 10 точками и проведем интерполяцию, используя мелкую
сетку.
x = 0:10; y = sin(x);
xi = 0:.25:10;
yi = icubic(x, y, xi);
plot(x, y, 'o', xi, yi, „g‟), grid.
Сопутствующие функции: POLYFIT, SPLINE.
Интерполяция функции одной переменной
SPLINE, PPVAL,
кубическим сплайном
88
MKPP, UNMKPP
Синтаксис:
yi = spline(x, y, xi)
v = ppval(pp, xx)
pp = spline(x, y)
[breaks, coefs, l, k] = unmkpp(pp)
pp = mkpp(breaks, coefs)
Описание:
Функция yi = spline(x, y, xi) интерполирует значения функции y в точках xi внутри
области определения функции, используя кубические сплайны [1].
Функция pp = spline(x, y) возвращает pp-форму сплайна, используемую в М-файлах
ppval, mkpp, unmkpp.
Функция v = ppval(pp, xx) вычисляет значение кусочно-гладкого полинома pp для
значений аргумента xx.
Функция [breaks, coefs, l, k] = unmkpp(pp) возвращает характеристики кусочно
гладкого полинома pp:
breaks - вектор разбиения аргумента;
coefs - коэффициенты кубических сплайнов;
l = length(breaks) - 1;
k = length(coefs)/l.
Функция pp = mkpp(breaks, coefs) формирует кусочно-гладкий полином pp по его
характеристикам.
Пример:
Зададим синусоиду всего 10 точками и проведем интерполяцию кубическими
сплайнами, используя мелкую сетку.
x = 0:10; y = sin(x);
xi = 0:.25:10;
yi = spline(x, y, xi);
plot(x, y, 'o', xi, yi, „g‟), grid
Определим pp-форму сплайна.
pp = spline(x, y);
[breaks, coeffs, l, k] = unmkpp(pp)
breaks = 0 1 2 3 4 5 6 7 8 9 10
coeffs =
-0.0419 -0.2612 1.1446 0
-0.0419 -0.3868 0.4965 0.8415
0.1469 -0.5124 -0.4027 0.9093
89
0.1603 -0.0716 -0.9867 0.1411
0.0372 0.4095 -0.6488 -0.7568
-0.1234 0.5211 0.2818 -0.9589
-0.1684 0.1509 0.9538 -0.2794
-0.0640 -0.3542 0.7506 0.6570
0.1190 -0.5463 -0.1499 0.9894
0.1190 -0.1894 -0.8856 0.4121
l = 10
k= 4
Вычислим pp-форму в узловых точках сетки.
v = ppval(pp,x)
v=
0 0.8415 0.9093 0.1411 -0.7568 -0.9589 -0.2794 0.6570 0.9894 0.4121
-0.5440
Алгоритм:
Интерполяция сплайнами использует вспомогательные функции ppval, mkpp, unmkpp,
которые образуют небольшой пакет для работы с кусочно-гладкими полиномами.
Существенно большие возможности для работы со сплайнами предо-ставляет
пользователю специализированный пакет Spline Toolbox [2].
Сопутствующие функции: ICUBIC, INTERP1, POLYFIT, Spline Toolbox.
Ссылки:
1. Carl de Boor. A Practical Guide to Splines. Berlin, 1978.
2. Spline Toolbox. User‟s Guide. Natick: The MathWorks, Inc., 1992.
INTERP1
Одномерная табличная интерполяция
Синтаксис:
yi = interp1(x, y, xi)
yi = interp1(x, y, xi, „<метод>„)
Описание:
Функция yi = interp1(x, y, xi) строит интерполирующую кривую для одномерного
массива y, заданного на сетке x; выходной массив yi может быть определен на более мелкой
сетке xi. Если Y - двумерный массив, то интерполирующая кривая строится для каждого
столбца. По умолчанию реализована линейная интерполяция.
Функция yi = interp1(x, y, xi, „<метод>„) позволяет задать метод интерполяции:
„linear‟ линейная
„cubic‟ кубическая
„spline‟ кубические сплайны
Принято, что аргумент x изменяется монотонно; кроме того, для кубической
интерполяции предполагается, что сетка по x равномерна.
Пример:
Зададим синусоиду всего 10 точками и проведем интерполяцию, используя мелкую
сетку.
x = 0:10; y = sin(x);
xi = 0:.25:10;
yi = interp1(x, y, xi);
plot(x, y, 'o', xi, yi, „g‟), hold on
yi = interp1(x, y, xi, „spline‟ );
plot(x, y, 'ob', xi, yi, „m‟), grid, hold off
90
Алгоритм:
Методы линейной и кубической интерполяции реализуются довольно просто; что же
касается интерполяции сплайнами, то в этом случае используются вспомогательные функции
ppval, mkpp, unmkpp, которые образуют небольшой пакет для работы с кусочно-гладкими
полиномами. Существенно большие возможности для решения проблем интерполяции и
аппроксимации предоставляет специализированный пакет Spline Toolbox [1].
Сопутствующие функции: INTERPFT, INTERP2, GRIDDATA.
Ссылки:
1. Spline Toolbox. User‟s Guide. Natick: The MathWorks, Inc., 1992.
INTERP2
Двумерная табличная интерполяция
Синтаксис:
ZI = interp2(X, Y, XI, YI)
ZI = interp2(X, Y, XI, YI, „<метод>„)
Описание:
Функция ZI = interp2(X, Y, XI, YI) интерполирует данные, определяющие некоторую
поверхность на двумерной сетке {X, Y}; выходной массив ZI может быть определен на более
мелкой сетке {XI, YI}. По умолчанию реализована линейная интерполяция.
Функция ZI = interp2(X, Y, XI, YI, „<метод>„) позволяет задать метод интерполяции:
„linear‟
линейная
„cubic‟
кубическая
Принято, что аргументы X и Y изменяются монотонно; кроме того, для кубической
интерполяции предполагается, что сетка {X, Y} равномерна.
Пример:
Проведем интерполяцию функции peaks, используя мелкую сетку.
[X, Y] = meshgrid(-3:0.25:3);
Z = peaks(X, Y);
[XI, YI] = meshgrid(-3:0.125:3);
ZI = interp2(X, Y, Z, XI, YI);
mesh(X, Y, Z), hold on, mesh(XI, YI, ZI+15), hold off
91
Сопутствующие функции: INTERPFT, INTERP1, GRIDDATA.
GRIDDATA
Двумерная интерполяция на неравномерной сетке
Синтаксис:
ZI = griddata(x, y, z, XI, YI)
[XI, YI, ZI] = griddata(x, y, z, XI, YI)
Описание:
Функция ZI = griddata(x, y, z, XI, YI) возвращает массив ZI, который определен на
новой сетке {XI, YI} в результате интерполяции исходной функции z, заданной на
неравномерной сетке {x, y}.
Функция [XI, YI, ZI] = griddata(x, y, z, XI, YI) кроме массива ZI возвращает массивы
XI, YI, упорядоченные по аналогии с функцией meshgrid.
Пример:
Определим функцию на сетке, заданной 100 точками, выбранными случайно на
отрезке [-2 2].
x = rand(100, 1) * 4 - 2;
y = rand(100, 1) * 4 - 2;
z = x.*exp(-x.^2 - y.^2);
Векторы x, y, z определяют 100 случайных точек на поверхности функции ZI,
которую зададим на следующей равномерной сетке:
ti = -2:0.25:2;
[XI, YI] = meshgrid(ti, ti);
ZI = griddata(x, y, z, XI, YI);
Построим поверхность функции, полученной в результате интерполяции на
неравномерной случайной сетке.
mesh(XI, YI, ZI), hold on, plot3(x, y, z, 'or')
Сопутствующие функции: INTERP1, INTERP2.
TRAPZ
Интегрирование методом трапеций
Синтаксис:
I = trapz(x, y)
I = trapz(y)
Описание:
Функция I = trapz(x, y) вычисляет интеграл от функции y по переменной x, используя
метод трапеций. Аргументы x и y могут быть одномерными массивами одинакового размера,
либо массив Y может быть двумерным, но тогда должно выполняться условие size(Y, 1) =
length(x). В последнем случае вычисляется интеграл для каждого столбца.
Функция I = trapz(y) вычисляет интеграл, предполагая, что шаг интегрирования
постоянен и равен единице; в случае, когда шаг h отличен от единице, но постоянен,
достаточно вычисленный интеграл умножить на h.
Примеры:
Вычислим интеграл
92
I=
.
Его точное значение равно двум.
Выберем равномерную сетку
x = 0:pi/100:pi;
y = sin(x);
тогда оба интеграла
I = trapz(x, y) и I = pi/100*trapz(y)
дают одинаковый результат:
I = 1.9998.
Образуем неравномерную сетку, используя генератор случайных чисел.
x = sort(rand(1,101)*pi); y = sin(x);
I = trapz(x, y)
I = 1.9987.
Результат еще менее точен, поскольку максимальный из шагов max(diff(x)) равен
0.1810
Сопутствующие функции: SUM, CUMSUM, QUAD, QUAD8.
QUAD, QUAD8
Вычисление интегралов методом квадратур
Синтаксис:
[I, cnt] = quad(„<имя функции>„, a, b)
[I, cnt] = quad(„<имя функции>„, a, b, tol)
[I, cnt] = quad(„<имя функции>„, a, b, tol, trace)
[I, cnt] = quad8(„<имя функции>„, a, b)
[I, cnt] = quad8(„<имя функции>„, a, b, tol)
[I, cnt] = quad8(„<имя функции>„, a, b, tol, trace)
Описание:
Квадратура - это численный метод вычисления площади под графиком функции, то
есть вычисление определенного интеграла вида
I=
.
Функции quad и quad8 используют разные квадратурные формулы.
Функции [I, cnt] = quad(„<имя функции>„, a, b) и [I, cnt] = quad8(„<имя функции>„, a,
b) вычисляют интеграл от заданной функции; последняя может быть как встроенной
функцией, так и М-файлом. Переменная cnt содержит информацию о том, сколько раз в
процессе интегрирования вычислялась подынтегральная функция.
Функции [I, cnt] = quad(„<имя функции>„, a, b, tol) и [I, cnt] = quad8(„<имя функции>„,
a, b, tol) вычисляют интеграл с заданной относительной погрешностью tol. По умолчанию tol
= 1e-3.
Функции [I, cnt] = quad(„<имя функции>„, a, b, tol, trace) и [I, cnt] = quad8(„<имя
функции>„, a, b, tol, trace), когда аргумент trace не равен нулю, строят график, показывающий
ход вычисления интеграла.
Примеры:
Вычислим интеграл
I=
Его точное значение равно двум.
[I, cnt] = quad('sin', 0, pi)
I = 2.0000
.
[I, cnt] = quad('sin', 0, pi, 1e-4, 1)
I = 2.0000
93
cnt = 17
cnt = 33
Как следует из анализа полученных данных, при увеличении точности вычисления на
порядок почти вдвое увеличивается трудоемкость расчетов. График с результатами
промежуточных расчетов показан на рисунке.
Алгоритм:
Функция quad использует квадратурные формулы Ньютона - Котеса 2-го порядка
(правило Симпсона), а функция quad8 - формулы 8-го порядка [1-2]. При наличии в
подынтегральной функции особенностей типа
I=
предпочтительнее использовать процедуру quad8.
Диагностические сообщения:
Функции quad и quad8 используют рекурсивный вызов. Для того чтобы предотвратить
бесконечную рекурсию при вычислении сингулярных интегралов, глубина рекурсии
ограничена уровнем 10. При достижении этого ограничения выдается сообщение
Recursion level limit reached in quad. Singularity likely.
В процедуре quad достигнута предельная глубина рекурсии. Функция, возможно,
сингулярна.
Ограничения:
Функции quad и quad8 не позволяют интегрировать функции с особенностями типа
I=
.
В этом случае рекомендуется выделить такие члены и проинтегрировать их
аналитически, а к остатку применить процедуры quad и quad8.
Сопутствующие функции: SUM, CUMSUM, TRAPZ.
Ссылки:
1. Forsythe G. E., Malcolm M. A., Moler C. B. Computer Methods for Mathematical
Computations. Prentice-Hall, 1977.
2. Справочник по специальным функциям: Пер. с англ./Под ред. М. Абрамовица и И.
Стиган. М.: Наука, 1979.
ODE23, ODE45
Решение задачи Коши для систем ОДУ
Синтаксис:
[t, X] = ode23(„<имя функции>„, t0, tf, x0)
[t, X] = ode23(„<имя функции>„, t0, tf, x0, tol, trace)
[t, X] = ode45(„<имя функции>„, t0, tf, x0)
[t, X] = ode45(„<имя функции>„, t0, tf, x0, tol, trace)
Описание:
94
Функции ode23 и ode45 предназначены для численного интегрирования систем ОДУ.
Они применимы как для решения простых дифференциальных уравнений, так и для
моделирования сложных динамических систем.
Любая система нелинейных ОДУ может быть представлена как система
дифференциальных уравнений 1-го порядка в явной форме Коши:
,
где x - вектор состояния;
t - время;
f - нелинейная вектор-функция от переменных x, t.
Функции [t, X] = ode23(„<имя функции>„, t0, tf, x0, tol, trace) и [t, X] = = ode45(„<имя
функции>„, t0, tf, x0, tol, trace) интегрируют системы ОДУ, используя формулы Рунге Кутты соответственно 2-го и 3-го или 4-го и 5-го порядка.
Эти функции имеют следующие параметры:
Входные параметры:
„<имя функции>„ - строковая переменная, являющаяся именем М-файла, в котором
вычисляются правые части системы ОДУ;
t0 - начальное значение времени; tfinal - конечное значение времени;
x0 - вектор начальных условий;
tol - задаваемая точность; по умолчанию для ode23 tol = 1.e-3, для ode45 tol = 1.e-6);
trace - флаг, регулирующий вывод промежуточных результатов; по умолчанию равен нулю,
что подавляет вывод промежуточных результатов;
Выходные параметры:
t - текущее время;
X - двумерный массив, где каждый столбец соответствует одной переменной.
Примеры:
Рассмотрим дифференциальное уравнение 2-го порядка, известное как уравнение Ван
дер Поля,
.
Это уравнение может быть представлено в виде системы ОДУ в явной форме Коши:
Первый шаг процедуры интегрирования - это создание М-файла для вычисления
правых частей ОДУ; присвоим этому файлу имя vdpol.
function xdot = vdpol(t, x)
xdot = [x(2); x(2) .* (1 - x(1).^2) - x(1)];
Чтобы проинтегрировать систему ОДУ, определяемых функцией vdpol в интервале
времени 0 <= t <= 20, вызовем функцию ode23:
t0 = 0; tf = 20;
x0 = [0 0.25]'; %Начальные условия
[t, X] = ode23('vdpol', t0, tf, x0);
plot(t, X), grid, hold on
gtext('x1'), gtext('x2')
95
Рассмотрим простейший из известных примеров странного аттрактора - аттрактор
Ресслера [1]:
где параметры {a, b, c} имеют значения {0.2 0.2 5.7}, а начальное условие задается
следующим образом: x0 = [-0.7 -0.7 1].
Для того чтобы проинтегрировать эту систему в интервале времени 0<= t<= 20,
вызовем функцию ode45:
t0 = 0; tf = 20;
x0 = [-0.7 -0.7 1]‟.%Начальные условия
[t, X] = ode45('ressler', t0, tf, x0);
comet3(X(:, 1), X(:, 2), X(:, 3)).
Алгоритм:
Функции ode23 и ode45 реализуют методы Рунге - Кутты с автоматическим выбором
шага, описанные в работе [2]. Такие алгоритмы используют тем большее количество шагов,
чем медленнее изменяется функция. Поскольку функция ode45 использует формулы более
высокого порядка, обычно требуется меньше шагов интегрирования и результат достигается
быстрее. Для сглаживания полученных процессов можно использовать функцию interp1.
Диагностические сообщения:
Если функции ode23 и ode45 не могут выполнить интегрирование во всем заданном
диапазоне времени выдается сообщение
Singularity likely.
Система сингулярна.
В состав версии 4.0 помимо функций ode23 и ode45 включена также функция ode23p,
которая позволяет в процессе интегрирования строить в трехмерном пространстве орбиты
движения для трех первых переменных состояния. Перед обращением к этой функции
пользователь должен задать диапазоны изменения этих переменных, чтобы определить
размер графика, используя следующие операторы:
axis([x1min x1max x2min x2max x3min x3max]);
hold .
Для получения тех же результатов вместо этой не столь очевидной процедуры
целесообразно использовать такую последовательность:
[t, X] = ode23(„<имя функции>„, t0, tf, x0, tol, trace);
comet3(X(:, 1), X(:, 2), X(:, 3));.
В этом случае построение орбиты реализуется автоматически, но после выполнения
процедуры интегрирования. Кроме того, в данном случае пользователь может выбирать
любые переменные состояния.
Для эффективного моделирования сложных динамических систем с непрерывным и
дискретным временем рекомендуется использовать специализированную систему
SIMULINK [3], входящую в состав программных продуктов, выпускаемых фирмой The
MathWorks, Inc.
96
Ссылки:
1. Хакен Г. Синергетика: иерархии неустойчивостей в самоорганизующихся системах
и устройствах. М.: Мир, 1985. 423 с.
2. Forsythe G. E., Malcolm M. A., Moler C. B. Computer Methods for Mathematical
Computations. Prentice-Hall, 1977.
3. SIMULINK. User‟s Guide. Natick: The MathWorks, Inc., 1990.
FMIN,
FOPTIONS
Минимизация функции одной переменной
Синтаксис:
xmin = fmin(„<имя функции>„, x1, x2)
xmin = fmin(„<имя функции>„, x1, x2, options)
[xmin, options] = fmin(„<имя функции>„, x1, x2, options, p1,..., p10)
options = foptions
Описание:
Функция xmin = fmin(„<имя функции>„, x1, x2) возвращает значение локального
минимума функции в интервале x1<= x<= x2.
Функция xmin = fmin(„<имя функции>„, x1, x2, options) использует вектор
управляющих параметров options, который включает 18 компонентов, описанных ниже. Он
предназначен для настройки алгоритмов оптимизации, применяемых как в системе
MATLAB, так и в пакете программ Optimization Toolbox [1]. Функция fmin использует
только 3 из этих параметров: options(1), options(2), options(14).
Функция [xmin, options] = fmin(„<имя функции>„, x1, x2, options, p1,..., p10) позволяет
передать до 10 параметров, а кроме того, возвращает вектор управляющих параметров
options, которые использовались алгоритмом, и в частности, параметр options(10),
фиксирующий количество выполненных итераций, и параметр options(8), содержащий
минимальное значение функции.
Функция options = foptions возвращает вектор-строку исходных значений параметров,
используемых функциями fmin и fmins системы MATLAB и функциями fminu, constr, attgoal,
minimax, leastsq, fsolve пакета Optimization Toolbox. Значения по умолчанию присваиваются
внутри функций оптимизации и могут отличаться от исходных значений.
Исходное Значение по
Опция
Назначение опции
значение
умолчанию
options(1)
Вывод промежуточных результатов: 0 - не
выводятся; 1 - выводятся
0
0
options(2)
Итерационная погрешность для аргумента
1e-4
1e-4
options(3)
Итерационная погрешность для функции
1e-4
1e-4
options(4)
Терминальный критерий соблюдения ограничений
1e-6
1e-6
options(5)
Стратегия
0
0
options(6)
Оптимизация
0
0
options(7)
Алгоритм линейного поиска
0
0
options(8)
Значение целевой функции
0
0
options(9)
Для контроля градиента установить в 1
0
0
options(10) Количество выполненых итераций
0
0
options(11) Количество вычисленных градиентов
0
0
options(12) Количество вычисленных ограничений
0
0
97
options(13) Количество ограничений в виде равенств
0
0
options(14)
Максимальное количество итераций, n - количество
переменных
0
fmin: 500
fmins: 200хn
options(15)
Параметр, используемый прри наличии целевой
функции
0
0
options(16)
Минимальное прриращение переменных при
вычислении градиента
1e-8
1e-8
options(17)
Максимальное прриращение переменных при
вычислении градиента
0.1
0.1
options(18) Размер шага минимизации h
0
h <=1
Пример:
Вычислим приближенное значение p путем минимизации функции y = cos(x) на
отрезке [3 4] с итерационной погрешностью по x - 1e-12.
[xmin, opt] = fmin('cos', 3, 4, [0, 1e-12]);
xmin = 3.141592654027715e+000
pi = 3.141592653589793e+000
norm(y-pi) = 4.3792e-010
Функция у = cos(x)
Обратите внимание, что итерационная погрешность (разница между двумя соседними
итерациями) отличается от погрешности вычисления (разница между вычисленным и
машинным значением .
Номер опции opt Исходное значение Значение при выходе из функции fmin
1
0
0
2
1.0000e-004
1.0000e-012
3
1.0000e-004
1.0000e-004
4
1.0000e-006
1.0000e-006
5
0
0
6
0
0
7
0
0
8
0
-1.0000e+000
9
0
0
10
0
9.0000e+000
11
0
0
98
12
0
0
13
0
0
14
0
5.0000e+002
15
0
0
16
1.0000e-008
1.0000e-008
17
1.0000e-001
1.0000e-001
18
0
0
Анализ таблицы подтверждает, что заданная итерационная погрешность opt(2) равна
1.0000e-012; минимальное значение функции opt(8) равно -1.0000e+000; число выполненных
итераций opt(10) равно 9.0000e+000 при максимально допустимом числе итераций opt(14) =
5.0000e+002.
Алгоритм:
Функция fmin реализует методы “золотого сечения” и параболической интерполяции
[2].
Сопутствующие функции: FMINS, FZERO, Optimization Toolbox.
Ссылки:
1. Optimization Toolbox. User‟s Guide. Natick: The MathWorks, Inc., 1991.
2. Forsythe G. E., Malcolm M. A., Moler C. B. Computer Methods for Mathematical
Computations. Prentice-Hall, 1976.
FMINS
Минимизация функции нескольких переменных
Синтаксис:
xmin = fmins(„<имя функции>„, x0)
xmin = fmins(„<имя функции>„, x0, options)
[xmin, options] = fmins(„<имя функции>„, x0, options, [ ], arg1,..., arg10)
Описание:
Функция xmin = fmins(„<имя функции>„, x0) возвращает вектор xmin,
соответствующий значению локального минимума функции в окрестности точки x0.
Функция xmin = fmins(„<имя функции>„, x0, options) использует вектор управляющих
параметров options, который включает 18 компонентов, соответствующих функции foptions.
Функция fmins использует только 4 из этих параметров: options(1), options(2), options(3),
options(14).
Функция [xmin, options] = fmins(„<имя функции>„, x0, options, [ ], arg1,..., arg10)
позволяет передать до 10 параметров; четвертый входной аргумент необходим, чтобы
обеспечить совместимость с функцией fminu из пакета Optimization Toolbox [1]. Кроме того,
возвращается вектор управляющих параметров options, которые использовались алгоритмом,
и в частности, параметр options(10), фиксирующий количество выполненных итераций, и
параметр options(8), содержащий минимальное значение функции.
Пример:
Рассмотрим классический пример минимизации функции Розенброка от двух
переменных.
.
Минимум этой функции достигается в точке (a, a2) и равен нулю. В качестве
начальной точки обычно выбирается точка (-1.2 1).
Определим М-файл rosenbr(x, a), обеспечивающий вычисление этой функции для
заданного параметра a.
function y = rosenbr(x, a)
if nargin < 2, a = 1; end
y = 100 * (x(2) - x(1)^2)^2 + (a - x(1))^2;
99
Рассмотрим случай a = 1.
[xmin, opt] = fmins('rosenbr', [-1.2 1], [0, 1e-6]);
xmin = 9.999997969915502e-001
9.999995750683192e-001
Номер опции opt Исходное значение Значение при выходе из функции fmin
1
0
0
2
1.0000e-004
1.0000e-012
3
1.0000e-004
1.0000e-004
4
1.0000e-006
1.0000e-006
5
0
0
6
0
0
7
0
0
8
0
-1.0000e+000
9
0
0
10
0
9.0000e+000
11
0
0
12
0
0
13
0
0
14
0
5.0000e+002
15
0
0
16
1.0000e-008
1.0000e-008
17
1.0000e-001
1.0000e-001
18
0
0
Анализ таблицы подтверждает, что заданная итерационная погрешность opt(2) равна
1.0000e-06; минимальное значение функции opt(8) равно 7.6989e-014; число выполненных
итераций opt(10) равно 1.9900e+002 при максимально допустимом числе итераций opt(14) =
4.0000e+002.
Рассмотрим случай, когда минимум сдвинут в точку (sqrt(2), 2).
[xmin, opt] = fmins('rosenbr', [-1.2 1], [0, 1e-6], [ ], sqrt(2));
xmin, opt(8), opt(10)
xmin = 1.414213634743838e+000 2.000000234240279e+000
opt(8) = 9.2528e-014
opt(10) = 206
100
Алгоритм:
Функция fmins реализует метод Нелдера - Мида [2, 3], который является прямым
методом, не требующим вычисления градиента или иной информации о производной, и
связан с построением симплекса в n-мерном пространстве, который задается n+1-й
вершиной. В двумерном пространстве симплекс - это треугольник, а в трехмерном пирамида.
На каждом шагу алгоритма новая точка выбирается внутри или вблизи симплекса.
Значение функции в этой точке сравнивается со значениями в вершинах симплекса, и, как
правило, одна из вершин заменяется этой точкой, задавая тем самым новый симплекс. Эти
итерации повторяются до тех пор, пока диаметр симплекса не станет меньше заданной
величины итерационной погрешности по переменным x.
Сопутствующие функции: FMIN, FZERO, Optimization Toolbox.
Ссылки:
1. Optimization Toolbox. User‟s Guide. Natick: The MathWorks, Inc., 1991.
2. Nelder J. A., Mead R. A Simplex Method for Function Minimization//Computer Journal.
Vol. 7, P. 308-313.
3. Dennis J. E., Woods D. J. New Computing Environments: Microcomputers in LargeScale Computing, Ed. by A. Wouk. SIAM, 1987. P. 116-122.
FZERO
Нахождение нулей функции одной переменной
Синтаксис:
z = fzero(„<имя функции>„, x0)
z = fzero(„<имя функции>„, x0, tol)
z = fzero(„<имя функции>„, x0, tol, trace)
Описание:
Функция z = fzero(„<имя функции>„, x0) находит нуль функции в окрестности точки
x0.
Функция z = fzero(„<имя функции>„, x0, tol) возвращает результат с относительной
погрешностью tol, задаваемой пользователем. По умолчанию tol = eps.
Функция z = fzero(„<имя функции>„, x0, tol, trace) позволяет выдавать на экран
терминала промежуточные результаты поиска нуля функции.
Пример:
Вычислим действительные нули полинома f(x) = x4 - 4 * x3 + 12.
Сначала сформируем М-файл polynom4 для вычисления этой функции:
function y = polynom4(x)
y = x.^4 - 4*x.^3 + 12;
затем найдем корень полинома, стартуя из точки x0 = -0.5:
z = fzero(' polynom4', -0.5, eps, 1)
z = 1.746170944975038e+000;
101
теперь найдем корень полинома, стартуя из точки x0 = 3.0:
z = fzero(' polynom4', 3, eps, 1)
z = 3.777351952771215e+000;
точные значения корней полинома могут быть вычислены с помощью функции
roots([1 -4 0 0 12])
ans =
3.777351952771212e+000
1.746170944975038e+000
-7.617614488731261e-001 +1.113117638472703e+000i
-7.617614488731261e-001 -1.113117638472703e+000i
Нетрудно видеть, что оба подхода обеспечивают согласованные результаты.
На рис. а показана траектория движения из точки x0 = -0.5, а на рис. б - из точки x0 = 3.0.
а)
б)
Алгоритм:
Функция fzero использует методы деления отрезка пополам, секущей и обратной
квадратической интерполяции [1, 2].
Сопутствующие функции: FMIN, ROOTS.
Ссылки:
1. Brent R. Algorithms for Minimization Without Derivatives. Prentice-Hall, 1973.
2. Forsythe G. E., Malcolm M. A., Moler C. B. Computer Methods for Mathematical
Computations. Prentice-Hall, 1976.
FPLOT
Построение графиков функции одной переменной
Синтаксис:
fplot(„<имя функции>„, [<интервал>])
fplot(„<имя функции>„, [<интервал>], n)
fplot(„<имя функции>„, [<интервал>], n, <приращение угла>)
fplot(„<имя функции>„, [<интервал>], n, <приращение угла>, <дробление шага>)
[x, Y] = fplot(„<имя функции>„, [<интервал>], n, <приращение угла>, <дробление
шага>)
Описание:
Функция fplot(„<имя функции>„, [<интервал>]) строит график функции в заданном
интервале [xmin xmax].
Функция fplot(„<имя функции>„, [<интервал>], n) строит график функции, разбивая
интервал минимум на n частей. По умолчанию n = 25.
Функция fplot(„<имя функции>„, [<интервал>], n, <приращение угла>) строит график
так, чтобы изменение угла наклона на соседнем участке отличалось не более чем на
Функция fplot(„<имя функции>„, [<интервал>], n, <приращение угла>, <дробление
шага>) выполняет построение графика так, чтобы изменение угла наклона на соседнем
102
участке отличалось не более чем на величину <приращение угла>, но требовало при этом не
более чем k дроблений шага. По умолчанию <дробление шага> = 20.
Функция [x, Y] = fplot(„<имя функции>„, [<интервал>], n, <приращение угла>,
<дробление шага>) возвращает абсциссы и ординаты функции в виде одномерного массива x
и, возможно, двумерного массива Y. График при этом не строится. Построение графика
можно выполнить в дальнейшем с помощью функции plot(x, y).
Пример:
Построим график функции, используя функцию fplot.
Сначала сформируем М-файл myfun 4 для вычисления двух функций:
function y = myfun(x)
y(:, 1) = 200 * sin(x) ./ x;
y(:, 2) = x .^ 2;
теперь построим график в интервале [-20 20] с разбиением интервала минимум на 50 частей
и так, чтобы <приращение угла> не превышало 2 .
Сопутствующие функции: PLOT.
FFT, IFFT
Одномерное дискретное прямое и обратное
преобразования Фурье
Синтаксис:
Y = fft(X)
X = ifft(Y)
Y = fft(X, n)
X = ifft(Y, n)
Описание:
Дискретные прямое и обратное преобразования Фурье для одномерного массива x
длины N определяются следующим образом:
Функция Y = fft(X) вычисляет для массива данных X дискретное преобразование
Фурье, используя FFT-алгоритм быстрого Фурье-преобразования. Если массив X двумерный,
вычисляется дискретное преобразование каждого столбца.
Функция Y = fft(X, n) вычисляет n-точечное дискретное преобразование Фурье. Если
length(X) < n, то недостающие строки массива X заполняются нулями; если length(X) > n, то
лишние строки удаляются.
Функция X = ifft(Y) вычисляет обратное преобразование Фурье для массива Y.
Функция X = ifft(Y, n) вычисляет n-точечное обратное преобразование Фурье для
массива Y.
Примеры:
Основное назначение преобразования Фурье - выделить частоты регулярных
составляющих сигнала, зашумленного помехами. Рассмотрим данные, поступающие с
103
частотой 1000 Гц. Сформируем сигнал, содержащий регулярные составляющие с частотами
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));
plot(y(1:50)), grid
На рис. а показан этот сигнал. Глядя на него, трудно сказать, каковы частоты его
регулярных составляющих. Реализуя одномерное преобразование Фурье этого сигнала на
основе 512 точек и построив график спектральной плотности (рис. б), можно выделить две
частоты, на которых амплитуда спектра максимальна. Это частоты 120 и 50 Гц.
Y = fft(y, 512);
Pyy = Y.*conj(Y)/512;
f = 1000 * (0:255)/512;
figure(2), plot(f, Pyy(1:256)), grid
а)
б)
Алгоритм:
Если длина последовательности входных данных является степенью числа 2, то
применяется алгоритм быстрого преобразования Фурье с основанием 2, имеющий
максимальную производительность. Этот алгоритм оптимизирован для работы с
действительными данными; если данные комплексные, то реализуется комплексное
преобразование Фурье. Эффективность первого на 40 % выше второго.
Если длина входной последовательности не является степенью числа 2, то
применяется преобразование со смешанными основаниями, которые определяются как
простые множители длины входной последовательности, которая при необходимости
подвергается усечению.
Время расчета существенно зависит от значения длины последовательности. Если
значение длины точно разлагается на простые множители, то вычисления для такой
последовательности выполняются достаточно быстро; если же не все множители
оказываются простыми, и даже их будет меньше, то время вычисления существенно
возрастает.
Если сравнивать эффективность вычислений, то преобразование Фурье с основанием
2 действительной последовательности из 4096 точек занимает 2.1 с, а комплексной - 3.7 с.
Обычное преобразование Фурье для последовательности из 4096 точек занимает 7 с, а для
последовательности из 4098 точек - 58 с.
Сопутствующие функции: FFT2, IFFT2, FFTSHIFT, Signal Processing Toolbox [1].
Ссылки:
1. Signal Processing Toolbox User‟s Guide. Natick: The MathWorks, Inc., 1993.
Двумерное дискретное прямое и обратное
FFT2, IFFT2
преобразования Фурье
Синтаксис:
Y = fft2(X)
X = ifft2(Y)
104
Y = fft2(X, m, n)
X = ifft2(Y, m, n)
Описание:
Функция Y = fft2(X) вычисляет для массива данных X двумерное дискретное
преобразование Фурье. Если массив X двумерный, вычисляется дискретное преобразование
для каждого столбца.
Функция Y = fft(X, n) вычисляет n-точечное дискретное преобразование Фурье. Если
length(X) < n, то недостающие строки массива X заполняются нулями; если length(X) > n, то
лишние строки удаляются.
Функция X = ifft(Y) вычисляет обратное преобразование Фурье для массива Y.
Функция X = ifft(Y, n) вычисляет n-точечное обратное преобразование Фурье для
массива Y.
Примеры:
Рассмотрим тот же пример, что и для функции fft, но сформируем 2 входных
последовательности (рис. а):
t = 0:0.001:0.6;
x = sin(2*pi*50*t) + sin(2*pi*120*t);
y1 = x + 2*randn(size(t));
y2 = x + 2*randn(size(t));
y = [y1; y2];
plot(y(1, 1:50)), hold on, plot(y(2, 1:50)), grid, hold off
Применим двумерное преобразование Фурье для сигнала y на основе 512 точек и
построим график спектральной плотности. Теперь можно выделить 2 частоты, на которых
амплитуда спектра максимальна. Это частоты - 100/2Гц и 240/2Гц.
Y = fft2(y, 2, 512);
Pyy = Y.*conj(Y)/512;
f = 1000*(0:255)/512;
figure(2), plot(f, Pyy(1:256)), grid
а)
б)
Алгоритм:
Двумерное дискретное преобразование связано с одномерным дискретным
преобразованием Фурье следующим образом:
fft2(X) = fft(fft(X).‟).‟
Сопутствующие функции: FFT, IFFT, FFTSHIFT, Signal Processing Toolbox.
Ссылки:
1. Signal Processing Toolbox User‟s Guide. Natick: The MathWorks, Inc., 1993.
Перегруппировка выходных массивов преобразований
FFTSHIFT
Фурье
Синтаксис:
Y = fftshift(X)
Описание:
105
Функция Y = fftshift(X) перегруппировывает выходные массивы функций fft и fft2,
размещая нулевую частоту в центре спектра.
Если v - одномерный массив, то выполняется циклическая перестановка правой и
левой его половины:
v
fftshift(v)
1 2 3 4 5 4 5 1 2 3
Если X - двумерный массив, то меняются местами квадранты: I
X = [' I ' ' II ';...
' III ' ' IV ';]
fftshift(X)
X
fftshift(X)
I
II
III IV
IV и II
III:
IV III
II I
Пример:
Рассмотрим тот же пример, который рассматривался и для функции fft, но введем
постоянную составляющую с уровнем 0.3:
t = 0:0.001:0.6;
x = sin(2 * pi * 50 * t) + sin(2 * pi * 120 * t);
y = x + 2 * randn(size(t)) + 0.3;
plot(y(1:50)), grid
Применим одномерное преобразование Фурье для сигнала y и построим график
спектральной плотности. Здесь можно выделить 3 частоты, на которых амплитуда спектра
максимальна. Это частоты 0, 58.4 и 140.1 Гц (рис. а).
Y = fft(y);
Pyy = Y.*conj(Y)/512;
f = 1000 * (0:255)/512;
figure(1), plot(f, Pyy(1:256)), grid
ginput
58.4112 136.6337
140.1869 62.3762
58.4112
68.9109
140.1869
96.8317
Выполним операции
Y = fftshift(Y);
Pyy = Y.*conj(Y)/512;
figure(2), plot(Pyy), grid
а)
б)
Из анализа рис. б) следует, что нулевая частота сместилась в середину спектра.
Сопутствующие функции: FFT, FFT2, Signal Processing Toolbox [1].
Ссылки:
106
1. Signal Processing Toolbox User‟s Guide. Natick: The MathWorks, Inc., 1993.
CONV,
DECONV
Свертка одномерных массивов
Синтаксис:
z = conv(x, y)
[q, r] = deconv(z, x)
Описание:
Если заданы одномерные массивы x и y длины соответственно m = length(x) и n =
length(y), , то свертка z - это одномерный массив длины m + n -1, k-й элемент которого
определяется по формуле
.
Функция z = conv(x, y) вычисляет свертку z двух одномерных массивов x и y.
Рассматривая эти массивы как выборки из двух сигналов, можно сформулировать
теорему свертки в следующей форме:
Если X = fft([x zeros(1, length(y)-1]) и Y = fft([y zeros(1, length(x) - 1]) - согласованные
по размерам преобразования Фурье сигналов x и y, то справедливо соотношение conv(x, y) =
ifft(X.*Y).
Иначе говоря, свертка двух сигналов эквивалентна умножению преобразований Фурье
этих сигналов.
Функция [q, r] = deconv(z, x) выполняет операцию, обратную операции свертки. Эта
операция равносильна определению импульсной характеристики фильтра. Если справедливо
соотношение z = conv(x, y), то q = y, r = 0.
Сопутствующие функции: Signal Processing Toolbox [1].
Ссылки:
1. Signal Processing Toolbox User‟s Guide. Natick: The MathWorks, Inc., 1993.
Свертка двумерных массивов
CONV2
Синтаксис:
Z = conv2(X, Y)
Z = conv2(X, Y, „<опция>„)
Описание:
Функция Z = conv2(X, Y) вычисляет свертку Z двумерных массивов X и Y. Если
массивы имеют размеры соответственно mx х nx и my х ny, то размер массива Z равен (mx +
my - 1) х (nx + ny - 1).
Функция Z = conv2(X, Y, „<опция>„) имеет опцию для управления размером массива
Z, которая может принимать следующие значения:
„full‟ - полноразмерная свертка (по умолчанию);
„same‟ - центральная часть размера mx х nx;
„valid‟ - центральная часть размера (mx-my+1) х (nx-ny+1) при условии, что (mx х nx) > (my х
ny).
Процедура conv2 выполняется наиболее эффективно, если выполнено условие (mx х
nx) > (my х ny), то есть количество элементов массива X превосходит количество элементов
массива Y.
Пример:
Рассмотрим два массива X и Y.
X
Y
8
1 6
1
1
3
5 7
1
1
107
4 9 2
И вычислим их свертку для различных значений опции.
Zs = conv2(X, Y,
Zv = conv2(X, Y,
Z = conv2(X, Y)
'same')
'valid')
8 9 7 6
17 19 13
17 19
11 17 19 13
21 23 9
21 23
7 21 23 9
13 11 2
4 13 11 2
Сравнивая столбцы последней таблицы, можно понять назначение опций „full‟,
„same‟, „valid‟.
Сопутствующие функции: CONV, DECONV, FILTER2, Signal Processing Toolbox [1].
Ссылки:
1. Signal Processing Toolbox User‟s Guide. Natick: The MathWorks, Inc., 1993.
Дискретная одномерная фильтрация
FILTER
Синтаксис:
y = filter(b, a, x)
[y, Zf] = filter(b, a, x, Zi)
Описание:
Функция y = filter(b, a, x) фильтрует сигнал, заданный в виде одномерного массива x,
используя дискретный фильтр, описываемый конечно-разностными уравнениями вида
y(n) = b(1) * x(n) + b(2) * x(n - 1) + ... + b(nb + 1) * x(n - nb)
- a(2) * y(n - 1) - ... - a(na + 1) * y(n - na),
при этом входной параметр b = [b(1) b(2) ... b(nb + 1)], а параметр a = [a(2) ... ...
a(na+1)].
Функция [y, Zf] = filter(b, a, x, Zi) позволяет учесть запаздывания входного Zi и
выходного Zf сигналов.
Сопутствующие функции: FILTER2, Signal Processing Toolbox [1].
Ссылки:
1. Signal Processing Toolbox User‟s Guide. Natick: The MathWorks, Inc., 1993.
Дискретная двумерная фильтрация
FILTER2
Синтаксис:
Y = filter2(B, X)
Y = filter2(B, X, „<опция>„)
Описание:
Функция Y = filter2(B, X) фильтрует сигнал, заданный в виде двумерного массива X,
используя дискретный фильтр, описываемый матрицей B. Результат имеет те же размеры,
которые имеет и массив X, и вычисляется с использованием двумерной свертки.
Функция Y = filter2(B, X, „<опция>„) имеет опцию для управления размером массива
Y, которая может принимать следующие значения:
„same‟ size(Y) = size(X) (по умолчанию)
„valid‟ size(Y) < size(X)
„full‟
size(Y) > size(X)
Пример:
Рассмотрим фильтр B и массив X.
X
B
108
8
1 6
1
1
3
5 7
1
1
4 9 2
И вычислим их свертку для различных значений опции.
Y = filter2(B, X,
Y = filter2(B, X)
Zv = conv2(X, Y, 'full')
„valid‟)
17 19 13
17 19
8 9 7 6
21 23 9
21 23
11 17 19 13
13 11 2
7 21 23 9
4 13 11 2
Сопутствующие функции: CONV2, FILTER, Signal Processing Toolbox [1].
Ссылки:
1. Signal Processing Toolbox User‟s Guide. Natick: The MathWorks, Inc., 1993.
Корректировка фазовых углов
UNWRAP
Синтаксис:
Q = unwrap(P)
Q = unwrap(P, cutoff)
Описание:
Функция Q = unwrap(P) корректирует фазовые углы элементов одномерного массива
P при переходе через значение , дополняя их значениями ±2 для того, чтобы убрать
разрывы функции; если P - двумерный массив, то соответствующая функция применяется к
столбцам.
Функция Q = unwrap(P, cutoff) позволяет пользователю изменить значение cutoff
критического угла; по умолчанию cutoff = .
Пример:
Рассмотрим
непрерывный
неминимально-фазовый
фильтр,
описываемый
передаточной функцией
.
Вычислим частотную характеристику этого фильтра в диапазоне w = 0.1:0.01:10,
используя функцию freqresp пакета Control System Toolbox [1].
w = 0.1:0.01:10;
g = freqresp(num, den, sqrt(-1) * w);
Вычислим фазовый угол частотной характеристики без использования и с
использованием функции unwrap.
ph1 = (180./pi) * (atan2(imag(g), real(g)));
ph2 = (180./pi) * unwrap(atan2(imag(g), real(g)));
w
ph1
ph2
0.6000
126.7350
126.7350
0.7000
141.9270
141.9270
0.8000
-158.7123
201.2877
0.9000
-135.6888
224.3112
1.0000
135.0000
-225.0000
1.1000
-139.3435
220.6565
109
1.2000
-145.0993
214.9007
1.3000
-151.1794
208.8206
1.4000
-157.1667
202.8333
1.5000
-162.8839
197.1161
1.6000
-168.2575
191.7425
1.7000
-173.2642
186.7358
1.8000
-177.9068
182.0932
1.9000
177.7986
177.7986
2.0000
173.8298
173.8298
Из таблицы следует, что при входе и выходе из диапазона частот 0.8-2.0 Гц фазовые
углы ph1 при достижении критического угла p терпят разрывы, которые устраняются
функцией unwrap.
Построим фазовые частотные характеристики ph1(w) и ph2(w)-360, которые
подтверждают сделанные выводы.
semilogx(w, ph1), hold on, grid
semilogx(w, ph2-360, 'b')
Сопутствующие функции: ANGLE, ABS, Control System Toolbox [1].
Ссылки:
1. Signal Processing Toolbox User‟s Guide. Natick: The MathWorks, Inc., 1990
Работа с разреженными матрицами
При решении многих прикладных задач приходится иметь дело с разреженными
матрицами, то есть с матрицами, имеющими много нулевых элементов. К числу таких задач
в первую очередь следует отнести граничные задачи для систем дифференциальных
уравнений в частных производных. Возникающие при этом модели - это, как правило,
квадратные матрицы высокого порядка с конечным числом ненулевых диагоналей.
Известно, что матрица порядка n требует для своего хранения n 2 байт оперативной
памяти, а время вычислений пропорционально n3. Поэтому, когда количество неизвестных
переменных достигает нескольких сотен, вычисления с полными матрицами становятся
неэффективными и необходимо принимать во внимание степень разреженности матрицы, то
есть отношение количества ненулевых элементов к общему количеству элементов матрицы.
Для разреженной матрицы S порядка m х n с количеством ненулевых элементов
nnz(S) требования к объему оперативной памяти пропорциональны nnz. Вычислительная
сложность операций над элементами массива также пропорциональна nnz, линейно зависит
от m и n и не зависит от произведения m х n. Сложность такой операции как решение
системы линейных уравнений с разреженной матрицей зависит от упорядочения элементов и
заполненности матрицы, что обсуждается позднее в этой главе.
110
При работе с разреженными матрицами соблюдается фундаментальный принцип
вычислительной сложности: время, необходимое для выполнения матричных операций над
разреженной матрицей, пропорционально количеству арифметических операций над
ненулевыми элементами. Это подтверждает широко распространенное правило: время
вычислений пропорционально количеству операций с плавающей точкой.
В этой главе описан новый класс операций, реализованных в системе MATLAB, для
работы с разреженными матрицами. Это операции хранения, преобразования, упорядочения,
графического представления и решения систем линейных уравнений.
Элементарные разреженные матрицы
SPARSE - формирование разреженной матрицы
SPDIAGS - формирование диагоналей разреженной матрицы
SPEYE - единичная разреженная матрица
SPRANDN - случайная разреженная матрица
SPRANDSYM - случайная разреженная симметрическая матрица
Преобразование разреженных матриц
FIND - определение индексов ненулевых элементов
FULL - преобразование разреженной матрицы в полную
SPCONVERT - преобразование данных в ASCII-формате в массив разреженной
структуры
Работа с ненулевыми элементами
ISSPARSE - проверка на принадлежность к классу разреженных матриц
NNZ - количество ненулевых элементов
NONZEROS - формирование вектора ненулевых элементов
NZMAX - количество ячеек памяти для размещения ненулевых элементов
SPALLOC - выделить пространство памяти для разреженной матрицы
SPFUN - вычисление функции только для ненулевых элементов
SPONES - формирование матрицы связности
Характеристики разреженной системы
NORMEST - оценка 2-нормы разреженной матрицы
CONDEST - оценка числа обусловленности матрицы по 1-норме
SPRANK - структурный ранг разреженной матрицы
Визуализация разреженных матриц
GPLOT - построение графа
SPY - визуализировать структуру разреженной матрицы
Алгоритмы упорядочения
RANDPERM - формирование случайных перестановок
COLPERM - упорядочение столбцов с учетом их разреженности
DMPERM - DM-декомпозиция разреженной матрицы
SYMRCM - RCM-упорядоченность
COLMMD - упорядочение по разреженности столбцов
111
SYMMMD - симметрическая упорядоченность
Операции над деревьями
ETREE - дерево матрицы
ETREEPLOT - построение дерева матрицы
TREELAYOUT - разметить дерево
TREEPLOT - пострение дерева матрицы
Вспомогательные операции
SPPARMS - установка параметров для алгоритмов упорядочения и прямого решения
линейных уравнений для разреженных матриц
SYMBFACT - характеристики разложения Холецкого
SPAUGMENT - формирование расширенной матрицы для метода наименьших
квадратов
SPARSE
Формирование разреженной матрицы
Синтаксис:
S = sparse(i, j, s, m, n, nzmax)
S = sparse(i, j, s, m, n)
S = sparse(i, j, s)
S = sparse(m, n)
S = sparse(A)
Описание:
Функция sparse - это встроенная функция, которая формирует матрицы в соответствии
с правилами записи разреженных матриц, принятыми в системе MATLAB; количество
входных аргументов этой функции - от 1 до 6.
Функция S = sparse(A) преобразовывает полную матрицу в разреженную, удаляя из
описания нулевые элементы; если исходная матрица разреженная, то sparse(S) возвращает S.
Общая форма функции S = sparse(i, j, s, m, n, nzmax) использует строки массива [i j s]
для формирования разреженной матрицы размера m х n с ненулевыми элементами,
количество которых не превышает nzmax. Векторы i и j задают позиции элементов и
являются целочисленными, а вектор c определяет числовое значение элемента матрицы,
которое может быть действительным или комплексным. При формировании разреженной
матрицы все строки вида [i j 0] из описания удаляются. Длина результирующего вектора s
точно совпадает с количеством ненулевых элементов разреженной матрицы.
При формировании разреженной матрицы допускается использовать меньшее число
входных аргументов, чем это требуется, а также ряд других упрощений. Так, один из
аргументов i, j или s может быть скаляром, но при этом система MATLAB сама дополнит
такой вектор до требуемой длины, которая определяется другими элементами.
Обращение вида S = sparse(i, j, s, m, n) предполагает по умолчанию, что nzmax =
lenght(s).
Обращение вида S = sparse(i, j, s) предполагает, что m = max(i) и n = max(j); эти
функции вычисляются раньше, чем будут удалены строки с нулевыми значениями s.
Обращение вида S = sparse(m, n) резервирует пространство для разреженной матрицы
и равносильно обращению sparse([ ], [ ], [ ], m, n, 0), где все m х n элементов являются
нулевыми.
Над разреженными матрицами могут совершаться любые арифметические,
логические и индексные операции, то же справедливо и для смешанных операндов - полных
и разреженных массивов. Операции с однородными операндами возвращают тот же тип
112
операнда; в случае смешанных операндов, как правило, возвращается полный тип, за
исключением случаев, когда в явном виде сохраняется разреженный тип. Например, при
поэлементном умножении массивов A .* S, где S - разреженный массив.
Некоторые операции, например S >= 0, приводят к генерации так называемых BS(Big
Space)-матриц, которые имеют разреженную структуру, но очень большое количество
нулевых элементов.
Примеры:
Функция S = sparse(1:n, 1:n, 1) формирует единичную матрицу n х n с разреженной
структурой и коэффициентом заполнения 1/n. Тот же результат может быть получен с
помощью оператора S = sparse(eye(n, n)), но при этом промежуточная матрица будет иметь
полную структуру.
Массив вида B = sparse(10000, 10000, pi), состоящий из одного элемента, вероятно, не
очень полезен, но такое обращение допустимо. Не пытайтесь применить функцию full(B),
вам потребуется 800 М памяти.
Следующая последовательность операторов сначала определяет структуру, а затем
формирует разреженную матрицу.
[i, j, s] = find(S);
[m, n] = size(S);
S = sparse(i, j, s, m, n);
Сопутствующие функции: FULL, FIND, SPY, NONZEROS, NNZ, NZMAX, DIAG,
SPONES, SPRANDSYM.
SPDIAGS
Формирование диагоналей разреженной матрицы
Синтаксис:
[B, d] = spdiags(A)
B = spdiags(A, d)
A = spdiags(B, d, A)
A = spdiags(B, d, m, n)
Описание:
Функция spdiags расширяет возможности встроенной функции diag и позволяет
работать с различными комбинациями следующих трех матриц, которые могут быть как
входами, так и выходами функции spdiags:
A - матрица размера m х n, как правило (но не обязательно), разреженная с
ненулевыми элементами на p диагоналях;
В - матрица размера min(m, n) х p, как правило (но не обязательно), полная, столбцы
которой являются диагоналями A;
d - вектор длины p, целочисленные элементы которого определяют номера ненулевых
диагоналей A (верхние диагонали нумеруются положительными числами, нижние отрицательными).
Грубо говоря, матрицы A, B и вектор d связаны друг с другом следующим образом:
for k = 1:p
B(:, k) = diag(A, d(k))
end
Функция spdiags определяет следующие 4 операции в зависимости от количества
входных аргументов:
выделить все ненулевые диагонали:
[B, d] = spdiags(A);
выделить указанные диагонали:
B = spdiags(A);
заменить указанные диагонали матрицы A:
A = spdiags(B, d, A);
113
сформировать разреженную матрицу размера m х n по известным диагоналям:
A = spdiags(B, d, m, n);
Пример:
Сформировать трехдиагональную разреженную матрицу для разностного оператора 2го порядка, заданного на сетке из n узлов.
n =5 ;
e = ones(n, 1);
A = spdiags([e -2*e e], -1:1, n, n)
Теперь из нее можно сформировать тестовую матрицу Уилкинсона wilkinson(n),
изменяя элементы главной диагонали:
col = (abs(-(n-1)/2:(n-1)/2))';
A = spdiags(col, 0, A)
В заключение выделим ненулевые диагонали:
B = spdiags(A)
Сопутствующие функции: DIAG.
SPEYE
Единичная разреженная матрица
Синтаксис:
S = speye(m, n)
S = speye(n)
Описание:
Функция speye(m, n) формирует разреженную матрицу размера m х n с единицами на
главной диагонали и нулевыми внедиагональными элементами.
Функция speye(n) равносильна функции speye(n, n).
Пример:
Оператор A = speye(1000) формирует разреженный массив, соответствующий
единичной матрице размера 1000 х 1000 и требует для этого всего 16 К памяти.
Аналогичный конечный результат может быть получен с помощью оператора A =
sparse(eye(1000,1000)), но в этом случае промежуточная матрица будет полной.
Сопутствующие функции: SPONES, SPALLOC.
SPRANDN
Случайная разреженная матрица
Синтаксис:
R = sprandn(S)
R = sprandn(m, n, alpha)
R = sprandn(m, n, alpha, rcond)
Описание:
Матрица вида R = sprandn(S) имеет ту же структуру, которую имеет и разреженная
матрица S, но при этом значения ее ненулевых элементов распределены по нормальному
закону со средним, равным нулю и дисперсией 1.
Матрица вида R = sprandn(m, n, alpha) - это случайная разреженная матрица, которая
имеет приблизительно alpha * m * n ненулевых элементов, распределенных по нормальному
закону, где alpha - коэффициент заполнения со значением в пределах 0<= alpha<= 1.
Матрица вида R = sprandn(m, n, alpha, rcond) в дополнение к вышеперечисленным
условиям имеет также число обусловленности по отношению к операции обращения,
близкое к значению rcond. Если rcond - вектор длины lr<= min(m, n), то матрица R имеет в
качестве первых lr сингулярных чисел значения вектора rcond, а остальные сингулярные
числа равны нулю. В этом случае матрица R генерируется с помощью матриц случайных
плоских вращений, которые применяются к диагональной матрице с заданным спектром
сингулярных чисел. Такие матрицы играют важную роль при анализе алгебраических и
топологических структур.
114
Сопутствующие функции: SPRANDSYM.
SPRANDSYM
Случайная разреженная симметрическая матрица
Синтаксис:
R = sprandsym(S)
R = sprandsym(n, alpha)
R = sprandsym(n, alpha, rcond)
R = sprandsym(n, alpha, rcond, kind)
Описание:
Матрица R = sprandsym(S) - случайная симметрическая матрица, главная диагональ и
нижние поддиагонали которой имеют ту же структуру, которую имеет и матрица S; значения
ее ненулевых элементов распределены по нормальному закону со средним, равным нулю, и
дисперсией 1.
Матрица вида R = sprandsym(n, alpha) - это случайная симметрическая разреженная
матрица, которая имеет приблизительно alpha х m х n ненулевых элементов, распределенных
по нормальному закону, где alpha - коэффициент заполнения со значением в пределах 0<=
alpha<= 1 и каждый элемент сформирован в виде суммы нескольких нормально
распределенных чисел.
Матрица R = sprandsym(n, alpha, rcond) имеет число обусловленности по отношению к
операции обращения, равное rcond. Значения случайных элементов находятся в пределах [-1
1] и симметричны относительно нуля, однако закон распределения не является
равномерным. Если rcond - вектор длины n, то матрица R имеет собственные значения,
равные элементам вектора rcond; таким образом, если вектор rcond имеет положительные
элементы, то матрица R является положительно определенной. В любом случае матрица R
генерируется с помощью матриц случайных плоских вращений (матриц Якоби), которые
применяются к диагональной матрице с заданным спектром собственных значений или
числом обусловленности. Такие матрицы играют важную роль при анализе алгебраических и
топологических структур.
Матрица R = sprandsym(n, alpha, rcond, kind) всегда является положительно
определенной:
если kind = 1, то матрица R формируется из положительно определенной
диагональной матрицы с помощью матриц случайных плоских вращений с точно
заданным числом обусловленности;
если kind = 2, то матрица R формируется как смещенная сумма матриц внешних
произведений; число обусловленности не соответствует заданному, но структура по
сравнению с предыдущим случаем более компактна (участвует меньшее число
поддиагоналей);
если kind = 3, то предполагается форма R = sprandsym(S, alpha, rcond, 3) и матрица R
имеет ту же структуру, которую имеет и матрица S, и число обусловленности
приближенно равно 1/rcond, значение коэффициента заполнения alpha игнорируется.
Сопутствующие функции: SPRANDN.
Определение индексов ненулевых элементов
FIND
Синтаксис:
Описание:
k = find(x)
k = find(<условие>)
[i, j] = find(X)
[i, j] = find(<условие>)
[i, j, s] = find(X)
[i, j, s] = find(<условие>)
115
Функция k = find(x) определяет индексы ненулевых элементов вектора x; если таких
элементов нет, то результатом является пустой вектор. Если входом является матрица X, то
при данном способе вызова функции find она рассматривается как вектор-столбец x(i),
образованный объединением столбцов исходной матрицы.
Функция [i, j] = find(X) возвращает индексы строк и столбцов ненулевых элементов
матрицы X; часто используется при работе с разреженными матрицами.
Функция [i, j, s] = find(X) возвращает индексы, а также вектор-столбец s ненулевых
элементов матрицы X.
Если в качестве аргумента функции find используется условие, то первые две
функции обладают теми же свойствами, а функция [i, j, s] = = find(<условие>) будет
формировать в качестве вектора s вектор единиц вместо значений ненулевых элементов.
Пример:
Пусть
M = magic(3)
M= 8 1 9
3 5 7
4 9 2
Тогда применение функции find в форме
[i, j, m] = find(M); [i j m]
дает результат
ans = 1
1 8
2
1 3
3
1 4
1
2 1
2
2 5
3
2 9
1
3 6
2
3 7
3
3 2
а в случае
[i, j, m] = find(M > 6); [i j m]
получим
ans =
1 1 1
3 2 1
2 3 1
Сопутствующие функции: SPARSE, NONZEROS, RELOP (операции отношения).
FULL
Преобразование разреженной матрицы в полную
Синтаксис:
A = full(S)
Описание:
Функция A = full(S) изменяет способ хранения матрицы в памяти компьютера; если
исходная матрица A была полной, то функция full(A) возвращает A.
Пусть X - матрица размера m х n c nz = nnz(X) ненулевыми элементами. Тогда для
размещения выхода функции full(X) требуется пространство для m * n действительных
чисел, в то время как входная разреженная матрица sparse(X) требует пространства для
размещения только nz действительных и nz + n целых чисел. Большинству компьютеров для
116
хранения действительного числа нужно вдвое больше памяти, чем для целого. Для таких
компьютеров хранение в форме sparse(X) будет экономичнее, чем в форме full(X), если
коэффициент заполнения nnz/(m х n) < 2/3. Однако обработка разреженных матриц требует
существенно большего числа операций, чем полных, так что коэффициент заполнения
должен быть существенно меньше, чем 2/3, чтобы работа с разреженной матрицей оказалась
более эффективной.
Пример:
Рассмотрим разреженную матрицу с коэффициентом заполнения около 2/3.
S = sparse(rand(200,200) < 2/3);
A = full(S); whos
Size
Elements
Bytes
Density
Name
Complex
(размер
(количество (размер (коэффициент
(переменная)
(комплексная)
массива) элементов) памяти) заполнения)
A
200 by 200 40000
320000
Full
No
S
200 by 200 26797
322364 0.6699
No
В этом случае функции sparse(S) и full(S) требуют приблизительно одинакового
объема памяти для хранения элементов.
Сопутствующие функции: SPARSE.
Преобразование данных в ASCII-формате в массив
SPCONVERT
разреженной структуры
Синтаксис:
S = spconvert(D)
Описание:
Обычные функции load и save поддерживают работу с массивами разреженной
структуры, поэтому нет необходимости вводить специальные команды для загрузки и
выгрузки разреженных массивов. Однако если внешний файл содержит данные о массиве
разреженной структуры в ASCII-формате, то требуется преобразование этих данных во
внутреннюю форму хранения. Предполагается, что внешний файл может быть организован в
виде массива со структурой [i j s] или [i j r s], а число строк должно быть равно nnz или nnz +
1. Массив с тремя столбцами соответствует действительным элементам, а с четырьмя
столбцами - комплексным. Последняя строка массива типа [m n 0] или [m n 0 0] может
служить для задания размеров разреженной матрицы.
Функция spconvert применяется только для .mat- и ASCII-файлов. Если матрица D
имеет разреженную структуру, то никаких преобразований не требуется.
Пример:
Допустим, что ASCII-файл uphill.dat содержит следующий массив данных:
1
1
1.000000000000000
1
2
0.500000000000000
2
2
0.333333333333333
1
3
0.333333333333333
2
3
0.250000000000000
3
3
0.200000000000000
1
4
0.250000000000000
2
4
0.200000000000000
3
4
0.166666666666667
4
4
0.142857142857143
4
4
0.000000000000000
117
Массив состоит из 11 строк.
Последовательность операторов
load uphill.dat
H = spconvert(uphill)
загружает данные и восстанавливает разреженную матрицу sparse(triu(hilb(4))) с
учетом ошибок округления.
В данном случае последняя строка не является необходимой, поскольку размер
матрицы был определен указанием ненулевого элемента (4, 4).
Проверка на принадлежность к классу разреженных матриц
ISSPARSE
Синтаксис:
k = issparse(X)
Описание:
Функция issparse(X) принимает значение 1, если матрица X является разреженной, и
0, если полной.
Поскольку большинство функций системы MATLAB работает корректно с обоими
типами матриц, то на практике применение функции issparse для распознавания типа
матрицы достаточно редко.
Пример:
if issparse(X)
nrm = normest(X)
else
nrm = norm(X)
end
Сопутствующие функции: FULL, SPARSE.
Количество ненулевых элементов
NNZ
Синтаксис:
nz = nnz(S)
Описание:
Функция nnz(S) определяет количество ненулевых элементов в разреженной матрице
S.
Коэффициент заполнения разреженной матрицы, который выводится на экран по
команде whos, определяется по формуле nnz(S)/prod(size(S)).
Поскольку большинство функций системы MATLAB работает корректно с обоими
типами матриц, то на практике применение функции issparse для распознавания типа
матрицы достаточно редко.
Сопутствующие функции: NONZEROS, NZMAX, FIND, ISSPARSE.
NONZEROS
Формирование вектора ненулевых элементов
Синтаксис:
v = nonzeros(S)
Описание:
Функция nonzeros(S) формирует вектор ненулевых элементов матрицы, выбирая их по
столбцам. Эта функция аналогична функции [i, j, v] = find(X), но в отличие от последней
формирует только третий выход v. При этом, как правило, выполняется условие
length(v) = nnz(S) <= nzmax(S) <= prod(size(S)).
Сопутствующие функции: NNZ, NZMAX, FIND, ISSPARSE.
NZMAX
Количество ячеек памяти для размещения ненулевых элементов
118
Синтаксис:
n = nzmax(S)
Описание:
Для полной матрицы F - это общее количество элементов, определяемое
соотношением nzmax(F) = prod(size(F)); для разреженной - это количество ячеек для
размещения ненулевых элементов. Как правило, функции nnz(S) и nzmax(S) дают
одинаковые значения. Однако в случае операций над разреженными матрицами, в результате
которых возникают новые ненулевые элементы, например операций умножения и LUразложения, может быть выделено больше элементов памяти, чем это требуется при данном
конкретном вычислении, то есть всегда выполняется условие nnz(S) <= nzmax(S).
Таким образом, величина nzmax(S) позволяет определить то максимальное
количество элементов, которое может потребоваться при выполнении операций с
разреженными матрицами в общем случае.
Сопутствующие функции: NNZ, NONZEROS, FIND, ISSPARSE.
SPALLOC
Выделить пространство памяти для разреженной матрицы
Синтаксис:
S = spalloc(m, n, nzmax)
Описание:
Функция S= spalloc(m, n, nzmax) создает массив для разреженной матрицы размера m
х n c учетом того, что количество ненулевых элементов не превышает nzmax. Затем матрица
может быть заполнена по столбцам. Функция spalloc(m, n, nzmax) равносильна форме
функции sparse([ ], [ ], [ ], m, n, nzmax).
Пример:
Если известно, что матрица имеет максимум 3 ненулевых элемента на столбец, то
наиболее эффективный способ ее формирования следующий:
S = spalloc(n, n, 3*n);
for j =1:n
S(:, j) = { j-столбец }
end
Сопутствующие функции: SPARSE.
SPFUN
Вычисление функции только для ненулевых элементов
Синтаксис:
f = spfun(„fun‟, S)
Описание:
Функция spfun применяет заданную функцию только к ненулевым элементам
разреженной матрицы. Имя fun - это имя М-файла, в котором задана вычисляемая функция и
который в качестве входного аргумента использует матрицу S.
Пример:
Функция вида f = spfun(„exp‟, S) вычисляет разреженную матрицу с тем же
коэффициентом заполнения, который имеет и матрица S, если не учитывать появления
элементов exp(элементу матрицы S и нулевые элементы становятся единичными.
SPONES
Формирование матрицы связности
Синтаксис:
R = spones(S)
Описание:
Функция spones генерирует для заданной разреженной матрицы матрицу связности,
которая имеет структуру матрицы S, в которой ненулевые элементы заменены на 1.
119
Примеры:
Функция c = sum(spones(S)) вычисляет количество ненулевых элементов каждого
столбца.
Функция r = sum(spones(S‟))‟ вычисляет количество ненулевых элементов каждой
строки. При этом соблюдается условие sum(c) = sum(r) = nnz(S).
Сопутствующие функции: ETREE, TREELAYOUT.
NORMEST
Оценка 2-нормы разреженной матрицы
Синтаксис:
nrm = normest(S)
nrm = normest(S, tol)
[nrm, cnt] = normest(S)
Описание:
Эта функция изначально предназначалась для работы с разреженными матрицами,
хотя она работает корректно и может быть полезна для оценки нормы и больших полных
матриц.
Функция nrm = normest(S) вычисляет оценку 2-нормы матрицы S с относительной
погрешностью 1e - 6 (по умолчанию).
Функция nrm = normest(S, tol) вычисляет оценку 2-нормы матрицы S с заданной
относительной погрешностью tol.
Функция [nrm, cnt] = normest(S) позволяет определить количество использованных
операций.
Алгоритм:
Каждая итерация включает операцию умножения матрицы S на ее
транспонированную S‟. Такие операции выполняются до тех пор, пока две последовательные
оценки нормы не будут различаться в пределах заданной погрешности tol.
Файл normest размещен в каталоге toolbox\matlab\sparfun\normest.m.
Пример:
Матрица W = wilkinson(101) является трехдиагональной матрицей размера 101х101; ее
порядок вполне достаточен, чтобы процедура вычисления нормы norm(full(W)), которая
включает операцию svd(full(W)), проявила некоторые негативные свойства. Время
вычисления на компьютере SPARC 1 cоставляет 4.13 с и определяет точное значение нормы
50,7462. В то же время процедура normest(sparse(W)) требует только 1.56 с и дает оценку
нормы 50,7458.
Сопутствующие функции: СONDEST, NORM, SVD, RCOND.
CONDEST
Оценка числа обусловленности матрицы по 1-норме
Синтаксис:
c = condest(A)
[c, v] = condest(A)
Описание:
Функция c = condest(A) вычисляет оценку числа обусловленности матрицы A по
отношению к операции обращения. Для этого используется метод Хейджера (Hager) в
модификации Хаема (Higham) [1]. Вычисленное значение с является нижней оценкой числа
обусловленности матрицы A по 1-норме.
Функция [c, v] = condest(A), кроме того, вычисляет такой вектор v, который
удовлетворяет соотношению ||Av|| = ||A||||v||/c. Таким образом, для больших c вектор v
является аппроксимацией нуль-вектора матрицы A.
Эта функция применима как к действительным, так и к комплексным полным и
разреженным матрицам.
Пример:
120
Сравнительная оценка нижней границы числа обусловленности
W=wilkinson(101) при применении функций cond, rcond, condest:
cond(W)
rcond(W)
condest(sparse(W))
матрицы
ans = 199.9410
ans = 0.0065
ans = 276.2827
Наилучшая оценка нижней границы вычисляется функцией condest.
Сопутствующие функции: СOND, RCOND, NORMEST.
Ссылки:
1. N.J. Higham. Fortran codes for estimating the one-norm of a real or complex matrix, with
applications to condition estimation//ACM Trans. Math. Soft., 1988, Vol.14.P. 381-396.
SPRANK
Структурный ранг разреженной матрицы
Синтаксис:
r = sprank(S)
Описание:
Функция r = sprank(S) вычисляет структурный ранг разреженной матрицы S. Он
известен также под названиями максимальное сечение (maximum transversal), максимальное
соответствие (maximum assignment) и максимальное совпадение (maximum matching), в
терминах теории графов.
Для величины структурного ранга всегда выполняется условие
sprank(A) х rank(A);
более того, в точной арифметике с вероятностью 1 выполняется условие
sprank(A) == rank(sprandn(A)).
Пример:
Матрица размера 3 х 3 следующего вида
имеет структурный ранг sprank(A) = 2 при любом значении x; что касается ранга
этой матрицы, то rank(A) = 2 всюду, кроме точки x = 3/2, где он равен единице.
Сопутствующие функции: DMPERM, RANK.
GPLOT
Построение графа
Синтаксис:
gplot(A, xy)
gplot(A, xy, lc)
[X, Y] = gplot(A, xy)
Описание:
Функция gplot(A, xy) осуществляет построение графа, заданного массивами A и xy.
Граф G - это множество узлов, пронумерованных от 1 до n, и множество соединений (ребер)
между ними. Для построения графа требуется две матрицы: матрица взаимосвязей A и
матрица координат размещения узлов xy. Матрица взаимосвязей A такова, что ее элемент
A(i, j) = 1, если узел i связан с узлом j; матрица координат узлов размера n х 2 определяет
координаты узлов xy(i, :) = [x(i) y(i)].
Обращение в форме gplot(A, xy, lc) позволяет изменить цвет и тип линий,
соединяющих узлы; по умолчанию принято lc = „r-‟.
Функция вида [X, Y] = gplot(A, xy) формирует массив координат вершин графа,
причем каждая пара вершин определена значениями типа NaN. Эти векторы могут быть
использованы в дальнейшем для построения графа.
Пример:
Граф соединений, описываемый разреженной матрицей связности размера 60 х 60,
напоминающий футбольный мяч или структуру молекулы углерода C 60.
121
Сопутствующие функции: SPY, PLOT, TREEPLOT, TREELAYOUT.
SPY
Визуализировать структуру разреженной матрицы
Синтаксис:
spy(S)
spy(S, „<цвет>„)
Описание:
Функция spy(S) отображает на графике структуру произвольной матрицы S. Эта
функция заменяет функцию format+, которая требует для вывода той же информации
слишком много места на экране терминала.
Функция вида spy(S, „<цвет>„) позволяет изменить цвет выводимых точек по
правилам указания цвета для функции plot.
Сопутствующие функции: GPLOT, PLOT, SYMRCM, SYMMMD.
RANDPERM
Формирование случайных перестановок
Синтаксис:
p = randperm(n)
Описание:
Функция p = randperm(n) выполняет случайную перестановку целых чисел от 1 до n.
Сопутствующие функции: RAND, SPRANDN.
COLPERM
Упорядочение столбцов с учетом их разреженности
Синтаксис:
j = colperm(S)
Описание:
Функция j = colperm(S) возвращает такой вектор перестановок j, что столбцы
матрицы S(:, j) будут упорядочены по возрастанию числа ненулевых элементов. Эту
процедуру целесообразно применять перед тем, как выполнить LU-разложение.
Если S - симметрическая матрица, то оказываются упорядоченными и строки и
столбцы. Если к тому же матрица S является еще и положительно определенной, то такую
процедуру перестановок целесообразно применять перед тем, как выполнить LLTразложение.
Алгоритм:
Алгоритм очень прост, он реализует сортировку столбцов по числу ненулевых
элементов и выглядит следующим образом:
[I, j] = find(S);
[ignore, p] = sort(diff(find(diff([0 j' inf]))));
Примеры:
Рассмотрим матрицу вида
A = [ones(1, n); ones(n-1, 1) speye(n-1, n-1)]
при n = 4
122
A=
.
Ее LU-разложение представляет почти полную матрицу
lu(A)=
.
Функция упорядочения столбцов j = colperm(A) возвращает вектор перестановок j =
[2:n 1], так что матрица A(j, j) имеет следующий вид:
A(j, j) =
,
а ее LU-разложение имеет такую же структуру ненулевых элементов, как исходная матрица
A и массив A(j, j):
lu(A(j, j ) =
.
Сопутствующие функции: COLMMD, SYMMMD, LU, CHOL.
DMPERM
DM-декомпозиция разреженной матрицы
Синтаксис:
p = dmperm(S)
[p, q, r] = dmperm(S)
[p, q, r, s] = dmperm(S)
Описание:
Функция p = dmperm(S) возвращает вектор максимального соответствия; если
исходная матрица S имеет полный столбцовый ранг, то матрица S(p, :) - является квадратной
с ненулевой диагональю. Матрица S(p, :) называется декомпозицией Далмейджа Мендельсона (Dulmage - Mendelsohn) или DM-декомпозицией.
Если S - приводимая матрица, то есть линейная система Sx = b может быть решена
приведением S к верхней блочной треугольной форме, то такое решение может быть найдено
методом обратной подстановки.
Функция [p, q, r] = dmperm(S) определяет такую перестановку строк p и такую
перестановку столбцов q для квадратной матрицы S, что S(p, q) - матрица в верхней
треугольной форме. Третий выходной аргумент r - это целочисленный вектор, который
описывает границы блоков, так что блок k матрицы S(p, q) имеет следующие границы r(k) :
r(k + 1) - 1.
Функция [p, q, r, s] = dmperm(S) определяет такую перестановку строк p и такую
перестановку столбцов q для прямоугольной матрицы S, что S(p, q) - есть матрица в верхней
треугольной форме. Границы k-го блока определяются параметрами r и s согласно
соотношению (r(k) : r(k + 1) -1, s(k) : s(k + 1) -1).
В терминах теории графов диагональные блоки соответствуют компонентам Холла
смежного графа матрицы A.
Сопутствующие функции: SPRANK.
SYMRCM
Синтаксис:
r = symrcm(S)
Описание:
RCM-упорядоченность
123
Функция r = symrcm(S) возвращает такой вектор упорядоченности для
симметрической матрицы S, что S(r, r) будет концентрировать ненулевые элементы вблизи
диагонали. Это хорошее упорядочение как для LU-, так и для LLT-разложения матрицы, что
позволяет отказаться от работы с элементами, удаленными от диагонали. Такое
упорядочение называется упорядочением Катхилла - Макки (Cuthill - McKee).
Для действительных симметрических разреженных матриц собственные значения S(r,
r) совпадают с собственными значениями S, но времени на вычисление eig(S(r, r)) будет
затрачиваться существенно меньше, чем для eig(S).
Пример:
Рассмотрим матрицу bucky размера 60 х 60, которую связывают с футбольным мячом,
куполом (Buckminster Fuller dome, отсюда название bucky), а в последнее время - с моделью
атома углерода C60. Ее граф имеет 60 вершин, которые пронумерованы так, что половина из
них находится в одной, а половина в другой полусфере (рис. а), и эти половины соединены
вместе. Такая нумерация приводит к структуре матрицы, изображенной на рис. б.
а)
б)
Применяя RCM-упорядочение
p = symrcm(B);
R = B(p, p);
spy(R)
получим матрицу с узкой полосой вблизи диагонали (рис. в), ширина которой может быть
вычислена следующим образом:
[i, j] = find(B);
bw = max(i - j) + 1
Ширина полосы матрицы A равна 35, а матрицы R - 12.
в)
Сопутствующие функции: COLMMD, COLPERM, LU, CHOL, EIG, \.
Ссылки:
1. George A., Liu J. Сomputer Solution of Large Sparse Positive Definite Systems. PrenticeHall, 1981.
2. Gilbert J. R., Moler C., Schreiber R. Sparse Matrices in MATLAB: Design and
Implementation//SIAM Journal on Matrix Analysis and Applications. 1992. Vol. 13. P. 333-356.
COLMMD
Упорядочение по разреженности столбцов
124
Синтаксис:
p = colmmd(S)
Описание:
Функция p = colmmd(S) возвращает такой вектор упорядоченности столбцов для
несимметрической матрицы S, что S(:, p) будет иметь более разреженное LU-разложение,
чем S.
Такое упорядочение автоматически применяется системой MATLAB при выполнении
операций обращения \ и / при решении систем линейных уравнений с разреженными
матрицами.
Алгоритм:
Алгоритм упорядочения по разреженности столбцов для симметрических матриц
описан в обзоре Джорджа (George) и Лиу (Liu) [1]. Для несимметрических матриц
аналогичный алгоритм разработан заново и описан в работе Гилберта (Gilbert), Моулера
(Moler) и Шрайбера (Schriber) [2]. Он напоминает прежний алгоритм для матрицы A‟ * A, но
в действительности такая матрица не формируется.
На каждом шагу алгоритма из оставшихся выбирается вершина низшего порядка, то
есть столбец, имеющий минимальное количество ненулевых элементов, удаляет эту вершину
и строит новый граф, объединяя строки. После n шагов все столбцы оказываются
удаленными и перестановка завершается. Для ускорения этого процесса используются
специальные приемы для одновременного выполнения нескольких шагов.
Пример:
Коллекция разреженных матриц фирмы Harwell-Boeing включает тестовую матрицу
abb313. Это прямоугольная матрица размера 313 х 176, связанная с задачей оценки по методу
наименьших квадратов геодезических данных. При решении задачи возникает
вспомогательная матрица S, генерируемая функцией spaugment. Она является квадратной и
имеет порядок 489.
load abb313.mat
S = spaugment(abb313);
p = colmmd(S);
spy(S)
spy(S(:, p))
spy(lu(S))
spy(lu(S(:, p))
lu(S) lu(S(:, p))
в)
г)
Сопутствующие функции: SYMMMD, SYMRCM, COLPERM, LU, SPPARMS.
Ссылки:
1. George A., Liu J. The evolution of the minimum degree ordering algorithm//SIAM
Review. 1989. Vol. 31. P. 1-19.
2. Gilbert J. R., Moler C., Schreiber R. Sparse Matrices in MATLAB: Design and
Implementation//SIAM Journal on Matrix Analysis and Applications. 1992. Vol. 13. P. 333-356
SYMMMD
Симметрическая упорядоченность
Синтаксис:
p = symmmd(S)
Описание:
Функция p = symmmd(S) возвращает такой вектор упорядоченности столбцов для
симметрической положительно определенной матрицы S, что S(:, p) будет иметь более
разреженное LLT-разложение, чем S.
125
Такое упорядочение автоматически применяется системой MATLAB при выполнении
операций обращения \ и / при решении линейных систем с разреженными матрицами.
Алгоритм:
Алгоритм упорядочения для симметрических матриц основан на алгоритме
упорядочения по разреженности столбцов. Фактически функция symmmd формирует
матрицу K с такой структурой ненулевых элементов, что симметрическая матрица K‟ * K
имеет такую же структуру ненулевых элементов, как и исходная матрица S, а затем
вызывается функция colmmd для K.
Пример:
Сравним два алгоритма упорядочения, реализованные в виде функций symrcm и
symmmd, которые предшествуют LLT-разложению (разложение Холецкого) матрицы bucky
размера 60 х 60, которая описывает граф связности bucky (рис. а) и имеет структуру (рис. б).
Хотя эта задача и не является очень сложной, тем не менее поведение алгоритмов
упорядочения является типичным. Применение функции symrcm порождает ленточную
матрицу (рис. в), которая после LLT-разложения оказывается целиком заполненной внутри
ленты (рис. д). Применение функции symmmd порождает ленточную матрицу с крупными
блоками нулевых элементов (рис. г), которые не заполняются и в процессе LLT-разложения
(рис. е). Следовательно, алгоритм симметрической разреженности требует меньшего
времени и объема памяти в процессе LLT-разложения.
Сопутствующие функции: COLMMD, SYMRCM, COLPERM, CHOL, SPPARMS.
Ссылки:
1. Gilbert J. R., Moler C., Schreiber R. Sparse Matrices in MATLAB: Design and
Implementation//SIAM Journal on Matrix Analysis and Applications. 1992. Vol. 13. P. 333-356.
а)
б)
в)
г)
126
Дерево матрицы
ETREE
Синтаксис:
p = etree(A)
[p, q] = etree(A)
p = etree(A, „col‟)
[p, q] = etree(A, „col‟)
p = etree(A, „sym‟)
[p, q] = etree(A, „sym‟)
Описание:
Функция p = etree(A) возвращает структуру дерева для квадратной симметрической
матрицы A; значение p(j) - это родитель столбца с номером j в дереве; если p(j) = 0, то
столбец j - корень дерева.
Функция p = etree(A, „col‟) возвращает структуру дерева для матрицы A‟ * A.
Функция p = etree(A, „sym‟) равносильна функции p = etree(A).
Функция [p, q] = etree(A, ...) в дополнение к структуре дерева возвращает также вектор
перестановок столбцов q.
Пример:
Рассмотрим матрицу A следующего вида:
A=
.
Эта матрица симметрическая и применение функции etree дает следующий результат:
[p, q] = etree(A)
p= 4 0 0 0
q= 2 3 1 4
Сопутствующие функции: ETREEPLOT, TREELAYOUT, TREEPLOT.
ETREEPLOT
Построение дерева матрицы
Синтаксис:
etreeplot(A)
etreeplot(A, c, d)
Описание:
Функция etreeplot(A) строит дерево для квадратной матрицы A; если матрица
несимметрическая - то для A + A‟.
Функция etreeplot(A, c, d) в дополнение к построению дерева для квадратной матрицы
A позволяет управлять путем задания параметров c и d соответственно цветом и символами
обозначения узлов и ребер. Если один из параметров заменен на „‟, то на график не будут
выводиться либо ребра, либо узлы. Если эти параметры не указаны, то принимаются их
значения по умолчанию.
Пример:
Рассмотрим матрицу A следующего вида:
A=
.
Эта матрица симметрическая, и применение функций etree и etreeplot дает следующие
результаты:
[p, q] = etree(A)
etreeplot(A)
p= 4 0 0 0
q= 2 3 1 4
На рисунке показан график соответствующего дерева.
127
Сопутствующие функции: ETREE, TREELAYOUT, TREEPLOT.
Разметить дерево
TREELAYOUT
Синтаксис:
[x, y, h, s] = treelayout(p, q)
Описание:
Функция [x, y, h, s] = treelayout(p, q) использует в качестве входных параметров
вектор p(j), отождествляемый либо с родителем столбца с номером j в дереве, либо с корнем
дерева, если p(j) = 0, а также вектор q перестановки столбцов. Если вектор q не указан, то он
вычисляется в процессе выполнения функции.
Выходные параметры x и y - это векторы координат узлов дерева, которое
размещается в пределах единичного квадрата, чтобы сделать график удобным для
восприятия.
Дополнительные выходные параметры h и s определяют соответственно высоту и
количество узлов.
Эту функцию целесообразно использовать в сочетании с функцией построения графа
gplot.
Пример:
Рассмотрим матрицу A следующего вида:
A=
.
Эта матрица симметрическая, и применение функций etree, treelayout и gplot дает
следующие результаты:
[p, q] = etree(A)
[x, y, h, s] = treelayout(p, q)
gplot(A, [x' y'],'r-'), hold on
gplot(A, [x' y'], 'go')
p= 4 0 0 0
q= 2 3 1 4
На рисунке показан график соответствующего дерева.
Сопутствующие функции: ETREE, ETREEPLOT, TREEPLOT.
TREEPLOT
Синтаксис:
Построение дерева матрицы
128
treeplot(p)
treeplot(p, c, d)
Описание:
Функция treeplot(p) строит дерево, если задан вектор p(j), отождествляемый либо с
родителем столбца с номером j в дереве, либо с корнем дерева, если p(j) = 0.
Функция treeplot(p, c, d) в дополнение к построению дерева позволяет управлять
цветом и символами обозначения узлов и ребер путем задания соответственно параметров c
и d. Если один из параметров заменен на “, то на график не будут выводиться либо ребра,
либо узлы. Если эти параметры не указаны, то принимаются их значения по умолчанию.
Пример:
Рассмотрим матрицу А следующего вида:
A=
.
Эта матрица симметрическая, и применение функций etree и treeplot дает следующие
результаты:
[p, q] = etree(A)
treeplot(p, „bo‟, „r‟)
p= 4 0 0 0
q= 2 3 1 4
На рисунке показан график соответствующего дерева.
Сопутствующие функции: ETREE, TREELAYOUT, ETREEPLOT.
Установка параметров для алгоритмов упорядочения и
SPPARMS
прямого решения линейных уравнений для разреженных
матриц
Синтаксис:
spparms
values = spparms
[keys, values] = spparms
value = spparms(„<ключ>„)
spparms(„<ключ>„, <значение>)
spparms(<значения>)
Описание:
Работа с разреженными матрицами в системе MATLAB организована с помощью
специального монитора SParse MONItor. Большинству пользователей знание служебных
команд работы с монитором совершенно не обязательно. Эти команды предназначены
только для тех пользователей, которые хотели бы увидеть и, возможно, изменить работу
алгоритмов упорядочения и решения систем линейных уравнений.
Функция spparms сама по себе выводит на экран описания текущих установок.
Функция values = spparms выводит на экран значения этих установок.
Функция [keys, values] = spparms выводит вектор значений и символьную матрицу,
строки которой являются ключами параметров монитора SParse MONItor.
Функция value = spparms(„<ключ>„) выводит значение параметра для данного ключа.
129
Функция spparms(„<ключ>„, <значение>) устанавливает один или более
настраиваемый параметр, который используется в функциях упорядочения colmmd и
symmmd, а также в операциях решения систем линейных уравнений / и \.
Функция spparms(values) применяется без выходных параметров и устанавливает
значения, указанные во входном векторе.
Функция spparms(„default‟) устанавливает значения по умолчанию.
Функция spparms(„tight‟) устанавливает параметры алгоритмов упорядочения по
разреженности к наиболее “строгим” значениям, что приводит к процедурам упорядочения
без удаления строк, которые требуют большего времени выполнения.
В нижеследующей таблице приведены расшифровки ключей для параметров и их
значений по умолчанию и в “строгом смысле”.
Параметр
Ключ
Значения
по умолчанию в “строгом смысле”
values(1)
`spumoni`
0.0
values(2)
`thr_rel`
1.1
1.0
values(3)
`thr_abs`
1.0
0.0
values(4)
`exact_d`
0.0
1.0
values(5)v `supernd`
3.0
1.0
values(6)
`rreduce`
3.0
1.0
values(7)
`wh_frac`
0.5
0.5
values(8) `autommd`
1.0
values(9)
Ключи
`aug_rel`
0.001
values(10) `aug_abs`
0.0
При этом ключи имеют следующие значения:
Значение
`spumoni` Флаг монитора SParse MONItor:
0 - не выводит диагностических сообщений, по умолчанию;
1 - выводит информацию о выбранном алгоритме;
2 - выводит детальную информацию о работе алгоритмов упорядочения
`thr_rel`,
`thr_abs`
Порог минимальной разреженности
thr_rel * mindegree + thr_abs
`exact_d`
0 - использование приближенных значений разреженности;
0 - использование точных значений разреженности
`supernd`
Целое >= 1 - объединение узлов каждые supernd шагов
`rreduce`
Целое >= 1 - удаление строк каждые rreduce шагов
`wh_frac` В процедуре colmmd строки с коэффициентом заполнения, превышающим
wh_frac, пропускаются
`autommd`
0 - в процедурах \ и / использовать упорядочение по разреженности
`aug_rel`, Параметр масштабирования невязки в проблеме наименьших квадратов, равный
`aug_abs` aug_rel * max(max(abs(A))) + aug_abs.
Например, при значениях aug_rel = 0 и aug_abs = 1 единичная матрица главного
верхнего блока будет немасштабированной
Примеры:
130
Ниже приведены примеры выполнения вспомогательных операций и указан русский
перевод сообщений системы.
spparms (для значений по умолчанию)
Выходных данных SParse MONItor не
No SParse MONItor output.
формирует
mmd: threshold = 1.1 * mindegree + 1, using
approximate degrees in A'*A,
mmd: <порог> = 1.1 * mindegree + 1;
приближенные значения разреженности при
работе с A'*A;
supernode amalgamation every 3 stages,
объединение узлов - каждые 3 шага;
row reduction every 3 stages,
редукция строк - каждые 3 шага;
withhold rows at least 50% dense in colmmd.
удерживать строки с разреженностью не
менее 50 %.
Minimum degree orderings used by \ and /.
Для операций \ и / применять упорядочение
по разреженности.
Residual scale parameter = 0.001 * max(abs(A)). Параметр невязки: 0.001 * max(abs(A)).
[keys, values] = spparms
keys =
values =
spumoni
0
thr_rel
1.1000
thr_abs
1.0000
exact_d
0
supernd
3.0000
rreduce
3.0000
wh_frac
0.5000
autommd
1.0000
aug_rel
0.0010
aug_abs
0
value = spparms('spumoni')
value = 0.
Сопутствующие функции: COLMMD, SYMMMD, \.
Ссылки:
1. Gilbert J. R., Moler C., Schreiber R. Sparse Matrices in MATLAB: Design and
Implementation//SIAM Journal on Matrix Analysis and Applications. 1992. Vol. P. 333-356.
SYMBFACT
Характеристики разложения Холецкого
Синтаксис:
count = symbfact(A)
count = symbfact(A, f)
[count, h, parent, post, R] = symbfact(A, f)
Описание:
Функция count = symbfact(A) вычисляет количество элементов в строках верхнего
треугольного множителя разложения Холецкого исходной симметрической матрицы A. Эта
функция выполняется значительно быстрее, чем chol(A).
Функция count = symbfact(A, `col`) анализирует матрицу A‟*A, не формируя ее в
явном виде.
Функция count = symbfact(A, `sym`) аналогична процедуре count = symbfact(A).
131
Функция [count, h, p, q, R] = symbfact(A, f) возвращает несколько дополнительных
выходных параметров:
h - высоту графа;
p - параметры графа;
q - вектор перестановки столбцов;
R - матрицу связности для процедуры chol(A).
Пример:
Рассмотрим матрицу A следующего вида:
A=
.
Эта симметрическая положительно определенная матрица, и применение функции
chol(A) дает следующий результат:
L = chol(A)
L=
2.0000 0
0
0.5000
0
1.0000
0
0
0
0
1.0000 0
0
0
0
0.8660
Применение функции symbfact(A) вычисляет количество элементов в строках матрицы L:
с = symbfact(A)
c= 2 1 1 1
Если к матрице A применить алгоритм симметрической упорядоченности, то
ненулевые элементы в разложении Холецкого будут концентрироваться вблизи диагонали.
Рассмотрим последовательность процедур
r = symmmd(A);
L = chol(A(r, r))
L=
1.0000 0
0
0
0
1.0000 0
0
0
0
0
2.0000 0.5000
0
0
0.8660
c = symbfact(A(r, r))
c= 1 1 2 1
Обращение вида [count, h, p, q, R] = symbfact(A) вычисляет параметры для построения
графа матрицы. Следующая последовательность операторов позволяет построить граф с
пронумерованными вершинами.
[c, h, p, q] = symbfact(A)
[x, y] = treelayout(p, q);
gplot(A, [x' y'], 'bo'), hold on
gplot(A, [x' y'], 'r')
for j=1:size(A, 1)
text(x(j) + 0.02,y(j) + 0.02,int2str(j))
end
c= 2 1 1 1
h=2
132
p= 4 0
q= 2 3
0 0
1 4
Сопутствующие функции: CHOL, ETREE.
Формирование расширенной матрицы для метода
SPAUGMENT
наименьших квадратов
Синтаксис:
S = spaugment(A)
S = spaugment(A, c)
Описание:
Функции S = spaugment(A) и S = spaugment(A, c) формируют разреженную
квадратную симметрическую матрицу следующей блочной структуры:
S = [c*I A; A‟ 0].
Такая расширенная матрица используется для минимизации квадратичной формы
.
Если r = b - Ax выполняет роль невязки, а c - масштабирующий множитель, то
решение методом наименьших квадратов сводится к решению следующей системы
линейных уравнений:
.
Если исходная матрица A имеет размер m х n, то расширенная матрица S имеет
размер (m + n) х (m + n). В обозначениях системы MATLAB эту систему можно описать так:
S * [r/c; x] = [b; z],
где z = zeros(n, 1).
Определение оптимального значения для масштабного множителя с основано на
вычислении значений min(svd(A)) и norm(r), что требует больших объемов расчетов. Если
значение c не указано явно в виде второго параметра, то по умолчанию применяется
значение max(abs(A)))/1000. Можно изменить это значение, если воспользоваться функцией
spparms и задать другие значения для ключей aug_rel и aug_abs.
Операция решения систем линейных уравнений x = A\b автоматически формирует
расширенную матрицу, определяя значение c по умолчанию.
Пример:
Рассмотрим простую систему из трех уравнений с двумя неизвестными.
x1 + 2x2 = 5;
3x1 = 6;
4x2 = 7.
Поскольку эта система небольших размеров, она может быть решена с
использованием обычных конструкций системы MATLAB, в данном случае - полных
матриц:
A = [ 1 2; 3 0; 0 4];
b = [5 6 7]‟;
x = A \ b.
В результате получаем следующее решение по методу наименьших квадратов:
133
x=
1.9592
1.7041
Подход на основе расширенной матрицы использует функцию spaugment:
S = spaugment(A, 1),
которая формирует вспомогательную матрицу следующего вида:
full(S) =
.
В этом примере использовано значение масштабного множителя c = 1 и для удобства
чтения распечатана полная матрица S. Даже в этом простом примере более половины
элементов матрицы S равны нулю.
Вспомогательная система использует также расширенный вектор для правой части,
который формируется в виде
y = [b; 0; 0];
в результате решение вычисляется с помощью оператора решения системы линейных
уравнений
z = S \ y,
где все матрицы являются квадратными, и для решения применяется метод
исключения Гаусса вместо ортогонализации. В случае разреженных матриц при таком
подходе используются меньшие объемы оперативной памяти.
Вычисленное решение имеет вид:
z=
-0.3673
0.1224
0.1837
1.9592
1.7041
Здесь первые 3 компонента характеризуют вектор невязки r, а последние 2
компонента определяют решение x, которое совпадает с приведенным выше.
Сопутствующие функции: SPPARMS, \.
Графические команды и функции
Начиная с версии 4.0 в состав системы MATLAB входит мощная графическая
подсистема, которая поддерживает как средства визуализации двумерной и трехмерной
графики на экран терминала, так и средства презентационной графики. Следует выделить
несколько уровней работы с графическими объектами. В первую очередь это команды и
функции, ориентированные на конечного пользователя и предназначенные для построения
графиков в прямоугольных и полярных координатах, гистограмм и столбцовых диаграмм,
трехмерных поверхностей и линий уровня, анимации. Графические команды высокого
уровня автоматически контролируют масштаб, выбор цветов, не требуя манипуляций со
свойствами графических объектов. Соответствующий низкоуровневый интерфейс
обеспечивается дескрипторной графикой, когда каждому графическому объекту ставится в
соответствие графическая поддержка (дескриптор), на который можно ссылаться при
обращении к этому объекту. Используя дескрипторную графику, можно создавать меню,
кнопки вызова, текстовые панели и другие объекты графического интерфейса.
Из-за ограниченного объема данного справочного пособия в него включены только
графические команды и функции с минимальными элементами дескрипторной графики.
Заинтересованному читателю следует обратиться к документации по системе MATLAB, и в
134
первую очередь к только что вышедшей из печати книге “Using MATLAB Graphics” (Natick,
1996).
Элементарные графические функции системы MATLAB позволяют построить на
экране и вывести на печатающее устройство следующие типы графиков: линейный,
логарифмический, полулогарифмический, полярный.
Для каждого графика можно задать заголовок, нанести обозначение осей и
масштабную сетку.
Двумерные графики
PLOT - график в линейном масштабе
LOGLOG - график в логарифмическом масштабе
SEMILOGX, SEMILOGY - график в полулогарифмическом масштабе
POLAR - график в полярных координатах
Трехмерные графики
В системе MATLAB предусмотрено несколько команд и функций для построения
трехмерных графиков. Значения элементов числового массива рассматриваются как zкоординаты точек над плоскостью, определяемой координатами x и y. Возможно несколько
способов соединения этих точек. Первый из них - это соединение точек в сечении (функция
plot3), второй - построение сетчатых поверхностей (функции mesh и surf). Поверхность,
построенная с помощью функции mesh, - это сетчатая поверхность, ячейки которой имеют
цвет фона, а их границы могут иметь цвет, который определяется свойством EdgeColor
графического объекта surface. Поверхность, построенная с помощью функции surf, - это
сетчатая поверхность, у которой может быть задан цвет не только границы, но и ячейки;
последнее управляется свойством FaceColor графического объекта surface. Уровень
изложения данной книги не требует от читателя знания объектно-ориентированного
программирования. Ее объем не позволяет в полной мере описать графическую подсистему,
которая построена на таком подходе. Заинтересованному читателю рекомендуем обратиться
к документации по системе MATLAB, и в первую очередь к только что вышедшей из печати
книге Using MATLAB Graphics (Natick, 1996).
PLOT3 - построение линий и точек в трехмерном пространстве
MESHGRID - формирование двумерных массивов X и Y
MESH, MESHC, MESHZ - трехмерная сетчатая поверхность
SURF, SURFC - затененная сетчатая поверхность
SURFL - затененная поверхность с подсветкой
AXIS - масштабирование осей и вывод на экран
GRID - нанесение сетки
HOLD - управление режимом сохранения текущего графического окна
SUBPLOT - разбиение графического окна
ZOOM - управление масштабом графика
COLORMAP - палитра цветов
CAXIS - установление соответствия между палитрой цветов и масштабированием
осей
SHADING - затенение поверхностей
CONTOURC - формирование массива описания линий уровня
CONTOUR - изображение линий уровня для трехмерной поверхности
CONTOUR3 - изображение трехмерных линий уровня
Надписи и пояснения к графикам
135
TITLE - заголовки для двух- и трехмерных графиков
XLABEL, YLABEL, ZLABEL - обозначение осей
CLABEL - маркировка линий уровня
TEXT - добавление к текущему графику текста
GTEXT - размещает заданный текст на графике с использованием мыши
LEGEND - пояснение к графику
COLORBAR - шкала палитры
Специальная графика
Раздел специальной графики включает графические команды и функции для
построения столбцовых диаграмм, гистограмм, средств отображения векторов и
комплексных элементов, вывода дискретных последовательностей данных, а также
движущихся траекторий как для двумерной, так и для трехмерной графики. Этот раздел
получил свое дальнейшее развитие в версии системы MATLAB 5.0, где специальные
графические средства улучшены и существенно расширены.
BAR - столбцовые диаграммы
ERRORBAR - график с указанием интервала погрешности
HIST - построение гистограммы
STEM - дискретные графики
STAIRS - ступенчатый график
ROSE - гистограмма в полярных координатах
COMPASS, FEATHER - графики векторов
QUIVER - поле градиентов функции
COMET - движение точки по траектории
FILL - закраска многоугольника
COMET3 - движение точки по пространственной траектории
SLICE - сечения функции от трех переменных
WATERFALL - трехмерная поверхность
FILL3 - закраска многоугольника в трехмерном пространстве
VIEWMTX - вычисление матрицы управления углом просмотра
VIEW - управление положением точки просмотра
PLOT
График в линейном масштабе
Синтаксис:
plot(y)
plot(x, y)
plot(x, y, s)
plot(x1, y1, s1, x2, y2, s2, ...)
Описание:
Команда plot(y) строит график элементов одномерного массива y в зависимости от
номера элемента; если элементы массива y комплексные, то строится график plot(real(y),
imag(y)). Если Y - двумерный действительный массив, то строятся графики для столбцов; в
случае комплексных элементов их мнимые части игнорируются.
Команда plot(x, y) соответствует построению обычной функции, когда одномерный
массив x соответствует значениям аргумента, а одномерный массив y - значениям функции.
Когда один из массивов X или Y либо оба двумерные, реализуются следующие построения:
если массив Y двумерный, а массив x одномерный, то строятся графики для столбцов
массива Y в зависимости от элементов вектора x;
136
если двумерным является массив X, а массив y одномерный, то строятся графики
столбцов массива X в зависимости от элементов вектора y;
если оба массива X и Y двумерные, то строятся зависимости столбцов массива Y от
столбцов массива X.
Команда plot(x, y, s) позволяет выделить график функции, указав способ отображения
линии, способ отображения точек, цвет линий и точек с помощью строковой переменной s,
которая может включать до трех символов из следующей таблицы:
Тип линии
Тип точки
Цвет
Непрерывная
-
Точка
Желтый
y
Штриховая
-- Плюс
+ Фиолетовый
m
Двойной пунктир
:
Звездочка
*
Голубой
c
Штрих-пунктирная
-.
Кружок
o
Красный
r
Крестик
х
Зеленый
g
Синий
b
Белый
w
Черный
k
.
Если цвет линии не указан, он выбирается по умолчанию из шести первых цветов, с
желтого до синего, повторяясь циклически.
Команда plot(x1, y1, s1, x2, y2, s2, ...) позволяет объединить на одном графике
несколько функций y1(x1), y2(x2), ..., определив для каждой из них свой способ
отображения.
Обращение к командам plot вида plot(x, y, s1, x, y, s2) позволяет для графика y(x)
определить дополнительные свойства, для указания которых применения одной строковой
переменной s1 недостаточно, например при задании разных цветов для линии и для точек на
ней.
Примеры:
Построим график функции y = sin(x) на отрезке [] с шагом /500:
x = -pi:pi/500:pi;
y = sin(x);
plot(y) % рис. а
plot(x, y) % рис. б
График на рис. а отображает значения одномерного массива y, состоящего из 1001
элемента, как функцию от номера элемента; график на рис. б отображает значения того же
массива как функцию элементов массива x.
а)
137
б)
Рассмотрим различные способы применения функции plot(x, y) на примере графиков
двух функций y1 = sin(x) и y2 = xsin(x):
x1 = -pi:pi/500:pi;
y1 = sin(x1);
y2 = x1.*sin(x1);
plot(x1',[y1' y2']) % рис. в
plot( [y1' y2'], x1') % рис. г
в)
г)
x2 = x1/2;
y2 = x2.*sin(x2);
plot([x1' x2'], [y1' y2']) % рис. д
138
д)
Сопутствующие функции и команды: LOGLOG, SEMILOGX, SEMILOGY, POLAR.
LOGLOG
График в логарифмическом масштабе
Синтаксис:
loglog(x, y)
loglog(x, y, s)
loglog(x1, y1, s1, x2, y2, s2, ...)
Описание:
Команды loglog(...) равносильны функциям plot, за исключением того, что они
используют по обеим осям логарифмический масштаб вместо линейного.
Примеры:
Построим график y = exp(x) в логарифмическом масштабе:
x = logspace(-1, 2);
loglog(x, exp(x))
grid
Сопутствующие функции и команды: PLOT, SEMILOGX, SEMILOGY.
SEMILOGX,
SEMILOGY
Синтаксис:
semilogx(x, y)
semilogx(x, y, s)
График в полулогарифмическом масштабе
semilogy(x, y)
semilogy(x, y, s)
semilogx(x1, y1, s1, x2, y2, s2, ...)
semilogy(x1, y1, s1, x2, y2, s2, ...)
Описание:
Команды semilogx(...) используют логарифмический масштаб по оси x и линейный
масштаб по оси y.
Команды semilogy(...) используют логарифмический масштаб по оси y и линейный
масштаб по оси x.
Примеры:
Построим график y = exp(x) в полулогарифмическом масштабе по оси y:
x = 0:0.1:100;
semilogy(x, exp(x))
grid
139
Сопутствующие функции и команды: PLOT, LOGLOG.
График в полярных координатах
POLAR
Синтаксис:
polar(phi, rho)
polar(phi, rho, s)
Описание:
Команды polar(...) реализуют построение графиков в полярных координатах,
задаваемых углом phi и радиусом pho.
Примеры:
Построим график функции rho = sin(2 * phi) * cos(2 * phi) в полярных координатах
phi = 0:0.01:2 * pi;
polar(phi, sin(2 * phi). * cos(2 * phi))
Сопутствующие функции и команды: PLOT, LOGLOG.
PLOT3
Построение линий и точек в трехмерном пространстве
Синтаксис:
plot3(x, y, z)
plot3(X, Y, Z)
plot3(x, y, z, s)
plot3(x1, y1, z1, s1, x2, y2, z2, s2, ...)
140
Описание:
Команды plot3(...) являются трехмерными аналогами функции plot(...).
Команда plot3(x, y, z), где x, y, z - одномерные массивы одинакового размера, строит
точки с координатами x(i), y(i), z(i) и соединяет их прямыми линиями.
Команда plot3(X, Y, Z), где X, Y, Z - двумерные массивы одинакового размера,
строит точки с координатами x(i, :), y(i, :), z(i, :) для каждого столбца и соединяет их
прямыми линиями.
Команда plot3(x, y, z, s) позволяет выделить график функции z(x, y), указав способ
отображения линии, способ отображения точек, цвет линий и точек с помощью строковой
переменной s, которая может включать до трех символов из следующей таблицы.
Тип линии
Тип точки
Цвет
Непрерывная
-
Точка
Желтый
y
Штриховая
-- Плюс
+ Фиолетовый
m
Двойной пунктир
:
Звездочка
*
Голубой
c
Штрих-пунктирная
-.
Кружок
o
Красный
r
Крестик
х
Зеленый
g
Синий
b
Белый
w
Черный
k
.
Если цвет линии не указан, он выбирается по умолчанию из шести первых цветов, с
желтого до синего, повторяясь циклически.
Команда plot3(x1, y1, z1, s1, x2, y2, z2, s2, ...) позволяет объединить на одном графике
несколько функций z1(x1, y1), z2(x2, y2), ..., определив для каждой из них свой способ
отображения.
Обращение к команде plot3 вида plot3(x, y, z, s1, x, y, z, s2) позволяет для графика z(x,
y) определить дополнительные свойства, для указания которых применения одной строковой
переменной s1 недостаточно, например при задании разных цветов для линии и для точек на
ней.
Примеры:
Построим график функции z = x * exp(-x2 - y2) в трехмерном пространстве.
[ X, Y ] = meshgrid([ -2 : 0.1 : 2 ]);
Z = X .* exp(- X .^ 2 - Y .^ 2);
plot3(X, Y, Z)
Сопутствующие функции и команды: PLOT, AXIS, VIEW, MESH, SURF.
141
Формирование двумерных массивов X и Y
MESHGRID
Синтаксис:
[X, Y] = meshgrid(x, y)
[X, Y] = meshgrid(x)
Описание:
Функция [X, Y] = meshgrid(x, y) задает сетку на плоскости x-y в виде двумерных
массивов X, Y, которые определяются одномерными массивами x и y. Строки массива X
являются копиями вектора x, а столбцы - копиями вектора y. Формирование таких массивов
упрощает вычисление функций двух переменных, позволяя применять операции над
массивами.
Функция [X, Y] = meshgrid(x) представляет собой упрощенную форму записи для
функции [X, Y] = meshgrid(x, x).
Примеры:
Определим двумерные массивы и вычислим функцию
квадрате -2 <= x <= 2, -2 <= y <= 2.
[X, Y] = meshgrid(-2 : 0.2 : 2);
Z = X .* exp(-X .* 2 - Y.* 2);
Сопутствующие функции и команды: MESH, SURF.
MESH,
MESHC,
MESHZ
, заданную на
Трехмерная сетчатая поверхность
Синтаксис:
mesh(X, Y, Z, C) meshc(X, Y, Z, C) meshz(X, Y, Z, C)
mesh(x, y, Z, C ) meshc(x, y, Z, C ) meshz(x, y, Z, C )
mesh(Z, C)
meshc(Z, C)
meshz(Z, C)
mesh(X, Y, Z)
meshc(X, Y, Z)
meshz(X, Y, Z)
mesh(x, y, Z)
meshc (x, y, Z)
meshz(x, y, Z)
mesh(Z)
meshc(Z)
meshz(Z)
Описание:
Команда mesh(X, Y, Z, C) выводит на экран сетчатую поверхность для значений
массива Z, определенных на множестве значений массивов X и Y. Цвета узлов поверхности
задаются массивом C. Цвета ребер определяются свойством EdgeColor объекта surface.
Можно задать одинаковый цвет для всех ребер, определив его в виде вектора [r g b]
интенсивности трех цветов - красного, зеленого, синего. Если определить спецификацию
none, то ребра не будут прорисовываться. Если определить спецификацию flat, то цвет ребер
ячейки определяется цветом того узла, который был первым при обходе этой ячейки.
Поскольку одни и те же ребра обходятся несколько раз, то цвета будут замещаться. Если
определить спецификацию interp, то будет реализована линейная интерполяция цвета между
вершинами ребра.
Применение функции shading после обращения к функции mesh изменяет
спецификации свойств EdgeColor и FaceColor согласно следующей таблице.
Применяемая функция
Свойство
mesh
shading flat
shading interp
EdgeColor
flat
flat
interp
FaceColor
Цвет фона
Цвет фона
Цвет фона
142
Команда mesh(x, y, Z, C) выполняет ту же функцию, но вместо двумерных массивов
X, Y использует их одномерные проекции, так что если length(x) = n, а length(y) = m, то [m, n]
= size(Z). В этом случае узлы сетчатой поверхности определяются тройками {x(j), y(i), Z(i,
j)}, где вектор x определяет столбцы массива Z, а y - строки.
Команда mesh(Z, C) использует сетку, которая определяется одномерными массивами
x = 1 : n и y = 1 : m.
Команды mesh(X, Y, Z), mesh(x, y, Z), mesh(Z) используют в качестве массива цвета C
= Z, то есть цвет в этом случае пропорционален высоте поверхности.
Группа команд meshc(...) в дополнение к трехмерным поверхностям строит проекцию
линий постоянного уровня.
Группа команд meshz(...) в дополнение к трехмерным поверхностям строит плоскость
отсчета на нулевом уровне, закрывая поверхность, лежащую ниже этого уровня.
Функция h = mesh(...) возвращает дескриптор h для графического объекта surface.
Примеры:
Построим трехмерную поверхность функции z = x * exp(-x2 -y2) с проекциями линий
постоянного уровня.
[ X, Y ] = meshgrid([ -2 : 0.1 : 2 ]);
Z = X . * exp(- X .^ 2 - Y .^ 2);
meshc(X, Y, Z)
Теперь построим эту же функцию с пьедесталом отсчета
meshz(X, Y, Z)
Сопутствующие функции и команды: SURF, WATERFALL
SURF,
SURFC
Затененная сетчатая поверхность
Синтаксис:
surf(X, Y, Z, C) surfc(X, Y, Z, C)
surf(x, y, Z, C ) surfc(x, y, Z, C )
surf(Z, C)
surfc(Z, C)
surf(X, Y, Z)
surfc(X, Y, Z)
surf(x, y, Z)
surfc (x, y, Z)
surf(Z)
surfc(Z)
Описание:
Команда surf(X, Y, Z, C) выводит на экран сетчатую поверхность для значений
массива Z, определенных на множестве значений массивов X и Y. Цвет ячейки определяется
массивом C. Цвет ребер - черный, определяется свойством EdgeColor, специфицированным
как [0 0 0]. Можно задать одинаковый цвет для всех ребер, определив его в виде вектора [r g
b] интенсивности трех цветов - красного, зеленого, синего. Если определить спецификацию
none, то ребра не будут прорисовываться.
Применение функции shading после обращения к функции surf изменяет
спецификации свойств EdgeColor и FaceColor графического объекта surface согласно
следующей таблице.
Применяемая функция
Свойство
surf
shading flat
shading interp
EdgeColor
[0 0 0]
none
none
FaceColor
flat
flat
interp
143
Команда surf(x, y, Z, C) выполняет ту же функцию, но вместо двумерных массивов X,
Y использует их одномерные проекции, так что если length(x) = = n, а length(y) = m, то [m, n]
= size(Z). В этом случае узлы сетчатой поверхности определяются тройками {x(j), y(i), Z(i,
j)}, где вектор x определяет столбцы массива Z, а y - строки.
Команда surf(Z, C) использует сетку, которая определяется одномерными массивами x
= 1 : n и y = 1 : m.
Команды surf(X, Y, Z), surf(x, y, Z), surf(Z) используют в качестве массива цвета C = Z,
то есть цвет в этом случае пропорционален высоте поверхности.
Группа команд surfc(...) в дополнение к трехмерным затененным поверхностям строит
проекцию линий постоянного уровня.
Функция h = surf(...) возвращает дескриптор h для графического объекта surface.
Примеры:
Построим трехмерную затененную поверхность функции z = x * exp(-x2 - y2) со
шкалой затененности.
[ X, Y ] = meshgrid([ -2 : 0.1 : 2 ]);
Z = X . * exp(- X .^ 2 - Y .^ 2);
surf(X, Y, Z)
colormap(gray)
shading interp
colorbar
Рассмотрим пример сферы, которая раскрашена в соответствии с матрицей Адамара
(Hadamard), часто используемой в теории кодирования сигналов и составленной только из
двух чисел 1 и -1.
k = 5; n = 2 ^ k - 1;
[X, Y, Z]=sphere(n);
C = hadamard(2 ^ k);
surf(X, Y, Z, C);
colormap([1 1 1; 2/3 2/3 2/3])
colorbar
144
Алгоритм:
В общем виде, для задания поверхности можно использовать два независимых
параметра i и j, которые изменяются непрерывно, например в прямоугольнике 1 <= i <= m, 1
<= j <= n; тогда поверхность будет определяться тремя функциями x(i, j), y(i, j), z(i, j). Когда i
и j целые числа, они задают прямоугольную сетку с целочисленными значениями для узлов.
Функции x(i, j), y(i, j), z(i, j) становятся двумерными массивами X, Y, Z размера m х n.
Четвертая функция - цвет ячеек поверхности c(i, j) задает четвертую матрицу C.
Каждая точка сетчатой поверхности имеет в общем случае четырех соседей, как
показано на следующей схеме.
Такая прямоугольная сетка приводит к разбиению поверхности на ячейки,
ограниченные четырьмя ребрами. Каждый внутренний узел поверхности имеет четырех
соседей, узел на границе - трех, узел в углу поверхности - двух.
Цвет такой сетчатой поверхности может быть задан двумя способами: либо цветом
одной из вершин, либо цветом в центре ячейки.
Рассмотрим, как в этом случае действует функция закраски shading. Если задано
значение shading interp, то цвет ячейки определяется как билинейная функция местных
координат. Если задано значение shading faceted (принято по умолчанию) или shading flat, то
цвет ячейки постоянен и определяется цветом верхней левой вершины, как показано на
следующей схеме:
Сопутствующие функции и команды: MESH, MESHC, SURFL, WATERFALL.
Затененная поверхность с подсветкой
SURFL
Синтаксис:
surfl(X, Y, Z, s)
surfl(Z, s)
surfl(X, Y, Z, s, k)
surfl(Z, s, k)
surfl(X, Y, Z)
surfl(Z)
Описание:
Команда surfl(X, Y, Z, s) выводит на экран затененную поверхность с подсветкой для
значений массива Z, определенных на множестве значений массивов X и Y. Направление на
источник света может быть задано с помощью вектора s = [Sx, Sy, Sz] в декартовых
координатах или вектора s = = [az, elev] в сферических координатах. По умолчанию азимут
az = -37.5°, возвышение elev = 30°. Подсветка учитывает модели рассеяния, отражения и
зеркального эффекта освещения поверхности.
Команда surfl(X, Y, Z, s, k) позволяет управлять параметрами рассеяния, отражения и
зеркального эффекта, используя вектор k = [ka, kd, ks, spread], который учитывает эффекты
отраженного света ka, диффузного отражения kd, зеркального отражения ks и зеркального
распространения spread. По умолчанию вектор k имеет значения [0.55 0.6 0.4 10].
Команда surfl(X, Y, Z) использует значения параметров по умолчанию.
Команды surfl(Z, ...) строят графики, не учитывая истинных значений массивов X и Y.
Из-за того что алгоритм surfl вычисляет нормали к поверхности, необходимо, чтобы
входные матрицы имели размер по крайней мере 3 х 3.
Примеры:
145
Построим изображение функции peaks, используя подсветку.
[X, Y] = meshgrid(-3 : 1/8 : 3);
Z = peaks(X, Y);
surfl(X, Y, Z)
shading interp
colormap(gray)
Сопутствующие функции и команды: SHADING.
Задание осей координат
AXIS
Масштабирование осей и вывод на экран
Синтаксис:
axis([xmin xmax ymin ymax])
axis([xmin xmax ymin ymax zmin zmax])
axis(„auto‟)
axis(axis)
v = axis
axis(„ij‟)
axis(„xy‟)
axis(„square‟)
axis(„equal‟)
axis(„off‟)
axis(„on‟)
[s1, s2, s3] = axis(„state‟)
axis(s1, s2, s3)
Описание:
Команда axis обеспечивает преемственность предшествующих версий системы
MATLAB, ориентированных на символьную обработку, с версиями 4.х, ориентированными
на графический интерфейс.
Команда axis([xmin xmax ymin ymax]) устанавливает масштаб по осям x, y для
активного графического окна.
Команда axis([xmin xmax ymin ymax zmin zmax]) устанавливает масштаб по осям x, y,
z для активного графического окна.
Команда axis('auto') возвращает масштаб по осям к штатным значениям (принятым по
умолчанию).
Команда axis(axis) фиксирует текущие значения масштабов для последующих
графиков, как если бы был включен режим hold.
Функция v = axis возвращает вектор-строку масштабов по осям для активного
графика. Если график двумерный, то v имеет 4 компонента; если трехмерный - 6
компонентов.
Команда axis('ij') перемещает начало отсчета в левый верхний угол, сохраняет
положение осей и реализует отсчет по вертикальной оси из верхнего левого угла (матричная
система координат).
146
Команда axis('xy') возвращает декартову систему координат; начало отсчета находится
в нижнем левом углу; ось x горизонтальна и размечается слева направо, ось y вертикальна и
размечается снизу вверх.
Команда axis('square') устанавливает одинаковый диапазон изменения переменных по
осям.
Команда axis('equal') устанавливает масштаб, который обеспечивает одинаковые
расстояния между метками по осям x и y.
Команда axis('image') устанавливает масштаб, который обеспечивает квадратные
размеры пикселей.
Команда axis('normal') восстанавливает полноразмерный масштаб, отменяя масштабы,
установленные командами axis('square') и axis('equal').
Команда axis('off') снимает с осей их обозначения и маркеры.
Команда axis('on') восстанавливает на осях их обозначения и маркеры.
Функция [s1, s2, s3] = axis('state') возвращает строку, определяющую вектор состояния
объекта axes:
s1 = 'auto' | 'manual'.
s2 = 'on' | 'off'.
s3 = 'xy' | 'ij'.
Команда axis(s1, s2, s3) устанавливает параметры объекта axes в соответствии с
вектором состояния [s1, s2, s3]. По умолчанию этот вектор принимает значения [„auto‟, „on‟,
„xy‟].
Сопутствующие функции и команды: SUBPLOT.
GRID
Нанесение сетки
Синтаксис:
grid on
grid off
grid
Описание:
Команда grid on наносит координатную сетку на текущие оси.
Команда grid off удаляет координатную сетку.
Команда grid выполняет роль переключателя с одной функции на другую.
Команды группы grid выполняют установку свойств „XGrid‟, „YGrid‟, „ZGrid‟ объекта
axes.
Сопутствующие функции и команды: TITLE, XLABEL, YLABEL.
HOLD
Управление режимом сохранения текущего графического окна
Синтаксис:
hold on
hold off
hold
Описание:
Команда hold on включает режим сохранения текущего графика и свойств объекта
axes, так что последующие команды приведут к добавлению новых графиков в графическом
окне.
Команда hold off выключает режим сохранения графика.
Команда hold реализует переключение от одного режима к другому.
Пояснение:
Команды hold воздействуют на значения свойства NextPlot объектов figure и axes:
hold on присваивает свойству NextPlot для текущих объектов figure и axes значение
add;
147
hold off присваивает свойству NextPlot для текущих объектов figure и axes значение
replace.
SUBPLOT
Разбиение графического окна
Синтаксис:
subplot(m, n, p)
subplot(h)
subplot(mnp)
Описание:
Данная команда выполняется перед обращением к функциям построения графиков
для одновременной выдачи нескольких графиков в различных частях графического окна.
Команды subplot(mnp) или subplot(m, n, p), где mnp - 3 цифры, производит разбивку
графического окна на несколько подокон, создавая при этом новые объекты axes; значение m
указывает, на сколько частей разбивается окно по горизонтали, n - по вертикали, а p - номер
подокна, куда будет выводиться очередной график. Эти же команды могут использоваться
для перехода от одного подокна к другому.
Команда subplot(h), где h - дескриптор для объекта axes соответствующего подокна, другой способ выбора подокна для размещения графика.
Команды clf, subplot(111), subplot(1, 1, 1) выполняют одну и ту же функцию - удаляют
все подокна и возвращают графическое окно в штатное состояние.
Пример:
В верхней части экрана строится функция y1 = sin(x), в нижней - y2 = log(abs(y)).
x = -1:.1:1;
y1 = sin(x);
subplot(2, 1, 1), plot(x, y1)
y2 = log(abs(y1));
subplot(2, 1, 2), plot(x, y2)
ZOOM
Управление масштабом графика
Синтаксис:
zoom on
zoom off
zoom
zoom out
Описание:
Команда zoom on включает режим масштабирования активного графика. Теперь при
нажатии левой клавиши мыши вблизи интересующей вас точки графика масштаб окна
увеличивается в 2 раза; при нажатии правой клавиши масштаб в 2 раза уменьшается.
Удерживая левую клавишу, можно выделить интересующую вас область окна.
Команда zoom off выключает режим масштабирования.
Команда zoom реализует переключение от одного режима к другому.
Команда zoom out возвращает график в исходное состояние.
COLORMAP
Синтаксис:
colormap(C)
colormap(„default‟)
C = colormap
caxis(caxis)
Палитра цветов
148
Описание:
Палитра цветов C - это матрица размера m х 3 действительных чисел из диапазона [0.0
1.0]. Строка k палитры сформирована из трех чисел, которые указывают интенсивность
красного, зеленого и синего цветов, то есть C(k, :) = [r(k) g(k) b(k)].
Команда colormap(C) устанавливает палитру согласно матрице C. Если значение
элемента матрицы выходит за пределы интервала [0 1], выдается сообщение об ошибке
Colormap must have values in [0,1].
Значения элементов палитры должны быть в интервале [0 1].
Команды colormap(„default‟) или colormap(hsv) устанавливают штатную палитру,
которая соответствует модели hue-saturation-value (оттенок-насыщен-ность-значение).
Последовательность цветов этой палитры соответствует цветам радуги.
red
Красный
Каждый
bone
cool
-
-
охотник
yellow
Желтый
желает
green
Зеленый
знать,
cyan
Голубой
где
blue
Синий
сидит
magenta
Фиолетовый
фазан
В рамках версий 4.x системы MATLAB реализованы следующие палитры:
Grey-scale with tinge of blue
Серая палитра с оттенком синего
color map
Shades of cyan and magenta color Палитра с оттенками голубого и фиолетого
map
copper Linear copper-tone color map
Линейная палитра в оттенках меди
flag
Alternating red, white, blue, and
black color map
Палитра с чередованием красного, синего и черного
gray
Linear grey-scale color map
Линейная палитра в оттенках серого
hot
Black-red-yellow-white color
map
Палитра с чередованием черного, красного, желтого
и белого
hsv
Hue-saturation-value color map
Палитра радуги
jet
Variant of hsv
Разновидность hsv-палитры
pink
Pastel shades of pink color map
Розовая палитра с оттенками пастели
prism Prism (red-orange-yellow-green - Палитра с чередованием красного, оранжевого,
blue-violet) color map
желтого, зеленого, синего и фиолетового
white All white color map
Белая палитра
Сопутствующие функции и команды: MESH, SURF.
Установление соответствия между палитрой цветов и
CAXIS
масштабированием осей
Синтаксис:
caxis([cmin cmax])
caxis( „auto‟ )
v = caxis
caxis(caxis)
Описание:
149
Команда caxis дает простой способ управления свойствами Clim и CLimMode объекта
axes и таким образом обеспечивает преемственность предшествующих версий системы
MATLAB, ориентированных на символьную обработку, с версиями 4.x, ориентированными
на графический интерфейс.
Команда caxis([cmin cmax]) устанавливает диапазон из палитры цветов для
масштабирования данных, которые используются объектами surface и patch, созданными с
помощью команд mesh, pcolor, surf. Параметры cmin и cmax предназначены для выбора
граничных цветов из текущей палитры. Значения цветов вне интервала [cmin cmax]
отсекаются, то есть соответствующие фрагменты и пиксели не выводятся на экран.
Команда caxis('auto') устанавливает штатное масштабирование данных палитрой
цветов; в этом случае отсекаются цвета, которые соответствуют значениям Inf и NaN.
Команда v = caxis возвращает вектор-строку [cmin cmax].
Команда caxis(caxis) фиксирует текущую палитру для последующих графиков, как
если бы был включен режим hold.
Пример:
[X, Y, Z] = sphere(32);
% Cфера радиусом 1
C = Z;
% Значения для С - в диапазоне [-1 1].
surf(X, Y, Z, C)
% Изображение сферы
Сопутствующие функции и команды: COLORMAP, AXIS.
SHADING
Затенение поверхностей
Синтаксис:
shading faceted
shading flat
shading interp
Описание:
Команды группы shading устанавливают способ затенения графических объектов
surface и patch, которые создаются при использовании функций mesh, surf, pcolor, fill и fill3.
Команда shading faceted устанавливает равномерную раскраску ячеек с нанесением
черных граней. Такое затенение поверхности часто оказывается наиболее эффективным и
принято по умолчанию.
Команда shading flat устанавливает раскраску каждой ячейки или грани определенными
цветами, которые зависят от цвета узлов сетки.
Команда shading interp устанавливает раскраску каждой ячейки или грани цветами,
которые определяются билинейной нитерполяцией цветов в узлах сетки.
Алгоритм:
Команды группы shading устанавливают требуемые значения свойств EdgeColor и
FaceColor графических объектов surface и patch. Устанавлива-емые значения зависят от того,
150
является ли трехмерный график сетчатой поверхностью (функция mesh) или затененной
поверхностью (функция surf).
Сопутствующие функции, команды и объекты: MESH, SURF, FILL, FILL3.
CONTOURC
Формирование массива описания линий уровней
Синтаксис:
C = contourc(Z)
C = contourc(x, y, Z)
C = contourc(Z, n)
C = contourc(x, y, Z, n)
C = contourc(Z, v)
C = contourc(x, y, Z, v)
Описание:
Функция C = contourc(Z) формирует массив C описания линий уровней для их вывода
на экран с помощью функции contour.
Функция C = contourc(x, y, Z) формирует массив линий уровней С с учетом диапазона
изменения координат x и y.
Функции C = contourc(Z, n) и C = contourc(x, y, Z, n) формируют массив C для n линий
уровней.
Функции C = contourc(Z, v) и C = contourc(x, y, Z, v) формируют массив C только для
линий уровня, которые заданы в векторе v.
Маccив линий уровня состоит из двух строк и описывает каждую линию уровня в
виде сегмента со следующими параметрами:
значение уровня (leveli) - координаты x(i);
количество точек (pairsi) - координаты y(i),
так что массив C имеет вид:
C = [level1 x1 x2 ... xk1 level2 x1 x2 ... xk2 ...; pairs1 y1 y2 ... yk1 pairs2 y1 y2 ... yk2 ...].
Ограничения:
При работе с функцией contourc предполагается, что элементы массивов x и y
монотонно возрастают.
Сопутствующие функции и команды: CONTOUR.
CONTOUR
Изображение линий уровня для трехмерной поверхности
Синтаксис:
contour(Z)
contour(x, y, Z)
contour(Z, n)
contour(x, y, Z, n)
contour(Z, v)
contour(x, y, Z, v)
contour(...,‟тип_линии‟)
C = contour(...)
[C, h] = contour(...)
Описание:
Команда contour(Z) рисует двумерные линии уровня для массива данных Z,
определяющих поверхность в трехмерном пространстве без учета диапазона изменения
координат x и y.
Команда contour(x, y, Z), где x и y - векторы, рисует линии уровня для массива данных
Z с учетом диапазона изменения координат x и y.
Команды contour(Z, n), contour(x, y, Z, n) рисует n линий уровня для массива данных
Z; по умолчанию, n равно 10.
Команды contour(Z, v), contour(x, y, Z, v) рисуют линии уровня для заданных
значений, которые указаны в векторе v.
Команда contour(...,‟<тип линии>‟) рисует линии уровня, тип и цвет которых
определяются параметром <тип линии> команды plot.
151
Функция C = contour(...) возвращает массив C описания линий уровней по аналогии с
функцией contourc для последующего использования командой clabel.
Функция [C, h] = contour(...) возвращает массив C и вектор-столбец дескрипторов h
графических объектов line для каждой линии уровня.
Пример:
Построить линии уровня функции
x = -2 : .2 : 2; y = x;
[X, Y] = meshgrid(x);
Z = X.* exp(- X.^2 - Y.^2);
contour(X, Y, Z)
в области -2 <= x <= 2, -2<= y<= 2.
Диагностические сообщения:
Если меньшая размерность массива Z оказывается меньше двух, то выдается
сообщение
Matrix must be 2-by-2 or larger.
Матрица должна иметь размер 2 х 2 или больше.
Ограничения:
При работе с командой и функцией contour предполагается, что элементы массивов x
и y монотонно возрастают.
Сопутствующие функции и команды: CLABEL, CONTOURC, CONTOURC3,
GRADIENT, QUIVER.
Изображение трехмерных линий уровня
CONTOUR3
Синтаксис:
contour3(Z)
contour3(X, Y, Z)
contour3(Z, n)
contour3(X, Y, Z, n)
C = contour3(...)
[C, h] = contour3(...)
Описание:
Команда contour3(Z) рисует трехмерные линии уровня для массива данных Z,
определяющих поверхность в трехмерном пространстве без учета диапазона изменения
координат x и y.
Команда contour3(X, Y, Z), где X и Y - двумерные массивы, вычисленные с помощью
функции meshgrid, рисует линии уровня для массива данных Z с учетом диапазона
изменения координат x и y.
Команды contour3(Z, n), contour(X, Y, Z, n) рисуют n линий уровня для массива
данных Z; по умолчанию n равно 10.
Функция C = contour3(...) возвращает массив C описания линий уровней по аналогии с
функцией contourc для последующего использования командой clabel.
Функция [C, h] = contour3(...) возвращает массив C и вектор-столбец дескрипторов h
графических объектов line для каждой линии уровня.
Пример:
Построить линии уровня функции
x = -2 : .2 : 2;
y = -2 : .2 : 2;
[X, Y] = meshgrid(x, y);
Z = X.* exp(- X.^2 - Y.^2);
contour3(X, Y, Z)
Ограничения:
в области -2 <= x <= 2, -2<= y<= 3.
152
При работе с командой и функцией contour3 предполагается, что элементы массивов x
и y монотонно возрастают.
Сопутствующие функции и команды: CONTOURC, CONTOUR.
TITLE
Заголовки для двух- и трехмерных графиков
Синтаксис:
title(„<текст>‟)
Описание:
Команда title(„<текст>‟) размещает текст над графиком.
Сопутствующие функции и команды: XLABEL, YLABEL, ZLABEL, TEXT.
XLABEL
YLABEL
ZLABEL
Обозначение осей
Синтаксис:
xlabel('<текст>')
ylabel('<текст>')
zlabel('<текст>')
Описание:
Команда xlabel('<текст>') помещает текст для двумерного графика вдоль оси x, для
трехмерного графика - вдоль оси x либо под графиком.
Команда ylabel('<текст>') помещает текст для двумерного графика вдоль оси y, для
трехмерного графика - вдоль оси y либо под графиком.
Команда zlabel('<текст>') помещает текст вдоль оси трехмерного графика.
Повторное использование команды приводит к замене старого текста новым.
Сопутствующие функции и команды: TITLE, GTEXT.
CLABEL
Маркировка линий уровня
Синтаксис:
clabel(C)
clabel(C, v)
clabel(C, „manual‟)
Описание:
Команда clabel(C) добавляет метки к линиям уровня в случайно выбранных позициях.
Команда clabel(C, v) маркирует линии уровня контура, которые заданы в векторе v.
Команда clabel(C, „manual‟) маркирует линии уровней в позициях, указываемых с
помощью мыши. Нажатие клавиши Return или правой кнопки мыши завершает маркировку.
Если мышь недоступна, то можно использовать клавишу пробела для перехода между
линиями уровней и клавиши-“стрелки” для перемещения перекрестия.
Пример:
Сгенерировать, нарисовать и маркировать линии уровня для функции
x = -2 : .2 : 2; y = x;
[X, Y] = meshgrid(x);
Z = X.* exp(- X.^2 - Y.^2);
C = contour(X, Y, Z);
clabel(C)
Сопутствующие функции: CONTOUR.
TEXT
Синтаксис:
Добавление к текущему графику текста
.
153
text(x, y, ‟<текст>‟)
text(x, y, z, ‟<текст>‟)
Описание:
Команда text(x, y, ‟<текст>‟) помещает в заданной точке (x, y) двумерного графика
начало текста, указанного в качестве третьего аргумента. Если x и y одномерные массивы,
заданный текст помещается во все позиции, определяемые координатами [x(i) y(i)].
Команда text(x, y, z, ‟<текст>‟) выводит текст на трехмерный график.
Примеры:
Записать символ „x‟ в трех точках с координатами (1, 1), (5, 10), (10, 20):
plot([1 5 10], [1 10 20], ‟x‟)
Написать, начиная с позиции (5, 10), „Action point‟:
text(5, 10, „Action point‟)
Написать, начиная с позиции (5, 10), „Активная точка‟:
h = text(5, 10,'Активная точка', 'FontName', ‟TimesET‟, 'FontSize', 11)
Сопутствующие функции и команды: XLABEL, YLABEL, ZLABEL, TITLE, GTEXT.
GTEXT
Размещает заданный текст на графике с использованием мыши
Синтаксис:
gtext(„<текст>‟)
Описание:
Команда gtext(„<текст>‟) высвечивает в активном графическом окне перекрестие,
перемещение которого позволяет указать место ввода заданного текста; по завершении
позиционирования нажатие кнопки мыши или любой клавиши вводит заданный текст.
Для того чтобы настроить процедуру gtext на ввод русского текста, следует в тело
процедуры вслед за строкой
set(ht, 'units', units')
добавить строку
set(ht, 'FontName', '<имя шрифта>')
Примеры:
Разместим на графике функции y = sin(x)/x маркер “Скорость”:
x = 1e-6 : 0.05 : 10;
plot(x, sin(x)./x)
grid
gtext('Скорость')
Сопутствующие функции и команды: TEXT.
LEGEND
Пояснение к графику
Синтаксис:
legend(„<текст1>„, „<текст2>„, „<текст3>„, ...)
legend(„<тип линии1>„, „<текст1>„, „<тип линии2>„, „<текст2>„, ...)
legend(h,...)
legend(M)
legend(h, M)
legend off
legend(..., n)
Описание:
Команда legend(„<текст1>„, „<текст2>„, „<текст3>„, ...) добавляет к текущему графику
пояснение в виде указанных текстовых строк.
Команда legend(„<тип линии1>„, „<текст1>„, „<тип линии2>„, „<текст2>„, ...) позволяет
специфицировать тип линии, которая выносится в пояснение, так, как это делается в команде
plot.
154
Команда legend(h, ...) добавляет пояснение к графику с дескриптором h.
Команды legend(M) и legend(h, M), где M - массив строк, также допустимы для
формирования пояснения. Следует помнить, что строки массива M должны иметь
одинаковую длину.
Команда legend off удаляет пояснение с текущего графика.
Команда legend(..., n) устанавливает предельное количество позиций для размещения
пояснения. Если оказывается, что в области графика места недостаточно, график
перестраивается и пояснение размещается вне пределов графика. Если n = -1, то пояснение
размещается вне области графика. Если n = 0, то пояснение размещается в области графика,
если места для этого достаточно.
Для перемещения пояснения следует нажать левую кнопку мыши, находясь в этой
области, а затем переместить пояснение в нужную позицию.
Примеры:
Построить на одном графике функции Бесселя 1, 3 и 5-го порядка и дать
соответствующее пояснение на русском языке.
x = 0 : .2 : 12;
hp = plot(x, bessel(1, x), „-‟ x, bessel(3, x), „--‟, x, bessel(5, x), „-.‟);
set(gca, 'FontName', 'TimesET')
set(gca, 'FontSize', 10)
legend('Порядка 1', 'Порядка 3', 'Порядка 5', -1)
grid
Замечание:
Для того чтобы избежать пересечения пояснения с линиями графика или нанесенной
сеткой, необходимо текущему графическому объекту axes присвоить дескриптор пояснения:
hl = legend(....)
axes(hl)
print-dbitmap
Сопутствующие функции и команды: PLOT.
COLORBAR
Шкала палитры
Синтаксис:
colorbar(„vert„)
colorbar(„horiz„)
colorbar(h)
colorbar
Описание:
Команда colorbar(„vert„) добавляет к текущему графику вертикальную шкалу палитры.
Команда colorbar(„horiz„) добавляет к текущему графику горизонтальную шкалу
палитры.
Команда colorbar(h) добавляет к графику с дескриптором h шкалу палитры.
Размещение шкалы реализуется автоматически в зависимости от соотношения ширины и
высоты графика.
Команда colorbar без аргументов размещает на текущем графике новую вертикальную
шкалу палитры или обновляет прежнюю.
BAR
Синтаксис:
bar(y)bar(x, y)
[xb, yb] = bar(...)
Столбцовые диаграммы
155
bar(y, „<тип линии>„)
bar(x, y, „<тип линии>„)
Описание:
Команда bar(y) выводит график элементов одномерного массива y в виде столбцовой
диаграммы.
Команда bar(x, y) выводит график элементов массива y в виде столбцов в позициях,
определяемых массивом x, элементы которого должны быть упорядочены в порядке
возрастания.
Если X и Y - двумерные массивы одинаковых размеров, то каждая диаграмма
определяется соответствующей парой столбцов и они надстраиваются одна над другой.
Команды bar(y, „<тип линии>„), bar(x, y, „<тип линии>„) позволяют задать тип линий,
используемых для построения столбцовых диаграмм, по аналогии с командой plot.
Функция [xb, yb] = bar(...) не выводит графика, а формирует такие массивы xb и yb,
которые позволяют построить столбцовую диаграмму с помощью команды plot(xb, yb).
Примеры:
Построить график функции
в виде столбцовой диаграммы.
x = -2.9 : 0.2 : 2.9;
bar(x, exp(-x . * x))
Сопутствующие функции и команды: STAIRS, HIST.
ERRORBAR
График с указанием интервала погрешности
Синтаксис:
errobar(x, y, l, u, „<тип линии>„)
errobar(y, l, u, „<тип линии>„)
errobar(x, y, e)
errobar(y, l, e)
Описание:
Команда errobar(x, y, l, u, „<тип линии>„) строит график функции y в зависимости от x
с указанием интервала погрешности, который определяется массивами l и u. Массивы x, y, l,
u должны быть одного размера. Погрешности в каждой точке {x(i), y(i)} определяются
отклонениями вниз l(i) и вверх u(i) относительно точки графика, так что суммарная
погрешность равна l(i) + u(i). Строковая переменная „<тип линии>„ аналогична используемой
в команде plot.
Если X, Y, L и U - двумерные массивы, то в этом случае каждому столбцу
соответствует свой график.
Команда errobar(x, y, e) строит график функции c погрешностью ±e относительно
точки графика.
Команды errobar(y, l, u, „<тип линии>„) и errobar(y, e) отличаются от вышеописанных
только тем, что строят графики функций в зависимости от номера элемента.
Пример:
Построить график функции y = sin(x) с интервалом погрешности ±e, который
определяется как стандартное отклонение.
x = 1 : 10;
y = sin(x);
e = std(y)*ones(size(x))/5;
errorbar(x, y, e)
Сопутствующие функции и команды: PLOT, BAR.
HIST
Синтаксис:
Построение гистограммы
156
hist(y)
hist(y, n)
hist(y, x)
[y, x] = hist(y, ...)
Описание:
Команды hist(...) подсчитывают и отображают на графике количество элементов
массива y, значения которых попадают в заданный интервал; для этого весь диапазон
значений y делится на n интервалов (по умолчанию 10) и подсчитывается количество
элементов в каждом интервале.
Команда hist(y) выводит гистограмму для 10 интервалов.
Команда hist(y, n) выводит гистограмму для n интервалов.
Команда hist(y, x) выводит гистограмму с учетом диапазона изменения переменной x.
Функции [y, x] = hist(y, ...) формируют такие массивы y и x, что bar(x, y) является
гистограммой.
Примеры:
Построить гистограмму для 10 000 случайных чисел, распределенных по
нормальному закону.
x = -2.9 : 0.1 : 2.9;
y = randn(10000,1);
hist(y, x)
Сопутствующие функции и команды: BAR, STAIRS.
STEM
Дискретные графики
Синтаксис:
stem(y)
stem(x, y)
stem(y, <тип линии>)
stem(x, y, <тип линии>)
Описание:
Команда stem(y) выводит график элементов одномерного массива y в виде
вертикальных линий, которые заканчиваются в точках графика, помечаемых кружочком.
Команда stem(x, y) выводит график элементов массива y в виде вертикальных линий в
позициях, определяемых массивом x, элементы которого должны быть упорядочены в
порядке возрастания.
Команды stem(y, <тип линии>), stem(x, y, <тип линии>) позволяют задать тип линий,
используемых для построения дискретного графика, по аналогии с командой plot.
Примеры:
Построить график функции
в виде дискретной последовательности.
t = 0 : 2 : 200; alpha = 0.02; beta = 0.5;
x = exp(-alpha*t) .*sin(beta*t);
stem(t, x), grid
set(gca, 'FontName', 'TimesET')
xlabel('Время, мс'), ylabel('Амплитуда')
Сопутствующие функции и команды: PLOT, BAR, STAIRS.
STAIRS
Синтаксис:
stairs(y)
stairs(x, y)
[xb, yb] = stairs(...)
Описание:
Ступенчатый график
157
Команда stairs(y) выводит график элементов одномерного массива y в виде
ступенчатой функции, аналогичной столбцовой диаграмме, но без вертикальных линий.
Такие графики целесообразно использовать при выводе процессов в дискретно-непрерывных
системах.
Команда stairs(x, y) выводит график элементов массива y в виде ступенчатой функции
в позициях, определяемых массивом x, элементы которого должны быть упорядочены в
порядке возрастания.
Функция [xb, yb] = stairs(...) не выводит графика, а формирует такие массивы xb и yb,
которые позволяют построить ступенчатую функцию с помощью команды plot(xb, yb).
Примеры:
Построить ступенчатый график функции x = sin(t).
t = 0 : 0.25 : 10;
stairs(t, sin(t))
Сопутствующие функции и команды: BAR, HIST.
Гистограмма в полярных координатах
ROSE
Синтаксис:
rose(phi)
rose(phi, n)
rose(phi, x)
[phi, r] = rose(phi, ...)
Описание:
Команды rose(...) подсчитывают и отображают на графике количество угловых
элементов в массиве phi, значения которых попадают в заданный интервал; для этого весь
диапазон значений phi делится на n интервалов (по умолчанию 20) и подсчитывается
количество угловых элементов в каждом интервале. Такая гистограмма известна под
названием розы ветров.
Команда rose(phi) строит розу ветров для 20 интервалов.
Команда rose(phi, n) строит розу ветров для n интервалов.
Команда rose(phi, n) строит розу ветров с учетом диапазона изменения переменной
phi.
Функции [phi, r] = rose(phi, ...) формируют такие массивы phi и r, что polar(phi, r)
является гистограммой в полярных координатах.
Примеры:
Рассмотрим дискретную запись изменения направления ветра через каждый час в
течение 12 ч и построим соответствующую розу ветров для этого периода наблюдений.
wdir = [45 90 90 45 360 335 360 270 335 270 335 335];
wdir = wdir * pi/180;
rose(wdir)
Преимущественное направление розы ветров в течение этого периода составляет 330°.
Сопутствующие функции и команды: HIST, POLAR.
COMPASS,
FEATHER
Графики векторов
Cинтаксис:
compass(z)
feather(z)
compass(x, y)
feather(x, y)
compass(y, „<тип линии>„)
feather(y, „<тип линии>„)
compass(x, y, „<тип линии>„)
feather(x, y, „<тип линии>„)
[hc, hb] = compass(...)
158
Описание:
Команда compass(z) выводит график комплексных элементов одномерного массива z в
виде векторов-стрелок, исходящих из одной точки (начала координат).
Команда compass(x, y) равносильна команде compass(x + i * y).
Команды compass(y, „<тип линии>„), compass(x, y, „<тип линии>„) позволяют задать
тип линий, используемых для построения векторов-стрелок, по аналогии с командой plot.
Функция [hc, hb] = compass(...) не выводит графика, а формирует такие массивы hc и
hb, которые позволяют построить столбцовую диаграмму с помощью команды plot(hc, hb).
Команда feather(z) выводит график комплексных элементов одномерного массива z в
виде векторов-стрелок, исходящих из равноотстоящих точек горизонтальной оси.
Команда feather(x, y) равносильна команде feather(x + i * y).
Команды feather(y, „<тип линии>„), feather(x, y, „<тип линии>„) позволяют задать тип
линий, используемых для построения векторов-стрелок, по аналогии с командой plot.
Примеры:
Рассмотрим дискретные записи изменения направления и скорости ветра через
каждый час в течение 12 ч и построим соответствующую диаграмму векторов для этого
периода наблюдений.
wdir = [45 90 90 45 360 335 360 270 335 270 335 335];
knots = [6 6 8 6 3 9 6 8 9 10 14 12];
rdir = wdir * pi/180;
[x, y] = pol2cart(rdir, knots);
polar(rdir, knots, ':w'); hold
compass(x, y)
desc = 'Направление и сила ветра'
h = get(gca, 'Title');
set(h,'String',desc,'FontName','TimesET','FontSize',10)
Построим график затухающей экспоненты в виде векторов-стрелок.
t = 0 : 0.5 : 10;
s = 0.05 + i;
z = exp(-s * t);
feather(z)
Сопутствующие функции: ROSE, QUIVER.
Поле градиентов функции
QUIVER
Синтаксис:
quiver(X, Y, DX, DY)
quiver(x, y, DX,
DY)
quiver(DX, DY)
quiver(x, y, dx, dy, s)
quiver(dx, dy, s)
quiver(... „<тип_линии>‟)
Описание:
Команда quiver(X, Y, DX, DY) формирует и выводит на экран поле градиентов
функции в виде стрелок для каждой пары элементов массивов X и Y, а пары элементов DX и
DY используются для указания направления и размера стрелки.
Команда quiver(x, y, DX, DY), где x и y - одномерные массивы размеров length(x) = n и
length(y) = m, где [m, n] = size(DX) = size(DY), формирует и выводит на экран поле
градиентов для каждой точки; стрелки задаются четверками {x(j), y(i), DX(i, j), DY(i, j)}.
Обратите внимание, что x соответствует столбцам DX и DY, а y - строкам.
Команда quiver(DX, DY) использует массивы x = 1 : n и y = 1 : m.
159
Команды quiver(x, y, dx, dy, s), quiver(dx, dy, s) используют скаляр s как коэффициент
масштаба стрелки, например s = 2 вдвое увеличивает, а s = = 0.5 вдвое уменьшает размер
стрелки.
Команда в форме quiver(... „<тип_линии>‟) позволяет задать тип и цвет линии по
аналогии с функцией PLOT.
Пример:
Построить поле направлений для функции
в области -2 <= x <= 2, -2 <= y
<= 2.
[x, y] = meshgrid(-2 : .2 : 2);
z = x.*exp(-x.^2 - y.^2);
[dx, dy] = gradient(z, .2, .2);
contour(x, y, z), hold on
quiver(x, y, dx, dy)
Сопутствующие функции и команды: GRADIENT, CONTOUR, PLOT.
COMET
Движение точки по траектории
Cинтаксис:
comet(y)
comet(x, y)
comet(x, y, p)
comet
Описание:
Команда comet(y) рисует движение точки по траектории, заданной одномерным
массивом y, в виде головы и хвоста кометы.
Команда comet(x, y) рисует движение точки по траектории, заданной массивами x и y.
Команда comet(x, y, p) управляет длиной хвоста кометы p*length(y) с помощью
параметра p; по умолчанию p = 0.10.
Команда comet запускает демонстрационный пример.
Пример:
Построим разность двух функций tg(sin(t)) - sin(tg(t)) в виде траектории движения
точки.
t = -pi : pi/200 : pi;
comet(t, tan(sin(t)) - sin(tan(t)))
Сопутствующие функции: COMET3.
FILL
Закраска многоугольника
Cинтаксис:
fill(x, y, „<цвет>„)
fill(x, y, c)
fill(X, Y, C)
fill(X1, Y1, C1, X2, Y2, C2, ...)
h = fill(...)
Описание:
Команда fill(x, y, „<цвет>„) закрашивает многоугольник, заданный одномерными
массивами x, y, цветом, который может быть задан либо одним из символов „r‟, ‟g‟, ‟b‟, „c‟,
‟m‟, ‟y‟, ‟ w‟, ‟k‟, либо вектором [r g b]. Вершины многоугольника задаются
соответствующими парами элементов массивов x, y. Многоугольник должен быть
замкнутым, поэтому его первая и последняя вершины, если это возможно, соединяются
линией.
Команда fill(x, y, c), где c - вектор той же длины, которую имеют и векторы x и y,
закрашивает многоугольник цветом, задаваемым вектором С. Элементы вектора С
160
масштабируются функцией caxis и используются как индексы текущей палитры для задания
цветов в вершинах многоугольника; цвет внутри многоугольника определяется билинейной
интерполяцией цветов в узлах.
Команда fill(X, Y, C), где X и Y - массивы одинаковых размеров, строит для каждого
столбца свой многоугольник. Если массив C - вектор-строка, количество элементов которой
равно числу столбцов массивов X и Y, то каждый многоугольник будет закрашен
собственным цветом; это соответствует применению команды shading flat. Если массив C
имеет те же размеры, которые имеют и массивы X и Y, то закраска реализуется методом
интерполяции; это соответствует применению команды shading interpolated.
Команда fill(X1, Y1, C1, X2, Y2, C2, ...) позволяет выполнить закраску конечного
количества многоугольников.
Функция h = fill(...) возвращает вектор-столбец дескрипторов для графических
объектов patch, которыми и являются закрашенные многоугольники. Команда fill(...) задает
свойству Facecolor объекта patch одно из значений „flat‟, „interp‟ или [r g b].
Примеры:
Построим многоугольник, соответствующий дорожному знаку STOP.
t = (1/16 : 1/8 : 1)'*2*pi;
x = sin(t);
y = cos(t);
fill(x, y, 'b')
axis('square')
Сопутствующие функции и команды: FILL3, COLORMAP.
COMET3
Движение точки по пространственной траектории
Cинтаксис:
comet3(z)
comet3(x, y, z)
comet3(x, y, z, p)
comet3
Описание:
Команда comet(z) рисует движение точки по траектории, заданной одномерным
массивом z, в виде головы и хвоста кометы.
Команда comet3(x, y, z) рисует движение точки по траектории, заданной массивами x
и y.
Команда comet3(x, y, z, p) управляет длиной хвоста кометы p*length(z) с помощью
параметра p; по умолчанию p = 0.10.
Команда comet3 запускает демонстрационный пример.
Примеры:
Построим пространственную параметрическую кривую {x = sin(5t), y = = cos(3t), z = t}
в виде траектории движения точки.
t = -pi : pi/500 : pi;
comet3(sin(5*t), cos(3*t), t)
Сопутствующие функции и команды: COMET.
SLICE
Синтаксис:
slice(x, y, z, V, xi, yi, zi, n)
slice(X, Y, Z, V, xi, yi, zi, n)
slice(V, xi, yi, zi, n)
h = slice(...)
Описание:
Сечения функции от трех переменных
161
Команда slice(x, y, z, V, xi, yi, zi, n) строит плоские сечения функции от трех
переменных v(x, y, z) вдоль осей x, y, z; позиции сечений определяются векторами xi, yi, zi.
Размер двумерного массива V равен m х n х p, где m = length(y), n = length(x), p = length(z).
Команда slice(X, Y, Z, V, xi, yi, zi, n) вместо одномерных массивов использует
двумерные массивы X, Y, Z, которые вычисляются с помощью функции meshgrid.
Команда slice(V, xi, yi, zi, n) использует для задания области построения массивы x =
1 : n, y = 1 : m, z = 1 : p.
Функция h = slice(...) возвращает вектор-столбец дескрипторов для графических
объектов surface, которыми являются сечения трехмерной функции.
Пример:
Построить сечения функции
в трехмерной области -2 <= x <= 2, -2 <= y
<= 2, - 2 <= z <= 2,
x = -2 : .2 : 2;
y = -2 : .25 : 2;
z = -2 : .16 : 2;
[X, Y, Z] = meshgrid(x, y, z);
V = X .* exp(-X .^2 - Y .^2 - Z .^2); % Размер V равен 17 х 21 х 26
slice(x, y, z, v, [2], [2], [ -0.75 0.5], length(x)), grid
Сопутствующие функции и команды: MESHGRID.
WATERFALL
Трехмерная поверхность
Синтаксис:
waterfall(X, Y, Z, C)
waterfall(x, y, Z, C )
waterfall(Z, C)
waterfall(X, Y, Z)
waterfall(x, y, Z)
waterfall(Z)
Описание:
Команда waterfall(X, Y, Z, C) строит поверхность для значений массива Z,
определенных на множестве значений массивов X и Y. Она аналогична команде mesh, но не
прорисовывает ребер сетки.
Команда waterfall(x, y, Z, C) выполняет ту же функцию, но вместо двумерных
массивов X, Y использует их одномерные проекции, так что если length(x) = n, а length(y) =
m, то [m, n] = size(Z).
Команда waterfall(Z, C) использует сетку, которая определяется одномерными
массивами x = 1 : n и y = 1 : m.
Команды waterfall(X, Y, Z), mesh(x, y, Z), mesh(Z) используют в качестве массива
цвета C = Z, то есть цвет в этом случае пропорционален высоте поверхности.
Функция h = waterfall(...) возвращает вектор дескрипторов h для графических
объектов patch.
162
Примеры:
Построим трехмерную поверхность функции
[X, Y] = meshgrid([ -2 : 0.1 : 2 ]);
Z = X .*exp(- X .^2 - Y .^2);
waterfall(X, Y, Z)
Сопутствующие функции и команды: MESH, SURF.
FILL3
.
Закраска многоугольников в трехмерном пространстве
Cинтаксис:
fill3(x, y, z, „<цвет>„)
fill3(x, y, z, c)
fill3(X, Y, C)
fill3(X1, Y1, C1, X2, Y2, C2, ...)
h = fill3(...)
Описание:
Команда fill3(x, y, z, „<цвет>„) закрашивает многоугольник, заданный одномерными
массивами x, y, z, цветом, который может быть задан либо одним из символов „r‟, ‟g‟, ‟b‟, „c‟,
‟m‟, ‟y‟, ‟w‟, ‟k‟, либо вектором [r g b]. Вершины многоугольника задаются
соответствующими тройками элементов массивов x, y, z. Многоугольник должен быть
замкнутым, поэтому его первая и последняя вершины, если это возможно, соединяются
линией.
Команда fill3(x, y, z, c), где c - вектор той же длины, которую имеют и векторы x, y и
z, закрашивает многоугольник цветом, задаваемым вектором С. Элементы вектора С
масштабируются функцией caxis и используются как индексы текущей палитры для задания
цветов в вершинах многоугольника; цвет внутри многоугольника определяется билинейной
интерполяцией цветов в узлах.
Команда fill3(X, Y, Z, C), где X, Y и Z - массивы одинаковых размеров, строит для
каждого столбца свой многоугольник. Если массив C - вектор-строка, количество элементов
которой равно числу столбцов массивов X, Y, Z, то каждый многоугольник будет закрашен
собственным цветом; это соответствует применению команды shading flat. Если массив C
имеет те же размеры, которую имеют и массивы X, Y, Z, то закраска реализуется методом
интерполяции; это соответствует применению команды shading interpolated.
Команда fill3(X1, Y1, Z1, C1, X2, Y2, Z2, C2, ...) позволяет выполнить закраску
конечного количества многоугольников.
Функция h = fill3(...) возвращает вектор-столбец дескрипторов для графических
объектов patch, которыми являются закрашенные многоугольники. Команда fill3(...) задает
свойству Facecolor объекта patch одно из значений „flat‟, „interp‟ или [r g b].
Примеры:
Построим 4 случайно заданных многоугольника в трехмерном пространстве.
fill3(rand(3, 4), rand(3, 4), rand(3, 4), rand(3, 4))
Сопутствующие функции и команды: FILL, COLORMAP.
VIEWMTX
Вычисление матрицы управления углом просмотра
Cинтаксис:
T = viewmatx(az, el)
T = viewmatx(az, el, phi)
T = viewmatx(az, el, phi, xc)
Описание:
Функция T = viewmatx(az, el) вычисляет матрицу управления углом просмотра, или
обобщенную матрицу преобразований для аффинного изображения [1]. Переменные az и el
определяют соответственно углы азимута и возвышения точки просмотра. Положительные
163
значения угла азимута соответствуют вращению вокруг оси z против часовой стрелки.
Положительные значения угла возвышения соответствуют точке просмотра, расположенной
сверху над объектом, отрицательные - снизу под объектом.
Функция T = viewmatx(az, el, phi) вычисляет матрицу управления углом просмотра
для перспективного изображения. Угол phi задает поворот системы координат относительно
оси x и тем самым позволяет управлять степенью искажения перспективы в соответствии со
следующей таблицей.
phi
Описание
0°
Аффинное изображение
10°
Телескопическое изображение
25°
Нормальное фотоизображение
60°
Широкоугольное изображение
Функция T = viewmatx(az, el, phi, vt) вычисляет матрицу управления углом просмотра
для перспективного изображения, используя в качестве дополнительного параметра вектор
координат vt наблюдаемой точки (точки наведения). Координаты рассматриваются как
нормализованные в диапазоне [0 1]; по умолчанию вектор vt = [0 0 0].
Сопутствующие функции и команды: VIEW.
Ссылки:
1. Роджерс Д., Адамс Дж. Математические основы машинной графики: Пер. с англ.
М.: Машиностроение, 1980. 240 с.
VIEW
Управление положением точки просмотра
Cинтаксис:
view(az, el)
view(2)
view([az el])
view(3)
view([x y z])
view(T)
[az, el] = view;
T = view
Описание:
Команды view(az, el) и view([az el]) задают положение точки просмотра, из которой
наблюдается объект, используя углы азимута и возвышения.
Команда view([x, y, z]) задает положение точки просмотра в декартовой системе
координат.
Команда view(2) устанавливает штатное положение точки просмотра для двумерной
графики: az = 0°, el = 90°.
Команда view(3) устанавливает штатное положение точки просмотра для трехмерной
графики: az = -37.5°, el = 30°.
Команда view(T) устанавливает положение точки просмотра в соответствии с
обобщенной матрицей преобразований, вычисленной с помощью функции viewmtx.
Функция [az el] = view присваивает текущие значения углов азимута и возвышения
соответственно переменным az и el.
Функция T = view присваивает текущее значение обобщенной матрицы
преобразований переменной T.
Примеры:
Построим трехмерную поверхность функции
в виде нормального
фотоизображения, когда камера наведена в точку с координатами [1 1 1].
[X, Y] = meshgrid([ -2 : 0.1 : 2 ]);
Z = X .*exp(- X .^2 - Y .^2);
164
view(X, Y, Z)
T = viewmtx(az, el, 25, [ 1 1 1 ])
T = 0.7934
-0.6088
0
-0.1846
0.3044
0.3967
0.8660
-1.5671
-0.5272
-0.6871
0.5000
0.7143
0.1653
0.2154
-0.1568
0.7761
view(T)
Сопутствующие функции и команды: VIEWMTX.
Скачать