Справочник по 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.