/
Автор: Потемкин В.Г.
Теги: вычислительная техника микропроцессоры компьютерные технологии язык программирования matlab
ISBN: 5-86404-189-0
Год: 2004
Текст
■ с2 ф/>(xj\e n -v '
а
Вычисления
в СРЕДЕ
В. Г. ПОТЕМКИН
Вычисления
в среде
MATLAB
МОСКВА . ШМЮ1 • 2004
ББК 32.97
П64
Потемкин В. Г.
П64 Вычисления в среде MATLAB. - М.: ДИАЛОГ-МИФИ, 2004. - 720 с.
ISBN 5-86404-189-0
Предлагаемая вниманию читателя книга посвящена организации вычислений
в системе MATLAB версии 6.5. В книге нашли отражение как общие вопросы описания
вычислений в режиме командного окна, так и специальные вопросы, связанные
с характеристиками арифметики с плавающей точкой, особенностями отладки и профи¬
лирования М-файлов, применением специально разработанного ускорителя времени ис¬
полнения Just-In-Time Accelerator (JIT-Accelerator).
Книга снабжена приложениями, в которых представлено описание текстового ре¬
дактора Editor, описание класса объектов polynom, пакета прикладных программ для
вычисления клеток Жордана - JORD.
Для удобства работы книга снабжена индексным и предметным указателями.
Книга предназначена для инженеров и исследователей, выполняющих научные и инженер¬
ные разработки в различных прикладных областях, а также для студентов университетов и ву¬
зов, нуждающихся в мощном вычислительном инструменте при выполнении исследователь¬
ских работ, курсовых и дипломных проектов.
Учебно-справочное издание
Потемкин Валерий Георгиевич
Вычисления в среде MATLAB
Редактор О. А. Голубев
Корректор В. С. Кустов
Макет И. М. Чумаковой
Лицензия ЛР N 071568 от 25.12.97. Подписано в печать 10.11.2003.
Формат 70x100/16. Бум. офс. Печать офс. Гарнитура Таймс.
Усл. печ. л. 58,05. Уч.-изд. л. 24,92 Тираж 3 000 экз. Заказ 3 3 75.
ЗАО “ДИАЛОГ-МИФИ”, ООО “Д и М”
115409, Москва, ул. Москворечье, 31, корп. 2. Т.: 320-43-55, 320-43-77
Http://www.bitex.ru/~dialog E-mail: dialog@bitex.ru
Отпечатано на Ордена Трудового Красного Знамени
ГУП Чеховский полиграфический комбинат
Министерства РФ по делам печати, телевещания и средств массовых коммуникаций
142300, г. Чехов, Московская обл.,
тел.: (272) 71-3-36, факс: (272) 62-5-36
ISBN 5-86404-189-0
© Потемкин В. Г., 2004
© Оригинал-макет, оформление обложки
ООО “Д и М”, 2004
ВВЕДЕНИЕ
Рубеж XXI в. фирма The MathWorks Inc. отметила выпуском нового семейства сво¬
их программных продуктов, в состав которого входит и новая версия системы инже¬
нерных и научных вычислений MATLAB 6. Отличительной особенностью этой версии
является развитая среда разработки, которая характеризуется большим разнообразием
инструментальных средств и дружественных графических интерфейсов.
Структура семейства программных и инструментальных средств системы MATLAB 6
показана на рисунке.
Важнейшую роль во всех версиях выполняет подсистема технических расчетов.
Следует отметить ту уникальную особенность системы MATLAB, что все вычисли¬
тельные операции в ней выполняются над векторами или наборами векторов. Таким
образом, система MATLAB по своей сути является эмулятором векторных вычисле¬
ний, и это существенно отличает ее от других систем, таких, как MathCAD, Maple,
Mathematica. Векторная обработка данных обеспечивает высокую скорость вычисле¬
ний, избавляет пользователя от написания циклов и гарантирует непревзойденную
точность. Другое важнейшее достоинство - это модульный принцип построения сис¬
темы MATLAB. С момента своего зарождения в 1984 г., когда основным назначением
системы был вызов модулей, написанных на языках высокого уровня, и по настоящее
время последовательное проведение этого принципа в жизнь способствовало созданию
большого числа пакетов прикладных программ (ППП). В создании этих ППП прини¬
мают участие как разработчики системы MATLAB, так и многочисленные партнеры.
В результате современное семейство продуктов MATLAB включает более 50 ППП,
а также свыше 250 приложений, разработанных более чем 170 партнерами фирмы, что
существенно расширяет функциональные возможности системы. Эти возможности
отмечены на рисунке блоками Toolboxes и MathWorks Partner Products.
/ШОГЛИ
3
В составе системы MATLAB можно теперь обнаружить ряд инструментальных
средств (ИС) разработки приложений Application Development Tools. Это ИС Note¬
book для написания живых М-книг, ИС Excel Link для работы с электронными табли¬
цами MS Excel, ИС GUIDE для создания GUI-приложений, ИС Runtime Server для соз¬
дания независимо исполняемых приложений Standalone Applications, ИС Web Server
для работы с приложениями MATLAB в сети Internet.
Инструментальные средства доступа к данным Data Access Tools включают про¬
граммное обеспечение для работы с базами данных, сбора информации в режиме ре¬
ального времени (блок Data Sources).
Наконец, следует отметить ту огромную роль, которую играют студенческие вер¬
сии Student Products. Те, кто следили за историей развития системы MATLAB, не мо¬
гут не отметить, что, начав с упрощенных версий, в настоящее время фирма выпускает
в качестве студенческой полную версию системы, но при этом запрещает и блокирует
ее коммерческое использование в части создания независимо исполняемых приложений.
Помимо перечисленных выше компонентов в состав семейства MATLAB входит
подсистема моделирования динамических процессов SIMULINK. Для пользователя
это конструктор, с помощью которого он может объединять блоки, соответствующие
отдельным элементам динамической системы в единое целое и изучать их поведение
во времени. При этом пользователь получает доступ ко всем наборам блоков Block¬
sets, относящимся к различным приложениям.
Возможности моделирования, предоставляемые продуктами семейства MATLAB,
не ограничены только анализом динамического поведения систем во времени, а до¬
пускают также моделирование событий (блок Stateflow), что позволяет имитировать
различные ситуации, возникающие при эксплуатации технической системы. Это по¬
вышает роль математического моделирования, поскольку позволяет формировать ар¬
хивы событий, которые могут иметь неоценимое значение при анализе нештатных си¬
туаций. В этой связи следует обратить внимание, что в состав программных продуктов
включены генераторы отчетов для вычислительных работ MATLAB Report Generator
и процедур моделирования SIMULINK Report Generator.
Обратим внимание на наличие в составе продуктов семейства MATLAB/SIMU-
LINK инструментальных средств генерации кодов Code Generation Tools. Это позво¬
ляет не только создавать независимо исполняемые коды на языкау С или Ada,
но и выполнять их аппаратную реализацию на различных типах микропроцессоров.
Именно эти особенности новой версии MATLAB позволяют характеризовать ее как
среду проектирования инженерных приложений, что значительно превосходит перво¬
начальный замысел системы как среды инженерных и научных вычислений.
Справочный материал и описание расширений системы MATLAB в виде пакетов
прикладных программ, наборов модулей и инструментальных средств можно найти
в работах [5, 11, 15, 16, 21]. В процессе подготовки книги к изданию вышла новая вер¬
сия системы 6.5 Release 13.0.1, в которую включен ряд новых пакетов прикладных
программ (ППП) и инструметальных средств (ИС), а также выполнены обновления ря¬
да существующих программыных продуктов. Представление о структуре новой версии
системы MATLAB в сравнении с предшествующей версией можно почерпнуть из сле¬
дующей таблицы:
4
В. Г. Потемкин. Вычисления в среде MATLAB
№>
п/п
Наименование продукта
Версия
Примечание
6.5 (R13)
6.5 (R13.0.1)
1
MATLAB
6.5
6.5
2
Simulink
5.0
5.0.1
Обновление
3
Aerospace Blockset
1.0.1
1.0.1
4
CDMA Reference Blockset
1.1
1.1
5
Communications Blockset
2.5
2.5
6
Communications Toolbox
2.1
2.1
7
Control System Toolbox
5.2
5.2
8
Curve Fitting Toolbox
1.1
1.1
9
DSP Blockset
5.0
5.0
10
Data Acquisition Toolbox
2.2
2.2
11
Database Toolbox
2.2.1
2.2.1
12
Datafeed Toolbox
1.3.1
1.4.1
Обновление
13
Dials & Gauges Blockset
1.1.2
1.1.2
14
Embedded Target for Infenion Cl66
Microcontroolers
-
1.0
Новое ИС
15
Embedded Target for Motorola MPC555
1.0.1
1.0.1
16
Embedded Target for Motorola HC12
-
1.0
Новое ИС
17
Embedded Target for OSEK/VDX
-
1.0
Новое ИС
18
Embedded Target for TI C6000 DSP
1.0
1.0
19
Excel Link
2.0
2.0
20
Filter Design Toolbox
251
2.5
Обновление
21
Financial Derivatives Toolbox
2"6
2.6
22
Financial Time Series Toolbox
2.0
2.0
23
Financial Toolbox
2.2.1
2.3
Обновление
24
Fixed-Income Toolbox .
-
1.0
Новый ППП
25
Fixed-Point Blockset
4.0
4.0.1
Обновление
26
Fuzzy i ogic Toolbox
2.1.2
2.1.2
27
GARCH Toolbox
1.0.2
2.0
Обновление
28
Image Ecquisition Toolbox
-
1.0
29
Image Processing Toolbox
3.2
4.0
Обновление
30
Instrument Control Toolbox
1.2
1.2
31
LMI Control Toolbox
1.0.8
1.0.8
32
MATLAB COM Builder
1.0
1.0
33
MATLAB Compiler
3.0
3.0
34
MATLAB Excel Builder
1.1
1.1
35
MATLAB Link for Code Composer Studio
1.0
1.2
Обновление
36
MATLAB Report Generator
1.3
1.3
37
MATLAB Runtime Server Development Kit
6.1.1
6.1.1
Введение
5
№
п/п
Наименование продукта
Версия
Примечание
6.5 (R13)
6.5 (R13.0.1)
38
MATLAB Web Server
6.1.1
6.1.1
39
Mapping Toolbox
1.3
1.3
40
Model Predictive Control Toolbox
1.0.7
1.0.7
41
Model-Based Calibration Toolbox
1.1
1.1
42
Mu-Analysis and Synthesis Toolbox
3.0.7
3.0.7
43
Neural Network Toolbox
4.0.2
4.0.2
44
Nonlinear Control Design Blockset
1.1.6
1.1.6
45
Optimization Toolbox
2.2
2.2
46
Partial Differential Equation Toolbox
1.0.4
1.0.4
47
Real-Time Windows Target
2.2
2.2
48
Real-Time Workshop
5.0
5.0.1
Обновление
49
Real-Time Workshop Embedded Coder
3.0
3.0.1
Обновление
50
Requirements Management Interface
1.0.4
1.0.4
51
Robust Control Toolbox
2.0.9
2.0.9
52
SB2SL (SystemBuild to Simulink)
2.5
2.5
53
Signal Processing Toolbox
6.0
6.1
Обновление
54
SimMechanics
1.1
2.1
Обновление
55
SimPowerSystems
2.3
2.3
56
Simulink Performance Tools
1.2
1.3
57
Simulink Report Generator
1.3
1.3
58
Spline Toolbox
3.1.1
3.2
Обновление
59
Stateflow
5.0 ’
5.1
60
Stateflow Coder
5.0
5.1
61
Statistics Toolbox
4.0
4.1
Обновление
62
Symbolic Math Toolbox
2.1.3
3.0.1
Обновление
63 "
System Identification Toolbox
5.0.2
5.0.2
64
Virtual Reality Toolbox
3.0
3.1
Обновление
65
Wavelet Toolbox
2.2
2.2
66
xPC Target
2.0
2.0
67
xPC TargetBox
-
1.0
Новое ИС
68
xPC Target Embedded Option
2.0 1
2.0
Операционная среда вычислений в системе MATLAB поддерживается следующи¬
ми компонентами:
Компоненты поддержки операционной среды вычислений
MATLAB
MATLAB Compiler
MATLAB COM Builder
Система инженерных и научных расчетов
Компилятор М-файлов на язык С
Компоновщик объектных модулей
6
В. Г. Потемкин. Вычисления в среде MATLAB
Компоненты поддержки операционной среды вычислений
Excel Link
Интерфейс электронных таблиц MS Excel с системой MATLAB
MATLAB Excel Builder
Компоновщик объектных модулей для поддержки интерфейса
с MS Excel
MATLAB Report Generator
Генератор отчетов
MATLAB Runtime Server
Сервер независимо исполняемых приложений
MATLAB Web Server
Сервер Web-приложений MATLAB
Сюда входят собственно система инженерных и научных расчетов MATLAB, ком¬
пилятор М-файлов с библиотеками математических и графических функций для язы¬
ков С и C++, компоновщик объектных модулей для языков Visual Basic for Applica¬
tions (VBA), С и C++, интерфейс электронных таблиц MS Excel с системой MATLAB
и компоновщик объектных модулей на языке Visual Basic, генератор отчетов, а также
серверы независимо исполняемых и Web-приложений, созданных в операционной
среде системы MATLAB.
Вычисления в системе MATLAB поддержаны как функциями ее ядра, так и сле¬
дующими пакетами расширений:
ППП поддержки вычислений
Symbolic Math Toolbox
ППП символьной математики
Extended Symbolic Math Toolbox
ППП символьной математики с ядром системы Maple V
Curve Fitting Toolbox
ППП аппроксимации и сглаживания
Spline Toolbox
ППП аппроксимации сплайнами
Partial Differential Equation Toolbox
ППП решения уравнений в частных производных
Optimization Toolbox
ППП оптимизации
Statistics Toolbox
ППП статистики
Fuzzy Logic Toolbox
ППП нечеткой логики
Neural Network Toolbox
ППП анализа и проектирования нейронных сетей
Mapping Toolbox
ППП картографии
Разделы вычислительной математики, такие как вычисление элементарных и спе¬
циальных функций, решение систем линейных уравнений, вычисление собственных
значений и сингулярных чисел, поддержаны ядром системы MATLAB.
Пакет символьной математики Symbolic Math Toolbox позволяет выполнять сим¬
вольные аналитические вычисления, а его расширение ППП Extended Symbolic Math
Toolbox обеспечивает доступ к ядру системы компьютерной алгебры Maple V.
ППП Curve Fitting Toolbox и Spline Toolbox предназначены для аппроксимации
и сглаживания экспериментальных данных.
Раздел математики, связанный с решением уравнений в частных производных,
поддержан пакетом программ Partial Differential Equation Toolbox.
Набор методов безусловной и условной оптимизации реализован в виде пакета
программ оптимизации Optimization Toolbox.
Статистическая обработка данных поддержана специализированным пакетом про¬
грамм Statistics Toolbox.
Введение
7
Математика нечеткой логики и нейронная математика поддержаны пакетами про¬
грамм Fuzzy Logic Toolbox и Neural Network Toolbox.
Картографические задачи могут быть решены с помощью ППП Mapping Toolbox.
Описание некоторых из этих пакетов на русском языке можно найти в книгах
[5, 15, 16, 24].
При написании данной книги была использована документация справочной под¬
системы, а также ряд полнотекстовых документов по системе MATLAB 6 [66-72].
Остановимся на структуре книги, материал которой выстроен следующим образом.
Первая глава посвящена организации вычислительных работ в диалоговой среде
системы MATLAB в режиме командного окна. Здесь рассмотрены все возможные спо¬
собы ввода и редактирования операторов, выполнения М-файлов и вывода результа¬
тов.
Вторая глава содержит систематическое описание языка MATLAB. Особое внима¬
ние уделено операциям над массивами чисел и матрицами. Детально рассмотрены ха¬
рактеристики арифметики с плавающей точкой, реализованной в среде системы MAT¬
LAB. Значительное внимание уделено операторам отношения, логическим операто¬
рам, операторам обработки множеств и операторам побитовой обработки. В связи
с широким применением системы MATLAB для обработки экспериментальных дан¬
ных и финансовых вычислений, подробно рассмотрены операторы вычисления дат,
текущего времени и его интервалов.
В третьей главе рассмотрены вопросы программирования и отладки в среде систе¬
мы MATLAB. Отмечены различия, присущие двум типам М-файлов - М-сценарий
и М-функция, и даны практические рекомендации по их оформлению. Описаны спо¬
собы вызова М-функций на выполнение из командной строки и из других М-файлов,
правила передачи аргументов, понятия рабочей области, локальных и глобальных пе¬
ременных. Значительное внимание уделено организации диалога с пользователем,
а также программированию ошибочных ситуаций.
Особенностью новой версии системы MATLAB является ее ориентация на диало¬
говый режим работы. Это касается как процедур редактирования, так и отладки М-
файлов. Для этих целей в состав системы MATLAB включен специализированный
текстовый редактор и отладчик Editor/Debugger.
Наличие в составе версии MATLAB 6.5 профилировщика М-файлов позволяет
оценить эффективность программирования в среде MATLAB. Профилировщик выяв¬
ляет операторы с наибольшим временем исполнения, подсчитывает количество вызо¬
вов, а также отмечает те операторы, которые используют JIT-ускоритель. Профили¬
ровщик позволяет оценивать производительность программ любой сложности,
включая и программы с использованием GUI-интерфейса. Отдельный раздел посвя¬
щен оценке эффективности вычислений, тестам оценки производительности и анализу
возможностей ее роста.
Четвертая глава, представляя на первый взгляд классический материал по матема¬
тическим функциям, тем не менее, раскрывает уникальные возможности нового объ¬
екта языка MATLAB - однострочного оператора задания функции inline. Методы ра¬
боты с этим объектом широко представлены в примерах описания различных
функций. Следует отметить, что все описанные функции рассматриваются как функ¬
ции комплексной переменной.
8
В. Г. Потемкин. Вычисления в среде MATLAB
Раздел специальных, функций дополнен новыми типами функций и в полной мере
соответствует их описанию в книге [27].
Последние две главы книги посвящены работе с полными и разреженными матри¬
цами. Значительное внимание уделено описанию коллекции тестовых матриц и графи¬
ческому представлению их характеристики. Эти матрицы характеризуются особыми
свойствами, среди которых следует отметить плохую обусловленность по отношению
к задаче обращения, наличие дефекта, кратность собственных значений. В последнем
случае анализ кластеров таких значений выполняется с помощью разработанного ав¬
тором книги пакета программ JORD, описание которого представлено в специальном
Приложении. После выхода книги в свет модули этого пакета и его описание будут
размещены на сайте www.matlab.ru.
В отдельных разделах рассмотрены вопросы решения систем линейных алгебраи¬
ческих уравнений, вычисления собственных значений, сингулярных чисел и функций
от матриц, а также методы работы с полиномами от одной переменной. В последнем
случае полином рассматривается и как вектор коэффициентов, и как объект класса
polynom.
Глава, описывающая работу с разреженными матрицами, существенно расширена
в той части, которая касается решения больших систем линейных уравнений. В ней
выделены разделы для решения систем уравнений с различными типами матриц.
В состав книги входит 4 приложения, индексный и предметный указатели, а также
список литературы, включающий более 100 ссылок.
Введение
9
1. ОРГАНИЗАЦИЯ ВЫЧИСЛЕНИИ
Система MATLAB - это, в первую очередь, интерактивная среда для выполнения
вычислений в арифметике с плавающей точкой. Поэтому диалоговый режим работы,
инициируемый пользователем, является основным режимом и реализуется с использо¬
ванием командного окна. Ознакомимся с основными приемами выполнения вычисле¬
ний в командном окне.
Пользователь поддерживает диалог с системой MATLAB с помощью операторов,
которые исполняются системой в режиме интерпретации. Операторы реализуются ли¬
бо в виде непосредственно исполняемых команд, либо в виде функций с явным или
неявным присваиванием.
Операторы формируются из специальных символов, имен функций и переменных,
а также числовых констант и могут оканчиваться запятой или точкой с запятой, кото¬
рые управляют выводом результата на экран.
Для изменения стандартного порядка выполнения операций используются круглые
скобки, как это принято при записи математических выражений. Пробелы, отделяю¬
щие символы операций, необязательны, но их часто вводят для удобства чтения.
Результат вычисления выражения присваивается переменной, заданной в левой
части от знака равенства, с целью дальнейшего использования, и такое присваивание
называется явным. Если переменная в левой части отсутствует, то система MATLAB
автоматически создает переменную с именем ans (ANSwer) и присваивает ей значение
результата; такое присваивание называется неявным. Переменная ans сохраняет значе¬
ние только до следующего неявного присваивания.
Имена переменных и функций могут быть составлены из любых символов алфави¬
та, за исключением специальных. Имя обязательно должно начинаться с буквы, за ко¬
торой может следовать произвольное сочетание букв и цифр. Длина имени, вводимого
пользователем, не ограничена, но при обработке в версии системы MATLAB 6 учиты¬
ваются только первые 63 символа. Для контроля правильности вводимого имени пре¬
дусмотрены встроенные функции isvarname и namelengthmax, которые позволяют про¬
верить, является ли введенное имя правильным, и проконтролировать его допустимую
длину. Применение этих функций обеспечивает преемственность разрабатываемого
программного обеспечения для будущих версий, где соответствующие параметры мо¬
гут претерпеть изменения.
Для записи действительных чисел используются две формы:
• обычная десятичная форма, когда для представления целых чисел необязательно
использовать точку и плюс - для знака числа;
• показательная форма с мантиссой и показателем степени по основанию 10 (отделя¬
ется от мантиссы символом е или Е) без пробелов между ними.
Вычисления в системе MATLAB выполняются как в поле действительных, так
и в поле комплексных чисел с удвоенной точностью.
шош\
10
1.1. Ввод и редактирование операторов
Приглашение
>>
в строке окна Command Window, означает, что система MATLAB готова к диалогу
с пользователем и разрешает выполнить ввод того или иного оператора. Такая строка,
по терминологии системы MATLAB, называется командной строкой.
Операторы системы MATLAB делятся на команды и функции. Команды выполня¬
ют некоторое действие и, как правило, не формируют выходной переменной. Функции
же предполагают наличие входных и выходных переменных. Это приводит к двум
форматам синтаксиса при задании оператора в командной строке.
Формат команды имеет вид
<имя_команды> <опция1> <опция2> ...
и не предполагает использования скобок.
Формат функции, наоборот, активно использует скобки и имеет вид
[outl,out2, ...] = <имя_функции>(’argl’,’arg2’,...)
В том случае, когда выходные аргументы отсутствуют, формат функции имеет вид
<имя_функции>(’argl’,'arg2
и может быть записан в формате команды:
<имя_функции> argl arg2 ...
В свою очередь, и команда может быть записана в формате функции:
<имя_команды>(’<опция1>’,’<опция2>
Таким образом, в системе MATLAB допускается двойственность в представлении
как функций, так и команд. Однако этот принцип не отслеживается в полной мере
и поэтому рекомендуется для команд придерживаться формата команд, а для функ¬
ций - формата функций.
Пример:
Команда записать все данные из рабочей области в файл с указанным именем в 16-
символьном ASCII-формате может быть представлена как в формате команды
save <имя_файла> -ascii -double
так и в формате функции
save(’<имя_файла>’, '-ascii' , '-double')
Последний формат содержит дополнительные кавычки и скобки и вряд ли удобен
практически.
Оператор присваивания. Одним из наиболее распространенных операторов вычис¬
лений является оператор присваивания. С его помощью можно задавать значения пе¬
ременным, вычислять сложные арифметические выражения, вызывать функции.
Оператор присваивания позволяет реализовать в командной строке математиче¬
ский калькулятор для выполнения инженерных и научных расчетов. Большой набор
встроенных арифметических и специальных математических функций позволяет реа¬
лизовать точные и быстрые расчеты с высокой точностью на основе арифметики
с плавающей точкой. При этом, в отличие от широко известных калькуляторов для
1. Организация вычислений
11
инженерных расчетов, калькулятор системы MATLAB может выполнять вычисления
не над одним числом, а сразу над массивом чисел.
Попробуем вычислить в арифметике с плавающей точкой следующее выражение,
составленное из трансцендентных чисел, которое должно быть целым числом:
N = exp(pi*sqrt(163))
N = 262537412640768260
Результатом является число с плавающей точкой с 15 точными значащими числа¬
ми, в то время как полное количество знаков этого целого числа равно 18. Этот пример
показывает, что арифметика с плавающей точкой имеет ограниченную точность, и это
может проявляться даже при простейших вычислениях.
Следующий оператор присваивания позволяет задать значения элементам массива
А размера 3x3:
А = [12 3; 4 5 6; 7 8 10]
А =
12 3
4 5 6
7 8 10
Теперь не вызывает трудностей вычислить, например, функцию квадратного корня
от каждого из элементов этого массива:
в = sqrt(A)
В =
1
1.4142
1.7321
2
2.2361
2.4495
2.6458
2.8284
3.1623
Если применяется оператор вызова функции, то требуется указать все входные
и выходные аргументы. Например, вызов встроенной функции для формирования ма¬
гического квадрата размера 4x4 выглядит следующим образом:
А = magic(4)
А =
16
. 2
3
13
5
11
10
8
9
7
6
12
4
14
15
• 1
Все приведенные выше примеры соответствуют операторам с явным присваиванием.
Операторы с неявным присваиванием. Как уже отмечалось выше, если в операторе
присваивания отсутствует левая часть, то система MATLAB автоматически создает
переменную с зарезервированным именем ans, которая сохраняет свое значение в те¬
чение ограниченного интервала времени - до вызова следующего оператора с неявным
присваиванием. Например, последний пример формирования магического квадрата
может быть записан следующим образом в виде оператора с неявным присваиванием:
magic(4)
ans =
16
2
3
13
5
11
10
8
9
7
6
12
4
14
15
1
12
В. Г. Потемкин. Вычисления в среде MATLAB
Ввод нескольких операторов в строке. Для того чтобы ввести несколько операто¬
ров в одной строке, следует использовать два типа разделителей: запятую (,) и точку
с запятой (;), причем последний разделитель еще и подавляет вывод результата на эк¬
ран терминала. В качестве примера сформируем строку с тремя операторами, которая
задает таблицу значений тригонометрических функций:
format short g; х = (0:pi/6:2*pi)1;
trigf = [x/pi*180 sin(x) cos(x) tan(x)]
trigf =
0
0
1
0
30
0.5
0.86603
0.57735
60
0.86603
0.5
1.7321
90
1
6.1232е-017
1.6331е+016
120
0.86603
-0.5
-1.7321
150
0.5
-0.86603
-0.57735
180
1.2246е-01б
-1
-1.2246е-016
210
-0.5
-0.86603
0.57735
240
-0.86603
-0.5
1.7321
270
-1
-1.837е-016
5.4437е+015
300
-0.86603
0.5
. -1.7321
330
-0.5
0.86603
-0.57735
360
-2.4493e-016
1
-2.4493е-016
Здесь выводится
на экран только
результирующая таблица. В этой таблице угол
измеряется в градусах, а погрешность вычисления тригонометрических функций со¬
ставляет величину порядка е-016; при вычислении функции тангенса некоторые зна¬
чения было бы разумно представить значениями Inf (бесконечность), но для этого не¬
обходимо предусмотреть специальные способы обработки чисел.
Ввод строки с продолжением. Если оператор не удается разместить в одной стро¬
ке, то возможно продолжение его ввода в следующей строке, если в конце первой
строки указать знак продолжения (...) в виде трех последовательных точек. Таким об¬
разом можно разместить очень длинный оператор в нескольких строках. Такие ситуа¬
ции возникают при вводе конструкций языка Java, а также при работе с полями масси¬
вов записей, которые зачастую имеют длинные составные имена, или при формирова¬
нии заголовков таблиц. Рассмотрим пример формирования заголовка для сформиро¬
ванной выше таблицы тригонометрических функций.
headers = [blanks(4) 'Угол,град’ blanks(lO) ’sin’ ...
blanks(10) ’cos’ blanks(10) 1 tg* ];
disp(headers), disp(trigf)
Угол,град
sin
cos
tg
0
0
1
0
30
0.5
0.86603
0.57735
60
0.86603
0.5
1.7321
90
1
6.1232е-017
1.6331е+016
120
0.86603
-0.5
-1.7321
150
0.5
-0.86603
-0.57735
180
1.2246е-016
-1
-1.2246е-016
210
-0.5
-0.86603
0.57735
240
-0.86603
-0.5
1.7321
270
-1
-1.837е-016
5.4437е+015
300
-0.86603
0.5
-1.7321
330
-0.5
0.86603
-0.57735
360
-2.4493е-016
1
-2.4493е-016
1. Организация вычислений
13
Ввод последовательных строк. Для того чтобы организовать ввод нескольких по¬
следовательных строк операторов (многострочный ввод операторов), следует для пе¬
рехода на следующую строку использовать сочетание клавиш Shift+Enter(Return).
После завершения многострочного ввода надо нажать клавишу Enter(Return), чтобы
выполнить все введенные операторы.
Создание гиперссылки для запуска функции. Начиная с версии 6 система MATLAB
позволяет сформировать гиперссылку для отложенного запуска функции из команд¬
ной строки, применяя встроенные функции disp и fprintf. Для этого, используя синтак¬
сис языка HTML, следует создать следующую конструкцию:
>disp('<a href="inatlab:magic (4) "Сформировать магический квадрат</а> ')
Сформировать магический квадрат
Исполнение сформированной гиперссылки может быть отложено, но если ее акти¬
визировать, то будет получен следующий результат:
ans =
16
5
9
4
2 3 13
11 10 8
7 6 12
14 15 1
Чувствительность к регистру. Система MATLAB чувствительна к выбору регист¬
ра строчных или прописных букв. Поэтому при вводе оператора не следует использо¬
вать регистр прописных букв, а при вводе имен переменных следует помнить, что пе¬
ременная b и переменная В - это разные переменные. В подсистеме Help имена
функций изображаются прописными буквами, но это сделано только для удобства
чтения. Ряд функций, связанных с интерфейсом языка Java, используют символы
в смешанных регистрах, и в этих случаях соответствующие описания подсистемы Help
точно отражают такие ситуации. Никогда не используйте прописных букв в именах
функций!
Правила использования цветов при вводе операторов. При вводе строк символов,
скобок, комментариев и других элементов в системе MATLAB предусмотрено приме¬
нение различных цветов для контроля правильности ввода соответствующих элемен¬
тов. Перечисленные ниже правила использования цветов соответствуют принятым
по умолчанию, и пользователь может изменить их, употребив опцию Preferences меню
File.
• При вводе строки символов открывающий апостроф инициирует использование
фиолетового цвета (purple), а закрывающий апостроф изменяет цвет символов
на каштановый (maroon).
• Служебные слова операторов управления for, if, switch, while, а также символ про¬
должения строки (.. .) окрашены в синий цвет (blue).
• Комментарии, открывающиеся символом %, выделяются зеленым цветом (green).
• Команда операционной системы, открывающаяся символом !, окрашивается в зо¬
лотистый цвет (gold).
• Двойной щелчок левой кнопки мыши на открывающей или закрывающей круглой
скобке выделяет заключенные в них символы синим цветом (blue).
14
В. Г. Потемкин. Вычисления в среде MATLAB
• При вводе открывающей или закрывающей скобки соответствующая ей закры¬
вающая или открывающая скобка на мгновение выделяется синей подсветкой. Если
вводится неверная скобка, то она перечеркивается. Настройте нужным образом оп¬
ции Parenthesis matching в окне Command Window Keyboard&Indenting Prefer¬
ences опции Preferences меню File, а затем при вводе скобок следите за их соответ¬
ствием!
• Можно проверить соответствие открывающих и закрывающих скобок в командной
строке, если перемещать курсор вдоль строки, например слева направо; тогда в за¬
висимости от настроек опции Match parenthesis on arrow key movement соответст¬
вующие скобки будут подсвечиваться или подчеркиваться, а ошибочные скобки
перечеркиваться или сопровождаться звуковым сигналом.
• Сообщения о синтаксических ошибках выводятся на экран красным цветом (red).
Пример настройки опции Parenthesis matching в окне Command Window Key¬
board&Indenting Preferences показан на рис. 1.1.
рис. 1.1
Редактирование операторов. При вводе операторов в командной строке системы
MATLAB можно воспользоваться рядом очень удобных приемов, например возмож¬
ностью частичного ввода имени переменной или оператора и автоматического завер¬
шения с помощью клавиши табуляции Tab, а также возможностью движения по ко¬
мандной строке и окну в целом с помощью клавиш перемещения.
Tab-завершение ввода. Эта операция, реализуемая с помощью клавиши табуляции
Tab, может применяться при вводе в командной строке имен переменных, функций
и файлов, а также полей структур и названий свойств объектов дескрипторной графи¬
1. Организация вычислений
15
ки. Достаточно ввести несколько первых букв, чтобы затем система автоматически за¬
вершила ввод оставшихся символов, если имя или название определены однозначно.
Если однозначный выбор отсутствует, то повторное нажатие на клавишу табуляции
Tab вызовет вывод на экран списка допустимых имен, из которых вы либо выбираете
нужное, либо продолжаете ввод символов, пока выбор не окажется однозначным. Для
реализации этой функциональной возможности необходимо в окне Command Window
Keyboard&Indenting Preferences (см. рис. 1.1) определить кнопку выбора Enable up
to N tab completions и указать максимальное количество предлагаемых вариантов N,
по умолчанию 100.
Примеры:
Допустим, вы затрудняетесь с вводом имени функции length, но уверены в пра¬
вильности первых трех символов. Тогда схема набора
» 1епТ
>> length
где символ Т означает однократное применение клавиши табуляции, приведет к одно¬
значному выбору имени функции length.
Другой случай: вы решили использовать имя переменной, которое начинается
с символов 'cos’. Чтобы избежать возможных коллизий с именами функций, вы можете
применить следующую схему набора:
» cosTT
cos cosets cosint
cos_tr cosh costfun
>> cos
где сочетание символов TT означает двукратное применение клавиши табуляции. Те¬
перь вы можете выбрать такое продолжение последовательности символов ’cos’, чтобы
избежать коллизии с именами используемых в системе функций.
Команды редактирования. Для редактирования командной строки можно приме¬
нять следующие клавиши стрелок или команды:
Клавиша
Команда
Назначение
Ctrl+P
Вызов предыдущей командной строки
г
Ctrl+N
Вызов следующей командной строки после многократного
применения клавиши Т или команды Ctrl+P
->
Ctrl+F
Перемещение курсора на 1 символ вперед
<—
Ctrl+B
Перемещение курсора на 1 символ назад
Ctrl+—»
Перемещение курсора на 1 слово вперед
Ctrl+<—
Перемещение курсора на 1 слово назад
Ноше
Ctrl+A
Перемещение курсора в начало командной строки
End
Ctrl+E
Перемещение курсора в конец командной строки
Ctrl+Home
Перемещение курсора в первую строку командного окна
Ctrl+End
Перемещение курсора в последнюю строку командного окна
Esc
Ctrl+U
Удаление командной строки
16
В. Г. Потемкин. Вычисления в среде MATLAB
Клавиша
Команда
Назначение
Delete
Ctrl+D
Удаление символа в командной строке в позиции справа
от курсора
Backspace
Ctrl+H
Удаление символа командной строке в позиции слева от курсора
Ctrl+K
Удаление всех символов в командной строке справа от курсора
Shift+Home
Выделить все символы в командной строке слева от курсора
Shift+End
Выделить все строки командного окна, начиная с позиции кур¬
сора и до завершения командной строки, возможно много¬
строчной
Для реализации этой функциональной возможности необходимо в окне Command
Window Keyboard&Indenting Preferences (см. рис. 1.1) определить кнопку выбора
Emacs (MATLAB standard), которая задает тип раскладки клавиатуры и установлена
по умолчанию.
Вызов ранее введенных командных строк. Командные строки, введенные в течение
сеанса работы хранятся в специальном буфере, а также отображаются в окне предыс¬
тории Command History. Для извлечения командных строк из буфера хранения следу¬
ет использовать стрелочные клавиши ? и i, которые позволяют перемещаться по буферу.
Пример: ’
Допустим, что при вводе следующего арифметического выражения была допущена
ошибка и необходимо вернуть этот оператор в командную строку, чтобы исправить
ошибку:
rho = (l+sqt(5))/2
??? Undefined function or variable 'sqt'.
Применяя клавишу ?, мы возвращаем оператор в командную строку и, переместив
курсор в нужную позицию, можем исправить ошибку, введя недостающий символ г.
Таким же способом можно перебрать все командные строки в буфере. Но можно
воспользоваться так называемым быстрым вызовом, когда вы указываете один или
несколько первых символов интересующей вас строки и из буфера выбирается тре¬
буемая командная строка.
Поиск заданной последовательности символов. В командном окне можно органи¬
зовать два типа поиска последовательности символов - глобальный и локальный.
Глобальный поиск выполняется на всем пространстве командного окна и реализуется
с помощью диалогового окна Find, вызываемого из меню Edit (рис. 1.2)
рис. 1.2
1. Организация вычислений
17
Последовательность поиска:
• ввести последовательность символов в поле Find what;
• в списке просмотра Look in указать Command Window;
• определить способ поиска: с учетом регистра (Match case), целиком слово (Whole
word), круговой поиск (Wrap around);
• кликнуть кнопку Previous или Next, чтобы выполнить поиск в области, предшест¬
вующей положению курсора, либо в области, следующей за курсором; если в про¬
цессе поиска достигается командная строка, то раздается звуковой сигнал, но поиск
будет продолжен, если выбран режим кругового поиска.
Локальный, или контекстный, поиск выполняется в тексте, следующем за положе¬
нием курсора. Контекстный поиск (Incremental Search - I-search) можно активизиро¬
вать либо быстрой клавишей Ctrl+S (для раскладки клавиатуры Emacs, принятой
по умолчанию в системе MATLAB), либо быстрой клавишей Ctrl+Shift+S (для рас¬
кладки клавиатуры Windows) (рис. 1.3).
< Start I
рис. 1.3
Строка для набора последовательности символов размещается в нижней части ко¬
мандного окна и обозначена как I-search. Поиск организован следующим образом:
• в поле I-search вы набираете нужную последовательность символов; как только
набрана первая буква, она отыскивается в области командного окна и подсвечива¬
ется синим цветом, при наборе второго символа ищется сочетание двух символов
и т. д.;
• если вы попали на нужное слово, вы можете выделить его целиком с помощью бы¬
стрых клавиш Ctrl+W (рис. 1.4);
• используя клавиши Ctrl+S или Ctrl+R, вы можете переходить к последующим или
предыдущим сочетаниям выбранных символов;
18
В. Г. Потемкин. Вычисления в среде MATLAB
• для завершения контекстного поиска используйте клавиши Esc или Enter, либо лю¬
бую другую командную клавишу, не связанную с набором букв и цифр;
• при нажатии клавиш Ctrl+R контекстный поиск будет возобновлен с предыдущего
набора символов (рис. 1.4), о чем напоминает имя поля I-search backward.
При контекстном поиске соблюдается следующее правило учета регистра: если при
наборе последовательности символов вводится строчная буква, то поиск реализуется
как среди строчных, так и среди прописных букв; если же вводится прописная буква,
то поиск реализуется только среди прописных букв.
1.2. Выполнение М-файлов
М-файлы, которые содержат коды на языке MATLAB, могут быть вызваны из ко¬
мандной строки точно так же, как и любой оператор системы MATLAB. Для этого
достаточно лишь ввести имя М-файла и нажать клавишу Enter (Return). Единствен¬
ное требование заключается в том, что М-файл должен находиться в текущем каталоге
или на пути доступа. Для того чтобы проследить выполнение каждого оператора М-
файла, необходимо в области Display окна Command Window Preferences указать оп¬
цию Echo on.
Вызов функций. При вызове из командной строки М-файла или встроенной функ¬
ции, а также при выполнении команд пользователь может выбрать один из двух фор¬
матов представления оператора - формат функции или формат команды. Формат ко¬
манды отличается краткостью и наглядностью, но для функций может быть применен
только в тех случаях, когда выходной аргумент отсутствует. В этом случае оператор
формируется следующим образом:
function_name ini in2 ... inN
l. Организация вычислений
19
Если функция имеет единственный присваиваемый выход, то соответствующий
оператор имеет вид
out = function_name(ini, in2, inN)
Если функция возвращает более одного выхода, то выходные аргументы помеща¬
ются в квадратные скобки и разделяются либо запятыми, либо пробелами:
[outlzout2,..., outN] = function_name(ini,in2,...,inN)
Диалог с пользователем. Существует 3 способа вмешательства пользователя в про¬
цесс выполнения программы:
• запросить требуемые для выполнения программы значения параметров;
• приостановить выполнение программы для просмотра текущих результатов или
графиков;
• использовать графический интерфейс.
Используя функцию input, можно попросить пользователя ответить на заданный
вопрос, выбрав ту или иную альтернативу. В следующем примере осуществляется вы¬
бор демонстрационного файла из списка и реализуется его выполнение. Обратите
внимание, что все строки списка должны иметь одинаковую длину.
D = [1odedemo1
1 qu at demo1
1quivdemo1
1fitdemo *];
n = input('Укажите номер файла в списке:')
eval(D(n,:))
Используя указанный фрагмент, вы можете просмотреть соответствующие демон¬
страционные файлы, входящие в состав системы MATLAB 6.
Аналогично можно попросить ввести свой адрес на русском языке:
address = input(’Введите адрес: ’,'s')
Введите адрес: Москва, МИФИ, Каширское шоссе, 31
address = Москва, МИФИ, Каширское шоссе, 31
Однако в этом случае следует заметить, что русскую букву "с”, как строчную, так
и прописную, следует вводить в регистре EN английского языка из-за присутствую¬
щей в версии MATLAB 6 ошибки, до настоящего времени не исправленной разработ¬
чиком.
Команда keyboard, если она включена в текст М-файла, прерывает его исполнение
и передает управление клавиатуре. Этот специальный режим работы отмечается в ко¬
мандной строке приглашением К». В этом режиме пользователю доступны все ко¬
манды системы MATLAB. Завершить работу в этом режиме следует командой return;
после чего управление будет вновь передано прерванному М-файлу.
Приостановить выполнение М-файла можно с помощью команды pause, которая
реализует паузу для просмотра, например графиков, и ожидания нажатия любой кла¬
виши для продолжения исполнения М-файла. Можно ограничить паузу, указав ее дли¬
тельность в п секунд командой pause(n).
Рассмотрим в качестве примера построение четырех графиков в полярных коорди¬
натах и их автоматический вывод в графическое окно с паузой 1 с:
clear all,elf
theta = -pi:0.01:pi;
20
В. Г. Потемкин. Вычисления в среде MATLAB
rho(l,:) = 2*sin(5 *theta) .л2;
rho(2z:) = cos(10*theta).^3;
rho(3,:) = sin(theta).л2;
rho(4, :) = 5*cos(3.5 *theta) .л3;
for i = 1:4
polar(theta,rho(i, :)),pause(1)
end
Наиболее прогрессивным в настоящее время является диалог с пользователем
на основе графического интерфейса GUI, с которым можно ознакомиться либо через
демонстрационные файлы подсистемы Demo, либо по книге [21].
Принудительное прерывание М-файла. Чтобы в любой момент прервать выполне¬
ние М-файла, следует нажать клавиши Ctrl+C или Ctrl+Break. Следует иметь в виду,
что при работе на платформе Windows может потребоваться время для завершения вы¬
полнения встроенной функции или МЕХ-файла.
Если при выполнении М-файла в командном окне появляется сообщение об ошиб¬
ке, выделенное красным цветом, то для открытия М-файла достаточно либо кликнуть
на подчеркнутом пути доступа к файлу, либо установить курсор внутри сообщения
и нажать клавиши Ctrl+Enter. При этом откроется окно редактирования/отладки Edi-
tor/Debugger с мигающим курсором в начале строки, в данном случае строки 5 (рис. 1.5).
У C:\MATLAB6p5\work\petals.m
Е
File Edit View Text Debug Breakpoints Web Window Help
D E? id ffi ~ \&\* f.\ © © j С . I “3 xj
1
-
Script
Lt
2
-
clear all, elf
3
% M-file petals - сценарий построения графиков в полярных координатах
4
-
theta = -pi:0.01:pi;
5
-
rho(l,:) = 2*sin(5*thea). А2;
6
-
rho(2,:) = cos(10*theta).A3;
7
-
rho(3,:) = sin(theta).A2;
8
-
rho(4,:) = 5*cos(3.5*theta).A3;
9
-
for i = 1:4
10
-
subplot(eval([1221 num2str(i)]));
11
-
polar(theta,rho(i,:))
12
end
11........J
[script Ln 5 Col 1
polar (theta, rho(i, :)),
» petals
end
??? Undefined function or variable ‘thea*.
petals .
Error in ==> C:\lIATLAB6n5\work\petals.iii
4 1 ±T
On line 5 ==> rho(l,:) = 2*sin(5*thea).A2;
$ Start |
рис. 1.5
1. Организация вычислений
21
Находясь в командном окне, использование контекстного меню правой кнопки
мыши позволяет открыть либо файл с данными в окне редактирования массивов Array
Editor, либо М-файл - в окне редактирования/отладки Editor/Debugger. Для этих же
целей можно использовать команды open или edit, а также команду type, чтобы вывес¬
ти содержание М-файла в командное окно.
Выполнение только одного процесса. В системе MATLAB в каждый момент време¬
ни может выполняться только один процесс, другие активизированные операторы
формируют очередь, которая продвигается по мере завершения активных операторов.
Режим отладки. Этот режим прерывает выполнение программы и разрешает поль¬
зователю выполнить в командном окне любые операции. При этом изменяется форма
приглашения, принимая следующий вид:
к>>
1.3. Вывод результатов вычислений
Результат выполнения любого оператора будет выводиться в командное окно, если
он завершается разделителем запятая (,) или не завершается никаким разделителем.
Подавление вывода на экран результата вычислений. Если при выполнении вычис¬
лений в командной строке возникает много промежуточных результатов или ведется
обработка больших массивов чисел, когда результат вывода на экран не является на¬
глядным, следует использовать разделитель точка с запятой (;), чтобы подавить вывод
на экран результатов промежуточных вычислений.
Постраничный вывод информации. Если информация, выводимая на экран, зани¬
мает несколько экранных страниц, то управление таким выводом можно реализовать
с помощью оператора
more on
По умолчанию постраничный вывод подавлен.
Управление форматом вывода. Вывод отдельных чисел и их массивов реализуется
в определенных форматах, которые устанавливаются опциями Text display и Display
в окне Command Window Preferences (рис. 1.6). В данном случае установлены фор¬
маты вывода short g и compact, соответствующие выводу чисел в универсальной форме
из пяти значащих цифр и с подавлением пробела между строками. Кроме того, в опции
Display выбраны установки Wrap lines - ’’Свернуть строки" и Limit matrix display
width to eighty columns - "Ограничить ширину вывода числом столбцов, равным 80".
Первая установка делает строки ввода и вывода многострочными и позволяет отка¬
заться от горизонтальной прокрутки. Это весьма удобно при просмотре длинных стро¬
ковых выражений. Вторая- ограничивает ширину вывода числового массива 80
столбцами.
22
В. Г. Потемкин. Вычисления в среде MATLAB
Command Window Preferences
Command Wi n d о w
Gp-General
El
Figure Copy Template
SHSimulink
p Font & Colors
• Keyboard & Indenting
'-••• Command History
EbEditor/Debugger
©-Help
— Current Directory
--Workspace
- Array Editor
r-GUIDE
Cancel I
Text display
Numeric format: | shortg
Numeric display: [compact y]
Пример:
Сформировать и вывести на экран элементы следующего вектора:
х = [4/3 1.2345е-б]
х = 1.3333 1.2345е-006
В данном случае использован формат вывода short g, установленный в окне Com¬
mand Window Preferences.
Ведение дневника сеанса работы. Вся последовательность операций и их результа¬
тов, кроме графических изображений, полученных в сеансе работы, может быть со¬
хранена в виде файла, играющего роль дневника. Для открытия такого файла и управ¬
ления режимом записи предназначена команда diary.
Другой способ сохранения последовательности выполненных операторов - это бу¬
фер записей, отображаемых в окне предыстории Command History.
Пример:
Создать дневник записей, например с именем текущего дня.
diary 'зиХуЗв.оиЪ1
Эта команда включает режим записи в файл с указанным именем.
Чтобы остановить запись, следует воспользоваться командой
diary off
Чтобы снова включить запись в дневник, следует воспользоваться командой
diary on
Чередуя последние две команды, можно помещать в дневник отдельные фрагменты
выполняемых действий.
1. Организация вычислений
23
2. ЯЗЫК MATLAB
В этой главе мы приступаем к систематическому описанию языка системы MAT¬
LAB. Алфавит этого языка допускает использование любых символов из таблицы AS-
СП-кодов, включая символы русского языка для написания комментариев, а также
русского и греческого языков при оформлении графиков.
2.1. Специальные символы, переменные и константы
Специальные символы
Язык MATLAB резервирует для служебных целей ряд специальных символов, ко¬
торые позволяют различать типы данных, служат разделителями и указателями. Эти
символы перечислены в следующей таблице.
Символ
Описание
Назначение
[]
Квадратные скобки
Формирование векторов и матриц.
Задание последовательности выходных параметров
при обращении к функциям, возвращающим более
одного параметра
{}
Фигурные скобки
Формирование массивов ячеек.
Обращение к элементу массива ячеек
о
Круглые скобки
Задание порядка выполнения операций в арифме¬
тических выражениях.
Указание индексов элемента вектора, матрицы,
массива.
Указание последовательности входных параметров
функции
=
Знак присваивания
Знак присваивания в арифметических выражениях
Транспонирование матриц
Транспонирование, сопровождаемое операцией
комплексного сопряжения
Разделитель - точка
Десятичная точка.
Поэлементное выполнение операций над массивом
данных.
Доступ к полям массивов записей
••
Две точки
Переход по дереву каталогов на один уровень
вверх
Три и более точек
Признак продолжения строки
24
Символ
Описание
Назначение
Разделитель - запятая
Отделение операторов языка MATLAB.
Указание индексов элемента вектора, массива, мат¬
рицы
[;]
Разделитель- точка с за¬
пятой
Подавление вывода на экран результата вычисле¬
ний.
Отделение строк массива
[:]
Разделитель - двоеточие
Формирование векторов, выделение строк, столб¬
цов, подблоков массива.
Заголовок цикла for
%
Указатель
Указатель логического конца строки.
Указатель строки комментария
Указатель
Указатель ввода команды операционной системы
Переменные
Именование переменных. Имя переменной в языке MATLAB всегда должно начи¬
наться с буквы, за которой могут следовать произвольные комбинации цифр, латин¬
ских букв и символов подчеркивания. В имени переменной строчные и прописные
символы рассматриваются как различные, т. е. переменные с именами В и b - различ¬
ные переменные. Хотя на длину имени переменной, задаваемой пользователем, огра¬
ничений не налагается, тем не менее следует иметь в виду, что при работе системы ис¬
пользуется только часть имени, ограниченная N символами, причем это значение
зависит, от версии системы. Соответствующая константа может быть определена с по¬
мощью функции namelengthmax, например, следующим образом для версии
MATLAB 6.5:
N = namelengthmax
N = 63
Проверить правильность, имени переменной можно с помощью функции isvarname,
которая возвращает 1 (TRUE), если синтаксис правильный, и О (FALSE) - в ином случае:
isvarname 8th_column
ans = О
Имя переменной 8th_column не является правильным, поскольку начинается с цифры.
Имя переменной не должно совпадать с именем функции, поскольку в этом случае
ее нельзя будет вызвать. Избежать этой коллизии можно, если заранее проверить
предполагаемое имя на возможное совпадение с именем функции, применив следую¬
щую команду:
which -all <имя>
Можно также воспользоваться операцией Tab-завершения в форме.
<имя>ТТ
В этом случае будут выведены все имена функций, начинающиеся с символов
строки <имя>.
2. Язык MATLAB
25
Пример:
Проверить, можно ли использовать в качестве имени переменной сочетание симво¬
лов var.
which -all var
С:\MATLAB6p5\toolbox\mbc\mbcmodels\@xregmulti\var.m % xregmulti method
C:\MATLAB6p5\toolbox\mbc\mbcmodels\@xregmodel\var.m % xregmodel method
C:\MATLAB6p5\toolbox\matlab\datafun\var.m
To же можно проверить с помощью операции ТаЬ-завершения:
varTT
var var2sep varargout varyrand
var2con varargin varpick
Здесь помимо собственно сочетания символов ’var’ указаны также и другие имена,
начинающиеся с этого сочетания.
Переменная ans. При применении операторов с неявным присваиванием система
MATLAB автоматически создает переменную ans(ANSwer) и присваивает ей значение
результата. Переменная ans сохраняет значение до следующего оператора с неявным
присваиванием.
Пример:
После ввода арифметического выражения с неявным присваиванием система
MATLAB запишет результат в специальной переменной ans:
sin(pi/6)
ans = 0.5
Константы
Язык MATLAB имеет в своем составе ряд специальных констант, которые пере¬
числены в следующей таблице.
Константы
Назначение
Pi
Число л, равное 3.14159265358979
L j
Мнимая единица, равная 4-\.
inf
Бесконечность °°
. NaN
Нечисловое значение
eps
Машинная точность, равная 2’52
realmax
Наибольшее число с плавающей точкой, равное 1.79769313486232е+308
realmin
Наименьшее число с плавающей точкой, равное 2.2250738585072е-308
computer
Тип компьютера
version
Версия установленной системы MATLAB
name1eng thmax
Максимальная длина идентификатора для текущей версии системы
26
В. Г. Потемкин. Вычисления в среде MATLAB
Число 7Г (3.14159265358979....)
Синтаксис:
pi
Описание:
Константа, имеющая следующее представление в IEEE-стандарте арифметики
с плавающей точкой в нормализованной форме по основанию 2:
pi = 0.785398163397448*2А2 % десятичное представление
pi = '1.921fb54442dl8’*2Л(1) % шестнадцатеричное представление
I, J | Мнимая единица
Синтаксис:
i
3
Описание:
Константам i и j первоначально присваивается значение, равное sqrt(-l). Они ис¬
пользуются для ввода комплексных чисел.
Пример:
При вводе комплексных чисел допустимы следующие формы записи:
3+2i, 3+2*i, 3+2j, 3+2*j, 3+2*sqrt(-1), complex(3,2)
Все формы представления соответствуют одному и тому же комплексному числу
3 + 2i.
Следует отметить, что с символами i и j могут быть ассоциированы и другие вели¬
чины - например, переменная цикла или индекс элемента массива, и в этом случае они
временно теряют значение мнимой единицы. Поэтому в системе MATLAB 6.5, где ис¬
пользуется ускоритель JIT-accelerator, следует понимать, какой способ формирования
комплексного числа является самым быстрым.
Выполним оценку времени вычисления 1 млн. одинаковых комплексных чисел,
формирумых на основе четырех различных форм записи. Оценка получена усреднени¬
ем по 101 реализации на компьютере с тактовой частотой 1.7 ГГц:
Способ вычисления
Длительность, с
complex (3,2)
0.05 ± 0.006
3 + 2j
0.10 ± 0.01
3 + 2*sqrt(-l)
1.50 ± 0.08
3 + 2*j
8.40 ± 0.06
Из анализа этой таблицы следует, что в пересчете на одну операцию время вычис¬
ления с помощью встроенной функции complex:
• в 2 раза быстрее, чем с использованием константы j;
• в 30 раз быстрее, чем с использованием М-функции sqrt;
• в 168 раз быстрее, чем при умножении на переменную], которую необходимо по¬
стоянно сверять со списком идентификаторов.
2. Язык MATLAB
27
INF I Бесконечность
Синтаксис:
' Inf
Описание:
Inf - специальная константа, имеющая в IEEE-стандарте арифметики с плавающей
точкой в нормализованной форме по основанию 2 следующее представление:
Inf = ' 7ff013'
Она позволяет фиксировать переполнение разрядной сетки в арифметических опе¬
рациях.
Следующие операции имеют результатом константу Inf:
• деление на нуль;
• результат операций для функций min([Inf NaN]), max([I&f NaN]);
• арифметические операции с константой Inf в отсутствие константы NaN.
Примеры:
Операция деления на нуль:
1.0/0.О
Warning: Divide by zero
Предупреждение: Деление на нуль
ans = Inf
Аналогичный результат получается и при выполнении следующей операции, свя¬
занной с переполнением разрядной сетки, но без выдачи предупреждения:
ехр(1000)
ans = Inf
Сопутствующие константы и функции'. NaN, ISINF, ISFINITE.
NaN | Нечисловое значение
Синтаксис:
NaN
Описание:
NaN - специальная константа, которая позволяет фиксировать результат, не яв¬
ляющийся числом. В IEEE-стандарте арифметики с плавающей точкой в нормализо¬
ванной форме по основанию 2 она имеет следующее представление:
NaN = ' ff f8012 '
Следующие операции имеют результатом константу NaN:
• умножение вида O*Inf;
• деление вида 0/0 или Inf/Inf;
• вычисление функции остатка rem(Inf,0);
• любые арифметические операции с константой NaN.
Сопутствующие константы и функции'. INF, ISNAN.
28
В. Г. Потемкин. Вычисления в среде MATLAB
Ключевые слова
В языке MATLAB зарезервированы следующие 17 ключевых слов, которые ис¬
пользуются при формировании операторов:
break'
'case'
'catch'
continue'
'else'
'elseif’
end'
’ for’
' function'
global'
’if’
'otherwise
persistent'
'return’
'switch'
try'
'while'
Эти слова можно использовать только по прямому назначению при построении
конструкций языка. Их нельзя применять для иных целей, это будет порождать сооб¬
щения об ошибке, например недопустимо применять в качестве переменной ключевое
слово global:
global = 5;
??? global = 5;
I
Error: Illegal use of reserved keyword "global".
Ошибка: Недопустимое использование ключевого слова global.
Для проверки используемых строковых выражений и получения справки о зарезер¬
вированных в системе ключевых словах предназначена М-функция iskeyword.
ISKEYWORD~| Проверить, является ли строка ключевым словом
Синтаксис:
Формат функции Формат команды
tf = iskeyword(’<строка>') iskeyword <строка>
iskeyword
Описание:
Функция tf = iskeyword('<CTpoKa>') возвращает логическую переменную, равную 1,
если <строка> совпадает с зарезервированным ключевым словом языка МATLАВ,
и 0 - в противном случае.
Функция iskeyword <строка> использует формат команды.
Оператор iskeyword возвращает список всех ключевых слов языка MATLAB.
Примеры:
Проверить, является ли слово while ключевым словом языка MATLAB.
iskeyword while
ans = 1
Получить список всех ключевых слов текущей версии системы MATLAB:
iskeyword
ans =
'break'
'case'
'catch'
' continue'
'else'
'elseif'
' end'
' for'
'function'
2. Язык MATLAB
29
’global’ 'if' 'otherwise'
'persistent' 'return' 'switch'
'try' 'while'
Сопутствующие переменные и функции'. ISVARNAME.
2.2. Операторы языка MATLAB
Операторы языка MATLAB предназначены для организации вычислений и делятся
на 3 категории:
• арифметические операторы - для конструирования арифметических выражений
и выполнения вычислений в арифметике с плавающей точкой;
• операторы отношения - для сравнения числовых операндов;
• логические операторы - для построения логических выражений с использованием
логических переменных.
2.3. Арифметические операторы
Отличие арифметических выражений, применяемых в языке MATLAB, от таких же
выражений в других языках программирования заключается в том, что они определе¬
ны не на одном числовом элементе, а на массивах таких элементов, в том числе и мно¬
гомерных. Наибольшее применение на практике имеют двумерные массивы. Среди
них следует выделить те, для которых определена операция скалярного произведения.
Такие массивы называются матрицами, и для них многие операции имеют иной ре¬
зультат, чем для произвольного массива чисел.
Массивы и матрицы являются базовыми объектами языка MATLAB, определяя ос¬
новной тип данных, с которым работает система. По мере развития языка и внедрения
объектно-ориентированного подхода к программированию он пополнялся новыми
объектами - многомерными массивами, массивами записей и массивами ячеек, объек¬
тами дескрипторной графики, встроенными объектами типа inline, polynom, а также
множеством объектов из пакетов расширений. Среди последних выделим объект сим¬
вольных вычислений sym (ППП Symbolic Math. Toolbox), lti-объекты для описания ли¬
нейных систем с постоянными параметрами (ППП Control System Toolbox), объект net
для описания нейронных сетей (ППП Neural Network Toolbox) и т. п.
Операции над массивами
Массив - это множество действительных или комплексных чисел а^ представлен¬
ных в виде прямоугольной таблицы
А =
ап
а2\
а\2
а21
аХп
а2п
апЛ
ат2
атп
30
В. Г. Потемкин. Вычисления в среде MATLAB
Числа ajj называются элементами массива; индексы Z, j определяют размещение
элементов в таблице, на пересечении i-й строки и j-го столбца. Если массив имеет
т строк и п столбцов, то говорят, что это массив размера тхп.
Частными, но крайне важными для практики являются одномерные массивы, или
векторы, которые имеют размеры 1хп (вектор-строка), либо nxl (вектор-столбец).
Массив размера 1x1 содержит единственный элемент и называется скаляром.
Сложение и вычитание массивов. Сложение и вычитание массивов осуществляется
поэлементно и удовлетворяет следующим соотношениям:
A.±B = [«(z,j)±№j)].
Исходные массивы должны иметь один и тот же размер. Результатом является мас¬
сив, каждый элемент которого представляет собой сумму или разность соответствую¬
щих элементов исходных массивов.
Произведение массивов. Операция произведения массивов выполняется поэлементно
и удовлетворяет следующему соотношению:
А.*в = ш*ад
Исходные массивы должны иметь один и тот же размер. Результатом является мас¬
сив, каждый элемент которого представляет собой произведение соответствующих
элементов исходных массивов.
В частном случае, когда массивы одномерны, получим произведение элементов
векторов
a.* b = [a(i) * Ь(Г)].
Деление массивов. Операция деления массивов также выполняется поэлементно
и имеет две формы - правого и левого деления, описываемых соотношениями
A./B = [fl(i,jW,j)l;
АЛВ = [^7Жи)1.
Исходные массивы должны иметь одинаковые размеры. Результатом является мас¬
сив, каждый элемент которого представляет собой результат деления соответствую¬
щих элементов исходных массивов либо в виде a(i,f)/b(i,j), либо в виде b(i,j)/a(i,j).
В частном случае, когда массивы одномерны, получим поэлементное частное век¬
торов в одной из двух форм:
a J b = [a(i)/b(i)];
а Л b = [b(i)/a(i)].
Транспонирование элементов массива. Операция транспонирования элементов мас¬
сива - это перемена местами его строк и столбцов. Для этого используется специаль¬
ный символ операции (.’), который наличием точки (.) указывает, что это поэлемент¬
ная операция. Формула этой операции имеет вид
А.’ = [a(i,j)].' = [a(j, 0].
Возведение в степень. Для массивов эта операция определена даже для случая, когда
задан массив степеней В, соразмерный с массивом оснований А, и удовлетворяет сле¬
дующему соотношению:
2. Язык MATLAB
31
А.ЛВ = [«(/,;)Л^,7)].
При этом допускаются как действительные, так и комплексные значения элементов
массивов.
Вычисление функций. В системе MATLAB можно вычислить любую элементарную
математическую функцию от элементов массива согласно следующему соотношению:
f(A) = (f(«(/J))].
Результатом является массив, соразмерный с исходным, каждый элемент которого
представляет собой функцию от соответствующего элемента исходного массива.
Возможность массового вычисления функции одновременно для всех элементов
массива является уникальным свойством системы MATLAB. Это свойство называется
векторизацией вычислений и обеспечивает исключительно высокую производитель¬
ность работы системы в режиме интерпретации.
Операции над матрицами
Матрица - это прямоугольный массив действительных или комплексных чисел
со специальным образом определенными операциями транспонирования и умножения.
Сложение и вычитание матриц. Операции сложения и вычитания матриц удовле¬
творяют следующим соотношениям:
С = А + В = [a(i, j) + b(i, j)];
с = А-в = ш-ед
Исходные матрицы должны иметь один и тот же размер. Результатом является но¬
вая матрица, каждый элемент которой представляет собой сумму или разность соот¬
ветствующих элементов исходных матриц.
Произведение матриц. Операция произведения матриц - это специальная операция
линейной алгебры, которая содержит в своей основе скалярное произведение двух
векторов и описывается следующим соотношением:
с„,х„ = Атх,*В,хл = [£W = [A(i,:)*В(:, j)] = [ctJ].
*=1
Это соотношение надо понимать следующим образом. Матрица С размера mxn явля¬
ется произведением матрицы А размера тхр и матрицы В размера рхп; каждый эле¬
мент равен произведению z-й строки матрицы А на у-й столбец матрицы В.
р
Произведение вида ^aikbkj называется скалярным произведением векторов а и Ь.
А=1
Очень важно, что число столбцов матрицы А должно совпадать с числом строк
матрицы В. Как следствие этого условия, операция умножения матриц некоммутатив¬
на (неперестановочна), т. е. результат операции зависит от порядка следования исход¬
ных матриц, и А*В не равно В*А.
Если заданы матрица А размера 1x3 и матрица В размера 3x1, то произведение
А*В - это матрица размера 1x1), т. е. скаляр, а произведение В*А- это матрица раз¬
мера 3x3.
32
В. Г. Потемкин. Вычисления в среде MATLAB
Решение систем линейных алгебраических уравнений (СЛАУ). Потребность в ре¬
шении таких систем возникает на практике достаточно часто. Общий вид СЛАУ мож¬
но описать следующим образом:
«пх1
+ а|2х2 + ..
■ + ainxn
а2,х,
+ аггхг +.
.. + а1пхп
апЛ
+ ап2Х1 +•
■■ + ап„хп
или в матричной форме
Ах = b,
где
А =
а\\
а2\
«12
«22
«1/
•• «2л
; х =
*2
II
4Э
V
ь2
.ап\
«л2 ’
•• «лл.
Хп.
1
1
Здесь А - матрица размера пхп, вектор-столбец х неизвестных xi размера nxl, век¬
тор-столбец правых частей b размера nxl.
В линейной алгебре решение СЛАУ связывают с операцией вычисления обратной
матрицы А’1 и записывают следующим образом
х = А_1Ь.
Поскольку решение СЛАУ требуется достаточно часто, в системе MATLAB есть
специальные решатели СЛАУ. Их вызов реализуется с помощью символов левого (\)
и правого (/) деления. Таким образом, решение системы можно записать в виде двух
форм:
х = А\Ь,
х = Ъ/А.
Методы, используемые в решателях, опираются на вычислительные алгоритмы ли¬
нейной алгебры, достаточно сложны в понимании и будут представлены при описании
решателей СЛАУ для полных и разреженных матриц.
Возведение матрицы в степень. Для случая, когда степень к целое число, проблемы
не возникает, поскольку это соответствует умножению матрицы самой на себя к раз:
AAZ:=A1^_A ;
к раз
если степень к целое отрицательное число, то это соответствует умножению обратной
матрицы самой на себя к раз:
АА(-^) = А~'...А~|,;
к раз
наиболее сложным является случай, когда степень р произвольное действительное или
комплексное число; в этом случае вычисление степени от матрицы соответствует вы¬
2. Язык MATLAB 33
2 7. Зак. 3375
числению аналитической функции от матрицы с различными собственными значения¬
ми [6, 13] и определяется следующим соотношением:
А Л р = Rdiag(diag(A).A p)R_1,
где diag (Л) - спектр различных собственных значений матрицы А.
Транспонирование матриц. Операция транспонирования матрицы связана не только
с переменой местами строк и столбцов, но и с операцией комплексного сопряжения
элементов. Формула этой операции выглядит следующим образом:
Ан = А' = [а(/, О*]-
Это строгая форма операции транспонирования, которая верна и при работе с ком¬
плексными матрицами. Обозначение Ан - это точное математическое описание опера¬
ции транспонирования комплекснозначной матрицы, которая в линейной алгебре со¬
ответствует операции эрмитовой сопряженности. Если требуется только переставить
местами строки и столбцы, то матрицу следует рассматривать как массив чисел и при¬
менять операцию транспонирования массива (А .'). Если и только если элементы мат¬
рицы А действительные числа, то выполняется соотношение А' = А .’.
Вычисление функций. Вычисление функции от матрицы связано со спектральным
разложением матрицы на собственные значения и собственные векторы. Определение
аналитической функции от матрицы для случая линейного пространства простой
структуры, когда все собственные значения различны, можно найти в работах [6, 13]
и представить следующим образом:
/(A) = £mxi.h=R/(A)lh,
/=1
где Л = diag(kt)- диагональная матрица собственных значений;
R = [r1 г2 ... г„] - матрица правых собственных векторов, соответствующих
спектру {Л.};
L = [1, 12 ... ] - матрица левых собственных векторов, соответствующих ком¬
плексно сопряженному спектру {Л*}.
Из этих определений следует, что эрмитово-сопряженная матрица левых собствен¬
ных векторов равна LH = [1“; 1”; ... 1“ ], а функция от матрицы является только
функцией ее собственных значений с правыми и левыми собственными векторами ис¬
ходной матрицы.
Для удобства обозрения составим сводную таблицу допустимых операций над мас¬
сивами и матрицами.
Операции
Массив
Матрица
Исходный массив или матрица
А=[аД
А=[аД
Сложение/вычитание
А.±В = [а,±^]
А±В=[а,у ±^]
34
В. Г. Потемкин. Вычисления в среде MATLAB
Операции
Массив
Матрица
Умножение
А.*В = [а„ *btj]
А*В =[А(/,:)* А(:,./)]
Левое деление
А./В=[а^Ьу]
В/А = ВА 1
Правое деление
A.\B=[VaJ
А\В = А"'В
Транспонирование
А.'Ж„]
A’ = [a‘J
Возведение в степень
А.лВ = [а/^]
AA^ = A^A
к раз
Ал(-£) = А~‘...АЧ
к раз
Ал р = RA₽R~‘
Вычисление функции
/(А) ЧЖ,)]
/(A) = R/(A)R-1
Примеры:
Для того чтобы продемонстрировать различия, рассмотрим 2 двумерных массива
и сравним результаты, когда операнды рассматриваются как массивы чисел и как мат¬
рицы. Для вывода использован формат рациональных чисел rat.
Сформируем 2 двумерных массива размера 2x2:
А =[1 2; 4 9], В=[3 4; 5 8]
А =
1 2
4 9
В =
3 4
5 8
Умножение массивов
Умножение матриц
С = А.*В
с = А*В
с =
с =
3 8
13 20
20 72
57 88
Поэлементное правое деление
Решение системы АХ=В
С = А. \В
С = А\В
С =
С =
3 2
17 20
5/4 8/9
-7 -8
Поэлементное левое деление
Решение системы ВХ=А
С = А./В
с = А/В
С =
с =
1/3 1/2
-1/2 1/2
4/5 9/8
-13/4 11/4
2. Язык MATLAB
35
Поэлементное возведение в степень
Степень матрицы
р=2; С = А.Ар
р=2; С = ААр
С =
С =
1
4
9
20
16
81
40
89
р=-2; С = А.Ар
р=-2; С = ААр
С =
С =
1
1/4
89
-20
1/16
1/81
-40
9
р=1/2; С = А.Ар
р=1/2; С = ААр
С =
С =
1 1393/985
780/1351
780/1351
2
3
1351/1170
1351/468
Транспонирование массива
Транспонирование матрицы
C=(A+B*i).1
C=(A+B*i)'
С =
С =
1 + 3i
4 +
5i
1 - 3i
4 - 5i
2-+ 4i
9 4-
8i
2 - 4i
9 - 8i
Арифметические операторы допускают использование индексных выражений
и элементарных функций:
b = sqrt(А(2))+2*В(1)
Ь = 7
Арифметические операторы системы MATLAB работают, как правило, с операн¬
дами одинаковых размеров, за исключением единственного случая, когда один из них
скаляр. В этом случае скаляр^ если это необходимо, расширяется до размеров второго
операнда и после этого заданная операция применяется к каждому элементу.
Операции над объектами
При создании приложений пользователи часто обращаются к методам объектно-
ориентированного программирования, определяя для приложений классы объектов
и операций над ними. Поскольку массивы и матрицы являются базовыми типами дан¬
ных для языка MATLAB, то пользователь употребляет приемы наследования уже раз¬
работанных операций. Поэтому для базовых операций над массивами и матрицами оп¬
ределяются их функциональные аналоги. В приведенной ниже таблице указаны
переопределяемые функции для вновь создаваемых объектов, когда они соответству¬
ют операциям над массивами или матрицами.
Операции над массивами
Операции над матрицами
+ А
uplus(A)
+ А
uplus(A)
-А
uminus(A)
-А
uminus(A)
А + В
plus(A, В)
А + В
plus(A, В)
А-В
minus(A, В)
А-В
minus(A, В)
А.* В
times(A, В)
А *В
mtimes(A, В)
А./В
rdivide(A, В)
А/В
mrdivide(A, В)
АЛВ
ldivide(A, В)
А\В
mldivide(A, В)
36
В. Г. Потемкин. Вычисления в среде MATLAB
Операции над массивами
Операции над матрицами
А.ЛВ
power(A, В)
А л р
mpower(A, р)
А.’
transpose(A)
А’
ctranspose(A, В)
Как следует из анализа таблицы, в системе только первые 4 операции совпадают
и дают одинаковый результат, остальные операции существенно различаются.
Чтобы подчеркнуть особенности именования операций для произвольных объек¬
тов, представим их в виде следующей таблицы.
Имя операции
Имя функции
Назначение
Унарный плюс
upIus(A)
Создание объекта +A
Унарный минус
uminus(A)
Создание объекта -А
Сложение
plus(A,B)
Создание объекта А+В
Вычитание
minus(A,B)
Создание объекта А - В
Поэлементное
произведение
times(A,B)
Поэлементное произведение
Произведение
объектов
intimes(A,B)
Произведение объектов, для которых определена опе¬
рация скалярного произведения
Поэлементное
левое деление
ldivide(A, B)
Результатом является объект с элементами B(i, j)/A(i, j)
Решение систем
линейных урав¬
нений вида
АХ = В
mldivide(A,B)
Если А - объект, ассоциируемый с квадратной матри¬
цей размера п х п, и В - объект, ассоциируемый с пря¬
моугольной матрицей размера nxk, уравнение решается
методом исключения Гаусса.
Если А - объект, ассоциируемый с прямоугольной мат¬
рицей размера mxn, и В - объект, ассоциируемый
с прямоугольной матрицей размера nxk, то система
оказывается недоопределенной или переопределенной
и решается на основе минимизации второй нормы невя¬
зок. Ранг г = гапк(А) вычисляется на основе QR-разло-
жения с выбором ведущего элемента. Такое решение
будет иметь самое большее г ненулевых элементов
на столбец.
Если г < п, то найденное решение, как правило,
не будет совпадать с pinv(A)*B, которое имеет наи¬
меньшую норму невязок. (См. описание функции псев¬
дообращения матрицы pinv)
Поэлементное
правое деление
rdivide(A,B)
Результатом является массив с элементами A(i, j)/B(i, j)
Решение систем
линейных урав¬
нений вида
ХА = В
mrdivide(A,B)
Операция В/A равносильна операции B*inv(A), если А
имеет полный ранг; если нет, то В/А = (A'\B')L
(См. описание операции \)
Поэлементное
возведение
в степень
power(A,B)
Результатом является массив с элементами A(i, j)AB(i, j)
2. Язык MATLAB
37
Имя операции
Имя функции
Назначение
Матричное воз¬
ведение в сте¬
пень
mpower(A,p)
Если р - целое положительное число, то степень объек¬
та определяется перемножением объекта р раз; если р -
целое отрицательное число, то то же самое относится
к объекту mldivide(A, 1); для всех других значений р
и объекта А, ассоциируемого с квадратной матрицей
с различными собственными значениями, решение
строится следующим образом:
[R,D] = eig(A);
Алр = R*diag(diag(D).лр))*mldivide(R,1);
Поэлементное
транспонирова¬
ние
transpose(A)
Замена строк столбцами без операции комплексного
сопряжения
Эрмитово со¬
пряжение
ctranspose(A)
Замена строк столбцами с операцией комплексного со¬
пряжения
Характеристики арифметики с плавающей точкой
Как заметил внимательный читатель, в примерах этого раздела использовалась
арифметика целых чисел и результаты были представлены в формате rat; в этом слу¬
чае, если одно или оба числа оказываются нулями, то могут появиться рациональные
числа вида 1/0 и 0/0:
23/0
Warning: Divide by zero.
ans = 1/0
0/0
Warning: Divide by zero.
ans = 0/0
На практике работа с такими числами не слишком удобна, поэтому система
MATLAB, как и другие системы технических вычислений, использует иную модель
представления чисел, а именно арифметику с плавающей точкой. В этом случае мно¬
жество допустимых чисел оказывается конечным, хотя и очень большим, и это, безус¬
ловно, ограничивает точность представления реальных данных. При выполнении опе¬
раций с такими числами возникают ошибки округления, переполнение разрядной
сетки в старших (overflow) и младших (underflow) разрядах. Как правило, работая
с системой MATLAB, пользователь не замечает этих проблем, но время от времени
ему приходится расплачиваться за это, если он не знает свойств и пределов примени¬
мости такой арифметики.
Стив Моулер - научный руководитель и основатель фирмы The MathWorks, Inc. -
обратил внимание на эти вопросы в работе [74]. Поскольку роль модели вычислений
с плавающей точкой в настоящее время возрастает в связи с применением смешанных,
символьных и числовых вычислений, мы подробно опишем модель IEEE-стандарта
арифметики с плавающей точкой, реализуемой на современных процессорах.
В 60-е гг. прошлого столетия, на заре создания вычислительных машин, при фор¬
мировании архитектур компьютеров в разных странах использовались различные сис¬
темы счисления - десятичная, двоичная и даже троичная, наиболее близкая к опти¬
38
В. Г. Потемкин. Вычисления в среде MATLAB
мальной архитектуре процессора. В конечном счете именно двоичная система счисле¬
ния одержала победу в этом соревновании, но даже и в этой категории рассматрива¬
лись варианты восьмеричной и шестнадцатеричной архитектур.
Наконец, в 1985 г. отдел стандартов Института инженеров по электротехнике
и радиоэлектронике (EEE Standards Board) и Американский национальный институт
стандартов (American National Standards Institute - ANSI) предложили универсальный
стандарт для двоичной арифметики с плавающей точкой, известный как ANSI/IEEE
Standard 754-1985 for Binary Floating-Point Arithmetic. Это был результат почти деся¬
тилетней работы большого коллектива математиков и технических специалистов,
представлявших университеты, разработчиков микропроцессоров и производителей
вычислительной техники.
Все компьютеры, выпускаемые в настоящее время, реализуют именно этот стан¬
дарт представления чисел. Однако это вовсе не означает, что на всех типах компьюте¬
ров при выполнении одинаковых вычислений будут получены абсолютно совпадаю¬
щие результаты, потому что стандарт допускает определенную гибкость в выборе
модели арифметики. Тем не менее важность стандарта заключается в том, что теперь
существует независимая от конкретной архитектуры компьютера модель вычислений
в арифметике с плавающей точкой.
Например, система MATLAB использует IEEE-формат удвоенной точности (IEEE
double precision format). Существует также IEEE-формат одинарной точности, кото¬
рый позволяет экономить оперативную память, но в современных архитектурах обыч¬
но не применяется. Кроме того, можно реализовать расширенный IEEE-формат удво¬
енной точности.
Модель числа в формате с плавающей точкой. В соответствии со стандартом
ANSI/IEEE Standard 754-1985 for Binary Floating-Point Arithmetic нормализованное
двоичное число с плавающей точкой определяется следующим соотношением:
х = ±(l + f)*2e,
где f - дробная часть, или мантисса числа;
е - степень экспоненты по основанию 2.
Мантисса числа не превышает единицы и должна удовлетворять условию
О <f < 1
Используемые в современных компьютерах 64-разрядные слова следующим обра¬
зом применяются для записи чисел с плавающей точкой (рис. 2.1, а):
1
11
52
S
i
а
1
10
se
ft
б
рис. 2.1
Здесь старший разряд отводится под знак числа s, следующие 11 разрядов - под
знак и значение степени е по основанию 2, а оставшиеся 52 - под мантиссу f. Млад¬
2. Язык MATLAB
39
ший разряд мантиссы имеет вес 2’52, обозначается eps и называется машинной точно¬
стью. Эта величина является характеристикой компьютера и определяет точность
операций, выполняемых в арифметике с плавающей точкой.
Степень экспоненты е - это целое число из интервала
-1022 < е < 1023.
Однако она формируется в пределах 11 двоичных разрядов в виде суммы
1 < е+1023 < 2046.
В двоичном представлении степень экспоненты - это конкатенация битов se&fe,
где se равно 0 для отрицательной степени и 1 - для положительной, а 10 разрядов fe
предназначены для записи степени экспоненты (рис. 2.1, б). Возможный диапазон зна¬
чений степени со смещением находится в пределах от 0 до 2н-1 = 2047. Это означает,
что два значения 0 и 2047 остаются свободными и могут быть использованы для фор¬
мирования специальных констант арифметики с плавающей точкой нуль, Infn NaN.
Особенности представления чисел в стандарте плавающей точки становятся более
наглядными, если воспользоваться шестнадцатеричным форматом. Рассмотрим, как
выглядят некоторые десятичные числа в этом формате:
нормализованная форма числа 1 :
1 = (1+0)*2°
’ f = 0; е = 0 ;
шестнадцатеричный формат числа 1:
format hex
n = 1
n = 3ff0000000000000’
Из этого описания следует, что мантисса имеет 13 разрядов со значениями 0, а зна¬
чение степени равно
е = hex2dec(13ff') - 1023
е = 0
Рассмотрим представление константы машинной точности eps.
eps
ans = ЗсЬООООООООООООО
е = hex2dec('ЗсЬ') - 1023
е = -52
f = Oz-
Рассмотрим представление максимального действительного числа realmax.
realmax
ans = 7fefffffffffffff
e = hex2dec(17fe1) - 1023
f = hex2dec(1fffffffffffff’)*2A-52
e = 1023
f = 1
Если внимательно присмотреться к шестнадцатеричному представлению мантиссы,
то можно убедиться, что ее точное значение 1 - eps, и это означает, что realmax равно
(2 - eps)*21023.
40
В. Г. Потемкин. Вычисления в среде MATLAB
Основные параметры стандарта IEEE-арифметики с плавающей точкой представ¬
лены в следующей таблице.
Параметр
Обозначение
Значение
Шестнадцатеричное
представление
Десятичное
представление
Машинная точность
eps
2'52
ЗсЬО13
2.2204e-16
Минимальное число
realmin
2-1022
001013
2.2250e-308
Максимальное число
realmax
(2-eps)21023
7fefP
1.7976e-308
Нуль
0
0
O3O13
0
Бесконечность
Inf
7ff013
00
Отрицательная
бесконечность
-Inf
fffO13
-00
Нечисловой элемент
NaN
7ff80I2
Отрицательный
нечисловой элемент
-NaN
fff8012
Из этой таблицы следует, что в стандарте IEEE-арифметики константа Inf следует
непосредственно за числом realmax, отличаясь от него лишь на единицу в младшем
разряде шестнадцатеричного представления, а в десятичном формате - на величину
realmax *eps.
Расстояние между соседними значениями чисел с плавающей точкой на шкале ве¬
щественных чисел неравномерно. На интервале [2е 2е+1] оно равно 2e*eps; количество
чисел с плавающей точкой в каждом интервале постоянно и равно 252.
Числа с плавающей точкой в системе MATLAB. В системе MATLAB нормализо¬
ванное число с плавающей точкой представляется несколько иначе, чем в IEEE-
стандарте, а именно в следующей форме:
x = ±f„*2eM
где мантисса удовлетворяет условию
1/2 < fM < 1.
Параметры для чисел с плавающей точкой в этих форматах связаны соотношениями:
ем =е + 1;
fM =l/2*(l + f)
и соответственно
fe = eM-l;
[f = 2*fM-l.
Исключение составляет число 0, для которого параметры fM и ем, а также f и е равны
нулю.
Пример:
Определим представление десятичного числа 0.1 в форматах системы MATLAB
и стандарта IEEE:
2. Язык MATLAB
41
[fM,eM] = log2(0.1), f = 2*fM-l, e = eM-1
fM = 4/5
eM = -3
f = 3/5
e = -4
Следующие М-функции предназначены для описания чисел в формате с плаваю¬
щей точкой.
LOG2 | Представление десятичного числа в нормализованной форме
Синтаксис:
[f,e] = 1од2(х)
Описание'.
Функция [f, е] = log2(x) вычисляет параметры нормализованной формы десятично¬
го числа х:
х = ±£*2Ле, 0.5 <abs(f)< 1;
0 = 0*2^0.
В случае, когда X - массив, справедлива поэлементная форма представления:
X = f.*2.~e.
Пример:
Основные константы арифметики с плавающей точкой определяются следующим
образом в форматах языка MATLAB и IEEE-стандарте:
X
fM
f
e
Шестнадцатеричное
число
0
0
0
0
-1023
03013
1
1/2
1
0
0
3ffO13
eps
1/2
-51
0
-52
3cbO13
realmin
1/2
-1021
0
-1022
001013
realmax
(2-eps)/2
1024
1-eps
1023
7fef13
Сопутствующие функции'. LOG, LOGIO, POW2, NEXTPOW2, REALMAX, REALMIN.
PQW2 | Преобразование нормализованной формы в число
Синтаксис:
х = pow2(f, е)
Описание:
Функция х = pow2(f, е) формирует действительное число х по его мантиссе f и по¬
казателю степени е, используя нормализованное представление по основанию 2:
х = f * 2Ле.
Пример:
Нормализованные представления основных констант языка MATLAB и соответст¬
вующие десятичные и шестнадцатеричные числа:
42
В. Г. Потемкин. Вычисления в среде MATLAB
Параметры
нормализованного числа
Число X
Константа
fM
еМ
Десятичное число
Шестнадцатеричное
число
Обозначение
0
0
0
ОЗО13
0
1/2
1
1
3ffO13
1
1/2
-51
2.2204е-16
ЗсЬО13
eps
1/2
-1021
2.2250е-308
001013
realmin
(2-eps)/2
1024
1.7976еЗО8
7fef]3
realmax
Сопутствующие функции'. L0G2, EXP, HEX2NUM, REALMIN, REALMAX.
EPS J Машинная точность
Синтаксис:
eps
Описание:
Константа арифметики с плавающей точкой eps определяет шкалу размещения та¬
ких чисел на вещественной оси. Она определяет точность аппроксимации веществен¬
ных чисел числами с плавающей точкой. Машинная точность eps определяется весом
наименьшего разряда мантиссы; иными словами, для арифметического устройства, со¬
ответствующего стандарту IEEE-арифметики с плавающей точкой, ее значение равно
2'52, что приближенно составляет 2,2204е-016. Это соответствует расстоянию от еди¬
ницы до ближайшего числа с плавающей точкой, большего единицы. В интервале зна¬
чений действительных чисел 2е + 2е+1 расстояние между двумя соседними числами
с плавающей точкой равно 2е’52.
Пример:
Простейший тест для определения машинной точности eps заключается в следующем:
а = 4/3
b = а-1
с = Ь+Ь+Ь
е = 1-с
Десятичное представление
Шестнадцатеричное представление
а = 1.33333333333333
Ь = 0.333333333333333
с = 1
е = 2.2204е-016
а = 3ff5555555555555
b = 3fd5555555555554
с = 3feffffffffffffe
е = ЗсЬООООООООООООО
Из анализа результатов следует, что погрешность обусловлена аппроксимацией ра¬
ционального числа 4/3 числом с плавающей точкой, так что переменная с оказывается
числом, которое отличается от единицы на величину е, которая в шестнадцатеричном
формате совпадает с константой eps.
Сопутствующие переменные и функции: REALMIN, REALMAX.
2. Язык MATLAB
43
REALMIN I Наименьшее положительное число с плавающей точкой
Синтаксис:
n = realmin
Описание:
Константа realmin - наименьшее положительное число в формате с плавающей
точкой для данного компьютера, принятое в системе MATLAB.
Значение realmin вычисляется с помощью функции pow2 при следующих значени¬
ях входных аргументов:
realmin = pow2(l, -1022).
Эта константа имеет шестнадцатеричное представление в формате IEEE-стандар¬
та - ’001013’; ее десятичное представление - 2.225073858507201е-308.
Все числа, заполняющие интервал между числом realmin и нулем, называются де-
нормализованными', минимальное из них соответствует значению pow2(eps,-1022)
и имеет следующее шестнадцатеричное представление - 030121; шестнадцатеричное
представление степени экспоненты равно 03, десятичное - 1023.
Вместе все, нормализованные и денормализованные, числа с плавающей точкой
определяют расширенный формат точности.
Пример:
Оценить количество чисел с плавающей точкой на вещественной оси в стандарте
IEEE-арифметики.
Поскольку нормализованные числа с плавающей точкой имеют значения степеней
-1022 < е < 1023 и образуют 2045 интервалов, каждый из которых содержит по 252 чи¬
сел, то общее количество чисел’с плавающей точкой на вещественной оси равно
N = 2045*252 = 9209861237972664300 == 921.00е+016;
с учетом денормализованных чисел их общее количество составит
N = 2046*252 = 9214364837600034800 = 921.44е+016.
Сопутствующая функция - EPS.
REALMAX | Наибольшее положительное число с плавающей точкой
Синтаксис:
n = realmax
Описание:
Константа realmax - наибольшее число в арифметике с плавающей точкой для дан¬
ного компьютера; следующее за ним значение соответствует бесконечности, или кон¬
станте Inf.
Значение realmax вычисляется с помощью функции pow2 при следующих значени¬
ях входных аргументов:
realmax = pow2((2 - eps)/2, 1024).
Эта константа имеет следующее шестнадцатеричное представление в формате
IEEE-стандарта - ’7fef]3'; ее десятичное представление - 1.797693134862316е+308.
Сопутствующая функция - EPS.
44
В. Г. Потемкин. Вычисления в среде MATLAB
DEC2BIN | Преобразовать целое десятичное число в двоичное строковое
Синтаксис:
str = dec2bin(d)
str = dec2bin(d,n)
Описание:
Функция str = dec2bin(d) возвращает двоичное представление десятичного целого
числа d в виде строки str. Число d должно быть неотрицательным целым и не превы¬
шающим значение 2Л52.
Функция str = dec2bin(d, п) возвращает двоичное представление десятичного цело¬
го числа, по меньшей мере, с п значащими битами. Это означает, что если заданного
количества двоичных битов недостаточно, то они будут добавлены автоматически,
т. е. лишних незначащих битов никогда не возникнет. Если же заданное число п пре¬
вышает количество требуемых битов, то будут выведены лишние незначащие биты
в виде нулей.
Примеры:
str = dec2bin(57)
str =111001 '
Выведем то же число, указав меньшее количество битов, чем это необходимо:
str = dec2bin(57,3)
str =111001
Результатом является строка с нужным минимальным количеством битов.
Выведем то же число, указав большее количество битов, чем это необходимо:
str = dec2bin(57,8)
str = 00111001
Результатом является строка с лишними старшими битами, равными 0.
Сопутствующие функции’. BIN2DEC, DEC2HEX.
BIN2DEC | Преобразовать строковое двоичное представление
в десятичное число
Синтаксис:
d = bin2dec(str)
Описание:
Функция d = bin2dec(str) преобразует строковое двоичное представление в деся¬
тичное целое число d.
Пример:
d = bin2dec(•111001*)
d = 57
Сопутствующие функции’. DEC2BIN.
2. Язык MATLAB
45
DEC2HEX I Преобразовать целое десятичное число в шестнадцатеричное
строковое
Синтаксис:
str = dec2hex(d)
str = dec2hex(d,n)
Описание:
Функция str = dec2hex(d) возвращает шестнадцатеричное представление десятич¬
ного целого числа d в виде строки str. Число d должно быть неотрицательным целым,
не превышающим значение 2Л52.
Функция str = dec2hex(d, п) возвращает шестнадцатеричное представление деся¬
тичного целого числа по меньшей мере с п значащими шестнадцатеричными разрядами.
Примеры:
str = dec2hex(2A52-l)
str = FFFFFFFFFFFFF
Результатом является строка, содержащая 13 символов.
Выведем то же число, указав большее количество шестнадцатеричных разрядов:
str = dec2hex(2 А52-1,15)
Str = OOFFFFFFFFFFFFF
Результатом является строка с двумя лишними старшими разрядами, равными 0.
Сопутствующие функции'. BIN2DEC, DEC2HEX.
HEX2DEC | Преобразовать шестнадцатеричное строковое представление
в десятичное число
Синтаксис:
d = hex2dec(’hex_value')
Описание:
Функция d = hex2dec(’hex_value') преобразует строковое шестнадцатеричное пред¬
ставление в десятичное целое число d. Аргумент hex_value - это шестнадцатеричное
целое число, которое не должно превышать значение 10]3.
Пример:
hex2dec(1FFFFFFFFFFFFF1)
ans = 4503599627370495
Это число соответствует значению 252-1.
Сопутствующие функции'. DEC2HEX, FORMAT, HEX2NUM, SPRINTF.
DEC2BASE I Преобразовать десятичное число в строковое представление
но заданному основанию
Синтаксис:
strb = dec2base(dzbase)
strb = dec2base(d,base,n)
46 В. Г. Потемкин. Вычисления в среде MATLAB
Функция strb = dec2base(d, base) преобразует десятичное целое число d в строковое
представление strb по заданному основанию base. Число d должно быть неотрицатель¬
ным целым, не превышающим значение 2Л52, а основание системы счисления base
не должно превышать 36 1.
Функция strb = dec2base(d, base, п) возвращает строковое представление strb по за¬
данному основанию base десятичного целого числа по меньшей мере с п значащими
разрядами.
Примеры:
Преобразуем десятичное число 57 в строковое представление по основанию 3
по меньшей мере с 3 значащими разрядами.
str3 = dec2base(57,3,3)
str3 = 2010
В действительности для представления данного числа требуется 4 разряда.
Преобразуем то же число в строковое представление по основанию 32:
str32 = dec2base(57,32,3)
str32 = 01Р
В этом случае требуется всего 2 разряда, а символ Р необходим для представления
числа 25.
Сопутствующая функция - BASE2DEC.
BASE2DEC | Преобразовать строковое представление по заданному
основанию в десятичное число
Синтаксис:
d = base2dec('strbbase)
Описание:
Функция d = base2dec(’strb', base) преобразует строковое представление strb по ос¬
нованию base в десятичное целое число d.
Примеры:
Преобразуем число 2010 по основанию 3 в десятичное число:
d = base2dec('2010',3)
d = 57
Преобразуем число IP по основанию 32 в десятичное число:
d = base2dec(1IP’,32)
d = 57
Сопутствующая функция - DEC2BASE.
1 Длина латинского алфавита ограничена 26 буквами, поэтому максимальное количество символов для
представления числа с учетом цифр от 0 до 9 ограничено значением 36.
2. Язык MATLAB
47
HEX2NUM | Преобразовать шестнадцатеричное представление в десятичное
число с плавающей точкой
Синтаксис:
d = hex2num(’hex_value')
Описание:
Функция d = hex2num(’hex_value') преобразует шестнадцатеричное представление
в десятичное число с плавающей точкой стандарта IEEE. При этом преобразовании
поддержаны специальные константы Inf и NaN, а также денормализованные числа
расширенного формата точности.
Пример:
Допустим, что мы имеем шестнадцатеричное представление числа я:
hex_value = pi
hex_value = 400921fb54442dl8
Тогда М-функция hex2num позволяет восстановить десятичное значение этого чис¬
ла в арифметике с плавающей точкой удвоенной точности с 15 значащими цифрами:
f = hex2num( ’400921fb54442dl8')
f = 3.14159265358979
Известно, что минимальное число в арифметике с плавающей точкой realmin имеет
следующее шестнадцатеричное представление:
hex_value = realmin
hex_value = 0010000000000000
Все числа, меньшие этого числа, являются денормализованными, причем 3 шест¬
надцатеричных разряда степени равны 000 для положительных значений степени
и 800 - для отрицательных.
Сформируем шестнадцатеричное представление минимального положительного
денормализованного числа и преобразуем его в десятичное число с плавающей точ¬
кой:
sf = hex2num( '0000000000000001')
sf = 4.94065645841247е-324
Это число имеет показатель степени меньше чем -308.
Сопутствующие функции'. FORMAT, HEX2DEC, SPRINTF.
2.4. Операторы отношения и логические операторы
Операции отношения
Для сравнения элементов массивов в системе MATLAB предусмотрено 6 операций:
<
Меньше
<=
Меньше или равно
>
Больше
48
В. Г. Потемкин. Вычисления в среде MATLAB
>=
Больше или равно
==
Равно тождественно
~=
Не равно
На основе этих операций можно сконструировать операторы отношения, которые
позволяют выполнить поэлементное сравнение двух массивов. Такие операторы могут
быть представлены в двух форматах: оператора и функции. Последний формат ис¬
пользуется для переопределения методов в рамках объектно-ориентированного про¬
граммирования.
Формат оператора
Формат функции
С = А<В
С = lt(A,B)
С = А<=В
С = 1е(А,В)
С = А>В
С = gt(A,B)
С = А>=В
С = де (А, В)
С = А==В
С = eq(A,B)
С . = А~=В
С = пе(А,В)
Операндами в этих операторах могут быть произвольные массивы, допускающие
операции сравнения их элементов. Один из операндов может быть скаляром, и в этом
случае он будет сравниваться с каждым элементом другого операнда. Результатом бу¬
дет массив логических значений 1 в позициях, где проверяемое отношение выполняет¬
ся, и 0 - в противном случае. Результирующий массив С является логическим масси¬
вом (logical array). Это новый тип данных, введенный начиная с версии 6.5.
Операторы отношения часто применяются в теле операторов управления if, for,
while, switch для изменения последовательности выполнения операторов программы.
Примеры:
Выполним сравнение двух массивов, проверяя отношение А<В:
А = [2
7 6; 9 0 -1; 3 0.5 6];
В = [8
0.2 0; -3 2 5; 4 -1 7];
С = А
< В
С =
1
0 0
0
1 1
1
0 1
Результирующий логический массив С указывает позиции, в которых элементы
массива А меньше соответствующих элементов массива В.
Если один из операндов оператора отношения скаляр, а другой - массив, то ска¬
лярный операнд расширяется до размеров этого массива:
А = 5; В =
[1 2 3; 4 5 6; 7 8 10] ;
С = А >=
С =
в
1
1
1
1
1
0
0
0
0
Операторы отношения могут работать с массивами, у которых размеры согласова¬
ны, либо одна из размерностей имеет нулевой размер, либо один из массивов является
скаляром.
2. Язык MATLAB
49
Сравнение массива с пустым. Операторы отношения вида А = [ ] недопустимы
и вызывают сообщение об ошибке, за исключением случаев,, когда массив А имеет
размеры 0x0 или 1x1. Поэтому для проверки, является ли массив пустым, следует
применять функцию isempty (А).
Для сравнения массивов строк следует применять М-функцию strcmp.
При вычислении арифметических выражений операторы отношения имеют более
низкий приоритет, чем арифметические, но более высокий, чем логические операторы.
Логические операции
Логические операции предназначены для работы с данными, которые принимают
значения 0 и 1. Эти операции порождают логические связки, которые могут быть од¬
номестными или двухместными, в зависимости от числа высказываний, которые объ¬
единяются в этих связках. Логические связки формализуют употребляемые в обычных
языках союзы и союзные слова ”и", "или”, "если, то”, частицу "не" и т. п. Логические
связки на множестве из двух значений 0 и 1 образуют алгебру логики [26].
Одноместные и двухместные логические связки представлены в следующей таблице.
Логическая
операция
Другие
обозначения
Логические связки
Название операции
Как читать
~ А
1А
Отрицание, ЛОГИЧЕСКОЕ НЕТ
Не А
А&В
А®В
АаВ
Конъюнкция, логическое умножение,
ЛОГИЧЕСКОЕ И
А и В
А|В
А + В
A vB
Дизъюнкция, логическое сложение,
НЕИСКЛЮЧАЮЩЕЕ ИЛИ
А или В
А —> В
А эВ
Импликация
Если А, то В
АнВ
А = В
А~В
Эквивалентность
А эквивалентно В
А©В
1(А<->В)
1(А = В)
Сумма по модулю 2, отрицание эквива¬
лентности, ИСКЛЮЧАЮЩЕЕ ИЛИ
Либо А, либо В;
А не эквивалентно В
1(А&В)
Штрих Шеффера, отрицание конъюнкции
А и В несовместны
AiB
l(AvB)
Стрелка Пирса, отрицание дизъюнкции
Ни А, ни В
1(А—>В)
1(АэВ)
Отрицание импликации
А, но не В
А<—В
АсВ
В—>А
ВэА
Обратная импликация
А, если В;
если В, то А
"|(В—>А)
1(ВэА)
Отрицание обратной импликации
Не А, но В
Для работы с данными, принимающими значения 0 и 1, в системе MATLAB 6 вве¬
ден новый тип данных - логический массив. Для него предусмотрено несколько базо¬
вых логических операций из вышеприведенной таблицы, на основе которых конструи¬
руются логические операторы. Такие операторы могут быть представлены в двух
форматах: оператора и функции. Последний формат используется для переопределе¬
ния методов в рамках объектно-ориентированного программирования.
50
В. Г. Потемкин. Вычисления в среде MATLAB
Логический оператор
Математи-
ческий символ
оператора
Обозначение в языке MATLAB
Формат
оператора
Формат
функции
Приоритет
ЛОГИЧЕСКОЕ НЕТ
(отрицание)
~А
~А
not(А)
Высший
ЛОГИЧЕСКОЕ И
(конъюнкция)
А®В
А&В
and(A,В)
1
НЕИСКЛЮЧАЮЩЕЕ ИЛИ
(дизъюнкция)
А+В
а|в
or (А, В)
1
ИСКЛЮЧАЮЩЕЕ ИЛИ
(сложение по модулю 2)
А®В
•
хог(А,В)
Низший
Составим таблицу истинности для этих операторов (функций).
Входы
not(А)
-А
and(А,В)
А&В
or (А, В)
А | В
хог(А,В)
А
В
0
0
1
0
0
0
0
1
1
0
1
1
1
0
0
0
1
1
1
1
0
1
1
0
При обработке логических массивов операции применяются поэлементно. Для век¬
торов и прямоугольных массивов оба операнда должны быть одинакового размера,
за исключением случая, когда один из них скаляр. В последнем случае MATLAB срав¬
нивает скаляр с каждым элементом другого операнда. Позиции, где это соотношение
истинно, получают значение 1, где ложно - 0. Любые логические операции могут быть
переопределены для обработки объектов, если используется функциональная форма
оператора.
Каждому логическому оператору соответствует некоторый набор условий, которые
определяют результат логической операции:
• Оператор ЛОГИЧЕСКОЕ И (&) является истинным, если оба операнда истинны.
• Оператор ЛОГИЧЕСКОЕ ИЛИ (|) является истинным, если один из операндов или
оба операнда логически истинны. Выражение ложно, только если оба операнда ло¬
гически ложны.
• Оператор ЛОГИЧЕСКОЕ НЕТ (~) строит отрицание. Результат логически ложен,
если операнд истинен, и истинен, если операнд ложен.
Расширение логических операций. В дополнение к базовым логическим операциям
в системе MATLAB начиная с версии 6.5 добавлены еще 2 логические операции, вы¬
полняемые над логическими скалярами:
&&
УКОРОЧЕННОЕ ЛОГИЧЕСКОЕ И
II
УКОРОЧЕННОЕ ЛОГИЧЕСКОЕ ИЛИ
Особенность этих операций заключается в том, что при их исполнении проверяется
один первый операнд, и только в том случае, если этого недостаточно для принятия
решения, проверяется второй. Например, если операнд А ложен, то оператор А&В все¬
гда ложен, поэтому оператор А&&В в этом случае будет выполняться быстрее. Анало¬
гично если операнд А истинен, то оператор А|В всегда истинен, поэтому оператор А||В
в этом случае будет выполняться быстрее.
2. Язык MATLAB
51
Эти операции имеют более низкий приоритет по сравнению с базовыми логиче¬
скими операциями, но при этом операция && имеет более высокий приоритет, чем
операция ||.
Расширение логических функций. В дополнение к логическим операциям в состав
системы MATLAB включены 2 логические функции для работы с массивами логиче¬
ских данных:
all
Проверить, все ли элементы в сечениях массива истинны
any
Проверить, есть ли хотя бы один истинный элемент в сечениях массива
• Функция all возвращает 1, если все элементы вектора истинны.
Пример:
Пусть задан вектор и и требуется проверить его на условие "все ли элементы
меньше 37". Если это условие выполняется, то выдается сообщение "Все элементы
меньше 3 ".
и = [1 2 2 0] ;
if all(u<3)
disp('Все элементы меньше 3')
end
ans = Все элементы меньше 3
В случае массивов функция all проверяет истинность элементов по столбцам.
Пример:
А = [0 1 2; 0 5 0]
all (А)
ans =0 1 0
• Функция any возвращает 1, если хотя бы один из элементов аргумента истинен;
иначе возвращается 0. В случае обработки массивов функция any проверяет нали¬
чие истинных элементов по столбцам.
Пример:
А = [0 1 2; 0 5 0]
any (А)
ans =0 1 0
При обработке массивов данных в арифметике с плавающей точкой могут появ¬
ляться результаты с константами Inf и NaN. Для выявления таких констант в массивах
чисел предназначены функции isinf и isnan, которые формируют логические массивы,
определяющие наличие соответствующих элементов.
• Функции isnan и isinf возвращают 1 для NaN и Inf соответственно. Функция isfinite
истинна для величин, отличных от inf и NaN.
Пример:
Рассмотрим следующие два числовых массива А и В:
А = [0 1 5; 2 NaN -inf];
В = [0 0 15; 2 5 inf];
52
В. Г. Потемкин. Вычисления в среде MATLAB
Образуем массив С и применим перечисленные выше функции.
С = А./В
С =
NaN
Inf
0.3333
1.0000
NaN
NaN
isfinite (С)
isnan (C)
isinf (C)
ans =
ans =
ans =
0 0
1
1
0
0
0
1
0
1 0
0
0
1
1
0
0
0
Приоритеты операций. Для формирования выражений в командной строке применя¬
ются комбинации различных операторов - арифметических, логических, операторов
отношения. Порядок вычисления таких комбинированных выражений зависит от при¬
оритетов используемых операторов. Если все операторы имеют одинаковый приори¬
тет, то они выполняются последовательно слева направо, в противном случае их вы¬
числение подчиняется следующим правилам приоритета:
Приоритет
Символ операции или специальный символ
1
() - круглые скобки
2
Транспонирование и возведение в степень:
- поэлементное транспонирование;
,Л - поэлементное возведение в степень;
’ - эрмитово сопряжение;
Л - степень матрицы
3
Одноместные операции:
+ - унарный плюс;
- - унарный минус;
— логическое отрицание
4
Операции умножения и деления:
.* - поэлементное умножение;
./ - поэлементное правое деление;
Л - поэлементное левое деление;
* - умножение матриц;
/ - правое деление матриц;
\ - левое деление матриц
5
Арифметические операции:
+ - сложение;
- - вычитание
6
: - оператор сечения массива
7
Операции отношения:
<, <= - меньше, меньше или равно;
>, >= - больше, больше или равно;
== - равно;
- не равно
8
& - ЛОГИЧЕСКОЕ И
2. Язык MATLAB
53
Приоритет
Символ операции или специальный символ
9
10
11
|-ЛОГИЧЕСКОЕ ИЛИ
&& - УКОРОЧЕННОЕ ЛОГИЧЕСКОЕ И
|| - УКОРОЧЕННОЕ ЛОГИЧЕСКОЕ ИЛИ
Поскольку наивысший приоритет имеют круглые скобки, то регулировать после¬
довательность исполнения операторов в комбинированных выражениях можно с их
помощью.
Пример:
Зададим 2 вектора а и b и сформируем арифметическое выражение с операциями
деления и возведения в степень. Поскольку операция поэлементного возведения в сте¬
пень имеет приоритет 2, более высокий, чем операция поэлементного деления, то вы¬
ражение будет вычисляться в противоположном направлении, справа налево. Для из¬
менения направления вычислений применим круглые скобки и получим другой
результат:
а = [3 9 5]; Ь = [215];
с = а./Ь.А2
с = 0.75 9 0.2
с = (а./Ь).А2
с = 2.25 81 1
& I
AND OR NOT
Синтаксис
Формат команды
А & В
А | В
-А
Логические операции
Формат функции
and(А,В)
or(А,В)
not(А)
Описание:
Двухместный логический оператор А & В или его функциональный аналог and(A, В)
реализуют операцию ЛОГИЧЕСКОЕ И.
Двухместный логический оператор А | В или его функциональный аналог ог(А, В)
реализуют операцию ЛОГИЧЕСКОЕ ИЛИ.
Одноместный логический оператор ~А или его функциональный аналог not(A, В)
реализуют операцию ЛОГИЧЕСКОЕ НЕТ.
Следует помнить, что логическая операция & имеет более высокий приоритет, чем
операция |. Поэтому логическое выражение а\Ь & с вычисляется как а\(Ь & с). При ра¬
боте с логическими операторами применение скобок для явного указания последова¬
тельности выполнения крайне рекомендуется.
54
В. Г. Потемкин. Вычисления в среде MATLAB
Примеры:
Пусть заданы 2 числовых вектора:
u = [102305];
v = [561007];
Преобразуем их в логические:
u = logical(u)# v = logical(v)
и = 1 0 1 1 0
v = 1 1 1 0 0
и применим оператор ЛОГИЧЕСКОЕ И:
w = и & v
w = 1 0 1 0 0
1
1
1
Оба операнда истинны только в трех позициях.
Теперь применим оператор ЛОГИЧЕСКОЕ ИЛИ:
w = и | v
w = 1 1 11 0 1
Используем вектор и и построим логическое выражение с оператором ЛОГИЧЕС¬
КОЕ НЕТ:
W = -и
w = 0 1
0
0 0 1
Сопутствующие функции'. ALL, ANY, XOR.
XOR
Логическая функция ИСКЛЮЧАЮЩЕЕ ИЛИ
Синтаксис:
С = xor(AzB)
Описание:
Функция С = хог(А, В) выполняет функцию ИСКЛЮЧАЮЩЕЕ ИЛИ над соответ¬
ствующими элементами логических массивов А и В.
Пример:
Пусть заданы два числовых вектора, преобразуем их в логические и вычислим
функцию ИСКЛЮЧАЮЩЕЕ ИЛИ.
а = logical([0 0 pi eps])
b = logical([0 -2.4 0 1])
c = xor(a,b)
a = 0 0 1
b = 0 1 .0
c = 0 1 1
1
1
0
Сопутствующие функции'. ALL, AND, ANY, NOT, OR, &&, ||.
2. Язык MATLAB
55
Укороченные логические операции
&&, II I
Синтаксис:
А && В
А | | В
Описание:
Оператор А && В выполняет операцию УКОРОЧЕННОЕ ЛОГИЧЕСКОЕ И над
операндами, принимающими скалярные значения. Если операнд А ложен, то второй
операнд не проверяется, поскольку результат будет ложным.
Оператор А || В выполняет операцию УКОРОЧЕННОЕ ЛОГИЧЕСКОЕ ИЛИ над
операндами, принимающими скалярные значения. Если операнд А истинен, то второй
операнд не проверяется, поскольку результат будет истинным.
Пример:
Допустим, сформирован следующий тест для операции УКОРОЧЕННОЕ ЛОГИ¬
ЧЕСКОЕ И:
function с = testshort(а,Ь)
% Тест укороченных логических операций
if (Ь ~= 0) && (а/Ь > 18.5)
с = а/Ь;
else
с = а+Ь;
end
В зависимости от значений входных аргументов а и b он будет выполняться разное
время. Если значение b равно нулю, т. е. операнд (Ь ~= 0) ложен, то второй операнд
логического условия (а/Ь > 18.5) не проверяется. Если же операнд истинен, то в зави¬
симости от значения второго условия выполняются разные ветви условного цикла.
Проверим работу теста для разных значений входных аргументов:
параметр а равен 3, параметр b равен 0:
с = testshort(3,0)
с = 3
параметр а равен 3, параметр b равен 2:
с = testshort(3,2)
с = 5
параметр а равен 60, параметр b равен 2:
с = testshort(60,2)
с = 30
В первых двух тестах выполняется операция сложения входных аргументов, по¬
скольку оказывается ложным либо первый, либо второй операнд условия; в третьем
примере оба операнда истинны и выполняется операция деления.
Сопутствующие функции'. ALL, AND, ANY, NOT, OR.
56
В. Г. Потемкин. Вычисления в среде MATLAB
Функции истинности
ALL, ANY
Проверить истинность элементов логического массива
Синтаксис:
Т = all(X)
Т = all(X,dim)
Т = апу(Х)
Т = any(X,dim)
Описание:
Функция Т = all(X), когда X - логический вектор, возвращает 1, если все элементы
вектора истинны, и 0, если хотя бы один элемент вектора ложен.
Функция Т = all(X), когда X - логический двумерный массив, возвращает вектор-
строку из 0 и 1. Элемент вектор-строки равен 1, если все элементы столбца Х(:, j) ис¬
тинны, и 0, если хотя бы один элемент столбца ложен.
Функция Y = а11(Х, <размерность>), когда X - многомерный логический массив,
обрабатывает соответствующие сечения по этой размерности. Если аргумент <размер-
ность> не указан, по умолчанию обрабатывается первая размерность, не равная 1.
Функция Т = апу(Х), когда X - логический вектор, возвращает 1, если хотя бы
один элемент вектора истиненн и 0, если все элементы вектора ложны.
Функция Т = апу(Х), когда X - логический двумерный массив, возвращает вектор-
строку из 0 и 1. Элемент вектор-строки равен 1, если хотя бы один элемент столбца
Х(:, j) истиненн и 0, если все элементы столбца ложны.
Функция Y = апу(Х, <размерность>), когда X - многомерный логический массив,
обрабатывает соответствующие сечения по этой размерности. Если аргумент <размер-
ность> не указан, по умолчанию обрабатывается первая размерность, не равная 1.
Примеры:
Рассмотрим вектор измерений некоторого параметра и выделим из него те значе¬
ния, которые меньше 0.5.
х = [0.53 0.67 0.01 0.38 0.07 0.42 0.69];
у = (х < 0.5)
у = 0 0 1 1 1 1 0
Здесь у логический массив, поскольку он является результатом операции отноше¬
ния. Проверим, все ли его элементы истинны и есть ли среди них истинные элементы:
all (у), any (у)
ans = 0
ans = 1
Ответ: не все элементы удовлетворяют заданному условию, но среди них есть те,
которые удовлетворяют.
Рассмотрим трехмерный логический массив размера 2x3x2 (рис. 2.2).
А(:
А(:
А(:
/1) =
/2) =
,1) =
1
logical([1 1 1; 1 0 0]);
[1 1 1; 0 0 1]
1
0
1
о
2. Язык MATLAB
57
1 1
о о
1
1
А(:,2) =
1
0
1 1
0 1
А(:, 1)
=
1 1
1
1 0
0
рис. 2.2
Проверим истинность элементов в сечениях по третьей размерности.
all(Аж 3)
ans =
1
1
1
0
0
0
Проверим истинность элементов в сечениях по второй размерности.
а11(А,2)
ans(:,:,1) =
1
О
ans(:, :, 2) =
1
0 ’
Проверим истинность элементов в сечениях по первой размерности.
all(Аж1)
ans(:,:,1) = 1 О О
ans(:,:,2) = 0 0 1
Рассмотрим для того же многомерного массива действие оператора any.
Проверить наличие хотя бы одного истинного элемента в сечениях по третьей раз¬
мерности.
any(А,3)
ans =
111
10 1
Проверить наличие хотя бы одного истинного элемента в сечениях по второй раз¬
мерности.
any(А,2)
ans(:, :,1) = ,
1
1
ans ( : , : , 2.) =
1
1
58
В. Г. Потемкин. Вычисления в среде MATLAB
Проверить наличие хотя бы одного истинного элемента в сечениях по первой раз¬
мерности.
any(А,1)
ans(:,:,1) = 1 1 1
ans(:t :,2) = 1 1 1
Сопутствующие операторы. &, |, ~, AND, OR, XOR.
IS* Проверить истинность
Синтаксис:
к = isappdata(Н,<имя_данных>)
к = iscell(C)
к = iscellstr(S)
к = ischar(S)
к = isempty(A)
к = isequal(А,В,...)
к = isfield(S,’<имя_поля>’)
TF = isfinite(A)
к = isglobal(<имя_переменной>)
TF = ishandle(H)
к = ishold
TF = isinf(A)
TF = isjava(A)
TF = isletter (’<строка>')
к = islogical(A)
TF = isnan(A)
к = isnumeric(A)
к = isobject(A)
к = ispc
TF = isprime(A)
к = isreal(A)
к = isruntime
tf = isspace(’<строка>’)
к = issparse(S)
к = isstruct(S)
к = isstudent
к = isunix
tf = isvarname(’<строка>’)
Описание:
Функция k = isappdata(h, <имя_данных>) возвращает 1, если данные с именем
<имя_данных> принадлежат некоторому объекту с дескриптором h, относящемуся
GUI-приложению, и 0 - в противном случае.
Функция k = iscell(C) возвращает 1, если С - массив ячеек, и 0 - в остальных случаях.
Функция k = iscellstr(S) возвращает 1, если S - массив строковых ячеек, и 0 - в ос¬
тальных случаях. Массив строковых ячеек - это такой массив ячеек, в котором каждая
ячейка является массивом строк.
Функция k = ischar(S) возвращает 1, если S - массив символов, и 0 - в остальных
случаях.
Функция k = isempty(A) возвращает 1, если А - пустой массив, и 0 - в остальных
случаях. Массив называется пустым, если его размер хотя бы по одной из размерно¬
стей равен 0.
Функций k = isequal(A, В, ...) возвращает 1, если все входные массивы одного типа,
одинаковых размеров и содержат одинаковые данные, и 0 - в остальных случаях.
Функция k = isfield(S, '<имя_поля>') возвращает 1, если имя поля совпадает с име¬
нем одного из полей массива записей S, и 0 - в остальных случаях.
Функция TF = isfinite(A) возвращает логический массив, соразмерный с А. Элемент
равен 1, когда соответствующий элемент исходного массива имеет конечное значение,
и 0-если элемент исходного массива Inf или NaN.
Функция k = isglobal(<HMH_nepeMeHHoft>) возвращает 1, если переменная с указан¬
ным именем объявлена глобальной, и 0 - если нет.
2. Язык MATLAB
59
Функция TF = ishandle(H) возвращает логический массив, соразмерный с Н. Эле¬
мент равен 1, когда соответствующий элемент исходного массива является дескрипто¬
ром, и 0 - если нет.
Функция k = ishold возвращает 1, если сохраняются свойства графических объектов
Figure и Axes, и 0 - если нет. В этом случае последующие графические построения до¬
бавляются к текущему графику, т. е. свойство NextPlot для обоих объектов получает
значение Add.
Функция TF = isinf(A) возвращает логический массив, соразмерный с А. Элемент
равен 1, когда соответствующий элемент массива равен +Inf или -Inf, и 0 - если нет.
Функция TF = isjava(A) возвращает 1, если А является объектом языка Java, и 0 -
в противном случае.
Функция TF = isletter(’<CTpoKa>') возвращает массив размера, соразмерный с дли¬
ной строки и состоящий из 1 и 0. Элемент равен 1, когда соответствующий элемент
строки является буквой алфавита, и 0 - если нет.
Функция k = islogical(A) возвращает 1, если А - логический массив, и 0 - если нет.
Функция TF = isnan(A) возвращает логический массив, соразмерный с А. Элемент
равен 1, когда соответствующий элемент массива равен NaN, и 0 - если нет.
Функция k = isnumeric(A) возвращает 1, если А - числовой массив, и 0 - если нет.
Массивы чисел удвоенной точности и разреженные матрицы являются числовыми
массивами, а строки, массивы ячеек и массивы записей таковыми не являются.
Функция k = isobject(A) возвращает 1, если А - объект системы MATLAB, и 0 - ес¬
ли нет.
Функция k = ispc возвращает 1, если используется версия системы MATLAB для
PC (операционная система Windows), и 0 - в остальных случаях.
Функция TF = isprime(A) возвращает массив того же размера, что и А, состоящий
из 1 и 0. Элемент равен 1, когда соответствующий элемент массива простое число,
и 0 - если нет.
Функция k = isruntime возвращает 1, если система MATLAB функционирует в ре¬
жиме Runtime Server либо коммерческая версия системы MATLAB работает в режиме
эмуляции сервера времени исполнения, и 0 - в остальных случаях.
Функция k = isreal(A) возвращает 1, если все элементы массива А - вещественные
числа, и 0 - если некоторые элементы массива А имеют ненулевые мнимые части. Так
как массивы строк являются подклассом числового массива, функция isreal всегда воз¬
вращает 1, если входом является строка.
Функция tf = isspace('<cTpoKa>') возвращает логический массив, соразмерный
с длиной входной строки. Элемент равен 1, когда соответствующий элемент исходной
строки является незаполненным пространством в кодах ASCII, и 0 - если нет. Неза¬
полненное пространство в кодах ASCII - это пробел, символы новой строки, возврата
каретки, табуляции, прогона страницы
Функция k = issparse(S) возвращает 1, если S - разреженный массив, и 0 - если нет.
Функция k = isstruct(S) возвращает 1, если S - массив записей, и 0 - если нет.
Функция k = isstudent возвращает 1, если используется студенческая версия систе¬
мы MATLAB, и 0 - если коммерческая.
Функция k = isunix возвращает 1, если используется версия системы MATLAB для
ОС Unix, и 0 - если нет.
60
В. Г. Потемкин. Вычисления в среде MATLAB
Функция tf = isvarname('<CTpoKa>’) или isvarname <строка> возвращает 1, если
'строка' является допустимым именем переменной языка MATLAB, и 0 - в противном
случае. В системе MATLAB допустимым именем переменной является строка симво¬
лов, включающая буквы, цифры и знаки подчеркивания и обязательно начинающаяся
с буквы. При этом системой контролируются только первые 31 символ.
Примечание:
Обозначения TF и tf заимствованы из оригинала документации по системе MAT¬
LAB и являются аббревиатурами от словосочетания True For, причем прописные бук¬
вы указывают на то, что выходом является массив, а строчные - вектор.
Примеры:
s = 'А1,В2,СЗ1;
isletter(s)
ans =1 0
0
1
0
В = rand(2,2,2);
B(:,:, :) = [ ];
isempty(B)
ans = 1
A = [10 10 1
0;
0 10 10
0]
/
В = A; C = A;
isequal (А, В, C)
Warning: Divide
by
zero.
ans =0 0
0
0
0
isfinite(0./a)
Warning: Divide
by
zero.
ans =1 1
0
1
1
isinf (0. /a)
Warning: Divide
by
zero.
ans = 0 * 0
0
0
0
isnan(0./a)
Warning: Divide
by
zero.
ans =0 0
1
0
0
Создадим класс объектов Frame языка Java. Функция isjava показывает, что он яв¬
ляется объектом языка Java.
frame = j ava. awt. Frame ( 1 Frame A1);
isjava (frame)
ans = 1
Необходимо заметить, что функция isobject возвращает в этом случае О (ЛОГИЧЕ¬
СКОЕ НЕТ).
isobject (frame)
ans = О
Сопутствующие функции: WHICH, WHO, WHAT, DIR, HELP, LOOKFOR.
2. Язык MATLAB
61
EXIST
Проверить существование объекта с заданным именем
Синтаксис:
Формат команды
exist <имя>
exist <имя> <тип>
Формат функции
е = exist('<имя>')
е = exist(’<имя><тип>’)
Описание:
Функция е = exist('<HMH>’) возвращает значения выходного аргумента согласно
таблице.
е
Объект системы МА TLAB
0
Отсутствует
1
Переменная в рабочей области
2
М-файл или файл неизвестного типа
з
МЕХ-файл
4
MDL-файл
5
Встроенная функция
6
Р-файл
7
Каталог
8
Класс языка Java
Если входной аргумент <имя> связан с именем файла, то его можно дополнить
расширением, чтобы исключить конфликт с другим подобным именем.
Для того чтобы распознать МЕХ, MDL и P-файлы, они должны находиться на пути
доступа системы MATLAB.
Если функции ех151('<имя_файла>') или ех151('<имя_файла>.***') возвращают зна¬
чение 2, то это означает, что файл с таким именем принадлежит к списку путей досту¬
па системы MATLAB, но расширение этого файла не есть mdl, р или тех.
Если исследуемый файл или каталог не находятся на пути доступа, то имя_файла
должно содержать полный путь доступа или частичный путь доступа в пределах те¬
кущего каталога.
Если искомый объект является классом языка Java, то функция exist возвращает
значение 8, но если же это файл, принадлежащий к Java-классу, то возвращается зна¬
чение 2, которое соответствует файлу неизвестного типа.
Функция е = ех151('<имя>', ’<тип>') позволяет указать тип объекта из следующего
перечня.
Тип объекта
Действие
var
Проверять только на принадлежность к переменным
builtin
Проверять только на принадлежность к встроенным функциям
file
Проверять только на принадлежность к файлам
dir
Проверять только на принадлежность к каталогам
class
Проверять только на принадлежность к классу языка Java
62
В. Г. Потемкин. Вычисления в среде MATLAB
Замечание:
Для проверки нескольких объектов одного типа, но с разными именами следует
применять функцию ismember, которая позволяет определить принадлежность не¬
скольких объектов к заданному множеству.
Примеры:
Проверить, является ли функция eig встроенной или М-файлом.
type = exist('eig1)
type = 5
Ответ: функция eig - встроенная функция.
Проверить, является ли класс Frame Java-классом.
type = exist('Frame1 class 1)
type = 8
Сформируем клетку Жордана порядка 3 с собственным значением pi и проверим,
нет ли каталога с таким именем в установленной системе.
Jord = gallery('jordbloc'r3,pi)
Jord =
3.1416 1
0
0 3.1416
1
0 0
3.1416
exist('Jord','var'), exist('Jord','dir')
ans = 1
ans = 7
Ответ: и переменная и каталог с таким именем существуют.
GUI-интерфейс:
В качестве альтернативы функции exist можно использовать графический интер¬
фейс, предоставляемый системой MATLAB 6, и просмотреть наличие объекта с ука¬
занным именем в рабочей области Workspace или в текущем каталоге Current
Directory.
Сопутствующие функции: DIR, HELP, LOOKFOR, PARTIALPATH, WHAT, WHICH,
WHO.
2.5. Операторы обработки множеств
Как правило, работа в системе MATLAB связана с вычислением функций и по¬
строением графиков. Все эти операции выполняются на множествах чисел, которые
могут быть рациональными, действительными, комплексными, с плавающей точкой.
Кроме того, множествами являются списки идентификаторов, имен файлов или в об¬
щем случае любая совокупность различаемых элементов. Поэтому можно говорить
о множествах чисел, множествах символов, множествах элементов и рассматривать
множество как некоторый объект, для которого определен некоторый набор операций.
В теории множеств определены следующие операции, или алгебра множеств [26].
Пусть А и В - множества.
2. Язык MATLAB
63
Объединением множеств А и В называется множество всех элементов, принадле¬
жащих либо А, либо В (в широком смысле, т. е., возможно и А и В).
Пересечением множеств А п В называется множество всех элементов, принадле¬
жащих как А, так и В.
Разностью множеств А\В называется множество всех элементов А, не принадле¬
жащих В, причем не обязательно В с А, т. е. В является подмножеством А.
В системе MATLAB алгебра множеств поддержана следующими операциями:
Алгебра множеств
Оператор MATLAB
Описание операции
АиВ
union
Объединение множеств
АпВ
intersect
Пересечение множеств
А\В
setdiff
Разность множеств
А-АпВ
setxor
Дополнение
ScP
ismember
Принадлежность элементов S к множеству Р
-
unique
Удаление совпадающих элементов
ISMEMBER | Выявить принадлежность элементов к заданному множеству
Синтаксис:
TF = ismember(S,Р)
tf = ismember(S,Р,'rows')
[TF,loc] = ismember(S,P,...)
Описание:
Функция TF = ismember(S, P) возвращает массив TF, соразмерный c S, содержащий
элементы со значением 1, если элемент S принадлежит к множеству Р, и 0 - в против¬
ном случае. S и Р могут быть массивами строковых ячеек.
Функция tf = ismember(S, Р, 'rows'), где S и Р являются массивами с одинаковым
количеством столбцов, возвращает вектор tf, содержащий элементы со значением 1
в тех позициях, когда соответствующая строка массива S содержится в Р, и 0 - в про¬
тивном случае.
Функция [TF, loc] = ismember(S, Р, ...) возвращает также массив 1ос, соразмерный
с S, который содержит максимальные абсолютные значения индексов тех элементов
в Р (при их повторениях), которые совпадают с элементами массива S содержится в Р,
и 0 - если такой индекс отсутствует.
Примеры:
Рассмотрим два числовых вектора и проверим, какие элементы вектора s содержат¬
ся в векторе р.
р = 0:2:20
s = reshape(1:5,[1
5] )
Р = 0
2 4
6
8
10
12
14
16
18
20
s = 1
2 3
4
5
64 В. Г. Потемкин. Вычисления в среде MATLAB
[tf,loc] = ismember (s,p)
tf = 0 1 0 1 0
loc = 0 2 0 3 0
Из анализа результата следует, что элементы 2 и 4 вектора s присутствуют в векто¬
ре р в позициях 2 и 3.
Рассмотрим пример исходного множества с повторяющимися элементами, сохра¬
нив тот же вектор s.
р = [5 2 4 2 8 10 12 2 16 18 20 4];
[tf, loc] = ismember (s,p); stf = s(tf),loc
stf =245
loc =0 8 0 12 1
В этом случае 3 элемента - 2, 4 и 5 - вектора s содержатся в векторе р и их макси¬
мальные абсолютные индексы равны 8, 12 и 1 соответственно.
Другой пример связан с поиском идентификаторов в списке переменных рабочей
области. Допустим, существуют 2 переменные с именами а и с. Требуется проверить,
нет ли в списке переменных рабочей области переменных с именами а, b и с.
а = 5.83; с = 'teststring1;
ismember({’a1,1 b ’,' с ' } гwho)
ans =1 0 1
Ответ: переменной с именем b в списке переменных рабочей области нет.
В следующих примерах обратимся к работе с массивами. Пусть заданы 2 массива
с одинаковым количеством столбцов:
Р = ones(3,4)
Р =
1
1
1
1
1
1
1
1
1
1
1
1
S = eye(3,4)
S =
•1
0
0
0
0
1
0
0
0
0
1
0
[TF,loc]
= ismember (S
,P)
TF =
1
0
0
0
0
1
0
0
0-
0
1
0
loc =
12
0
0
0
0
12
0
0
0
0
12
0
Элементы массива S,
равные
1, и только они, содержатся в массиве Р, состоящем
из одних единиц, поэтому максимальный абсолютный индекс равен 12.
Сформируем матрицу Р, которая заведомо включает в качестве подматрицы клетку
Жордана S.
2. Язык MATLAB 65
3 т. Зак. 3375
S = gallery('jordbloc3,pi)
S =
3.1416
0
0
P = [S; 10 0]
P =
3.1416
0
0
1
1
3.1416
0
0
1
3.1416
1
3.1416
0
0
1
3.1416
0
0
Проверим вхождение элементов S в P.
[TF,loc] = ismember(s,P)
TF =
1
1
1
1
1
1
1
1
1
11
10
12
12
11
10
12
12
11
Логический массив TF подтверждает, что каждый элемент S содержится в Р и мак¬
симальные абсолютные значения индексов этих элементов 10, 11 и 12.
Теперь проверим наличие общих строк в этих матрицах.
[tf,loc] = ismember(S,P,'rows 1
); tf,Stf=S(tf,:),loc,P(loc,:)
tf =
1
1
1
Stf =
3.1416
1
0
0
3.1416
1
0
0
3.1416
loc =
1
2
3
ans =
3.1416
1
0
0
3.1416
1
0
0
3.1416
При таком обращении к М-функции ismember логический вектор tf позволяет оп¬
ределить те строки матрицы S, которые целиком входят в матрицу Р; номера этих
строк в матрице Р определяются вектором 1ос, который позволяет восстановить эти
строки. Сравнивая ans и Stf, мы убеждаемся, что матрица S действительно является
подматрицей матрицы Р.
Сопутствующие функции'. INTERSECT, ISSORTED, IS*, SETDIFF, SETXOR, UNION,
UNIQUE.
66
В. Г. Потемкин. Вычисления в среде MATLAB
Удаление из множества совпадающих элементов
UNIQUE |
Синтаксис:
В = unique(А)
В = unique(А,’rows')
[B,m,n] = unique(A ...)
Описание:
Функция В = unique(A) удаляет из множества А одинаковые элементы, оставляя
только один экземпляр удаленных элементов, и сортирует элементы массива В в по¬
рядке возрастания. В качестве множества могут быть массивы строковых ячеек.
Функция В = unique(A, ’rows'), где А - массив, формирует массив В, из которого
удалены одинаковые строки.
Функция [В, ш, n] = unique(...) возвращает, кроме того, векторы индексов тип, та¬
кие, что В = А(ш,:) и А = В(п,:).
Пример:
а =
[1
15 6 2
3
3
9
8 6
2
4];
[b,m
,п]
= unique(а)
г
Ьт '
а(т)
Ь =
1
2 3 4 5
6
8
9
ш =
2
11 7 12
3
10
9 8
п =
1
15 6 2
3
3
8
7 6
2
4
bm =
1
2.345
6
8
9
ап =
1
15 6 2
3
3
9
8 6
2
4
Восстановленные векторы bm и ап совпадают с векторами b и а соответственно.
Рассмотрим часто возникающую на практике задачу удаления совпадающих строк
из массива элементов. Образуем следующий массив комплексных элементов:
realx =[1 1330130]; realy =[331 10310];
imagx = [1-1000100]; imagy = [001-10010];
х = complex(realx, imagx);
У =?
complex(realy, imagy);
А =
[х.1 у.’]
А =
1 + li
3
1 - li
3
3
1 +
li
3
1 -
li
0
0
1 + li
3
3
1 +
li
0
0
Удалим из этого массива совпадающие строки и упорядочим оставшиеся в порядке
возрастания элементов первого столбца2.
2 Упорядочение комплексных чисел производится в порядке возрастания их действительной части, а за-
тем таким же способом упорядочиваются мнимые части.
2. Язык MATLAB
67
[B,m,n] = unique (A, ' rows'); B,m,n, An=B (n, :)
В =
0
1 -
1 +
3
3
m =
8
2
6
4
7
n =
3
2
5
4
1
3
5
1
An =
1 +
1 -
3
3
0
1 +
3
0
' 0
li 3
li 3
1 -
1 +
li 3
li 3
1 +
1 -
0
li 3
1 +
0
li
li
li
li
li
Вектор m указывает, из каких строк исходного массива сформирован выходной
массив, вектор п позволяет восстановить исходный массив по выходному.
Последний пример демонстрирует, как М-функция unique обрабатывает специаль¬
ные константы Inf и NaN:
unique ([1 1 NaN NaN Inf Inf -Inf -Inf -NaN -NaN])
ans = -Inf 1 Inf NaN NaN NaN NaN
Полученный результат подтверждает, что М-функция unique обрабатывает кон¬
станту Inf как число, равное бесконечности, но не обрабатывает константу NaN,
а константа -NaN заменяется на NaN.
Сопутствующие функции'. INTERSECT, ISMEMBER, ISSORTED, SETDIFF, SETXOR,
UNION.
UNION |
Синтаксис:
С = union(a,b)
С = union(А,В,’rows')
[C,ia,ib] = union (...)
Объединение множеств А о В
68
В. Г. Потемкин. Вычисления в среде MATLAB
Описание:
Функция С = union(a, b) формирует объединение множеств а и b в множество с без
повторения одинаковых элементов. В смысле теории множеств С = а и Ь, причем эле¬
менты множества С отсортированы в порядке возрастания. В качестве множеств могут
быть массивы строковых ячеек.
Функция С - union(A, В, 'rows’), где А и В - массивы с одинаковым количеством
столбцов, формирует массив С, в котором объединены строки без повторений.
Функция вида [С, ia, ib] = union(...) возвращает, кроме того, векторы индексов ia
и ib, указывающие, какие элементы были использованы для объединения, т. е.
С = a(ia,:) ub(ib,:).
Пример:
Рассмотрим два множества целых положительных и отрицательных чисел, принад¬
лежащих действительной оси, и образуем их объединение без повторения элементов.
а = [-1 0 2 4 6 2 4]; Ь =
[C,ia,ib] = union(а,Ь)
С = -1 0 1
6
ia =
6 7 5
ib = 5
[-1 0 13-1 0];
2 3 4
4
6 3
Анализ результата показывает, что объединение элементов реализовано следую¬
щим образом: к неповторяющимся элементам из множества b добавляются новые не¬
повторяющиеся элементы из множества а и, как это принято в системе MATLAB, ука¬
зываются максимальные индексы повторяющихся элементов.
Рассмотрим геометрическую интерпретацию объединения элементов двух пересе¬
кающихся множеств А и В (рис. 2.3).
рис. 2.3
Построение этого графического образа реализуется с помощью следующего кода
на языке MATLAB:
х = -1:0.1:1;
у = sqrt(1-х.А2);
А = fill(х,у,1 г1); hold on
х = round(x*le5)*le-5;
xl = х+1; у1 = у;
xl = round(xl*le5)*1е-5;
fill(xlryl,'Ь1) % рис. 2.3
2. Язык MATLAB
69
Используя М-функцию union, выполним объединение элементов массивов х и х!
и построим объединение множеств АиВ.
X = union(x,xl);
tl = Х(Х<0.5); t2 = Х(Х>=0.5);
yl = l-tl.A2; у2 = l-(t2-l).A2;
Y = [sqrt(yl) sqrt(y2)J;
fill(Xl,Y,*g’) % рис. 2.4
Сопутствующие функции'. UNIQUE, INTERSECT, SETDIFF, SETXOR, ISMEMBER.
INTERSECT I Пересечение множеств A n В
Синтаксис:
С = intersect(a,b)
C = intersect(A,B,'rows')
[C,ia,ib] = union (...)
Описание:
Функция С = intersect(a, b) формирует пересечение множеств а и b, отбирая только
общие элементы. В смысле теории множеств с = а п Ь, причем элементы множества с
отсортированы в порядке возрастания. В качестве множеств могут быть массивы стро¬
ковых ячеек.
Функция С = intersect(A,- В, ’rows'), где А и В - массивы с одинаковым количеством
столбцов, формирует массив С, в котором содержатся общие строки массивов АиВ.
Функция вида [С, ia, ib] = intersect(...) возвращает, кроме того, векторы индексов ia
и ib, такие, что справедливы соотношения с = a(ia) и с = b(ib) при работе с векторами
или С = A(ia,:) и С = B(ib,:) при работе с массивами.
Пример:
Рассмотрим 2 множества целых положительных чисел, принадлежащих действи¬
тельной оси, и найдем их пересечение, т. е. множество общих элементов:
а = [1 2 2
3 б]; b = [123
[C/ia/ib]
intersect(a, b)
с =
1
2
3 6
ia =
1
3
4 5
ib =
1
2
3 6
70
В. Г. Потемкин. Вычисления в среде MATLAB
Читатель может самостоятельно убедиться, что при наличии в исходных векторах
повторяющихся элементов в выходных аргументах ia и ib указываются максимальные
индексы.
Рассмотрим геометрическую интерпретацию операции пересечения двух множеств
А и В (рис. 2.5). Используя М-функцию intersect, найдем пересечение массивов х и х1
и построим соответствующее пересечение А п В.
X = intersect(х,х1);
tl = Х(Х<=0.5); t2 = Х(Х>0.5);
yl = l-(tl-l).A2; у2 = l-t2.A2;
Y = [sqrt(yl) sqrt(y2) ];
Х1=Х;
fill(XI,Y,1g1) % рис. 2.5
рис. 2.5
Сопутствующие функции'. ISMEMBER, ISSORTED, SETDIFF, SETXOR, UNION,
UNIQUE.
SETDIFF ~~| Разность множеств A \ В
Синтаксис:
С = setdiff(a,b)
C = setdiff(A,B,'rows')
[c,ia] = setdiff(...)
Описание:
Функция С = setdiff(a, b) формирует множество С, элементами которого являются
элементы множества а, которые не совпадают с элементами Ь. В смысле теории мно¬
жеств это разность множеств с = с№ с элементами, отсортированными в порядке воз¬
растания. В качестве множеств могут быть массивы строковых ячеек.
Функция С = setdiff(A, В, ’rows’), где А и В - массивы с одинаковым количеством
столбцов, формирует массив С, в котором содержатся несовпадающие строки масси¬
вов А и В.
Функция [с, ia] = setdiff(...) возвращает, кроме того, вектор индексов ia, такой, что
справедливо соотношение с = a(ia) при работе с векторами или С = A(ia,:) при работе
с массивами.
2. Язык MATLAB
71
Пример:
Определим, все ли элементы магической матрицы меньшего порядка повторяются
в матрице более высокого порядка. Рассмотрим магические матрицы порядка 3 и 4.
А = magic(4); В = magic(3);
с = setdiff(А(:),В(:))
с =
10
11
12
13
14
15
16
Для решения поставленной задачи необходимо использовать абсолютную нумера¬
цию, т. е. рассматривать матрицы А и В как векторы. Поскольку матрица А содержит
16 элементов, а матрица В - 9 элементов, а вектор с указывает, что все элементы, на¬
чиная с 10-го, принадлежат матрице А, следовательно множество В является подмно¬
жеством А.
Однако можно поступить еще проще, а именно найти разность В\А и убедиться,
что результатом является пустой массив:
с = setdiff(В(:),А(:))
с = Empty matrix: 0-by-l
Рассмотрим геометрическую интерпретацию разности двух множеств А и В (рис. 2.3).
Используя М-функцию setdiff, найдем разность массивов х и х1 и построим соответст¬
вующую разность множеств А\В:
X = setdif f (х(х<=0.5) ,xl (х1>0.5));
tl = Х(Х<=0.5); t2 = Х(Х<=0.5 & Х>=0);
yl = l-tl.A2; у2 = l-(t2-l).A2;
Y = [sqrt(yl)1; fliplr(sqrt(у2))1];
Xl=[tl'; fliplr(t2)1];
fill(Xl,Y,'g*) % рис. 2.6,a
a 6
рис. 2.6
На рис. 2.6, б построена разность множеств В\А.
Сопутствующие функции: UNIQUE, UNION, INTERSECT, SETXOR, ISMEMBER.
72
В. Г. Потемкин. Вычисления в среде MATLAB
SETXOR |
Дополнение пересечения множеств до их объединения
АиВ-АпВ
Синтаксис:
С = setxor(a,b)
С = setxor(А,В,’rows’)
[C,ia,ib] •= setxor(...)
Описание:
Функция С = setxor(a, b) формирует множество С, элементы которого не принадле¬
жат пересечению множеств а и Ь, но принадлежат объединению а и Ь. Элементы ре¬
зультирующего множества отсортированы в порядке возрастания. В качестве мно¬
жеств могут быть массивы строковых ячеек.
Функция С = setxor(A, В, 'rows’), где А и В - массивы с одинаковым количеством
столбцов, формирует массив С, в котором содержатся строки, не принадлежащие пе¬
ресечению массивов А и В.
Функция вида [С, ia, ib] = setxor(...) возвращает, кроме того, векторы индексов
ia и ib, такие, что справедливы соотношения с = a(ia) и с = b(ib) при работе с векторами
или С = A(ia,:) и С = B(ib,:) при работе с массивами.
Пример:
Заданы 2 множества чисел с плавающей точкой и необходимо исключить из их
объединения общие элементы.
а = [-101 Inf -Inf NaN];
b = [-2 pi 0 Inf NaN];
cl = intersect(a,b)
c2 = setxor(afb)
cl = 0 Inf
c2 = -Inf 2-11 3.1416 NaN NaN
Массив cl содержит общие элементы множества, причем элемент NaN не входит
в это число.. Оставшиеся элементы принадлежат массиву с2.
Теперь у нас есть возможность проверить, что разность множеств может быть вы¬
ражена через дополнение к их пересечению, т. е. справедливы следующие соотношения:
a/b = a-anb;
b/a = b-anb.
Действительно, первое соотношение равносильно оператору
сЗ = setxor(a,cl)
сЗ = -Inf -1
1 NaN
второе - оператору
с4 = setxor(b,cl)
с4 = -2
3.1416
NaN
Рассмотрим геометрическую интерпретацию оператора АиВ-АпВ. Используя
М-функцию setxor, найдем все точки массивов х и х 1, не принадлежащие их пересече¬
нию и построим соответствующий геометрический образ:
2. Язык MATLAB
73
X = setxor(x(x<0.5),xl(xl>=0.5)) ;
tl = Х(Х<=1); t2 = Х(Х>=0&Х<=2);
yl = l-tl.A2; у2 = l-(t2-l).A2;
Y= [sqrt(yl)'; sqrt(y2)'J;
XI-[tl*; t2■ ];
fill(Xl,Y,'g')
рис. 2.7
Сопутствующие функции: UNIQUE, UNION, INTERSECT, SETDIFF, ISMEMBER.
2.6. Операторы побитовой обработки
При обработке цифровых данных, поступающих по каналам связи от различных
устройств, может потребоваться доступ к отдельным битам их двоичного кода. Наибо¬
лее естественной в этих случаях представляется работа с логическими массивами. Од¬
нако в системе MATLAB М-функции dec2bin, dec2hex, предназначенные для преобра¬
зования десятичных чисел, имеют на выходе строковые представления. Только
в специализированном пакете программ Data Acquisition Toolbox имеется специальная
М-функция dec2binvec, которая формирует тип данных logical для двоичного пред¬
ставления чисел.
Ниже во всех примерах с функциями побитовой обработки будем использовать ло¬
гический тип данных.
BITGET I Определить значение битов двоичного кода десятичного числа
Синтаксис:
Nb = bitget(N,bits)
Описание:
Функция Nb = bitget(N, bits) возвращает значения битов в позициях bits двоичного
кода числа N, где N - неотрицательное Целое десятичное число, bits - вектор номеров
битов двоичного кода. Для компьютеров с IEEE-арифметикой максимальное количе¬
ство битов равно 52.
Пример:
Получить 5 бит двоичного кода для числа 25.
Nb = logical(bitget(25,5:-1:1))
Nb = 1 1 0 0 1
В этом представлении старшие разряды расположены слева и число 25 формирует¬
ся как 16+8+1.
74
В. Г. Потемкин. Вычисления в среде MATLAB
Замечание:
Для того чтобы входной аргумент был целочисленным, надо выполнить масштаби¬
рование числа с учетом его степени и применить М-функции ceil, fix, floor, round, что¬
бы округлить полученное число до целого.
Сопутствующие функции'. BITAND, BITCMP, BITMAX, BITOR, BITSET, BITSHIFT,
BITXOR.
BITSET I Установить значение бита
Синтаксис:
с = bitset(a,bits)
с = bitset(a,bits,v)
Описание:
Функция с = bitset(a, bits) устанавливает значение битов в позициях bits в 1.
Функция с = bitset(a, <бит>, v) присваивает битам двоичного кода в позициях bits
значения 0 или 1, заданные вектором v.
Пример:
Преобразовать число 14 в число 30.
Nb = logical(bitget(14,5:-1:1))
Nb = 0 1 1 1 0
с = bitset(14,5,1), logical(bitget(с,5:-1:1))
с = 30
ans =1 1 1 1 0
Сопутствующие функции'. BITAND, BITCMP, BITGET, BITMAX, BITOR, BITSHIFT,
BITXOR.
BITMAX | Максимальное целое число
Синтаксис:
с = bitmax
Описание:
Функция с = bitmax вычисляет максимальное целое число для арифметики с пла¬
вающей точкой; двоичному коду которого соответствуют все биты, равные 1. Для
компьютеров с IEEE-арифметикой это значение равно 2-1.
Пример:
Вычислить максимальное целое число для арифметики с плавающей точкой.
c =
bitmax,
logical(bitget(c,52:
-1:1))
c =
ans
9007199254740992
= 111111
1
1
1
1
1
111111111
1 1
1111
1
1
1
1
1
111111111
1 1
1111
1
1
1
1
1
1
Сопутствующие функции’. BITAND, BITCMP, BITGET, BITOR, BITSET, BITSHIFT,
BITXOR.
2. Язык MATLAB
75
BITCMP I Побитовое n-разрядное дополнение
Синтаксис:
с = bi temp (а, п)
Описание:
Функция с = bitcmp(a, п) строит побитовое дополнение двоичного кода для п пер¬
вых бит.
Пример:
Преобразовать число 30 в число 33.
logical(bitget(30,6:-1:1))
ans =0 1
1
1
1
0
с = bitemp(30,6)
с = 33
logical(bitget(с,6:-1:1))
ans =1 0
0
0
0
1
Действительно, для этого достаточно выполнить дополнение двоичного кода в 6-м
бите.
Сопутствующие функции: BITAND, BITGET, BITMAX, BITSHIFT, BITSET, BITOR,
BITXOR.
BITAND I Логическое умножение
Синтаксис:
с = bitand(a,b)
Описание:
Функция с = bitand(a, b) выполняет операцию логического умножения, или конъ¬
юнкцию, над целыми числами а и b из диапазона от 1 до bitmax.
Пример:
N1 = logical(bitget(12,4:-1:1))
ans =1 1 0 0
N2 = logical(bitget(10,4:-1:1))
ans =1 0 1 0
logical(bitget(bitand(12,10), 4:-1:1))
ans =1 0 0 0
Для получения того же результата можно выполнить операцию логического умно¬
жения над логическими числами N1 и N2:
N1&N2
ans =1 0 0 0
Сопутствующие функции'. BITCMP, BITGET, BITMAX, BITSHIFT, BITSET, BITOR,
BITXOR.
76
В. Г. Потемкин. Вычисления в среде MATLAB
BITOR I Логическое сложение
Синтаксис:
с = bitor(a,b)
Описание:
Функция с = bitor(a, b) выполняет операцию логического сложения, или слабую
дизъюнкцию, над целыми числами а и b из диапазона от 1 до bitmax.
Пример:
N1 = logical(bitget(12,4:-1:1))
ans =1 1 О О
N2 = logical(bitget(10,4:-1:1))
ans =10 1 0
logical(bitget(bitor(12,10),4:-1:1))
ans =1 1 1 0
Для получения того же результата можно выполнить операцию логического сло¬
жения над логическими числами N1 и N2:
N1|N2
ans =1 1 1 0
Сопутствующие функции: BITAND, BITCMP, BITGET, BITMAX, BITSHIFT, BITSET,
BITXOR.
BITXOR j Сложение по модулю 2
Синтаксис:
с = bitxor(a,b)
Описание:
Функция с = bitxor(a, b) выполняет операцию сложения по модулю 2, или строгую
дизъюнкцию, над целыми числами а и b из диапазона от 1 до bitmax.
Пример:
N1 = logical(bitget(12,4:-1:1))
ans =1 1 0 0
N2 = logical(bitget(10,4:-1:1))
ans =1 0 1 0
logical(bitget(bitxor(12,10),4:-l:l))
ans =0 1 1 0
Для получения того же результата можно выполнить операцию сложения по моду¬
лю 2 над логическими числами N1 и N2:
xor(Nl,N2)
ans =0 1 1 0
Сопутствующие функции: BITAND, BITCMP, BITGET, BITMAX, BITOR, BITSHIFT,
BITSET.
2. Язык MATLAB
77
Сдвиг на к битов
BITSHIFT ]
Синтаксис:
с = bitshift(а,к,п)
с = bitshift(а,к)
Описание:
Функция с = bitshift(a, к, п) выполняет операцию сдвига двоичного кода на к бит.
Это равносильно умножению на 2к; если сдвиг приводит к переполнению бита с номе¬
ром п, то этот бит обнуляется.
Функция с = bitshift(a, к) выполняет операцию сдвига на к бит. Значение п
по умолчанию равно 53.
Пример:
Выполнить умножение десятичного числа 3 на число 4 путем сдвига двоичного ко¬
да числа 3 на 2 разряда влево.
Nb = logical(bitget(3,4:-1:1)
Nb = 0 0 1 1
logical(bitget(bitshift(3,2,4),4:-1:1))
ans =1 1 0 0
bitshift(3,2,4)
ans = 12
Результат действительно равен произведению 3x4, т. е. 12 в десятичной системе
счисления.
Сопутствующие функции'. BITAND^ BITCMP, BITGET, BITMAX, BITOR, BITSET,
BITXOR.
2.7. Вычисление дат, времени и интервалов
Во многих случаях данные, подлежащие обработке, сопровождаются информацией
о времени и дате их создания или модификации. Поэтому расчетная подсистема любо¬
го пакета программ дополняется функциями обработки дат. Это же относится и к ядру
системы MATLAB, которое включает в свой состав М-функции для вычисления вре¬
мени и дат.
Форматы дат. При работе с датами наиболее употребительным является строковый
формат, т. е. запись даты в виде строки символов.
В версии 6.5 существует 32 формата представления дат и времени в виде строк
символов. Наиболее употребительные из них - это строки символов: ’dd-mmm-yyyy’,
'mm/dd/yyyy’ или ’dd-mmm-yyyy-hh:mm:ss', в которых может быть до шести полей, со¬
стоящих из символов и чисел:
• поле "день” - это календарный день в виде числа от 1 до 31;
• поле ’’месяц” - это либо число от 1 до 12, либо строка из трех первых букв месяца;
• поле "год" - это неотрицательное число из двух или четырех цифр; если год опу¬
щен, 1Ю умолчанию используется текущий;
78
В. Г. Потемкин. Вычисления в среде MATLAB
• поля времени включают указание часов, минут и секунд; соответствующие поля
разделяются двоеточием; поле для указания часа может содержать аббревиатуры
"ат" (до полудня) или "рт" (после полудня).
Для текущего 2003 г. все 6 приведенных ниже записей эквивалентны:
’12-Jan-2003’ ’Jan 12,2003’
'12-Jan-03’ '1/12/03'
’12-Jan' ’1/12’
Если в строковом формате даты используются только числа, то по умолчанию
предполагается американский формат даты, когда первое поле соответствует месяцу.
Сама система MATLAB при обработке дат использует числовой формат, т. е. за¬
пись даты в виде десятичного числа. Числовой формат соответствует количеству дней,
отсчитываемых от некоторой базовой даты, в качестве которой в системе MATLAB
принято 1 января 0000 г. нашей эры. Кроме того, числовой формат применяется для
представления дробных долей дня, который начинается в полночь; например, 6 часов
после полудня (т. е. 18 часов вечера) в числовом формате равны 0.75 дня. Таким обра¬
зом, числовой формат строковой даты '12-Jan-2003,6:00pm' соответствует десятичной
дроби 731593.75.
Все М-функции, обрабатывающие даты, могут работать как со строковым, так
нечисловым форматом. При работе в командной строке предпочтителен строковый
формат; если же необходимо производить расчеты, то эффективнее числовой формат.
Некоторые М-функции системы MATLAB используют и генерируют векторный
формат представления даты и времени, который включает [год месяц день час мину¬
та секунда].
Преобразование дат. Для эффективного применения различных форматов предназна¬
чены функции преобразования дат. Наиболее употребительной является функция пре¬
образования в числовой формат datenum.
Функция datenum дает возможность преобразовать строковый и векторный форма¬
ты дат в числовой.
Функция datestr позволяет преобразовать либо один строковый формат в другой,
либо числовой или векторный формат в строковый.
Функция datavec преобразует строковый и числовой форматы дат в векторный.
Функции вычисления дат, времени и интервалов
Система MATLAB включает следующие функции для вычисления дат, времени
и интервалов:
Тип функции
Имя функции
Назначение
Время и даты
now
Текущее время и дата в числовом формате
date
Текущая дата в строковом формате
clock
Текущее время и дата в векторном формате
Преобразования
datenum
Числовое представление даты
datestr
Строковое представление даты
datevec
Векторное представление даты
2. Язык MATLAB
79
Тип функции
Имя функции
Назначение
День и даты
calendar
Календарь
weekday
День недели
eomday
Последний день месяца
datetick
Дата с метками времени
Интервалы времени
cputime
tic
toe
Время работы центрального процессора
Начало отсчета
Конец отсчета
etime
Прошедшее время
pause
Прерывание выполнения
Время и даты
NOW | Числовой формат текущего времени
Синтаксис:
t = now
Описание'.
Функция t = now выводит текущее время и дату в числовом формате в виде деся¬
тичного числа. Применение функции floor позволяет выделить текущую дату, а функ¬
ции rem(t, 1) - текущее время.
Для представления текущего времени и даты в строковом формате предназначена
функция datestr(now).
Пример:
Определим текущее время и дату.
format long
t = now
format bank
cday = floor(t)
chour = rem(t,l)
nowtime = datestr(t,0)
t = 731593.39
cday = 731593.00
chour = 0.39
nowtime = 12-Jan-2003 09:18:01
Сопутствующие функции: CLOCK, DATE, DATENUM.
DATE ] Дата
Синтаксис:
s = date
Описание:
Функция s = date возвращает текущую дату в строковом формате dd-mmm-yyyy.
80
В. Г. Потемкин. Вычисления в среде MATLAB
Пример:
Определить текущую дату.
s = date
s = 12-Jan-2003
Сопутствующие функции'. NOW, CLOCK, DATENUM.
CLOCK | Часы
Синтаксис:
t = clock
Описание:
Функция с = clock возвращает текущую дату и время в векторном формате:
[год месяц день час минута секунда] .
Первые 5 элементов являются целыми числами, 6-й - имеет несколько знаков после
десятичной точки. Функция fix(t) выдает целочисленные показания часов, округляя
значение секунд до целых.
Пример:
format short g
t = clock
nowt = fix(t)
t = 2003
1
12
9
36
6.
589
nowt = 2003
1
12
9
36
6
Это соответствует текущему времени 9:36:06 12.01.2003.
Сопутствующие функции: DATEVEC, DATENUM, NOW, ETIME, TIC, TOC, CPUTIME.
Преобразование форматов
DATESTR| Строковый формат даты
Синтаксис:
s = datestr(DT,<формат_даты>)
s = datestr(DT,<формат_даты>,<начальный_год>)
Описание:
Функция s = datestr(D, <формат_даты>) преобразовывает дату DT, заданную либо
в числовом, либо в векторном формате, в один из 32 строковых форматов. Аргумент
<формат_даты> может быть задан либо номером формата, либо строкой формата со¬
гласно приведенной ниже таблице. Предполагается, что при указании двух символов
года этот год находится в пределах 100-летнего периода, центром которого является
текущий год.
Функция s = datestr(D, <формат_даты>, <начальный_год>) использует аргумент
<начальный_год> в качестве начала 100-летнего периода, в котором возможно исполь¬
зовать двузначный формат года. По умолчанию <начальный_год> равен <теку-
щий год> - 50.
2. Язык MATLAB
81
Номер
формата
Формат строки
Форма представления
Описание
0*
'dd-mmm-yyyy
HH:MM:SS'
12-Jan-2003 10:24:10
День-месяц-год час:минута:секунда
1*
'dd-mmm-yyyy'
12-Jan-2003
День-месяц-год
2*
’mm/dd/yy’
01/12/03
Месяц/день/год
3
'mmm'
Jan
Месяц (3 буквы)
4
'm'
J
Месяц (1 буква)
5
'mm'
01
Месяц
6
'mm/dd'
01/12
Месяц/день
7
’dd’
12
День месяца
8
'ddd'
Sun
День недели (3 буквы)
9
'd'
S
День недели (1 буква)
10
'УУУУ'
2003
Год (4 цифры)
11
’yy’
03
Год (2 цифры)
12
'mmmyy'
Jan03
Месяц (3 буквы) год (2 цифры)
13*
'HH:MM:SS'
10:24:10
Час: минута: секунда
14*
'HH:MM:SS PM’
10:24:10 AM
Час:минута:секунда (AM или РМ)
15*
'HH.MM'
10:24
Час: минута
16*
’HH:MM PM'
10:24 AM
Час:минута (AM или РМ)
17
QQ-YY'
Ql-03
Квартал-год
18
■QQ’
Ql
Квартал
19
'dd/mm'
12/01
День/месяц
20
'dd/mm/yy'
12/01/03
День/месяц/год (2 цифры)
21
'mmm.dd.yyyy
HH:MM:SS'
Jan. 12,2003 10:24:10
Месяц.день,год час:минута:секунда
22
'mmm.dd.yyyy'
Jan. 12,2003
Месяц.день,год
23*
'mm/dd/yyyy'
01/12/2003
Месяц/день/год (4 цифры)
24
'dd/mm/yyyy'
12/01/2003
День/месяц/год (4 цифры)
25
'yy/mm/dd'
03/01/12
Год (2 цифры)/месяц/день
26
'yyyy/mm/dd'
2003/01/12
Год (4 цифры)/месяц/день
27
'QQ-YYYY'
Ql-2003
Квартал-год (4 цифры)
28
'mmmyyyy'
Jan2003
Месяц (3 буквы) год (4 цифры)
29
'yyyy-mm-dd'
2003-01-12
Год (4 цифры)-месяц-день
30
'yyyymmddTHH
MMSS'
20030112T102410
Год (4 цифры) месяц день Т час
минута секунда
31
'yyyy-mm-dd
HH:MM:SS'
2003-01-12 10:24:10
Год (4 цифры)-месяц-день час ми¬
нута секунда
Замечание. Только строковые форматы 0, 1, 2, 6, 13, 14, 15, 16 и 23, отмеченные
звездочкой (*), могут быть использованы в качестве входных аргумен¬
тов для функций datenum и datevec.
82
В. Г. Потемкин. Вычисления в среде MATLAB
В предшествующих версиях системы MATLAB использовались только первые
19 форматов с номерами от 0 до 18. Новые форматы от 19 до 31 позволяют записывать
даты в нотации стран Европы. Правда, из новых форматов только строковый формат
23 может быть преобразован в числовой или векторный.
Форматы представления времени 'h:m:s' (формат 13), 'h:m:s pm' (формат 14), *h:m'
(формат 15) и 'him pm' (формат 16) могут быть использованы в качестве входного ар¬
гумента.
Если аргумент <формат_даты> не указан или задан как-1, то по умолчанию ис¬
пользуются следующие строковые форматы:
• 0 - если DT задано в векторном формате либо в строковом формате с указанием
времени;
• 1 - если DT содержит информацию только о дате;
• 16 - если DT содержит информацию только о времени.
Примеры:
t = now
tl = datestr(t)
tl = 12-Jan-2003
Здесь по умолчанию использован строковый формат 1.
tl6 = datestr(rem (t, 1))
tl6 = 10:24 AM
Здесь по умолчанию использован строковый формат 16.
t24 = datestr(t, 24)
t24 = 12/01/2003
Здесь для представления даты использован новый строковый формат 24, который
соответствует европейскому стандарту.
Сопутствующие функции: DATE, DATENUM, DATETICK, DATEVEC.
DATENUM~] Числ >вой формат даты
Синтаксис:
N = datenum(s)
N = datenum(s,<начальный_год>)
N = datenum (Y, М, D)
N = datenum(Y, М, D, H, MI,S)
Описание:
Функция N = datenum(s) преобразовывает строковое представление даты в число¬
вое, причем значение даты 1 соответствует 1 января 0000 года. Строка s должна быть
представлена в одном из форматов 0, 1, 2, 6, 13, 14, 15, 16 или 23 функции datestr.
Предполагается, что при указании двух символов года он находится в пределах 100-
летнего периода, центром которого является текущий год.
Функция N = datenum(s, <начальный_год>) использует аргумент <начальный_год>
в качестве начала 100-летнего периода, в котором возможно использовать двузначный
формат года. По умолчанию <начальный год> равен <текущий год> - 50.
2. Язык MATLAB
83
Функция N = datenum(Y, М, D) возвращает числовое значение указанной даты, за¬
данной либо числовыми значениями, либо переменными Y, М, D, причем аргументы
должны быть скалярами либо строками одинаковой длины.
Функция N = datenum(Y, М, D, Н, MI, S) возвращает числовое значение времени,
заданного либо числовыми значениями, либо переменными Y, М, D, Н, MI, S, причем
аргументы должны быть скалярами либо строками одинаковой длины.
Примеры:
t = datestr(now)
t = 13-Jan-2003 19:00:00-
Преобразовать текущее время и дату в.строковом формате в десятичное число.
Nt = datenum(t)
Nt = 731594.79
Преобразовать текущую дату в строковом формате в десятичное число.
Nd = datenum('13-Jan-03 1)
Nd = 731594.00
Получить числовой формат этой же даты 100 лет назад.
Nd = datenum( '13-Jan-0341900)
Nd = 695069.00
Преобразовать текущую дату в векторном формате в десятичное число.
Nd = datenum(2003,1,13)
Nd = 731594.00
Преобразовать текущую дату и время в векторном формате в десятичное число.
Nt = datenum( [2003 1 13 19 0 0])
Nt = 731594.79
Сопутствующие функции-. DATESTR, DATEVEC, NOW.
DATEVEC| Векторный формат даты
Синтаксис:
v = datevec(DT)
v = datevec(DT,<начальный_год>)
[Y,M,D,H,MI,S] = datevec(DT)
Описание:
Функция v = datevec(DT) преобразовывает строковое или числовое представление
даты в векторный формат с компонентами [<год>, <месяц>, <день>, <час>, <мин.>,
<сек.>].
Функция с = datevec(DT, <начальный_год>) использует аргумент <начальный_год>
в качестве начала 100-летнего периода, в котором возможно использовать двузначный
формат года. По умолчанию <начальный_год> равен <текущий_год> - 50.
Если переменная DT является строкой, то она должна быть представлена в одном
из форматов 0, 1, 2, 6, 13, 14, 15, 16 или 23 функции datestr. Предполагается, что при
84
В. Г. Потемкин. Вычисления в среде MATLAB
указании двух символов года он находится в пределах 100-летнего периода, центром
которого является текущий год.
Функция [Y, М, D, Н, MI, S] = datevec(DT) возвращает результат в виде шести пе¬
ременных, закрепленных за отдельными компонентами.
Пример:
t = datestr(now)
t = 14-Jan-2003 11:04:35
datevec(datestr(t))
ans = 2003 1
14
11
4
35
datevec(datestr(t,1))
ans =2003 1
14
0
0
0
datevec(datestr(t,16))
ans =0 0
0
11
4
0
Сопутствующие функции'. CLOCK, DATENUM, DATESTR, NOW.
День и дата
CALENDAR~~| Календарь
Синтаксис:
с = calendar
с = calendar(d)
с = calendar(у,m)
calendar (...)
Описание:
Функция с = calendar возвращает массив размера 6x7, который содержит календарь
текущего месяца, начинающийся с воскресенья (первый столбец) и заканчивающийся
субботой.
Функция с = calendar(d), где дата может быть задана в строковом или числовом
формате либо в виде переменной d, возвращает календарь соответствующего месяца.
Функция с = calendar(y, m) возвращает календарь месяца для указанной даты, за¬
данной либо числовыми значениями, либо переменными у, ш.
Команда calendar(...) выводит календарь на экран терминала.
Пример:
calendar(2003,3)
Mar 2003
S
M
Tu
W
Th
F
S
0
0
0
0
0
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
0
0
0
0
0
Сопутствующие функции'. DATENUM.
2. Язык MATLAB
85
WEEKDAY
День недели
Синтаксис:
[N,S] = weekday(D)
Описание:
Функция [N,S] = weekday(D) возвращает номер дня N в числовом, а название дня
в строковом формате согласно следующей таблице.
Номер дня
Название дня
1
Sun
Воскресенье
2
Mon
Понедельник
3
Tue
Вторник
4
Wed
Среда
5
Thu
Четверг
6
Fri
Пятница
7
Sat
Суббота
Пример:
Определим текущий день недели.
[d,w] = weekday (now)
d = 2
w = Mon
Согласно американскому календарю понедельник - второй день недели.
Сопутствующие функции'. DATENUM, DATEVEC, EOMDAY.
EOMDAY I Последний день месяца
Синтаксис:
Е = eomday (у, т)
Описание:
Функция Е = eomday(y, т) возвращает значения последнего дня месяца, причем
входные аргументы могут быть заданы либо в виде чисел или числовых массивов, ли¬
бо в виде переменных у, т.
Пример:
Определить все високосные годы в период с 2080-го по 2105 г.
у = 2080:2105;
Е = eomday(yz 2*ones(length(у), I)1);
у(find(E==29))’
86
В. Г. Потемкин. Вычисления в среде MATLAB
ans
2080
2084
2088
2092
2096
2104
Обратите внимание, что 2100 г. не является високосным.
Сопутствующие функции’. DATENUM, DATEVEC, WEEKDAY.
DATETICK ] Выбор формата даты для разметки координатных осей
Синтаксис:
datetick(<имя_оси>)
datetick(<имя_оси>,<формат_даты>)
Описание:
Команда ба1ебск(<имя_оси>, <формат_даты>) размечает указанную координатную
ось в соответствии с выбранным форматом даты. Аргумент <формат_даты> может
быть задан либо номером формата, либо строкой формата согласно приведенной ниже
таблице. Аргумент <имя_оси> может принимать одно из строковых значений: 'х', ’у’
или ’z'; по умолчанию 'х'.
При построении графиков даты должны быть преобразованы в числовой формат
с помощью функции datenum. Если при этом включен режим сохранения текущего
графика hold on, то будет выполнено преобразование меток, но они не будут выведены
на график.
Для нанесения меток на координатные оси могут быть использованы следующие
29 строковых форматов:
Номер
формата
Формат (строка)
Описание
0
'dd-mmm-yyyy НН: ММ :S S'
День-месяц (3 буквы)-год час: минута: сасх ида
1
'dd-mmm-yyyy'
День-месяц (3 буквы)-год
2
'mm/dd/yy'
Месяц/день/год
"з
'mmm'
Месяц (3 буквы)
Г’ ’
'm'
Месяц (1 буква)
5
'mm'
Месяц
6
'mm/dd'
Месяц/день
7
’dd*
День месяца
~8 ’
'ddd'
День недели (3 буквы)
9
'd'
День недели (1 буква)
10
yyyy'
Год (4 цифры)
1'1
’yy’
Год (2 цифры)
12
'rummy у'
Месяц (3 буквы) год (2 цифры)
2. Язык MATLAB
87
Номер
формата
Формат (строка)
Описание
13
Час: минута: секунда
14
'HH:MM:SS PM’
Час:минута:секунда (AM или РМ)
15
'НН:ММ'
Час: минута
16
’НН:ММ РМ'
Час:минута (AM или РМ)
17
'QQ-YY'
Квартал-год
18
'QQ'
Квартал
19
'dd/mm'
День/месяц
20
’dd/mm/yy’
День/месяц/год (2 цифры)
21
'mmm.dd.yyyy HH:MM:SS'
Месяц.день,год час:минута:секунда
22
'mmm.dd.yyyy'
Месяц.день,год
23
'mm/dd/yyyy'
Месяц/день/год (4 цифры)
24
'dd/mm/yyyy'
День/месяц/
25
'yy/mm/dd'
Год (2 цифры)/месяц/день
26
'yyyy/mm/dd'
Год (4 цифры)/месяц/день
27
QQ-YYYY'
Квартал-год (4 цифры)
28
'mmmyyyy'
Месяц (3 буквы) год (4 цифры)
Пример:
Рассмотрим данные о реализации книг по системе MATLAB, выпущенных изда¬
тельством ’’Диалог-МИФИ" с июля 2001 г. по сентябрь 2002 г.
books = [
1514
3000
0
1297
2187
0
1270
2000
0
1260
1950
0
1248
1859
4000
1231
1783
3646
1190
1720
3400
1150
1640
3100
1120
1590
2950
1110
1576
2800
1115
1600
2700
1125
1630
2600
ИЗО
1660
2500
1140
1701
2332
1125
1680
2100
1115
1641
1927
Представим эти данные в виде столбиковых диаграмм реализации книг под услов¬
ными номерами 1, 2 и 3 с разметкой оси дат по формату 12 с указанием месяца и года.
m = size(books,1)-1;
уО = datenum(2001,07,15);
Y = y0:30:y0+30*m; Y = Y-30;
bar3(Y,books)
datetick('y',12) % рис. 2.8
88
В. Г. Потемкин. Вычисления в среде MATLAB
4000 -
рис. 2.8
Сопутствующие функции'. DATENUM, DATESTR.
Интервалы времени
CPUTIME |
Подсчет процессорного времени
Синтаксис:
t = cputime
Описание:
Функция t = cputime возвращает время работы процессора (в секундах), использо¬
ванное системой MATLAB с момента ее запуска. Возвращаемая величина может пре¬
высить внутреннее представление. В этом случае отсчет времени начинается заново.
Пример:
Для учета процессорного времени, необходимого для решения пользовательской
задачи, надо выполнить следующие операции:
to = cputime; surf(peaks(40)); e = cputime-tO
e = 0.12
Сопутствующие функции: CLOCK, ETIME, TIC, TOC.
TIC, TOC~~| Запуск и остановка таймера
Синтаксис:
tic
последовательность операторов
toe
t = toe
2. Язык MATLAB
89
Описание:
Команды tic и toe используются в паре для запуска и остановки таймера с выводом
ci о показания в секундах в формате elapsed_time = <время выполнениях
Функция t = toe показывает время, прошедшее с запуска таймера командой tic.
Пример:
tic, surf(peaks(40)); toe
elapsed—time = 0.12
Сопутствующие функции'. CLOCK, ETIME, CPUTIME.
ETIME | Определение временного интервала
Синтаксис:
е = etime(tl,tO)
Описание:
Функция е = etime(tl, tO) возвращает длительность в секундах промежутка времени,
задаваемого векторами tl и tO. Каждый из этих векторов должен состоять из шести
элементов в формате, соответствующем результатам выполнения функции clock:
т = [ год месяц день час минута секунда] .
Пример:
tO = clock; surf(peaks(40)); etime (clock, tO)
ans = 0.111
Ограничения:
Приведенный фрагмент программы будет работать некорректно, если в текущий
промежуток времени попадут границы месяца или года.
Сопутствующие функции'. CLOCK, CPUTIME, TIC, TOC.
90
В. Г. Потемкин. Вычисления в среде MATLAB
3. ПРОГРАММИРОВАНИЕ И ОТЛАДКА
Система MATLAB обычно функционирует в режиме интерпретации команд и опе¬
раторов: во время работы они вводятся в командной строке, а система выполняет их
немедленную обработку и выдает вычисленный результат. Однако в этом режиме
нельзя без повторного набора всех операторов повторить предыдущие вычисления
и действия при новых значениях исходных данных; нельзя вернуться и повторить от¬
дельные фрагменты действий либо по некоторому условию перейти к выполнению
другой последовательности операторов. Для преодоления некоторых из этих трудно¬
стей в системе MATLAB 6 предусмотрено накопление вводимых в командном окне
операторов в журнале предыстории, который можно не только просмотреть в окне
Command History, но и извлечь из него требуемые последовательности операторов
и повторно выполнить их. Тем не менее все это не освобождает пользователя от необ¬
ходимости оформления часто применяемых последовательностей операторов в виде
программ. Такой подход характерен для процедурных языков программирования вы¬
сокого уровня, таких? как Фортран, Си, Паскаль, и то, о чем будет речь в этой главе,
служит сближению языка MATLAB с процедурными языками.
3.1. Сценарии и функции
Файлы, содержащие команды и операторы языка MATLAB, называются М-
файлами. Различают 2 типа М-файлов: сценарии и функции.
М-сценарии
Сценарии являются самым простым типом М-файла - у них нет входных и выход¬
ных аргументов. Они позволяют автоматизировать выполнение последовательности
операторов, которые в ином случае должны были бы многократно вводиться из ко¬
мандной строки. В сценарии можно применять любые команды и функции языка
MATLAB. Здесь, в отличие от процедурных языков программирования, не требуется
объявлять имена и типы переменных, использовать метки begin/end начала и конца
программы, выполнять предварительную компиляцию написанного сценария. Сцена¬
рии могут выполняться как непосредственно из файла, так и путем копирования всего
сценария или его фрагментов в командное окно.
Сценарии оперируют данными из рабочей области и могут создавать новые данные
для последующей обработки в этом файле. Хотя М-сценарии не возвращают выход¬
ных аргументов, но все переменные сохраняются в рабочей области, так что после вы¬
полнения сценария они могут быть использованы для продолжения вычислений в ко¬
мандном окне.
Это преимущество иногда может обернуться и недостатком. При последовательном
выполнении нескольких сценариев без очистки рабочей области необходимо следить
за согласованием имен переменных.
ООГШИ0И
91
Следует также обратить внимание, что имена М-функций сценариев нельзя исполь¬
зовать в качестве операндов арифметических выражении и в качестве аргументов
функций.
Структура сценария. Структура М-файла сценария показана на рис. 3.1. Сценарий
открывается заголовком Script. Затем следует строка комментария, которая поясняет
назначение сценария. Комментарий может присутствовать в сценарии в виде отдель¬
ной строки либо следовать за вызовом любого оператора при условии, что ему пред¬
шествует символ %. Дальнейшее содержимое сценария состоит из набора любых опе¬
раторов языка MATLAB, в данном случае связанных с вычислением функций
и построением графиков.
Строка комментария
Вычисления
Script
% M-file petals - сценарий построения графиков в полярных коор¬
динатах
theta = -pi:0.01:pi;
rho(1,:)
rho(2,:)
rho(3,:)
rho(4,:)
for i =
subplot (eval ([’22 ' num2str (i) Bi¬
polar (theta, rho (i,:) ) % Построение графика
end % Конец цикла
= 2*sin(5*theta).~2;
= cos(10*theta).л3;
= sin(theta).л2;
= 5*cos(3.5*theta)/3;
1:4
Команды
графического вывода
рис. 3.1
Пример:
Сценарий, представленный на рис. 3.1, вычисляет радиус-вектор rho для различных
тригонометрических функций в зависимости от угла theta и строит последовательность
графиков в полярных координатах.
Создайте М-файл petals.m, вводя указанные выше операторы. Этот файл является
М-сценарием. Ввод команды petals в командной строке системы MATLAB вызывает
выполнение этого сценария.
В результате будут построены 4 графика, показанные на рис. 3.2.
92
В. Г. Потемкин. Вычисления в среде MATLAB
В сценарии отсутствуют входные и выходные аргументы; программа petals сама
создает переменные, которые сохраняются в рабочей области системы MATLAB. Ко¬
гда выполнение завершено, переменные (i, theta и rho) остаются в рабочей области.
Для того чтобы увидеть их, откройте окно рабочей области Workspace или примените
команду whos:
whos \
Name
Size
Bytes
Class
i
lxl
8
double array
rho
4x629
20128
double array
theta
1x629
5032
double array
•and total
is 3146
elements using
25168 bytes
М-функции
М-функции расширяют функциональные возможности языка MATLAB и позволя¬
ют создавать новые библиотеки М-функций и пакеты прикладных программ.
М-функции, в отличие от М-сценариев, используют входные и выходные аргумен¬
ты и создают локальные переменные в рабочей области М-функции, отличной от ра¬
бочей области системы MATLAB.
М-функция не имеет никаких отличительных признаков, и при обращении к ней
MATLAB просто ищет файл с соответствующим именем, просматривая все пути дос¬
тупа, определенные переменной matlabpath. Когда файл найден, он компилируется в р-
коды, размещается в оперативной памяти и только после этого начинает выполняться.
В этом также отличие М-функции от М-сценария, который выполняется только
в режиме интерпретации. Однако если при выполнении М-функции включен режш;
echo, то она также будет выполняться в режиме интерпретации с выводом на терминал
результатов выполнения каждого оператора. Для удаления откомпилированной функ¬
ции из памяти надо применить команду clear <имя функции>.
Структура М-функции. Структура М-файла функции показана рис. 3.3 и характери¬
зуется следующими компонентами:
• Строка определения, или заголовок функции, задает имя функции, а также по¬
следовательность входных и выходных аргументов (переменных);
• Первая строка комментария определяет назначение функции. Она используется
командами lookfor или йе1р<имя каталога> для вывода информации о функции
на экран;
• Комментарий содержит развернутую информацию о входных и выходных пере¬
менных и выводится на экран вместе с первой строкой комментария с помощью
команды Ье1р<имя_функции>;
• Тело функции - это программный код на языке MATLAB, который реализует вы¬
числения и присваивает значения выходным переменным.
3. Программирование и отладка
93
Строка определения функции
Первая строка комментария
Комментарий
Тело функции
function f = factorial (n)
% FACTORIAL Вычисление факториала.
% factorial (n) возвращает n!
f = prod(l:n);
рис. 3.3
М-файлы могут содержать коды более чем одной функции. Первая функция в фай¬
ле - это основная функция, вызываемая по имени М-файла. Другие функции внутри
файла - это подфункции, которые доступны только для основной функции и других
подфункций этого же файла (рис. 3.4).
Каждая подфункция имеет свой собственный заголовок. Подфункции следуют друг
за другом непрерывно. Подфункции могут вызываться в любом порядке, в то время
как основная функция выполняется первой.
Основная функция
function [avg,med] = newstats(u)
% NEWSTATS Находит среднее значение и медиану
% для элементов вектора и с применением
% подфункций.
n = length(и);
avg = mean(u,n);
med = median(и,n);
%
function m = mean(v,n)
% Вычислить среднее.
m = sum(v)/n;
%
function m = median(v,n)
% Вычислить медиану.
w = sort(v);
if rem(n,2) == 1
m = w ( (n + 1) /2) ;
else
m = (w (n/2) +*w (n/2 + 1)) /2;
end
рис. 3.4
Подфункция 1
Подфункция 2
Проанализируем структуру М-функции (рис. 3.4) более подробно. Подфункции
mean и median вычисляют среднее значение и медиану входного вектора. Основная
функция ncwstats определяет длину вектора и вызывает подфункции, передавая им эту
длину. Функции внутри М-файла не могут обращаться к одним и тем же переменным,
если только они не объявлены глобальными или не переданы в качестве параметров.
Следует иметь в виду, что команда help сообщает справочную информацию только
об основной функции, но не о подфункциях.
Когда приходит вызов функции из М-файла, то MATLAB в первую очередь прове¬
ряет, не является ли эта функция подфункцией. Раз так, то можно в качестве имени
подфункции использовать даже имена функций системы MATLAB.
М-функции используются так же, как обычные встроенные функции системы
MATLAB. Их можно, в отличие от М-сценариев, применять в арифметических выра¬
жениях.
94
В. Г. Потемкин. Вычисления в среде MATLAB
Пример:
Рассмотрим достаточно простой М-файл, который вычисляет среднее значение
элементов вектора.
function у = average (х)
% AVERAGE Среднее значение элементов вектора.
% Функция AVERAGE(х) вычисляет среднее значение элементов вектора.
% Если входной аргумент не является вектором, генерируется ошибка.
[m,n] = size(и);
if (-((m==l)|(n==l)) | (m==l & n==l))
error(’Входной массив должен быть вектором')
end
у =sum(х)/length(х); % Вычисления
Строка определения функции в данном случае имеет вид:
function у = average(х)
Здесь
1. function - ключевое слово, определяющее М-функцию;
2. у - выходной аргумент;
3. average - имя функции;
4. х - входной аргумент.
Строка определения функции сообщает системе MATLAB, что файл является М-
функцией с именем average. Эта функция допускает единственный входной и единст¬
венный выходной аргументы.
Если функция имеет более одного выходного аргумента, список выходных аргу¬
ментов помещается в квадратные скобки. Входные аргументы, если их более одного,
помещаются в круглые скобки. Для отделения аргументов во входном и выходном
списках применяются запятые.
Первая строка комментария выглядит так:
% AVERAGE Среднее значение элементов вектора.
Эта строка выводится на экран по команде поиска lookfor, и если М-файл размещен
в рабочем каталоге, то она появится в списке первой, а также будет присутствовать
в окне Current Directory. Поскольку эта строка содержит важную информацию об М-
файле, она должна быть компактной и тщательно отредактированной.
Комментарий включает 3 строки и обязательно завершается пустой строкой:
% AVERAGE Среднее значение элементов вектора.
% Функция AVERAGE(х) вычисляет среднее значение элементов вектора.
% Если входной аргумент не является вектором, генерируется ошибка.
<пустая строк а>
3. Программирование и отладка
95
[m, n] = size (х) ;
if (~((т == 1)|(n == 1)) | (т == 1 & n == 1)Г
Error(’Вход должен быть непустым вектором’)
end
у = sum(x)/length(х);
Используя команду help <имя_функции>, его можно прочитать на экране термина¬
ла. В программе могут быть и другие комментарии, но если они размещены ниже пус¬
той строки, то по команде help они выводиться не будут.
Тело функции average включает ряд простейших операторов программирования:
Оператор вызова функции
size
Заголовок оператора if
Сообщение об ошибке
Конец оператора if
Вычисление и присваивание
Операторы в теле функции могут состоять из вызовов функций, программных кон¬
струкций для управления потоком команд, интерактивного ввода-вывода, вычислений,
операторов присваивания, комментариев и пустых строк.
Обратиться к функции average можно следующим образом:
у = average(1:99)
у = 50
Имена М-функций. В системе MATLAB на имена М-функций налагаются те же ог¬
раничения, что и на имена переменных: их длина не должна превышать 63 символов.
Более точно, имя может быть и длиннее, но система MATLAB 6 принимает во внима¬
ние только первые 63 символа. Имена М-функций должны начинаться с буквы; ос¬
тальные символы могут быть любой комбинацией букв, цифр и символов подчеркива¬
ния. Имя файла, содержащего М-функцию, составляется из имени функции и расши¬
рения .ш. В рассмотренном выше примере это имя average.m
Если имя файла не совпадает с именем в строке определения функции, то система
использует имя файла, а внутреннее имя игнорирует. Хотя имя, определенное в строке
определения функции, может и не совпадать с именем файла, настоятельно рекомен¬
дуется использовать одинаковые имена.
Практические рекомендации по оформлению М-файлов
Поскольку система MATLAB является открытой системой, то пользователь имеет
доступ к исходным текстам М-файлов разработчиков системы, пакетов прикладных
программ и многочисленных пользователей. Добавим к этому публикации на русском
языке [12, 14], которые позволяют сформулировать обобщенные рекомендации
по оформлению М-файлов. Наличие такого шаблона избавляет составителя програм¬
мы от необходимости думать об ее формальном оформлении и сосредоточивает вни¬
мание на реализации собственно алгоритма.
Отметим следующие особенности оформления программ на языке MATLAB:
• Рекомендуется каждый оператор программы записывать в отдельной строке. Это
особенно касается М-сценариев, исполняемых в режиме интерпретации.
• При создании процедуры-функции можно размещать в одной строке несколько
операторов, отделяемых разделителями запятая (,) или точка с запятой (;).
96
В. Г. Потемкин. Вычисления в рреде MATLAB
• При необходимости можно использовать многострочные операторы, строки кото¬
рых завершаются символом продолжения строки (...).
• При написании М-функций для предотвращения вывода на экран промежуточных
результатов все операторы должны завершаться символом точка с запятой (;).
• Последовательность символов, начинающаяся с символа %, не выполняется
и воспринимается системой как комментарий. Таким образом, для ввода коммента¬
рия в любое место программы достаточно вести символ %.
• Строки, предшествующие первому исполняемому оператору программы, воспри¬
нимаются системой как комментарий к программе.
• В программах на языке MATLAB отсутствуют метки начала и окончания программы.
• В языке MATLAB переменные не описываются и не объявляются. Любая новая пе¬
ременная воспринимается системой как имя массива определенного класса. Размер
этого массива определяется при его заполнении. В языке MATLAB не может быть
переменных, которым не присвоено какого-либо значения, но это может быть
и пустой массив, одна из размерностей которого имеет нулевой размер.
• Имена переменных могут включать только буквы латинского алфавита, цифры
и знаки подчеркивания и всегда начинаться с буквы. Длина имени не ограничена,
но система MATLAB 6 различает только первые 63 символа. Могут применяться
как прописные, так и строчные буквы, причем они считаются различными. Таким
образом, символы а и А могут использоваться в одной программе для обозначения
разных переменных, например прописными буквами можно обозначать массивы
и матрицы, а строчными - векторы и скаляры.
Шаблон оформления М-функции
Обобщая свой собственный опыт и опыт многочисленных пользователей, можно
предложить следующий шаблон для оформления процедуры-функции.
function [<Выход>] = <имя_функции>(<Вход>)
% <ИМЯ_ФУНКЦИИ> и ее назначение
% Входные переменные
% <Список входных переменных с подробным описанием назначения,
% типа и размера каждой из переменных списка <Вход»
% Выходные переменные
% <Список выходных переменных с подробным описанием назначения,
% типа и размера каждой из переменных списка <Выход>>
% Глобальные и сохраняемые переменные
% <Список переменных типа global и persistent с описанием их
% назначения
% Используемые функции
% Списки используемых функций системы MATLAB и пакетов прикладных
% программ
<Пустая строка>
% Реквизиты программы
1 % <Автор программы, дата создания или модификации, институт,
а % организация или предприятие, где создана программа
J <Кодпрограммы> I
3. Программирование и отладка 97
4 т. Зак. 3375
Шаблон оформления М-файла сценария
Этот шаблон может быть несколько проще в оформлении, поскольку не включает
входных и выходных переменных, глобальных или сохраняемых функций.
Script %<имя_файла>
% Текст комментария с описанием назначения программы
<Пустая строка>
% Автор <Фамилия И.О., дата создания или модификации, организация>
<Код программ ы>
3.2. Выполнение М-функций
М-функцию можно вызвать из командной строки системы MATLAB или из других
М-файлов, обязательно указав все необходимые атрибуты - входные аргументы
в круглых скобках, выходные аргументы в квадратных скобках.
Проверка имени. Когда появляется новое имя, система MATLAB проверяет:
1. Не является ли новое имя именем переменной.
2. Не является ли новое имя именем встроенной функции системы.
3. Не является ли оно именем подфункции, т. е. функции, которая размещена в этом
же М-файле и является вызываемой.
4. Не является ли оно именем частной функции из каталога private, который доступен
только М-файлам, размещенным на один уровень выше.
5. Составляет список всех методов и функций, которые совпадают с указанным име¬
нем.
На шаге выполнения в случае дублирования имен, перечисленных в п. п. 2-4, ис¬
пользуется первое из этих имен.
Вызов функции. При вызове М-функции система MATLAB преобразует функцию
в псевдокод и загружает в оперативную память. Псевдокод остается в памяти до тех
пор, пока не будет применена команда clear или завершен сеанс работы. Можно со¬
хранить псевдокод М-функции или М-сценария для последующих сеансов, используя
команду pcode в форме
pcode <имя_файла >
Эта команда выполняет синтаксический анализ М-файла, создает псевдокод и со¬
храняет его в файле с тем же именем, но с расширением р. Это позволяет избежать по¬
вторного синтаксического анализа при каждом вызове М-функции, а также скрыть ис¬
ходные тексты программы.
Правила передачи аргументов. С точки зрения программиста, система MATLAB пе¬
редает аргумент его значением. На самом деле значением передаются только те аргу¬
менты, которые изменяются при работе этой функции. Если функция не изменяет зна¬
чения аргумента, а только использует его для вычислений, то аргумент передается
ссылкой, что позволяет оптимизировать использование оперативной памяти.
98
В. Г. Потемкин. Вычисления в среде MATLAB
Проверка количества аргументов. Функции nargin и nargout позволяют определить
количество входных и выходных аргументов вызываемой функции. Эту информацию
в дальнейшем можно использовать в операторах условия для изменения хода вычис¬
лений.
Пример:
function с = testargl(а,Ь)
if/(nargin == 1)
с = а.Л2;
elseif (nargin == 2)
с = а + b;
end
При задании единственного входного аргумента функция вычисляет квадрат вход¬
ной переменной; при задании двух аргументов выполняется операция сложения.
Списки аргументов. Функции varargin и varargout позволяют передавать произволь¬
ное количество входных и выходных переменных. Система MATLAB упаковывает со¬
ответствующие входные и выходные переменные в массив ячеек. Каждая ячейка мо¬
жет содержать любое количество данных любого типа.
Пример:
Функция testvarin выводит на экран линии, которые соединяют последовательность
точек с координатами х и у. Точки задаются векторами из двух элементов. Функция
testvarin допускает в качестве входного аргумента любое количество таких векторов.
function testvarin(varargin)
% TESTVARIN Тест функции varargin.
% Функция- TESTVARIN(varargin)строит линии,
% которые соединяют последовательность точек,
% заданных векторами с координатами х и у
% Функция допускает в качестве входного аргумента
% любое количество векторов из двух элементов.
for i = 1:length(varargin)
x(i) = varargin(i)(1) ;
y(i) = vararginfi}(2) ;
end
xmin = min CO, min(x));
ymin = min(0, min(y));
axis ([xmin f ix (max (x) )+3 ymin f ix (max (y) )+3 ] )
plot (x,y)
Список varargin хранит входные переменные в массиве ячеек. Так, например, коор¬
динаты х и у точки с индексом i - это соответственно первый и второй элементы i-й
ячейки массива varargin.
3. Программирование и отладка
99
Функция testvarin может работать с входными списками разной длины, а приведен¬
ные ниже операторы позволяют построить на одном графике 2 разные последователь¬
ности (рис. 3.5):
testvarin([2 3],[1 5], [3 4],[6 5],[4 2], [2 3]),hold on
testvarin([-1 0], [3 -5], [4 2], [1 1])
Координаты вершин векторов этих последовательностей отмечены номерами.
Формирование выходного массива varargout. Если при обращении к некоторой
функции количество выходных переменных может оказываться разным, то в этом слу¬
чае следует использовать специальную переменную varargout, которая позволяет все
выходные переменные упаковать в общий массив ячеек.
Пример:
Следующая функция использует в качестве входа массив из двух строк и произ¬
вольного количества столбцов, соответствующих координатам х и у. На выходе функ¬
ции формируется последовательность векторов координат этих точек в виде массива
ячеек. Это, кстати, означает, что если входной массив можно обрабатывать векторным
способом, то выходной массив ячеек можно обрабатывать только последовательно.
Именно это обстоятельство возникает при работе с ППП Neural Network Toolbox [16],
где применяются как последовательный, так и групповой способ обработки данных.
function [varargout] = testvarout(varargin)
% TESTVAROUT Тест функции varargout.
% Функция TESTVAROUT преобразует произвольное число векторов
% типа double в последовательность ячеек
for i = l:nargout
varargout(i) = varargin(:,i);
end
100
В. Г. Потемкин. Вычисления в среде MATLAB
Для вызова функции testvarout достаточно применить следующие операторы:
а = [1234 5;б 789 0];
[sl,s2,s3,s4,s5] = testvarout(a)
si =
1
6
s2 =
2
7
S3 =
3
8
s4 =
4
9 У
s5 =
5
0
Действительно, входной массив размера 2x5 типа double преобразован в 5 массивов
ячеек размера 2x1.
Аргументы varargin и varargout должны быть последними в соответствующих спи¬
сках аргументов. При вызове функции аргументы, предшествующие varargout, должны
быть вычислены внутри функции. Приведенные ниже заголовки функций показывают
правильное использование списков varargin и varargout.
function[outl,out2] = examplel(a,b,varargin)
function[i, j,varargout] = example2(xl,yl,x2,у 2,flag)
Рабочие области функции. Каждой М-функции выделяется область памяти, не сов¬
падающая с рабочей областью системы MATLAB. Такая область называется рабочей
областью функции. При работе с системой MATLAB можно получить доступ только
к переменным, размещенным в рабочей области системы или в рабочей области функции.
Локальные переменные. Переменные, размещенные в рабочей области М-функции,
называются локальными переменными. Они никак не связаны с переменными других
функций и переменными системы. При завершении работы М-функции они не сохра¬
няются в оперативной памяти.
М-сценарии, в свою очередь, не имеют своей рабочей области, и используемые
в них переменные накапливаются в рабочей области системы. Если не принимается
специальных мер цо очистке рабочей области системы, то все переменные оказывают¬
ся доступными любому script-файлу.
Глобальные переменные. Иногда может оказаться полезным, чтобы некоторая пере¬
менная могла быть использована со своим значением во многих М-функциях. Напри¬
мер, это может быть некоторая константа, проверяемая во многих частях программы.
Скажем, при поиске решения систем уравнений или задач оптимизации это может
быть некоторое условие для выделения из общего решения только решений опреде¬
ленного класса, например действительных и положительных. Такие переменные при¬
сваиваются в момент вызова головной программы (обычно сценария) и сохраняют
3. Программирование и отладка
101
присвоенные им значения в течение всего времени исполнения программы. Для того
чтобы отличить их от локальных переменных, они оформляются как глобальные пере¬
менные.
Для работы с глобальными переменными необходимо:
• Объявить переменную как глобальную в каждой М-функции, которая использует
эту переменную. Это рекомендуется делать в начале текста программы.
• Для того чтобы переменная рабочей области была глобальной, необходимо объ¬
явить ее как глобальную в головном файле-сценарии.
• Рекомендуется для глобальных переменных выбирать более длинные и содержа¬
тельные имена, использовать заглавные буквы. Это делает код программы удобо¬
читаемым и уменьшает вероятность случайного переопределения глобальной пе¬
ременной.
Пример:
Допустим, требуется исследовать влияние коэффициентов аир для модели хищ¬
ник-жертва, описываемой системой обыкновенных дифференциальных уравнений
(ОДУ) Лотки-Вольтерры:
У1 = у!-а у^2;
У 2 =-У2+₽У1У2-
Для этого создадим файл сценария, в котором определим глобальные переменные
ALPHA и ВЕТА, которые задаются один раз, а затем передаются решателю ОДУ:
Script %Lotka_Volterra
% Решение ОДУ Лотки-Вольтерры
global ALPHA BETA
ALPHA = 0.3;
BETA = 0.2;
[t,y] = ode23('lotka',[0 16],[1 1]);
plot(tzy)
Для задания правых частей ОДУ создадим М-файл lotka.m:
function dy = lotka(t,y)
% LOTKA Система уравнений Лотки-Вольтерры
global ALPHA BETA
dy(l) = y(l) - ALPHA*y(1)*y(2);
dy(2) = -y(2) + BETA *y(l)*y(2);
dy = dy. ' ;
Оператор global объявляет глобальными и, следовательно, доступными в функции
lotka.m переменные ALPHA и ВЕТА. Таким образом, их изменения выполняются
в сценарии Lotka_Volterra, а новые решения будут получены без редактирования М-
файла lotka.m. Решения уравнений Лотки-Вольтерры, выполненные с помощью на¬
писанного сценария, представлены на рис. 3.6.
102
В. Г. Потемкин. Вычисления в среде MATLAB
20
рис. 3.6
Ограничения при работе с глобальными переменными. Применение глобальных
переменных связано с определенным риском. Например, пользователь может непред¬
намеренно объявить новую глобальную переменную с тем же именем в другой М-
функции и тем самым переопределить значение ранее объявленной глобальной пере¬
менной. Выявить такую'Ошибку чрезвычайно сложно. Поэтому прибегать к использо¬
ванию глобальных переменных следует в исключительных случаях.
Другая проблема связана с изменением имени глобальной переменной в приложе¬
нии, которое использует большое количество своих и чужих М-функций. Прежде чем
изменить имя, вы должны убедиться, что новое имя не встречается ни в одном из ис¬
пользуемых модулей.
Поэтому в ^качестве альтернативы рассмотрим более явную схему передачи пере¬
менных в виде дополнительных параметров функции. Это реализуется либо размеще¬
нием дополнительных параметров в виде массива записей или массива ячеек и переда¬
чей их в виде одного аргумента, либо использованием механизма передачи заранее
неизвестного числа параметров с помощью списка varargin. В версии системы MAT¬
LAB 6 все решатели ОДУ перенастроены на эти два способа передачи переменных
в виде аргумента options и передачи параметров.
Рассмотрим этот подход на примере решения тех же ОДУ Лотки-Вольтерры. Наша
задача состоит в том, чтобы передать решателю требования к точности вычислений
и изменяемые параметры. Соответствующий сценарий mLotka_Volterra выглядит сле¬
дующим образом:
Script %mLotka_Volterra
% Решение ОДУ Лотки-Вольтерры
ALPHA = 0.3; ВЕТА = 0.2;
[t,y] = ode23 (@lotkal ДО • 16] , [1 1],[],ALPHA,BETA);
plot(t,у)
3. Программирование и отладка
103
Здесь изменяемые параметры передаются с помощью списка параметров {ALPHA,
ВЕТА}. Обратите внимание, что здесь применен новый способ обращения к решателю
ОДУ через дескриптор функции вычисления правых частей lotkal.m. При этом сам
файл lotkal изменяется, ему явно указываются аргументы параметров pl и р2, обозна¬
чения для которых определены синтаксисом решателя:
I function dy = lotkal(t,у,pl,р2)
I % LOTKA Система уравнений Лотки-Вольтерры
I dy (1) = y(l) - pl*y(l)*y(2);
|.dy(2) = —у (2 ) + p2*y (1) *y (2 ) ;
I dy = dy. ' ; > - -
Сохраняемые переменные. Для того чтобы сохранить значения для одной или не¬
скольких переменных между повторными вызовами М-функции предназначены так
называемые сохраняемые переменные. Эти переменные характеризуются следующими
свойствами:
• их можно применять только в теле М-функции;
• доступ к ним из других М-функций невозможен;
• эти переменные не удаляются из памяти при выходе из М-функции, т. е. их значе¬
ния сохраняются при повторном вызове М-функции.
Эти переменные локализуются в рабочей области М-функции и не могут приме¬
няться при работе со сценариями. Сохраняемые переменные удаляются, когда М-
функция удаляется из рабочей памяти системы MATLAB, когда в нее вносятся изме¬
нения или выполняется из командной строки одна из команд:
clear all
clear functions
Для того чтобы защитить сохраняемые переменные от случайного стирания, следует
запретить удаление М-файла из рабочей памяти системы с помощью команды mlock.
Вызов М-функций
При вызове М-функции в теле сценария или другой процедуры-функции система
MATLAB допускает 2 формата вызова - формат функции или формат команды. Эта
ситуация аналогична той, которая возникает при вызове функции из командной строки.
Вызов в формате функции аналогичен вызову функций в языках программирова¬
ния высокого уровня. Отличие состоит лишь в том, что система MATLAB допускает
более одного аргумента в списке выходов. Когда функция возвращает более одного
выхода, то выходные аргументы помещаются в квадратные скобки и разделяются либо
запятыми, либо пробелами:
[outl,out2, ...,outN] = function_name(ini,in2,...,inN)
Вызов в формате команды формируется следующим образом:
function_name ini in2 ... inN
Здесь за именем функции следует список аргументов, которые отделены друг
от друга пробелами. Такой формат применяется только к строковым аргументам
и не позволяет сформировать выходной аргумент.
104
В. Г. Потемкин. Вычисления в среде MATLAB
Передача аргументов М-функции. При вызове М-функции ей необходимо передать
данные для обработки, используя входные аргументы. Поскольку существует 2 фор¬
мата вызова, то необходимо ясно представлять, какие входные данные принимает
функция в том и другом случае. Принятое в системе MATLAB правило таково:
• если применяется функциональная форма вызова, то входной аргумент передается
значением;
• если вызов функции реализуется в формате команды, то аргумент передается своим
именем в виде строки символов.
Внимательно присмотритесь к следующим примерам. Несмотря на их простоту,
они исчерпывающе поясняют механизм передачи аргументов.
Примеры:
Проверить, является ли входной аргумент числом при вызове в формате функции
и в формате команды.
Формат функции
isnumeric(75)
ans = 1
Ответ: входной аргумент передается функции isnumeric значением.
Формат команды
isnumeric 75
ans = О
Ответ: входной аргумент передается функции isnumeric как строка символов.
Проверить, как передается входной аргумент А функции disp.
Формат функции
А = pi; disp(А)
3.1416
Ответ: входной аргумент передается функции disp значением.
Формат команды
А = pi; disp А
А
Ответ: входной аргумент передается функции disp как символ А.
Проверить, как передается входной аргумент А функции abs.
Формат функции
А = -75; abs(А)
ans = 75
Ответ: входной аргумент передается функции abs значением.
Формат команды
А = -75; abs А
ans = 65
Ответ: входной аргумент передается функции abs ASCII-кодом символа А.
3. Программирование и отладка
105
Проверить, как передаются строковые переменные функции strcmp.
Формат функции
strl = ’one1; str2 = ’one1;
strcmp(strl,str2)
ans = 1
Ответ: входные аргументы передаются своими значениями, которые равны один
другому.
Формат команды
strl = ’one1; str2 = ’one1;
strcmp strl str2
ans = 0
Ответ: входные аргументы передаются именами переменных strl и str2, которые
различны.
Передача аргумента строкой символов. Аргументы, которые являются строками
символов, можно передавать М-функции в формате команды. Это означает, что ко¬
манда
function_name а Ь с
равносильна функции
function_name('а','Ь', 'с').
В этом случае формат команды кажется более предпочтительным, поскольку
не использует круглые скобки и кавычки, однако он не позволяет сформировать вы¬
ходного аргумента М-функции.
Пример:
Следующие 2 формы обращения к функции abs равносильны.
Формат команды
abs АВС
ans = 65 66 67
Формат функции
abs (’АВС1)
ans = 65 66 67
Предостережение:
Будьте крайне осмотрительны при вызове функции в формате команды, поскольку
при таком вызове вся ответственность за передачу аргументов возлагается на пользо¬
вателя, а система никаких синтаксических проверок не выполняет. Общий совет со¬
стоит в том, что, работая с числовыми данными, используйте только формат функции,
а формат команды применяйте только к строковым переменным и с большой тщатель¬
ностью.
Передача аргументов массивами записей. Если М-функции требуется информация
о некотором объекте, который характеризуется набором свойств, то передать такие
данные удобнее всего в виде массива записей. Этот подход реализован в настоящее
время при работе с информацией, представленной в форматах научных данных CDF,
106
В. Г. Потемкин. Вычисления в среде MATLAB
FITS, HDF [22]. В этом случае при изменении количества и состава полей массива за¬
писей обращение к функции обработки остается неизменным.
Передача аргументов массивами ячеек. Массивы ячеек и массивы записей могут
быть преобразованы один в другой, но отличие массива ячеек состоит в том, что
он индексирован и доступ к любому из его элементов можно получить, организуя цикл
по этому индексу.
Программная генерация строковых аргументов. При организации обработки по¬
следовательности файлов может возникнуть необходимость автоматически вызвать
файл в соответствии с его номером. В этом случае в сценарии обработки можно пре¬
дусмотреть автоматическую генерацию имени файла с включением его порядкового
номера.
Пример:
Допустим, что имеются файлы с данными для каждого дня месяца, скажем для
марта, в котором 31 день. Имя файла имеет формат <месяц>сЫа1:, где d - дата (число
от 1 до 31). Тогда следующий код позволяет автоматически, формировать имя файла
для каждого дня месяца и загружать его в оперативную память для обработки:
for d = 1:31
s = ['March' int2str(d) '.dat’J;
load(s)
% Код программы обработки
end
Выполнение строковых инструкций. По аналогии с генерацией строковых аргумен¬
тов для М-функций можно автоматически сформировать инструкцию в виде строк
символов и выполнить ее с помощью оператора eval.
Пример:
Используя предыдущий пример, сформируем оператор загрузки данных в опера¬
тивную память.
for d = 1:31
s = ['load March' int2str(d) '.dat'];
eval(s)
% Код программы обработки
end
Этот подход можно реализовать только в режиме интерпретации, поскольку опера¬
тор eval реализует синтаксический анализ и исполнение строковой инструкции s.
Возможность интерпретации и исполнения строковых выражений придает языку
MATLAB дополнительную мощь и гибкость. Это позволяет конструировать символь¬
ные последовательности в процессе решения задачи в зависимости от хода ее решения
и таким образом придать сценарию решения элементы искусственного интеллекта.
Векторизация вычислений. В версию MATLAB 6.5 включен механизм ускорения
JIT-Accelerator (Just-In-Time Accelerator), который обеспечивает повышение эффек¬
тивности исполнения циклов и операций над скалярами в сотни раз по сравнению
с версией MATLAB 6.1, не имеющей такого ускорителя. В связи с этим проблема век¬
торизации вычислений становится актуальной только при реализации файлов-
сценариев, где применяется режим интерпретации.
Обратимся к простейшему примеру, который поясняет методику векторизации.
3. Программирование и отладка
107
Пример:
Для того чтобы вычислить, например, квадраты пяти чисел в обычных языках про¬
граммирования формируется цикл, в теле которого имеется оператор, вычисляющий
квадрат каждого числа, а цикл отвечает за перебор всех заданных чисел. Язык системы
MATLAB не запрещает использовать такую методику, а соответствующая последова¬
тельность операторов будет иметь вид:
х = [1 2 3 4 5];
у = zeros(size(х));
for i = 1:5
y(i) = x(i)-2;
end
В векторизованной ^рме -это лишь 2 строки:
х = [1 2 3 4 5J;:
у = х.Л2;
Преимущества в компактности и наглядности записи бесспорны, кроме того, этот
код выполняется во много раз быстрее по сравнению с интерпретацией оператора цикла.
Прерывание вычислений. В процессе выполнения сценария система MATLAB, в от¬
личие от процедурных систем программирования, допускает возможность планиро¬
вать прерывание вычислений. Это может быть связано с просмотром графиков, под¬
тверждением продолжения или прекращения программы, вводом новых значений
параметров и т. п.
Простейший способ прервать выполнение программы на определенное время или
до выполнения какого-либо события (например, нажатия клавиши) - это применить
оператор pause(n), который позволяет реализовать паузу длительностью п секунд
(от 0.1 с и более).
Подтвердить продолжение работы или ввести новые значения параметров можно
с помощью операторов input и inputdig, первый из которых формирует приглашение
для получения ответа в виде строки символов, а второй - диалоговое окно для ввода
значений параметров.
Наконец, наиболее универсальный способ работы с приложением в режиме преры¬
ваний - это создание графического интерфейса, который реализует обслуживание
произвольных асинхронных запросов от управляющих элементов control.
Операторы объявления переменных
GLOBAL | Объявление глобальных переменных
Синтаксис:
global имя_1 имя_2 ...
Описание:
Оператор global имя_1 имя_2 имя_3 объявляет переменные с именами имя_1,
имя_2, имя_3 глобальными.
Обычно М-функция работает с локальными переменными, которые изолированы от
переменных других функций и рабочей области системы MATLAB. Однако если не¬
сколько функций и головной сценарий объявляют некоторую переменную глобальной,
108
В. Г. Потемкин. Вычисления в среде MATLAB
то в этом случае все модули используют одну и ту же копию этой переменной. При¬
сваивание значения такой переменной возможно в любой из функций, где эта пере¬
менная объявлена глобальной. В момент, когда переменная объявляется глобальной,
ей присваивается значение пустого массива. Если же переменная с таким именем уже
существует в текущей рабочей области, то выдается предупреждение и ей присваива¬
ется значение глобальной переменной. Обычно для имен глобальных переменных ис¬
пользуют длинные названия и заглавные буквы.
Для удаления глобальной переменной применяется оператор clear global
<имя_переменной>.
Для удаления глобальной переменной из рабочей области модуля применяется ко¬
манда clear <имя_переменной>. Если теперь в модуле присвоить значение переменной
с тем же именем, то такая переменная станет локальной, аг г$й повторном обращении
к модулю ей будет возвращено значение глобальной переменной с этим именем.
Пример: , ;
Вновь обратимся к примеру решения ОДУ Лотки-Вольтерры с использованием
глобальных переменных ALPHA и ВЕТА.
Script %Lotka_Volterra
% Решение ОДУ Лотки-Вольтерры
global ALPHA BETA
ALPHA = 0.3;
BETA = 0.2;
[t,y] = ode23('lotka’,[0 16], [1 1]);
plot (t, у)
Головной сценарий оставим без изменений, в модуль вычисления правых частей
внесем следующие изменения:
• очистим глобальную переменную ALPHA;
• присвоим одноименной локальной переменной значение 1.3.
function ’dy = lotka (t,y)
% LOTKA Система уравнений Лотки-Вольтерры
global ALPHA BETA
ALPHA
dy(l) = y(l) - ALPHA*y(1)*y(2);
dy(2) = -y(2) + BETA *y(l)*y(2);
dy = dy. ' ;
clear ALPHA
ALPHA = 1.3;
Убедимся, что при повторных обращениях к модулю lotka значение глобальной пе¬
ременной восстанавливается.
ALPHA =0.3 % Первое вхождение
ALPHA =1.3 % Присваивание локального значения
3. Программирование и отладка
109
ALPHA =0.3 % Повторное вхождение
ALPHA =1.3 % Присваивание локального значения
Безусловно, этот пример является демонстрационным и не имеет практического
значения, однако он поясняет принципы работы с глобальными переменными в систе¬
ме MATLAB.
Обратимся к кодам М-функций tic и toe, которые работают с часами компьютера.
Глобальная переменная TICTOC используется обеими функциями, но она отсутствует
в рабочей области системы.
function tic
% TIC Начать отсчет времени
ОЧ
global TICTOC
TICTOC = clock;
function t = toe
% TOC Зафиксировать истраченное время.
% TOC выводит на терминал время, прошедшее с начала отсчета
% t = TOC; выводит затраченное время в виде переменной t.
global TICTOC
if nargout < 1
elapsed_time = etime(clock, TICTOC)
else
t = etime(clock, TICTOC);
end
М-функция tic фиксирует начало отсчета с помощью глобальной переменной TIC¬
TOC, которая затем используется в М-функции toe для определения интервала време¬
ни от начала до завершения отсчета.
Пример:
Убедимся, что при использовании функций tic и toe действительно появляется гло¬
бальная переменная TICTOC, которая невидима в рабочей области системы.
tic, whos global, eig(rand(30)); whos, toe;
Name Size Bytes Class
TICTOC 1x6 48 double array (global)
Grand total is 6 elements using 48 bytes
Name Size Bytes Class
ans 30x1 480 double array (complex)
Grand total is 30 elements using 480 bytes
elapsed_time = 0.0110
Мы действительно убеждаемся, что в рабочей области системы глобальная пере¬
менная TICTOC не размещается, она действует только в рабочих областях М-функций
tic и toe.
Сопутствующие операторы. CLEAR, IS GLOBAL, WHO.
110
В. Г. Потемкин. Вычисления в среде MATLAB
Объявление сохраняемых переменных
PERSISTENT |
Синтаксис:
persistent имя_1 имя_2 ...
Описание:
Оператор persistent имя_1 имя_2 . . . определяет переменные с указанными имена¬
ми как сохраняемые. Оператор можно применять только внутри некоторой М-
функции, чтобы сохранить значения для одной или нескольких переменных между по¬
вторными вызовами этой функции. В момент, когда переменная объявляется сохра¬
няемой, ей присваивается значение пустого массива. Обычно для имен сохраняемых
переменных используют длинные названия и заглавные буквы.
Сохраняемые переменные удаляются, если в М-функцию вносятся изменения или
она удаляется из памяти. Чтобы предотвратить удаление М-функции из памяти в тече¬
ние сеанса работы, следует применить оператор mlock.
Пример:
Вновь вернемся к решению ОДУ Лотки-Вольтерры, но теперь организуем вычис¬
ления с применением сохраняемых переменных ALPHA и ВЕТА. В этом случае эти
переменные необходимы только в М-функции вычисления правых частей и должны
быть удалены из головного сценария:
Script %Lotka_Volterra
% Решение ОДУ Лотки-Вольтерры
[t,y] = ode23('lotka',[0 16], [1’1]);
plot(t,y)
В модуль вычисления правых частей внесем следующие изменения. Присваивание
значений сохраняемым переменным реализуем только при первом обращении к моду¬
лю lotka; при повторных вхождениях оператор условия не выполняется, поскольку со¬
храняемая логическая переменная SECONDARY имеет значение 1.
function dy = lotka(t,у)
% LOTKA Система уравнений Лотки-Вольтерры
persistent ALPHA BETA SECONDARY
if isempty(SECONDARY)
ALPHA = 0.3; BETA = 0.2;
SECONDARY = logical(1);
end
dy(l) = y(l) - ALPHA*y(1)*y(2);
dy(2) = -y(2) + BETA *y(l)*y(2);
dy = dy. ' ;
Сопутствующие операторы'. CLEAR, GLOBAL, MISLOCKED, MLOCK, MUNLOCK.
3. Программирование и отладка
111
Определение количества входных и выходных аргументов
NARGIN,
NARGOUT
Синтаксис:
n = nargin n = nargout
n = nargin(<имя_функции>) n = nargout(<имя_функции>)
Описание:
При применении операторов nargin и nargout в теле М-функции они определяют,
сколько входных и выходных аргументов было реально использовано при обращении
к М-функции.
При применении операторов nargin и nargout вне тела М-функции они определяют,
сколько входных и выходных аргументов имеет М-функция. Отрицательное значение
означает, что для входных или выходных аргументов используются списки перемен¬
ной длины.
Функции nargin и nargout определяют количество используемых входных и выход¬
ных аргументов в теле М-функции.
Функции п = па^т(<имя_функции>) и п = па^оЩ(<имя_функции>) возвращают
соответственно количество входных и выходных аргументов М-функции с указанным
именем.
Пример:
В приведенном фрагменте процедуры fplot показано, как следует обрабатывать
необязательные входные и выходные переменные.
function [хО,уО] = fplot(fnamre,lims,varargin)
% FPLOT Построение графика функции
% FPLOT(fnamre,lims,npts, angl, subdiv)
•% Первые два аргумента являются обязательными;
% остальные - необязательные.
% FPLOT(...) строит график;
% [х,у] = FPLOT(...) возвращает массивы значений аргумента и функции
if
nargin <
5, subdiv
= 20; end
if
nargin <
4, angl =
10; end
if
nargin <
3, npts =
2 5; end
if
nargout =
= = 0
plot(x,
У)
else
xO = X;
У0 = y;
end
Сопутствующие операторы'. MFILENAME, VARARGIN, VARARGOUT.
112
В. Г. Потемкин. Вычисления в среде MATLAB
VARARGIN I Список входных аргументов переменной длины
Синтаксис:
z = function <имя__функции> (х, у, varargin)
Описание:
Аргумент varargin - это массив ячеек, который содержит произвольное количество
дополнительных входных переменных вызываемой функции. Этот аргумент должен
быть последним в списке входных аргументов, а его написание допускается только
строчными буквами.
Пример:
Рассмотрим М-функцию myplot, которая строит график некоторой функции, тип
которой и параметры графика передаются М-функции plot с помощью списка входных
аргументов переменной длины.
function myplot (х, у, varargin)
plot(х,у,varargin{:})
Допустим, надо построить график функции sin(3x) на интервале 0:.1:1 со следую¬
щими свойствами:
myplot(0:.1:1,sin(3 *(0: .1:1) ) , '--rs’, 'Color', [ . 5 .7 .3] , ...
’MarkerEdgeColor', ’k*, 'MarkerFaceColor' , ’g', ...
’Markersize10Linewidth', 3);
grid on % рис. 3.7
Вычислим количество входных и выходных аргументов функции fplot.
nargin myplot, nargout myplot
ans = -3
ans = 0
3. Программирование и отладка
113
М-функция myplot имеет 3 входных аргумента, причем последний является спи¬
ском переменной длины; выходные аргументы отсутствуют.
Сопутствующие функции'. NARGIN, NARGOUT, VARARGOUT.
VARARGOUT | Список выходных аргументов переменной длины
Синтаксис:
[z,varargout] = <имя_функции>(х,у,п)
Описание:
Переменная varargout позволяет объединить любое количество выходных аргумен¬
тов; она представляет собой массив ячеек, который содержит аргументы-опции выхода
функции. Эта переменная должна быть последней в списке выходов, а ее написание
допускается только строчными буквами.
Переменная varargout не создается при вызове функции; ее необходимо создать при
формировании выходов М-функции, применяя оператор цикла, как это показано в сле¬
дующем примере.
Пример:
Рассмотрим М-функцию
function [s,varargout] = mysize(X)
nout = max(nargout,1)-1;
s = size(X);
for i= l.-nout,
varargout(i) = (s(i)};
end
Здесь все выходные аргументы, начиная со второго, объединены в массив ячеек
с именем varargout, который содержит размеры по каждой размерности входного
массива X.
Сформируем трехмерный массив случайных чисел и определим ertf размеры
по каждой размерности.
[s,rows,cols,pages] = mysize(rand(4,5,3));
s = [453], rows = 4, cols = 5, pages = 3.
Ответ: это трехмерный массив с числом строк 4, числом столбцов 5 и страниц 3.
Вычислим количество входных и выходных аргументов функции mysize.
nargin mysize, nargout mysize
ans = 1
ans = -2
М-функция myplot имеет 1 входной и 2 выходных аргумента, причем последний
является списком переменной длины.
Сопутствующие операторы'. NARGIN, NARGOUT, VARARGIN.
114
В. Г. Потемкин. Вычисления в среде MATLAB
Проверка количества входных и выходных аргументов
NARGCHK,
NARGOUTCHK
Синтаксис:
msg = nargchk(low,high,nargin)
msg = nargoutchk(low,high,nargout)
Описание:
Эти функции применяются в теле М-функции, чтобы проверить правильность пе¬
редачи входных и формирования выходных аргументов.
Функция msg = nargchk(low, high, nargin) возвращает сообщение об ошибке, если
количество входных аргументов nargin меньше, чем их допустимое минимальное ко¬
личество low, или больше, чем максимальное high. Если количество входных аргумен¬
тов находится в диапазоне между low и high, то выходное сообщение не формируется
и является пустым массивом.
Функция msg = nargoutchk(low, high, nargout) возвращает сообщение об ошибке,
если количество используемых выходных аргументов nargout меньше, чем их допус¬
тимое минимальное количество low, или больше, чем максимальное high. Если коли¬
чество выходных аргументов находится в диапазоне между low и high, то выходное
сообщение не формируется.
Пример:
Рассмотрим М-функцию mysize, которая вычисляет размеры входного массива X
размерности не более 2. Она допускает использование списка выходных аргументов
переменной длины и проверяет количество реально используемых выходных аргумен¬
тов. Если выходных аргументов нет или их болыпечем 3, формируется сообщение
об ошибке.
function [s,varargout] = mysize(X)
% MYSIZ.E вычисляет размеры входного многомерного массива X
% размерности не более 3
msg = nargoutchk(1,3,nargout);
if isempty(msg)
nout = max(nargout,1)-1;
s = size(X);
for k=l:nout,
varargout(k) = (s(k)};
end
else
disp (msg)
end
Сформируем двумерный массив случайных чисел размера 3x4 и проверим пра¬
вильность обращения к М-функции mysize.
3. Программирование и отладка
115
X = rand(3,4);
[s,sl,s2] = mysize(X)
s = 3 4
si = 3
s2 = 4
Функция вычисляет размеры входного массива и формирует на выходе вектор его
размеров и список, содержащий размеры входного массива по каждой размерности.
Сопутствующие операторы. NARGIN, NARGOUT, VARARGIN, VARARGOUT.
INPUTNAME I Определение имени переменной по номеру входного аргумента
М-функции
Синтаксис:
inputname(<номер_входного_аргумента>
Описание:
Оператор трЩпате(<номер_входного_аргумента> определяет имя входного аргу¬
мента с указанным номером. Если аргумент не имеет имени, например является ариф¬
метическим выражением, то возвращается пустая строка ("")• Эта команда может при¬
меняться только в теле М-функции.
Пример:
Рассмотрим М-функцию myfun.m, которая определяет имена входных аргументов,
function с = myfun(az b) I
disp(sprintf('Первый входной аргумент "%s”’, inputname(1))) I
disp(sprintf(’Второй входной аргумент "%s"’, inputname(2))) I
x = 5; у = 3; myfun(x,y)
Первый входной аргумент "х"
Второй входной аргумент "у"
myfun(pi+1,pi-1)
Первый входной аргумент
Второй входной аргумент
Входными аргументами данной функции являются арифметические выражения.
Сопутствующие операторы'. NARGCHK, NARGIN, NARGOUT.
Операторы исполнения М-функций
RUN
Выполнить М-сценарий
Синтаксис:
run <имя_М-сценария>
Описание
Команда run <имя_М-сценария> позволяет запустить указанный М-сценарий
на выполнение из любого каталога, если в качестве имени указан полный путь досту¬
116
В. Г. Потемкин. Вычисления в среде MATLAB
па. Это избавляет от необходимости использовать команды cd и addpath для настройки
пути доступа.
Сопутствующие функции'. CD, ADDPATH.
PAUSE | Приостановка выполнения М-файла
Синтаксис:
pause
pause(n)
pause on
pause off
Описание:
Команда pause приостанавливает выполнение М-файла; для продолжения работы
необходимо нажать любую клавишу.
Команда pause(n) приостанавливает выполнение М-файла на п секунд, где п - лю¬
бое действительное число. Реализация таймера задержки зависит от вычислительной
платформы, но значение задержки в 0.01 с должно быть реализовано на любой плат¬
форме.
Команда pause on разрешает последующее применение команд группы pause для
задания пауз.
Команда pause off запрещает выполнение команд pause или pause(n). Это позволяет
реализовать режим автоматического исполнения М-файлов сценариев, если даже они
включают такие команды.
Сопутствующие операторы: CPUTIME, TIC, TOC, TIMER.
EVAL, EVALC | Вычисление строковых выражений
Синтаксис:
eval (’ <выражение> ’) Т = evalc(’<выражение>’)
[xl,x2, хЗ, . . . 1 = eval (’ <выражёние> ’) [T,X,Y,Z,...] = evalc (’<выражение> ’)
eval (string, catch_expr) T = evalc (string, catch_expr)
Описание
Оператор еуа1('<выражение>') возвращает результат исполнения операторов, запи¬
санных в виде строки символов. Строка формируется конкатенацией подстрок, имен
переменных, констант и других конструкций языка MATLAB.
Функция [xl, х2, хЗ, ...] = еуа1(’<выражение>’) возвращает результат в виде отдель¬
ных переменных. Эта конструкция предпочтительнее eval('[xl, х2, хЗ, ...] = выраже¬
ние^), поскольку в последней скрыта часть информации от синтаксического анализа¬
тора системы MATLAB и это может привести к ошибкам или непредсказуемому
результату.
Функция еуа1(\¥5,’<выражение>’,саЩЬ_ехрг) позволяет выявить ошибки при вычис¬
лении строкового выражения. Если возникла ошибка, то исполняются инструкции
catch_expr. После завершения работы оператора с помощью функции lasterr можно по¬
лучить сообщение об ошибке.
3. Программирование и отладка
117
В системе MATLAB 6 оператор eval дополнен функцией evalc, которая работает
по аналогии с оператором eval, но в дополнение формирует выходной массив Т, кото¬
рый включает весь вывод, осуществленный в командное окно во время выполнения
функции. При применении функции evalc команды diary, more и input оказываются не¬
доступными.
Пример:
Следующий фрагмент кода позволяет сформировать 6 магических матриц с имена¬
ми М3, М4,М8.
for п = 3:8
magic_str = ['М',int2str(п), ’ = magic(п) '];
eval(magic—str)
end
Здесь int2str - функция преобразования целого значения в строку символов.
Следующий программный код формирует матрицу Гильберта порядка п:
t = 4/(i+j-l)
n = 4;
for i = l:n
for j = l:n
G(i/j) = eval(t);
end
end
format rational
G
G =
1
1/2
1/3
1/4
1/2
1/3
1/4
1/5
1/3
1/4
1/5
1/6
1/4
1/5
1/6
1/7
В следующем примере осуществляется выбор файла из списка и его выполнение.
Обратите внимание, что все строки списка должны иметь одинаковую длину.
function showdemo(demos)
errstring = ’Ошибка запуска demo-файла:
n = input('Выберите demo-файл: ’);
eval(demos(n,:),'[errstring demos(n,:)]')
Сформируем список демонстрационных файлов (demo-файлов) D и проверим воз¬
можность их исполнения.
D = [’odedemo1 ;'quademofitdemo'] ;
showdemo (D)
Выберите demo-файл: 2
ans =
Ошибка запуска demo-файла: quademo
118
В. Г. Потемкин. Вычисления в среде MATLAB
Проверим, есть ли файл с таким именем среди demo-файлов:
quadTT
quad quad8 quadl quadprog
quad2 quadi quadperf quadstab
Ответ: файл с таким именем отсутствует
Сопутствующие операторы. FEVAL, LASTERR.
FEVAL | Вычисление функции по заданному имени
Синтаксис:
[yl,y2,...] = feval(@<имя_функции>,xl,...,хп)
[у1,у2,. . . ] = feval(’<имя_функции>’,xl,...,хп)
Описание:
Функция [у 1, у2,...] = Геуа1(@<имя_функции>, xl,хп) вычисляет функцию по ее
дескриптору, используя аргументы (xl,..., хп). Если дескриптор относится к переопре¬
деляемой функции, то тип данных аргументов должен соответствовать переопреде¬
ляемому классу.
Функция [у 1, ук] = Геуа1(’<имя_функции>', xl, ..., хп) вычисляет функцию по ее
имени, заключенному в одинарные кавычки, причем это имя не может включать в себя
путь доступа.
Ссылка на функцию через ее дескриптор открывает новые возможности для вызова
функций внутри методов оптимизации или численного интегрирования. Применение
дескриптора упрощает механизм такого вызова, делает его более естественным и на¬
дежным, помогает решить вопросы компиляции.
Примеры:
Следующие 3 оператора решения полной проблемы собственных значений с по¬
мощью М-функции eig эквивалентны.
А = rand(30);
[V,D] = eig (А);
[V/D] = feval (@eig, A);
[V#D] = feval('eig1 zA);
Библиотека функций системы MATLAB включает М-функцию fminbnd, которая
позволяет находить минимум интересующей вас функции на заданном интервале.
Фрагмент этой М-функции, достаточный для текущего обсуждения, выглядит сле¬
дующим образом:
function [xf,fval,exitflag,output] = ...
fminbnd(funfcn,ax,bx,options,varargin)
fx = feval(funfcn,x,vararginf:}) ;
3. Программирование и отладка
119
Для этого М-функции fminbnd должна быть передана ссылка на исследуемую
функцию через аргумент funfcn и указан интервал минимизации [ах Ьх]. Допустим, что
мы хотим найти минимум функции humps, обладающей несколькими минимумами, на
интервале [0.3 1.0]. Тогда обращение к функции fminbnd должно иметь вид:
[xmin,fmin] = fminbnd(©humps,0.3,1)
xmin = 0.6370
fmin = 11.2528
Найден локальный минимум функции humps, равный 11.2528 в точке 0.6370.
В следующем примере присвоим переменной fhandle значение дескриптора
@deblank и с помощью М-функции functions проверим, как много функций с таким
дескриптором есть в составе системы.
fhandle = Odeblank;
fdeblank =•functions(fhandle)
fdeblank =
function: 'deblank'
type: 'overloaded'
file: 'C:\MATLAB6p5\toolbox\matlab\strfun\deblank.m'
methods: [lxl struct]
Из описания структуры fdeblank следует, что помимо основного М-файла de-
blank.m существует еще и переопределяемый метод, который распространяется на тип
данных cell:
fdeblank.methods
ans = cell: 'c: \matlab6p5\toolbox\matlab\strfun\@cell\deblank'
Поскольку назначение функции deblank удалять лишние пробелы в строковых вы¬
ражениях, то ее применение к массиву строковых ячеек будет состоять в том, чтобы
удалить лишние пробелы в строках символов во всех ячейках массива. При этом будет
использоваться преопределенная функция deblank из частного каталога @се11:
feval(fhandle, {’string *,'with ','blanks '})
ans = 'string' 'with' 'blanks'
Наконец, приведем пример вызова вычисляемой функции по ее имени.
• Функция вычисления правой части уравнения Ван дер Поля оформляется в виде
внешней функции:
I Function xdot = vdpol(t, х)
I xdot = [x(l).*(1 - x(2).^2) - x(2); x(l)]
Тогда для интегрирования уравнения Ван дер Поля требуется следующий вызов
функции ode23:
tO = 0; tf = 20; % Задание интервала времени интегрирования
хО = [0 0.25]'; % Задание начальных условий
[t,x] = ode23('vdpol',[t0,tf],x0)}
Сопутствующие операторы: ASSIGNIN, BUILTIN, EVAL, EVALIN, FUNCTION.
HANDLE, FUNCTIONS.
120
В. Г. Потемкин. Вычисления в среде MATLAB
BUILTIN
Выполнить исходный код функции внутри метода
ASSIGNIN
Синтаксис:
bulltin(’<имя_функции>’,xl, ...,хп)
[yl,...,yk] = builtin('<имя_функции>',xl,...,хп)
Описание:
Функция builtin предназначена для применения внутри методов, чтобы выполнить
основной код некоторой М-функции, которая была переопределена в этом методе.
Функция builtin аналогична функции feval, за исключением того, что она обяза¬
тельно вызывает основной код М-функции. Для того чтобы такая возможность сохра¬
нялась в любой момент, никогда не следует переопределять функцию builtin.
Сопутствующая функция - FEVAL.
Присвоить значение переменной из указанной рабочей области
Синтаксис:
assignin(ws,'<имя_переменной>',' <значение>')
Описание:
Функция assignin(ws, '<имя_переменной>', ’<значение>’) присваивает переменной
с указанным именем из рабочей области ws заданное значение. Если переменная с та¬
ким именем не существует, она создается. Аргумент ws может принимать 2 значения:
'base' (рабочая область системы MATLAB) и 'caller’ (рабочая область М-функции).
Применение функции assignin целесообразно в тех случаях, когда необходимо, на¬
ходясь в рабочей области М-функции, воспользоваться какой-либо переменной и экс¬
портировать ее в рабочую область системы или наоборот.
Пример:
Находясь в рабочей области М-функции, необходимо экспортировать данные
об изображении, находящиеся в рабочей области системы. Для этого формируется
диалоговое окно, в полях которого необходимо указать имя файла, содержащего изо¬
бражение, и тип палитры (рис. 3.8).
Функция assignin используется, чтобы присвоить переменным imfile и стар значе¬
ния, введенные пользователем.
prompt = {’Введите имя изображения:', 'Введите тип палитры:'};
title = 'Вывод изображения - применение функции assignin’;
lines = 1;
def = {'my_image', 'hsv'};
answer = inputdig(prompt, title, lines, def); % рис. 3.8
assignin('base', 'imfile', answer{l});
assignin('base', 'стар', answer{2});
3. Программирование и отладка
121
3
Вывод изображения - применение Функции assignin
Сопутствующие операторы. ЕVALIN.
EVALIN I Выполнить вычисления в указанной рабочей области
Синтаксис:
evalin(ws,’<выражение>’)
[xl,х2,хЗ,...] = evalin(ws,’<выражение>')
evalin(ws,'<выражение>’,catch_expr)
Описание
Функция evalin(ws, ’<выражение>') вычисляет строковое выражение с использова¬
нием переменных рабочей области, заданной аргументом ws; этот аргумент может
принимать 2 значения 'base' (рабочая область системы) и 'caller' (рабочая область М-
функции).
Функция [xl, х2, хЗ, ...] = еуаПп('<выражение>') возвращает результат в виде от¬
дельных переменных. Эта конструкция предпочтительнее evalin('[xl, х2, хЗ,...] = <вы-
ражение>’), поскольку в последней скрыта часть информации от синтаксического ана¬
лизатора системы MATLAB и это может привести к ошибкам или непредсказуемому
результату.
Функция еуа1т^8,'<выражение>',са(сЬ_ехрг) позволяет выявить ошибки при вы¬
числении строкового выражения. Если возникла ошибка, то исполняются инструкции
catch_expr. После завершения работы оператора с помощью функции lasterr можно по¬
лучить сообщение об ошибке.
Функция evalin использует значения переменных из другой рабочей области,
в то время как функция assignin позволяет изменять значения переменных в другой
рабочей области.
Функцию evalin нельзя использовать рекурсивно.
Сопутствующие операторы. ASSIGNIN, CATCH, EVAL, FEVAL, LASTERR, TRY.
MLOCK Запретить удаление файла
Синтаксис:
mlock
mlock(<имя_М-файла>)
Описание:
Команда mlock запрещает удаление исполняемого М-файла.
122
В. Г. Потемкин. Вычисления в среде MATLAB
Команда т1оск(<имя_М-файла>) запрещает удаление М-файла с указанным име¬
нем до окончания сеанса работы.
Для возвращения М-файла в состояние, которое допускает его удаление, следует
воспользоваться командой munlock или тип1оск(<имя_М-файла>).
Сопутствующие операторы: MUNLOCK, MISLOCKED.
MUNLOCK | Снятие запрета на удаление файла
Синтаксис:
munlock
munlock(<имя_М-файла>)
Описание:
Команда munlock снимает запрет на удаление исполняемого М-файла.
Команда тип1оск(<имя_М-файла>) снимает запрет на удаление М-файла с указан¬
ным именем.
Обращение к командам группы munlock может потребоваться только в том случае,
если была применена одна из команд группы mlock.
Сопутствующие операторы. MLOCK, MISLOCKED.
MISLOCKED | Проверка запрета на удаление файла
Синтаксис:
mislocked
mislocked(<имя_М-файла>)
Описание:
Команда mislocked возвращает 1, если существует запрет на удаление исполняемо¬
го М-файла, и 0 - в ином случае.
Команда mislocked (<имя_М-файла>) возвращает 1, если существует запрет на уда¬
ление М-файла с указанным именем, и 0 - в ином случае.
Сопутствующие операторы. MLOCK, MUNLOCK.
Операторы управления исполнением кода
Операторы управления необходимы главным образом для организации вычисли¬
тельного процесса, который записывается в виде некоторой программы. К таким опе¬
раторам относятся операторы организации циклов, операторы условного перехода, пе¬
реключатели.
В версии MATLAB 6 реализовано 8 операторов управления исполнением кода про¬
граммы:
• оператор цикла FOR ... END выполняет группу инструкций фиксированное число
раз;
• оператор цикла WHILE ... END выполняет группу инструкций неопределенное
число раз, пока не будет выполнено некоторое логическое условие завершения;
3. Программирование и отладка
123
• оператор условного перехода IF ... ELSE ... ELSEIF ... END позволяет выполнять
альтернативные группы инструкций в зависимости от тех или иных логических ус¬
ловий;
• оператор переключения SWITCH ... CASE ... OTHERWISE ... END otherwise вы¬
полняет разные группы инструкций в зависимости от значения переключателя;
• оператор TRY ... CATCH ... END изменяет последовательность исполнения кода,
если возникает ошибочная ситуация;
• оператор continue позволяет при определенных условиях прервать выполнение те¬
кущей итерации цикла и перейти к следующей итерации;
• оператор break позволяет прервать выполнение цикла и выйти из него;
• оператор return прерывает выполнение М-функции и обеспечивает переход в вызы¬
вающую функцию.
Операторы организации циклов
FOR
Оператор цикла с определенным числом операций
END
Синтаксис:
for <индекс> = <НЗ>:>:<шаг>:<КЗ> for <переменная цикла> = А
<инструкции> инструкции
end end
Описание:
Оператор цикла
for <индекс> = <НЗ>:<шаг>:<КЗ>
<инструкции>
end
выполняет инструкцию или группу инструкций предопределенное число раз. Здесь
<индекс> - индекс цикла; <НЗ> и <КЗ> - начальное и конечное значение индекса;
<шаг>- приращение индекса цикла. По умолчанию значение приращения равно 1.
В общем случае приращение может быть как положительным, так и отрицательным.
Цикл завершается, если при положительном приращении текущий индекс превысит
конечное значение, а при отрицательном станет меньше его.
Оператор цикла
for <переменная цикла> = А
инструкции
end
задает переменную цикла как вектор А(:, к). Для первого шага цикла к равно 1; для
второго к равно 2 и т. д., пока не достигнет значения п. То есть цикл выполняется
столько раз, сколько столбцов в массиве А. Для каждого шага переменная цикла - это
вектор, содержащий один из столбцов массива А.
124
В. Г. Потемкин. Вычисления в среде MATLAB
Пример:
Следующий цикл вычисляет ранг магической матрицы в зависимости от ее поряд¬
ка. Здесь же для наглядности построена столбцовая диаграмма рангов (рис. 3.9).
for i = 3:12
r(i) = rank(magic(i));
end
bar(r)
рис. 3.9
Примером использования вложенных циклов может служить вычисление матрицы
Гильберта:
t = •1/(i+j-1)*;
n = 4;
for i = lsn
for j = lsn
G(i/j) = eval(t);
end
end
Примером использования в качестве переменной цикла массива является следую¬
щая задача, в которой необходимо вычислить и построить зависимость действитель¬
ных частей собственных значений матрицы А от параметра К.
'0
2
0
А =
0
-2
10
К
0
-10
'0
2
0 '
"0"
0
-2
10
-к
0
0
0
-10
1
О 0]=А0-К*Ь*с.
Для решения поставленной задачи сформируем следующий цикл:
АО = [0 2 0; 0 -2 5; 0 0 -5]; Ь = [0 0 I]1; с = [100 ];
К = [0:0.01:1 1:0.1:10];
j = I;
3. Программирование и отладка
125
for V = К
d{j}= real(sort(complex(real(eig(A0-v*b*c)))));
3 = 3+1;
end
plot(Kz[d{:}].1,1 Linewidth1,3), grid on % рис. 3.10
рис. 3.10
Сопутствующие операторы и функции'. BREAK, CONTINUE, WHILE.
Оператор цикла с неопределенным числом операций
WHILE
END
Синтаксис:
while <логическое выражение>
<инструкции>
end
Описание:
Оператор цикла с неопределенным числом операций WHILE ... END многократно
выполняет инструкцию или группу инструкций, пока логическое выражение истинно.
Логическое выражение имеет форму:
выражение <оператор отношения> выражение
оператор отношения: ==, <=, >=, <, >, ~
Если логическое выражение использует массив, то все его элементы должны быть
истинны для выполнения инструкций цикла. Для приведения массива к скалярному
значению можно использовать встроенные функции any и all. Если логическое выра¬
жение приводится к пустому массиву, то оно является ложным и инструкции цикла
выполняться не будут.
Для того чтобы запрограммировать выход из цикла WHILE ... END, надо приме¬
нить оператор break. Для принудительного выхода из цикла используйте быстрые кла¬
виши Ctrl+C.
126
В. Г. Потемкин. Вычисления в среде MATLAB
Пример:
Найти число п, факториал которого содержит 100 десятичных знаков.
n = 1;
while prod(l:n)<1.elOO,
n = n+1;
end
n
n = 70
Ответ: это число 70.
Определить машинную точность macheps, т. е. то наименьшее число, для которого
еще выполняется условие 1 + macheps > 1.
eps =1;
while (1 + eps) > 1
eps = eps/2;
end
macheps = eps*2
macheps = 2.2204e-016
Сопутствующие операторы и функции'. BREAK, FOR.
BREAK | Прерывание цикла
Синтаксис:
break
Описание:
Функция break прерывает выполнение циклов for и while. В случае вложенных
циклов прерывание возможно только из самого внутреннего цикла.
Пример:
Цикл while ... end будет выполняться до тех пор, пока не будет введено нулевое или
отрицательное значение переменной п.
while 1
n = input('Введите п. Прекращение цикла n<=0. п = ')
if п <= 0, disp('Работа завершена.'), break, end
г = rank(magic(n))
end
Введите
п.
Прекращение
цикла
п<=0.
п = 5
n =
5
г =
5
Введите
п.
Прекращение
цикла
п<=0.
п = 8
п =
8
г =
3
Введите
п.
Прекращение
цикла
п< = 0.
п = -1
n = -1
Работа завершена.
Сопутствующие операторы: END, ERROR, FOR, IF, RETURN, SWITCH, WHILE.
3. Программирование и отладка
127
continue] Прерывание цикла
Синтаксис:
continue
Описание:
Функция continue прерывает выполнение текущего шага в циклах for и while и пе¬
реходит на следующий шаг. В случае вложенных циклов происходит возврат в цикл
более высокого уровня.
Пример:
Приведенный ниже фрагмент подсчитывает количество строк кода М-функции
magic, при этом пустые строки и строки комментария не учитываются.
fid = fopen('magic.m',1 г1);
count = 0;
while -feof(fid)
line = fgetl(fid);
if isempty(line) | strncmp(line,,1)
continue
end
count = count + 1;
end
disp(sprintf(’%d строк'rcount));
25 строк
Ответ: код М-функция magic состоит из 25 строк.
Оператор условного перехода
Структура условных выражений в языке MATLAB близка к обычно применяемой
в языках программирования, но в них не используется оператор THEN.
Для организации условных выражений предназначено 4 оператора: if, else, elseif,
end. Как и в операторах цикла, каждый условный оператор if должен заканчиваться
оператором end.
IF
ELSE
ELSEIF
END
Синтаксис:
if условие
инструкции
end
Оператор условного перехода
if условие
инструкции!
else
инструкции2
end
if условие!
инструкции!
elseif условие2
инструкции2
else
инструкцииЗ
end
128
В. Г. Потемкин. Вычисления в среде MATLAB
Описание:
Оператор условного перехода вычисляет условие в форме некоторого логического
выражения и выполняет соответствующую группу инструкций в зависимости от зна¬
чения этого условия. Если логическое выражение истинно, то MATLAB выполнит все
инструкции между if и end, а затем продолжит выполнение программы. Если условие
ложно, то MATLAB пропускает все утверждения между if и end, т. е. оператор услов¬
ного перехода не выполняется.
Операторы IF ... ELSE ... END и IF ... ELSEIF ... END создают дополнительные
ветвления внутри тела оператора if:
• Оператор else не содержит логического условия. Инструкции, связанные с ним,
выполняются, если предшествующий оператор if (и возможно, elseif) ложны.
• Оператор elseif может многократно использоваться внутри оператора условного
перехода. Он содержит логическое условие, которое вычисляется, если предшест¬
вующий оператор if (и возможно, elseif) ложны. Инструкции, связанные с операто¬
ром elseif, выполняются, если соответствующее логическое условие истинно.
Примеры:
Следующий оператор условного перехода выполняется только при четных значе¬
ниях переменной а.
if rem(a,2)==0
disp (’а четно')
Ь = а/2;
end
Если логическое условие включает переменную, не являющуюся скаляром, то ут¬
верждение будет истинным, когда все элементы массива отличны от нуля. Пусть за¬
дан логический массив X; запишем следующий оператор условного перехода:
if X
инструкции
end
Этот оператор равносилен следующему:
if all(X(:))
инструкции
end
Если в операторе if условное выражение является пустым массивом, то такое усло¬
вие ложно. То есть оператор условного перехода
if А
S1
else
SO
end
выполнит инструкции SO только тогда, когда А - пустой массив.
3. Программирование и отладка 129
5 т. Зак. 3375
Формирование трехдиагональной матрицы:
П = 4;
for i = l;n
for j = l:n
if i == j
A(i,j) = 2;
elseif abs(i-j)
A (i z j ) = 1;
else
A(izj) = 0;
end
end
end
A
A =
2 1 0
12 1
0 12
0 0 1
0
0
1
2
Сопутствующие функции и операторы. BREAK, RETURN, SWITCH, WHILE.
RETURN|
Возврат в вызывающую функцию
Синтаксис:
return
Описание:
Команда return выполняет возврат в вызывающую функцию или к режиму работы
с клавиатурой. Эта команда позволяет также завершить режим работы с клавиатурой.
Пример:
Допустим, что некоторая М-функция determinant предназначена для вычисления
определителя матрицы. Тогда в теле этой функции следовало бы учесть возможность
входа с пустой матрицей. В этом случае выходному аргументу присваивается значение
NaN и происходит выход из М-функции.
function d = determinant(А)
if isempty(A)
d = NaN;
return
else
end
Сопутствующие операторы. BREAK, DISP, END, ERROR, FOR, IF, SWITCH,
WHILE.
130
В. Г. Потемкин. Вычисления в среде MATLAB
Оператор переключения
SWITCH
Оператор переключения
CASE
OTHERWISE
END
Синтаксис:
switch <выражение>
% выражение - это обязательно скаляр или строка
case <значение_1>
инструкции
% выполняются, если <выражение> = <значение1>
case {<значение_2>, <значение_3>, . .., <значение_к>}
инструкции
% выполняются, если <выражение> = <значение_1 (i = 2:k)>
otherwise
инструкции
% выполняются, если <выражение> не совпало ни с одним
% из значений
end
Оператор SWITCH ... CASE 1 ... CASE К ... OTHERWISE ... END выполняет вет¬
вления в зависимости от значений некоторой переменной или выражения.
Оператор переключения включает:
• Заголовок switch, за которым следует вычисляемое выражение (скаляр или строка).
• Произвольное количество групп case. Заголовок группы состоит из слова case,
за которым следует возможное значение выражения, расположенное на одной
строке. Последующие строки содержат инструкции, которые выполняются для
данного значения выражения. Выполнение продолжается до тех пор, пока не встре¬
тится следующий оператор case или оператор otherwise. На этом выполнение блока
switch завершается.
• Группу otherwise. Заголовок включает только слово otherwise, начиная со следую¬
щей строки размещаются инструкции, которые выполняются, если значение выра¬
жения оказалось не обработанным ни одной из групп case. Выполнение завершает¬
ся оператором end.
• Оператор end является последним в блоке переключателя.
Оператор switch работает, сравнивая значение вычисленного выражения со значе¬
ниями групп case. Для числовых выражений оператор case выполняется, если <значе-
ние>==<выражение>. Для строковых выражений оператор case истинен, если
strcmp(3wa4e«we, выражение) истинно.
Если возможные значения для группы case записаны в виде массива ячеек, то инст¬
рукции этой группы выполняются, если хотя бы один элемент массива ячеек совпадает
с выражением заголовка switch. Если совпадения нет, то выполняется группа otherwise,
если она существует.
3. Программирование и отладка
131
Пример:
Рассмотрим оператор switch со следующими условиями: он проверяет переменную
input_num; если ее значение равно -1,0 или 1, то операторы case выводят на экран со¬
ответствующее сообщения. Если значения выражения input_num не равно ни одному
из этих значений, то выполнение переходит к оператору otherwise.
switch input_num
case -1
disp('минус один')
case 0
disp('нуль')
case 1
disp('плюс один')
otherwise
disp('другое значение')
end
Оператор switch может использовать множественное условие в единственной груп¬
пе case посредством включения выражения case, если выражение для этого условия
записано в виде массива ячеек:
switch var
case 1
disp('1 ’ )
case{2,3,4}
disp ('2 или 3 или 4')
case 5
disp('5 ' )
otherwise
disp('что-то -другое')
end
Сопутствующие операторы'. IF, WHILE.
3.3. Диалог с пользователем
С самых первых версий система MATLAB была ориентирована на включение
пользователя в процесс решения задачи. Возможность выполнения в каждый момент
времени любого оператора языка MATLAB вносит творческий элемент в процесс ре¬
шения. Пользователь может пробовать разные варианты, не испытывая проблем с воз¬
можными ошибками, поскольку режим интерпретации локализует ошибку на данном
операторе и позволяет понять ее истоки.
Организация такого интерактивного взаимодействия пользователя с компьютером
основана на таких базовых операциях, как
• вывод информации и данных на экран терминала;
• приостановка вычислений для анализа числовых и графических данных;
• запрос информации от пользователя о продолжении или прекращении процесса
вычислений либо ввода дополнительных данных.
132
В. Г. Потемкин. Вычисления в среде MATLAB
Расширение графических возможностей систем MATLAB 6 позволило создать на¬
бор стандартных диалоговых панелей, которые позволяют:
• обеспечить пользователя предупреждениями и сообщениями об ошибках;
• реализовать ввод данных, дать подсказку, задать вопрос;
• выбрать требуемый шрифт или палитру цвета;
• организовать вывод на печать;
• открыть и сохранить файл.
Материал этого раздела следует рекомендовать тем, кто пишет сценарии лабора¬
торных работ и создает операционную среду окружения на русском языке.
Описание инструментов полного графического интерфейса, основанного на приме¬
нении управляющих элементов, читатель может найти в книге [21], которая в настоя¬
щее время не потеряла своей актуальности. Следует лишь отметить, что в версии
MATLAB 6.5 стало более просто программировать графический интерфейс, т. е. соз¬
давать процедуры обратного вызова. Для ознакомления с новыми материалами отсы¬
лаем читателя к первоисточнику [69].
Базовые операторы диалога
DISP
Вывод значений переменных и текста на экран
Синтаксис:
disp(<переменная>)
disp('<текст>’)
Описание:
Оператор disp(X) выводит на терминал значение переменной X без указания имени.
Оператор disp (’<текст>') выводит на терминал символьную строку '<текст>’.
После каждой команды disp происходит перевод на новую строку.
Пример:
disp(’Столбец 1
Столбец 2
Столбец 3’)
disp(rand(5,3))
Столбец 1
Столбец 2
Столбец 3
0.4057
0.0579
0.2028
0.9355
0.3529
0.1987
0.9169
0. ^.32
0.6038
0.4103
0.0099
0.2722
0.8936
0.1389
0.1988
Сопутствующие команды'. FORMAT, INT2STR, NUM2STR, RATS, SPRINTF.
3. Программирование и отладка
133
Форматирование данных для вывода на экран или записи в файл
FPRINTF,
SPRINTF
Синтаксис:
count = fprintf(<дескриптор_файла>,<формат>,А,...)
fprintf(<формат>,А,...)
s = sprintf(<формат>,А,...)
[s,<сообщение_об_ошибке>] = sprintf(<формат>,А,...)
Описание:
Функция count = ГрпЩ^<дескриптор_файла>, <формат>, А,...) преобразует данные
в строки символов в соответствии с указанным форматом и выводит их на экран или
в файл в зависимости от значения дескриптора файла. Дескриптор файла - это целое
число, которое может быть получено с помощью функции fopen. Оно имеет значение 1
для вывода на экран и 2 в случае стандартной ошибки. По умолчанию дескриптор
файла равен 1. В качестве выходного аргумента возвращается количество записанных
байтов.
Команда fprintf(<^opMaT>, А,...) выводит данные на экран терминала.
Функция s = sprintf(^opMaT>, А,...) преобразует данные в строки символов в соот¬
ветствии с указанным форматом и возвращает их в виде строковой переменной s,
но не записывает их в файл.
Функция [s, <сообщение_об_ошибке>] = sprintf(^opMaT>, А,...) возвращает, кроме
того, сообщение об ошибке, если она имела место, либо пустую строку.
Особого внимания заслуживает аргумент <формат>. Строка формата определяет
способы записи, выравнивания, количество значащих цифр, ширину поля и другие ха¬
рактеристики описания формата данных. Она может содержать алфавитно-цифровые
символы, символы перевода строки, спецификаторы преобразования и другие симво¬
лы. Строка формата выглядит следующим образом:
%
+
12.5
е
начальный символ
флаг
ширина поля и точность
символ преобразования
Функции fprintf и sprintf аналогичны соответствующим функциям языка ANSI С
[32] за некоторыми исключениями.
• Следующие нестандартные спецификаторы подтипа поддержаны для специфика¬
торов преобразования %о, %и, %х, %Х:
t - основной тип данных - числа с плавающей точкой, но не целые без знака;
b - основной тип данных - числа с удвоенной точностью, но не целые без знака.
Например, для вывода чисел с удвоенной точностью в шестнадцатеричной системе
счисления следует применить формат %Ьх.
• Функции fprintf и sprintf исполняются в векторном режиме, когда входом является
массив. Строка формата циклически применяется к элементам столбца, пока не бу¬
дут исчерпаны все элементы.
В следующей таблице представлены спецификаторы форматирования строки.
134
В. Г. Потемкин. Вычисления в среде MATLAB
Спецификатор
Описание
\n
Перевод на новую строку
\t
Горизонтальная табуляция
\b
Возврат на 1 символ
\r
Возврат каретки
\f
Перевод страницы
\\
Наклонная черта влево
\" или " (2 кавычки)
Одинарная кавычка
%%
Символ процента
Следующие спецификаторы преобразования определяют способ записи выходной
строки.
Спецификатор
Описание ,
%с
Одиночный символ
%d
Десятичный формат со знаком
%е
Экспоненциальный формат вида 3.1415е + 00
%Е
Экспоненциальный формат вида 3.1415Е + 00
%f
Формат с фиксированной точкой
%g
Наиболее компактный из форматов %е и %f
%G
Наиболее компактный из форматов %Е и %f
%о
Восьмеричная запись без знака
%s
Строка символов
%u
Десятичная запись без знака
%x
Шестнадцатеричная запись с символами а - f
%X
Шестнадцатеричная запись с символами А - F
Другие символы, которые могут быть использованы в строке формата:
Символ
Описание
Пример
-
Выровнять преобразуемое число по полю
%-5.2d
+
Всегда выводить знак числа
%+5.2d
0
Дополнять нулями, а не пробелами
%05.2d
Цифра (ширина поля)
Минимальное количество выводимых цифр числа
%6f
.цифра (точность)
Количество выводимых цифр после десятичной точки
%6.2f
Примеры:
Следующие операторы создают текстовый файл exp.txt, который содержит таблицу
экспоненты:
х = 0 : . 1:1;
У = [х;ехр(х) ];
fid = fopen('exp.txt'w');
fprintf(fid,'%6.2f %12.8f\n1,у);
fclose(fid);
3. Программирование и отладка
135
type exp.txt
0.00 1.00000000
0.10 1.10517092
0.20 1.22140276
0.30 1.34985881
0.40 1.49182470
0.50 1.64872127
0.60 1.82211880
0.70 2.01375271
0.80 2.22554093
0.90 2.45960311
1.00 2.71828183
Оператор
fprintf(’Длина единичной окружности равна %g.\n1,2.pi)
выводит на экран строку
Длина единичной окружности равна 6.28319.
Чтобы указать в строке одинарную кавычку, надо использовать две кавычки:
fprintf(l, 'It"s Friday.\n’)
It's Friday.
Операторы
В = [8.8 7.7; 8800 7700];
fprintf(l,'X равно %6.£f м или %8.3f мм\п1,9.9,9900,В)
выводят следующие строки
X равно 9.90 м или 9900.000 мм
X равно 8.80 м или 8800.000 мм
X равно 7.70 м или 7700.000 мм
Преобразовать 32-разрядные числа со знаком в шестнадцатеричный формат.
а = [6 10 -10 14 44];
fprintf('%9Х\п',а + (а<0)*2Л32)
6
А
FFFFFFF6
Е
2С
Примеры применения оператора sprintf:
Команда
Результат
sprintf('%0.5g',( l+sqrt(5))/2)
sprintf(' %0.5g\ 1/eps)
1.618
4.5036e+15
sprintf(’% 15.5f, l/eps)
4503599627370496.00000
sprintf('%d',round(pi))
3
sprintf('%s', 'hello')
sprintf('Pa3Mep массива %d x %d.’,2,3)
hello
Размер массива 2x3
sprintf('\n')
Символ конца строки
Сопутствующие команды: FSCANF, FWRITE, DIARY, INPUT, INT2STR, NUM2STR,
SAVE, SSCANF.
136
В. Г. Потемкин. Вычисления в среде MATLAB
Приостановка выполнения М-файла
PAUSE |
Синтаксис:
pause pause (n)
pause on pause off
Описание:
Команда pause приводит к паузе в работе системы и ожиданию нажатия любой
клавиши для продолжения.
Команда pause(n) приостанавливает работу системы MATLAB на п секунд. Это по¬
зволяет привлечь внимание пользователя к выдаваемой на экран в процессе работы М-
файла числовой или графической информации.
Команда pause on включает режим пауз.
Команда pause off выключает режим пауз. Это позволяет отладочные М-файлы
и файлы-сценарии выполнять без остановов.
Эта команда требуется для вывода графиков на экран терминала. Если она не ис¬
пользуется, то графики выводиться не будут.
Пример:
Если в приводимом ниже цикле команду pause не использовать, то промежуточные
графики выводиться не будут. Если использовать команду в форме pause <без пара¬
метров^ то потребуется подтверждать продолжение счета нажатием клавиши Enter.
Если указать минимальную длительность паузы в 0.1 с, то этого вполне достаточно
для беглого слежения за графиками.
for п = 3:10
spy(magic(n))
pause(0.1)
end
Сопутствующие команды’. DRAWNOW.
INPUT ~~| Ввод информации пользователем
Синтаксис:
х = input(’<приглашение>’)
х = input(’<приглашение>’, ’s')
Описание:
Функция х = трШ('<приглашение>') выводит на экран строку с приглашением
и ожидает ввода выражения, допустимого в системе MATLAB: арифметического
выражения, имени встроенной функции или М-файла. Если функция имеет не¬
сколько выходных параметров, то выходной переменной х присваивается только
первое значение.
Функция х = шри1('<приглашение>’, 's') возвращает строку, которая введена
пользователем. Если нажать клавишу Enter без ввода строки, то будет введен пус¬
той массив.
3. Программирование и отладка
137
Вводимая строка символов может содержать одну или несколько групп символов
'\п', которые соответствуют переходу на следующую строку. Таким образом, строка
приглашения может быть размещена на нескольких строках.
Если необходимо вывести на экран символ обратного слэша 'V, то следует исполь¬
зовать комбинацию символов 'W.
Пример:
Задействовать клавишу Enter для ввода ответа по умолчанию.
i = input(’Продолжить расчет? Да/Нет[Да]: ’,'s')
Продолжить расчет? Да/Нет [Да]:
i = [ ]
if isempty(i), i = ’Да', end
i = Да
Сопутствующие функции и команды. GINPUT, KEYBOARD, MENU, UICONTROL.
KEYBOARD | Переключение на работу с клавиатуры из М-файла
Синтаксис:
keyboard
Описание:
Команда keyboard, когда она включена в текст М-файла, прерывает его исполнение
и передает управление клавиатуре. Этот специальный режим работы отмечается тем,
что на экране появляется приглашение К». В этом режиме пользователь может про¬
верить или изменить переменные, а также ему доступны все команды системы
MATLAB. Работа в этом режиме будет завершена, если выполнить команду return; по¬
сле этого управление будет передано М-файлу.
Режим работы с клавиатурой может быть использован для отладки М-файлов, хотя
в современных версиях системы MATLAB для этого предназначен специальный от¬
ладчик Editor/Debugger.
Сопутствующие команды: DBQUIT, DBSTOP, INPUT, RETURN.
MENU | Создание меню
Синтаксис:
k = menu(’<заголовок>’, 'кнопка 1’, ’кнопка 2 'кнопка п’)
Описание:
Функция к = шепи('<заголовок>', 'кнопка Г, 'кнопка 2', ..., 'кнопка п') при работе
с оконным интерфейсом выводит на экран меню с заголовком и кнопками выбора.
Выходному параметру к присваивается номер выбранной кнопки.
При вводе команды
k = menu(’Выберите цвет’,’Красный’,’Зеленый’,’Синий’)
высвечивается простейшее меню с тремя кнопками выбора (рис. 3.11).
138
В. Г. Потемкин. Вычисления в среде MATLAB
ВЖ ли х]
Выберите цвет
Красный
Зеленый
Синий
рис. 3.11
При выборе красного цвета формируется ответ
k = 1
Пример:
Применим диалог на основе оператора menu при построении графика функции
sin(3t).
k = menu(1 Выберите цвет’,'Красный’, 'Зеленый',’Синий1)
t = 0:0.01:1;
color = ['r'/,g,/,b,J;
plot(t,sin(3*t),color(k),’Linewidth*,2),grid on % рис. 3.12
Сопутствующие функции и команды'. UICONTROL, UIMENU.
Диалоговые панели
В настоящее время базовые операторы диалога дополнены разновидностью управ¬
ляющих элементов интерфейса пользователя, называемой диалоговыми панелями.
В составе системы MATLAB 6 насчитывается 15 таких панелей.
3. Профаимирование и отладка
139
Имя панели
Назначение
msgbox
Панель сообщений
errordig
Панель сообщения об ошибке
wamdlg
Панель предупреждения
helpdig
Панель подсказки
inputdig
Диалоговая панель ввода
listdig
Панель просмотра списка
pagedlg
Диалоговая панель расположения страницы
printdig
Диалоговая панель печати
questdig
Диалоговая панель вопроса
uigetdir
Стандартная диалоговая панель поиска каталога
uigetfile
Стандартная диалоговая панель открытия файла
uiputfile
Стандартная диалоговая панель записи файла
ui setcolor
Стандартная диалоговая панель выбора цвета
uisetfont
Стандартная диалоговая панель выбора шрифта
waitbar
Стандартная панель ожидания
MSGBOX I Диалоговая панель сообщений
Синтаксис:
msgbox(message)
msgbox(message,title)
msgbox(message,title,’icon’)
msgbox(message,title,’custom',iconData,iconCmap)
msgbox(...,'createMode')
h = msgbox (...)
Описание:
Команда msgboxmessage) создает диалоговую панель, в поле которой можно по¬
местить любое сообщение message. Переменная message может быть строковым век¬
тором, массивом строк или массивом строковых ячеек.
Команда msgbox(message, title) позволяет задать заголовок диалоговой панели.
Команда msgbox(message, title, ’icon’) позволяет вывести в поле диалоговой панели
значок icon. Для этого аргумента допустимы следующие значения: 'none’, ’error', 'help',
'warn' или 'custom'; по умолчанию ’попе’. В среде операционной системы Windows ХР
эти значки имеют следующий вид:
Команда msgbox(message, title, 'custom', iconData, iconCmap) позволяет создать
в поле диалоговой панели собственный значок icon. Аргумент iconData содержит опи¬
сание объекта Image, а аргумент iconCmap - описание соответствующей палитры.
140
В. Г. Потемкин. Вычисления в среде MATLAB
Команда msgbox(..., 'createMode') позволяет определить опцию createMode со зна¬
чениями ’modal’, 'non-modal', 'replace'; по умолчанию 'non-modal'. Опция replace позво¬
ляет заменить одну диалоговую панель другой с тем же значением заголовка title.
Опция createMode может быть задана массивом записей с полями WindowStyle
и Interpreter. Поле WindowStyle принимает описанные выше значения, а поле
Interpreter имеет значение Чех' или 'попе', что позволяет использовать для формирова¬
ния сообщения интерпретатор графических символов языка ТеХ.
Функция h = msgbox(...) возвращает дескриптор диалоговой панели сообщения.
Пример:
Создадим диалоговую панель с собственным значком (рис. 3.13).
Data = 1:64; Data = (Data1*Data)/64;
h = msgbox(1 String1,'Title1,'custom1,Data,hot(64))
рис. 3.13
А теперь заменим сообщение String на формулу X2 + Y2, используя интерпретатор
ТеХ (рис. 3.14).
CreateStruct.Windowstyle = 'replace.';
CreateStruct.Interpreter = 'tex';
h = msgbox('XA2 + YA2','Title','custom' ,Data,hot(64),CreateStruct);
рис. 3.14
Сопутствующие операторы: DIALOG, ERRORDLG, INPUTDLG, HELPDLG,
QUESTDLG, TEXTWRAP, WARNDLG.
ERRORDLG Диалоговая панель сообщения об ошибке
Синтаксис:
errordig
errordig('errorstring')
errordig('errorstring', 'dlgname')
errordig('errorstring', 'dlgname','on')
h = errordig (...)
3. Программирование и отладка
141
Описание:
Команда errordlg создает диалоговую панель сообщения об ошибке с заголовком
'Error Dialog' и сообщением 'This is the default error string.'.
Команда errordlg('errorstring') создает диалоговую панель сообщения об ошибке
с заголовком 'Error Dialog' и сообщением в виде строки 'errorstring', которая может
быть написана й на русском языке.
Команда errordlg('errorstring', 'digname') создает диалоговую панель сообщения
об ошибке с заголовком в виде строки 'digname' и сообщением в виде строки 'error¬
string', которые могут быть написаны на русском языке.
Команда errordlg('errorstring', 'digname', 'on') определяет, существует ли диалоговая
панель сообщения об ошибке с таким именем, и если она существует, то выводится
на передний план, не создавая новой диалоговой панели.
Функция h = errordlg(...) возвращает дескриптор диалоговой панели сообщения
об ошибке.
Замечания:
Система MATLAB настраивает ширину диалоговой панели в соответствии с дли¬
ной строки сообщения 'errorstring'. В поле диалогового окна расположена также кнопка
ОК, нажатие которой или клавиши Enter приводит к удалению панели с экрана.
Вид диалоговой панели зависит от используемой операционной системы.
Пример:
Создадим русскоязычную диалоговую панель сообщения об ошибке в среде Win¬
dows ХР (рис. 3.15).
errordlg('Файл не найден’, ’Ошибка файла’);
рис. 3.15
Сопутствующие операторы'. DIALOG, HELPDLG, MSGBOX, QUESTDLG, WARNDLG.
WARNDLGI Диалоговая панель предупреждения
Синтаксис:
warndlg
warndlg('warningstring')
warndlg('warningstring', 'dlgname')
h = warndlg(...)
Описание:
Команда warndlg создает диалоговую панель предупреждения с заголовком 'Warn¬
ing Dialog' и сообщением 'This is the default warning string.'.
142
В. Г. Потемкин. Вычисления в среде MATLAB
Команда wamdlg('warningstring') создает диалоговую панель предупреждения с за¬
головком ’Warning Dialog’ и сообщением в виде строки 'wamingstring', которая может
быть написана и на русском языке.
Команда wamdlg('warningstring’, ’dlgname’) создает диалоговую панель предупреж¬
дения с заголовком в виде строки ’dlgname’ и сообщением в виде строки ’wamingstring’,
которые могут быть написаны на русском языке.
Команда warndlg(..., ’createMode’) позволяет определить опцию createMode со зна¬
чениями ’modal’, ’non-modal’, ’replace’; по умолчанию ’non-modal’. Опция replace позво¬
ляет заменить одну диалоговую панель другой с тем же значением заголовка title.
Опция createMode может быть задана массивом записей с полями WindowStyle
и Interpreter. Поле WindowStyle принимает описанные выше значения, а поле
Interpreter имеет значение ’tex’ или 'попе', что позволяет использовать для формирова¬
ния сообщения интерпретатор графических символов языка ТеХ.
Функция h = wamdlg(...) возвращает дескриптор диалоговой панели предупреждения.
Пример:
Создадим русскоязычную диалоговую панель предупреждения 'Деление на нуль
в формуле sin(ax)/a' с заголовком '!! Предупреждение !!' (рис. 3.16):
dlgname = ’? ?Предупреждение! ’ ’ ;
wamdlg (1 1, dlgname)
createMode.WindowStyle = 1 replace1;
createMode.Interpreter = 1 tex1;
wstring = ’Деление на нуль в формуле sin(\alphax)/\alpha1;
wamdlg (ws tring, dlgname, createMode)
рис. 3.16
Сопутствующие операторы: DIALOG, ERRORDLG, HELPDLG, MSGBOX.
HELPDLG ]
Диалоговая панель подсказки
Синтаксис:
helpdig
helpdig('helpstring')
helpdig('helpstring', 'dlgname’)
h = helpdig (...) .
Описание:
Команда helpdig либо создает диалоговую панель подсказки с заголовком ’Help
Dialog' и сообщением 'This is the default help string.', либо выводит ее на передний план.
3. Программирование и отладка
143
Команда helpdlg('helpstring') создает диалоговую панель подсказки с заголовком
'Help Dialog' и сообщением в виде строки 'helpstring', которая может быть написана
и на русском языке.
Команда helpdlg('helpstring', 'digname') создает диалоговую панель подсказки с за¬
головком в виде строки 'digname' и сообщением в виде строки ' helpstring', которые мо¬
гут быть написаны на русском языке.
Функция h = helpdlg(...) возвращает дескриптор диалоговой панели подсказки.
Замечания:
Система MATLAB настраивает ширину диалоговой панели в соответствии с дли¬
ной строки сообщения 'helpstring'. В поле диалогового окна расположена также кнопка
ОК, нажатие которой или клавиши Enter приводит к удалению панели с экрана.
Для задания строки 'helpstring' можно использовать любые строковые переменные,
но предпочтение следует отдавать массиву ячеек.
Пример:
Создадим русскоязычную диалоговую панель подсказки в среде Windows (рис. 3.17).
helpdig(’Выберите 10 точекВыбор точек’);
рис. 3.17
Сопутствующие операторы'. DIALOG, ERRORDLG, QUESTDLG, WARNDLG.
INPUTDLG ~|
Диалоговая панель ввода
Синтаксис:
answer = inputdig(prompt)
answer = inputdig(prompt,title)
answer = inputdig(prompt,title,lineNo)
answer = inputdig(prompt,title,lineNo,defAns)
answer = inputdig(prompt,title,lineNo,defAns,AddOpts)
Описание:
Функция answer = inputdlg(prompt) создает диалоговую панель ввода, содержащую
окна редактируемого текста с заголовками, задаваемыми массивом строковых ячеек
prompt. Если окна будут заполнены входными данными, то массив ячеек answer будет
содержать эти данные.
Функция answer = inputdlg(prompt, title) позволяет создать диалоговую панель вво¬
да с заголовком title.
Функция answer = inputdlg(prompt, title, lineNo) позволяет с помощью аргумента
lineNo задать количество строк для ввода каждой величины. В зависимости от типа
переменной lineNo реализуются следующие возможности:
144
В. Г. Потемкин. Вычисления в среде MATLAB
Тип переменной lineNo
Пояснение
Скаляр
Задает одинаковое количество строк для ввода всех величин
Вектор-столбец
Задает определенное количество строк для ввода каждой величины
Массив размера тх2
Первый столбец задает определенное количество строк для ввода
каждой величины; второй столбец определяет ширину поля окна
редактируемого текста в символах
Функция answer = input dlg(prompt, title, lineNo, defAns) позволяет с помощью аргу¬
мента defAns задать значения величин, например принимаемых по умолчанию, в виде
строк.
Функция answer = inputdlg(prompt, title, lineNo, defAns, AddOpts) позволяет с по¬
мощью аргумента AddOpts задать дополнительные опции. Аргумент AddOpts можно
определить в виде массива записей с полями Resize, WindowStyle и Interpreter, которые
могут принимать следующие значения:
Поле
Значения
Действия
Resize
'on'
Изменение размеров диалоговой панели возможно
'off
Изменение размеров диалоговой панели невозможно
WindowStyle
'normal'
Замена одной диалоговой панели другой возможна
'modal'
Замена одной диалоговой панели другой невозможна
Interpreter
'tex'
Использование интерпретатора ТеХ возможно
'none'
Использование интерпретатора ТеХ невозможно
Пример:
Сформировать диалоговую панель "Ввод.данных” для ввода величин а, ₽, у, кото¬
рая имеет ширину поля ввода 6 символов и возможность изменения размеров диалого¬
вой панели или ее замены (рис. 3.18).
AddOpts.Resize='on';
AddOpts.WindowStyle = 'normal';
AddOpts . Interpreter = ' text¬
prompt = {'\alpha',’\beta',’\gamma'};
dlgTitle = 'Ввод данных';
lineNo = [1 6];
answer = inputdig(prompt,dlgTitle,lineNoz AddOpts);
Сопутствующие операторы. DIALOG, ERRORDLG, HELPDLG, QUESTDLG,
WARNDLG.
3. Программирование и отладка
145
LISTDLG
Диалоговая панель просмотра списка
Синтаксис:
[Selection,ok] = listdig('ListstringS, ...)
Описание:
Функция [Selection, ok] = listdlg('ListString’, S, ...) создает диалоговую панель для
просмотра и выбора одного или более элементов списка ListString. Выходной аргумент
Selection - вектор индексов выбранных элементов; выход ок равен 1, если нажата
кнопка ок, и 0, если нажата кнопка Cancel. Двойное нажатие клавиши мыши или на¬
жатие клавиши Enter при выборе нескольких строк списка аналогично нажатию кноп¬
ки ОК. Диалоговая панель имеет кнопку Select all, которая позволяет выделить все
элементы списка просмотра. (
В качестве входных аргументов могут быть использованы следующие пары пара-
метр/значение:
Параметр
Значение
'ListString'
Массив строковых ячеек, задающих список элементов
'SelectionMode'
Режим выбора элементов списка: 'single' - одиночный;
'multiple' (по умолчанию) - множественный
'ListSize'
Размер списка, задаваемый вектором [ширина, высота]; единица измере¬
ния - пиксел; по умолчанию [160 300]
'Initial Value'
Вектор индексов выделенных элементов списка; по умолчанию равен 1,
что соответствует выбору первого элемента
'Name'
Заголовок диалоговой панели; по умолчанию пустая строка''
'PromptString'
Заголовок списка, заданный массивом строковых ячеек; по умолчанию
пустой массив ячеек { }
'OKString'
Этикетка кнопки подтверждения; по умолчанию 'ОК'
'Cancelstring'
Этикетка кнопки отмены; по умолчанию 'Cancel'
'uh'
Высота кнопки выбора 'Select all' в пикселах; по умолчанию 18
'fus'
Расстояние между границами фрейма и кнопками вызова в пикселах;
по умолчанию 8
'ffs'
Расстояние между границами фрейма и графического окна в пикселах;
по умолчанию 8
Пример:
Построить диалоговую панель просмотра текущего каталога для выбора файла.
Выходом функции является вектор, первый элемент которого - индекс выбранной
функции из списка, а второй - индикатор выбора: если выбор сделан - 1, если нет - О
(рис. 3.19).
146
В. Г. Потемкин. Вычисления в среде MATLAB
d = dir;
str = {d.name};
[S/V] = listdig('Liststring',str,...
'Name', ’Выбор файла’, ...
’PromptString’, ’Выберите файл:’, ...
* uh*, 20, •••
'fus',10, . . .
•ffs',10)
s = 9
v = 1
Выбор файла
xjj
рис. 3.19
PAGEDLG ]
Диалоговая панель расположения страницы
Синтаксис:
pagedlg
pagedlg(fig)
h = pagedlg(...)
Описание:
Команда pagedlg создает диалоговую панель расположения страницы для вывода
на печать текущего графического окна, используемую по умолчанию (рис. 3.20).
рис. 3.20
3. Программирование и отладка
147
Команда pagedlg(fig) создает диалоговую панель расположения страницы для вы¬
вода на печать одного или нескольких графических окон с вектором дескрипторов fig.
Функция h = pagedlg(...) позволяет получить дескриптор диалоговой панели.
Сопутствующий оператор - PRINTDLG.
PRINTDLG ~|
Диалоговая панель печати
Синтаксис:
printdig
printdig(fig)
printdig('-crossplatform', fig)
printdig('-setup',fig)
Описание:
Команда printdig создает диалоговую панель печати для данной вычислительной
платформы; на рис: 3.21 представлена диалоговая панель печати текущего графиче¬
ского окна для платформы Windows.
рис. 3.21
Команда printdlg(fig) создает диалоговую панель печати графического окна с деск¬
риптором fig.
Команда printdlg(’-crossplatform', fig) создает универсальную межплатформенную
диалоговую панель печати.
printdig(1-crossplatform1) % рис. 3.22
148
В. Г. Потемкин. Вычисления в среде MATLAB
Print: Figure 1
xj
Destination
Printer:
File:
Driver:
Windows
Grouse..
Options...
Figure Size on Printed Page
Same size as screen
20,3 by 15.2 cm
-Axes Limits and Ticks
Same as on screen
& Allow MATLAB to select
OK [ Cancel J
рис. 3.22
Команда printdlg('-setup', fig) создает межплатформенную диалоговую панель для
настройки параметров печати.
printdig(*-setup1) % рис. 3.23
Сопутствующий оператор - PAGEDLG.
QUESTDLG ]
Диалоговая панель вопроса
Синтаксис:
button
button
button
button
button
button
questdig(
questdig(
questdig(
questdig(
questdig(
questdig(
'qstring')
'qstring',
'qstring',
'qstr4ing ',
'qstring',
'qstring',
'title ')
'title ' z
'title ',
'title ',
'title ',
'default')
'strl ', 'str2 ', 'default ')
'strl ', 'str2 ', 'str3 ', 'default ')
..., AddOpts)
3. Программирование и отладка
149
Описание:
Функция button = questdlg(’qstring') создает диалоговую панель вопроса, помещен¬
ного в строку 'qstring'; кроме того, на панели расположены 3 кнопки: Yes, No и Cancel;
ответ, выдаваемый по умолчанию при закрытии панели, - Yes (рис. 3.24). Переменная
button соответствует значению ответа.
рис. 3.24
Функция button = questdlg('qstring', ’title’) позволяет задать заголовок для диалого¬
вой панели вопроса.
Функция button = questdlg('qstring', 'title', 'default') позволяет задать ответ, исполь¬
зуемый по умолчанию.
Функция button = questdlg('qstring', 'title', 'strГ, 'str2', 'default') позволяет создать диа¬
логовую панель вопроса с двумя кнопками ответа и задать ответ, используемый
по умолчанию.
Функция button = questdlgCqstring', 'title', 'strГ, 'str2', 'str3', 'default') позволяет создать
диалоговую панель вопроса с тремя кнопками ответа и задать ответ, используемый
по умолчанию.
Функция button = questdlg('qstring','title', . . ., AddOpts) позволяет с помощью аргу¬
мента AddOpts задать дополнительные опции. Аргумент AddOpts можно определить
в виде массива записей с полями Default и Interpreter, при этом поле Interpreter может
принимать значения 'попе' или 'tex', что позволяет использовать при формировании
строки вопроса математические символы.
Пример:
Создать диалоговую панель вопроса с заголовком "Замена переменных" и строкой
вопроса "Заменить а на Р?" (рис. 3.25).
AddOpts.Default ='Нет';
AddOpts.Interpreter = 1 tex1;
Button = questdig (’Заменить переменную \alpha \ппна \beta\rm? ', ...
’Замена переменных’, 'Да’,'Нет’, 'Помощь’,AddOpts);
Замена переменный
Заменить переменную а на р ?
Да | Нет | Помощь |
рис. 3.25
Сопутствующие операторы: DIALOG, ERRORDLG, HELPDLG, INPUTDLG, MSGBOX,
WARNDLG.
150
В. Г. Потемкин. Вычисления в среде MATLAB
UIGETDIR ]
Стандартная диалоговая панель поиска каталога
Синтаксис:
directory—name = uigetdir
directory_name = uigetdir('start_path')
directory_name = uigetdir('start_pathdialog—title')
Описание:
Функция directory_name = uigetdir выводит на экран стандартную диалоговую па¬
нель со структурой каталогов открытия файла со стандартным заголовком Select Direc¬
tory to Open (Выберите каталог) и позволяет открыть нужную папку.
directory—name = uigetdir % рис. 3.26
directory_name = С:\MATLAB6p5\work
и
jLI Х.1
Select Directory to Open
® ЕЗ stateflow
IS sys
® £) toolbox
S3 uninstall
S3 Ir^ webserver
О |EI!
ф Q 0ffice_2000
ft! icti Polynomial
ffl Q Program Files
® О Toolbox
J
d
Создать папку [ | OK | Отмена |
рис. 3.26
Функцйя directory_name = uigetdir(’start_path') открывает диалоговую панель
co структурой каталогов и выделенным каталогом start_path.
Функция directory_name - uigetdir('start_path’,'dialog_title') открывает диалоговую
панель с указанным заголовком 'dialog_title'.
В среде операционных систем Windows пользователь может создать новую папку
и перемещать папки по дереву каталогов.
Пример:
Следующий оператор позволяет вывести корневой каталог системы MATLAB с за¬
головком на русском языке.
uigetdir(matlabroot, ’Корневой каталог системы MATLAB’) % рис. 3.27
3. Программирование и отладка
151
Корневой каталог системы MATLAB
Рабочий стол
ЕВ О Мои документы
Е / Мой компьютер
ЕВ Диск 3,5 (А:)
В W WIN98 (C:)
® & 0ffice_2000
(+1 ЁЭ Polynomial
® Q Program Files
® О Toolbox
MATLAB6p5
Создать папку
OK J Отмена
рис. 3.27
Сопутствующие операторы'. UIGETFILE, UIPUTFILE.
UIGETFILE I Стандартная диалоговая панель открытия файла
Синтаксис:
uigetfile
uigetfile ( ' FilterSpec ' )..
uigetfile('FilterSpec','DialogTitle’)
uigetfile('FilterSpec','DialogTitle',x,y)
[fname,pname] = uigetfile(...)
Описание:
Команда uigetfile вьГводит на экран стандартную диалоговую панель открытия фай¬
ла со списком всех файлов текущего каталога.
Команда uigetfile('FilterSpec') выводит на экран стандартную диалоговую панель
открытия файла в соответствии со списком ’FilterSpec', который является либо списком
полных имен, либо фильтром расширения *.ext; например фильтр '*.т', используемый
по умолчанию, выводит только М-файлы системы MATLAB.
Команда uigetfile('FilterSpec', 'DialogTitle') позволяет указать заголовок диалоговой
панели.
Команда uigetfile('FilterSpec', 'DialogTitle', х, у) позволяет указать расположение ле¬
вого верхнего угла диалоговой панели [х, у] относительно левого верхнего угла экра¬
на; при этом расстояния по осям измеряются в пикселах. Заметим, что на некоторых
вычислительных платформах эта опция не поддерживается.
Функция [fname, pname] = uigetfile(...) возвращает имя выделенного файла и путь
доступа к нему, если нажата кнопка Открыть; если нажата кнопка Отмена или воз¬
никает ошибка, то возвращаются нулевые значения выходных аргументов. Все опи¬
санное справедливо только для русскоязычной версии системы Windows.
152
В. Г. Потемкин. Вычисления в среде MATLAB
Замечание:
Если вы указали ошибочный файл, то появляется диалоговая панель сообщения
об ошибке; после этого можно указать другой файл или воспользоваться кнопкой От¬
мена.
Пример:
Вызвать стандартную диалоговую панель открытия файла с заголовком ”М-файлы
системы MATLAB” (рис. 3.28).
[fname, pname] = uigetfile('*.m’,’M-файлы системы MATLAB1)
fname =JORD.M
pname =E:\pvg\Janet\JASP\snaeJBn\
£) c? S'
Папка: | О snaeJBn
|М-файлы системы MATLAB
fiA2S
fif2fstr
fi immsnae2
fijS2A
fir j
fiCLUSTER-
Ml FORMSALL
filNDBL
fi Jstructsnae
fir
Jj cyclic6
j •*] g2aplexxy
fi INSERT
fijVEC
fir
fijDIMM
fi g2atdegxy
fijasp
И KER
fif
•i] eqvstr
fig2janetxy
mi
j 3] kroneck
fir
U] esort
Ij]g2s
fijRLYAP
fi mixsnae2
fir
<1
J
±1
Имя файла:
jjORD
| Открыть
T ип Файлов:
|м-files (x.m)
3
Отмена
рис. 3.28
Сопутствующий оператор - UIPUTFILE.
UIPUTFILE |
Стандартная диалоговая панель записи файла
Синтаксис: •
uiputfile
uiputfile('InitFile')
uiputfile('InitFile', 'DialogTitle')
uiputfile('InitFile', ’DialogTitle', x, y)
[fname, pname] = uiputfile(...)
Описание:
Команда uiputfile выводит на экран стандартную диалоговую панель записи файла
со списком всех файлов текущего каталога.
Команда uiputfile('InitFile') выводит на экран стандартную диалоговую панель запи¬
си файла в соответствии со списком ’InitFile', который является либо списком полных
имен, либо фильтром расширения *.ext; например фильтр используемый
по умолчанию, выводит только М-файлы системы MATLAB.
Команда uiputfile('InitFile', 'DialogTitle') позволяет указать заголовок диалоговой
панели.
3. Программирование и отладка
153
Команда uiputfile('InitFile', 'DialogTitle', x, у) позволяет указать расположение лево¬
го верхнего угла диалоговой панели [х, у] относительно левого верхнего угла экрана;
при этом расстояния по осям измеряются в пикселах. Заметим, что на некоторых вы¬
числительных платформах эта опция не поддерживается.
Функция [fname, pname] = uiputfile(...) возвращает имя выделенного файла и путь
доступа к нему, если нажата кнопка Сохранить; если нажата кнопка Отмена или воз¬
никает ошибка, то возвращаются нулевые значения выходных аргументов. Все опи¬
санное справедливо только для русскоязычной версии системы Windows.
Замечание:
Если вы указали файл, который уже существует, то появляется подсказка, не хоти¬
те ли вы заменить его новым; если вы отвечаете "Да", то происходит замена; если
"Нет”, то происходит возврат к диалоговой панели, что позволяет указать новое имя
или воспользоваться кнопкой Отмена.
Пример:
Вызвать стандартную диалоговую панель записи файла со списком файлов с рас¬
ширением fig системы MATLAB (рис. 3.29).
[newmatfile, newpath] = uiputfile(’*.fig1z 'Save As1)
newmatfile = termometer.fig
newpath = E:\matlabrll\work\
рис. 3.29
Сопутствующие операторы: UIGETFILE.
UISETCOLOR! Стандартная диалоговая панель выбора цвета
Синтаксис:
uisetcolor
uisetcolor([R G В])
uisetcolor(h)
‘uisetcolor(. . 'DialogTitle')
C = uisetcolor (...)
154
В. Г. Потемкин. Вычисления в среде MATLAB
Описание:
Команда uisetcolor выводит на экран стандартную диалоговую панель выбора цвета
с выделенным белым цветом.
Команда uisetcolor([R G В]) выводит на экран стандартную диалоговую панель вы¬
бора цвета с выделенным цветом, который соответствует палитре [RGB].
Команда uisetcolor(h) выводит на экран стандартную диалоговую панель выбора
цвета с выделенным цветом, который соответствует палитре графического объекта
с дескриптором h.
Команда uisetcolor(..., 'DialogTitle') добавляет заголовок к стандартной диалоговой
панели выбора цвета.
Функция С = uisetcolor (...) выводит в качестве выходного аргумента вектор интен¬
сивностей цвета выбранной палитры.
Пример:
Вызвать стандартную диалоговую панель выбора цвета и присвоить ей заголовок
"Установка палитры” (рис. 3.30).
figure
С = uisetcolor(1, 'Установка палитры')
С = 0 1.0000 0.3000
рис. 3.30
Сопутствующий оператор - UIGETFILE.
UISETFONT ~]
Стандартная диалоговая панель выбора шрифта
Синтаксис:
uisetfont
uisetfont(h)
uisetfont(S)
uisetfont(. . 'DialogTitle')
S = uisetfont(...)
3. Программирование и отладка
155
Описание:
Команда uisetfont выводит на экран стандартную диалоговую панель выбора шриф-(
та, которая позволяет изменить значения свойств FontName, FontUnits, FontSize, Font-
Weight и FontAngle для графических объектов Text, Axes и Uicontrol.
Команда uisetfont(h) выводит на экран стандартную диалоговую панель выбора
шрифта, которая соответствует набору свойств шрифта графического объекта с деск¬
риптором h.
Команда uisetfont(S) выводит на экран стандартную диалоговую панель выбора
шрифта, которая соответствует набору свойств, заданному структурой S. Структура S
должна включать одно или несколько из следующих свойств шрифта: FontName,
FontUnits, FontSize, FontWeight, FontAngle, причем имя поля записи должно точно со¬
ответствовать имени свойства.
Команда uisetfont(..., ’DialogTitle’) добавляет заголовок к стандартной диалоговой
панели выбора шрифта.
Функция S = uisetfont(...) возвращает в качестве выходного аргумента структуру,
записи которой определяют свойства шрифта и их значения. Если при работе с пане¬
лью будет нажата кнопка Отмена или возникнет ошибка, то значение S равно нулю.
Пример:
Вызвать стандартную диалоговую панель выбора шрифта и присвоить ей заголовок
"Выбор шрифта" при работе под управлением ОС Windows ХР (рис. 3.31).
S = uisetfont
S =
FontName: ’helvetica'
FontUnits: 'points'
FontSize: 14
FontWeight: 'bold'
FontAngle: 'italic'
■
Начертание:
Размер:
Образец
АаВЬБбФф
Шрифт:
Шрифт
SE
обычный
10
ОК
О ©Arial Unicode MS
Я ;
, обычный
вгз
11 ,
Отмена
Ч? ©Batang
курсив
Ч? ©MS Mincho
жирный
12
жирный курсив
14 -J
p) Arial В lack
| () Arial Narrow
d
16
18 I
20 T.I
Набор символов:
|Кириллический
рис. 3.31
Сопутствующие операторы’. AXES, TEXT, UICONTROL.
156
В. Г. Потемкин. Вычисления в среде MATLAB
WAITBAR
Стандартная панель ожидания
Синтаксис:
waitbar(L)
waitbar(L,h)
waitbartitle')
h = waitbar(.. . )
Описание:
Команда waitbar(L) выводит на экран стандартную панель ожидания, шкала кото¬
рой закрашена на длину L. Значение L находится в пределах от 0 до 1. Обычно панель
ожидания применяется для оценки продолжительности вычислений и обращение к ней
реализуется внутри цикла.
Команда waitbar(L, h) устанавливает область закраски шкалы на панели ожидания
с дескриптором h.
Команда waitbar(..., 'title') добавляет заголовок к стандартной панели ожидания.
Функция h = waitbar(...) возвращает в качестве выходного аргумента дескриптор
панели ожидания.
Пример:
Создать панель ожидания с длиной области закраски 0 и заголовком "Пожалуйста,
подождите" и закрасить ее до длины 0.9 (рис. 3.32).
h = waitbar(0,’Пожалуйста, подождите...;
for i=l:90r %
вычисления
waitbar(i/100)
end
рис. 3.32
3.4. Программирование ошибочных ситуаций
При проектировании программ вычислений во многих случаях пользователь может
предусмотреть те особые ситуации, которые возникают при применении того или ино¬
го математического метода. При программировании арифметических выражений это
может быть несогласованное использование переменных; в задаче на собственные
значения - появление кратных значений и т. п. Поскольку любой математический ме¬
тод имеет определенные границы применимости, то выход за эти границы должен рас¬
сматриваться как ошибочная ситуация, которая должна быть учтена при написании
программы.
Предупреждения и сообщения об ошибках
Простейший способ предупредить возможное появление ошибки - это сформиро¬
вать сообщение с помощью операторов warning или error.
3. Программирование и отладка
157
n = 0;
if n < 1
warning('n должно быть больше .или равно 1');
end
Warning: п должно быть больше или равно 1
Здесь для конкретной задачи устанавливается допустимый диапазон для параметра п.
Эту же информацию можно сообщить пользователю в виде сообщения об ошибке.
if п < 1
error(1п должно быть больше или равно 1');
end
??? п должно быть больше или равно 1
Отличие в формировании сообщения заключается в том, что предупреждение со¬
провождается меткой Warning:, а сообщение об ошибке - меткой ???. Кроме того,
на цветном дисплее предупреждение выводится серым цветом, а сообщение об ошиб¬
ке - красным. Пользователь может сам выбирать, какую форму сообщения использо¬
вать. В русском языке предупреждение носит оттенок совета, а ошибка - это свер¬
шившееся событие.
Предупреждающие сообщения не прерывают выполнения программы, а только
указывают на необходимость внести исправление: не применять устаревший оператор,
предотвратить деление на нуль и т. п. Пользователь может предусмотреть те или иные
сообщения, которые регулируют, например, использование типов данных. Предупре¬
ждения отличаются от сообщений об ошибках тем, что их вывод на экран всегда мож¬
но подавить. !
Идентификаторы сообщений. Это.новый механизм, введенный в системе MATLAB 6
для выделения групп сообщений об ошибках или предупреждениях. Он позволяет по¬
метить, а в дальнейшем выбрать группы сообщений, используя идентификатор. Иден¬
тификатор сообщения - это метка в виде строки символов, которая включается в со¬
став операторов warning и error, чтобы выделить группу сообщений и иметь
возможность добавить к ней уточняющую информацию. Основное требование к иден¬
тификатору сообщения - он должен быть уникальным.
Идентификатор сообщения (метка) имеет следующий синтаксис:
component1:component2: ... :mnemonic
Поля componentl:component2: ... определим как категорию метки, а поле mne¬
monic - как мнемонику метки. При формировании идентификатора необходимо со¬
блюдать следующие правила:
• в полях метки не должно быть пробелов;
• первый символ любого поля - это прописная или строчная буква алфавита;
• остальные символы - буквы латинского алфавита, цифры и знаки подчеркивания;
• длина любого поля не ограничена.
Категория метки может включать несколько компонентов и быть многоуровневой.
Это может быть программа, инструментальное средство, пакет программ или иная
достаточно широкая категория, например название фирмы или ее подразделения и т. п.
Мнемоника метки - это, как правило, общая характеристика сообщения об ошибке.
Примерами идентификаторов сообщения могут быть:
158
В. Г. Потемкин. Вычисления в среде MATLAB
MATLAB:divideByZero
Simulink:actionNotTaken
TechCorp:notFoundlnPath
TechCorp:TestEquipDiv:Waveform:obsoleteSyntax
Здесь первые 3 идентификатора сообщений являются одноуровневыми и в качестве
категории метки используют имена систем MATLAB и Simulink, а также название
корпорации TechCorp; в свою очередь, мнемоника метки связана с характером ошиб¬
ки: divideByZero (деление на нуль), actionNotTaken (обработка не поддержана), not¬
FoundlnPath (путь не найден). Четвертый идентификатор - TechCorp:TestEquip-
Div:Waveform является трехуровневым и содержит уточняющую информацию
о корпорации, ее подразделении и области исследований.
Форматирование строки сообщения. При использовании спецификаторов формати¬
рования строки следует иметь в виду, что их действие проявляется только в тех случа¬
ях, когда операторы warning и error имеют более одного входного аргумента. Напри¬
мер, символ перевода на новую строку \п в следующем операторе с одним входным
аргументом не действует:
warning(’В данном случае символ перевода на новую строку \п не действует')
Warning: В данном случае символ перевода на новую строку \п не действует
Однако если оператор error дополнить идентификатором сообщения, то символ \п
будет задействован:
warning('ErrorTests:convertТеst’, ...
'В данном случае символ перевода на новую строку \п действует')
Warning: В данном случае символ перевода на новую строку действует
При формировании строки сообщения можно следующим образом задать его иден¬
тификатор:
error('MATLAB:noSuchFileФайл "%s” не найден’,filename);
Здесь идентификатор сообщения - это строка 'MATLAB:noSuchFile'; уточняющее
сообщение ’Файл ”%s” не найден’ содержит спецификатор форматирования %s, а так¬
же указание имени файла filename.
filename = 'my.m';
error('MATLAB:noSuchFile'r ’Файл "%s" не найден’,filename);
??? Файл ’’my.m" не найден
Программирование предупреждений и сообщений
Система MATLAB содержит операторы, которые позволяют управлять выводом
предупреждений на терминал, игнорировать те или иные предупреждения, включать
отладчик. Обращаем внимание на то, что эти опции распространяются только на пре¬
дупреждения, но не на сообщения об ошибках.
Операторы управления состоянием сообщения имеют следующий синтаксис, кото¬
рый удобнее представить в формате команды:
warning <состояние> <метка>
Аргумент '<состояние>' может принимать значения on, off или query, что соответ¬
ствует состоянию 'включить', 'выключить' вывод сообщений на экран или 'запросить'
состояние сообщений. Тип сообщения определяется аргументом <метка>, которая мо-
3. Программирование и отладка
159
жет принимать значения all, last или <идентификатор_сообщения>. Значение all уста¬
навливает все сообщения в указанное состояние, значение last выполняет такую уста¬
новку только для последнего по времени предупреждения, и, наконец, значение
<идентификатор_сообщения> выделяет некоторую категорию сообщений. По умолча¬
нию в системе установлены параметры on и all.
Рассмотрим некоторые примеры.
Пример 1. В системе MATLAB 6.5 допустимая длина идентификаторов увеличена
с 31 символа до 63. Однако для совместимости с предшествующими версиями можно
включить напоминание о том, что используемый идентификатор превышает длину
в 31 символ. Чтобы реализовать это, следует ввести команду
warning on MATLAB:usinglongnames
Тогда при вводе оператора присваивания
AAAAABBBBBCCCCCDDDDDEEEEEFFFFFGGGGG = 35;
Warning: 'AAAAABBBBBCCCCCDDDDDEEEEEFFFFFGGGGG' exceeds MATLAB’s previous
maximum name length limit of 31 characters.
(Type "warning off MATLAB:usinglongnames" to suppress this warning.)
появляется предупреждение, что длина идентификатора превышает прежний предель¬
ный размер в 31 символ. Это сообщение можно подавить, если применить команду
warning off MATLAB:usinglongnames
Если мы определим идентификатор, длина которого превышает 63 символа, то по¬
лучим следующее предупреждение:
AAAAABBBBBCCCCCDDDDDEEEEEFFFFFGGGGGHHHHHIIIIIJJJJJKKKKKLLLLLMMMMM = 65;
Warning: ' AAAAABBBBBCCCCCDDDDDEEEEEFFFFFGGGGGHHHHHI III IJJJJJKKKKKLLLLLMMMMM'
exceeds MATLAB's maximum name length of 63 characters and has been truncated
to 'AAAAABBBBBCCCCCDDDDDEEEEEFFFFFGGGGGHHHHHIIIIIJJJJJKKKKKLLLLLMMM’.
(Type "warning off MATLAB:namelengthmaxexceeded" to suppress this warning.)
"Длина идентификатора превышает предельный размер в 63 символа", и он будет
уменьшен до указанного имени. Это сообщение можно подавить, если применить ко¬
манду
warning off MATLAB:namelengthmaxexceeded
Пример 2. При обращении матрицы с нулевыми элементами система генерирует пре¬
дупреждение о том, что матрица вырожденна:
inv(zeros(3))
Warning: Matrix is singular to working precision.
(Type "warning off MATLAB:singularMatrix" to suppress this warning.)
ans =
Inf
Inf
Inf
Inf
Inf
Inf
Inf
Inf
Inf
Это сообщение можно подавить, если применить команду
warning off MATLAB:singularMatrix
В результате выполненных операций вектор состояний для предупреждений изме¬
нился, и чтобы узнать его, надо применить команду.
160
В. Г. Потемкин. Вычисления в среде MATLAB
warning query all
The default warning state is 'on'. Warnings not set to the default are
State Warning Identifier
off MATLAB:namelengthmaxExceeded
off MATLAB:nonScalarConditional
off MATLAB:singularMatrix
off MATLAB:usinglongnames
В результате получен ответ, что по умолчанию вектор состояния для всех преду¬
преждений on. Предупреждения, имеющие иное состояние, представлены в таблице.
Состояние
Идентификатор предупреждения
off
MATLAB:namelengthmaxExceeded
off
MATLAB:nonScalarConditional
off
MATLAB:singularMatrix
off
MATLAB:usinglongnames
Теперь этот вектор состояния можно запомнить, используя формат команды:
s = warning(’queryall')
Если это приемлемый вектор состояния предупреждений, то его можно запомнить,
а в М-файл startup для задания операционной среды сеанса работы включить следую¬
щую команду:
warning(s)
Еще один оператор управления - это оператор управления режимом, который
в формате команды можно описать следующим образом:
s = warning <состояние> <режим>
Аргумент '<состояние>’ может принимать только значения on, off или query, что
соответствует состояниям 'включить’, ’выключить’ или ’информировать’ о реакции
на предупреждение, которая задается аргументом <режим>. Последний может прини¬
мать значения debug, backtrace и verbose. Это соответствует включению режимов от¬
ладки, выдачи стека вызова М-функций или информации о том, как подавить появле¬
ние данного предупреждения. По умолчанию режимы debug и backtrace выключены
и имеют состояние off, а режим verbose - состояние on.
Рассмотрим ряд примеров.
Пример 1. Для того чтобы ввести режим отладки только для предупреждения с мет¬
кой Simulink:actionNotTaken (81тиПпк:обработка_не2поддержана), необходимо снача¬
ла подавить все сообщения о предупреждениях, а затем сделать активным предупреж¬
дение с меткой Simulink:actionNotTaken и включить режим отладки debug:
warning off all
warning on Simulink:actionNotTaken
warning on debug
В штатном режиме каждое сообщение, имеющее идентификатор, сопровождается
советом, как подавить вывод этого предупреждения на экран. Пользователь может по¬
давить вывод строки совета сразу, введя команду
warning off verbose
3. Программирование и отладка
161
6 т. Зак. 3375
Пример 2. Операция, в которой возникает деление на нуль, сопровождается следую¬
щим предупреждением и советом:
1/0
Warning: Divide by zero.
(Type "warning off MATLAB:divideByZero" to suppress this warning.)
ans = Inf
Подавим отображение строки совета:
warning off verbose
Тогда предшествующий фрагмент будет выглядеть так:
1/0
Warning: Divide by zero.
ans = Inf
Если при работе с операторами управления сообщениями использовать формат
функции, то. выходным аргументом будет массив записей, поля которого содержат
информацию об идентификаторе данного предупреждения и его состоянии:
s = warning('state'msg_id');
Этот синтаксис можно применять с любым оператором управления сообщениями,
но при этом структура выходного массива записей может быть различной.
Для того чтобы получить информацию о состоянии предупреждений достаточно
выполнить следующий оператор:
warning(1query',1all1)
The default warning state is 'on*. Warnings not set to the default are
State Warning -Identifier
off MATLAB:nonSealarConditional
off MATLAB:usinglongnames
В результате вы получаете информацию о том, что все предупреждения имеют со¬
стояние on и только 2 из них, указанные в специальной таблице, имеют состояние off.
Структура массива записей. Выходной массив записей содержит только 2 поля. Если
выполняется запрос о состоянии последнего по времени предупреждения, то массив
записей имеет размер 1x1 и выводится на экран в следующей форме:
warning off verbose
1/0
s = warning(*query1,1last1)
Warning: Divide by zero.
ans = Inf
s =
identifier: 'MATLAB:divideByZero'
state: 'on'
Если же запрос содержит метку 'а1Г, то возвращаемый массив записей имеет более
сложную структуру. В этом случае первый элемент массива содержит информацию
о состоянии всех предупреждений, соответствующую последнему применению одного
из операторов:
warning on all
warning off all
162
В. Г. Потемкин. Вычисления в среде MATLAB
Все последующие записи содержат информацию о предупреждениях, состояние
которых отлично от используемого по умолчанию. Например, если все предупрежде¬
ния имеют состояние off, то вектор состояния предупреждений будет следующим:
warning off all
warning on MATLAB:divideByZero
warning on MATLAB:fileNotFound
s = warning('query1,’all1)
s =
3x1 struct array with fields:
identifier
state
s (1)
ans
=
identifier:
’all’
state:
'off*
s(2)
ans
=
identifier:
'MATLAB:fileNotFound
state:
' on'
s(3)
ans
=
identifier:
'MATLAB:divideByZero
state:
' on'
В этом фрагменте все предупреждения имеют состояние off, за исключением двух
сметками 'MATLAB:divideByZero' и 'MATLAB:fileNotFound'. Поэтому результирую¬
щий массив записей для вектора состояния .предупреждений имеет размер 3x1 и со¬
держит описанную выше информацию.
Сохранение и восстановление вектора состояния предупреждений. Если вы хотите
на время изменить состояния некоторых предупреждений, а затем возвратиться к пер¬
воначальным установкам, то следует сохранить первоначальное состояние в массиве
записей оператором
s = warning('query','all');
и затем восстановить его с помощью оператора
warning(s)
Следует иметь в виду, что каждое последующее применение оператора warning
в формате
s = warning(’on’|’off<метка>’);
добавляет в массив s новую запись, но не стирает предыдущих. Замена переменной s
выполняется только при использовании опции 'query'. Например, текущий вектор со¬
стояния предупреждений имеет вид:
warning('query','all’)
The default warning state is 'off'. Warnings not set to the default are
State Warning Identifier
on MATLAB:divideByZero
on MATLAB:fileNotFound
3. Программирование и отладка
163
Сделаем активным еще один идентификатор сообщений 'Control :parameter-
NotSymmetric’. Для этого выполним оператор
s = warning('onControl:parameterNotSymmetric');
и убедимся, что массив записей s пополнился еще одной записью:
warning('query','all')
The default warning state is 'off'. Warnings not set to the default are
State Warning Identifier
on Control:parameterNotSymmetric
on MATLAB:divideByZero
on MATLAB:f ileNotFound
Перехват последнего по времени предупреждения. При работе с предупреждениями
в режиме on-line необходимо уметь перехватывать последнее по времени предупреж¬
дение. Для этого в системе MATLAB предусмотрена встроенная функция lastwam, ко¬
торая позволяет сохранить строку последнего по времени предупреждения в виде, на¬
пример, переменной
warnmsg = lastwarn;
Кроме того, можно изменить или обнулить строку последнего по времени сообще¬
ния, применяя операторы
lastwarn('newwarnmsg’); % Заменить строку сообщения
lastwarn; % Обнулить строку сообщения
Перехват и обработка ошибок. Наиболее эффективный способ программирования
ошибочных ситуаций - это использование блока перехвата и обработки ошибок
TRY ... CATCH ... END. Рассмотрим принцип его действия на примере умножения
двух матриц.
Поскольку умножение матриц подчиняется определенным условиям, в частности
требует, чтобы число строк и столбцов было согласовано, то для предотвращения воз¬
можных ошибок М-функция умножения матриц может включать следующий блок пе¬
рехвата и обработки ошибок:
function matrix..multiply (А, В)
try
X = А*В;
catch
disp '** Ошибка при умножении матриц А*В'
end
В этом блоке можно выделить 2 секции: try и catch.
• Инструкции в секции try - это инструкции штатного режима работы программы.
Однако если при их выполнении возникает ошибка, то управление передается сек¬
ции catch.
• Инструкции секции catch предназначены для обработки ошибок. Здесь выполняет¬
ся идентификация и формируется сообщение об ошибке.
В данном случае это универсальное сообщение, которое не указывает точную при¬
чину ошибки. Возможно, для ее устранения следует просто переставить матрицы мес¬
164
В. Г. Потемкин. Вычисления в среде MATLAB
тами. Тем не менее такой прием позволяет локализовать ошибку, которая может воз¬
никать при неправильном применении исходных данных. Действительно, при задании
следующих матриц возникает ошибка
А = [123; 672; 015];
В = [956; 049];
matгix_mu1tiply(А,В)
**0шибка при умножении матриц А*В
Идентификация ошибок. При возникновении ошибочной ситуации первое, что тре¬
буется знать, - это источник ошибки. В системе MATLAB для этого предусмотрены
операторы lasterr и lasterror, которые возвращают информацию о последней ошибке
в системе.
Как говорилось выше, для М-функции умножения матриц matrix_multiply источни¬
ком ошибки могут быть разные причины, например несогласованность размеров или
недопустимый тип данных. Если мы хотим различать такие ситуации, то должны про¬
анализировать последнее сообщение об ошибке lasterr.
Оператор lasterr. Оператор lasterr с одним выходным аргументом возвращает только
сообщение о последней по времени ошибке
errormsg = lasterr;
При указании двух выходных аргументов оператор lasterr возвращает как само сооб¬
щение, так и его идентификатор:
[errormsg, msg_icl] = lasterr;
Следующий пример демонстрирует использование оператора lasterr с одним вы¬
ходным аргументом.
function matrix_multiply (А, В)
try
А*В
catch
errmsg = lasterr;
if(strfind(errmsg,'Inner matrix dimensions'))
disp(’**He согласованы размеры матриц’)
else
if(strfind(errmsg,'not defined for values of class'))
disp('**O6a аргумента должны быть типа double')
end
end
end
При вводе матриц с несогласованными размерами будет выдано следующее сооб¬
щение об ошибке:
А = [1 2 3; 6 7 2; 0 1 5];
В = [956; 0 4 9];
matrix_multiply(А, В)
**Не согласованы размеры матриц
3. Программирование и отладка
165
В том случае, когда одним из аргументов оказался массив ячеек, будет выдано дру¬
гое сообщение:
С = {9 5 6; 0 4 9};
matrix__multiply (А, С)
★★ Оба аргумента должны быть типа double
Другой пример демонстрирует использование оператора lasterr с двумя выходными
аргументами. В этом случае идентификатор сообщения выполняет роль переменной
переключателя и в зависимости от значения этой переменной формируются разные
сообщения об ошибках.
try
[d,x] = my_readimage(image_file);
catch
[errmsg,msg_id] = lasterr;
switch (lower(msg_id))
case 'MATLAB:noSuchFile'
error('Файл "%s" не существует',image_file);
case 'myFilelO:noAccess'
error(['Can''t open file "%s" for reading\n', ...
'Нет разрешения на чтение файла'], filename);
case 'myFilelO:invFormat'
error('Неизвестный формат файла');
end
end
Оператор lasterror. Это новый оператор, который упрощает обработку последнего
по времени сообщения и делает процедуру более прозрачной. Его синтаксис предель¬
но прост:
s = lasterror
В отличие от оператора lasterr, он возвращает только один выходной аргумент s,
но этот аргумент является массивом записей. В настоящее время массив s имеет всего
2 поля:
Поле
Назначение
message
Текст сообщения об ошибке
identifier
Идентификатор сообщения
Разработчики системы MATLAB предполагают, что в последующих версиях сис¬
темы состав полей может быть расширен.
Так же, как и оператор lasterr, оператор lasterror допускает использование входного
аргумента. В этом случае пользователь может модифицировать последнее сообщение
об ошибке и его идентификатор, применяя оператор lasterror в следующей форме:
s = lasterror(err)
Входной аргумент err должен быть массивом записей такой же структуры,
как и вышеописанный массив s, но может содержать сообщение об ошибке на русском
языке и измененный идентификатор.
Для того чтобы упростить работу с новой структурой данных об ошибке, в состав
системы MATLAB 6.5 включен новый оператор - rethrow, который определяет явную
операцию вывода на экран модифицированных сообщений об ошибке. Технология ра¬
боты с этим оператором поясняется следующим фрагментом кода.
166
В. Г. Потемкин. Вычисления в среде MATLAB
try
<инструкции>
catch
<инструкции модификации сообщений>
rethrow(err)%вывод на экран модифицированного сообщения
end
Если при выполнении инструкций в секции try возникают ошибки, то они подвер¬
гаются обработке в секции catch, и в частности, это может быть связано с формирова¬
нием новых сообщений на русском языке. Новое сообщение необходимо записать
в поле структуры err, после чего с помощью оператора rethrow его можно вывести
на экран терминала.
Рассмотрим пример использования оператора lasterror в М-функции умножения
матриц matrix_multiply взамен оператора lasterr. Текст М-файла изменяется следую¬
щим образом согласно вышеописанной схеме:
function matrix—multiply (А, В)
try
А*В
catch
err = lasterror;
if(strfind(err.message, 'Inner matrix dimensions'))
err.message = '** Размеры матриц не согласованы’;
else
if(strfind(err.message, 'not defined for values of class'))
err.message = '** Оба аргумента должны быть типа doublet¬
end
end
rethrow(err)
end
Код стал более ясным, а результаты его применения к тем же вариантам с несогла¬
сованными размерами и типами входных матриц, конечно, дают тот же результат:
А = [1 2 3; б 7 2; 0 -1 5];
В = [956; 049];
matrix_multiplyl(А,В)
??? ** Размеры матриц не согласованы
С={1 2 3};
matrix_multiplyl(А,С)
??? ** Оба аргумента должны быть типа double
Операторы формирования предупреждений и сообщений
В этом разделе дана справочная информация о тех операторах, функциональное на¬
значение которых и способы программирования были описаны выше. Эта информация
точно соответствует спецификациям операторов, представленных в документации
[70-72] и справочной системе Help, соответствующих версии системы MATLAB 6.5
(Release 13).
3. Программирование и отладка
167
Предупреждение
warning]
Синтаксис:
warning(’<сообщение>’)
warning.(’ <сообщение> ’ , al, а2, . . . )
warning(’<метка>','<сообщение>’)
warning(’<метка>’, ’<сообщение>’,al, а2, ...,ап)
s = warning('<состояние><метка>’)
s = warning(’<состояние><режим>')
Описание:
Оператор waming(’<coo6njeHne>’) выводит на терминал текст предупреждения
по аналогии с оператором disp; отличие состоит в том, что вывод предупреждения мо¬
жет быть подавлен.
Оператор waming('<coo6njeHHe>', al, а2,...) выводит на терминал строку, в которой
применяются спецификаторы форматирования. При этом каждый спецификатор ис¬
пользует одно из значений из списка значений al, а2,...
Оператор warning('<MeTKa>,'<coo6njeHHe>') использует уникальную метку в виде
идентификатора сообщения, которая позволяет управлять выводом сообщения.
Оператор warning('<MeTKa>','<coo6njeHHe>', al, а2,..., ап) позволяет использовать
совместно и идентификатор сообщения и форматированную строку.
Функция s = \уагп^('<состояние>','<метка>') позволяет управлять выводом фор¬
мируемых предупреждений с помощью параметра <состояние>, который может при¬
нимать значения 'on', 'off или ’query’ в соответствии со следующей таблицей.
Значение параметра
<состояние>
Описание
on
Включить вывод отмеченных предупреждений
off
Запретить вывод отмеченных предупреждений на терминал
query
Отобразить текущее состояние отмеченного предупреждения
Управляющий аргумент <метка> здесь может принимать значения идентификатора
сообщения, 'all' или ’last'. Выходным аргументом s является массив записей, поля кото¬
рого содержат идентификатор сообщения и параметр <состояние>.
Функция s = \уат^('<состояние>','<режим>') позволяет задать режим работы
с предупреждением с помощью параметра <режим> согласно следующей таблице.
Значение параметра
<режим>
Описание
debug
Включить отладчик при возникновении предупреждения
backtrace
Отобразить стек вызовов
verbose
Вывести сообщение о том, как можно подавить отображение преду¬
преждения на экран
Примеры:
Сгенерировать предупреждение о том, что некоторая переменная pl должна быть
массивом символов.
168
В. Г. Потемкин. Вычисления в среде MATLAB
pl = magic(4) ;
if -ischar(pl)
warning(’Входная переменная должна быть массивом символов')
end
Warning: Входная переменная должна быть массивом символов
Сгенерировать предупреждение времени исполнения о том, что возникла коллизия
имен.
warning('MATLAB:paramAmbiguous',...
'Коллизия с именем М-функции %s','eps')
Используя идентификатор сообщения, обеспечить при работе системой Simulink
вывод только тех сообщений, которые имеют метку SimulinkractionNotTake.
warning off all
warning on Simulink:actionNotTake
Сопутствующие операторы. DBSTOP, DISP, ERROR, ERRORDLG, LASTERR,
LASTERROR, LASTWARN, SPRINTF, WARNDLG.
LASTWARN I Сообщение последнего по времени предупреждения
Синтаксис:
msgstr = lastwarn
[msgstr,msgid] = lastwarn
lastwarn('new.msgstr')
lastwarn('new_msgstr', 'new_msgid')
[msgstr,msgid] = lastwarn('newjnsgstr', 'new_msgid')
Описание:
Функция msgstr = lastwarn возвращает строку msgstr, которая содержит сообщение
последнего по времени предупреждения, выданного системой MATLAB.
Функция [msgstr, msgid] = lastwarn наряду с самим сообщением возвращает также
и идентификатор сообщения; если предупреждение не имеет идентификатора, возвра¬
щается пустая строка.
Оператор lastwam(’new_msgstr’) позволяет заменить сообщение другой строкой,
в том числе и пустой.
Оператор lastwam('new_msgstr', 'new_msgid') позволяет заменить как само послед¬
нее сообщение, так и его идентификатор.
Функция [msgstr, msgid] = lastwam(’new_msgstr’, 'new_msgid') заменяет последнее
сообщение и его идентификатор, возвращая в выходных переменных прежнее сооб¬
щение и его идентификатор.
Пример:
Сформируем следующее предупреждение, определив для него идентификатор.
warning off verbose
warning('MATLAB:divideByZero', 'Деление на нуль');
[warnmsg, msgid] = lastwarn
Warning: Деление на нуль
warnmsg = Деление на нуль
msgid - MATLAB:divideByZero
3. Программирование и отладка
169
Теперь заменим последнее сообщение и его идентификатор.
[warnmsg, msgid] = lastwarn(’Ошибка ШИТ ,’MEPhi:warning’)
warnmsg = Деление на ноль
msgid = MATLAB:divideByZero
Здесь в выходных аргументах действительно возвращается прежнее предупрежде¬
ние и его идентификатор. Однако последнее сообщение теперь имеет следующее со¬
держание:
[warnmsg, msgid] = lastwarn
warnmsg = Ошибка ППП
msgid = MEPhi:warning
Это обновленное предупреждение и его идентификатор.
Сопутствующие операторы'. ERROR, LASTERR, LASTERROR, WARNING.
TRY
Перехват и обработка ошибок
CATCH
END
Синтаксис:
try инструкции catch инструкции end
Описание:
Блок TRY ... CATCH ... END функционирует следующим образом: в нормальном
режиме выполняются только инструкции между операторами try и catch; если возни¬
кает ошибка, то она перехватывается одним из операторов lasterr или lasterror и начи¬
нают выполняться инструкции между операторами catch и end. Если возникает ошибка
при выполнении этих инструкций, то выполнение будет приостановлено, если только
эта Ошибка не будет перехвачена другим блоком TRY ... CATCH. При этом сообщение
о новой ошибке может быть также получено с помощью функций lasterr или lasterror.
Начиная с версии MATLAB 6.5 изменилось действие быстрых клавиш прерывания
Ctl+C. Если в предшествующих версиях системы прерывание Ctl+C приводило
к переходу в соответствующую секцию catch, то теперь такое прерывание передает
управление окну Command Window. Ниже приведен пример кода, который в предше¬
ствующих версиях не мог быть прерван.
for к = 1:100
try
pause(0.1);
catch
end
end
Сопутствующие операторы'. EVAL, EVALIN, CATCH, END.
170
В. Г. Потемкин. Вычисления в среде MATLAB
ERROR
Сообщения об ошибках
Синтаксис:
error('<сообщение>’)
error('<сообщение>al,а2, ...)
error(’<метка>',’<сообщение>')
error(’<метка>’г ’<сообщение>',al,а2, .. . )
Описание:
Оператор еггог(’<сообщение>’) выводит на экран терминала сообщение об ошибке
и передает управление окну Command Window или клавиатуре в режиме отладки.
Оператор еггог('<сообщение>’, al, а2,...) выводит на терминал строку, в которой
применяются спецификаторы форматирования. При этом каждый спецификатор ис¬
пользует одно из значений списка al, а2,...
Оператор еггог(’<метка>,’<сообщение>’) использует уникальную метку в виде иден¬
тификатора сообщения, которая позволяет задействовать процедуры обработки оши¬
бок и управлять выводом на экран сообщений об ошибках.
Оператор еггог(’<метка>','<сообщение>’, al, а2,..., ап) позволяет при обработке
ошибок и выводе сообщений использовать совместно и идентификатор сообщения
и форматированную строку.
Пример:
Сформировать сообщение об ошибке при выполнении М-функции с именем foo,
включив в него метку ’foorinputerror'.
function foo(x,y)
if nargin ~= 2
error('foo:inputerrorНеверное число входных параметров')
end
Тогда при вызове М-функции с одним входным аргументом будет сгенерировано
предусмотренное пользователем сообщение об ошибке.
foo(pi)
??? Error using ==> foo
Неверное число входных параметров
[errmsg, msgid] = lasterr
errmsg =
Error using ==> foo
Неверное число входных параметров
msgid = foo:inputerror
Сопутствующие операторы: DBSTOP, ERROR, LASTERR, LASTERROR, TRY, CATCH.
3. Программирование и отладка
171
LASTERR,
LASTERROR
Сообщение о последней по времени ошибке
Синтаксис:
msgstr = lasterr s = lasterror
[msgstr, msgid] = lasterr s = lasterror(err)
lasterr('new_msgstr')
lasterr('new_msgstr','new_msgid')
[msgstr,msgid] = lasterr('new_msgstrnew_msgid')
Описание:
Функция msgstr = lasterr возвращает строку msgstr, которая содержит сообщение
последней по времени ошибке, зафиксированной системой MATLAB.
Функция [msgstr, msgid] = lasterr наряду с самим сообщением возвращает также
и идентификатор сообщения; если сообщение об ошибке не имеет идентификатора,
возвращается пустая строка.
Оператор lasterr('new_msgstr') позволяет заменить сообщение об ошибке другой
строкой, в том числе на русском языке или пустой.
Оператор lasterr(’new_msgstr', ’new_msgid’) позволяет заменить как само последнее
сообщение об ошибке, так и его идентификатор.
Функция [msgstr, msgid] = lasterr(’new_msgstr’, ’new_msgid') заменяет последнее со¬
общение об ошибке и его идентификатор, возвращая в выходных переменных прежнее
сообщение и его идентификатор.
Обычно оператор lasterr используется в блоках TRY...CATCH...END, где перехва¬
тываются сообщения об ошибках, анализируются и выполняются соответствующие
действия по их корректировке.
Оператор s = lasterror возвращает массив записей s, который содержит информацию
о последней по времени ошибке, зафиксированной системой MATLAB. Этот массив
записей в настоящее время содержит 2 поля:
s.message - текст сообщения об ошибке;
s.identifier - идентификатор сообщения.
Оператор s = lasterror(err) заменяет последнее сообщение об ошибке и его иденти¬
фикатор, возвращая в выходном массиве записей прежнее сообщение и его идентифи¬
катор.
Пример:
Рассмотрим еще один пример использования оператора lasterror в М-функции ум¬
ножения матриц matrix_multiply. Введем в текст М-функции matrix_multiply ряд изме¬
нений.
function С = matrix_multiply(А,В)
try
С = А*В;
catch
err = lasterror;
if(strfind(err.message, 'Inner matrix dimensions'))
err.message = ’** Размеры матриц не согласованы';
172
В. Г. Потемкин. Вычисления в среде MATLAB
else
if(strfind(err.message, 'not defined for values of class’))
err.message = '** Оба аргумента должны быть типа double';
end
end
newmessage = err.message
newidentifier = err.identifier.
s = lasterror(err);
oldmessage = s.message
oldidentifier = s.identifier
rethrow(err)
end
Во-первых, здесь введен выходной аргумент С, который присваивается только при
безошибочной работе процедуры; во-вторых, введены следующие операторы в тело
секции catch для пояснения работы оператора lasterror с выходным аргументом:
newmessage = err.message
newidentifier = err.identifier
s = lasterror(err);
oldmessage = s.message
oldidentifier = s.identifier
Рассмотрим, как выполняется этот М-файл для различных вариантов входных данных.
Допустим, входные данные согласованы как по размеру, так и по типу.
А = [1 2 3; б 7 2; 0 -1 5];
В = [9 5; б 0; 4 9] ;
С = matrix_multiplyl (А, В)
С =
33
32
104
48
14
45
Ответ: М-функция выполняет умножение матриц абсолютно правильно.
Допустим, входные данные не согласованы по размеру, но согласованы по типу.
А = [1 2 3; б 7 2; 0 -1 5];
В = [9 5 б; 0 4 9];
С = matrix_multiplyl(А,В)
newmessage = ** Размеры матриц не согласованы
newidentifier = MATLAB:innerdim
oldmessage =
Error using ==> *
Inner matrix dimensions must agree.
oldidentifier = MATLAB:innerdim
??? ** Размеры матриц не согласованы
Ответ: Мы действительно убеждаемся, что при возникновении ошибки в системе
MATLAB формируется сообщение об ошибке на английском языке, но в результате
обработки в секции catch оно преобразуется в сообщение на русском языке, которое
3. Программирование и отладка
173
присвоено полю массива err.message. Оператор rethrow(err) выводит это сообщение
на терминал. Для пояснения работы оператора s = las terror (err) выведена следующая
информация: новое сообщение об ошибке на русском языке newmessage, новый иден¬
тификатор сообщения newidentifier, который не изменялся, а также поля выходного
массива записей oldmessage и oldidentifier.
Наконец, допустим, что входные данные согласованы по типу, но не согласованы
по размеру.
С={1 2 3};
С = matrix_multiplyl(А,С)
newmessage = ★★ Оба аргумента должны быть типа double
newidentifier = ''
oldmessage =
Error using ==> *
Function is not defined for values of class ’cell’,
oldidentifier = '’
??? ★★ Оба аргумента должны быть типа double
Ответ: Мы убеждаемся, что при возникновении ошибки формируется сообщение
на английском языке, но в результате обработки в секции catch оно преобразуется
в сообщение на русском языке, которое присваивается полю массива err.message. Опе¬
ратор rethrow(err) выводит это сообщение на терминал. Что касается работы оператора
s = lasterror(err), то новое сообщение об ошибке соответствует переменной
newmessage, новый идентификатор сообщения newidentifier не изменился и соот¬
ветствует пустому массиву.
Сопутствующие операторы'. CATCH, ERROR, RETHROW, TRY, WARNING.
RETHROW Вывод на экран переработанного сообщения об ошибке
Синтаксис:
rethrow(err)
Описание:
Оператор rethrow(err) выводит на экран переработанное в секции catch сообщение
об ошибке; при включенной звуковой плате это действие сопровождается звуковым
сигналом. Исполнение текущего М-файла прекращается, и управление передается ок¬
ну Command Window. Входная переменная err - это массив записей, содержащий
2 поля:
err.message - текст сообщения об ошибке;
errcidentifier - идентификатор сообщения.
Основное назначение этого оператора - применение его в секции catch для вывода
переработанных пользователем сообщений об ошибках, например переведенных
на русский язык.
Сопутствующие операторы: DBSTOP, ERROR, LASTERR, LASTERROR, TRY, CATCH.
174
В. Г. Потемкин. Вычисления в среде MATLAB
MFILENAME
Имя последнего вызванного М-файла
Синтаксис:
mfilename
р = mfilename('fullpath')
с = mfilename('class' ) ,
Описание:
Оператор mfilename возвращает строку с именем исполняемого М-файла, если об¬
ращение к этому оператору выполнено в операционной среде М-файла. Если вызов
выполнен из командной строки окна Command Window, то возвращается пустая
строка.
Функция р = mfilename('fullpath') возвращает полный путь доступа к исполняемому
М-файлу.
Функция с = mfilename(’class'), если она вызвана в операционной среде некоторого
метода, возвращает класс объекта. Если вызов выполнен вне среды метода, то возвра¬
щается пустая строка.
Пример:
Установим контрольную точку в теле М-функции matrix_multiply и после останова
в режиме управления с клавиатуры определим имя и полный путь доступа к испол¬
няемому М-файлу.
С = matrix—multiply(А,В)
К>> mfilename
ans = matrix_multiply
К>> mfilename (’ fullpath1)
ans = C:\MATLAB6p5\work\matrix_multiply
Полученные ответы полностью соответствуют описанию оператора mfilename.
Сопутствующие операторы: DBSTACK, FUNCTION, NARGIN, NARGOUT,
INPUTNAME.
3.5. Отладка и профилирование М-файлов
Отладка программного кода - это процесс, направленный на выявление неизбеж¬
ных ошибок, возникающих при написании программ. Встречаются ошибки двух видов:
• синтаксические, связанные с неточностью записи имен переменных, М-функций
или использования скобок в арифметических выражениях;
• ошибки времени выполнения, которые, как правило, имеют алгоритмическую при¬
роду и проявляются в том, что приводят к неправильным результатам.
Система MATLAB обнаруживает большинство синтаксических ошибок, сопровож¬
дая их сообщениями и указанием номера строки соответствующего М-файла. Такие
ошибки достаточно легко поддаются исправлениям. Ошибки времени исполнения вы¬
явить более сложно, потому что рабочая область М-функции может оказаться недос¬
3. Программирование и отладка
175
тупной, если, например, ошибка привела к возврату в рабочую область системы
MATLAB. Чтобы определить причину такой ошибки можно использовать один из сле¬
дующих приемов:
• Вывести результаты промежуточных вычислений на дисплей, включив режим echo on.
• Добавить в М-файл операторы keyboard, которые останавливают выполнение М-
файла и разрешают проверить и изменить переменные рабочей области вызывае¬
мой М-функции. В этом режиме появляется специальное приглашение
к»
Продолжить выполнение приостановленной М-функции можно оператором return;
выйти из режима ручной отладки можно с помощью команды dbquit.
• Закомментировать заголовок функции и исполнить М-файл как сценарий. Это по¬
зволяет проследить результаты промежуточных вычислений, используя рабочую
область системы.
• Использовать для отладки инструментальное средство Debugger.
Режимы ручной отладки, характерные для первых трех способов, в этой книге рас¬
сматриваться не будут. Отсылаем читателя к прежним изданиям [1-2]. Здесь же ос¬
новное внимание уделено работе в режиме графического интерфейса.
Инструментальное средство Editor/Debugger
Программирование в системе MATLAB предполагает обязательное выполнение
операций по созданию, редактированию и отладке М-файлов. Для удобства работы
пользователя в системе MATLAB 6 все эти операции реализованы в режиме графиче¬
ского интерфейса с использованием редактора/отладчика Editor/Debugger. Описание
редактора Editor дано в прил. 2, а здесь детально рассмотрен режим отладки.
Отладчик Debugger предназначен для выявления ошибок при программировании
на языке MATLAB. С его помощью можно просматривать состояние рабочей области,
стек вызова М-функций, выполнять код М-файла построчно.
Отладчик полезен для исправления ошибок во время выполнения программы
именно потому, что он дает возможность отслеживать переменные и их значения в ра¬
бочих областях разных М-функций и, если необходимо, изменять эти значения. От¬
ладчик позволяет устанавливать и удалять контрольные точки, т. е. специальным обра¬
зом помеченные строки М-файла, в которых приостанавливается его выполнение.
Запуск отладчика. Для запуска Editor/Debugger предусмотрена команда edit с раз¬
личными опциями. Здесь мы приведем наиболее употребительные синтаксические
формы.
edit
edit <имя_М-файла>
Команда edit открывает окно редактора/отладчика, а вторая команда открывает
также М-файл с указанным именем.
Окно Editor/Debugger показано на рис. 3.33.
176
В. Г. Потемкин. Вычисления в среде MATLAB
1C:\MATLAB6p5\work\collatz.m
Stack: collatz
collatz
function sequence=collatz(n)
% Задача Кадлатца.
•z Сгенерировать последовательно с ть целы?: чисел, сходящихся к 1
ледующ^йу правилу:
если п четно;
% 3»п + 1, если п нечетно.
% Продолжать до тех пор, пока результат не станет равным 1.
File Edit View Text Debug Breakpoints Web Window Help
next_value = 3*next_value+l;
next_value = п;
while next_value > 1
if rem(next_value,2)==0
next_value = next_value/2;
sequence = [sequence, next_value];
рис. 3.33
Для работы в режиме отладки можно использовать либо опции основного меню Debug
и Breakpoints, либо кнопки инструментальной панели, показанные отдельно на рис. 3.34.
I £4 Л j £=] Й : <© И? О О | Stadc [variance
рис. 3.34
Иконки отладки на инструментальной панели имеют следующее назначение:
Иконка
&
Find text
Описание
Найти заданный текст
Показать список подфункций данной функции
Show function
SeVcIear breakpoint
Clear all breakpoints |
s
Step in
Установить/удалить контрольную точку в той строке, на которой нахо¬
дится курсор
Удалить все контрольные точки
Выполнить одну строку кода
Войти в тело вызываемого модуля
3. Программирование и отладка
177
Иконка
Описание
J
Г
Step out
Перейти в вызывающий модуль
о|
| Continue
Продолжить выполнение М-файла до его завершения или до следую¬
щей контрольной точки
jf
il
Exit Debug Mode
Завершить процедуру отладки
Stack:
1
jsqsum IBS
Стек вызываемых модулей
sqsum
variance
Base
В примере отладки, который мы рассмотрим ниже, будет показано, как использо¬
вать кнопки инструментальной панели.
Действия, аналогичные применению кнопок инструментальной панели, можно реа¬
лизовать с помощью опций меню Debug и Breakpoints.
Меню Debug (рис. 3.35)содержит опции, которые позволяют управлять процессом
отладки.
{Э/ C:\MATLAB6p5\work\collatz.m
I Debug
Step
F10
Step In
Fit
Step Out
Shift+FU
Continue
F5
Go Until Cursor
Exit Debug Mode
рис. 3.35
Первые 4 опции этого меню дублируют кнопки инструментальной панели; 5-я оп¬
ция является новой и позволяет продолжить выполнение М-функции до той строки,
в которой в настоящее время находится курсор; 6-я опция дублирует соответствую¬
щую кнопку инструментальной панели.
Меню Breakpoints (рис. 3.36) содержит опции, которые позволяют установить или
очистить контрольные точки, а также приостановить выполнение М-файла при опре¬
деленных обстоятельствах.
|Э/ C:\MATLAB6p5\work\collatz.m
I Breakpoints
Set/Clear Breakpoint Fl2
Clear All Breakpoints
Stop If Error
Stop If Warning
Stop If NaN Or Inf
Stop If All Error
рис. 3.36
178
В. Г. Потемкин. Вычисления в среде MATLAB
Первые 2 опции этого меню дублируют кнопки инструментальной панели; остав¬
шиеся 4 позволяют приостановить выполнение М-файла в определенных ситуациях.
Опция
Ситуация
Stop if Error
При возникновении любой ошибки, кроме ошибок в блоках
TRY... CATCH
Stop if Warning
При появлении предупреждения
Stop if NaN or Inf
При появлении результата типа NaN или Inf
Stop if Error
При возникновении любой ошибки, в том числе и ошибок в блоках
TRY... CATCH
Кроме перечисленных выше возможностей, при отладке программы можно исполь¬
зовать контекстное меню, вызываемое щелчком правой кнопкой мыши в окне отлад¬
чика (рис. 3.37).
Cut w
Сору
Paste
Format Selected Comments
Comment
Uncomment
Smart Indent
Set/Clear Breakpoint
Go Until Cursor
рис. 3.37
Всплывающее при этом меню содержит следующие опции, относящиеся как к ре¬
жиму редактирования М-файла, так и к его отладке:
3. Программирование и отладка
179
• Evaluate Selection - вычислить выделенный фрагмент;
• Open Selection - открыть выделенный М-файл в окне редактора;.
• Help on Selection - дать справку о выделенном операторе;
• Cut - вырезать фрагмент М-файла;
• Сору - копировать фрагмент М-файла;
• Paste - вставить текст из буфера;
• Format Selected Comments - форматировать выделенный комментарий;
• Comment - закомментировать выделенный фрагмент программы;
• Uncomment - снять комментарий с выделенных строк программы;
• Smart Indent - задать отступы в операторах программы;
• Set/Clear Breakpoints - установить/очистить контрольные точки;
• Go Until Cursor - продолжить выполнение до строки, в которой размещен курсор.
Последние 2 опции относятся к режиму отладки, остальные - к режиму редактиро¬
вания.
Сеанс отладки
М-функция variance(x) предназначена для вычисления несмещенной оценки дис¬
персии некоторой последовательности чисел. Эта функция, в свою очередь, вызывает
подфункцию sqsum(x,mu), которая вычисляет сумму квадратов элементов центриро¬
ванной последовательности:
function у = variance(х)
% Вычислить несмещенную оценку дисперсии
% последовательности чисел х
mu = sum(х)/length(х);
tot = sqsum(x,mu);
у = tot/(length(mu)-1);
%
function*tot = sqsum(x,mu)
% Вычислить сумму квадратов элементов
% центрированной последовательности
tot = 0;
for i = 1:length(mu)
tot = tot + ((x(i)-mu)л2);
end
Проверим правильность работы этих М-функций, взяв за эталон М-функцию std,
которая вычисляет среднеквадратическое отклонение заданной последовательности
чисел.
Сформируем следующий тестовый вектор:
v = [12345];
180
В. Г. Потемкин. Вычисления в среде MATLAB
Вычислим дисперсию, используя функцию std.
varl = std(v)A2
varl = 2.5
Теперь вычислим дисперсию, используя написанную нами функцию variance.
myvarl = variance(v)
myvarl = variance(v)
Warning: Divide by zero.
> In C:\MATLAB6p5\work\variance.m at line 5
myvarl = Inf
Ответ неверен и сопровождается предупреждением о делении на нуль в строке 5.
Воспользуемся отладчиком, чтобы найти ошибку или ошибки в приведенных выше
М-функциях.
Для подготовки к отладке необходимо:
1. Запустить редактор/отладчик с помощью оператора
edit variance % рис. 3.38
рис. 3.38
В результате откроется окно редактора/отладчика, которое показано на рис. 3.38,
с указанием, что М-функция variance содержит подфункцию sqsum. Обратите вни¬
мание: все исполняемые строки М-функций помечены символом (-). Заголовки
функций, комментарии, пустые строки являются неисполняемыми.
2. Если файл корректировался, то необходимо сохранить все внесенные изменения,
используя кнопку инструментальной панели Save.
3. Если М-функция использует файлы, размещенные в других каталогах, необходимо,
чтобы все они находились на пути доступа.
Установка контрольных точек. Сеанс отладки начинается с установки контрольных
точек. Контрольные точки позволяют приостановить выполнение М-файла в указан¬
3. Программирование и отладка
181
ных строках и просмотреть или изменить значения переменных. Красный знак
рядом со строкой указывает, что контрольная точка установлена в этой строке. Если
строка, выбранная для контрольной точки, является неисполняемой, то знак контроль¬
ной точки переносится на ближайшую исполняемую строку. Для того чтобы задать
контрольную точку, установите курсор в нужной строке и нажмите клавишу Set/Clear
Breakpoint инструментальной панели. Другие способы - выбрать опцию Set/Clear
Breakpoint из меню Debug либо эту же опцию из контекстного меню, вызываемого
щелчком правой кнопки мыши.
Может оказаться, что знаки контрольных точек окрашены в серый, а не в красный
цвет. Этому могут быть две причины:
• В режиме установки контрольных точек это означает, что в тексте программы есть
синтаксические ошибки, и в строке окна Command Window появляется сообщение
об ошибке.
• Если контрольные точки уже были установлены, а в текст вносилась правка, то это
означает, что измененный файл не был сохранен. Сохраните файл, и точки изменят
цвет на красный.
Установим контрольную точку в первой исполняемой строке модуля variance и за¬
пустим его на выполнение.
myvarl = variance(v)
Исполнение М-функции приостановлено перед выполнением строки 3 (рис. 3.39).
рис. 3.39
Слева от текста появляется горизонтальная стрелка, которая указывает на текущую
строку, которая будет выполнена на следующем шаге. Выполним по шагам все 3 инст¬
рукции М-функции variance и остановимся перед выходом из этой функции (рис. 3.40).
182
В. Г. Потемкин. Вычисления в среде MATLAB
I ty C:\MATLAB6p5\work\variance.m
I Stack: variance
File Edit View Text Debug Breakpoints Web Window Help
1
2
3
4
5
6
7
8
9
10
11
12
function у = variance(x)
% Вычислить несмещенную оценку дисперсии
% последовательности чисел х
mu = sum(х)/length(х);
tot = sqsum(x,mu);
У = tot/
(length(mu)-1);
О
У =
Inf
function tot = sqsum(x,mu)
те Вычислить сумму квадратов элементов
% центрированной последовательности
tot = 0;
i = 1:length(mu)
tot = tot + ((x(i)-mu)A2);
^variance
Стрелка, направленная вниз, указывает на останов при выходе из М-функции.
Здесь же выполнена проверка значения переменной у.
Проверка переменных. В режиме отладки проверка значения переменной может
быть выполнена простым указанием курсора на эту переменную. В данном случае пе¬
ременная у имеет бесконечное значение Inf. Причиной этого является деление на нуль.
Следовательно, величина length(mu) равна 1, а должна быть равна длине последова¬
тельности х. Отсюда делаем вывод, что оператор length(mu) надо заменить на оператор
length(x).
Выполним еще один шаг и выйдем из модуля variance и, следовательно, из режима
отладки. Заменим переменную mu на переменную х (рис. 3.41).
| 9) C:\MATLAB6p5\work\variance.m*
-ia|xi
File
Edit View Text Debug Breakpoints Web Window
Help
DO : а Л Л
0 © < 10 ■
stack 1 ’ 1 x
1
function у = variance(x)
л
2
% Вычислить несмещенную оценку дисперсии
3
% последовательности чисел х
4
О
mu = sum(х)/length(х);
5
-
tot = sqsum(x,mu);
6
у
у = tot/(length(x)-1);
8
%
9
function tot = 3qsum(x,mu)
10
Ч Вичмстпъ сунму квадратов элементов
11
% центрированной последовательности
12
-
tot = 0;
13
-
for i = 1:length (mu)
14
-
tot = tot + ((x(i)-mu)A2);
15
-
end
—
<1 1
лГ
[variance
Ln 6 Col1S
рис. 3.41
3. Программирование и отладка
183
Цвет контрольной точки изменился на серый, что означает необходимость сохра¬
нить исправленный модуль. Сохраним откорректированный модуль и вновь запустим
на выполнение.
Теперь значение дисперсии стало конечным и равным 1 (рис. 3.42).
.JOI*]
C:\MATLAB6p5\work\variance.m
’ Stack: [variance
■
I!
File Edit View Text Debug Breakpoints Web Window Help
tot = sqsum(x,mu)
variance
function у = variance(x)
Ч Вычислить несмещенную оценку дисперсии .
последовательности чисел х
mu = sum(х)/length(х);
tot = sqsum(x,mu);
tot/(length(x)-l);
1
2
3
4
О
5
-
6
-
7
8
9
10
11
12
-
13
-
14
-
15
function
% Вычислить сумму квадратов элементов
% центрированной последовательности
tot = 0;
i = 1:length(mu)
tot = tot + ((x(i)-mu)Л2);
Однако по-прежнему это значение не равно 2.5 и, следовательно, в программе есть
еще какие-то ошибки. Видимо, неверно вычислено значение tot, которое должно быть
равно 10. Проверим это (рис. 3.43)..
File Edit View Text Debug Breakpoints Web Window Help
| Sy C:\MATLAB6pS\work\variance.rn
variance
function у = variance(x)
Вычислить несмещенную оценку дисперсии
Ч последовательности чисел х
mu = sum(х)/length(х);
tot = sqsum(x,mu); .
у = tot/(length(x) -1);
1
2
3
4
е
5
-
6
-
7
8
9
10
11
12
-
13
-
14
-
15
fline11 on tot = sqsum(x,mu)
Вычислить сумму квадратов элементов
% центрированной последовательности
tot = 0;
for i = l:length(mu)
tot = tot + ((x(i)-mu)A2);
рис. 3.43
Действительно, это значение вместо 10 равно 4, и это означает, что ошибка кроется
в модуле sqsum.
184
В. Г. Потемкин. Вычисления в среде MATLAB
Просмотр рабочих областей. Для просмотра содержимого рабочих областей следует
использовать ниспадающее меню Stack в правом верхнем углу окна отладчика. Оно
позволяет просматривать содержимое рабочей области М-функции variance.m, под¬
функции sqsum и рабочей области Base системы MATLAB (рис. 3.44).
File Edit View Text Debug Breakpoints Web Window Help
|ЭД C:\MATLAB6p5\work\variarrce.m
sqsum
function у = variance(x)
% Вычислить несмещенную оценку дисперсии
% по с ле до е ат ель. нести чисел х
mu = sum(х)/length(х);
с> tot = sqsum(х,mu);
у = tot/(length(х)-1);
function tot = sqsum(x,mu)
Ч Вычислить сумму квадратов элементов
% центрированной последовательности
= 0;
i = 1:length(mu)
tot = tot + ((x(i)-mu)A2);
’variance/sqsum
Состояние процесса отладки, зафиксированное на рис. 3.44, соответствует моменту
выхода из подфункции sqsum. В этот момент доступен просмотр переменных в любой
из рабочих областей, поскольку модуль sqsum является самым внутренним в стеке вы¬
зовов. В рабочей области модуля sqsum определены 4 переменные; для их просмотра
можно использовать редактор массивов Array Editor, который открывается в окне
Workspace с помощью опции Open контекстного меню. Значение переменной цикла i
при выходе из модуля sqsum оказывается равным 1, т. е. цикл выполнен только один
раз. Таким образом, цикл выполняется только до значения, равного длине скаляра mu,
а не длине входного вектора х.
3. Программирование и отладка
185
Корректировка программы. Для исправления кода необходимо в строке 13 заменить
переменную mu на переменную х. Текст откорректированной программы показан
на рис. 3.45.
рис. 3.45
Завершение процесса отладки. После внесения изменений необходимо сохранить
исправленный текст, снять все контрольные точки и запустить М-файл variance на вы¬
полнение, предусмотрев останов программы по следующим условиям из меню Break¬
points:
• Stop If Error
• Stop If Warning
• Stop If NaN Or Inf
myvarl = variance(v)
myvarl = 2.5
В результате получен правильный ответ. На этом отладку программы можно счи¬
тать завершенной.
Профилирование М-файлов
После завершения отладки программы или комплекса программ наступает время
их тестирования и оценки времени выполнения. Процедура измерения затрат времени
на выполнение программы называется профилированием.
Результаты таких измерений часто оказываются неожиданными, поскольку выяс¬
няется, что затраты времени максимальны вовсе не там, где предполагалось. Отсюда
следует, что первоначальную реализацию программы надо делать настолько простой
и прозрачной, насколько это возможно, а затем использовать профилировщик, чтобы
выявить критические участки, если быстродействие действительно является главным
показателем эффективности создаваемой программы. Преждевременная оптимизация
исходной программы может усложнить код, не обеспечив реального повышения про¬
изводительности.
186
В. Г. Потемкин. Вычисления в среде MATLAB
Профилирование помогает выявить М-функции с большим временем исполнения
и минимизировать частоту их вызова. Часто профилирование помогает выявить про¬
блемы, разрешить которые возможно:
• отказом от лишних вычислений;
• корректировкой алгоритма, чтобы избежать вызова неэффективных М-функций;
• отказом от многократных повторных вычислений за счет запоминания результатов
для последующего применения.
Конечная цель профилирования состоит в том, чтобы повысить быстродействие
программы. Как только достигается состояние, когда наибольшее время тратится
на обращения к малому числу встроенных функций, то это означает, что достигнута
оптимизация кода.
В системе MATLAB 6.5 реализовано 2 режима профилирования: графического ин¬
терфейса и командный.
Режим графического интерфейса
В состав версии MATLAB 6.5 включено новое инструментальное средство для
оценки производительности программ - профилировщик Profiler. Он позволяет опре¬
делить время, затрачиваемое на вычисление каждой строки программы, и тем самым
оценить эффективность программирования на языке MATLAB.
Вызов профилировщика. Запустить ИС Profiler можно либо с помощью опции Pro¬
filer меню View, либо командой profile viewer из окна Command Window. В результа¬
те откроется окно Profiler, показанное на рис. 3.46.
рис. 3.46
Основное меню ИС Profiler практически совпадает с меню системы MATLAB.
Следует лишь обратить внимание на опцию Dock Profiler меню View, которая позво¬
ляет разместить окно Profiler на рабочем столе системы MATLAB. В ряде случаев это
может оказаться удобным.
3. Программирование и отладка
187
Для того чтобы осуществить профилирование М-файла, необходимо выполнить
следующие шаги:
• В поле Run this code указать имя М-файла сценария или функции, для которого
будет выполняться профилирование.
Start Profiling [ Run this code: |immsnae2 Ф Profile time: 7 sec
В данном примере это сценарий решателя систем нелинейных алгебраических
уравнений с двумя переменными:
immsnae2
• Для запуска профилировщика следует нажать клавишу Start Profiling.
Пока профилировщик работает, индикатор Profile time окрашен в зеленый цвет
и ведется отсчет времени исполнения в секундах:
О Profile time: 2 sec
Когда профилировщик завершит работу, индикатор будет окрашен в черный цвет,
а надпись будет указывать полное число целых секунд:
Ф Profile time: 7 sec
При этом в окне профилировщика появится отчет Profile Summary (рис. 3.47).
рис. 3.47
Желающие ознакомиться с пакетом прикладных программ для решения систем
нелинейных алгебраических уравнений могут обратиться к работе [2].
188
В. Г. Потемкин. Вычисления в среде MATLAB
Отчет Profile Summary. Это обобщенный отчет, в котором фиксируется время вы¬
полнения, количество модулей, вызываемых сценарием решателя, в данном случае
128 различных модулей, включая встроенные М-функции. Затем следует таблица вы¬
зываемых модулей в порядке убывания времени их работы. Столбцы этой таблицы со¬
держат имя файла, тип файла, количество вызовов, суммарное время их работы и диа¬
грамму относительного времени работы.
В рассматриваемом примере использованы разные типы файлов: сценарии M-script,
функции M-function, подфункции M-subfunction, функции смешанного программиро¬
вания MEX-function, в данном случае это функции системы Maple. На рис. 3.47 приве¬
дены только те функции, время работы которых превышает 0.200 с.
Теперь можно проанализировать время работы каждой М-функции. Для этого дос¬
таточно кликнуть на имени функции - и появится ее профиль. На рис. 3.48 показаны
первый и часть второго раздела отчета для главного сценария immsnae2.
рис. 3.48
Детальный отчет. Детальный отчет включает много важной информации и должен
быть внимательно изучен. Этот отчет содержит несколько разделов.
Первый раздел включает следующую информацию: первая строка содержит имя
модуля, количество вызовов и полное время работы
immsnae2 (1 call, 7.601 sec)
3. Программирование и отладка
189
затем следуют:
время генерации отчета
Generated 12-Feb-2003 22:27:56
место размещения файла
М-script in file е:\рvg\ia n et\i a spXsn a e i bn\im m s n a e2. m
и рекомендация сделать копию отчета, чтобы можно было сравнивать затраты времени
на разные прогоны
' [Copy to new window for comparing multiple runs]
Второй раздел отчета представлен на рис. 3.49.
Parents (calling functions) I table I list I hide l
No parent
Lines where the most time was spent I table I list I hide I
Line Number
Code
Calls
Total Time
j % Time
Time Plot
1277
[result, accuracy, elapse...
1
3.475 s
45.7%
17
input_num=input(1 Set numb...
1
2.894 s
38.1%
4
figure(1), elf
1
0.301 s
4.0%
1
1132
fl=xA5-yA3*xA3+a;
1
0.240 s
3.2%
1
1127
syms x у a
1
0.181 s
2.4%
1
All other lines
0.510 s
6.7%
I
Totals
7.601 s
■ 100% :
Children (called functions) I table I list I hide l
tmixsnae2 (43.9%). sym/mpower (2.8%). sym/display (1.6%). syms (1.3%1 elf (1.1%). gcbf (0.5%). sym/plus
(0.3%), sym/mtimes (0.3%), figtoolset (0.1 %), sym/rninus (0.1 %), blanks
рис. 3.49
Он включает перечень функций, вызывающих данный модуль (calling functions),
Parents (calling functions) [ table I list I hide 1
No parent
Этот перечень может быть представлен в виде таблицы (table), в виде списка (list) либо
скрыт (hide). В данном случае это головной сценарий, и он не имеет родителя -
No parent.
Далее в разделе следует таблица или список тех строк модуля, которые имеют наи¬
большее время выполнения. В данном примере эта информация представлена в виде
таблицы со следующими столбцами: номера строки, текста строки, количества вызо¬
вов, времени выполнения, доли времени в процентах к общему времени работы данно¬
го модуля.
Последняя часть раздела содержит информацию о вызываемых модулях (called
functions), которая в данном примере представлена в виде списка.
Третий раздел отчета содержит листинг М-файла immsnae2 (рис. 3.50).
190
В. Г. Потемкин. Вычисления в среде MATLAB
File listing
Color highlight code according to I Time I Number of Calls I Coverage I Acceleration I No Color 1
time cal Is acc line
J Script ij
0.030
1
О. 120
1
0.220
1
X
1
1
0.000
1
0.010
1
_Х
0. ООО
1
0.000
1
0.000
1
3 clear all
4 figure(1), elf
5 figure(2), elf
6 echo off all
7 global flagreal
8 flagreal=O
9 global plex
10 plex=0
12 F-[];
13 accuracy=le8;
% input__num= input ('Введите номер задачи ')
2.764 .1 x, 17 input^num-inputCSet number of^problem '(from 1 to26) J
рис. 3.50
Листинг М-файла содержит важную информацию о структуре М-файла; для удоб¬
ства восприятия применяются цветные символы букв и окраска фона строки.
Цвета символов. При выводе листинга на экран дисплея используется следующая
гамма цветов:
Цвет
символов
Назначение строки
Пример строки
Зеленый
Комментарий
It- % input num=input(1 Введите номер задачи
Черный
Исполняемая строка
3 clear all
Серый
Неисполняемая строка
19 пик X- пше
Окраска фона строки. Окраска фона строк зависит от того, какую информацию о ха¬
рактеристиках листинга вы хотите получить. Выбор характеристики определяется сле¬
дующей строкой:
Color highlight code according to I Time I Number of Calls I Coverage I Acceleration I No Color ]
Время выполнения. В данном случае в качестве характеристики выбрано время вы¬
полнения Time и цвет окраски фона - розовый. Интенсивность цвета указывает, какие
строки программы требуют большего времени. В рассматриваемом примере это строка
под номером 17, которая запрашивает от пользователя номер решаемой задачи.
2.764 1 21 17 input^nuiiRinputX ’ Set number'-of prob(from > 1/tof 2 6); *-
В этом случае ввод номера задачи пользователем занимает 2.764 с.
Строки с номерами 4 и 5 окрашены в слабый розовый цвет:
0.120 1 х. £ figure (1), elf
0.220 1 х 5 figure(2), elf
и соответствуют меньшим временам выполнения - 0.120 и 0.220 с соответственно.
3. Программирование и отладка
191
Количество вызовов. Эта характеристика соответствует опции Number of Calls,
цвет окраски фона голубой. Обратимся к другому фрагменту, используя листинг мо¬
дуля tmixsnae2 (рис. 3.51).
0.010
0.000
0.000
1 . 229 epst=le-3; mt=le-3; i=l;
3 . 230
2 x 231 I=find(abs(resf(:,1))<epst);
2 . 232 for j=2:size (resf,2)
2 x 233 1= intersect (I>find<aJas.Xresf (: t j)) <epst));
2 . 234 end
mt=max (sumi'abs (resf (I, :) ) ) ) ;
2 . 236 . ; xntsnorm(resf (I, ));
2 . 237 if mt>epst, epst=mt;end
2 . 238 ^i«»i+l;:-
2 . 239 end
1 . 241 if ~isempty(I)
2 42 %accuracy=3Uiti (abs (resf (I, : i ) i / length (I) ;
2 44
рис. 3.51
Мы видим, что интенсивность окраски различна в зависимости от количества вы¬
зовов строк, которое колеблется от 1 до 3.
Выполненные строки. Эта характеристика соответствует опции Coverage, цвет окра¬
ски фона голубой (рис. 3.52), но его интенсивность равномерна, в отличие от рис. 3.51.
Это обусловлено тем, что данная характеристика выделяет только те строки, которые
были выполнены во время прогона. Строки, которые не выполнялись, не имеют фона.
0.000
1 . 229 epst=le-3; mt=le-3; i=l;
3 . 230 while mt>epst | i<3
0.010
0.000
0.000
2 x 231
2 . 232
2 x 233
2 . 234
2 . 236
2 . 237
I=findfabs(resf(:,!))<epst);
for je2:size(resf,2)
I^intersect(I,find(abs(resf(:,□))<epst));
end
nit=max (suin(abe (resf (I,:)) ) ) ;
mt=norm(resf(I,:) );
if mt>epst, epstemt;end
238
i=i+l;
О. ООО
2
2 . 239 end
1
241 if -isempty(I)
2 42 %accurac'y=suio (abs (resf (I, :) ) ) / length (I) ;
рис. 3.52
192
В. Г. Потемкин. Вычисления в среде MATLAB
Применение JIT-ускорителя. Эта характеристика соответствует опции Accelerator.
Здесь применяется розовая окраска фона (рис. 3.53).
О. ООО
0.010
0.000
0.000
1
229 epst=le-3; mt=le-3; i=l;
3
. 230
while mt>epst | i<3
2
х 231
I=find(abs(resf(:, 1) )<epst);
2
. 232
for j=2:size(resf,2)
2
х 233
1=intersect(I,find(abs(resf(:,1))<epst) )
2
. 234
end
% mt=max(sum(abs(resf(Iz:)i));
2
. 236
mt=norm(resf(I,:));
2
. 237
if mt>epst, epst=mt;end
2
. 238
i=i+l;
2
. 239
end
...
l
1
241 if -isempty(Г)
043 *асcurасу=sum (abs (resf(I, :) i ) / lengt h (I) ;
рис. 3.53
Эта характеристика выделяет только те строки, к которым применялся механизм
ускорения на основе ЛТ-Accelerator; эти строки помечены символом точки (.), строки,
к которым не применялся механизм ускорения, отмечены символом х.
Для того чтобы получить более полную информацию о том, почему не был приме¬
нен механизм ускорения, следует кликнуть левой кнопкой мыши на знаке х, и тогда
появится следующее окно - Accelerator Information (рис. 3.54).
Accelerator information
Н1йЧ
13J I
Line 231 did not accelerate for the following reason.
Buiitin '<‘was called with inputs of type ^double', 'doubled.
рис. 3.54
Этот фрагмент соответствует анализу строки с номером 231 модуля tmixsnae2
(рис. 3.53) и содержит следующую информацию:
К строке 231 не применялась процедура ускорения по следующей причине.
Встроенная функция ’<’ была вызвана с входными переменными типа
<’doubledouble'>.
Навигация между разделами и страницами отчета. В процессе профилирования
требуется перемещаться по страницам отчета; для этого предназначена инструмен¬
тальная панель ИС Profiler, которая показана на рис. 3.55.
3. Программирование и отладка 193
7 т. Зак. 3375
4 4 О d 1 Find in page: I Go [
рис. 3.55
Иконки кнопок этой панели соответствуют следующим мнемоникам операций:
Иконка отладки
Описание
| Back)
Вернуться к предыдущей странице
■ф[
| Forward |
Перейти к следующей странице
0=!
Вновь загрузить данную страницу
| Reload |
а
Вернуться к первой странице отчета
‘[profile Summaty|
Ж
Вывести на печать данную страницу
(print Page |
Перечисленные в таблице действия не имеют аналогов в опциях главного меню,
но могут быть вызваны в окне профилировщика в виде контекстного меню с помощью
правой кнопки мыши.
Резюмируя сказанное о работе профилировщика, следует отметить, что он является
эффективным инструментом для анализа структуры отдельных программ и программ¬
ных комплексов, исследования эффективности реализации их кода, а его интерфейс
является дружественным и понятным.
Можно наметить следующий общий подход к анализу производительности разра¬
ботанного кода:
1. Выявить в обобщенном отчете Profile Summary те модули, которые либо часто вы¬
зываются, либо требуют больших затрат времени на выполнение.
2. Просмотреть детальные отчеты для тех модулей, которые были выбраны на шаге 1.
Можно сохранить копию детального отчета в отдельном окне, чтобы иметь воз¬
можность сравнивать результаты разных прогонов; можно также вывести деталь¬
ный отчет на печать.
3. Выявить причины больших затрат времени и попытаться устранить их.
4. Провести анализ использования ЛТ-ускорителя и получить информацию, почему
к тем или иным строкам программы этот механизм не применяется.
5. Открыть тексты М-файлов, подлежащих корректировке, в редакторе/отладчике,
кликнув левой кнопкой мыши на имени М-файла. Затем внести изменения в текст
программы, сохранить новый текст и обязательно выполнить команду clear all. По¬
следнее действие необходимо, чтобы очистить стек вызываемых функций.
6. Снова выполнить процедуру профилирования и сравнить результаты.
194
В. Г. Потемкин. Вычисления в среде MATLAB
Повторить этот сценарий несколько раз, чтобы добиться требуемой производи¬
тельности программы.
Рассмотрим некоторые специальные режимы применения ИС Profiler.
Отладка сложных программ. Профилировщик может оказаться весьма полезным для
локализации сложных ситуаций. Например, только с его помощью можно выявить
те участки программы, которые не выполняются, но реально должны выполняться.
Другой пример - это зацикливание или очень большое время исполнения. В этом слу¬
чае в режиме профилирования можно прервать выполнение быстрыми клавишами
Ctrl+C и выяснить причину такого поведения программы.
Анализ структуры сложных программ. Если вы имеете дело с большим по размерам
М-файлом или комплексом программ, который вы долго не использовали или незна¬
комы с ним, то профилировщик может помочь разобраться в последовательности вы¬
зовов модулей и принципе функционирования программы. Если имеется прообраз М-
файла или GUI-интерфейса, который вы хотели бы создать, то профилировщик окажет
вам неоценимую услугу, чтобы найти те фрагменты или строки кода, которые нужны
для реализации вашего проекта.
Профилирование GUI-интерфейса. Допустим, мы решили выполнить профилирова¬
ние GUI-интерфейса решения систем нелинейных алгебраических уравнений [2]. Этот
интерфейс является надстройкой над сценарием immsnae2, который был рассмотрен
выше. Общий вид рабочего стола системы MATLAB с GUI-интерфейсом и ИС Profiler
показан на рис. 3.56.
Start Profiling] Run this code. [
Development Environment
MATLAB
? \ Current Directory jcAToolboxtSNAEtsnae ...
v [ Ф Profile time: 7 sec
Comm «nd Window
Improving М-File Performance - the
Profiler
One way to improve the performance of your M-files is to profile them. MATLAB provides
an M-file profiler that lets you see how much computation time each line of an M-file uses.
For details on how to use the Profiler, see the Profiler documentation
рис. 3.56
В левой части стола размещены 3 окна графического интерфейса snae2gui, а справа
окно профилировщика и командное окно системы MATLAB.
Процедура профилирования в этом случае включает следующие шаги:
1. В окне Profiler запустить процедуру профилирования с помощью кнопки Start Pro¬
filing. При этом начнется отсчет времени работы профилировщика, но он будет на-
3. Программирование и отладка
195
ходиться в ожидании выполнения функции GUI-интерфейса. При этом рабочий
стол примет вид, показанный на рис. 3.57.
Fite Edrt View Web Window Help
i * i
_=1S2<1
Dl^ ■■ ' &
? | Current Directory [ C XTooiboxtSNAEtenae
2d J
& ■f 0 $ & Find in page-1
GO |
; Stop Profilinij] Run this code: |
T1 О Profile time: 2 sec
Development Environment
Improving M-File
Profiler
Performance - the
One way to improve the performance of your M-files is to profile them. MATLAB provides
an M-file profiler that lets you see how much computation time each line of an M-file uses.
For details on how to use the Profiler,
see the Profiler documentation.
J
d*J
»
4 Start [ Profiler on
рис. 3.57
Отличие от предыдущего состояния заключается в том, что кнопка Start Profiling
преобразовалась в кнопку Stop Profiling; идет отсчет времени работы профилировщи¬
ка, и индикатор окрашен в зеленый цвет, а в нижней части командного окна, в строке
текущего состояния, появилась информация о том, что профилировщик работает (Pro¬
filer on). Теперь мы готовы к тому, чтобы запустить GUI-интерфейс.
2. Запустить GUI-интерфейс нажатием кнопки Solve. После окончания решения зада¬
чи, в данном случае приблизительно через 3,5 с, можно завершить профилирование
нажатием кнопки Stop Profiling в окне Profiler.
Результаты профилирования представлены в окне Profiler на рис. 3.58.
в;;; л=1з12<]
а» р/гб"
4 Start j
kbhhkw жЮГх1
rfe to ' ‘As* . Web
196
рис. 3.58
В. Г. Потемкин. Вычисления в среде MATLAB
Полное время профилирования модуля snae2gui составило 3.816 с, а время решения
задачи 3.375 с; Анализируя отчет профилирования по тому же сценарию, о котором
упоминалось выше, вы можете изучить структуру и взаимодействие различных моду¬
лей друг с другом.
Изменение шрифта. Для изменения шрифта, используемого профилировщиком, сле¬
дует поступить таким образом:
1. Выполнить цепочку вызовов File -> Preferences -> Help -> Fonts, чтобы открыть
окно настроек Preferencies (рис. 3.59).
General
Command Window
- Command History
?+HEditor/Debugger
th Help
"Current Directory
Workspace
•Array Editor
-GUIDE
ф Figure Copy Template
Simulink
Help Fonts Preferences
- Help Navigator font
Use desktop font
Use custom font:
[sansSerit ▼ ] [Flain 3 F33
Sample
The quick brown fox jumps over the lazy dog.
1234567890
HTML browser font
-• —_
i |sansSerif
i- -
zJl10
zJ
OK | Cancel J Apply | Help
рис. 3.59
2. Установить желаемый тип шрифта в окне HTML browser font и подтвердить вы¬
бор кнопками Apply или ОК.
3. В окне Profiler кликнуть на кнопке Reload, чтобы применить выбранный шрифт.
В результате этих операций к отчету о профилировании будет применен новый
шрифт.
Режим командной строки
Профилирование М-функций в режиме командной строки поддержано М-
функцией profile. При этом профилировщик Profiler является просто графическим ин¬
терфейсом, который построен на основе этой М-функции. Несмотря на то что оба ре¬
жима реализуют функцию профилирования, работа в этих режимах несколько разли¬
чается.
3. Программирование и отладка
197
Процедура профилирования в режиме командной строки включает 3 шага:
1. Запуск процедуры с помощью команды
profile on
2. Запуск М-файла, профиль которого надо получить.
3. Вывод отчета в формате HTML с помощью команды
profile report
Для удобства работы с оператором profile приведем сводную таблицу опций этого
оператора.
Оператор
Опция
Описание
profile on
-
Запуск процедуры профилирования с предваритель¬
ным удалением накопленной до этого статистики
-detail level
Выделяет класс профилируемых функций
-history
Фиксирует точную последовательность вызова
функций
profile report
-
Приостанавливает профилирование и генерирует
отчет в формате HTML
<имя_файла>
Сохраняет отчет в файле с именем <имя_файла>
в текущем каталоге
profile plot
Приостанавливает профилирование и выводит
в графическом окне результаты профилирования
в виде диаграммы Парето
profile resume
—
Перезапускает процедуру профилирования без
удаления записанной статистики
profile clear
-
Удаляет записанную статистику
profile viewer
—
Открывает профилировщик Profiler, работающий
в режиме графического интерфейса
profile status
—
Выводит информацию о текущих параметрах про¬
цедуры профилирования
stats =
profile('info')
Приостанавливает профилирование и выводит
на экран структуру массива записей с результатами
профилирования
Вновь рассмотрим пример решателя систем нелинейных алгебраических уравне¬
ний. Выполним запуск процедуры профилирования со следующими опциями
profile on -history
Выполним запуск сценария
immsnae2
Сгенерируем отчет профиля и сохраним его в виде HTML-документов repsnae2,
repsnae2_contents, repsnae2_summary, repsnae2_details, repsnae2_history, применяя опе¬
ратор:
profile report repsnae2
Теперь можно сравнить формы отчетов, генерируемые профилировщиком
и оператором profile.
198
В. Г. Потемкин. Вычисления в среде MATLAB
Отчет Profile Summary. Этот отчет показан на рис. 3.60 и несколько отличается
от отчета профилировщика (см. рис. 3.47).
Summary | Function Details | Function Call History
MATLAB Profile Report: Summary
Report generated 16-Feb-2003 21:56:39
Total recorded time:
Number of M-functions:
Number of M-scripts:
Number of M-subfunctions:
Numb er of MEX-functions:
Clock precision:
Clock Speed:
8.87 s
91
7
21
6
0.00000006 s
1683 Mhz
рис. 3.60
В отличие от отчета профилировщика здесь представлена расширенная информа¬
ция, которая включает:
• Total recorded time - полное время работы процедуры профилирования;
• Number of functions - количество М-функций, М-сценариев, подфункций и МЕХ-
функций смешанного программирования;
• Clock precision - точность измерения времени, в данном случае 0.06 мкс;
• Clock Speed - тактовую частоту, в данном случае 1683 МГц.
Следующий компонент отчета - это список вызываемых функций (рис. 3.61), фор¬
ма которого также существенно отличается от отчета профилировщика (см. рис. 3.47).
Function List
{Nuu
Time iCalls {time/саП [Self time
{Location
|1лпспае2
8.87300000 [100.0% [
1[8.873000000000 [4.07500000 |45P% je: /pva/ ianet/ jaip/ snas jbn/ iinman&eS .m
[tmixsnae2
405600000 j 45.7% j
1 [4.056000000000 [0.57200000|
6.4% [e:/pvg/janet/jasp/snaejbn/tmxxsna*2 .rn
baple
[1.24200000 j 14.0% |
434 [0.002861751152 |0.37000000 |
42% |c: /HATLAE6p5/toolboz/a^nrtoo 1 ic/maple an
^)1лшпае2
0.97100000 j 10.9% [
2 |o 485500000000 [o.20000000 |
2.3% [e :/pvgZ janet/-iasp/snaeibn/xoplrosnae2 ,m
[я2®
jo .81000000 [ 9.1% I
3 |o.270000000000 |0.08000000 |
0P% |e: /pvg/1 met/ jasp/snaejbn/г.ib
jnpl»nae2
0.74100000 8.4% [
2 [0.370500000000 [0.I8OOOOOO |
2.0% [e:/pv?j/janet/ja3p/snaejbn/mplsnae2 .in
friaplemex
0.70200000 j 7.9% |
469 [0.001496801706 (0.69200000 [
7.8% [c :/MATLAE 6p5/toolbox/symbo 1 ic/maplemax.dll
02 at de oxy
0.55000000 f 6.2% [
1 [0 550000000000 |0.08000000 |
0.9% ;e : / pvg/ j anet/ jasp/snaa 1bn/cj2atdegx v.m
[g2aple>ocy
ОЛ9ЮОООО: 5.5% |
1 [0.491000000000 [0.08000000 [
09% <e : /pvg/Jmet/jasp/snac jbn/«3aplcxxy.ni
tf2axy
•0.48000000 j 5.4% [
1 jo .480000000000 [0.24000000 [
2.7% ie:/pvt?/ 1anet/jasp/snae jbn/tf2axy.rn
tmix>nae2/Bnaelplot
0.40100000 ■ 4.5% |
1 [0.401000000000 [O.IOOOOOOO |
1.1% is: /pva/janst/jaap/snaejbn/tmixmae-Z .tn
COTltQUrf
0.28100000 1 3.2%)
2 |o 140500000000 [0.15000000|
1.7% !C: ZMATLABSpS/toolbox/matlab/speccrraph/contourf an
рис. 3.61
3. Программирование и отладка
199
Применение JIT-ускорителя. Эта характеристика соответствует опции Accelerator.
Здесь применяется розовая окраска фона (рис. 3.53).
О. ООО
0.010
0.000
0.000
1
229 epst=le-3; mt=le-3; i=l;
3
. 230
while mt>epst | i<3
2
х 231
I=find(atos(resf(:,1))<epst);
2
. 232
for j=2:size(resf,2)
2
х 233
1=intersect(I,find(abs(resf(:,1))<epst) )
2
. 234
end
% mt=max(sum(abs(resf(Iz:)i));
2
. 236
mt=norm(resf(I,:));
2
. 237
if mt>epst, epst=mt;end
2
. 238
i=i+l;
2
. 239
end
...
l
1
241 if -isempty(Г)
043 *асcurасу=sum (ahs (resf(I, :) i ) / lengt h (I) ;
рис. 3.53
Эта характеристика выделяет только те строки, к которым применялся механизм
ускорения на основе ЛТ-Accelerator; эти строки помечены символом точки (.), строки,
к которым не применялся механизм ускорения, отмечены символом х.
Для того чтобы получить более полную информацию о том, почему не был приме¬
нен механизм ускорения, следует кликнуть левой кнопкой мыши на знаке х, и тогда
появится следующее окно - Accelerator Information (рис. 3.54).
Accelerator information
J -^.1
Line 231 did not accelerate for the following reason.
Builtin '<'was called with inputs of type ^double', 'doubled.
рис. 3.54
Этот фрагмент соответствует анализу строки с номером 231 модуля tmixsnae2
(рис. 3.53) и содержит следующую информацию:
К строке 231 не применялась процедура ускорения по следующей причине.
Встроенная функция ’<’ была вызвана с входными переменными типа
<’doubledouble'>.
Навигация между разделами и страницами отчета. В процессе профилирования
требуется перемещаться по страницам отчета; для этого предназначена инструмен¬
тальная панель ИС Profiler, которая показана на рис. 3.55.
3. Программирование и отладка 193
7 т. Зак. 3375
Столбцы списка функций содержат следующую информацию:
• Name - имя вызываемой функции;
• Time - полное время работы функции, включая вызовы дочерних функций; вслед¬
ствие этого процентные доли перекрываются и их сумма превышает 100 %;
• Calls - количество вызовов функции;
• Time/Call - время исполнения одного вызова;
• Self time - время исполнения функции без учета вызова дочерних функций; в этом
случае сумма процентных долей соответствует 100 %.
Детальный отчет. Форма этого отчета, генерируемая процедурой профилирования,
также отличается от отчетов профилировщика. На рис. 3.62 показан первый раздел от¬
чета, содержащий профиль функции immsnae2.
rnmsnae2 е : / уд/ j ane t- / j аз р / зпае jb п/ itnms пае 2 . tn
Time: 8.87300000 s (100.0%)
Calls: 1
Self time: 4.07500000 s (100.0%)
Function:
[Time
CaJJs [Time/caU
Iijnmsnae2
[8.87300000 j
| 1 {8.873000000000
|
jParent functions:
inone
1 Child functions:
itjnixsnae2
>4.05600000 >457%
| 1 [4.056000000000
Isym/mpawer
[0.27100000 1 3.1%
| 5 {0.054200000000
Isym/display [o.18000000 | 2.0%
| 1 [0.180000000000
|cl±
0.14100000 | 1.6%
[ 2 |o .070500000000
jsyms
[o.l 1000000 [ 1.2%
[ 1 [O.HOOOOOOOOOO
Isym/minus
[0.02000000 | 0.2%
| 2 [0.010000000000
^sym/plus
{0.010000001 0.1%
| 2 [0.005000000000
jo.oioooooo | 0.1%
[ 2 [0.005000000000
blanks
[O.OOOOOOOO 10.0%
| 210.000000000000
рис. 3.62
Это главный сценарий, который не имеет родительских функций, но вызывает
множество дочерних функций. Столбцы списка вызываемых дочерних функций имеют
то же назначение, что и на рис. 3.61.
Второй раздел отчета содержит листинг М-файла immsnae2, в который включены
строки, требующие наибольших затрат времени (рис. 3.63).
200
В. Г. Потемкин. Вычисления в среде MATLAB
99% of the total time in this function was spent on the following lines:
2:
0.04000000
0$
3 :
clear all
0.14100000
2$
4:
figure(1) , elf
5:
figure(2) , elf
16:
$ input num= input(1 Введите номер задачи
')
3.64500000 41$
17:
input_num=input('Set number of problem
(from 1 to 26)
18:
1126:
0.21000000
2$
1127:
syms x у a
1128:
1131:
0.30100000
3$
1132:
fl=xA5-yA3*xA3+a;
0.03000000
0$
1133:
f2=(1+a)*xA2-yA4;
0.18000000
2$
1134:
F=[fl, f2],
1135:
a=l;
рис. 3.63
Отчет о последовательности вызовов. Отчет хронологии вызовов содержит инфор¬
мацию о точном следовании вызовов функций с указанием их повторов, если, напри¬
мер, эти вызовы выполнялись в цикле. На рис. 3.64 представлен фрагмент такого отче¬
та для решателя СНАУ; полный отчет содержит более 4500 таких вызовов. Эта
информация может быть крайне полезна для выявления ситуаций, когда М-функция
с большим временем исполнения вызывается многократно внутри цикла или во внут¬
ренних модулях, хотя может быть выполнена всего один раз.
ker (е:/руд/janet/ja3p/snaejbn/KER.и)
rank (С:/HATLAE6p5/toolbox/mat. lab/matf un/rank.m)
pencil (e: / руд/ j anet/j asp/snaejbn/PENC IL ♦ II)
kroneck (e;/руд/j ane t / j аз р / sпае jb п/kr о ne ck. m)
rank (C: / HATLAB 6 p 5 / coolbox / mat. 1 ab / mat f un/ r ank. m)
rank (C:/HATLAB6p5/toolbox/matlab/matrun/rank.m)
rank (C : /KATLAB6p5/ too lbox/mat lak»/matf un/rank.m)
rank fc: /HATLAB6p5/toolbox/matlab/matfun/rank.m)
sstruct (e:/руд/janet/jasp/3naejbn/33truct.m)
рис. 3.64
3. Программирование и отладка
201
Графики профиля. Для построения графиков профиля применяется оператор
profile plot
Он приостанавливает процедуру профилирования и строит диаграмму Парето пол¬
ного времени работы каждого модуля (рис. 3.65).
рис. 3.65
Параметры процедуры профилирования. Для того чтобы контролировать состояние
процедуры профилирования используются следующие параметры, которые можно по¬
лучить применением оператора.
profile status
ans =
Profilerstatus: 'off'
DetailLevel: 'mmex'
HistoryTracking: 'on'
Это
• состояние профилировщика или процедуры профилирования ProfilerStatus - вклю¬
чен (on), выключен (off);
• уровень детализации отчета DetailLevel - mmex, builtin, operator;
• хронология вызовов HistoryTracking - включена (on), выключена (off).
Сохранение профилей. Для того чтобы сохранить результаты профилирования для
дальнейшего использования, следует применить оператор
profile report <имя_файла>
В результате применения этого оператора отчет в формате HTML будет сохранен
в виде набора html-файлов с именами:
• <имя_файла>;
• <имя_файла>_соШеШ8;
• <имя_файла>_8иттагу;
• <имя_файла>_с1е1аП8;
• <имя файла>ЫзЮгу.
202
В. Г. Потемкин. Вычисления в среде MATLAB
В дальнейшем можно просмотреть сохраненные профили, используя Web-браузер.
Другой способ сохранить результаты профилирования - применить следующую
функциональную форму оператора profile:
stats = profile(1 info1)
stats =
FunctionTable: [128x1 struct]
FunctionHistory: [2x9246 double]
ClockPrecision: 5.8824e-008
Name: 'MATLAB'
Clockspeed: 1683
Это позволяет сохранить отчет о профилировании в виде массива записей, содер¬
жащего 5 полей:
• первое поле - таблица функций FunctionTable, которая, в свою очередь, является
массивом записей;
• второе поле - хронология вызовов модулей FunctionHistory в виде массива из двух
строк и 9246 столбцов;
• третье поле - точность измерения времени ClockPrecision со значением Shift+Enter
5.8824е-008 мкс;
• четвертое поле - имя системы Name со значением 'MATLAB';
• пятое поле - тактовая частота ClockSpeed со значением 1683 МГц.
Теперь можно узнать структуру таблицы функций, которая является массивом
со 128 записями, каждая из которых содержит 10 полей:
stats.FunctionTable
ans =
128x1 struct array with fields:
FunctionName
FileName
Type
.NumCalls
TotalTime
TotalRecursiveTime
Children
Parents
ExecutedLines
AcceleratorMessages
Первая запись таблицы функций содержит информацию:
• об имени функции;
• полном имени и типе файла;
• количестве вызовов;
• времени исполнения;
• вызываемых и вызывающих функциях;
• строках, которые были исполнены;
• применении ускорителя JIT-Accelerator
3. Программирование и отладка
203
и имеет следующую структуру:
stf = stats.FunctionTable(1)
stf =
FunctionName: 'immsnae2'
FileName: 'e:\pvg\janet\jasp\snaejbn\immsnae2.m'
Type: 'M-script'
NumCalls: 1
TotalTime: 8.873
TotalRecursiveTime: 8.873
Children: [llxl struct]
Parents: [0x1 struct]
ExecutedLines: [60x4 double]
AcceleratorMessages: {1x47 cell}
Можно сохранить информацию о профилировании в виде файла profstats в текущем
каталоге для последующего использования, если применить оператор
save profstats stats
В последующих сеансах работы эту статистику можно вызвать и сформировать от¬
чет о профилировании, используя такую последовательность операторов:
■load profstats
profreport(stats)
Операторы отладки и профилирования
В этом разделе дана справочная информация об операторах отладки и профилиро¬
вания, которые были описаны выше. Эта информация точно соответствует специфика¬
циям операторов, представленных в документации [70-72] и справочной системе Help
для версии системы MATLAB 6.5 (Release 13).
DBSTOP |
Установить контрольную точку
Синтаксис:
dbstop
[in]
<имя М-функции>
dbstop
[in]
<имя М-функции> [at] <номер строки>
dbstop
[if]
error
dbstop
[if]
naninf
dbstop
[if]
infnan
Описание:
Группа команд dbstop устанавливает режим отладки в среде системы MATLAB.
Она позволяет установить контрольную точку в определенной строке М-функции или
прервать выполнение программы по некоторому условию. Если такое условие оказа¬
лось выполненным, в командной строке появляется специальное приглашение К»,
которое разрешает выполнить любую команду системы MATLAB.
Команда dbstop [in] <имя М-функции> останавливает исполнение в первой строке
М-функции. Служебное слово in, помещенное в квадратные скобки, является необяза¬
тельным.
204
В. Г. Потемкин. Вычисления в среде MATLAB
Команда dbstop [in] <имя М-функции> [at] <номер строки> останавливает выпол¬
нение в заданной строке М-функции. В состав имени функции может быть включен
путь доступа. Служебные слова in и at, помещенные в квадратные скобки, являются
необязательными.
Команда dbstop if error устанавливают контрольную точку по условию, связанному
с возникновением ошибки при исполнении модуля. В случае возникновения такой си¬
туации можно проверить переменные рабочей области и последовательность вызова
функций, приведших к ошибке. Однако продолжить выполнение М-файла оказывается
невозможным.
Команды bstop if naninf и bstop if infnan устанавливает контрольную точку по усло¬
вию, связанному с появлением результата NaN или inf.
Команда dbstop if warning устанавливают контрольную точку по условию, связан¬
ному с появлением предупреждения при исполнении модуля:
• если контрольная точка определяется номером строки, то исполнение модуля пре¬
рывается перед этой строкой;
• если именем модуля, то останов перед первой исполнимой строкой;
• если условием if error, то останов при появлении ошибки;
• если условиями if naninf, if infnan, то останов при получении результата NaN или inf.
Сопутствующие операторы: DBCONT, DBSTEP, DBCLEAR, DBTYPE, DBSTACK,
DBUP, DBDOWN, DBSTATUS, DBQUIT, PARTIAL¬
PATH.
DBCLEAR
Удаление контрольных точек
Синтаксис:
dbclear in <имя_М-функции>
dbclear in <имя_М-функции> at <номер_строки>
dbclear all in <имя_М-функции>
dbclear all
dbclear if error
dbclear if warning
dbclear if naninf
dbclear if infnan
Описание:
Команды из группы dbclear удаляют контрольные точки, установленные ранее со¬
ответствующей командой dbstop.
Команда dbclear [in] <имя М-функции> удаляет все контрольные точки в данном
М-файле. Служебное слово in, помещенное в квадратные скобки [ ], является необяза¬
тельным.
Команда dbclear [in] <имя М-функции> [at] <номер строки> удаляет контрольную
точку в заданной строке данной М-функции. Служебные слова in и at, помещенные
в квадратные скобки [ ], являются необязательными.
3. Программирование и отладка
205
Команда dbclear all [in] <имя М-функции> удаляет все контрольные точки в данном
М-файле. Служебное слово in, помещенное в квадратные скобки [ ], является необяза¬
тельным.
Команда dbclear all удаляет во всех активных М-функциях все контрольные точки,
за исключением тех, которые связаны с фиксацией предупреждений и ошибок.
Команды dbclear if error и dbclear if warning удаляют контрольные точки, установ¬
ленные командами dbstop if error и dbstop if warning соответственно.
Команды dbclear if naninf и dbclear if infnan удаляют контрольные точки, установ¬
ленные командами dbstop if naninf и dbstop if infnan соответственно.
Сопутствующие операторы: DBCONT, DBDOWN, DBQUIT, DBSTACK, DBSTATUS,
DBSTEP, DBSTOP, DBTYPE, DBUP, PARTIALPATH.
DBSTEP Выполнить одну или несколько строк программы
в режиме отладки
Синтаксис:
Dbstep
dbstep <количество строк>
dbstep in
Описание:
Группа команд dbstep позволяет управлять режимом отладки и включает 3 команды.
Команда dbstep реализует построчное исполнение М-функции.
Команда dbstep количество, строк> допускает исполнение сразу нескольких строк.
Команда dbstep in связана с исполнением строки, в которой присутствует вызов
другой М-функции. В последнем случае, если следующая строка содержит вызов М-
функции, то применение команды dbstep in позволяет создать контрольную точку
в первой строке вызываемой функции.
Сопутствующие операторы: DBCLEAR, DBCONT, DBDOWN, DBQUIT, DBSTACK,
DBSTATUS, DBSTOP, DBTYPE, DBUP.
DBCONT Продолжить выполнение
Синтаксис:
dbcont
Описание:
Команда dbcont вызывает исполнение М-функции до следующей контрольной точ¬
ки, установленной командами dbstop или dbstep.
Сопутствующие операторы: DBCLEAR, DBDOWN, DBQUIT, DBSTACK, DBSTATUS,
DBSTEP, DBSTOP, DBTYPE, DBUP.
206
В. Г. Потемкин. Вычисления в среде MATLAB
DBSTACK
Стек вызываемых М-функций
Синтаксис:
dbstack
[ST,I] = dbstack
Описание:
Команда dbstack выводит на терминал номера строк и имена вызванных М-
функций, начиная от контрольной точки и до самого внешнего модуля, за исключени¬
ем М-сценария (Script-файла).
Функция [ST, I] = dbstack возвращает стек вызванных функций в виде массива за¬
писей (структуры) ST размера mxl с полями ST.line, ST.name. Текущей рабочей облас¬
ти присваивается индекс 1=1; при однократном использовании команды dbup индекс I
увеличивается на 1, так что самый высокий индекс имеет базовая рабочая область сис¬
темы MATLAB.
Пример:
Рассмотрим использование команды dbstack при останове в некоторой контрольной
точке.
К» dbstack
> In d:\matlab5\sqsum.m at line 3
In d:\matlab5\variance.m at line 3
Рассмотрим использование функции [ST, I] = dbstack при останове в той же кон¬
трольной точке.
[ST, I] = dbstack
ST =
2x1 struct array with fields:
line
name
I = • 1
Выведем содержимое полей ST.name и ST.line.
К» ST.name
ans = d:\matlab5\sqsum.m
ans = d:\matlab5\variance.m
К» ST.line
ans = 3
ans = 3
Сопутствующие операторы: DBCLEAR, DBCONT, DBDOWN, DBQUIT, DBSTATUS,
DBSTEP, DBSTOP, DBTYPE, DBUP.
3. Программирование и отладка
207
DBUP I Переход между рабочими областями снизу вверх
Синтаксис:
dbup
Описание:
Команда dbup осуществляет переход в стеке вызываемых М-функций снизу вверх.
Все переменные доступны для просмотра (команды who, whos) и обработки, и можно
проследить, как они изменялись вплоть до значения, которое было передано отлажи¬
ваемому модулю. Рабочая область переменных самого внешнего модуля называется
базовой рабочей областью. Для продолжения отладки выполнения команды, обратной
dbup (команда dbdown), не требуется.
Сопутствующие операторы: DBCLEAR, DBCONT, DBDOWN, DBQUIT, DBSTACK,
DBSTATUS, DBSTEP, DBSTOP, DBTYPE.
DBDOWN | Переход между рабочими областями сверху вниз
Синтаксис:
dbdown
Описание:
Команда dbdown применяется совместно с командой dbup для перемещения между
рабочими областями вызываемых модулей. Эта команда противоположна по своему
действию команде dbup. Команда dbdown реализует перемещение только в том случае,
если выполнена хотя бы одна команда dbup.
Сопутствующие операторы: DBCLEAR, DBCONT, DBQUIT, DBSTACK, DBSTATUS,
DBSTEP, DBSTOP, DBTYPE, DBUP.
DBSTATUS I Список контрольных точек данной М-функции
Синтаксис:
dbstatus
dbstatus <имя_М-функции>
s = dbstatus
Описание:
Команда dbstatus выводит на терминал список всех контрольных точек, включая
контрольные точки, связанные с ошибками и предупреждениями, а также с результа¬
тами вычислений вида NaN и Inf.
Команда dbstatus <имя М-функции> выводит на терминал список всех контроль¬
ных точек, определенных для данной М-функции. Эту команду можно использовать
в формах dbstatus с1а8з/<имя М-функции>, dbstatus рпуа1е/<имя М-функции>, dbstatus
рпуа1е/с1а55/<имя М-функции>, чтобы создать список контрольных точек для методов,
частных функций или частных методов соответственно. Кроме того, во всех этих слу¬
чаях можно связывать имя функции с подфункцией в форме dbstatus <имя М-
функции>/<имя подфункции>.
208
В. Г. Потемкин. Вычисления в среде MATLAB
Функция s •== dbstatus возвращает информацию о контрольных точках в виде масси¬
ва записей (структуры) размера mxl с полями s.name, s.line, s.cond, которые содержат
имена М-функций, вектор номеров строк с контрольными точками, строки условий
(error, warning или naninf)-
Пример:
Получим список всех контрольных точек.
К» dbstatus
Breakpoint for d:\matlab5\sqsum.m is on line 3.
Breakpoints for d:\matlab5\variance.m are on lines 3,4.
Получим список всех контрольных точек в виде массива записей размера 2x1.
К» s = dbstatus
s =
2x1 struct array with fields:
name
line
cond
Выведем содержимое полей s.name, s.line, s.cond.
К» s.name К» s.line
ans = d:\matlab5\sqsum.m ans = 3
ans = d:\matlab5\variance.m ans =34
К» s.cond
ans =
ans =
Получим список контрольных точек, когда в состав М-функции variance включена
подфункция sqsum.
К» dbstatus
Breakpoint for d:\matlab5\variance.m is on line 4.
Breakpoint for d:\matlab5\variance.m (sqsum) is on line 7.
Получим список контрольных точек подфункция sqsum:
К» dbstatus variance/sqsum
Breakpoint for d:\matlab5\variance.m (sqsum) is on line 7.
Сопутствующие операторы: DBCLEAR, DBCONT, DBDOWN, DBQUIT, DBSTACK,
DBSTEP, DBSTOP, DBTYPE, DBUP.
DBTYPE I Текст М-функции с указанием номеров строк
Синтаксис:
dbtype <имя_М-функции>
dbtype <имя_М-функции> <начало>:<конец>
Описание:
Команда dbtype <имя_М-функции> <начало>:<конец> позволяет вывести на тер¬
минал текст М-функции с указанием номеров строк. Для вывода части текста следует
указать диапазон номеров выводимых строк; для вывода одной строки достаточно ука¬
зать ее номер.
Сопутствующие операторы: DBCLEAR, DBCONT, DBDOWN, DBQUIT, DBSTACK,
DBSTATUS, DBSTEP, DBSTOP, DBUP, PARTIAL¬
PATH.
3. Программирование и отладка
209
Выход из режима отладки
DBQUIT ]
Синтаксис:
dbquit
Описание:
Команда dbquit немедленно прекращает режим отладки и возвращает управление
базисному модулю. Исполнение текущего М-файла прерывается, результаты не воз¬
вращаются. Все контрольные точки сохраняются. Если основной модуль является М-
сценарием, то его выполнение также прерывается, появляется сообщение об ошибке
и управление передается в среду системы MATLAB.
Пример:
Выход из режима отладки в случае, когда внешний модуль mslsnae2.m является М-
сценарием (Script-файлом):
К» dbstack
In d:\toolbox\snae\pencil.m at line 20
In d:\toolbox\snae\msnae2.m at line 34
К» dbquit
Error in ==> d:\toolbox\snae2\mslsnae2.m
On line 70 ==> [x, y, err] = msnae2(Axy, P, sx, sy, nv)
»
Сопутствующие операторы. DBCLEAR, DBCONT, DBDOWN, DBSTACK, DBSTATUS,
DBSTEP, DBSTOP, DBTYPE, DBUP.
ECHO I Вывод на экран исполняемых строк программы
Синтаксис:
echo. echo <имя_М-файла>
echo on|off echo <имя_М-файла> on|off
echo on|off all
Описание:
Оператор echo позволяет управлять выводом на экран исполняемых строк про¬
граммы (режим "эхо”). Обычно строки программы не выводятся на экран во время вы¬
полнения М-файла. Однако есть две ситуации, когда такой вывод может оказаться по¬
лезным, - это отладка или демонстрация работы программы.
Этот оператор ведет себя несколько по-разному при работе со сценарием и работе
с М-функцией. В случае сценария оператор echo может быть либо включен, либо вы¬
ключен, и таким способом можно управлять выводом на экран исполняемых строк
программы. В случае М-функции ситуация оказывается более сложной. Если режим
echo включен, то М-функция будет выполняться в режиме интерпретации, а не компи¬
ляции, как это бывает обычно. В этом случае каждая исполняемая строка выводится
на экран, а время исполнения существенно возрастает.
Оператор echo управляет режимом эхо при выполнении Script-файла.
Оператор echo on включает режим "эхо".
210
В. Г. Потемкин. Вычисления в среде MATLAB
Оператор echo off выключает режим "эхо".
Оператор echo <имя_М-файла> управляет режимом "эхо" при вызове М-файла
с указанным именем.
Оператор echo <имя_М-файла> on включает режим "эхо" при вызове М-файла
с указанным именем.
Оператор echo <имя_М-файла> off выключает режим "эхо" для М-файла с указан¬
ным именем.
Оператор echo on all включает режим "эхо" для всех М-файлов.
Оператор echo off all выключает режим "эхо" для всех М-файлов.
PROFILE
Запуск процесса профилирования
Синтаксис:
Графический интерфейс', запуск профилировщика Profiler.
Меню View —> Profiler;
Super Tray (меню кнопки Start) -» MATLAB -» Profiler;
команда profile viewer.
Командная строка:
profile on|off
profile on -detail level
profile on -history¬
profile resume
profile clear
profile report
profile report <имя__файла>
profile plot
profile status
stats = profile('info')
Описание:
Процедура профилирования позволяет замерить время выполнения каждой М-
функции и оптимизировать выполнение отдельной программы или комплекса про¬
грамм. Для каждой функции фиксируется время выполнения, количество вызовов, вы¬
зывающие, родительские и вызываемые, дочерние функции, количество строк про¬
граммы, а также время выполнения каждой строки.
Команда profile on запускает процедуру профилирования, удаляя ранее записанную
статистику.
Команда profile on -detail level запускает процедуру профилирования, применяя ее
только для тех функций, которые заданы параметром level:
Параметр level
Классы профилируемых функций
mmex
М-функции, М-подфункции, МЕХ-функции; этот уровень принят j
по умолчанию j
builtin
То же и встроенные функции j
operator
То же, а также встроенные операторы низшего уровня типа plus, minus i
и т. п.
3. Программирование и отладка
211
Команда profile on -history запускает процедуру профилирования, удаляя ранее за¬
писанную статистику, и записывает хронологию вызова всех используемых функций.
Предельное количество таких вызовов 10 ООО; при большем числе вызовов ведется за¬
пись других статистик, но не хронологии вызова.
Команда profile off завершает процедуру профилирования.
Команда profile resume перезапускает процедуру профилирования без удаления за¬
писанной статистики.
Команда profile clear удаляет статистику, записанную в процессе профилирования.
Команда profile report приостанавливает процедуру профилирования, генерирует
отчет в формате HTML и выводит его в окне просмотра.
Команда profile report <имя_файла> приостанавливает процедуру профилирования,
генерирует отчет в формате HTML, сохраняет отчет в наборе файлов с именем
<имя_файла> в текущем каталоге и выводит его в окне просмотра.
Команда profile plot приостанавливает процедуру профилирования и выводит
в графическом окне результаты профилирования в виде диаграммы Парето.
Команда profile status выводит информацию о текущем состоянии процесса профи¬
лирования следующего вида:
Поле
Значение
Profilerstatus t
'on' или 'off'
DetailLevel ’
'mmex', 'builtin' или 'operator'
HistoryTracking
'on' или 'off'
Функция stats = profile(’info') завершает процедуру профилирования и выводит
на экран структуру массива записей со следующими полями:
• FunctionTable
Массив, содержащий записи всех вызываемых функций
FunctionHistory
Массив, содержащий хронологию вызова функций
Clockprecision
Точность измерения времени профилировщика
Сопутствующие операторы: DEBUG, PROFREPORT.
PROFREPORT |
Сформировать отчет о профиле
Синтаксис:
profreport
profreport(’<имя_файла>’)
profreport(stats)
profreport(’<имя_файла>stats)
212
В. Г. Потемкин. Вычисления в среде MATLAB
Описание:
Оператор profreport генерирует отчет в формате HTML.
Оператор рго^ероП(’<имя_файла>’) генерирует отчет в формате HTML, сохраняет
отчет в наборе файлов с именем <имя_файла> и выводит его в окне просмотра.
Оператор profreport(stats) генерирует отчет в формате HTML, используя массив за¬
писей stats, возвращаемый функцией stats = profile('info’).
Оператор ргоГгероП(’<имя_файла>', stats) генерирует отчет в формате HTML, ис¬
пользуя массив записей stats, сохраняет отчет в файле с именем <имя_файла> и выво¬
дит его в окне просмотра.
Пример:
1. Запустить процедуру профилирования для М-файла, который вычисляет функцию
ошибки erf с профилированием встроенных операторов.
profile on -detail operator
z = erf(0:0.01:100);
2. Просмотреть массив записей, содержащий результаты профилирования.
stats = profile(’info')
stats =
FunctionTable: [36x1 struct]
FunctionHistory: [2x0 double]
ClockPrecision: 0.06
3. Просмотреть содержимое второго элемента структуры FunctionTable.
stats.FunctionTable(2)
ans =
FunctionName: ':'
FileName: ’'
Type: 'Builtin-function’
NumCalls:
1
TotalTime:
0.03
. TotalRecursiveTime:
0.03
Children:
[0x1
struct]
Parents:
[0x1
struct]
ExecutedLines:
[0x4
double]
AcceleratorMessages:
{1x0
cell}
4. Сформировать из записей полей отчет профиля.
profreport(stats)
MATLAB выводит отчет профилирования, как показано на рис. 3.66.
3. Программирование и отладка
213
MATLAB Profile Report: Summary
Report generated 21-Feb-2003 13:15:43
Total recorded time:
0.64 s
Number of Builtin-functions:
6
Number of M-functions:
Number of MEX-functions:
2
1
Clock precision: 0.00000006 s
Clock Speed: 1683 Mhz
Function List
[Name Time | Calls [lime/call i Self time Location
|erf [0.42100000 [б5.7% [ 1 [0.421000000 Ю.42100000 [65.7% !c;/HATLAB6p5/toolbox/matlab/apecfun/erf.m
[0.08000000 |12_5% [ T [0Л80000000 [0.08000000 [ш% Builtin-fiinction
y)ws [0.08000000 1123% j Г [0 080000000 jO.08000000 jl2 5%
Il [0.03000000 I 4.7% r~T|0.03000006d[о’озоооооо I 4.7% Bioltin-junction
[display [(102000000 [3.1% [ 2 [O.OIOOOOOOO [0.02000000 [31% Builtm-junction
[callstats [0.01000000 [ 1.6% [ 2 [О.ООЗОООООО [o.01000000 [ 1.6% Builtin-Junction
^profile Ю.01000000 [ 1.6% i 1 ^O.OIOOOOOOO iO.OOOOOOOO j 0.0% ic: /HATLABopS/toolbox/matlab/general/profi le .m
class
[0.00000000 1
0.0% [
2 [0.000000000 [0.00000000 1
0.0% BuiltiYi-junction
lerf core
[0.000000001
0.0% 1
1 [0.000000000 [0.000000001
0.0% :/MATLAB6p5/toolbox/maclab/apecfun/ erf core. dll
рис. 3.66
Сопутствующий оператор - PROFILE.
3.6. Эффективность вычислений в среде MATLAB
Большое число инженеров и ученых используют для исследования, проектирова¬
ния и реализации технических приложений 2 типа языков программирования: 3GL-
языки третьего поколения, такие, как С, C++, Fortran и Basic, и 4СЬ-языки четвертого
поколения, такие, как MATLAB. И хотя последние исключительно просты и удобны
при работе с приложениями, некоторые операции могут быть более эффективно реа¬
лизованы на языках третьего поколения. Фирма MathWorks разработала технологию,
которая объединяет простоту языков четвертого поколения с производительностью
языков третьего поколения. Ускоритель времени исполнения JIT-Accelerator, входя¬
щий в состав версии MATLAB 6.5 (Release 13), включает технологические новшества,
которые позволяют существенно повысить эффективность исполнения программ
на языке MATLAB.
Источники повышения производительности
Языки третьего поколения называют процедурными языками высокого уровня
по отношению к языкам низкого уровня - Ассемблера или машинного кода. Для пре¬
образования языка высокого уровня в язык низкого уровня применяются трансляторы,
для эффективной работы с которыми требуется большой опыт в области программи¬
рования.
214
В. Г. Потемкин. Вычисления в среде MATLAB
Языки четвертого поколения в меньшей степени процедурные, поскольку исполь¬
зуют конструкции, близкие к предложениям естественного языка. Эти языки позволя¬
ют реализовать диалог человека с машиной и часто используются для работы с базами
данных. Именно по этой причине языки четвертого поколения много проще языков
третьего поколения. Однако для исполнения их операторов, как правило, используют¬
ся интерпретаторы, а не компиляторы, и поэтому они существенно уступают языкам
третьего поколения по быстродействию.
Язык MATLAB - это язык четвертого поколения, специально разработанный для
выполнения научных и технических расчетов. Именно поэтому в нем исключительно
эффективно реализованы операции над векторами и матрицами, но реализация других
операций, и в первую очередь здесь имеются в виду циклические операции, оказалась
не столь эффективной, как в языках третьего поколения.
Одно из существенных достоинств языка MATLAB состоит в том, что пользовате¬
ли не должны объявлять типы переменных, как это требуют процедурные языки.
В языке MATLAB переменной можно присвоить значения данных любого типа, и этот
тип можно изменить, присваивая новое значение другого типа.
В версиях языка MATLAB, предшествовавших версии 6.5, выполнение операторов
включало 2 шага: на первом шаге код языка MATLAB конвертировался в линейную
последовательность P-кодов; на втором шаге каждая инструкция P-кода выполнялась
интерпретатором. Это требовало дополнительных затрат времени. Если P-код соответ¬
ствовал оператору высокого уровня, то время на его выполнение значительно превы¬
шало накладные расходы, связанные с интерпретацией, так что суммарные непроизво¬
дительные расходы составляли лишь небольшую долю от общего времени выполнения
оператора. Однако в других случаях и, это в первую очередь относится к кодам обра¬
ботки скалярных величин и операторов цикла, P-код выполнялся настолько быстро,
что расходы на интерпретацию составляли существенную долю времени исполнения.
Кроме того, в этих версиях системы интерпретатор языка MATLAB был ориентирован
на работу с самыми общими типами данных, и как следствие, обработка скалярных
данных приводила к большим непроизводительным расходам как времени, исполне¬
ния, так и памяти.
JIT-ускоритель. Ускоритель времени исполнения JIT-Accelerator (Just-In-Time Accel¬
erator) - это новое встроенное инструментальное средство, которое позволяет сущест¬
венно повысить производительность выполнения кода. Версия MATLAB 6.5 - это
первая реализация системы, которая включает JIT-ускоритель. Главная цель этой реа¬
лизации - повысить скорость выполнения циклов и скалярных вычислений. Для этого
применяется 2 метода: генерация кода в момент исполнения (Just-In-Time Code Genera¬
tion) и анализ типов данных в момент исполнения (Run-time Type Analysis).
Генерация кода в момент исполнения означает, что ЛТ-ускоритель конвертирует
инструкции P-кода непосредственно в машинный код. Такие инструкции не требуют
применения интерпретатора и выполняются очень быстро. В некоторых случаях код,
генерируемый ЛТ-ускорителем, может выполняться в сотни раз быстрее, чем интер¬
претация, характерная для предшествующих версий системы. Хотя большинство про¬
грамм не будет иметь такого повышения производительности, скалярные коды, испол¬
няемые в очень длинных циклах, могут быть ускорены в сотни раз. Пользователи,
работающие на компьютерах с процессорами Intel х86 в среде операционных систем
Linux и Windows, могут рассчитывать на еще большую производительность.
3. Программирование и отладка
215
Анализ типов данных в момент исполнения основан на следующей предпосылке:
если строка М-кода была уже обработана, то весьма вероятно, что переменные и соот¬
ветствующие им массивы сохраняют тот же тип и те же размеры при исполнении но¬
вой аналогичной строки. Когда строка выполняется первый раз, система проверяет ти¬
пы переменных и размеры массива и генерирует специальный код. Последующее
выполнение таких же строк может использовать этот код, но при условии, что типы
переменных и размеры массивов не изменились. Поскольку тип данных изменяется
крайне редко, то такие строки будут выполняться очень быстро. Если тип данных из¬
менился, код описания данных должен быть сгенерирован заново.
Используемая в прежних версиях системы векторизация кода преследовала две це¬
ли - более короткую запись алгоритма и сокращение времени исполнения. Теперь
применение JIT-ускорителя позволяет в определенной степени отказаться от вектори¬
зации. Пользователи могут писать программы наиболее понятным и простым спосо¬
бом/а ЛТ-ускоритель обеспечит оптимальную производительность. Циклы, обрабо¬
танные ускорителем, выполняются так же быстро, как и векторизованные коды. Если
коды были уже векторизованы, то ускоритель привносит незначительное улучшение.
Векторизация сохраняет свою актуальность, если код остается понятным и лаконич¬
ным.
Ускоряемые операторы. Программы, написанные на языке MATLAB, только тогда
будут выполняться достаточно быстро, когда значительные фрагменты кода исполь¬
зуют конструкции, ускоряемые с помощью ЛТ-ускорителя. Всякий раз, когда приме¬
няются неускоряемые конструкции, работа ЛТ-ускорителя прерывается и использует¬
ся обычный интерпретатор. Чем больше таких конструкций встречается, тем больше
затрачивается времени на выполнение. Поэтому важно знать те конструкции языка
MATLAB, которые ускоряются ЛТ-ускорителем.
Типы данных. На рис. 3.67 показана уже известная читателю иерархия типов дан¬
ных системы MATLAB 6.5. Здесь серым цветом закрашены те типы данных, примене¬
ние которых повышает эффективность кода при использовании ЛТ-ускорителя. Как
следует из анализа рисунка, можно ускорить исполнение инструкций, которые обраба¬
тывают полные массивы действительных и комплексных чисел удвоенной точности,
массивы логических и строковых элементов, а также целочисленные массивы с 8, 16
и 32-битовыми числовыми элементами. Обработка разреженных массивов не может
быть ускорена.
| Logical-]
NUM
ARRAY
(full, sparse]
' I .
1—
ERIC cell structure
function
handle
user classes java classes
int8, uint8,
int 16, uint16,
j-П 132„ li an t32,
Int64,uint64
single |double]
рис. 3.67
216
В. Г. Потемкин. Вычисления в среде MATLAB
Предельная размерность массива. ЛТ-ускоритель позволяет ускорить обработку
только тех многомерных массивов, размерность которых не превышает значения 3.
Размеры массива. При обработке массивов объем непроизводительных затрат вре¬
мени тем больше, чем меньше размер массива. Поэтому эффективность ЛТ-
ускорителя будет более заметна при работе с массивами небольшого размера.
Циклы FOR ... END, При применении циклов FOR ... END следует иметь в виду,
что ускорение таких циклов возможно только при определенных условиях:
• переменная цикла должна принимать только целочисленные значения;
• в цикле должны использоваться только те типы данных и многомерных массивов,
которые допускают применение ЛТ-ускорителя;
• допустимы вызовы только встроенных М-функций.
Производительность исполнения цикла оптимальна, если для каждой строки кода
может быть применен ЛТ-ускоритель. Если такое условие выполняется, то будет уско¬
рено выполнение всего цикла, включая оператор заголовка FOR и завершения цикла
END. Если это условие не выполняется, выполнение цикла прерывается на каждом
шаге, чтобы выполнить неускоряемые операторы.
Операторы условия. Операторы условия IF, ELSEIF, WHILE, SWITCH могут быть
ускорены только в тех случаях, когда проверяемое условие является скалярной величиной.
Неускоряемые операторы. Перечисленные ниже программные конструкции могут
существенно замедлить работу системы MATLAB, и их следует избегать, если произ¬
водительность вычислений имеет первостепенное значение.
Вызовы функций. Вызовы подфункций,- М и МЕХ-файлов или подфункции зани¬
мают значительное время и не могут быть ускорены. При этом код вызываемой функ¬
ции может быть оптимизирован, но процедура самого вызова может оказаться весьма
затратной. Другая проблема - это переопределение методов в рамках объектно-
ориентированного программирования, что приводит к необходимости вызова М-
и МЕХ-функции и замедляет исполнение операторов.
Более одного оператора в строке. При некоторых условиях наличие в строке про¬
граммы более одного оператора может значительно увеличить время ее выполнения.
Например, в следующей строке использован оператор присваивания полю массива
записей определенного значения, который не поддержан ЛТ-ускорителем.
f.name='Vai'; for k=l:10000, sin(k), end;
Поскольку интерпретатор системы MATLAB обрабатывает строку целиком, то на¬
личие в строке инструкции, которая не поддержана ЛТ-ускорителем, приведет к тому,
что вся строка будет обрабатываться стандартным интерпретатором.
Если же расписать эту конструкцию построчно:
f.name- 'Vai';
for k = 1:10000
sin(k);
end
то коэффициент ускорения будет близок к значению 4.
3. Программирование и отладка
217
Убедимся в этом, воспользовавшись профилировщиком и записав сценарий этого
теста в виде М-файла testacc. Отчет профилировщика показан на рис. 3.68.
testacc (1 call, 0.060 sec)
Generated 27-Feb-2003 09:37:21
M-script in file С
\M ATLAB6 n5\wo rk\t e st a с c. m
Lines where the most time was snent I table 1 list 1 hide 1
Line Number
Code
Calls
Total Time
% Time
Time Plot
1
f.name- 'Vai'; for k = 1:...
1
0.040 s
66.7%
■MM
3.
f.name» 'Vai';
1
0.010 s
16.7%
■
6
end
10000
0.001 s
1.6%
1
£
sin(k);
10000
0.000 s
0.6%
1
1'
for k - 1:10000
1
0.000 s
0.0%
All other lines
i
0.009 s
14.5%
■
Totals
0.060 s
100%
File listing
Color highlight code according to I Time I Number of Calls I Coverage I Acceleration I No Color ]
time calls
0.040 1
0.010
0.000
0.000
0.001
1
1
10000
10000
acc line
x
x 3 £.name= 'Vai';
. 4 for k = 1:10000
. 5 sin(k);
. 6 end
рис. 3.68
Из анализа этого отчета следует, что однострочная конструкция неускоряема
и время ее исполнения составляет 0.04 с. В многострочной конструкции неускоряема
только первая строка, время исполнения которой составляет 0.01 с; исполнение уско¬
ряемых строк цикла требует порядка 0.001 с, накладные расходы составляют 0.009 с.
Если не учитывать накладные расходы, то коэффициент эффективности многостроч¬
ной конструкции по отношению к неускоряемой однострочной конструкции составит
0.04/0.011,т. е. 3.6.
Новый тип данных или размер массива. Если при выполнении программы исполь¬
зуемому массиву присваиваются значения нового типа или изменяется размер масси¬
ва, то ЛТ-ускоритель должен настроиться на эти изменения. Например, в следующем
фрагменте переменная X изменяет тип double array на char array и это увеличивает
время выполнения.
218
В. Г. Потемкин. Вычисления в среде MATLAB
X = 23;
- ускоряемый код -
X = 'А'; % Эта строка приостанавливает процедуру ускорения
- продолжение ускоряемого кода -
Использование констант комплексного числа. По умолчанию система MATLAB
интерпретирует элементы i и j, применяемые в сценариях, как переменные, а не как
комплексные константы. Это приводит к тому, что операторы, использующие такие
элементы, не обрабатываются ЛТ-ускорителем и, как следствие, не ускоряются. По¬
этому необходимо явным образом указать, что i и j являются константами комплекс¬
ного числа.
В системе MATLAB операцию присваивания переменной х значения комплексного
числа можно записать в форме арифметического выражения либо в форме присваива¬
ния константы:
Форма выражения
Форма константы
х = <а> + <b>*i
х = <а> + <b>i
Здесь <а> и <Ь> - числовые значения переменных а и Ь. В форме выражения эле¬
мент i интерпретируется как переменная неизвестного типа и размера; в форме кон¬
станты элемент i интерпретируется как константа и ускоряется ЛТ-ускорителем. Это
же справедливо и для частного случая:
Форма выражения
Форма константы
х = i
х = li,
При этом форма константы ускоряется ЛТ-ускорителем, а форма выражения нет.
Пример кода с максимальным ускорением. Программы, которые состоят из боль¬
ших непрерывных фрагментов кода и содержат инструкции, ускоряемые ЛТ-
ускорителем, будут демонстрировать наибольшую производительность. Это обуслов¬
лено тем, что, когда ЛТ-ускоритель встречает инструкцию, которая не может быть ус-
' корена, он передает управление обычному интерпретатору. По этой причине наиболее
существенное ускорение достигается при выполнении таких М-функций и М-
сценариев, которые прежде всего состоят из стандартных циклов, работающих со ска¬
лярными данными и не вызывающих других М-файлов.
Фрагмент, представленный на рис. 3.69, а, является примером кода с максималь¬
ным ускорением.
3. Программирование и отладка
219
File listing
Color highlight code according to I Time I Number of Calls I Coverage I Acceleration I No Color 1
time
С. GOO
cal 1 s acc line
= 2.5;
1 .
1 a
0. GOO
1
2 b
-
3.33;
G. ООО
1 .
3 C
=
6.23;
G. ООО
1 .
4 for
i = 1:1000000
0.091
1000000
5
a = b + c;
0.092
1000000
6
b ” a - c;
0.СЭ5
1000000
7
c = b * a;
0.102
1000000
8
if (a > b)
0.081
857146 .
9
a ■ b - c;
0.012
142854 .
10
else
0.012
142854 .
11
b = b + 12
G.011
142854 .
12
end
0.102
1000000 .
13
end
a
Lines .where the most time was spent [ table I list I hide )
Line Number
Code
Calls
Total Time
% Time
Time Plot
U
end
1000000
0.102 s
9.5%
■
8
if (a > b)
1000000
0102 s
9.5%
■
7
c ■ b » a;
1000000
0.095 s
8.9%
■
&
b = a - c;
1000000
0.092 s
8.6%
■
£
a ■ b + c;
iooodoo
0.091 s
8.5%
■
All other lines
0.590 s
55.0% <
Totals
1.072 s
100%
6
Lines where the most time was spent | table I listI hide I
Line Number
Code
Calls
Total Time
% Time
Time Plot
1
a “ 2.5; h = З.ЯЗ; n = fi.... S
i 1
0.038 s
95.8%
"I
All other lines
0.002 s
4.2%
1
Totals
0.040 s
100%
File listing.
Color highlight code according to | Time I Number of Calls I Coverage I Acceleration I No Color ]
time calls acc line
в
Lines where the most time was spent [ table I list I hide ]
Line Number
Code
Calls
Total Time
% Time
Time Plot
1
a = 2.5; b = 3.33; c = 6... .
1
15.121 s
100.0%
All other lines
Os
0%
Totals
15.121 s
100%
File listing
Color highlight code according to I Time I Number of Calls I Coverage I Acceleration I No Color 1
time calls acc line
г
рис. 3.69
220
В. Г. Потемкин. Вычисления в среде MATLAB
Здесь цикл выполняется 1 млн. раз и использует только скалярную арифметику
и операцию сравнения. Все инструкции кода являются укоряемыми. Время выполнения
этого кода на компьютере с тактовой частотой 1700 МГц составляет 1.072 с (рис. 3.69, б).
Если свернуть программу в одну строку, то время исполнения составит 0.04 с (рис. 3.69, в).
Если сымитировать отсутствие ЛТ-ускорителя, то время исполнения неускоряемой
программы составит 15.121 с (рис. 3.69, г). Отсюда следует, что отношение времени
исполнения неускоряемой и ускоряемой программ, или, иными словами, коэффициент
повышения производительности, равен 378.
Реализация ЛТ-ускорителя - это первый шаг корпорации The MathWorks, Inc.
к достижению конечной цели - устранить различие по производительности для кодов
языка MATLAB и языков третьего поколения. В этом случае пользователям не потре¬
буется дополнительная работа по перекодированию программ на язык С. При исполь¬
зовании системы MATLAB 6.5 программы, которые включают много скалярной мате¬
матики и циклов итерационных вычислений, окажутся наиболее эффективными
по своей производительности и не будут уступать программам на языке С.
Удобная операционная среда, интуитивно понятный язык и наличие ЛТ-ускорителя
делают систему MATLAB 6.5 безусловным конкурентом процедурных языков для
технических вычислений. Это практически единственный инструмент, который мак¬
симизирует и производительность вычислений, и эффективность работы пользователя.
Работы по повышению скорости исполнения кода программ, написанных на языке MAT¬
LAB, фирма MathWorks предполагает продолжить и в дальнейших выпусках системы.
Векторизация и выделение памяти. В связи с появлением в составе системы
MATLAB 6.5 (Release 13) ЛТ-ускорителя возникает вопрос, насколько важными те¬
перь являются широко применяемые в предшествующих версиях методы векториза¬
ции кода и предварительного выделения памяти под массивы большого размера.
Теперь при интерпретации кода, который содержит циклы, ЛТ-ускоритель генери¬
рует P-код, который по времени исполнения практически не уступает векторизован¬
ному коду. Если ваши программы уже векторизованы, то существенного ускорения
при использовании ЛТ-ускорителя наблюдаться не будет. Однако вы можете выби¬
рать, какой код применить. Здесь следует предпочесть тот код, который наиболее по¬
нятен и максимально соответствует логике создаваемого приложения.
Векторизация циклов. Истоки языка MATLAB связаны с матричными вычисле¬
ниями, бурное развитие которых происходило в 60-80-х гг. прошлого столетия. В это
время вычислительные методы линейной алгебры активно внедрялись в практику ре¬
шения алгебраических и дифференциальных уравнений, а также проектирования сис¬
тем управления, обработки сигналов и другие приложения. В это же время были пред¬
ложены специальные архитектуры векторных машин для операций над матрицами
больших размерностей. Разработанный в 80-х г. язык MATLAB не прошел мимо этих
новшеств и использовал идею векторизации вычислений. По существу, это единствен¬
ный язык, который реализовал механизм векторных вычислений и в полной мере ис¬
пользовал преимущества математического сопроцессора. Векторизация позволила от¬
казаться от применения циклов, заменила циклы FOR и WHILE операторами
обработки матриц, используя в качестве элементарных объектов строки и столбцы,
а не отдельные элементы. При этом векторная запись алгоритма оказывается более
компактной, но пользователю приходится менять "скалярное" мышление на "вектор-
221
3. Программирование и отладка
ное”, а это не всегда просто. Однако когда цель достигнута и создана эффективная
векторизованная программа, это доставляет эстетическое удовольствие.
Начиная с версии MATLAB 6.5 необходимость применять векторизацию становит¬
ся не такой острой, поскольку благодаря ЛТ-ускорителю скалярные циклы выполня¬
ются очень быстро. Однако существующие наработки и оригинальность найденных
векторных решений сохраняют за этой операцией достойное место при программиро¬
вании на языке MATLAB.
Рассмотрим тест векторизации цикла FOR...END.
Script
’Тест векторизации цикла FOR...END'
clear А % Векторизованная форма
tic, A=l:0.1:le5; t(l)=tOC;
clear А % Цикл FOR...END
tic, А(1е5)=0; е=1; for i=l:le5; A(i)=e; e=e+l; end, t(2)=toc*10;
Тест позволяет сравнить время выполнения векторизованных вычислений со вре¬
менем выполнения классического цикла FOR...END. Соответствующие сравнения бы¬
ли выполнены для версий MATLAB 6.1 и 6.5 на компьютере с тактовой частотой
1700 МГц. Результаты представлены в следующей таблице.
Способ вычисления
MATLAB 6.1
MATLAB 6.5
t6 ft65
l6i. С
кц
t65> С
^65
Векторизация
0.027 •
1
0.026.
1
Х1.04
Цикл FOR...END
5.52
х204
0.097
х3.75
х56
Итак, векторизованный цикл выполняется в версиях 6.1 и 6.5 практически с одина¬
ковым временем, различающимся лишь на 4 %, т. е. ЛТ-ускоритель незначительно из¬
меняет производительность векторизованных операций. Иначе обстоит дело с выпол¬
нением классического цикла FOR...END; если в версии 6.1 векторные вычисления
дают выигрыш в 204 раза, то в версии 6.5 с ЛТ-ускорителем этот выигрыш составляет
всего 3.75. Это означает, что коэффициент повышения производительности классиче¬
ского цикла при применении ЛТ-ускорителя составляет 56.
Рассмотренный пример показывает, что хотя эффективность векторных вычисле¬
ний для версии 6.5 и упала, но тем не менее соответствующий коэффициент составля¬
ет значение около 4. Отсюда следует, что и для версии 6.5 векторизация не потеряла
своей актуальности.
Для организации векторных вычислений применяются следующие векторизован¬
ные операторы языка MATLAB:
all
diff
ipermute
permute
reshape
squeeze
any
find
logical
prod
shiftdim
sub2ind
cumsum
ind2sub
ndgrid
repmat
sort
sum
Предварительное выделение памяти. Потребность в этом способе повышения эф¬
фективности вычислений сохраняется и при работе с версией MATLAB 6.5. Если тре-
222
В. Г. Потемкин. Вычисления в среде MATLAB
буется накапливать результаты обработки данных в некотором массиве, то целесооб¬
разно предварительно выделить необходимую память вместо того, чтобы увеличивать
размеры массива по мере поступления и обработки новых данных.
Предварительное выделение памяти помогает также избежать фрагментации памя¬
ти при работе с массивами больших размеров. В процессе работы системы фрагмента¬
ция возникает потому, что система непрерывно динамически выделяет и освобождает
участки оперативной памяти. Это приводит к тому, что в какой-то момент свободной
памяти много, но непрерывного участка для размещения нового массива нет. Избе¬
жать этого можно, если предварительно перед началом вычислений выделить доста¬
точные объемы памяти под массивы больших размеров.
Оценим эффективность предварительного выделения памяти, обратившись к сле¬
дующему тесту.
Script 4
'Тест предварительного выделения памяти’
clear А % Цикл с предварительным выделением памяти
tic, А(1е5)=0; е=1; for i=l:le5; A(i)=e; е=е+1; end, t(2)=toc*10;
clear A % Цикл без выделения памяти
tic, е=1; for i=l:le3; A(i)=e; e=e+l; end, t(3)=toc*1000;
Тест позволяет оценить эффективность предварительного выделения памяти
при реализации цикла. Соответствующие оценки выполнены для версий MATLAB 6.1
и 6.5. Результаты представлены в следующей таблице.
Способ вычисления
MATLAB 6.1
MATLAB 6.5
41^65
tei, с
^61
(65, С
&65
С предварительным выде¬
лением памяти
5.52
1
0.097
1
Х56.9
Без выделения памяти
54.0
Х9.78
4.5
Х46.4
Х12
Для версии 6.1 предварительное выделение памяти повышает эффективность вы¬
числений почти в 10 раз; для версии 6.5 с ЛТ-ускорителем - в 46 раз. Если сравнивать
эффективность версий, то при предварительном выделении памяти версия 6.5 работает
эффективнее версии 6.1 почти в 57 раз, а без выделения памяти - в 12 раз.
Рассмотрим некоторые приемы предварительного выделения памяти для массивов,
отличных от массивов типа double array. Допустим, необходимо сформировать массив
размера 2000x2000 из элементов типа int8. Один способ - сформировать массив такого
размера из элементов типа double, а затем преобразовать его в тип int8. Но в этом слу¬
чае промежуточный массив потребует 32 Мбайт памяти, в то время как результирую¬
щий массив имеет всего 4 Мбайт. Другой способ - воспользоваться векторизующей
функцией repmat, которая будет работать с 8-битовыми элементами. Это позволит сэ¬
кономить память и сократить время вычислений. На рис. 3.70 показаны результаты ра¬
боты этих двух операторов в виде протокола работы профилировщика.
3. Программирование и отладка
223
File listing
Color highlight code according to I Time I Number of Calls I Coverage I Acceleration I No Color I
time
calls
асе
line
0.010
1
X
1
clear,
0.523
1
2
1
х:
3
clear,
0.030
1
2<
А = repinat ( int8 (0) , 2000, 2000) ;
рис. 3.70
Оператор в строке 2, использующий массив типа double, оптимизирован по време¬
ни исполнения, которое равно 0.523 с; оператор repmat в строке 4 использует вектори¬
зованные вычисления и 8-битовые элементы, и его время исполнения составляет всего
0.03 с, т. е. в 174 раза меньше.
Советы по выполнению М-файлов. Пользователь должен помнить, что оформление
программы в виде М-функции, а не М-сценария позволяет сократить время ее выпол¬
нения. Это связано с тем, что в случае сценария программа интерпретируется по¬
строчно, а в случае функции она компилируется в P-код и загружается в оперативную
память целиком.
При работе с данными следует отдавать предпочтение операторам load и save
по сравнению с иными операторами ввода-вывода, поскольку первые выполняются
за меньшее время и не допускают фрагментации памяти.
Если программа выполняется в режиме отладки или включен режим "эхо", то JIT-
ускоритель не применяется.
Следующие операторы отладки, введенные из командной строки или включенные
в М-файл, препятствуют ускорению следующего за ним кода программы:
• dbstop if warning,
• dbstop if naninf | infnan,
• dbstop in <имя_файла>.
Оператор dbstop in <имя_файла> действует только на те М-файлы, в которых при¬
сутствуют операторы dbstop.
Оператор dbstop if error не оказывает влияния на работу ЛТ-ускорителя.
Для того чтобы выключить режим отладки и восстановить работу ЛТ-ускорителя,
надо выполнить соответствующие команды из группы dbclear.
Включение режима "эхо" для М-сценария или М-функции запрещает режим уско¬
рения для такого М-файла. Включение режима "эхо" для всех сценариев и функций
запрещает режим ускорения для всех М-сценариев и М-функций.
Если оказывается, что при работе с версией MATLAB 6.5 не происходит ускорения
исполнения циклов, проверьте, а не происходит ли в цикле заполнения массива дан¬
ных, размеры которого возрастают на каждом шаге.
При работе с системой MATLAB следующие операторы обеспечивают управление
оперативной памятью:
• Оператор whos сообщает информацию о памяти, выделяемой переменным в рабо¬
чей области.
• Оператор pack выгружает переменные из рабочей области на диск, а затем разме¬
щает их в памяти в одной непрерывной области, без фрагментации.
224
В. Г. Потемкин. Вычисления в среде MATLAB
• Оператор clear удаляет переменные из рабочей области. Эту операцию рекоменду¬
ется применять периодически по мере того, как переменные перестают использо¬
ваться программой.
• Оператор save позволяет сохранить переменные на диске. Эту операцию рекомен¬
дуется применять при работе с большими массивами данных и периодически запи¬
сывать данные на диск, а затем удалять освободившиеся переменные из рабочей
области.
• Оператор load загружает данные, сохраненные на диске, в рабочую область.
• Оператор quit завершает работу системы MATLAB и возвращает освободившуюся
оперативную память операционной системе.
Для того чтобы эффективно использовать оперативную память, необходимо со¬
блюдать следующие рекомендации:
• избегать создания временных массивов большого размера и удалять переменные
по мере их использования;
• при работе с массивами фиксированного размера используйте механизм предвари¬
тельного выделения памяти;
• по мере возможности присваивайте переменной значение пустого массива или уда¬
ляйте переменную из рабочей области оператором clear;
• стремитесь, как можно чаще использовать переменные повторно.
Поскольку в системе MATLAB реализовано динамическое распределение памяти,
в процессе длительного сеанса работы эта память может оказаться фрагментирован¬
ной, т. е. в целом свободной памяти может- быть много, но непрерывные области дос¬
таточного размера могут отсутствовать. В этом случае система MATLAB может вы¬
дать предупреждение Out of Memory - ’’Недостаточно оперативной памяти”. Если
получено такое предупреждение, следует применить оператор pack, который позволя¬
ет выполнить дефрагментацию памяти. Поскольку эта операция требует значительного
времени, никогда не применяйте ее в циклах и в теле М-функций.
Если после применения оператора pack свободной памяти по-прежнему недоста¬
точно, следует внимательно проверить использование переменных и удалить неис¬
пользуемые.
Если программа формирует массивы данных очень большого размера, предусмот¬
рите систематическую перезапись данных на диск и очистку освобождающегося про¬
странства рабочей области для записи новых данных.
Массивы с большим количеством нулевых элементов следует накапливать в виде
разреженных матриц с атрибутом sparse, которые занимают меньшие объемы опера¬
тивной памяти и позволяют применять специальные методы, сокращающие время об¬
работки по сравнению с полными матрицами.
Для размещения массивов записей и массивов ячеек не требуется непрерывных
участков памяти, поскольку реально они представляют собой массивы указателей, ко¬
торые ссылаются на другие массивы, для которых уже требуются непрерывные участ¬
ки памяти.
В зависимости от того, насколько вы использовали возможности ускорения, ваша
программа должна увеличить свою производительность при выполнении на любой
3. Программирование и отладка
225
вычислительной платформе. Однако наиболее заметный эффект ускорения будет при
выполнении программ на компьютерах с процессорами Intel Х86 и операционными
системами Windows и Linux.
При работе в системе MATLAB избегайте запуска процессов в фоновом режиме.
Тесты оценки производительности
В этом разделе рассмотрено несколько тестов для оценки эффективности вычисле¬
ний с использованием системы MATLAB. Общепринятыми тестами оценки произво¬
дительности научных вычислений являются тесты, которые включают операции над
матрицами большой размерности и визуализацию научной графики. Кроме того, рас¬
смотрены тесты оценки производительности ЛТ-ускорителя.
Тест производительности системы. В состав системы MATLAB включен тест для
оценки ее производительности, который состоит из шести задач:
Название
теста
Описание теста
Класс теста
LU
Верхнее треугольное разложение мат¬
рицы размера 1000x1000
Арифметика с плавающей точкой
FFT
Быстрое преобразование Фурье
Арифметика с плавающей точкой
ODE
Решение обыкновенных дифференци¬
альных уравнений
Структуры данных и вызов внешних
М-функций
Sparse
Обращение разреженной матрицы
Смешанные вычисления: целочислен¬
ные и с плавающей точкой
2-D
Построение двумерных изображений
Двумерная графика
3-D
Логотип ф^рмы Math Works
Трехмерная анимация, графика
OpenGL
Тест LU. Этот тест связан с часто используемой операцией треугольного разложе¬
ния случайной матрицы размера 1000x1000:
1и(0) ;
п = 1000; А = randn(n,n);
tic, X = lu(A); t(l) = toe;
В первой строке выполняется вызов М-функции 1и для загрузки ее в оперативную
память. Затем следуют начальные присваивания переменным, и, наконец, третья стро¬
ка представляет собой собственно тест LU.
На основе этого теста можно построить весьма показательную зависимость произ¬
водительности компьютера от размера матрицы при решении систем линейных алгеб¬
раических уравнений. Идея этого теста принадлежит Моулеру и описана в работе [77].
В этом тесте оценивается производительность компьютера в зависимости от размера
матрицы системы, что позволяет не только определить быстродействие процессора,
но и учесть ограничения по объему кеш-памяти. Тест оценивает быстродействие
в единицах MFLOPS - миллионов операций с плавающей точкой в секунДу. Сущест¬
вуют априорные оценки количества таких операций, необходимых для решения задач
226
В. Г. Потемкин. Вычисления в среде MATLAB
линейной алгебры [4]. Так, для задачи обращения матрицы размера пхп количество
требуемых операций определяется формулой.
N = 2/3*пА3+2*пА2.
Тогда в качестве теста можно использовать следующую программу, которая оце¬
нивает производительность компьютера при изменении размера используемой матри¬
цы в диапазоне от 100 до 4000 с шагом 100:
for п = 100:100:4000
А = randn(n,n); b = randn(n,l);
tic, х = A\b; t = toe;
mflops(n) =(2/3*nA3+2*nA2)/t/le6 ;
end
Соответствующие графики производительности компьютера с тактовой частотой
1700 МГц при работе в среде операционных систем Windowsxp и Windows 98 показа¬
ны на рис. 3.71.
рис. 3.71
При работе в среде Windows 98 кеш-память ограничена и при значении п, равном
3600, выдается предупреждение Out of memory. Это позволяет оценить объем кеш-
памяти:
V = пЛ2*8/2А20 = 98.9М.
В среде Windowsxp расчеты не прерываются, но время существенно возрастает из-
за необходимости подкачки и производительность для значения п, равного 4000, пада¬
ет относительно максимума более чем в 2,5 раза, до 350 MFLOPS.
Тест FFT. Тест быстрого преобразования Фурье построен следующим образом. Фор¬
мируется выборка случайных чисел, распределенных по нормальному закону, длиной
220, т. е. более 1 млн. элементов, показанная на рис. 3.72, а; на рис. 3.72, б показан
спектр этого сигнала.
3. Программирование и отладка
227
а
рис. 3.72
Программа тестирования выглядит следующим образом:
fft(O);
п = 2Л20; х = randn(l,n);
tic, у = fft(x); clear у;
У = fft(x);
t(2) = toe;
В первой строке выполняется вызов М-функции fft для загрузки ее в оперативную
память. Затем следуют начальные присваивания переменным и только следующие
3 строки представляют собой собственно тест FFT. Преобразование Фурье при этом
вычисляется дважды, чтобы, по мнению авторов алгоритма, уравнять время выполне¬
ния этого теста с тестом LU.
Тест ODE. Этот тест связан с решением системы обыкновенных дифференциальных
уравнений Ван дер Поля
xj = х2;
х2 = -Ц(Х!2 - 1)х2 - X, , Х10,Х20
с параметром ц, равным 1, и начальными условиями х10 = 2, х20 = 0.
Программа тестирования имеет следующий вид:
F = @vdpl;
хО,= [2; 0]; tspan = [0 eps];[s,x] = ode45(F,tspan,у0);
tspan = [0 400];
tic
[szx] = ode45(F,tspan,xO);
t(3) = toe;
Здесь в первой строке объявляется дескриптор М-функции vdpl, которая вычисляет
правые части системы ОДУ на каждом шаге интегрирования; во второй строке выпол¬
няется начальный вызов решателя ode45 для загрузки этой программы в оперативную
228
В. Г. Потемкин. Вычисления в среде MATLAB
память, затем задается интервал интегрирования; в последних трех строках размеща¬
ется собственно тест ODE.
Тест Sparse. Этот тест связан с построением конечно-разностной аппроксимации
уравнения Лапласа на квадратной двумерной сетке и решением возникающей системы
линейных уравнений с 5-диагональными разреженными матрицами большого размера.
Программа тестирования имеет следующий вид:
п = 120;
А = delsq(numgrid('L',n)); b = sum(A)1;
spparms ( ' autoiumd' , 0) ;
tic
x = A\b;
t(4) = toe;
Здесь в первой строке объявляется количество узлов сетки, а во второй строке
строится сеточная аппроксимация уравнения Лапласа, которая определяется матрицей
А размера 10443x10443 и вектором b размера 10443x1. В третьей строке устанавлива¬
ются параметры решателя СЛАУ для разреженных матриц, и в последних трех строках
размещается собственно тест Sparse.
Тест 2-D. Тест двумерной графики. Этот тест связан с построением и выводом на эк¬
ран в виде графиков аппроксимирующих полиномов Бернштейна.
Программа тестирования имеет следующий вид:
figure
set(gcf,'doublebufferon')
x = (0:1/256:1-)'; plot(x, bernstein (x, 0) )
drawnow
tic
for j =1:2
for n = [1:12 11:-1:2]
plot(x, bernstein(x,n))
drawnow
end
end
t(5) = toe;
Здесь первые 4 строки выполняют начальные установки и загрузку программ
в оперативную память. Следующие строки реализуют собственно тест, который по¬
вторяется дважды и выводит на экран графики полиномов Бернштейна. Эти полиномы
задаются следующими рекуррентными соотношениями:
Вк(х) = Скхк(1-х')п~к, к=0:п,
где п - степень полинома Бернштейна, а к - номер полинома. Программа формирова¬
ния полиномов Бернштейна имеет следующий вид:
function В = bernstein(xzn)
% BERNSTEIN Полиномы Бернштейна, определяемые соотношениями
% В_sub—к(х) = nchoosek(n,к)*х.лк.*(1-х).л(п-к), к = 0:п
3. Программирование и отладка
229
X = X ( : ) ;
В = zeros(length(x),n+1);
B(:,l) = 1;
for к = 2:n+l
B(:,k) = x.*B(:,k-l);
for j = k-l:-l:2
B(:,j) =x.*B(:,j-l) + (1-x).*B(:,j);
end
B(:,l) = (1-x).*B(:,1);
end
Тест 3-D. Тест трехмерной графики. Этот тест основан на решении уравнений в част¬
ных производных, описывающих колебания закрепленной мембраны, и связан с по¬
строением и выводом на экран собственных форм ее колебаний. Образ этой мембраны
используется фирмой MathWorks в качестве логотипа ( рис. 3.73).
рис. 3.73
Цель теста создать анимацию колебаний мембраны и проверить возможности
трехмерной графики на исследуемом компьютере. Форма колебаний мембраны с уче¬
том первых трех тонов описывается следующим соотношением:
L = cosCXi^Lj + sin(X2r)L2 + sin(X3r)L3,
где собственные частоты первых трех тонов колебаний равны: Ai = 3.1048, Л2 = 3.8984,
Л3 = 4.4429, или соответственно fi = 0.49 Гц, f2 = 0.62 Гц и f3 = 0.70 Гц.
Программа тестирования имеет следующий вид:
logo
set(gcf, 'color’, [.8 .8 .8])
s = findobj('type','surf');
set(s, 'facelighting', 'gouraud')
LI = 40*membrane(1,25);
L2 = 10*membrane(2,25);
L3 = 10*membrane(3,25);
mu = sqrt([9.6397238445 , 15.19725192, 2*piA2]);
n = 40;
tic
for j = 0:n
t = 0.5*(l-j/n);
L = cos(mu(1)*t)*L1 + sin(mu(2)*t)*L2 + sin(mu(3)*t)*L3;
230
В. Г. Потемкин. Вычисления в среде MATLAB
set(s,'zdata',L)
drawnow
end
t(6) = toe
Первые строки выполняют подготовительную работу: вызывают М-функцию фор¬
мирования логотипа, изменяют цвет фона и подсветку, а также вычисляют первые
3 собственные функции, характеризующие колебания мембраны. Собственно тест реа¬
лизован в цикле FOR...END, где формируется 40 положений мембраны во времени,
соответствующих колебаниям мембраны в течение 0.5 с реального времени.
Тест оценки производительности системы MATLAB оформлен в виде М-функции
с именем bench.
BENCH |
Тест производительности системы
Синтаксис:
bench
bench (N)
bench(0)
T = bench(N)
Описание:
Оператор bench запускает на выполнение эталонный тест оценки производительно¬
сти системы MATLAB.
Оператор bench(N) запускает на выполнение эталонный тест N раз.
Оператор bench(O) выводит на экран информацию о тестировании из файла
.../toolbox/matlab/demos/bench.dat (рис. 3.74).
■ MATLAB 6.5 Benchmark Data.
[^Revision: 1.10 $
UDate: 2002/06/19 17:26:02 $
|Get latest revision Cron:
f http:/www.nathworks.con/natlabcentral/flleexchange/riles.jsp?field»1836
i LU ГГТ
ODE
Sparse
2-D
3-D
jIntel Pentium3 700MHz Laptop 2.0933 2.3500
1.2020
1.8230
1.7290
2.5540
* Windows 2000, ATI Mobility
J Intel Pentium4 2.0GHz 0.8440 1.6410
0.5620
0.7970
0.9220
0.5940
f Windows 2000, Matrox G450
f AMD Athlon 600Mhz 1.6819 3.0545
1.9673
2.5462
2.8626
3.8693
* Linux, Pentium 3 BLAS, Software OpenGL
!AMD Athlon 1800+ Dual 0.6702 1.3188
0.6752
0.9850
0.8665
0.4710
i- Linux, Matrox G450
!HP PA-8700 750MHz 0.5040 2.2458
0.7684
1.3686
1.3578
2.4139
| HP-UX, Visualize FX10
Compaq Alpha 21264B 834Mhz 0.8588 0.9543
1.0236
1.2184
1.3656
1.0363
Tru64, PowerStorn 350, Software OpenGL
IBM Power3 450Mhz 0.5956 1.7016
1.1413
1.4862
2.0769
3.0919
AIX, GXT4000P
SGI R12000 400Mhz 1.4594 3.4102
2.7477
2.0578
5.3070
2.0957
IRIX64, V10 graphics
Sun UltraSPARC-II 750Mhz 1.0215 2.7104
1.5564
2.1607
1.8234
3.5861
Solaris, PGX64
Macintosh G4 1.0GHz Dual 0.9688 1.7966
0.7920
1.4270
1.8071
3.1606
OS X, Graphics uses X-windows, OroborOSX and Mesa,
GeForce4
MX
рис. 3.74
3. Программирование и отладка
231
Обновленные версии этого файла можно найти на сайте фирмы MathWorks по ад¬
ресу: http:/www.math works.com/matlabcentraI/fileexchange/Files.jsp ?field=l 836
Примеры:
Выполним тест на компьютере с тактовой частотой 1700 МГц и объемом оператив¬
ной памяти 256 Мбайт.
clear all
bench
М MATLAB 6.5 Benchmark
.jnjxj
LU
FFT
ODE
Sparse
2-D
3-D
AMD Athlon 1800+ Dual
0.67
1.32
0.68
0.98
0.87
0.47
Intel Pentium4 2.0GHz
0.84
1.64
0.56
0.80
0.92
0.59
Compaq Alpha 21264B 834Mhz
0.86
0.95
1.02
1.22
1.37
1.04
HF PA-8700 750MHz
0.50
2.25
0.77
1.37
1.36
2.41
: This machine
1.02
2.43
1.49
0.98
1.71
2.08 j
Macintosh G4 1.0GHz Dual
0.97
1.80
0.79
1.43
1.81
3.16
IBM Power3 450Mhz
0.60
1.70
1.14
1.49
2.08
3.09
Intel Pentium3 700MHz Laptop
2.09
2.35
1.20
1.82
1.73
2.55 |
Sun UltraSPARC-II 750Mhz
1.02
2.71
1.56
2.16
1.82
3.59
AMD Athlon 600Mhz
1.68
3.05
1.97
2.55
2.86
3.87
SGI R12000 400Mhz
1.46
3.41
2.75
2.06
5.31
2.10
[*Э MATLAB 6.5 Benchmark
а
Relative Speed
6
рис. 3.75
Результаты тестирования показаны соответственно на рис. 3.75, а и рис. 3.75, б
в виде числовых данных и в виде диаграммы.
232
В. Г. Потемкин. Вычисления в среде MATLAB
Выполним тест 4 раза:
Т = bench(4) % рис. 3.76
т =
1.02
2.78
1.53
1.06
1.91
2.25
1.05
2.48
1.58
1.01
1.79
2.11
1.02
2.45
1.52
1.01
1.82
2.12
1.03
2.43
1.54
1.00
1.79
2.12
MATLAB 6.5 Benchmark
S'*-
LU
FFT
ODE
Sparse
s 2-D
3-D
AMD Athlon 1800+ Dual
0.67
1.32
0.68
0.98
0.87
0.47
Intel Pentium4 2.0GHz
0.84
1.64
0.56
0.80
0.92
0.59
Compaq Alpha 21264B 834Mhz
0.86
0.95
1.02
1.22
1.37
1.04
HP PA-8700 750MHz
0.50
2.25
0.77
1.37
1.36
2.41
This machine
1.03
2.43
1.54
1.00
1.79
2.12
Macintosh G4 1.0GHz Dual
0.97
1.80
0.79
1.43
1.81
3.16
This machine
1.02
2.45
1.52
1.01
1.82
2.12
This machine
1.05
2.48
1.58
1.01
1.79
2.11
IBM Power3 450Mhz
0.60
1.70
1.14
1.49
2.08
3.09
This machine
1.02
2.78
1.53
1.06
1.91
2.25
Intel Pentium3 700MHz Laptop
2.09
2.35
1.20
1.82
1.73
2.55
Sun UltraSPARC-II 750Mhz
1.02
2.71
1.56
2.16
1.82
3.59
AMD Athlon 600Mhz
1.68
3.05
1.97
2.55
2.86
3.87
SGI R12000 400Mhz
1.46
3.41
2.75
2.06
5.31
2.10
рис. 3.76
Как следует из анализа полученной статистики, данные незначительно изменяются
от прогона к прогону. Получим их усредненные оценки.
mean(T)
ans =
1.03 2.54 1.54 1.02 1.83 2.15
Сопутствующий оператор - PROFILE.
Тесты для JIT-ускорителя. Реализованный в системе MATLAB 6.5 ускоритель вре¬
мени исполнения был тестирован разработчиками на следующих вычислительных
платформах:
Операционная
система
Тип процессора
Тактовая частота,
МГц
Объем памяти,
Мбайт
Windows
Intel x86
1000
256
Linux
Pentium III
550
256
Solaris
Sparc
270
128
Тестируемая программа просматривает 2 отсортированных входных вектора, нахо¬
дит общие элементы и возвращает их индексы.
Сравниваются 2 версии программы: первая использует цикл WHILE...END, вто¬
рая - векторизованные вычисления.
3. Программирование и отладка
233
Циклическая программа. Текст программы, использующей цикл WHILE...END,
представлен на рис. 3,77.
function [alndex, blndex] = vfind_scalar(avec, bvec)
avecLen = length(avec);
bvecLen = length(bvec);
% Векторы alndex и blndex должны быть большого размера
outlen = min(avecLen, bvecLen);
alndex = zeros(outlen,1);
blndex = zeros(outlen,1);
n = 0;
ai = 1 ;
bi = 1;
while (ai <= avecLen || bi <= bvecLen)
% Вычислить элементы с индексами ai и bi
А = avec(ai);
В = bvec(bi);
% В случае равенства элементов запомнить индексы
if А == В
n = n + 1;
alndex(n) = ai;
blndex(n) = bi;
end
% Взять следующий элемент вектора avec при условии
if А <= В
if ai < avecLen
ai = ai + 1;
else
break;
end
end
%‘ Взять следующий элемент вектора bvec при условии
if А >= В
if bi < bvecLen
bi = bi + 1;
else
break;
end
end
end
% Выполнить усечение векторов alndex и blndex до нужного размера
alndex = alndex(l:n);
blndex = blndex(l:n);
рис. 3.77
Для запуска программы vfind_scalar необходимо сформировать 2 отсортированных
вектора, которые имеют совпадающие элементы. Следующая последовательность опе¬
раторов генерирует случайные векторы а и Ь, добавляет к каждому из них элементы
234
В. Г. Потемкин. Вычисления в среде MATLAB
вектора с и выполняет их сортировку. В результате генерируется 2 отсортированных
вектора, которые имеют 20 000 совпадающих элементов, запускается программа
vfind_scalar и оценивается время исполнения с помощью оператора tic...toe:
clear all
a = rand(200000,1);
b = rand(260.000,1) ;
c = rand(20000,1);
a = sort([a;c]);
b = sort([b;c]);tic;
[ia,ib] = vfind_scalar(a,b); toe
Прогоны этой программы на различных моделях компьютеров дали следующие
оценки времени выполнения:
Операционная система
MATLAB 6.1
MATLAB 6.5
Эффективность
Windows
10.6 c
0.1 c
X106.0
Linux
24.0 c
0.1 c
X240.0
Solaris
64.7 c
1.5 c
X43.1
При исполнении программы в системе MATLAB 6.5 ЛТ-ускоритель использует
следующие особенности:
• ЛТ-ускоритель ускоряет каждую строку программы;
• все используемые переменные имеют тип double;
• все условия в операторах WHILE и IF определены на скалярных величинах;
• в программе вызываются только встроенные функции.
Все эти факторы способствуют тому, что ЛТ-ускоритель задействован в полной
мере и это обеспечивает достижение максимальной эффективности.
Векторизованная программа. Текст программы vfind_vector, использующей векто¬
ризованные операторы, представлен на рис. 3.78.
function [alndex, blndex] = vfind_vector(avec, bvec)
avecLen = length(avec);
bvecLen = length(bvec);
avec = reshape(avec, avecLen, 1);
bvec = reshape(bvec, bvecLen, 1);
[c, pc] = sort([avec; bvec]);
clndex = find(diff(c) == 0);'
alndex = pc(clndex);
blndex = pc(clndex +1) - avecLen;
рис. 3.78
Для ее запуска необходимо сформировать ту же последовательность векторов, что
и для программы vfind_scalar:
clear all
а = rand(200000,1);
b = rand(260000,1);
c = rand(20000,1);
3. Программирование и отладка
235
а = sort([а;с]);
Ь = sort([Ь;с]);
tic; [ia,ib] = vfind_vector(a,b); toe
Прогоны этой программы на различных моделях компьютеров дали следующие
оценки времени выполнения:
Операционная система
MATLAB 6.1
MATLAB 6.5
Эффективность
Windows
0.7 c
0.6 c
xl.2
Linux
1.0 c
0.9 c
xl.l
Solaris
1.2 c
1.2 c
xl.O
Из анализа таблицы следует, что различие во времени выполнения векторизованно¬
го кода при наличии и отсутствии ускорителя несущественно.
Сравнивая результаты тестирования этих двух программ можно сделать следую¬
щий вывод: если ЛТ-ускоритель подавлен, то векторизованные вычисления оказыва¬
ются исключительно эффективными; если ЛТ-ускоритель включен, то различие
во времени выполнения векторизованной программы для версий 6.1 и 6.5 не столь
значительно.
Игра "крестики-нолики". Программа tictactoe реализует автоматический режим иг¬
ры в "крестики-нолики”. Количество раундов игры задается входным параметром tries,
а результат возвращается в виде вектора result, первый элемент которого показывает число
побед игрока X, второй - число побед игрока О, и третий - число ничейных раундов.
function result = tictactoe(tries)
X = 1;
0 = 2;
NOWIN = 3;
result = [ООО]; % [Выигрыш X, Выигрыш О, Ничья]
for k = 1:tries
board = zeros(3);
player = X;
winner = NOWIN;
for moves = 1:9
illegal = 1;
while illegal % Задать случайным образом пустые клетки
m = ceil(rand*3);
n = ceil(rand*3);
illegal = board(m,n); % Отметить, если клетка занята
end
board(m,n) = player; % Если нет, поставить X или О
% Начнем с позиции [X О X О X],
% если текущий игрок занимает 3 любые клетки по горизонтали,
% вертикали или по любой диагонали, ...
if moves > 4 && ...
(board(m,l) == player && board(m,2) == player && ...
236
В. Г. Потемкин. Вычисления в среде MATLAB
board(m,3)
(board(1, n)
board(3,n)
(board(1,1)
board(3,3)
(board(1,3)
== player)
== player
== player)
== player
== player)
== player
&& board(2,n)
II •••
&& board(2,2)
II •••
&& board(2,2)
== player &&
== player &&
== player &&
board(3,1) == player)
% ... то он выигрывает этот раунд
winner = player;
break;
end
% Отдать' ход другому игроку
if player == О, player = X; else player = 0; end
end
% Зафиксировать результаты каждого раунда
result(winner) = result(winner) + 1;
end
Для запуска программы на игру из 10 000 раундов и фиксации времени выполнения
следует использовать следующие операторы:
tic; result = tictactoe(10000), toe
result = 5867 2882 1251
В данном прогоне при случайном розыгрыше первого хода 5867 раз выиграл игрок
X, 2882 раза - игрок О и 1251 раунд имел ничейный исход.
Прогоны этой программы на различных моделях компьютеров дали следующие
оценки времени выполнения:
Операционная система
MATLAB 6.1
MATLAB 6.5
Эффективность
Windows
7.7 c
0.9 c
x8.6
Linux
17.9 c
1.8 c
x9.9
Solaris
43.9 c
7.4 c
x5.9
При выполнении в системе MATLAB 6.5 JIT-ускоритель использует следующие
свойства программы:
• все используемые переменные имеют тип double;
• в программе вызываются только встроенные функции;
• в программе не используются переопределяемые методы;
• оптимально организованный оператор цикла
if moves > 4 && ...
(board(m,l) == player && board(m,2) == player && ...
board(m,3) == player) || ...
где каждое логическое выражение является скаляром и применяются только опера¬
ции УКОРОЧЕННОЕ ЛОГИЧЕСКОЕ И (&&) и ИЛИ (||), что позволяет избежать
проверки полного набора логических условий.
3. Программирование и отладка
237
4. МАТЕМАТИЧЕСКИЕ ФУНКЦИИ
Система MATLAB снабжена обширной библиотекой математических функций.
Каждой функции соответствует определенное имя. Функция ставит в соответствие
значениям своих аргументов значение результата.
Аргументы функции всегда указываются в круглых скобках после имени функции
и, если их больше одного, разделяются запятыми. В качестве аргументов могут ис¬
пользоваться другие функции и любые арифметические выражения языка MATLAB.
4.1. Элементарные функции
Элементарная математическая функция - это, как правило, функция от одной пе¬
ременной, и в этом случае она устанавливает соответствие между массивами значений
аргумента и результата.
Аргумент указывается в круглых скобках после имени функции. Имя переменной,
которой присваивается значение функции, располагается слева от знака равенства. Ес¬
ли имя присваиваемой переменной не указано, значение функции присваивается слу¬
жебной переменной ans.
Тип результата вычисления математической функции всегда совпадает с типом ее
аргумента. Например, если аргументом функции является вектор-столбец, то значени¬
ем этой функции также будет вектор-столбец.
Рассмотрим встроенные математические функции системы MATLAB, которые
применяются к числам, скалярным переменным и к массивам (поэлементно).
Теоретико-числовые функции
FACTOR I Разложение целого числа на простые множители
Синтаксис:
f = factor(n)
Описание:
Функция f = factor(n) возвращает все простые множители целого числа п. Для мас¬
сивов чисел эту функцию применять нельзя.
Пример:
factor(2/430 - 1)
ans = 3 3 7 11 31 151 331
Сопутствующие функции’. IS PRIME, PRIMES.
/1ШОГИ1И(ЗИ
238
Вычисление простых чисел
PRIMES |
Синтаксис:
р = primes(п)
Описание:
Функция р = primes(п) возвращает все простые числа в диапазоне от 2 до п.
Пример:
Построить график простых чисел от 2 до 110.
stairs(primes(100)) % рис. 4.1
Простые числа от 2 до 110
Сопутствующие функции: FACTOR, ISPRIME.
GCP ~| Наибольший общий делитель
Синтаксис:
g = gcd(m,n) G = gcd(A,B)
[g,c,d] ,= gcd(m,n) [G,C,D] = gcd(A,B)
Описание:
Функция g = gcd(m, n) вычисляет наибольший общий делитель двух целых чисел m
и п. Принято, что gcd(O, 0) = 0.
Функция [g, с, d] = gcd(m, п), кроме наибольшего общего делителя, вычисляет два
множителя с и d, такие, что выполняется соотношение g = = m*c + n*d.
Функция G = gcd(A, В) возвращает массив G, содержащий наибольшие общие де¬
лители целочисленных массивов А и В.
Функция [G, С, D] = gcd(A, В) возвращает массив наибольших общих делителей G
и массивы С и D, удовлетворяющие уравнению A(i).C(i) + B(i).D(i) = G(i). Эта функ¬
ция оказывается весьма полезной при решении диофантовых уравнений и при вычис¬
лении преобразований Эрмита.
4. Математические функции
239
Примеры:
Диофантово уравнение. Решить диофантово уравнение ЗОх + 56у = 8.
[g,c,d] = gcd(30,56)
g = 2
с = -13
d = 7
По определению для скаляров end справедливо соотношение
30*(-13) + 56*(7) = 2,
умножим его на 8/2:
30*(-13*4) + 56*(7*4) = 8.
Сравнивая с исходным уравнением, получим решения:
х = (-1.3*4) = -52; у = (7*4) = 28.
Преобразование Эрмита. Для любых двух целых чисел тип найдется такая цело¬
численная матрица Эрмита Е, которая удовлетворяет следующему уравнению [61]:
т
S
п
0
где g - наибольший общий делитель чисел тип, вычисляемый с помощью функции
gcd. Матрица Е при этом равна
с d
Е = ;
_-n/g т/ g
ее определитель равен 1.
Если m = 2 и п = 4, то
[g/C,d] = gcd(2,4)
g = 2
с = 1
d = О
и матрица Е равна
Е =
1 О
-2 1
Сопутствующие функции'. ABS, FLOOR, ROUND, SIGN.
LCM | Наименьшее общее кратное
Синтаксис:
g = lcm(m,n)
L = lcm(A,B)
Описание:
Функция g = lcm(m, n) вычисляет наименьшее общее кратное двух целых чисел m
и п.
240
В. Г. Потемкин. Вычисления в среде MATLAB
Функция L = lcm(A, В) возвращает массив L, содержащий наименьшие общие
кратные для соответствующих пар элементов целочисленных массивов А и В.
Пример:
g = lcm(45/36)
g = 180
Найти наименьшие общие кратные элементов двух матриц третьего порядка.
lcm(pascal(3,magic(3))
ans =
8 16
3 10 21
4 9 6
Сопутствующая функция - GCD.
RAT, RATS | Представление результата в виде рационального числа
или цепной дроби
Синтаксис:
[N,D] = rat(X) rat(X) S = rats(X)
[N,D] = rat(X,tol) rat(X,tol) S = rats(X,k)
Описание:
Несмотря на то что система MATLAB базируется на арифметике с плавающей точ¬
кой, иногда бывает удобно представить результат в виде отношения двух относитель¬
но небольших целых чисел. Такое представление возможно с использованием рацио¬
нальных чисел и на основе цепных дробей.
Функция [N, D] = rat(X) позволяет найти для числа х два таких целых числа п и d,
чтобы выполнялось условие
n/d - х <= le-6*abs(x).
Функция [N, D] = rat(X, tol) позволяет указать точность приближения tol, отличную
от 1е-6.
Если в качестве входа для всех перечисленных выше функций задан массив чисел
X, то операции будут выполняться поэлементно и результатом будут массивы целых
чисел N и D.
Функции rat(X) и rat(X, tol) позволяют вывести на экран результат в виде цепной
дроби.
Функция. S = rats(X, к) использует функцию rat(X), чтобы вывести на экран резуль¬
тат в виде простой дроби
s = [ sprintf(['%' num2str(fix(k/2)),n) '/' ...
sprintf(['%-' num2str(fix(k/2)) '.Of'],d)].
Точность аппроксимации с помощью такой дроби равна
tol = 10Л(-fix(k/2))*abs(x).
Для функции S = rats(X) точность аппроксимации принимается по умолчанию рав¬
ной le-6* abs(x), что соответствует значению к = 13.
Функция format rat равносильна функции rats.
4. Математические функции
241
Алгоритм:
Функция rat(X) аппроксимирует каждый элемент массива X цепной дробью сле¬
дующего вида:
2 1
(d,+...-)
d*
Величины dj,j = l:k получены последовательным выделением целой части
с последующим обращением дробной части. Точность аппроксимации возрастает
с ростом числа членов по степенному закону. Самая медленная сходимость наблюда¬
ется при рациональной аппроксимации числа х = sqrt(2). Погрешность аппроксимации
с учетом к членов составляет 2.68 * (0.173)к, так что учет каждого последующего чле¬
на увеличивает точность менее чем на одну десятичную цифру. Поэтому для достиже¬
ния максимальной точности в арифметике с плавающей точкой eps, равной 2.22*1016,
требуется 21 член.
Примеры:
Рассмотрим аппроксимацию числа Т1 в виде цепной дроби и рационального числа.
rat(pi)
3 + 1/(7 + 1/(16))
rat(pi,le-12)
3 + 1/(7 + 1/(16 + 1/(-294 + 1/(3 + l/(-4 + 1/(5))))))
[n,d] = rat(pi); [nd]
ans = 355 113
[n,d] = rat(pi,le-12); [n d]
ans = 5419351 1725033
s = rats(pi)
s = 355/113
s = rats(pi,26)
s = 5419351/1725033
Сопутствующие функции: FORMAT, RAT.
FACTORIAL | Факториал целого числа
Синтаксис:
N = factorial(n)
Описание:
Функция N = factorial(n) вычисляет факториал п!, т. е. произведение всех целых чи¬
сел от 1 до п включительно prod(l : п).
Поскольку целые числа удвоенной точности имеют только 16 значащих цифр,
то ответ будет правильным только для целых п, не превышающих значения 21; для
больших значений верными будут только 16 старших значащих цифр в формате rat.
Пример:
Сравним вычисление факториала числа в арифметике с плавающей точкой системы
MATLAB и в целочисленной арифметике системы Maple.
242
В. Г. Потемкин. Вычисления в среде MATLAB
Для значений п <= 21:
factorial(11)
ans =39916800
maple 11!
ans =39916800
factorial(21)
ans =510909421717'09440000
maple 21!
ans =51090942171709440000
Для значений n>=22:
factorial(22)
ans = 1124000727777607700000
maple 22!
ans = 1124000727777607680000
factorial(31)
ans = 8222838654177922400000000000000000
maple 31!
ans = 8222838654177922817725562880000000
Несовпадающие цифры в этих числах выделены полужирным шрифтом.
Сопутствующие функции'. PROD, FACTOR.
PERMS Формирование всех перестановок элементов вектора
Синтаксис:
Р = perms(v)
Описание:
Функция Р = perms(v), где v - вектор-строка длины п, формирует массив, состоя¬
щий изо всех возможных перестановок элементов этого вектора. Массив Р имеет раз¬
мер п!хп.
Пример:
Вычислим все возможные перестановки трех чисел 2,4, 6.
perms (.1:2:5)
ans =
5
3
1
5
1
3
3
5
1
3
1
5
1
3
5
1
5
3
Ограничение:
Практическое применение этой функции следует ограничить числом элементов п,
меньшим 15.
Сопутствующие функции'. FACTORIAL, NCHOOSEK, PERMUTE, RANDPERM.
4. Математические функции
243
NCHOOSEK | Вычисление числа сочетаний С* и формирование всех
сочетаний элементов вектора
Синтаксис:
С = nchoosek(п,к)
С = nchoosek(v,к)
Описание:
Функция С = nchoosek(n, к), где пик- неотрицательные целые числа, вычисляет
~ и!
число сочетании С = .
(п-к)\к!
Функция С = nchoosek(v, к), где v - вектор-строка длины п, формирует массив, со¬
стоящий изо всех возможных сочетаний по к элементов этого вектора. Массив С имеет
размер С*хп.
Пример:
Вычислить число сочетаний Сц .
nchoosek(11,3)
ans = 165
Сформировать все возможные сочетания из четырех чисел 1, 3, 5, 7 по 3.
nchoosek(1:2:7,3)
ans =
1
3
5
1
3
7
1
5
7
3
Ограничение:
5
7
Практическое применение этой функции следует ограничить числом элементов п,
меньшим 15.
Сопутствующие функции: FACTORIAL, PERMS.
Округление и модульная арифметика
CEIL, FIX,
FLOOR, ROUND
Функции округления
Синтаксис:
Y = ceil(X) Y = floor(X)
Y = fix(X) Y = round(X)
Описание:
Для массивов действительных чисел X:
244
В. Г. Потемкин. Вычисления в среде MATLAB
• функция Y = ceil(X) возвращает значения, округленные до ближайшего целого > X;
• функция Y = fix(X) возвращает значения с усечением дробной части числа;
• функция Y = floor(X) возвращает значения, округленные до ближайшего целого < X;
• функция Y = round(X) возвращает значения, округленные до ближайшего целого.
Для массивов комплексных чисел Z эти функции применяются одновременно
к массивам действительных и мнимых частей.
Пример:
Задан одномерный массив действительных чисел
х = [-1.9 -0.2 3.4 5.6 7.0 2.4+3.6j]
Применение функций округления к этому массиву дает следующие результаты:
ceil(х)
fix(x)
[-1 0 4
6 7 3+41]
[-1 0 3
5 7 2 + 3i]
floor(х)
round(х)
[-2 -1 3
5 7 2 + 3i]
[-2 0 3
6 7 2 + 4i]
Сопутствующие функции: CEIL, FIX, FLOOR, ROUND.
MOD, REM~] Функции остатка
Синтаксис:
M = mod(X,Y) М = rem(X,Y)
Описание:
В случае скалярных аргументов функция m = mod(x, у) в полной мере соответству¬
ет математической функции модульной арифметики a mod b и вычисляет остаток
отделения числа х на число у, т. е. mod(x, у) = х - y*floor(x/y), если у не равно нулю.
По определению mod(x, 0) = х.
В случае скалярных аргументов функция m = rem(x, у) вычисляет остаток от деле¬
ния числа х на число у согласно соотношению
rem(x,y) = х - y*fix(x/y), у ~= 0;
rem(x,0) = NaN.
Если знаки операндов одинаковы, справедливо соотношение
mod(x,y) = гет(х,у) ;
для операндов разных знаков выполняется следующее соотношение:
mod(-x,y) = rem(-x,y) + у.
Для массивов чисел эти функции применяются поэлементно.
Пример:
Конгруентные числа. Два числа называются конгруентными по модулю т, если
выполняется условие mod(x, m) = mod(y, m). Убедитесь или докажите, что степени ма¬
гической матрицы magic(4) выше второй конгруентны по модулю 2. В качестве под¬
сказки воспользуйтесь следующей информацией о матрицах остатков первых трех
степеней матрицы magi с (4):
4. Математические функции
245
mod(magic(4),2)
mod((magic(4))
"2,2)
mod((magic(4))"3,2)
0
0
1
1
1
1
1
1
0
0
0 0
1
1
0
0
1
1
1
1
0
0
0 0
1
1
0
0
1
1
1
1
0
0
0 0
0
0
1
1
1
1
1
1
0
0
0 0
Сравнение операторов mod и rem:
mod(1:
:5,3)
mod(-[l:5],3)
mod (-magic (3) ,3)
ans =
ans =
ans =
1
2 0
1
2
2
10 2
1
1 2
0
0 1
2
2 0
1
rem (1:
: 5,3 )
rem(-
[1:5],3)
rem (-magic (3 ) ,
3)
ans =
ans =
ans =
1
2 0
1
2
-1
-2 0 -1
-2
-2 -1
0
0 -2
-1
-1 0
-2
Сопутствующие функции - нет.
Функции описания чисел с плавающей точкой
LOG2
Функции логарифма
Синтаксис:
[М, Р] = log2 (X)
Описание:
Функция V = log2(Z) вычисляет логарифм по основанию 2 от значений элементов
массива Z.
Функция [М, Р] = log2(X) для массива X действительных чисел возвращает массив
М значений мантисс и целочисленный массив Р показателей степеней, позволяющих
представить любой элемент х в виде х = нулевому элементу соответствует пред¬
ставление {f = 0, е = 0}.
Примеры:
Для компьютеров с IEEE-арифметикой, в которых определены константы eps,
realmax, realmin, функция log2 вычисляет следующие величины:
log2(eps) = -52, log2(realmax) = 1024, 1од2(realmin) = -1022,
а функция [М, Р] = log2(X) строит следующие представления чисел:
X
m
P
1 _ _ J
1 1/2 1
1
pi J
pi/4
"" 2
-3 " i
" "3/4 _ !
2
eps i
1/2
-51
realmax
(2-eps)/2 j
1024
realmin
1/2 i
-1021’
Сопутствующие функции'. NEXTPOW2, POW2.
246
В. Г. Потемкин. Вычисления в среде MATLAB
Экспонента по основанию 2
POW2 I
Синтаксис:
X = pow2 ( [М, Р] )
Описание:
Функция X = pow2([M, Р]) для действительных массивов М и Р вычисляет массив
Х = М.*(2.ЛР).
Пример:
Для компьютеров с IEEE-арифметикой, в которых определены константы eps,
realmax и realmin, функция х = pow2([m, р]) вычисляет следующие величины:
т
Р
X
1/2
1
1
pi/4
2
pi
-3/4
2
-3
1/2
"-51
eps
(2-eps)/2
1024
realmax
1/2
Z1021
realmin
Сопутствующие функции'. LOG2, NEXTPOW2.
Функции описания комплексных чисел
Система MATLAB настроена на работу с комплексными числами, и это дает поль¬
зователю неоспоримые преимущества по сравнению с традиционными процедурными
языками программирования, где такие возможности либо отсутствуют, либо требуют
специального определения типа переменных.
COMPLEX | Формирование комплексного числа
Синтаксис:
с = complex(а,Ь)
с = complex(а)
Описание:
Функция с = complex(a, Ь) формирует комплексное число с, если заданы значения
действительной и мнимой частей. В качестве входных и выходных массивов можно
использовать скаляры, векторы, массивы, в том числе и многомерные.
Функция с = complex(a) возвращает комплексное значение с, мнимая часть которо¬
го равна нулю.
Пример:
Сформируем целочисленный массив комплексных чисел
а = int8([-12 34])
b = int8([22-70])
с = complex(а',Ь')
4. Математические функции
247
а
-1
2
3
4
b =
2
2
-7 0
с =
-1
+ 2i
2
+ 2i
3
- 7i
4
whos
Name
Size
Bytes
Class
а
1x4
4
int8 array
b
1x4
4
int8 array
с
4x1
8
int8 array (complex)
Grand
total is
12 elements using
16 bytes
Входные целочисленные массивы данных со знаком а и b относятся к классу int8
array, выходной целочисленный массив с относится к классу int8 array (complex).
Сопутствующие функции'. ABS, ANGLE, CONJ, IMAG, ISREAL, REAL.
ABS | Модуль комплексного числа
Синтаксис:
Y = abs(Z)
Описание:
Для массива комплексных чисел Z функция Y = abs(Z) возвращает массив Y моду¬
лей комплексных элементов Z.
Примеры:
Вычислить модуль комплексного числа.
abs(3+4i)
ans = 5
Вычислить модули массива комплексных чисел.
а = int8([-l 2 3 4]); b = int8([2 2 -7 0]); с = complex(а’,Ь')
г = abs(double(с))
с =
-1 + 2i
2 + 2i
3 - 7i
4
г =
2.2361
2.8284
7.6158
4
Построить поверхность модулей комплексных чисел z =| х + iy |. Очень удобно ис¬
пользовать для этой цели объект inline.
248
В. Г. Потемкин. Вычисления в среде MATLAB
z = inline('abs(complex(x,у))’)
z =
Inline function:
z(x,y) = abs(complex(x,y))
ezsurfc(z) % рис. 4.2
рис. 4.2
Сопутствующие функции: SIGN, ANGLE.
ANGLE | Аргумент комплексного числа
Синтаксис:
Р = angle(Z)
Описание:
Для массивов комплексных чисел Z функция Р = angle(Z) возвращает массив зна¬
чений аргументов для элементов Z. Значение аргумента измеряется в радианах и нахо¬
дится в пределах от -и до тс.
Для комплексного числа
1<р
z = х + iy = re
его модуль г и аргумент ср вычисляются следующим образом:
г = abs(z); phi = angle(z),
а оператор
z = r.*exp(i*phi)
формирует комплексное число по его модулю и аргументу.
Алгоритм:
Для вычисления аргумента комплексного числа используется следующее соотно¬
шение:
angle(z) = atan2(imag(z),real(z)).
4. Математические функции
249
Примеры:
Вычислить аргумент комплексного числа.
phi ■ angle (3*ь31), phi ■ phi/pi*180
phi = ,0.7854 % радиан
phi = 45 % град
Вычислить аргументы массива комплексных чисел.
а ■ int8([-1;2;3/4]); Ь ■ int8([2/2/-7/0])/ с ■ complex(а,Ь)
phi ■ angle(double(с))
с =
-1 + 2i
2 + 2i
3 - 7i
4
phi =
2.0344
0.7854
-1.1659
0 .
Построить поверхность аргументов комплексных чисел.
z ■ inline('angle(complex(х,у))')
z =
Inline function:
z(x,y) = angle(complex(x,у))
ezourfc(z) % рис. 4.3
рис. 4.3
250
В. Г. Потемкин. Вычисления в среде MATLAB
Построить поверхность аргументов комплексных чисел z с нулевой мнимой ча¬
стью.
z = inline('angle(complex(х,0))')
z =
Inline function:
z(x) = angle(complex(x,0))
Эта функция принимает только 2 значения: 0 и 180 град:
phi = z([l -1]); phi = phi/pi*180
phi = 0 180
ezsurfc(z) % рис. 4.4
рис. 4.4
Сопутствующие функции'. ABS, COMPLEX, IMAG, REAL.
SIGN
Вычисление знака комплексного числа
Синтаксис:
S = sign(Z)
Описание:
Для массивов комплексных чисел Z функция S = sign(Z) возвращает массив ком¬
плексных чисел S = Z./abs(Z), модуль которых равен единице.
Примеры:
Вычислить знак комплексного числа.
s = sign(3+4i)
s = 3/5 + 4/5i
Вычислить знаки массива комплексных чисел.
а = int8([-1;2;3;4]); b = int8([2;2;-7;0]); с = complex(а,Ь)
s = sign(double(с))
4. Математические функции
251
-1
+
2i
2
+
2i
3
-
7i
4
-0.44721
+
0.89443i
0.70711
+
0.7071И
0.39392
-
0.91915i
1
Построить поверхность знаков комплексных чисел с нулевыми мнимыми частями,
z = inline('sign(complex(х,0))')
z =
Inline function:
z(x) = sign(complex(x,0))
ezsurf(z) % рис. 4.5
рис. 4.5
Сопутствующие функции'. ABS, COMPLEX, IMAG, REAL.
REAL,IMAG~|
Синтаксис:
Действительная и мнимая части комплексного числа
X = real(Z)
Y = imag(Z)
Описание:
Для массивов комплексных чисел Z функция X = real(Z) возвращает массив дейст¬
вительных, a Y = imag(Z) - мнимых частей элементов Z.
Пример:
Построить поверхности действительной и мнимой частей комплексной функции
z = (х + iy)3.
252
В. Г. Потемкин. Вычисления в среде MATLAB
Rez = inline(1 real(complex(x,y)A3)1)
Rez =
Inline function:
Rez(x,y) = real(complex(x,у)л3)
ezsurfc(Rez) % рис. 4.6, a
Imz = inline('imag(complex(x,у)A3)')
Imz =
Inline function:
Imz(x,y) = imag(complex(x,у)^3 )
ezsurfc(g) % рис. 4.6,6
6
рис. 4.6
Сопутствующие функции'. ABS, ANGLE, COMPLEX, CONJ.
CONJ |
Операция комплексного сопряжения
Синтаксис:
V = conj(Z)
Списание:
Для массивов комплексных чисел Z функция V = conj(Z) возвращает массив ком¬
плексно-сопряженных значений для элементов Z.
Пример:
Построить поверхности действительной и мнимой частей комплексной функции
г- (х - iy)3. Эта функция является комплексно-сопряженной к функции из предыдуще¬
го примера.
Rez = inline(1real(conj(complex(x,y))A3)1)
Rez =
Inline function:
Rez(x,y) = real(conj(complex(x,у))Л3)
ezsurfc(Rez) % рис. 4.7,a
4. Математические функции
253
Imz = inline('imag(conj(complex(x,у))л3)')
Imz =
Inline function:
Imz(x,y) = imag(conj(complex(x,у))л3)
ezsurfc(Imz) % рис. 4.7,6
CPLXPAIR ]
Сортировка комплексно-сопряженных пар
Синтаксис:
V = cplxpair(Z)
V = cplxpair(Z,tol)
V = cplxpair(Z,[ ),dim)
V = cplxpair(Z,tol,dim)
Описание:
Для векторов комплексных чисел Z функция V = cplxpair(Z) сортирует эти числа
в порядке возрастания действительных частей; в случае комплексно-сопряженных пар
первым идет элемент с отрицательной мнимой частью; действительные элементы рас¬
полагаются вслед за комплексными. Комплексно-сопряженные значения принуди¬
тельно округляются в пределах погрешности 100*eps относительно abs(A(i)). Это га¬
рантирует в дальнейшем точное совпадение действительных и модулей комплексных
частей.
Для двумерных массивов комплексных чисел Z функция V = cplxpair(Z) выполняет
сортировку по столбцам.
Для многомерных массивов комплексных чисел Z функция V = cplxpair(Z) выпол¬
няет сортировку начиная с первой размерности, размер которой отличен от 1, возвра¬
щая массив отсортированных элементов.
Функция V = cplxpair(Z, tol) позволяет переопределить принятую по умолчанию
погрешность округления tol.
254
В. Г. Потемкин. Вычисления в среде MATLAB
Функция V = cplxpair(Z, [ ], dim) выполняет сортировку вдоль размерности dim.
Функция V = cplxpair(Z, tol, dim) выполняет сортировку с заданной погрешностью
округления tol и вдоль указанной размерности dim.
Диагностика:
Если количество сортируемых комплексных чисел нечетно или если невозможно
сгруппировать пары в пределах указанной точности, формируется сообщение
об ошибке:
Complex numbers can't be paired.
Комплексные числа не могут быть отсортированы попарно.
Пример:
Выполнить сортировку собственных значений для следующей матрицы:
А =[ -3
12
4
0
0
-12
-3
-0.5
0
0
0
0
1
8
0
0
0
0
-0.5
8
-18
0
0
0
-10]
d = eig(А)
dl =
cplxpair(d)
-2.7561 +
10.642i
-2.7561 -
10.642i
-2.7561 -
10.642i
-2.7561 +
10.642i
-6.9161
-1.5359 -
2.235П
-1.5359 +
2.23511
-1.5359 +
2.235H
-1.5359 -
2.235И
-6.9161
Как следует из полученных результатов, сортировка собственных значений функ¬
циями eig и cplxpair выполняется по-разному: первая сортирует собственные значения
в порядке убывания модулей, вторая - в порядке возрастания действительных частей,
причем сначала сортируются комплексные, а затем действительные значения.
Сопутствующие функции: COMPLEX, IMAG, REAL.
Трансцендентные функции
В этом разделе рассмотрены стандартные математические функции, которые обыч¬
но рассматриваются как функции действительной переменной. Однако благодаря воз¬
можностям системы MATLAB выполнять вычисления в поле комплексных чисел
здесь представлены также и графики поверхностей модуля и угла либо действитель¬
ной и мнимой частей этих функций на комплексной плоскости. Это существенно рас¬
ширяет возможности восприятия образов таких функций, хотя трудоемкость вычисле¬
ний и построения графических образов весьма существенна.
ABS | Функция абсолютного значения
Синтаксис:
Y = abs(X)
Описание:
Для массива действительных чисел X функция Y = abs(X) возвращает массив Y аб¬
солютных значений элементов X.
4. Математические функции
255
Примеры:
Вычислить абсолютное значение отрицательного числа,
abs(-5)
ans = 5
Вычислить таблицу и построить график функции abs(x), используя следующий
Script-файл:
Если обращение к этому сценарию оформить в виде оператора, использующего
синтаксис языка HTML, то последующие вызовы сценария можно выполнять простой
активизацией соответствующей html-ссылки:
disp('<a href="matlab:р1оЁаЬз">График abs(x)</a>')
График abs(x)
Таблица и график функции абсолютного значения abs(x) показаны на рис. 4.8.
SIGN J Вычисление знака числа
Синтаксис:
S = sign(X)
Описание:
Функция S = sign(X) для массивов действительных чисел X возвращает массив S
тех же размеров, в котором на месте положительного числа стоит 1, на месте нулево¬
го - 0, на месте отрицательного стоит -1.
256 В. Г. Потемкин. Вычисления в среде MATLAB
Примеры:
Вычислить знаки последовательности чисел.
sign([-5 0 5])
ans = -1 0 1
Вычислить таблицу и построить график функции sign(x) используя следующий
Script-файл:
% Script plotsign
% PLOTSIGN Вычисление таблицы и построение графика функции SIGN(X)
f = inline('sign(х)')
x = -3:3;
[x.’ f(x.')]
ezplot(f, x]), grid on
Таблица и график функции знака sign(x) показаны на рис. 4.9.
рис. 4.9
Сопутствующая функция - ABS.
SQRT | Квадратный корень
Синтаксис:
V = sqrt(Z)
Описание:
Функция V = sqrt(Z) вычисляет функцию квадратного корня для элементов масси¬
ва Z. Для отрицательных и комплексных значений результатом являются комплексные
числа.
Вычисление функции квадратного корня от матрицы реализуется с помощью спе¬
циальной функции sqrtm.
4. Математические функции 257
9 т. Зак. 3375
Примеры:
Вычислить функцию квадратного корня для следующего массива чисел:
w = sqrt((-2:2) 1)
w =
О + 1.4142i
О + l.OOOOi
О
1.0000
1.4142
Функция действительной переменной
Вычислить таблицу и построить график функции sqrt(x), используя следующий
Script-файл:
% Script plotsqrt
% PLOTSQRT Вычисление таблицы и построение графика функции SQRT(X)
f = inline('sqrt(х)')
x = 0:3;
[x.’ f(x.')]
ezplot(f, x), grid on
Таблица и график функции квадратного корня sqrt(x) показаны на рис. 4.10.
X
sign(x)
График sign(x)
sqrt(x)
1.8
0
0
1
1
1.6
2
1.4142
1 4
1—,•
3
1.7321
1.2
..^<.„4 j
08
0.4
02
j i
0
j j. ■
-0.5 0 0.5 1
1 1.5 2 2.5 3
X
рис. 4.10
Функция комплексной переменной
Построить поверхности действительной и мнимой частей функции квадратного
корня на комплексной плоскости.
Rez = inline(*real(sqrt(x+i*y))1)
Rez • =
Inline function:
Rez(x,y) = real(sqrt(x+i*y))
258
В. Г. Потемкин. Вычисления в среде MATLAB
ezsurfc(Rez) % рис. 4.11,a
Imz = inline(1imag(sqrt(x+i*y))1)
Imz =
Inline function:
Imz(x,y) = imag(sqrt(x+i*y) )
ezsurfc(Imz) % рис. 4.11,6
a 6
рис. 4.11
Сопутствующие функции’. EXP, LOG, SQRTM.
EXP
Экспоненциальная функция
Синтаксис:
V = exp(Z)
Описание:
Функция V = exp(Z) вычисляет экспоненты значений элементов массива/. Для
комплексных значений z = х + iy справедлива формула Эйлера
ez = £x(cos(y) + zsin(y)).
Вычисление экспоненты от матрицы реализуется с помощью специальной функции
ехрт.
Примеры: '
Вычислить функцию экспоненты для следующего массива чисел:
w = ехр((-2:2)1)
w =
0.13534
0.36788
1
2.7183
7.3891
4. Математические функции
259
Функция действительной переменной
Вычислить таблицу и построить график функции ехр(х), используя следующий
Script-файл:
% Script plotexp
% PLOTEXP Вычисление таблицы и построение графика функции ЕХР(Х)
f = inline('exp(х)’)
х = -2:2;
[х. ’ f(х. 1 ) ]
ezplot(f, x), grid on
Таблица и график функции экспоненты ехр(х) показаны на рис. 4.12.
X
ехр(х)
График ехр(х)
ехр(х)
-2
-1
0
1
0.13534
0.36788
1
2.7183
7
6
с
2
7.3891
□
3
0
! -1.5 -1
-0.5 (
X
) 0.5 1
1.5 2
рис. 4.12
Функция комплексной переменной
Построить поверхности действительной и мнимой частей функции экспоненты
на комплексной плоскости.
Rez = inline('real(exp(x+i*y))')
Rez =
Inline function:
Rez(x,y) = real(exp(x+i*y))
ezsurfc(Rez) % рис. 4.13,a
Imz = inline('imag(exp(x+i*y))')
Imz =
Inline function:
Imz(x,y) = imag(exp(x+i*y))
ezsurfc(Imz) % рис. 4.13,6
260
В. Г. Потемкин. Вычисления в среде MATLAB
а б
рис. 4.13
Сопутствующие функции’. LOG, LOG2, LOG 10, ЕХРМ.
LOG, LOG2, LOGIO 1 Функции логарифма
Синтаксис:
V = log(Z)
V = log2(Z)
V = loglO(Z)
Описание:
Функция V = log(Z) вычисляет натуральный логарифм значений элементов массива
Z. Для комплексных значений z = х + iy справедлива формула
ln(z) = ln(abs(z)) + i atan2(y,x).
Функция V = log2(Z) вычисляет логарифм по основанию 2 значений элементов
массива Z.
Функция V = loglO(Z) вычисляет логарифм по основанию 10 значений элементов
массива Z.
Функция логарифма по любому основанию N может быть пересчитана через функ¬
цию натурального логарифма по следующей формуле:
logN(z) = log(z)/log(N).
Вычисление функции натурального логарифма от матрицы реализуется с помощью
специальной функции logm.
Примеры:
Одна из возможностей определить значение числа л - это вычислить log(-l).
log(-l)
ans = 0 +3.141592653589791
Для компьютеров с IEEE-арифметикой, где определены объекты eps, realmax
realmin, функция log2 вычисляет значения:
4. Математические функции
261
Iog2(eps)
-52
log2(realmax)
1024
log2(realmin)
-1022
а функция log 10 - значения:
logl0(eps) logl0(realmax)
-15.6536 308.2547
loglO(realmin)
-307.6527
В силу пропорциональной зависимости функций логарифма по разным основаниям
последующее изложение касается только функции натурального логарифма.
Функция действительной переменной
Вычислить таблицу и построить график функции log(x), используя следующий
Script-файл:
% Script plotlog
% PLOTLOG Вычисление таблицы и построение графика функции LOG(X)
f = inline(1 log(х) ')
x = 0 : 0.5:2;
[х. ’ f (х. 1 ) ]
ezplot(f, x), grid on
Таблица и график функции натурального логарифма log(x) показаны на рис. 4.14.
рис. 4.14
Функция комплексной переменной
Построить поверхности модуля и аргумента функции логарифма на комплексной
плоскости.
absz = inline(*abs(log(x+i*y))1)
absz =
Inline function:
absz(x,y) = abs(log(x+i*y))
ezsurfc(absz) % рис. 4.15,a
262
В. Г. Потемкин. Вычисления в среде MATLAB
anglez = inline('angle(log(x+i*y))1)
anglez =
Inline function:
anglez(x,y) = angle(log(x+i*y))
ezsurfc(anglez) % рис. 4.15,6
a 6
рис. 4.15
Сопутствующие функции'. EXP, LOGM.
P0W2 "~| Экспонента по основанию 2
Синтаксис:
V = pow2(Z)
Описание:
Функция V = pow2(Z) вычисляет массив степеней 2.AZ.
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции pow2(x), используя следующий
Script-файл:
% Script plotpow2
% PLOTPOW2 Вычисление таблицы и построение графика функции POW2(X)
f = iniine('pow2(x)')
x = -2: 0.5:2;
[x. ’ f (x. ' ) ]
ezplot(f, x), grid on
Таблица и график функции экспоненты pow2(x) показаны на рис. 4.16.
4. Математические функции
263
X
pow2(x)
-2
0.25
-1.5
0.35355
-1
0.5
-0.5
0.70711
0
1
0.5
1.4142
1
2
1.5
2.8284
2
4
График pow2(x)
рис. 4.16
Функция комплексной переменной
Построить поверхности действительной и мнимой частей функции экспоненты
по основанию 2 на комплексной плоскости.
Rez = inline ( 1 real (pow2 (x+i*y)) 1)
Rez =
Inline function:
Rez(x,y) = real(pow2(x+i*y))
ezsurfc(Rez, [-2 2]) % рис. 4.17,a
Imz = inline (' imag (pow2 (x+i*y)) 1)
Imz =
Inline function:
Imz(x,y) = imag(pow2(x+i*y))
ezsurfc(Imz,[-2 2]) % рис. 4.17,6
Сопутствующая функция - LOG2.
264
В. Г. Потемкин. Вычисления в среде MATLAB
Функции синуса
В этот раздел включены функции sin, asin, cosec, acosec.
SIN ~"| Функция синуса
Синтаксис:
V = sin(Z)
Описание:
Функция V = sin(Z) вычисляет синус от значений элементов массива Z. Массив Z
допускает комплексные значения; углы измеряются в радианах.
Для вычисления функции от матрицы следует применять специальные матричные
функции fiinm или ехрт.
Алгоритм:
Для вычисления функций синуса используются следующие соотношения:
sin(x + iy) = sin(x)ch(y) + icos(x)sh(y);
sin(z) = - i sh(zz).
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции sin(x), используя следующий
Script-файл:
% Script plotsin
% PLOTSIN Вычисление таблицы и построение графика функции SIN(X)
f = inline('sin(х)1)
x = -pi:pi/4:pi;
[x. 1 f (x. ’ ) ]
ezplot(f, x) , grid on
Таблица.и график функции sin(x) показаны на рис. 4.18.
рис. 4.18
4. Математические функции
265
Функция комплексной переменной
Построить поверхности действительной и мнимой частей функции синуса на ком¬
плексной плоскости.
Rez = inline('real(sin(x+i*y))')
Rez =
Inline function:
Rez(x,y) = real(sin(x+i*y))
ezsurfc(Rez,[-pi pi]) % рис. 4.19,a
Imz = inline('imag(sin(x+i*y))')
Imz =
Inline function:
Imz(x,y) = imag(sin(x+i*y))
ezsurfc(Imz,[-pi pi]) % рис. 4.19,6
a i 6
рис. 4.19
Сопутствующие функции'. ASIN, SCS, ASCS, EXPM, FUNM.
ASIN I Обратная функция синуса
Синтаксис:
V = asin(Z)
Описание:
Функция V = asin(Z) вычисляет обратную функцию синуса от значений элементов
массива Z. Массив Z допускает комплексные значения; углы V измеряются в радиа¬
нах.
Функция Y = asin(X) для действительных значений -1 < х < 1 определена в интер¬
вале -7г/2 < х < л/2.
Для вычисления функции от матрицы следует применять специальную функцию
funm.
266
В. Г. Потемкин. Вычисления в среде MATLAB
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции arcsin(x), используя следующий
Script-файл:
% Script plotasin
% PLOTASIN Вычисление таблицы и построение графика функции ASIN(X)
f = inline('asin(x)')
X = -1:0.2:1;
[x. ' f (x. * ) ]
ezplot(f, x), grid on
Таблица и график функции asin(x) показаны на рис. 4.20.
X
asinfx)
График asin(x)
asin(x) .
-1
-0.8
-1.5708
-0.9273
1.5
1
i i
о о
CH
-0.6435
-0.41152
0.5
-0.2
0
0.2
-0.20136
0
0.20136
-0.5
0.4
0.6
0.41152
0.6435
0.8
1
0.9273
1.5708
-1.5
i i
i
-1
-05 C
X
> 0.5 1
рис. 4.20
Функция комплексной переменной
Построить поверхности действительной и мнимой частей обратной функции сину¬
са на комплексной плоскости.
Rez = inline ('real (asin(x+i*y))')
Rez =
Inline function:
Rez(x,y) = real(asin(x+i*y))
ezsurfc(Rez,[-1 1]) % рис. 4.21,a
Imz = inline(1imag(asin(x+i*y))1)
Imz =
Inline function:
Imz(x,y) = imag(asin(x+i*y))
ezsurfc(Imz,[-1 1]) % рис. 4.21,6
4. Математические функции
267
а
рис. 4.21
Сопутствующие функции: SIN, CSC, ACSC, FUNM.
CSC
Функция косеканса
Синтаксис:
V = csc(Z)
Описание:
Функция V = csc(Z) вычисляет косеканс от значений элементов массива Z. Массив
Z допускает комплексные значения; углы измеряются в радианах.
Для вычисления функции от матрицы следует применять специальную функцию
funm.
Алгоритм:
Для вычисления функции косеканса используется следующее соотношение:
csc(z) = l/sin(z).
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции cosec(x), используя следующий
Script-файл:
% Script plotcosec
% PLOTCOSEC Вычисление таблицы и построение графика функции CSC(X)
f = inline('esc(х)')
x = -1:0.2:1;
[x. ’ f(x. ’ ) ]
ezplot(fz x), grid on
268
В. Г. Потемкин. Вычисления в среде MATLAB
Таблица и график функции csc(x) показаны на рис. 4.22.
X
csc(x)
График csc(x)
csc(x)
-3.1416
-8.1656e+015
6
4
2
• ::
1 1
-2.3562
-1.5708
-0.7854
-1.4142
\ i Г f
-1
-1.4142
\ = V Zl
0
Inf
0
S; 1
0.7854
1.5708
1.4142
1
2.3562
1.4142
: / j j \ :
3.1416
8.1656e+015
-6
:/ : : A :
1 : i 1;
1 < I .*•"
t : : :
-3 -2 -1 C
X
2 3
рис. 4.22
Функция комплексной переменной
Построить поверхности действительной и мнимой частей функции косеканса
на комплексной плоскости.
Rez = inline(1 real(esc(x+i*y))1)
Rez =
Inline function:
Rez(x,y) = real(esc(x+i*y))
ezsurfc(Rez,[-3 3]) % рис. 4.23,a
Imz = inline(’imag(esc(x+i*y))’)
Imz =
Inline function:
Imz(x,y) = imag(esc(x+i*y))
ezsurfc(Imz,[-3 3]) % рис. 4.23,6
рис. 4.23
Сопутствующие функции'. SIN, ASIN, ACSC, FUNM.
4. Математические функции
269
ACSC | Функция обратного косеканса
Синтаксис:
V = acsc(Z)
Описание:
Функция V = acsc(Z) вычисляет обратную функцию косеканса от значений элемен¬
тов массива Z. Массив Z допускает комплексные значения; углы V измеряются в ра¬
дианах.
Для вычисления функции от матрицы следует применять специальную функцию
funm.
Алгоритм:
Для вычисления функции, обратной косекансу, используется следующее
соотношение:
arccosec(z) = arcsin(l/z).
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции arccosec(x), используя следую¬
щий Script-файл:
% Script plotacsc
% PLOTACSC Вычисление таблицы и построение графика функции ACSC(X)
f = inline(’acsc(х)')
x = [-3:l/2:-l l:l/2:3];
[x.’ f(x.')1
ezplot(f, x), grid on
Таблица и график функции acsc(x) показаны на рис. 4.24.
X
acsc(x)
График acsc(x)
acscfx)
-3
-2.5
-0.33984
-0.41152
1.5
-2
-1.5
-0.5236
-0.72973
-1.5708
1.5708
0.72973
0.5
-1
1
1.5
0
-0.5
2
2.5
0.5236
0.41152
3
0.33984
-1.5
i
I -2 -1
I C
X
I 1
2
1 3
рис. 4.24
270
В. Г. Потемкин. Вычисления в среде MATLAB
Функция комплексной переменной
Построить поверхности действительной и мнимой частей функции, обратной косе¬
кансу, на комплексной плоскости.
Rez = inline(•real(acsc(x+i*y))1)
Rez =
Inline function:
Rez(x.,y) = real(acsc(x+i*y))
ezsurfc(Rez,[-3 3]) % рис. 4.25,a
Imz = inline(1imag(acsc(x+i*y))1)
Imz =
Inline function:
Imz(x,y) = imag(acsc(x+i*y))
ezsurfc(Imz, [-3 3]) % рис. 4.25,6
а
imag(acsc(x+i у))
рис. 4.25
Сопутствующие функции'. ASIN, CSC, SIN, FUNM.
Функции косинуса
В этот раздел включены прямые и обратные функции cos, acos, sec, asec.
COS I Функция косинуса
Синтаксис:
V = cos(Z)
Описание:
Функция V = cos(Z) вычисляет косинус от значений элементов массива Z. Массив
Z допускает комплексные значения; углы измеряются в радианах.
Для вычисления функции от матрицы следует применять специальные функции
funm или ехрт.
Алгоритм:
Для вычисления функций косинуса используются следующие соотношения:
cos(x + iy) = cos(x)ch(y) - isin(x)sh(y);
cos(z) = ch(fz).
4. Математические функции
271
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции cos(x), используя следующий
Script-файл:
% Script plotcos
% PLOTCOS Вычисление таблицы и построение графика функции COS(X)
f = inline('cos(х)')
x = -pi:pi/4:pi;
[x.’ f(x.’)]
ezplot(f, x), grid on
Таблица и график функции cos(x) показаны на рис. 4.26.
X
cos(x)
-3.1416
-1
-2.3562
-0.70711
-1.5708
0
-0.7854
0.70711
0
1
0.7854
0.70711
1.5708
0
2.3562
-0.70711
3.1416
-1
График cos(x)
X
рис
.4.26
Функция комплексной переменной
Построить поверхности действительной и мнимой частей функции косинуса
на комплексной плоскости.
Rez = inline('real(cos(x+i*y))1)
Rez =
Inline function:
Rez(x,y) = real(cos(x+i*y))
ezsurfc(Rez, [-pi pi]) % рис. 4.27,a
Imz = inline('imag(cos(x+i*y))')
Imz =
Inline function:
Imz(x,y) = imag(cos(x+i*y))
ezsurfc(Imz,[-pi pi]) % рис. 4.27,6
272
В. Г. Потемкин. Вычисления в среде MATLAB
a
б
рис. 4.27
Сопутствующие функций'. ACOS, SEC, ASEC, EXPM, FUNM.
ACOS
Обратная функция косинуса
Синтаксис:
V = acos(Z)
Описание:
Функция V = acos(Z) вычисляет обратную функцию косинуса от значений элементов
массива Z. Массив Z допускает комплексные значения; углы V измеряются в радианах.
Функция Y = acos(X) для действительных значений -1 < х < 1 определена в интер¬
вале 0 < X < 71.
Для вычисления функции от матрицы следует применять специальную функцию funm.
Алгоритм:
Для вычисления обратной функции косинуса используется следующее соотношение:
arccos(z) = -i arch(z).
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции arccos(x), используя следующий
Script-файл:
% Script plotacos
% PLOTACOS Вычисление таблицы и построение графика функции ACOS(X)
f = inline('acos(х)')
x = -1:0.2:1;
[x.’ f(x.')]
ezplot(f, x), grid on
4. Математические функции
273
Таблица и график функции acos(x) показаны на рис. 4.28.
X
acos(x)
-1
3.1416
-0.8
2.4981
-0.6
2.2143
-0.4
1.9823
-0.2
1.7722
0
1.5708
0.2
1.3694
0.4
1.1593
0.6
0.9273
0.8
0.6435
1
0
График acos(x)
acos(x)
рис. 4.28
Функция комплексной переменной
Построить поверхности действительной и мнимой частей функции, обратной коси¬
нусу, на комплексной плоскости.
Rez = inline(•real(acos(x+i*y))1)
Rez =
Inline function:
Rez(x,y) = real(acos(x+i*y))
ezsurfc(Rez,[-1 1]) % рис. 4.29,a
Imz = inline(’imag(acos(x+i*y))1)
Imz =
Inline function:
Imz(x,y) = imag(acos(x+i*y))
ezsurfc(Imz,[-1 1]) % рис. 4.29,6
real(acos(x+i y))
a
6
рис. 4.29
Сопутствующие функции'. COS, SEC, ASEC, FUNM.
274 В. Г. Потемкин. Вычисления в среде MATLAB
SEC
Функции секанса
Синтаксис:
V = sec(Z)
Описание:
Функция V = sec(Z) вычисляет функцию секанса от значений элементов массива Z.
Массив Z допускает комплексные значения; углы измеряются в радианах.
Для вычисления функции от матрицы следует применять специальную функцию
funm.
Алгоритм:
Для вычисления функции секанса используется следующее соотношение:
sec(z) = l/cos(z).
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции sec(x), используя следующий
Script-файл:
% Script plotsec
% PLOTSEC Вычисление таблицы и построение графика функции SEC(X)
f = inline('sec(x)')
x = -1:0.2:1;
[x.’ f(x.’)]
ezplot(f, x), grid on
Таблица и график функции sec(x) показаны на рис. 4.30.
рис. 4.30
4. Математические функции
275
Функция комплексной переменной
Построить поверхности действительной и мнимой частей функции косеканса
на комплексной плоскости.
Rez = inline(1 real(sec(x+i*y))1)
Rez =
Inline function:
Rez(x,y) = real(sec(x+i*y))
ezsurfc(Rez,[-3 3]) % рис. 4.31,a
Imz = inline('imag(sec(x+i*y))1)
Imz =
Inline function:
Imz(x,y) = imag(sec(x+i*y))
ezsurfc(Imz,[-3 3]) % рис. 4.31,6
real(sec(x+i у))
рис. 4.31
Сопутствующие функции'. COS, ACOS, ASEC, FUNM.
ASEC | Обратная функция секанса
Синтаксис:
V = asec(Z)
Описание'.
Функция V = asec(Z) вычисляет обратную функцию секанса от значений элементов
массива Z. Массив Z допускает комплексные значения; углы V измеряются в радианах.
Для вычисления функции от матрицы следует применять специальную функцию
funm.
Алгоритм:
Для вычисления обратной функции секанса используется следующее соотношение:
arcsec(z) = arccos(l/z).
В. Г. Потемкин. Вычисления в среде MATLAB
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции arcsec(x), используя следующий
Script-файл:
% Script plotasec
% PLOTASEC Вычисление таблицы и построение графика функции ASEC(X)
f = inline('asec(х)')
x = [-3:1/2:-! l:l/2:3];
[x.’ f(x.’)]
ezplot(f), axis([-3 3 0 3]),grid on
Таблица и график функции asec(x) показаны на рис. 4.32.
X
asec(x)
График asec(x)
asecfx)
-3
-2.5
-2
-1.5
-1
1.9106
1.9823
2.0944
2.3005
3.1416
2.5
15
1
1.5
0
0.84107
2
2.5
3
1.0472
1.1593
1.231
0.5
i
:1
i
i
i
-
0.
J -2 -1
C
X
I 1
рис. 4.32
Функция комплексной переменной
Построить поверхности действительной и мнимой частей обратной функции секан
са на комплексной плоскости.
Rez = inline(1 real(asec(x+i*y))1)
Rez =
Inline function:
Rez(x,y) = real (asec(x+i*y))
ezsurfc(Rez,[-3 3]) % рис. 4.33,a
Imz = inline('imag(asec(x+i*y))')
Imz =
Inline function:
Imz(x,y) = imag(asec(x+i*y))
ezsurfc(Imz, [-3 3]) % рис. 4.33,6
4. Математические функции
277
Сопутствующие функции: ACOS, COS, SEC, FUNM.
Функции тангенса и котангенса
В этот раздел включены прямые и обратные функции tg, arctg, ctg, arcctg.
TAN
Функция тангенса
Синтаксис:
V = tan(Z)
Описание:
Функция V = tan(Z) вычисляет тангенс от значений элементов массива Z. Массив Z
допускает комплексные значения; углы измеряются в радианах.
Для вычисления функции от матрицы следует применять специальную функцию funm.
Алгоритм:
Для вычисления функции тангенса используется следующее соотношение:
cos(z)
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции tg(x), используя следующий
Script-файл:
% Script plottan
% PLOTTAN Вычисление таблицы и построение графика функции TAN(X)
f = inline('tan(х)')
x = [-pi:pi/4:pi];
[x. ' f(x. ' ) ]
ezplot(f, [-pi pi]),
grid on
278
В. Г. Потемкин. Вычисления в среде MATLAB
Таблица и трафик функции tan(x) показаны на рис. 4.26.
tan(x)
График tan(x)
-3.1416
1.2246е-016
-2.3562
1
-1.5708
-1.6331е+016
-0.7854
-1
0
0
0.7854
1
1.5708
1.6331е+01б
2.3562-
-1
3.1416
-1.2246е-01б
рис. 4.34
Функция комплексной переменной
Построить поверхности действительной и мнимой частей функции тангенса
на комплексной плоскости.
Rez = inline ('real (tan(x+i*y))')
Rez =
Inline function:
Rez(x,y) = real(tan(x+i*y))
ezsurfc(Rez,[-pi pi]) % рис. 4.35,a
Imz = inline(1imag(tan(x+i*y))')
Imz =
Inline function:
Imz(x,y) = imag(tan(x+i*y))
ezsurfc(Imz,[-pi pi]) % рис. 4.35,6
рис. 4.35
Сопутствующие функции’. AT AN, ATAN2, COT, FUNM.
4. Математические функции
279
ATAN, ATAN2 |
Обратная функция тангенса
Синтаксис:
V = atan(Z)
V = atan2(Y,X)
Описание:
Функция V = atan(Z) вычисляет обратную функцию тангенса от значений элемен¬
тов массива Z.
Функция V = atan2(Y, X) вычисляет обратную функцию тангенса от значений эле¬
ментов двух связанных действительных массивов Y и X. Если массивы оказались ком¬
плексными, берутся их действительные части. Углы V вычисляются с учетом знаков Y
и X и определены в интервале -л < v < л. Функция atan2(Y, X) совпадает с функцией
аргумента комплексного числа angle(x + i*y).
Массив Z допускает комплексные значения; углы V измеряются в радианах.
Для вычисления функции от матрицы следует применять специальную функцию
funm.
Алгоритм:
Для вычисления функций обратного тангенса используются следующие соотношения:
arctg(z) = -i arth(zz);
у
arctg—, Х>0, - °о<у<оо;
Arctg(y, х) =
X
у
71 - arctg-—, х<0,0<у<°о;
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции atan(x), используя следующий
Script-файл:
%• Script plotatan
% PLOTATAN Вычисление таблицы и построение графика функции ATAN(X)
f = inline('atan(х)')
x = [-3:1/2 : 3] ;
[x. ’ f(x. 1 ) ]
ezplot(f,[-3 3]), grid on
Таблица и график функции atan(x) показаны на рис. 4.36.
280
В. Г. Потемкин. Вычисления в среде MATLAB
рис. 4.36
Функция комплексной переменной
Построить поверхности действительной и мнимой частей обратной функции тан¬
генса на комплексной плоскости.
Rez = inline(1 real(atan(x+i*y))1)
Rez =
Inline function:
Rez(x,y) = real(atan(x+i*y))
ezsurfc(Rez,[-3 3]) % рис. 4.37,a
Imz = inline('imag(atan(x+i*y))1)
Imz =
Inline function:
Imz(x,y) = imag(atan(x+i*y))
ezsurfc(Imz,[-3 3]) % рис.
Сопутствующие функции’. TAN, COT, ACOT, FUNM.
4. Математические функции
281
СОТ
Функция котангенса
Синтаксис:
V = cot(Z)
Описание:
Функция V = csc(Z) вычисляет функцию котангенса от значений элементов масси¬
ва Z. Массив Z допускает комплексные значения; углы измеряются в радианах.
Для вычисления функции от матрицы следует применять специальную функцию
funm.
Алгоритм:
Для вычисления функции котангенса используется следующее соотношение:
ctg(z) = l/tg(z).
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции ctg(x), используя следующий
Script-файл:
% Script plotctg
% PLOTCOT Вычисление таблицы и построение графика функции СОТ(Х)
f = inline('cot(х)')
х = -pi:pi/4:pi;
[x. ’ f(x. ’)]
ezplot(f, x), grid on
Таблица и график функции cot(x) показаны на рис. 4.38.
рис. 4.38
282
В. Г. Потемкин. Вычисления в среде MATLAB
Функция комплексной переменной
Построить поверхности действительной и мнимой частей функции котангенса
на комплексной плоскости.
Rez = inline(1 real(cot(x+i*y))1)
Rez =
Inline function:
Rez(x,y) = real(cot(x+i*y))
ezsurfc(Rez,[1/5 14/5]) % рис. 4.39,a
Imz = inline(1imag(cot(x+i*y))1)
Imz =
Inline function:
Imz(x,y) = imag(cot(x+i*y))
ezsurfc(Imz, [1/5 14/5]) % рис. 4.39,6
а
б
рис. 4.39
Сопутствующие функции'. TAN, FUNM.
ACOT
Обратная функция котангенса
Синтаксис:
V = acot(Z)
Описание:
Функция V = acot(Z) вычисляет обратную функцию котангенса от значений эле¬
ментов массива Z. Массив Z допускает комплексные значения; углы V измеряются
в радианах.
Для вычисления функции от матрицы следует применять специальную функцию
funm.
Алгоритм:
Для вычисления функции обратного котангенса используется следующее соот¬
ношение:
arcctg(z) = i arcth(iz).
4. Математические функции
283
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции arcctg(x), используя следующий
Script-файл:
% Script plotacot
% PLOTACOT Вычисление таблицы и построение графика функции АСОТ(Х)
f = inline('acot(х)')
х = [-3:1/2:3];
[х.’ f(х.’)]
ezplot(f,[-3 3]), grid on
Таблица и график функции acot(x) показаны на рис. 4.40.
рис. 4.40
Функция комплексной переменной
Построить поверхности действительной и мнимой частей обратной функции котан¬
генса на комплексной плоскости.
Rez = inline('real(acot(x+i*y))1)
Rez =
Inline function:
Rez(x,y) = real(acot(x+i*y))
ezsurfc(Rez,[-3 3]) % рис. 4.41,a
Imz = inline(1imag(acot(x+i*y))1)
Imz =
Inline function:
Imz(x,y) = imag(acot(x+i*y))
ezsurfcflmz,[-3 3]) % рис. 4.41,6
284
В. Г. Потемкин. Вычисления в среде MATLAB
real(acot(x+i у))
рис. 4.41
Сопутствующие функции-. TAN, СОТ, AT AN, FUNM.
Гиперболические функции
Функции гиперболического синуса
В этот раздел включены прямые и обратные гиперболические функции sinh, asinh,
csch, acsch.
SINH
Функция гиперболического синуса
Синтаксис:
V = sinh(Z)
Описание:
Функция V = sinh(Z) вычисляет функцию гиперболического синуса от значений
элементов массива Z. Массив Z допускает комплексные значения; углы измеряются
в радианах.
Для вычисления функции от матрицы следует применять специальные функции
funm или ехрт.
Алгоритм:
Для вычисления функции гиперболического синуса используются следующие со-
отношения:
ez-e z
sh(z) = ;
2
sh(iz) = i sin(z).
4. Математические функции
285
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции sh(x), используя следующий
Script-файл:
% Script plotsinh
% PLOTSINH Вычисление таблицы и построение графика функции SINH(X)
f = inline('sinh(х)')
x = -3:0.5:3;
[x.1 f(x.’)]
ezplot(f, x), grid on
Таблица и график функции sinh(x) показаны на рис. 4.42.
рис. 4.42
Функция комплексной переменной
Построить поверхности действительной и мнимой частей функции гиперболиче¬
ского синуса на комплексной плоскости.
Rez = inline(’real(sinh(x+i*y))1)
Rez =
Inline function:
Rez(x,y) = real(sinh(x+i*y))
ezsurfc(Rez,[-3 3]) % рис. 4.43,a
Imz = inline(’imag(sinh(x+i*y))’)
Imz =
Inline function:
Imz(x,y) = imag(sinh(x+i*y))
ezsurfc(Imz,[-3 3]) % рис. 4.43,6
286
В. Г. Потемкин. Вычисления в среде MATLAB
рис. 4.43
Сопутствующие функции'. ASINH, CSCH, ACSCH, EXPM, FUNM.
ASINH |
Обратная функция гиперболического синуса
Синтаксис:
V = asinh(Z)
Описание:
Функция V = asinh(Z) вычисляет обратную функцию гиперболического синуса
от значений элементов массива Z. Массив Z допускает комплексные значения; углы V
измеряются в радианах.
Для вычисления функции гиперболического синуса от матрицы следует применять
специальную функцию funm.
Алгоритм:
Для вычисления обратной функции гиперболического синуса используются сле¬
дующие соотношения:
arsh(z) = ln[^z+(l+z2)1/2]; arsh(iz) = i arcsin(z).
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции arsh(x), используя следующий
Script-файл:
% Script plotasinh
% PLOTASINH Вычисление таблицы и построение графика функции ASINH(X)
f = inline('asinh(x)')
x = [-3:1/2 : 3] ;
[x. ' f (x. 1 ) J
ezplot(f,[-3 3]),grid on
4. Математические функции
287
Таблица и график функции asinh(x) показаны на рис. 4.44.
рис. 4.44
Функция комплексной переменной
Построить поверхности действительной и мнимой частей обратной функции ги¬
перболического синуса на комплексной плоскости.
Rez = inline('real(asinh(x+i*y))1)
Лег =
Inline function:
Rez(x,y) = real(asinh(x+i*y))
ezsurfc(Rez,[-3 3]) % рис. 4.45,a
Imz = inline(1imag(asinh(x+i*y))1)
Imz =
Inline function:
Imz(x,y) = imag(asinh(x+i*y))
ezsurfc(Imz,[-3 3]) % рис. 4.45,6
Сопутствующие функции: SINH, CSCH, FUNM.
288
В. Г. Потемкин. Вычисления в среде MATLAB
Функция гиперболического косеканса
CSCH I
Синтаксис:
V = csch(Z)
Описание:
Функция V = csch(Z) вычисляет гиперболический косеканс от значений элементов
массива Z. Массив Z допускает комплексные значения; углы измеряются в радианах.
Для вычисления функции гиперболического косеканса от матрицы следует приме¬
нять специальную функцию funm.
Алгоритм:
Для вычисления функции гиперболического косеканса используется следующее
соотношение:
csch(z) = l/sh(z).
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции cosech(x), используя следующий
Script-файл:
% Script plotcsch
% PLOTCSCH Вычисление таблицы и построение графика функции CSCH(X)
f = inline(’csch(x)')
x = -3:0.5:3;
[x. ’ f (x. ' ) ]
ezplot(f, x), grid on
Таблица и график функции csch(x) показаны на рис. 4.46.
х
csch(x)
График csch(x)
-3
-2.5
-0.099822
-0.16528
-2 -0.27572
-1.5
-1
-0.5
О
0.5
1
1.5
2
2.5
3
-0.46964
-0.85092
-1.919
Inf
1.919
0.85092
0.46964
0.27572
0.16528
0.099822
X
рис. 4.46
4. Математические функции
289
10 т. Зак. 3375
Функция комплексной переменной
Построить поверхности действительной и мнимой частей функции гиперболиче¬
ского косеканса на комплексной плоскости.
Rez = inline('real(csch(x+i*y))1)
Rez =
Inline function:
Rez(x,y) = real(csch(x+i*y))
ezsurfc(Rez,[0.1 3]) % рис. 4.47,a
Imz = inline('imag(csch(x+i*y))')
Imz =
Inline function:
Imz(x,y) = imag(csch(x+i*y))
ezsurfc(Imz,[0.1 3]) % рис. 4.47,6
real(csch(x+i y))
imag(csch(x+i y))
а 6
рис. 4.47
Сопутствующие функции: ACSCH, SINH, ASINH, FUNM.
ACSCH | Обратная функция гиперболического косеканса
Синтаксис:
V = acsch(Z)
Описание:
Функция V = acsch(Z) вычисляет обратную функцию гиперболического косеканса
от значений элементов массива Z. Массив Z допускает комплексные значения; углы V
измеряются в радианах.
Для вычисления функции гиперболического косеканса от матрицы следует приме¬
нять специальную функцию funm.
Алгоритм:
Для вычисления функции обратного гиперболического косеканса используется
следующее соотношение:
arcosech(z) = arsh( 1/z).
290
В. Г. Потемкин. Вычисления в среде MATLAB
Примеры:
Функция действительной переменной
Вычислить таблицу и построить трафик функции arcosech(x), используя следую¬
щий Script-файл:
% Script plotacsch
% PLOTACSCH Вычисление таблицы и построение графика
% функции ACSCH(X)
f = inline('acsch(x)')
x = [-3:1/2:31 ;
[x. ’ f (x. ’ ) ]
ezplot(f,[-3 3]), grid on
Таблица и график функции acsch(x) показаны на рис. 4.48.
Функция комплексной переменной
Построить поверхности действительной и мнимой частей обратной функции ги¬
перболического косеканса на комплексной плоскости.
Rez = inline('real(acsch(x+i*y))■)
Rez =
Inline function:
Rez(x,y) = real(acsch(x+i*y))
ezsurfc(Rez,[-3 3]) % рис. 4.49,a
Imz = inline('imag(acsch(x+i*y))')
Imz =
Inline function:
Imz(x,y) = imag(acsch(x+i*y))
ezsurfc(Imz,[-3 3]) % рис. 4.49,6
4. Математические функции
291
а б
рис. 4.49
Сопутствующие функции'. SINH, CSCH, ASINH, FUNM.
Функции гиперболического косинуса
В этот раздел включены прямые и обратные гиперболические функции cosh, acosh,
sech, asech.
COSH
Функции гиперболического косинуса
Синтаксис:
V = cosh(Z)
Описание:
Функция V = cosh(Z) вычисляет гиперболический косинус от значений элементов
массива Z. Массив Z допускает комплексные значения; углы измеряются в радианах.
Для вычисления функции гиперболического косинуса от матрицы следует приме¬
нять специальные функции funm или ехрт.
Алгоритм:
Для вычисления функции гиперболического косинуса используются следующие
соотношения:
Z 1 ~_z
е + е
ch(z) = —-—; ch(iz)= cos(z).
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции ch(x), используя следующий
Script-файл:
292
В. Г. Потемкин. Вычисления в среде MATLAB
% Script plotcosh
% PLOTCOSH Вычисление таблицы и построение графика функции COSH(X)
f = inline('cosh(x)')
X = -3:0.5:3;
[x. ' f (x. ’ ) ]
ezplot(f, x), grid on
Таблица и график функции cosh(x) показаны на рис. 4.50.
X
cosh(x)
График cosh(x)
cosh(x)
-3
10.068
10
1'
iiii
i i i i
-2.5
6.1323
g
-2
3.7622
Q
-1.5
2.3524
О
7
-1
1.5431
-0.5
1.1276
0
1
\ :
0.5
1.1276
4
? i i
1
1.5431
3
Pv
t t t yZ-t
1.5
2.3524 .
2
2
3.7622
1
;
2.5
6.1323
i
iiii
-3
-2
-1 0 1 .. 2
3
3
10.068
X
рис. 4.50
Функция комплексной переменной
Построить поверхности действительной и мнимой частей функции гиперболиче¬
ского косинуса на комплексной плоскости.
Rez = inline('real(cosh(x+i*y))1)
Rez =
Inline function:
Rez(x,y) = real(cosh(x+i*y))
ezsurfc(Rez,[-3 3]) % рис. 4.51,a
Imz = inline('imag(cosh(x+i*y))')
Imz =
Inline function:
Imz(x,y) = imag(cosh(x+i*y))
ezsurfc(Imz,[-3 3]) % рис. 4.51,6
4. Математические функции
293
Сопутствующие функции-. ACOSH, SECH, ASECH, EXPM, FUNM.
ACOSH I Обратная функция гиперболического косинуса
Синтаксис: ,
V = acosh(Z)
Описание:
Функция V = acosh(Z) вычисляет обратную функцию гиперболического косинуса
от значений элементов массива Z. Массив Z допускает комплексные значения; углы V
измеряются в радианах.
Для вычисления функции гиперболического косинуса от матрицы следует приме¬
нять специальную функцию funm.
Алгоритм:
Для вычисления функций обратного косинуса используются следующие соот¬
ношения:
arch(z) = ln[z+(z2-l)1/2]; arch(z) = i arccos(z).
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции arch(x), используя следующий
Script-файл:
% Script plotacosh
% PLOTACOSH Вычисление таблицы и построение графика функции
ACOSH(X)
f = inline('acosh(х)')
x = [1:1/5:3];
[x. ’ f(x. ’ )J
ezplot(f,[l 3]),grid on
294
В. Г. Потемкин. Вычисления в среде MATLAB
Таблица и график функции acosh(x) показаны на рис. 4.52.
х
acosh(x)
График acosh(x)
1
1.2
1.4
1.6
1.8
2
2.2
2.4
2.6
2.8
3
О
0.62236
0.86701
1.047
1.1929
1.317
1.4254
1.5221
1.6094
1.6892
1.7627
рис. 4.52
Функция комплексной переменной
Построить поверхности действительной и мнимой частей обратной функции ги¬
перболического косинуса на комплексной плоскости.
Rez = inline('real(acosh(x+i*y))')
Rez =
Inline function:
Rez(x,y) = real(acosh(x+i*y))
ezsurfc(Rez,[-3 3]) % рис. 4.53,a
Imz = inline('imag(acosh(x+i*y))')
Imz =
Inline function:
Imz(x,y) = imag(acosh(x+i*y))
ezsurfc(Imz, [-3 3]) % рис. 4.53,6
Сопутствующие функции'. COSH, SECH, ASECH, FUNM.
4. Математические функции
295
Функция гиперболического секанса
SECH |
Синтаксис:
V = sech(Z)
Описание:
Функция V = sech(Z) вычисляет функцию гиперболического секанса от значений
элементов массива Z. Массив Z допускает комплексные значения; углы измеряются
в радианах.
Для вычисления функции гиперболического секанса от матрицы следует приме¬
нять специальную функцию funm.
Алгоритм:
Для вычисления функции гиперболического секанса используется следующее со¬
отношение:
sech(z) = l/ch(z).
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции sech(x), используя следующий
Script-файл:
% Script plotsech
% PLOTSECH Вычисление таблицы и построение графика функции SECH(X)
f = inline('sech(х)')
x = -3:l/2:3;
[x. ’ f (x. * ) ]
ezplot(f, x)z grid on
Таблица и график функции sech(x) показаны на рис. 4.54.
рис. 4.54
296
В. Г. Потемкин. Вычисления в среде MATLAB
Функция комплексной переменной
Построить поверхности действительной и мнимой частей функции гиперболиче¬
ского секанса на комплексной плоскости;
Rez = inline(1 real(sech(x+i*y))1)
Rez =
Inline function:
Rez(x,y) = real(sech(x+i*y))
ezsurfc(Rez,[-3 3]) % рис. 4.55,a
Imz = inline('imag(sech(x+i*y))')
Imz =
Inline function:
Imz(x,y) = imag(sech(x+i*y))
ezsurfc(Imz,[-3 3]) % рис. 4.55,6
рис. 4.55
Сопутствующие функции: COS, COSH, ACOS, ACOSH, FUNM.
ASECH |
Обратная функция гиперболического секанса
Синтаксис:
V = asech(Z)
Описание:
Функция V = asech(Z) вычисляет обратную функцию гиперболического секанса
от значений элементов массива Z. Массив Z допускает комплексные значения; углы V
измеряются в радианах.
Для вычисления обратной функции гиперболического секанса от матрицы следует
применять специальную функцию funm.
Алгоритм:
Для вычисления обратной функции гиперболического секанса используется сле¬
дующее соотношение:
arsech(z) = arch(l/z).
4. Математические функции
297
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции arsech(x), используя следующий
Script-файл:
% Script plotasech
% PLOTASECH Вычисление таблицы и построение графика функции ASECH(X)
f = inline('asech(х)')
x = [0:1/10:1];
[x.' f(x.’)]
ezplot(f,[0 1]), grid on
Таблица и график функции asech(x) показаны на рис. 4.56.
рис. 4.56
Функция комплексной переменной
Построить поверхности действительной и мнимой частей обратной функции ги¬
перболического секанса на комплексной плоскости.
Rez = inline('real(asech(x+i*y))1)
Rez =
Inline function:
Rez(x,y) = real(asech(x+i*y))
ezsurfc(Rez,[-3 3]) % рис. 4.57,a
Imz = inline('imag(asech(x+i*y))')
Imz =
Inline function:
Imz(x,y) = imag(asech(x+i*y))
ezsurfc(Imzr[-3 3]) % рис. 4.57,6
298
В. Г. Потемкин. Вычисления в среде MATLAB
а
б
рис. 4.57
Сопутствующие функции: SINH, CSCH, ASINH, FUNM.
Функции гиперболического тангенса и котангенса
В этот раздел включены прямые и обратные гиперболические функции tanh, atanh,
cotanh, acotanh.
TANH
Функции гиперболического тангенса
Синтаксис:
V = tanh(Z)
Описание:
Функция V = tanh(Z) вычисляет функцию гиперболического тангенса от значений
элементов массива Z. Массив Z допускает комплексные значения; углы измеряются
в радианах.
Для вычисления функции гиперболического тангенса от матрицы следует приме¬
нять специальную функцию funm.
Алгоритм:
Для вычисления функции гиперболического тангенса используется следующее со¬
отношение:
— .
ch(z)
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции th(x), используя следующий
Script-файл:
4. Математические функции
299
% Script plottanh
% PLOTTANH Вычисление таблицы и построение графика функции TANH(X)
f = inline('tanh(х)’)
x = -3:l/2:3;
[x.’ f(x.’)]
ezplot(fz x),grid on
Таблица и график функции tanh(x) показаны на рис. 4.58.
рис. 4.58
Функция комплексной переменной
Построить поверхности действительной и мнимой частей функции гиперболиче¬
ского тангенса на комплексной плоскости.
Rez = inline(1 real(tanh(x+i*y))1)
Rez =
Inline function:
Rez(x,y) = real(tanh(x+i*y))
ezsurfc(Rez,[-3 3]) % рис. 4.59za
Imz = inline('imag(tanh(x+i*y))*)
Imz =
Inline function:
Imz(xzy) = imag(tanh(x+i*y))
ezsurfc(Imz,[-3 3]) % рис. 4.59z6
300
В. Г. Потемкин. Вычисления в среде MATLAB
а б
рис. 4.59
Сопутствующие функции'. ATANH, СОТН, АСОТН, FUNM.
ATANH |
Обратная функция гиперболического тангенса
Синтаксис:
V = atanh(Z)
Описание:
Функция V = atanh(Z) вычисляет обратную функцию гиперболического тангенса
от значений элементов массива Z. Массив Z допускает комплексные значения; углы V
измеряются в радианах.
Для вычисления обратной функции гиперболического тангенса от матрицы следует
применять специальную функцию firnm.
Алгоритм:
Для вычисления обратной функции гиперболического тангенса используется сле¬
дующее соотношение:
, z . 1. 1 + z
arth(z) = —In .
2 1-z
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции arth(x), используя следующий
Script-файл:
4. Математические функции
301
% Script plotatanh
% PLOTATANH Вычисление таблицы и построение графика
% функции ATANH(X)
f = inline('atanh(х)')
x = [-1:1/5:1];
[x. ’ f(x. ’ )]
ezplot(f,[-l 1]), grid on
Таблица и график функции atanh(x) показаны на рис. 4.60.
X
atanh(x)
График atanh(x)
atanh(x)
-1
-Inf
2.5
V fVri—Sy1 * 1 1 r • < • '
-0.8
-1.0986
2
; : 1 i. : : J.......i
-0.6
-0.69315
1.5
• ,• .j. •. • j.
-0.4
-0.42365
1
-0.2
-0.20273
0.5
0
0
0.2
0.20273
0.4
0.42365
-0.5
• }. $ -
0.6
0.69315
-1
0.8
1.0986
-1.5
- ; .*• * t •* r ,u -
1
Inf
-2
7-—: i | j- : i i f
-2 5
i i i i i i i i i
-1
-0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 08 1
X
рис. 4.60
Функция комплексной переменной
Построить поверхности действительной и мнимой частей обратной функции ги¬
перболического тангенса на комплексной плоскости.
Rez = inline('real(atanh(x+i*y))1)
Rez =
Inline function:
Rez(x,y) = real(atanh(x+i*y))
ezsurfc(Rez,[-3 3]) % рис. 4.61,a
Imz = inline('imag(atanh(x+i*y))1)
Imz =
Inline function:
Imz(x,y) = imag(atanh(x+i*y))
ezsurfc(Imz,[-3 3]) % рис. 4.61,6
302
В. Г. Потемкин. Вычисления в среде MATLAB
Сопутствующие функции: TANH,COTH, АСОТН, FUNM.
СОТН I Функция гиперболического котангенса
Синтаксис:
V = coth(Z)
Описание:
Функция V = coth(Z) вычисляет функцию-гиперболического котангенса от значе¬
ний элементов массива Z. Массив Z допускает комплексные значения; углы измеряют¬
ся в радианах.
Для вычисления функции гиперболического котангенса от матрицы следует при¬
менять специальную функцию funm.
Алгоритм:
Для вычисления функции гиперболического котангенса используется следующее
соотношение:
cth(z) = l/th(z).
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции cth(x), используя следующий
Script-файл:
% Script plotcoth
% PLOTCOTH Вычисление таблицы и построение графика функции СОТН(Х)
f = inline('coth(х)')
х = -3:1/2:3;
[х.’ f(х.')]
ezplot(f, x),grid on
4. Математические функции
303
Таблица и график функции cth(x) показаны на рис. 4.62.
х
coth(x)
График coth(x)
-3
-2.5
-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
2.5
3
-1.005
-1.0136
-1.0373
-1.1048
-1.313
-2.164
Inf
2.164
1.313
1.1048
1.0373
1.0136
1.005
X
рис. 4.62
Функция комплексной переменной
Построить поверхности действительной и мнимой частей функции гиперболиче¬
ского котангенса на комплексной плоскости.
Rez = inline('real(coth(x+i*y))')
Rez =
Inline function:
Rez(x,y) = real(coth(x+i*y))
ezsurfc(Rez,[-3 3]) % рис. 4.63,a
Imz = inline(’imag(coth(x+i*y))')
Imz =
Inline function:
Imz(x,y) = imag(coth(x+i*y))
ezsurfc(Imz,[-3 3]) % рис. 4.63,6
real(coth(x+i y))
а
imag(coth(x+i y))
6
рис. 4.63
Сопутствующие функции-. TANH, ATANH, FUNM.
304 В. Г. Потемкин. Вычисления в среде MATLAB
АСОТН I Обратная функция гиперболического котангенса
Синтаксис:
V = acoth(Z)
Описание:
Функция V = acoth(Z) вычисляет обратную функцию гиперболического котангенса
от значений элементов массива Z. Массив Z допускает комплексные значения; углы V
измеряются в радианах.
Для вычисления обратной функции гиперболического котангенса от матрицы сле¬
дует применять специальную функцию funm.
Алгоритм:
Для вычисления обратной функции гиперболического котангенса используется
следующее соотношение:
1 / ч 1 л z+1
arcth(z) = —In .
2 z—1
Примеры:
Функция действительной переменной
Вычислить таблицу и построить график функции arcth(x), используя следующий
Script-файл:
% Script plotacoth
% PLOTACOTH Вычисление таблицы и ..построение графика функции
АСОТН(X)
f = inline('acoth(х)’)
х = [-3:1/2:-1 1:1/2:3];
[х.’ f(х.’)]
ezplot(f,[-3 3]), grid on
Таблица и график функции acoth(x) показаны на рис. 4.64.
рис. 4.64
4. Математические функции
305
Функция комплексной переменной
Построить поверхности действительной и мнимой частей обратной функции ги¬
перболического котангенса на комплексной плоскости.
Rez = inline('real(acoth(x+i*y))1)
Rez =
Inline function:
Rez(x,y) = real(acoth(x+i*y))
ezsurfc(Rez,[-3 3]) % рис. 4.65,a
Imz = inline('imag(acoth(x+i*y))1)
Imz =
Inline function:
Imz(x,y) = imag(acoth(x+i*y))
ezsurfc(Imzz[-3 3]) % рис. 4.65,6
рис. 4.65
Сопутствующие функции'. TANH, СОТН, ATANH, FUNM.
Преобразования систем координат
CART2POL,
POL2CART
Прямое и обратное преобразования декартовой системы
координат в полярную и цилиндрическую
Синтаксис:
[PHI,R] = cart2pol(X,Y)
[PHI,R,Z] = cart2pol(X,Y,Z)
[X,Y] = pol2cart(PHI,R)
[X,Y,Z] = po!2cart(PHI,R,Z)
Описание:
Функция [PHI, R] = cart2pol(X, Y) преобразует точки декартовой системы коорди¬
нат в точки полярной системы координат. Угол PHI измеряется в радианах. Размеры
массивов X и Y должны быть согласованы.
306
В. Г. Потемкин. Вычисления в среде MATLAB
Функция [PHI, R, Z] = cart2pol(X, Y, Z) преобразует точки трехмерной декартовой
системы координат в точки цилиндрической системы координат. Угол PHI измеряется
в радианах. Размеры массивов X, Y и Z должны быть согласованы. Угол TH измеряет¬
ся в радианах.
Функция [X, Y] = pol2cart(PHI, R) преобразует точки полярной системы координат
в точки декартовой системы координат. Угол PHI измеряется в радианах. Размеры
массивов PHI и R должны быть согласованы.
Функция [X,Y,Z] = pol2cart(PHI, R, Z) преобразует точки цилиндрической системы
координат в точки трехмерной декартовой системы координат. Угол PHI измеряется
в радианах. Размеры массивов PHI, R и Z должны быть согласованы.
Алгоритм:
Геометрия преобразования декартовых координат в полярные и цилиндрические
поясняется соответственно на рис. 4.66, а и 4.66, б.
Полярные координаты
а
Цилиндрические координаты
б
рис. 4.66
Для преобразования декартовых координат в полярные и обратно используются
следующие формулы преобразования:
Прямое преобразование
Обратное преобразование
rho = sqrt(x./42 + у.Л2);
х = rho.*cos(phi);
phi = atan2(y,x)
у = rho.*sin(phi)
Для преобразования декартовых координат в цилиндрические и обратно использу¬
ются следующие соотношения:
Прямое преобразование
Обратное преобразование
rho = sqrt(x.^2 + y.^2);
phi = atan2(y,x);
z = z
x = rho.*cos(phi);
у = rho.*sin(phi);
z = z
Сопутствующие функции - нет.
4. Математические функции
307
CART2SPH,
SPH2CART
Прямое и обратное преобразования декартовой системы
координат в сферическую
Синтаксис:
[AZ,EL,R] = cart2sph(X,Y,Z) [X,Y,Z]= sph2cart(AZ,EL, R)
Описание:
Функция [AZ, EL, R] = cart2sph(X, Y, Z) преобразует точки трехмерной декартовой
системы координат в точки сферической системы координат. Углы AZ, EL измеряются
в радианах. Размеры массивов X, Y и Z должны быть согласованы.
Функция [X, Y, Z] = sph2cart(AZ, EL, R) преобразует точки сферической системы
координат в точки декартовой системы координат. Углы AZ, EL измеряются в радиа¬
нах. Размеры массивов AZ, EL и R должны быть согласованы.
Алгоритм:
Геометрия преобразования декартовых координат в сферические поясняется
на рис. 4.67.
Для преобразования декартовых координат в сферические и обратно используются
следующие формулы преобразования:
Прямое преобразование
Обратное преобразование
г = sqrt(х.А2+у.A2+z.А2);
el = atan2(z,sqrt(x.A2+y.A2));
az = atan2(y,x)
z = r.*sin(el);
x = r.*cos(el).*cos(az);
у = r.*cos(el).*sin(az)
Сопутствующие функции - нет.
4.2. Специальные функции
Решение многих научных и технических проблем связано с исследованием специ¬
альных функций. Входящие в состав системы MATLAB 5 специальные функции соот¬
ветствуют справочнику [27]. Они включают функции Бесселя и Эйри, Гамма- и родст¬
венные ей функции, эллиптические функции и интегралы, интегралы вероятностей,
интегральные показательные функции, а также функции Лежандра.
308
В. Г. Потемкин. Вычисления в среде MATLAB
Функции Бесселя
BESSELJ, BESSELY |
Синтаксис:
J = besselj(nu,Z)
J = besselj(nu,Z,1)
[J,ierr] = besselj(nu,Z)
Функции Бесселя
Y = bessely(nu,Z)
Y = bessely(nu,Z,1)
[Y,ierr] = bessely(nu,Z)
Описание:
Линейное дифференциальное уравнение вида
+ z— + (z2-v2)y = 0,
dz
где v - неотрицательная величина, называется уравнением Бесселя, а его решения из¬
вестны как функции Бесселя первого рода Jv(z) и второго рода Yv(z).
Функции Бесселя первого рода Jv(z) и второго рода Yv(z) определяются следующим
образом'.
zYy (-z2/4)*
2j ^^!Г(у + ^ + 1)’
где Г(л) = |e"7fl_1dr;
о
Y ( Jv(z)cos(v7c)-J_v(z)
sin(vTi)
Эти функции линейно независимы и задают полное множество решений для урав¬
нения Бесселя.
Функция J = besselj(nu, Z) вычисляет функции Бесселя первого рода для каждого
элемента комплексного массива Z.
Функция Y = bessely(nu, Z) вычисляет функции Бесселя второго рода для действи¬
тельных неотрицательных значений пи и аргумента Z.
Порядок функции пи может принимать любые действительные значения, необяза¬
тельно целочисленные. Результат является действительным для положительных эле¬
ментов массива Z.
Если входные массивы пи и Z имеют одинаковые размеры, то результатом является
массив того же размера. Если один из массивов скаляр, то он расширяется до размеров
второго массива. Если один из массивов вектор-строка, а второй вектор-столбец,
то результатом является двумерная таблица значений соответствующей функции Бес¬
селя.
Функции J = besselj(nu, Z, 1) и Y = bessely(nu, Z) вычисляют функции Бесселя пер¬
вого рода, масштабированные множителем exp(-abs(imag(z))), для каждого элемента
комплексного массива Z.
4. Математические функции
309
Функции [J, ierr] = besselj(nu, Z) и [Y, ierr] = bessely(nu, Z) возвращают также сле¬
дующие сообщения:
ierr
Описание
0
Успешное завершение
1
Неправильные аргументы
2
Переполнение, результат Inf
3
Некоторая потеря точности при уменьшении параметра
4
Полная потеря точности; слишком велики значения z или пи
5
Нет сходимости, результат NaN
Примеры:
Построить линии уровней для модуля и аргумента функции Бесселя первого рода
порядка 0.
[X,Y] = meshgrid(-4:0.025:4, -1.5:0.025:1.5);
Н = besselj(0, X + i*Y);
contour(X,Y,abs(H),0:0.2:3.2), hold on
contour(X,Y,(180/pi)*angle(H), -180:10:180); hold off % рис. 4.68
Построить линии уровней для модуля и аргумента функции Бесселя второго рода
порядка 0.
[X, Y] = meshgrid(-4:0.025:4, -1.5:0.025:1.5);
Н = bessely(0,X+i*Y);
contour(X,Y,abs(Н), 0:0.2:3.2), hold on
contour(X,Y,(180/pi)*angle(H), -180:10:180); hold off % рис. 4.69
310
В. Г. Потемкин. Вычисления в среде MATLAB
рис. 4.69
Алгоритм:
М-функции besselj и bessely используют интерфейс смешанного программирования
(тех-интерфейс) для вызова библиотеки на языке Fortran, описанной в работах
[29, 30].
Сопутствующие функции'. AIRY, BESSELH, BESSELI, BESSELK.
BESSELI, BESSELK |
Синтаксис:
I = besseli(nu,Z)
I = besseli(nu,Z,1)
[I,ierr] = besseli(nu,Z)
Модифицированные функции Бесселя
К = besselk(nu,Z)
К = besselk(nu,Z,1)
[K,ierr] = besselk(nu,Z)
Описание:
Линейное дифференциальное уравнение вида
d2y dy
—т+z—
dz dz
~(z2+v2)y = 0,
где v - неотрицательная величина, называется модифицированным уравнением Бессе¬
ля, а его решения известны как модифицированные функции Бесселя первого Iv(z)
и второго рода Kv(z).
' Модифицированные функции Бесселя первого рода Iv(z) и второго рода Kv(z) опре¬
деляются следующим образом'.
у (z2/4)^
^£!Г(у + /: + 1)’
4. Математические функции
311
где Г(а) = JeV'dr;
О
Kv(z) = 7t/2I~',(Z) Iv(z)
sin(vTt)
Эти функции линейно независимы и задают полное множество решений для моди¬
фицированного уравнения Бесселя.
Функция I = besseli(nu, Z) вычисляет модифицированные функции Бесселя первого
рода для каждого элемента комплексного массива Z.
Функция К = besselk(nu, Z) вычисляет модифицированные функции Бесселя второ¬
го рода для действительных неотрицательных значений пи и аргумента Z.
Порядок функций пи может принимать любые действительные значения, необяза¬
тельно целочисленные. Результат является действительным для положительных эле¬
ментов массива Z.
Если входные массивы пи и Z имеют одинаковые размеры, то результатом является
массив того же размера. Если один из массивов скаляр, то он расширяется до размеров
второго массива. Если один из массивов вектор-строка, а второй вектор-столбец,
то результатом является двумерная таблица значений соответствующей модифициро¬
ванной функции Бесселя.
Функции I = besseli(nu, Z, 1) и К = besselk(nu, Z, 1) вычисляют модифицированные
функции Бесселя, масштабированные множителем exp(-abs(real(z))), для каждого эле¬
мента комплексного массива Z.
Функции [I, ierr] = besseli(nu, Z) и [К, ierr] = besselk(nu, Z) возвращают также сооб¬
щение об ошибке, как это описано в следующей таблице.
ierr
Описание
0
Успешное завершение
1
Неправильные аргументы
2
Переполнение, результат Inf
3
Некоторая потеря точности при уменьшении параметра
4
Полная потеря точности; слишком велики значения z или пи
5
Нет сходимости, результат NaN
Примеры:
Построить линии уровней для модуля и аргумента модифицированной функции
Бесселя первого рода порядка 0.
[X, Y] = meshgrid(-4:0.025:4,-1.5:0.025:1.5);
Н = besseli(0,X+i*Y);
contour(X,Y, abs(H),0:0.2:3.2),hold on
contour(X,Y,(180/pi)*angle(H),-180:10:180); hold off % рис. 4.70
312
В. Г. Потемкин. Вычисления в среде MATLAB
Построить линии уровней для модуля и аргумента модифицированной функции
Бесселя второго рода порядка 0.
[X, Y] = meshgrid(-4:0.025:4,-1.5:0.025:1.5);
Н = besselk(0,X+i*Y);
contour(X,Y,abs(H),0:0.2:3.2),hold on
contour(X,Y,(180/pi)*angle(H),-180:10:180);hold off % рис. 4.71
is
рис. 4.71
Алгоритм:
М-функции besseli и-besselk используют интерфейс смешанного программирования
(шех-интерфейс) для вызова библиотеки на языке Fortran, описанной в работах
[29,30].
Сопутствующие функции: AIRY, BESSELH, BESSELJ, BESSELY.
4. Математические функции
313
Функции Ханкеля
BESSELH ~1
Синтаксис:
Н = besselh(nu,k,Z) H = besselh(nu,k,Z,1)
U = besselh(nu,Z) [H,ierr] = besselh(...)
Описание:
Функции Ханкеля, или функции Бесселя третьего рода Hv(l)(z) и Hv(2)(z), являются
линейными комбинациями функций Бесселя первого и второго рода и определяются
следующим образом:
H<°(z) = Jv(z) + iYv(z);
H®(z) = Jv(z)-/Yv(z).
Эти функции линейно независимы и задают полное множество решений для урав¬
нения Бесселя.
Функция Н = besselh(nu, k, Z) вычисляет для значений к = 1, 2 функции Ханкеля
порядка пи для каждого элемента комплекснозначного массива Z.
Функция Н = besselh(nu, Z) вычисляет функцию Ханкеля порядка пи, принимая
по умолчанию значение k = 1.
Функция Н = besselh(nu, 1,Z, 1) вычисляет функцию Ханкеля Hv(1)(z) порядка пи,
масштабированную множителем exp(-iz).
Функция Н = besselh(nu, 2, Z, 1) вычисляет функцию Ханкеля Hv(2)(z) порядка пи,
масштабированную множителем exp(iz).
Порядок функций пи может принимать любые действительные значения, необяза¬
тельно целочисленные. Результат является действительным для положительных эле¬
ментов массива Z.
Если входные массивы пи и Z имеют одинаковые размеры, то результатом является
массив того же размера. Если один из массивов скаляр, то он расширяется до размеров
второго массива. Если один из массивов вектор-строка, а второй вектор-столбец, то
результатом является двумерная таблица значений соответствующей функции Ханке¬
ля.
Функции в форме [Н, ierr] = besselh(...) возвращают также сообщение об ошибке,
как это описано в следующей таблице.
ierr
Описание
0
Успешное завершение
1
Неправильные аргументы
2
Переполнение, результат Inf
3
Некоторая потеря точности при уменьшении параметра
4
Полная потеря точности; слишком велики значения z или пи
5
Нет сходимости, результат NaN
Примеры:
Построить линии уровней для модуля и аргумента функции Ханкеля Ho(I,(z).
314
В. Г. Потемкин. Вычисления в среде MATLAB
[X, Y] = ’ meshgrid(-4:0.025:4,-1.5:0.025:1.5);
H = besselh(0,1,X+i*Y);
contour(X,Y,abs(H),0:0.2:3.2),hold on
contour(X,Y,(180/pi)*angle(H),-180:10:180);hold off % рис. 4.72
рис. 4.72
Построить линии уровней для модуля и аргумента функции Ханкеля Ho(2)(z).
[X, Y] = meshgrid(-4:0.025:4,-1.5:0.025:1.5);
Н = besselh(0,2,X+i*Y);
contour(X,Y,abs(H),0:0.2:3.2),hold on
contour(X,Y,(180/pi)*angle(H),-180:10:180);hold off % рис. 4.73
рис. 4.73
Алгоритм:
М-функция besselh использует интерфейс смешанного программирования (гпех-
интерфейс) для вызова библиотеки на языке Fortran, описанной в работах [29, 30].
Сопутствующие функции'. AIRY, BESSELI, BESSELJ, BESSELK, BESSELY.
4. Математические функции
315
AIRY J Функции Эйри
Синтаксис:
W = airy(Z)
W = airy(k,Z)
[W, ierr] = airy(k,Z)
Описание:
Функции Эйри формируют пару независимых решений для дифференциального
уравнения
d2w
—--zw = 0.
d?
Эти решения известны как функции Эйри первого Ai(z) и второго Bi(z) рода.
Связь функций Эйри с модифицированными функциями Бесселя первого рода за¬
дается соотношениями:
Ai(z) = ^(I.I/3(C)-I1/3(O);
Bi(z) = +11/3(0), где С = |z3'2.
Функция W = airy(Z) вычисляет функцию Эйри Ai(Z) для каждого элемента ком¬
плексного массива Z.
Функция W = airy(k, Z) возвращает разные результаты в зависимости от значения
параметра к в соответствии со следующей таблицей.
к
Описание
0
Вычисление функции первого рода Эйри Ai(z)
1
Вычисление производной функции Ai(z)
2
Вычисление функции второго рода Эйри Bi(z)
3
Вычисление производной функции Bi(z)
Функция [W, ierr] = airy(k, Z) возвращает значение флага ошибки в соответствии
со следующей таблицей.
ierr
Описание
0
Успешное завершение
1
Неправильные аргументы
2
Переполнение, результат Inf
3
Некоторая потеря точности при уменьшении параметра
4
Полная потеря точности; слишком велики значения z или пи
5
Нет сходимости, результат NaN
316
В. Г. Потемкин. Вычисления в среде MATLAB
Примеры:
Построить линии уровней для модуля и аргумента функции Эйри первого рода
Ai(z).
[X, Y] = meshgrid(-4:0.025:4,-1.5:0.025:1.5);
Н = airy(0,X+i*Y);
contour(X,Y,abs(H),0:0.2:3.2),hold on
contour(X,Y,(180/pi)*angle(H),-180:10:180);hold off % рис. 4.74
рис. 4.74
Построить линии уровней для модуля и аргумента функции Эйри второго рода Bi(z).
[X, Y] = meshgrid(-4:0.025:4,-1.5:0.025:1.5);
H = airy(2,X+i*Y);
contour(X, Y,abs(H),0:0.2:3.2),hold on
contour(X,Y,(180/pi)*angle(H),-180:10:180);hold off % рис. 4.75
рис. 4.75
Алгоритм:
М-функция airy использует интерфейс смешанного программирования (тех-
интерфейс) для вызова библиотеки на языке Fortran, описанной в работах [29, 30].
Сопутствующие функции: BESSELI, BESSELJ, BESSELK, BESSELY.
4. Математические функции
317
Гамма-функции
Гамма-функция и родственные ей функции
GAMMA, GAMMALN
GAMMAINC
Синтаксис:
Y = gamma(А)
Y = gammain (А)
Y = gammainc(X,А)
Гамма-функция
Логарифмическая гамма-функция
Неполная гамма-функция
Определения:
Гамма-функция Г(а) определяется следующим интегралом [8]:
Г(а)=
О
Для целых положительных значений аргумента а = п+1 эта функция совпадает
с факториалом числа п согласно следующему соотношению:
Г(п+1) = n! = prod(l:n).
На практике при больших значениях аргумента часто применяется логарифмиче¬
ская гамма-функция
gammaln(a) = In Г(а).
Кроме того, важную роль играет неполная гамма-функция Р(х, а), которая опреде¬
ляется следующим соотношением: •
1 х
Р(х, а) = {e-'t^dt.
Описание:
Функция Y = gamma(A) возвращает значения гамма-функции для каждого значения
элемента действительного массива А.
Функция Y = gammaln(A) возвращает значения логарифмической гамма-функции
для каждого значения элемента действительного массива А. Эта функция используется
для того, чтобы избежать переполнения разрядной сетки, которое может возникнуть
при прямом вычислении значений log(gamma(A)).
Функция Y = gammainc(X, А) возвращает значения неполной гамма-функции для
каждой пары элементов действительных массивов X и А.
Примеры:
Построим график гамма-функции для действительных значений аргумента и отме¬
тим те значения, которые соответствуют функции факториала.
Fact = inline(’gamma(х+1)1)
ezplot(Fact,[-3.5 3.5 -7 7]),hold on,grid on
set(gca,’MinorGridLineStyle’,’-’),grid minor
318
В. Г. Потемкин. Вычисления в среде MATLAB
plot([О 1 2 3],[1 1 2 61,'rs', ...
1MarkerEdgeColor1,'r1, ...
'MarkerFaceColor1, ' g', ...
'Markersize1,6) % рис. 4.7 6
рис. 4.76
Значения гамма-функции в положительных целочисленных точках совпадают
со значениями функции факториала и отмечены маркерами.
Построим график логарифмической гамма-функции для действительных значений
аргумента.
gin = inline('gammaln(x)')
ezplot(gin,[0 8]),hold on,grid on % рис. 4.77
4. Математические функции
319
Исследуем сечения неполной гамма-функции в конечной части плоскости пере¬
менной х и параметра а, используя класс объектов inline.
Н = inline( 'хА (-a) * gammainc (х, а) 1, ' х1, 'а');
ezcontourf(Н,[-2 2],[0 4]) % рис. 4.78
рис. 4.78
Применение этого класса объектов позволяет без труда построить сечения поверх¬
ности неполной гамма-функции уровня, используя графический оператор ezcontourf.
До появления объектов inline в составе системы MATLAB можно было строить
только сечения явно заданных.функций, используя графический оператор contour, как
это показано на рис. 4.79.
[Х,А] = meshgrid(-2:0•05:2,0:0.05: 4);
Н = X. А (-А) . * gamma inc (X, А);
[C,h] = contour(X,А,Н);
grid on, clabel(C,h,[0.2 0.6 1]) % рис. 4.79
320
В. Г. Потемкин. Вычисления в среде MATLAB
Алгоритм:
Алгоритм вычисления гамма-функций основан на работе [37] и представляет собой
переработанную с языка Fortran программу из раздела NETLIB/SPECFUN, написан¬
ную W. J. Cody (Argonne National Laboratory, 1989).
Вычисление неполной гамма-функции основано на рекуррентных соотношениях
из работы [27].
Сопутствующие функции'. ERF, ERFCORE, ERFC, ERFCX, ERFINV.
BETA, BETALN,
BETAINC
Бета-функции
Синтаксис:
В = beta(Z,W)
L = betaln(Z,W)
I = betainc(X,Z,W)
Определения:
Бета-функция для комплексных аргументов z и w определяется следующим обра¬
зом [27]:
1 T(z+w)
Бета-функция для целочисленных значений аргументов может быть выражена че¬
рез функцию факториала:
is n!k!
B(n+l,n+k) = .
(п+k+l)!
Значение этой функции представляет собой отношение целых чисел и может быть
точно представлено в виде рационального числа в формате format rat.
Поскольку бета-функция в точке z = 1 равна бесконечности, а при увеличении зна¬
чений аргументов достаточно быстро стремится к нулю, на практике большее приме¬
нение находит логарифмическая бета-функция:
lnB(z, w) = lnB(z) + lnB(w) - lnB(z+ w).
Кроме того, важную роль играет неполная бета-функция Ix(z, w), которая определя¬
ется следующим соотношением [1]:
Ix(Z.W)=—Ц
Неполная бета-функция для действительных значений аргументов z = a, w = b и па¬
раметра х обладает свойством симметрии:
1х(а, /0 = 1-1,-/^ «)•
Кроме того, такая бета-функция тесно связана с биномиальным разложением [27]:
Ip(a, n-a + l) = '^C’pJ(l-p)"~J .
j=a
4. Математические функции
321
11 т. Зак. 3375
Описание:
Функция В = beta(Z, W) возвращает значения бета-функции для соответствующих
элементов массивов Z и W. При вычислениях используются только действительные
значения элементов массивов, размеры которых должны быть согласованы.
Функция L = betaln(Z, W) вычисляет логарифмическую бета-функцию. Поскольку
бета-функция изменяется в широких пределах, знание ее логарифма на практике более
предпочтительно. Вычисление логарифмической бета-функции реализуется без вы¬
числения самой бета-функции.
Функция I = betainc(X, Z, W) вычисляет неполную бета-функцию для соответст¬
вующих элементов массивов X, Z и W. Значения элементов массива X должны при¬
надлежать замкнутому интервалу [0, 1]. Массивы Z и W должны быть действительны¬
ми и неотрицательными.
Алгоритм:
betaln(z,w) = gammaln(z) + gammaln(w) - gammaln(z + w)
beta(z,w) = exp(betaln(z,w) )
Примеры:
Построим графики бета-функции В(х, к) для действительных значений аргументах
и целочисленных значений параметра к.
В = inline('beta(х,к)1,'х','к')
В =
Inline function:
В(х,к) = beta(x,k)
х = 0:0.1:10;
loglog(х,В(х,1), hold on
for k=2:5
loglog (x,В (x, к) ;
end
Ниже представлены таблица рациональных значений бета-функции в целочислен¬
ных точках и график функции в логарифмическом масштабе по обеим осям. При зна¬
чении параметра к, равном 1, этот график представляет собой прямую линию, т.е.
соответствует гиперболе 1/х.
322
В. Г. Потемкин. Вычисления в среде MATLAB
Соответствующая логарифмическая бета-функция L(x, к) изменяется в существен¬
но меньшем диапазоне значений и может быть представлена в виде графика в полуло¬
гарифмическом масштабе:
L = inline('betaln(x,к)'х','к')
L =
Inline function:
L(x,k) = betaln(x,k)
x = 0:0.1:10;
semilogx(x,B(x, 1), hold on
for k=2:5
semilogx(x,В(x,k);
end
X
£=1
к=2
к=3
0
Inf
Inf
Inf
1
0
-0.69315
-1.0986
2
-0.69315
-1.7918
-2.4849
3
-1.0986
-2.4849
-3.4012
4
-1.3863
-2.9957
-4.0943
5
-1.6094
-3.4012
-4.6540
6
-1.7918
-3.7377
-5.1240
7
-1.9459
-4.0254
-5.5294
8
-2.0794
-4.2767
-5.8861
9
-2.1972
-4.4998
-6.2046
10
-2.3026
-4.7005
-6.4922
Предельное значение аргумента при вычислении функции betaln(x, х) на компью¬
тере с реализацией стандарта IEEE-арифметики с плавающей точкой определяется ло¬
гарифмом минимального числа realmin, который равен log(realmin) = -708.3964. По¬
этому при вычислении функции betaln(x, х) предельное значение аргумента х
находится вблизи значения, равного 510, так как betaln(510, 510) = -708.8616.
Подтверждением вышесказанному служит график логарифмической бета-функции,
представленный на рис. 4.80. Здесь диапазон изменения аргументов принят равным по
аргументу х - [0, 5], по аргументу к - [0, 3].
L = inline('betaln(х,к)’);
ezsurfc(L,[0 305]) % рис. 4.80
4. Математические функции
323
рис. 4.80
В заключение рассмотрим график неполной бета-функции для значения параметра
х = 0.5 и аргументов z и w из диапазона [0.01 1].
Ix = inline ('betainc (0 • 5, z,w) ;
ezsurfc(Ix,[0.01 1]) % рис. 4.81
Сопутствующие функции: GAMMA, GAMMAINC, GAMMALN.
PSI
Пси- и полигамма-функции
Синтаксис:
Y = psi(X)
Y = psi(k,X)
Y = psi(k0:kl,X)
324
В. Г. Потемкин. Вычисления в среде MATLAB
Определения:
Пси-функция, или дигамма-функция, комплексного аргумента z является производ¬
ной логарифмической гамма-функции и определяется следующим образом [27]:
v(z)^[lnr(z)] = f(Z)
Последующие производные пси-функции называются полигамма-функциями и оп¬
ределяются как V’(z) - тригамма-, \|/"(z) - тетрагамма-, \|/3)(z) - пентагамма-
функции и т. д.
Описание:
Функция Y = psi(X) возвращает значения пси-функции для соответствующих эле¬
ментов массива X.. При вычислениях используются только действительные значения
элементов массива.
Функция У = psi(k, X) вычисляет k-ю производную пси-функции, причем нулевая
производная psi(O, X) соответствует дигамма-функции, первая производная psi(l, X) -
тригамма-функции и т. д.
Функция Y = psi(kO:kl,X) позволяет вычислить набор производных пси-функции
из диапазона [кО к 1 ].
Примеры:
Вычислить с помощью пси-функции постоянную Эйлера у, которая определяется
следующим образом [27]:
y=lim ! + — + — + •••+ — -Inm =0.5772156649...
Л1_^°о 2 3 т
и связана с пси-функцией соотношением
у = -у(1) .
format long
-psi(l)
ans •= 0.57721566490153
Следующая последовательность операторов позволяет воспроизвести первую стра¬
ницу табл. 6.1 из книги [27]:
х = (1:.005:1.250) • ;
[х gamma(х) gammaln(x) psi(0:l,x)' х-1]
Из экономии места мы не будем воспроизводить этот результат, а представим гра¬
фики соответствующих функций:
Н = inline('gamma(х)1)
InH = inline('gammain(х)')
Psi = inline('psi(х)')
TriH = inline('psi(l,x)')
H =
Inline function:
H(x) = gamma(x)
InH =
Inline function:
lnH(x) = gammain(x)
4. Математические функции
325
Psi =
Inline function:
Psi(x) = psi(x)
TriH =
Inline function:
TriH(x) = psi(lzx)x = l:.01:2;
plot(x,[H(x);lnH(x);Psi(x);TriH(x)]) % рис. 4.82
рис. 4.82
Следующая последовательность операторов позволяет воспроизвести фрагмент
табл. 6.2 из книги [27], которая содержит значения тетрагамма- и пентаграммма-
функций в интервале [12].
X = 1:.04:2;
[х' psi(2:3,х)']
X
V"(x)
V<3)(x)
1
-2.4041
6.4939
1.04
-2.1630
5.5889
1.08
-1.9549
4.8394
1.12
-1.7742
4.2141
1.16
-1.6165
3.6889
1.2
-1.4780
3.2450
1.24
-1.3560
2.8675
1.28
-1.2479
2.5448
1.32
-1.1518
2.2675
1.36
-1.0660
2.0280
1.4
-0.98913
1.8203
1.44
-0.92002
1.6392
1.48
-0.85769
1.4809
1.52
-0.8013
1.3418
1.56
-0.75013
1.2192
1.6
-0.70357
1.1107
1.64
-0.6611
1.0145
326
В. Г. Потемкин. Вычисления в среде MATLAB
X
у"(х)
V(3)(x)
1.68
-0.62227
0.92887
1.72
-0.58667
0.85239
1.76
-0.55397
0.78392
1.8
-0.52387
0.72245
1.84
-0.49609
0.66713
1.88
-0.47042
0.6172
1.92
-0.44665
0.57205
1.96
-0.4246
0.53112
2
-0.40411
0.49394
Сопутствующие функции'. GAMMA, GAMMAINC, GAMMALN.
Эллиптические функции и интегралы
ELLIPJ I Эллиптические функции Якоби
Синтаксис:
[SN,CN,DN] = ellipj(U,M)
[SN,CN,DN] = ellipj(U,M,tol)
Определения:
Введем интеграл
= f dQ
* (1-msin2 0)1/2 ’
функция ср = am(u) называется амплитудой, функция sn(u)- синусом амплитуды,
функция cn(u) - косинусом амплитуды, и dn(u) - дельтой амплитуды.
Эти эллиптические функции Якоби связаны между собой следующим образом [27]:
sn(u)=sin(cp), cn(u)=cos(cp), dn(u)=(l-m sin2(cp))1/2, am(u)=cp.
Описание:
Функция [SN, CN, DN] = ellipj(U, M) вычисляет эллиптические функции Якоби sn,
cn, dn для заданных значений U и М, которые могут быть как скалярами, так и масси¬
вами, но обязательно одинаковых размеров.
Функция [SN, CN, DN] = ellipj(U, М, tol) вычисляет эллиптические функции Якоби
с заданной точностью tol; по умолчанию это значение равно константе машинной точ¬
ности eps. Увеличение этого значения сокращает время вычисления, но приводит к по¬
тере точности.
Алгоритм:
Функция ellipj вычисляет эллиптические функции Якоби, используя метод арифме¬
тико-геометрического среднего [27] и следующие начальные значения параметров:
ао = 1; Ьо = (l-m)1/2; с0= т1/2.
4. Математические функции
327
Реализуется следующий итерационный процесс:
«, +bi.iy,b,=(a^bi_})'l2-,ci = |(ai4 -Ь^У
который заканчивается на шаге N, когда величиной cN можно пренебречь в пределах
заданной точности tol.
Затем для заданного и вычисляется амплитуда фм выраженная в радианах, по формуле
Фуу — 2 aNu
и последовательно значения (pN_j, ф^, ф!, ф0, используя рекуррентное соотно¬
шение
5ш(2ф/_1-ф/.)=^-5т(ф/).
а<
Тогда
sn(w,m) = 5т(ф0) , сп(м,ди) = со8(ф0) , dn(u,m) = (l-msn2(u))l/2.
Ограничения:
Входной параметр m должен принадлежать диапазону 0 < m < 1; способы приведе¬
ния параметра m к этому диапазону описаны в работе [27].
Пример:
Построить эллиптические функции Якоби sn(u, 1/2), cn(u, 1/2) и dn(u, 1/2) в диапа¬
зоне от 0 до 4 К, где четверть-период К равен ellipke(l/2).
U = 0: 0.05:ellipke(1/2)*4;
М = l/2*ones(size(U));
[Sn, Cn, Dn] = ellipj(U,M);
plot (U,Sn), grid, hold on, plot(U,Cn,'—r1) ,plot (U,Dn, • :b') %рис. 4.83
gtext('sn'),gtext('cn'), gtext('dn1)
рис. 4.83
Сопутствующая функция - ELLIPKE.
328
В. Г. Потемкин. Вычисления в среде MATLAB
ELLIPKE |
Полные эллиптические интегралы
Синтаксис:
К = ellipke(M)
[К,Е] = ellipke(M)
[К,Е] = ellipke(М,tol)
Определения:
Полные эллиптические интегралы первого и второго рода определяются следую-
щим образом [27]:
v, ч 7
К(т) = ——;
' (l-msin20)l/
л/2
Е(т) = J (1-msin2 0),/2d0.
0
Описание:
Функция К = ellipke(M) вычисляет полный эллиптический интеграл первого рода
для заданных значений элементов массива М.
Функция [К, Е] = ellipke(M) вычисляет полные эллиптические интегралы первого
и второго рода для каждого элемента массива М.
Функция [К, Е] = ellipke(M, tol) выполняет вычисления с заданной точностью tol.
По умолчанию это значение равно константе машинной точности eps. Увеличение это¬
го значения сокращает время вычислений, но приводит к потере точности.
Алгоритм:
Функция ellipke вычисляет эллиптические интегралы, используя метод арифмети¬
ко-геометрического среднего [27] и следующие начальные значения параметров:
ао = 1; Ьо = (1 - m)I/2; с0 = ш1/2.
Реализуется следующий итерационный процесс:
ч =^(ч-1 =(a,-A-i)1/2;^ =|(Ч->
который завершается на шаге У, когда величиной cN можно пренебречь в пределах за¬
данной точности tol.
Полные эллиптические интегралы первого и второго рода вычисляются по сле¬
дующим формулам:
К(,и) = -^-;
^aN
Е.=(1-У)КЛ/,
где у = •
/=0
4. Математические функции
329
Пример:
Вычислить и построить графики полных эллиптических интегралов первого и вто¬
рого рода для значений m в диапазоне от 0 до 1.
М = 0:0.05:1;
[К, Е] = ellipke(M);
plot(Мг К),grid on,hold on,plot(M,E,•--r1) % рис. 4.84
gtext(1К1),gtext(* E1)
Ограничения:
Входной параметр m должен принадлежать диапазону 0 < m < 1.
Сопутствующая функция - ELLIPJ.
Интегралы вероятностей
ERF, ERFC, ERFCX,
ERFINV, ERFCINV
Интегралы вероятностей
Синтаксис:
Y = erf(X)
Y = erfc(X)
Y = erfex(X)
X = erfinv(Y)
X = erfcinv(Y)
Интеграл вероятностей
Дополнительный интеграл вероятностей
Нормированный дополнительный интеграл вероятностей
Обратная функция ошибок
Обратная дополнительная функция ошибок
Определения:
Интеграл вероятностей, или функция ошибок, erf(x) определяется следующим об¬
разом [8]:
erf(x) = -^= fe"r dt.
ь
330
В. Г. Потемкин. Вычисления в среде MATLAB
Функция у = erfc(x), дополнительная к интегралу вероятностей, называется допол¬
нительным интегралом вероятностей или дополнительной функцией ошибок [27]
и задается соотношением
2 7 _г-
erfc(x) = —j= \е dt = 1 - erf(x).
VTtx
Нормированный дополнительный интеграл вероятностей у = erfcx(x) определяется
по формуле
erfcx(x) = ex'erfc(x).
Функция, обратная интегралу вероятностей, называется обратной функцией оши¬
бок и обозначается как
x = erfinv(y).
Эта функция имеет область определения -1 < у < 1 и область значений -Inf < х < Inf,
причем справедливы следующие соотношения:
erfinv(-l) = -Inf, erfinv(l) = Inf,
а для значений abs(y)>l
erfinv(y) = NaN.
Описание:
Функция Y = erf(X) возвращает значения интеграла вероятностей для всех элемен¬
тов действительного массива X.
Функция Y = erfc(X) вычисляет значения дополнительного интеграла вероятностей.
Функция Y = erfcx(X) вычисляет значения нормированного дополнительного инте¬
грала вероятностей.
Функция X = erfmv(Y) возвращает значения обратной функции ошибок для всех
элементов действительного массива Y, удовлетворяющих условию -1 < у < 1.
Функция X = erfcinv(Y) возвращает значения обратной дополнительной функции
ошибок для всех элементов действительного массива Y, удовлетворяющих условию
0<у < 2.
Функция erfcinv согласуется с функцией у = erfcx(x) для значений 0 < у < 2
И -о© < X < оо
Алгоритм:
Алгоритм вычисления интегралов вероятностей основан на работе [37] и представ¬
ляет собой переработанную с языка Fortran программу из раздела NETLIB/SPECFUN,
написанную W. J. Cody (Argonne National Laboratory, March, 19, 1990).
Примеры:
Построить таблицу и график интеграла вероятностей.
Erf = inline('erf(х)')
Erf =
Inline function:
Erf(x) = erf(x)
x = -2:0.5:2;
[x1 Erf(x)1]
ezplot(Erf)/ grid on % рис. 4.85
4. Математические функции
331
X
Erflx)
-2
-0.99532
-1.5
-0.96611
-1
-0.8427
-0.5
-0.5205
0
0
0.5
0.5205
1
0.8427
1.5
0.96611
2
0.99532
рис. 4.85
Построить таблицу и график дополнительного интеграла вероятностей.
Erfc = inline('erfс(х)’)
Erf с =
Inline function:
Erfc(x) = erfc(x)
x = -2:0.5:2;
[x* Erfc(x)1]
ezplot(Erfc),grid on % рис. 4.86
X
Erfc(x)
-2
1.9953
-1.5
1.9661
-1
1.8427
-0.5
1.5205
0
1
0.5
0.4795
1
0.1573
1.5
0.033895
2
0.0046777
График erfc(x)
рис. 4.86
Построить таблицу и график нормированного дополнительного интеграла вероят¬
ностей.
Erfcx = inline(’erfсх(х)’)
Erfcx =
Inline function:
Erfcx(x) = erfcx(x)
332
В. Г. Потемкин. Вычисления в среде MATLAB
х = -3:0.5:3;
[x1 Erfcx(x)']
semilogy(x,Erfex(x)),grid on % рис. 4.87
рис. 4.87
Построить таблицу и график обратной функции ошибок.
Erfinv = inline('erfinv(у)')
Erfinv =
Inline function:
Erfinv(y) = erfinv(y)
у = -1:0.2:1;
[у* Erfinv(у)’]
ezplot(Erfinv),grid on % рис. 4.88
У
Erfinv(y)
-1
-Inf
-0.8
-0.90619
-0.6
-0.59512
-0.4
-0.37081
-0.2
-0.17914
0
0
0.2
0.17914
0.4
0.37081
0.6
0.59512
0.8
0.90619
1
Inf
График erfinvfy)
erfinv(y)
рис. 4.88
Построить таблицу и график обратной дополнительной функции ошибок.
4. Математические функции
333
Erfcinv = inline('erfcinv(у)')
Erfcinv =
Inline function:
Erfcinv(y) = erfcinv(y)
у = 0:0.2:2;
[у* Erfcinv(y)1]
ezplot(Erfcinv),grid on % рис. 4.89
У
Erfcinv(y)
График erfcinv (у)
1.5
erfinvfy)
0
0.2
Inf
0.90619
1
0.4
0.59512
0.5
0.6
0.8
0.37081
0.17914
0
1
0
-0.5
J*'*'"’:
1.2
-0.17914
1.4
-0.37081
.1
.. • • * : •- 1 • • .
1.6
-0.59512
-1.5
1.8
-0.90619
2
-Inf
-2
i i i i i i i i i
-0.8
-0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8
У
рис. 4.89
Сопутствующие функции - нет.
Интегральная показательная функция
EXPINT I Интегральная показательная функция
Синтаксис:
Y = expint(X)
Определения:
Интегральная показательная функция определяется следующим образом [27]:
Ej(z) = J—dt (| arg(z) |< л).
z *
Другое определение интегральной показательной функции связано с главным зна¬
чением интеграла в смысле Коши [8]
Ei(x) = vp [ —dt,
i *
который для положительных значений х связан с функцией Е^х) следующим образом:
Ei(-x+i*0) = -Ei(x)-i*?i;
Ei(x) = Re(-Ej(-x)).
334
В. Г. Потемкин. Вычисления в среде MATLAB
Описание:
Функция Y = expint(X) возвращает значения интегральной показательной функции
для каждого значения элемента действительного массива X.
Алгоритм:
Для значений х в диапазоне [-38 2] используется разложение в ряд
Е,(х) = -у-1п(л)-£
Л=1
(-1)"*"
пп\
для остальных значений х применяется представление в виде цепной дроби
Пример:
Построить интегральные показательные функции Е1(х) и Ei(x) на интервале (0 2].
х = 0:0.01:2;
El = expint(х);
Ei = real(-expint(-х));
plot(х,El),grid on,hold on,plot(x,Ei) % рис. 4.90
gtext(1 El•),gtext(’Ei•)
Сопутствующие функции - нет.
Функции Лежандра
LEGENDRE~]
Синтаксис:
Р = legendre(n,X)
S = legendre(n,X,'sch')
N = legendre(n,X,'norm')
Присоединенные функции Лежандра
4. Математические функции
335
Определения:
Присоединенные ненормализованные функции Лежандра определяются через по¬
линомы Лежандра следующим образом [27]:
jm
Pnm(х) = (-1Г (1 -хгУ'г — Р„(х),
ах
где Рп(х) - полином Лежандра степени п вида
W =
1
2пп\
Полунормализованные по Шмидту присоединенные функции Лежандра S™ (х) свя¬
заны с ненормализованными присоединенными функциями Лежандра Pnm(x) следую-
щим соотношением:
Рп(х), т = 0;
Полностъю нормализованные присоединенные функции Лежандра N”(x) удовле¬
творяют следующему условию:
и связаны с присоединенными ненормализованными функциями Лежандра Рпга (х) сле¬
дующим соотношением:
Описание:
Функция Р = legendre(n, X) вычисляет присоединенные функции Лежандра степени
п и порядков m = О, 1,п для каждого элемента массива X. Аргумент п должен быть
целым числом, а массив X должен содержать элементы из диапазона -1 < х < 1. Воз¬
вращаемый массив Р имеет размерность на единицу больше размерности X, и каждый
его элемент P(m+1, dl, d2 ...) содержит значения присоединенной функции Лежандра
степени п и порядка т, вычисленные в точках X(dl,d2 ...).
Если X вектор и п равно 2, то матрица Р имеет вид
Р2°(Х(1))
Р2°(х(2))
Р2°(х(3))
Р2'(х(1))
Р2‘(х(2))
Р2’(х(3))
Р22(х(1))
Р22(х(2))
Р22(х(3))
Функция S = legendre(n, X, 'sch') вычисляет полунормализованные по Шмидту при¬
соединенные функции Лежандра.
Функция N = legendre(n, X, ’norm') вычисляет полностью нормализованные присое¬
диненные функции Лежандра.
336
В. Г. Потемкин. Вычисления в среде MATLAB
Примеры:
Оператор
Р = legendre(2,0.0:0.1:0.2)
Р =
-0.5000
-0.4850
-0.4400
0
-0.2985
-0.5879
3.0000
2.9700
2.8800
возвращает матрицу размера 3x3, каждая строка которой содержит значения присо¬
единенной функции Лежандра степени 2 и соответствующего порядка 0, 1 или 2.
Построим графики соответствующих функций Лежандра, используя большее коли¬
чество точек.
х = -1:0.01:1;
Р = legendre(2,х);
plot(х,Р(1,:)),grid,hold on
plot(x,P(2,:))/plot(x,P(3,:)) % рис. 4.91
gtext(’P201),gtext(1P211),gtext(•P22•)
В случае трехмерного массива X
X = rand(2,4,5);
Р = legendre(2,X);
size(Р)
ans = 3 2 4 5
результирующий четырехмерный массив имеет размер Зх2х4х5.
Построим графики полунормализованных по Шмидту присоединенных функций
Лежандра степени 2 на интервале [-1 1].
х = -1:0.01:1;
S = legendre(2,х,’sch’);
plot(х,S(1,:)),grid on,hold on
plot(x,S(2,:),’r1),plot(x,S(3,:),'g1) % рис. 4.92
gtext(1S20'),gtext(1S211),gtext(’S221)
4. Математические функции
337
1
рис. 4.92
Построим графики полностью нормализованных присоединенных функций Лежан¬
дра степени 2 на интервале [-1 1].
х = -1:0.01:1;
N = legendre(2,х,'norm');
plot(xzN(l,:)),grid on,hold on
plot(x,N(2,:),'r1),plot(x,N(3,:),'g*) % рис. 4.93
gtext('N201),gtext('N211),gtext('N221)
рис. 4.93
Сопутствующие функции - нет.
338
В. Г. Потемкин. Вычисления в среде MATLAB
5. МАТРИЦЫ И ЛИНЕЙНАЯ АЛГЕБРА
Матрица как математический объект возникает при решении конкретных вычисли¬
тельных задач, и в первую очередь при решении систем линейных алгебраических
уравнений и задач на собственные значения. Матрица в виде прямоугольной таблицы
чисел очень схожа с массивом, однако прикладные задачи, которые порождают мат¬
рицы, определяют для них специальную совокупность допустимых операций, среди
которых особое место занимает операция умножения. Для простейшего случая, когда
умножается вектор-строка на вектор-столбец, такой операцией является операция ска¬
лярного произведения. В системе MATLAB матрица соответствует двумерному, в об¬
щем случае прямоугольному массиву; размерность матрицы - 2.
Матрицы широко используются при решении обыкновенных дифференциальных
уравнений (ОДУ) и уравнений в частных производных, решении оптимальных задач
ИТ. п.
Алгебраические задачи, связанные с матрицами, объединяются в раздел математи¬
ки, получивший название линейной алгебры, который включает такие базисные задачи,
как обращение и псевдообращение матриц, спектральное и сингулярное разложение
матриц.
В вычислительном плане раздел линейной алгебры поддержан пакетами приклад¬
ных программ UNPACK, EISPACK, разработанными в 60-70-е г. ведущими специали¬
стами, к числу которых принадлежит и основатель фирмы The MathWorks, Inc. Моулер
(С. Moler). Изначальное назначение системы MATLAB состояло именно в том, чтобы
создать диалоговую среду для работы с пакетами программ линейной алгебры.
Несмотря на кажущуюся завершенность, этот раздел вычислительной математики
развивается и в настоящее время в направлении создания новых операций: для работы
с парами матриц (приведение к форме Шура, рекуррентное сингулярное разложение
прямоугольных матриц), решения матричных полиномов и полиномиальных матрич¬
ных уравнений.
Рассмотрим функции системы MATLAB, которые поддерживают работу с матри¬
цами, в такой последовательности: операции с матрицами как числовыми массивами,
коллекция тестовых матриц, характеристики матриц, решение систем линейных урав¬
нений, вычисление собственных значений и сингулярных чисел, вычисление функций
от матриц, работа с алгебраическими полиномами.
I
5.1. Операции над матрицами как числовыми массивами
EYE ~~| Формирование единичной матрицы
Синтаксис:
Y = eye(п)
Y = eye(m,n)
Y = eye(size(А))
^иогшиои
339
Описание:
Функция Y = ones(n) формирует единичную матрицу размера п х и с единицами на
диагонали.
Функция У = ones(m, п) формирует единичную матрицу размера m х п с единицами
на диагонали.
Функция Y = ones(size(A)) формирует единичную матрицу, соразмерную с матрицей А.
Примеры:
Квадратная единичная матрица размера 4x4:
I = eye(4)
I =
1
0
0
0
0
1
0
0
0
0
1
0
. 0
0
0
1
Прямоугольная единичная матрица размера 3x1:
I = eye(3,4)
I =
1 0
0
0
0 1
0
0
0 0
1
0
Сопутствующие функции' ONES, RAND, RANDN, ZEROS.
DIAG
Формирование или извлечение диагоналей матрицы
Синтаксис:
X = diag(v)
X = diag(v,k)
v = diag(X)
v = diag(X,k)
Определение:
Охарактеризовать матрицу с использованием понятия диагоналей можно следую¬
щим образом (рис. 5.1).
Множества элементов матрицы atj, для которых номер столбца связан с номером
строки соотношением j = i + к, образуют:
при к = 0 - главную диагональ матрицы;
при к > 0 - верхнюю наддиагональ с номером к‘,
при к < 0 - нижнюю поддиагональ с номером к.
340
В. Г. Потемкин. Вычисления в среде MATLAB
к = 0
к>0
Это позволяет ввести понятие ленточной матрицы, используя значение р = max |к|,
называемое шириной ленты. Для значений к < 0 параметр р_ называется нижней ши¬
риной ленты, а для значений к > 0 параметр р+ называется верхней шириной ленты.
Тогда многообразие квадратных ленточных матриц размера и х п можно классифи¬
цировать следующим образом [49]:
Тип ленточной матрицы
Ширина ленты
Р-
Диагональная
0
0
Верхняя треугольная
0
п-1
Верхняя треугольная
п-1
0
Т рехдиагональная
1
1
Верхняя двухдиагональная
0
1
Нижняя двухдиагональная
1
0
Верхняя матрица Хессенберга
1
п-1
Нижняя матрица Хессенберга
п-1
1
Описание:
Функция X = diag(v) формирует квадратную матрицу X с вектором v на главной
диагонали.
Функция X = diag(v, к) формирует квадратную матрицу X порядка length(v)+abs(k)
с вектором v на k-й диагонали.
Функция v = diag(X) извлекает из матрицы X главную диагональ.
Функция v = diag(X, к) извлекает из матрицы X диагональ с номером к; при к > О
это номер наддиагонали, при к < 0 это номер поддиагонали.
Примеры:
Сформировать диагональную матрицу с заданным вектором v на главной диагонали.
V =
-3:3;
X =
diag(v)
X =
-3
0
0
0
0
0
0
0
2
0
0
0
0
0
0
0
-1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
2
0
0
0
0
0
0
0
3
5. Матрицы и линейная алгебра
341
Сформировать трехдиагональную матрицу с заданным вектором v на главной диа¬
гонали и единицами на остальных диагоналях.
v = -3:3;
nl = length(v)-l;
X = diag(v)+diag(ones(nl,1
X =
,1)+diag(ones(nl,1),-1)
-3
1
0
0
1
-2
1
0
0
1
-1
1
0
0
1
0
0
0
0
1
0
0
0
0
0
0
0
0
0 0 0
0 0 0
0 0 0
10 0
110
12 1
0 13
Для формирования ленточных матриц различного вида, квадратных и прямоуголь¬
ных, предпочтительнее использовать функцию spdiags формирования диагоналей раз¬
реженной матрицы.
Сопутствующие функции'. SPDIAGS, TRDL, TRIU.
TRIL
Формирование нижней треугольной матрицы (массива)
Синтаксис:
L = tril(X)
L = tril(X,k)
Описание:
Функция L = tril(X) сохраняет нижнюю треугольную часть матрицы X.
Функция L = tril(X, к) сохраняет нижнюю треугольную часть матрицы X, начиная
с диагонали с номером к. При к > 0 это максимальный номер ненулевой наддиагонали,
при к < 0 это максимальный по абсолютному значению номер ненулевой поддиагонали.
Примеры:
Сформировать для заданной матрицы различные типы нижних треугольных матриц.
Xt = [1 2 3 4; 5 6 7
X = repmat (Xt, 3,1)
X =
12 3
5 6 7
12 3
5 6 7
12 3
5 6 7
TL = tril(X)% Нижняя
TL =
10 0
5 6 0
12 3
5 6 7
12 3
5 6 7
8];
4
8
4
8
4
8
треугольная
0
0
0
8
4
8
342
В. Г. Потемкин. Вычисления в среде MATLAB
TL = tril(X,l)% Нижняя треугольная, начиная с первой наддиагонали
TL =
1
2
0
0
5
6
7
0
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
TL =
TL =
tril(X,-2)%
Нижняя
треугольная, начиная со второй поддиагонали
0
0
0
0
0
0
0
0
1
0
0
0
5
6
0
0
1
2
3
0
5
6
7
8
Сопутствующие функции'. DIAG, TRIU.
TRIU
Формирование верхней треугольной матрицы (массива)
Синтаксис:
U = triu(X)
U = triu(X,k)
Описание'.
Функция U = triu(X) сохраняет верхнюю треугольную часть матрицы (массива) X.
Функция U = triu(X, к) сохраняет верхнюю треугольную часть матрицы (массива)
X, начиная с диагонали с номером к. При к > 0 это максимальный номер ненулевой
надциагонали, при к < 0 это максимальный по абсолютному значению номер ненуле¬
вой поддиагонали.
Примеры:
Сформировать для заданной матрицы различные типы верхних треугольных матриц.
Xt = [1 2 3 4; 5 б 7 8];
X = repmat(Xt,3,1)
X =
12 3
5 6 7
12 3
5 6 7
12 3
5 6 7
4
8
4
8
4
8
TU = triu(X)%
Верхняя
ти =
1
2
3
0
6
7
0
0
3
0
0
0
0
0
0
0
0
0
треугольная
4
8
4
8
О
О
5. Матрицы и линейная алгебра
343
TU = triu(X,l)%
Верхняя
[ треугольная, начиная с первой наддиагонали
ти =
0
2
3
4
0
0
7
8
0
0
0
4
0
0
0
0
0
0
0
0
0
0
0
0
TU = triu(X
,-2)%
Верхняя
[ треугольная, начиная со второй поддиагонали
ти =
1
2
3
4
5
6
7
8
1
2
3
4
0
6
7
8
0
0
3
4
0
0
0
8
Сопутствующие функции'. DIAG, TRIL.
FLIPLR ~| Отражение матрицы относительно вертикальной оси
Синтаксис:
В = fliplr(A)
Описание:
Функция В = fliplr(A) переставляет столбцы матрицы А симметрично относительно
вертикальной оси. Если матрица А имеет нечетное число столбцов, то средний стол¬
бец остается на своем месте.
Пример:
Выполним отражение матрицы А с четным числом столбцов относительно верти¬
кальной оси.
At = 1:4;
А =
repmat (At,
3,1)
В =
fliplr(A)
А =
1
2
3
4
1
2
3
4
1
2
3
4
В =
4
3
2
1
4
3
2
1
4
3
2
1
Выполним отражение матрицы А с нечетным числом столбцов относительно вер¬
тикальной оси.
At = 1:5;
А = repmat (At, 3,1)
В = fliplr(A)
344
В. Г. Потемкин. Вычисления в среде MATLAB
А
В
1
1
1
2
2
2
3
3
3
4
4
4
5
5
5
4
.4
4
В этом случае средний столбец действительно остается на своем месте.
Сопутствующие функции'. FLIPUD, ROT90.
FLIPUD |
Отражение матрицы относительно горизонтальной оси
Синтаксис:
В = flipud(A)
Описание:
Функция В = flipud(A) переставляет строки матрицы А симметрично относительно
горизонтальной оси. Если матрица А имеет нечетное число строк, то средняя строка
остается на своем месте.
Пример:
Выполним отражение матрицы А с четным числом строк относительно горизон¬
тальной оси.
At = 1:4;
А = repmat(At1,1,3)
= flipud(A)
1
2
3
4
1
2
3
4
1
2
3
4
4
3
2
1
4
3
2
1
4
3
2
1
в
А
в
5
5
5
3
3
3
2
2
2
1
1
1
Выполним отражение матрицы А с нечетным числом строк относительно горизон¬
тальной оси.
At = 1:5;
А = repmat(At1,1,3)
В = flipud(A)
А =
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
5. Матрицы и линейная алгебра
345
в =
5 5 5
4 4 4
3 3 3
2 2 2
111
В этом случае средняя строка действительно остается на своем месте.
Сопутствующие функции'. FLIPLR, ROT90.
RQT90 | Поворот матрицы на угол, кратный 90 градусам
Синтаксис:
В = rot90(A)
В = rot90(A,k)
Описание:
Функция В = rot90(A) осуществляет поворот матрицы А размера m х п на 90° про¬
тив часовой стрелки.
Функция В = rot90(A, к) осуществляет поворот матрицы А размера m х п на 90° *к,
где к = ±1, ± 2,... При этом положительный знак соответствует повороту против часо¬
вой стрелки, а отрицательный знак - повороту по часовой стрелке.
Пример:
Рассмотрим прямоугольную матрицу А размера 2x3.
А= [1 2 3; 4 5 6]
А =
12 3
4 5 6
Выполним ее поворот на 90° против часовой стрелки.
В о rot90(A)
В =
3 6
2 5
1 4
Теперь выполним поворот на 180° по часовой стрелке.
С ■ rot90(Az -2)
С =
6 5 4
3 2 1
Сопутствующие функции-. VIEW, FLIPUD, FLIPLR.
346
В. Г. Потемкин. Вычисления в среде MATLAB
5.2. Коллекция матриц
HADAMARD ~|
Синтаксис:
Н = hadamard(п)
Матрица Адамара (Hadamard matrix)
Описание:
Матрицы Адамара встречаются в различных приложениях - комбинаторном и чис¬
ленном анализе, обработке сигналов [83,84]. Это матрицы, составленные из 1 и -1,
столбцы которых ортогональны, так что справедливо соотношение
Н’ *Н = п*1,
где [n, n] = size(H) и I = еуе(п, п). Матрица Адамара порядка п > 2 существует только
тогда, когда и кратно 4 [48].
Описание:
Функция Н = hadamard(n) возвращает матрицу Адамара порядка п. Эта функция
вычисляет матрицы Адамара для тех случаев, когда величины п, п/12, п/20 являются
степенями по основанию 2.
Пример:
Н = hadamard(8)
н =
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
Картина линий уровня для этой матрицы напоминает ковер,
contour(hadamard(8)) % рис. 5.2
рис. 5.2
Сопутствующие функции: COMPAN, HANKEL, TOEPLITZ.
5. Матрицы и линейная алгебра
HANKEL
Матрица Ганкеля (Hankel matrix)
Синтаксис:
H = hankel. (с)
Н = hankel(с,г)
Определение:
Матрица Ганкеля - это симметрическая матрица с постоянными значениями на ан¬
тидиагоналях, элементы которой удовлетворяют соотношению
Г/г(/, ;) = /?(/ +J-1);
|р = [с г(2: end)].
Таким образом, вектор р полностью определяет задание матрицы, а векторы с
и г могут быть заданы произвольно.
Описание:
Функция Н = hankel(c) возвращает квадратную матрицу Ганкеля, первый столбец
которой совпадает с вектором р, а все элементы H(i, j), i + j > п, лежащие ниже главной
антидиагонали, равны нулю.
Функция Н = hankel(c, г) возвращает матрицу Ганкеля, первый столбец которой
совпадает с вектором с, а последняя строка с вектором г. Если последний элемент век¬
тора с не равен первому элементу вектора г, то возникает конфликт на главной анти¬
диагонали и предпочтение отдается элементу вектора с.
2 3];
Н = hankel(с)
2
3
0
3
О
О
Примеры:
Сформируем матрицу Ганкеля.с помощью единственного вектора с.
с = [1
н =
1
2
3
Эта матрица имеет нулевые элементы ниже главной антидиагонали.
Сформируем матрицу Ганкеля, используя произвольно заданные векторы сиг.
с = 1:3; г = 7:10; Р = hankel(с,г)
Warning: Last element of input column does not match first
element of input row. Column wins anti-diagonal conflict.
Column wins anti-diagonal conflict.
Предупреждение: Последний элемент столбца вектора входа не совпадает
с первым элементом строки другого вектора входа. Столбец выигрывает
конфликт со строкой на пересечении с главной антидиагональю.
н =
1
2
3
2
3
8
3
8
9
8
9
10
В результате разрешения конфликта первый элемент вектора г, равный 7, заменен
на последний элемент вектора с, равный 3. Конфликтующие векторы сиг выделены
полужирным шрифтом.
348
В. Г. Потемкин. Вычисления в среде MATLAB
Вектор р, однозначно определяющий матрицу Ганкеля, имеет следующий вид:
р = [с г(2send)]
р = 1 2 3 8 9 10
Сопутствующие функции'. HADAMARD, TOEPLITZ.
HILB, INVHILB | Матрица Гильберта (Hilbert matrix)
Синтаксис:
Н = hilb(n)
Н = invhilb(п)
Определение:
Матрица Гильберта определяется следующим образом [42]:
Матрица, обратная матрице Гильберта, - это целочисленная матрица, вычисление
которой в арифметике с плавающей точкой возможно лишь с ограниченной точно¬
стью. Матрица Гильберта представляет собой пример плохо обусловленной матрицы
по отношению к операции обращения.
Описание:
Функция Н = hilb(n) формирует матрицу Гильберта порядка п.
Функция Н = invhilb(n) формирует матрицу, обратную матрице Гильберта, порядка
п. Точная обратная матрица - это матрица, элементами которой являются целые числа.
Точное представление такой матрицы в арифметике с плавающей точкой возможно
только тогда, когда порядок матрицы не превышает 11. Для больших значений п
функция invhilb(n) формирует только приближенную матрицу.
Сравнение процедуры формирования обратной матрицы Гильберта invhilb(n)
с процедурой обращения inv(hilb(n)) позволяет выявить несколько источников оши¬
бок:
• ошибки, обусловленные формированием матрицы Гильберта в арифметике с пла-
вющей точкой с помощью М-функции hilb;
• ошибки, обусловленные процедурой вычисления обратной матрицы с помощью М-
функции inv;
• ошибки, обусловленные формированием обратной матрицы с помощью М-
функции invhilb. /
Оказывается, что первый источник ошибок, связанный с представлением правиль¬
ных дробей вида 1/3 или 1/5 в арифметике с плавающей точкой, наиболее существенный.
Примеры:
Построим график чисел обусловленности по отношению к операции обращения
для матриц Гильберта порядка от 1 до 100.
for i=l:100
k(i) = cond(hilb(i));
end
loglog(k),grid on % рис. 5.3
5. Матрицы и линейная алгебра
349
рис. 5.3
Матрица Гильберта невысокого порядка 8 имеет число обусловленности, превы¬
шающее 1О10.
cond(hilb(8))
ans = 1.5258е+010
Формирование обратной матрицы Гильберта порядка 6 в формате рациональных
чисел вызывает затруднения:
invhilb(6)
ans =
36
-630
3360
-7560
7560
-2772
-630
14700
-88200
211680
-220500
83160
3360
-88200
56448
*
*
-582120
-7560
211680
*
*
★
*
7560
-220500
*
*
*
*
-2772
83160
-582120
*
*
698544
Точное представление целочисленной обратной матрицы Гильберта возможно
в формате long g до 11-го порядка включительно.
Как следует из анализа рис. 5.3, число обусловленности экспоненциально растет,
пока порядок матрицы Гильберта не превышает 13; свыше этого значения результат
обращения матрицы Гильберта в арифметике с плавающей точкой не является досто¬
верным.
Сравним результаты формирования и вычисления обратной матрицы Гильберта
порядка 6.
Число обусловленности матрицы Гильберта порядка 6 равно приблизительно
1.5*107:
cond(hilb(6))
ans = 1.49516+007
350
В. Г. Потемкин. Вычисления в среде MATLAB
Сформированная обратная матрица Гильберта является целочисленной:
invhilb(6)
ans =
36
-630
3360
-7560
7560
-2772
-630
14700
-88200
211680
-220500
83160
3360
-88200
564480
-1411200
1512000
-582120
-756
211680
-1411200
3628800
-3969000
1552320
7560
-220500
1512000
-3969000
4410000
-1746360
-2772
83160
-582120
1552320
-1746360
698544
Вычисленная в арифметике с плавающей точкой обратная матрица отличается
от точной в четвертом знаке после запятой:
inv(hilb(6))
ans =
Columns 1 through 3
36.0000000012128
-630.000000035885
3360.00000024773
-7560.00000065274
7560.00000072713
-2772.00000028854
Columns 4 through 6
-7560.00000067272
211680.000019845
-1411200.00013675
3628800.00035992
-3969000.00040057
1552320.0001588
630.000000036415
14700.000001076
88200.000007421
211680.000019543
220500.000021758
83160.0000086282
7560.00000075276
220500.000022196
1512000.00015291
3969000.0004024
4410000.0004478
1746360.00017752
3360.0000002537
-88200.0000074887
564480.000051623
-1411200.0001359
1512000.00015127
-582120.000059976
-2772.00000029965
83160.0000088325
-582120.000060839
1552320.00016008
-1746360.00017813
698544.00007061
Это подтверждается оценкой нормы разности сформированной и вычисленной об¬
ратных матриц Гильберта:
norm(inv(hilb(6))-invhilb(6))
ans = 9.3109е-004
Сопутствующие функции - нет.
MAGIC “] Магический квадрат
Синтаксис:
М = magic(п)
История:
Хорошим примером матрицы, красной нитью пронизывающей описание системы
MATLAB, является магический квадрат, изображенный на гравюре "Меланхолия”
(1514) немецкого художника и приверженца математического знания Альбрехта Дю¬
рера [66].
Сама гравюра (рис. 5.4, а) наполнена математической символикой, но если вы вни¬
мательно приглядитесь, то в правом верхнем углу увидите гравюру матрицы (рис. 5.4, б).
Эта матрица была известна как волшебный квадрат и, как полагали многие во времена
5. Матрицы и линейная алгебра
351
Дюрера, обладала волшебными свойствами. Как показали дальнейшие математические
исследования, эта матрица действительно обладает удивительными свойствами.
а
рис. 5.4
Система MATLAB имеет встроенную функцию, которая создает волшебные квад¬
раты практически любого порядка, и неудивительно, что эта функция имеет имя magic.
Вычислим тот же магический квадрат порядка 4, который изображен на гравюре.
В = magic(4)
В =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
Эта матрица имеет те же свойства, что и матрица на гравюре Дюрера, но отличает¬
ся тем, что в ней переставлены местами два средних столбца. Для того чтобы преобра¬
зовать эту матрицу в матрицу на гравюре Дюрера, надо выполнить следующую операцию:
А = В(:,[1 3 2 4])
А =
16 3
2
13
5 10
11
8'
9 6
7
12
4 15
14
1
Зачем же понадобилась Дюреру такая перестановка? Без сомнения, он хотел отме¬
тить дату создания гравюры - 1514 г. - и сделал это, воспользовавшись магическим
квадратом.
352
В. Г. Потемкин. Вычисления в среде MATLAB
Описание:
Функция М = magic(n) для п > 3 формирует матрицу магического квадрата поряд¬
ка п, элементами которой являются целые числа от 1 до п2, суммы элементов которых
по строкам и столбцам, на диагонали и антидиагонали равны. Эта функция магическо¬
го квадрата была включена в состав системы MATLAB в 1993 г. и подробно описана
в работе [73]. Постоянную сумму элементов назовем константой магического квад¬
рата и обозначим цп. Значение этой константы зависит от п и равно
цп = п(п2+1)/2.
Построим зависимость значения константы от порядка магического квадрата.
mu = inline(*n.*(n.A2+l)/2’)
mu =
Inline function:
mu(n) = n.*(n.Л2+1)/2
n = 3:10;
plot(n,mu(n), '-o1),grid on % рис. 5.5
рис. 5.5
Ранг матрицы М зависит от п следующим образом [54]:
rank(magic(n)) =
п,
п/2 + 2,
3,
n = 2k+l, k = l,2,...
n/2 = 2k-l, k = l,2, ...
n = 4k, k = l,2,...
График изменения ранга магической матрицы для 3 <= и <= 32 показан на рис. 5.6.
for i=3:32
r(i) = rank(magic(i));
end
plot(3:32,r(3:32),'-o’),grid on % рис. 5.6
5. Матрицы и линейная алгебра
353
12 т. Зак. 3375
35
rank(magic(n))
Если матрицу магического квадрата нормировать делением на ее константу, то по¬
лучим дважды стохастическую матрицу, обладающую тем свойством, что ее матрич¬
ная норма любого порядка равна 1 [54].
Сконструируем дважды стохастическую матрицу порядка 6.
MS = magic(б)/mu(б)
MS =
35/111
1/111
2/37
26/111
19/111
8/37
1/37
32/111
7/111
7/37
23/111
25/111
31/111
3/37
2/111
22/111
9/37
20/111
8/111
28/111
11/37
17/111
10/111
5/37
10/37
5/111
34/111
4/37
14/111
16/111
4/111
12/37
29/111
13/111
6/37
11/111
Читатель самостоятельно может проверить, что матричная норма любого порядка
для этой матрицы равна 1.
Сопутствующие функции'. ONES, RAND.
PASCAL |
Матрица Паскаля (Pascal matrix)
Синтаксис:
P = pascal(n)
P = pascal(n,1)
P = pascal(n,2)
Описание:
Функция P = pascal(n) формирует симметрическую положительно определенную
квадратную матрицу Паскаля порядка п, которая составлена из элементов треугольни¬
ка Паскаля. Этот треугольник составлен из коэффициентов разложения бинома
(1 + w)k, записанных в следующем виде (для значений к =1,...,4):
354
В. Г. Потемкин. Вычисления в среде MATLAB
1
1 + w
l + 2w+w2
l+3w+3w2+ w3
l + 4w+6w2 + 4w3+ w4
Матрицы Паскаля порядка 3 и 4 имеют следующий вид:
Р = pascal(3)
Р =
111
12 3
13 6
р = ]
pascal(4)
р =
1
1
1
1
1
2
3
4
1
3
6
10
1
4
10
20
Матрица Р = pascal(n, 1) - это нижняя треугольная матрица разложения Холецкого
матрицы pascal(n) с точностью до знаков столбцов. Эта матрица удовлетворяет усло¬
вию Р2 = I, где I - единичная матрица; такая матрица является инволютивной, т. е. ее
обратная матрица совпадает с исходной [54].
Матрица Р = pascal(n, 2) - это матрица, полученная в результате транспонирования
и перестановок в матрице pascal(n, 1); такая матрица обладает свойством Р3 = I, где I -
единичная матрица [36, 55].
Пример:
Сформируем матрицы pascai(3, i) и pascai(3, 2).
Pl = pascal(3,1)
Pl =
1
0
0
1
-1
0
1
-2
1
Р1А2
ans =
1
0
0
0
1
0
0
0
1
P2 = pascal(3,2)
P2 =
1
1
1
-2
-1
0
1
0
0
Р1А3
ans =
1
0
0
0
1
0
0
0
1
Сопутствующая функция - CHOL.
ROSSER
Матрица Peccepa (Rosser matrix)
Синтаксис:
R = rosser
Описание:
Функция R = rosser формирует тестовую матрицу для классической симметриче¬
ской проблемы собственных значений. Эта матрица служила камнем преткновения для
многих алгоритмов вычисления собственных значений. Только QR-алгоритм Франси¬
са, усовершенствованный Уилкинсоном [25] и реализованный в пакете программ
EISPACK, используемой в системе MATLAB, позволяет справиться с указанной про¬
блемой.
5. Матрицы и линейная алгебра
355
Матрица 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
Сравним собственные значения матрицы Рессера, вычисленные с помощью функ¬
ции eig(rosser), с точными значениями.
Формулы для решения
Вычисленное решение
eig( rosser)
10*(1+sqrt(10201))
1020
1020.04901843
1020
1020
1020
510+100*sqrt(26)
1019.90195135928
1019.90195135928
1000
1000
1000
1000
1000
1000
510-100*sqrt(26)
0.098048640721’5722
0.0980486407214584
0
0
-4.852317700180136-015
-10*(1 + sqrt(10201) )
-1020
-1020.04901843
Цифры, являющиеся неточными, отмечены полужирным шрифтом.
Сопутствующие функции: EIG, WILKINSON.
TOEPLITZ I Матрица Теплица (Toeplitz matrix)
Синтаксис:
Т = toeplitz(с)
Т = toeplitz(с,г)
Описание:
Функция Т = toeplitz(c) возвращает симметрическую матрицу Теплица, определя¬
емую однозначно вектором с.
Функция Т = toeplitz(c, г) возвращает несимметрическую матрицу Теплица, первый
столбец которой совпадает с вектором с, а первая строка - с вектором г. Если первый
элемент вектора с не равен первому элементу вектора г, то возникает конфликт
на главной диагонали и предпочтение отдается элементу вектора с.
356
В. Г. Потемкин. Вычисления в среде MATLAB
Примеры:
Сформируем симметрическую матрицу Теплица.
с = 1:4;
Т =
1
2
3
4
Т = toeplitz(c)
2 3 4
12 3
2 12
3 2 1
Сформируем несимметрическую матрицу Теплица.
с = 1:4; г = 1.5:4.5; Т = toeplitz(с,г)
Warning: First element of input column does not match first
element of input row. Column wins diagonal conflict.
Предупреждение: Первый элемент столбца вектора входа не совпадает
с первым элементом строки другого вектора входа. Столбец выигрывает
конфликт со строкой на пересечении с главной диагональю.
т =
1 2.5 3.5 4.5
2 1 2.5 3.5
321 2.5
4 3 2 1
В результате разрешения конфликта первый элемент вектора г, равный 1.5, заменен
на первый элемент вектора с, равный 1. Конфликтующие векторы сиг выделены по¬
лужирным шрифтом.
Сопутствующая функция - HANKEL.
VANDER I Матрица Вандермонда (Vandermonde matrix)
Синтаксис:
V = vander(х)
Описание:
Функция V = vander(x) возвращает матрицу Вандермонда, порядок которой опре¬
деляется длиной входного вектора, а j-й столбец формируется следующим образом:
V ( : , j ) = хЛ (n-j ) .
При этом столбец матрицы Вандермонда с номером п - 1 (второй столбец справа)
совпадает с вектором х.
Пример:
Сформируем матрицу Вандермонда, используя следующий входной вектор:
V = vander(1:4)
V =
1
1
1
1
8
4
2
1
27
9
3
1
64
16
4
1
Столбец, совпадающий со входным вектором, отмечен полужирным шрифтом.
Сопутствующие функции - нет.
357
5. Матрицы и линейная алгебра
Матрица Уилкинсона (Wilkinson 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
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))
esort(ans)
ans =
1.074619418'290339e+001
1.074619418290332e+001
9.210678647361332e+000
9.210678647304919e+000
8.038941122829023e+000
8.038941115814275e+000
7.003952209528674e+000
7.003951798616375e+000
6.000234031584166e+000
6.000217522257097e+000
5.000244425001915e+000
4.999782477742903e+000
4.004354023440857e+000
3.996048201383625e+000
3.043099292578824e+000
2.961058884185726e+000
2.130209219362506e+000
1.789321352695084e+000
9.475343675292924e-001
2.538058170966779e-001
-1.125441522119985e+000
Наибольшие собственные значения различаются только в 15-м знаке, но при этом
не являются кратными; последующие 7 пар собственных значений, хотя и близки,
но различаются более существенно, что следует из анализа рис. 5.7.
358 В. Г. Потемкин. Вычисления в среде MATLAB
Собственные векторы такой матрицы, соответствующие близким, но не кратным
собственным значениям, обладают рядом весьма интересных свойств [96].
Сопутствующие функции’. EIG, GALLERY, PASCAL.
Галерея тестовых матриц
Коллекция тестовых матриц, включенных в систему MATLAB, является составной
частью пакета программ Test Matrix Toolbox. Этот пакет разработан на факультете ма¬
тематики университета г. Манчестера (Великобритания). Его автор Nicholas J. Higham:
подробное описание пакета представлено в документации [54]. Коллекция включает
более 50 тестовых матриц, связанных с решением задач линейной алгебры.
Пакет доступен для копирования с ftp-сервера университета по адресу
ftp://ftp.ma.man.ac.Uk/pub/higham/testmatrix.tar.Z.
Документация по пакету Test Matrix Toolbox размещена на компакт-диске PDF
Documentation системы MATLAB с именем в виде файлов testmatrix.ps и testmatrix.pdf
в каталоге help/pdf_doc/otherdocs/.
Помимо самих тестовых матриц в состав пакета входят 5 программ для визуализа¬
ции матриц и их характеристик. Эти программы позволяют выявить такие свойства
матрицы, которые не просто, а зачастую и невозможно усмотреть, глядя на ее число¬
вой образ. Часто эти программы дают самый простой способ получения весьма инте¬
ресных и познавательных картинок.
Ниже приведено описание программ визуализации, поскольку в систему MATLAB
они не включены, но мы настоятельно рекомендуем скопировать эти модули из пакета
или подключить пакет Test Matrix Toolbox к установленной версии системы.
see I Визуализировать матрицу и ее характеристики
Синтаксис:
see(А)
see(А,1)
see(А,-1)
Описание:
Команда see(A) позволяет отобразить в графическом окне, состоящем из четырех
подокон, следующие графики:
mesh(A)
mesh(pinv(A))
semilogy (svd(A),*-o')
fv(A)
mesh (А) - поверхность, образованная значениями элементов матрицы А;
mesh(pinv(A) ) -поверхность, образованная значениями элементов матрицы,
обратной или псевдообратной А;
semi logy (svd(A)) -график сингулярных чисел матрицы А в полулогарифмиче¬
ском масштабе;
fv(A) - область размещения собственных значений, удовлетворяющая
отношениям Рэлея с указанием собственных значений.
5. Матрицы и линейная алгебра
359
Команда see(A, 1) отображает в третьем подокне аппроксимацию псевдоспектра
вместо сингулярных чисел.
Команда see(A, -1) отображает в четвертом подокне только собственные значения.
Если матрица комплексная, то строится поверхность, соответствующая только ее
действительной части. Если матрица разреженная, то отображается только ее структу-
pa spy(A).
Пример:
Визуализировать матрицу chebspec(8))A3 и ее характеристики.
А = gallery('chebspec1r8);
see(AA3,-l) % рис. 5.8
рис. 5.8
I fу | Построить область расположения собственных значений
Синтаксис:
fv(A,nk,thmax)
[F,E] = fv(A,nk,thmax,1)
Описание:
Оператор fv(A, nk, thmax) вычисляет и строит область расположения собственных
значений для nk ведущих подматриц произвольной комплексной матрицы А. Параметр
thmax задает дискретность разбиения по угловой координате. По умолчанию nk = 1,
thmax =16. При подготовке публикаций рекомендуется устанавливать thmax = 32.
Собственные значения отмечаются на графике знаком 'х*.
360
В. Г. Потемкин. Вычисления в среде MATLAB
Функция [F, Е] = fv(A, nk, thmax, 1) подавляет построение графика и возвращает
область расположения в массиве F, а сами собственные значения в массиве Е.
Пример:
Построить область расположения собственных значений для матрицы grcar порядка 20.
А = gallery(1grcar20);
fv(full(А),1,32) % рис. 5.9
gersh |
Построение кругов Гершгорина
Синтаксис:
gersh(А)
[G,E] = gersh(A,l)
Описание:
Оператор gersh(A) строит круги Гершгорина для произвольной квадратной ком¬
плексной матрицы в соответствии с теоремой Гершгорина, которая утверждает, что
собственные значения матрицы А содержатся в некотором объединении круговых об¬
ластей
ze С:
У=1
Следствием теоремы Гершгорина является утверждение: если к кругов образуют
связную область, которая изолирована от других кругов, то в этой области содержится
точно к собственных значений.
Собственные значения отмечаются на графике знаком 'х'.
Функция [G, Е] = gersh(A, 1) подавляет построение графика и возвращает данные
графика в массиве G, а сами собственные значения в массиве Е.
5. Матрицы и линейная алгебра
361
Пример:
Построить круги Гершгорина для матрицы lesp порядка 20.
А = gallery(1lesp1,20);
gersh(full(А)) % рис. 5.10
-60 -50 -40 -30 -20 -10 0
рис. 5.10
Две оставшиеся графические функции ps и pscont связаны с построением е-
псевдоспектра матрицы A G Слхл, который определяется как множество Ае собствен¬
ных значений возмущенных матриц А + Е для всех матриц Е с ||Е||2 < е.
PS
Точечный график псевдоспектра
Синтаксис:
ps(A,m,tol,rl)
ps(A,m,tol, rl,marksize)
Определение:
Псевдоспектр или, точнее, е-псевдоспектр матрицы А для заданной величины е оп¬
ределяется следующим образом:
Ae(A) = {z:z=X(A + E), ||Е||2<е.
Это множество комплексных собственных значений возмущенной матрицы А+Е,
где норма случайной матрицы возмущений || Е ||2 ограничена величиной е.
Описание:
Оператор ps(A, m, tol, rl) строит приближенный график псевдоспектра для произ¬
вольной квадратной комплексной матрицы А, используя m случайных возмущений ве¬
личины tol. По умолчанию m равно порядку матрицы, a tol равно 1е-3. Параметр rl оп¬
ределяет тип возмущения:
362
В. Г. Потемкин. Вычисления в среде MATLAB
rl
Тип возмущения
0
Комплексное возмущение Е с нормой ||Е||2 = tol, по умолчанию
1
Действительное возмущение Е с нормой ||Е||2 = tol
-1
Покомпонентное действительное возмущение Е величины tol
Собственные значения отмечаются на графике знаком 'х*.
Оператор ps(A, m, tol, rl, marksize) использует указываемый пользователем размер
маркера; если параметр marksize < 0, то прстроение графика подавляется и информа¬
ция о графике возвращается в виде выходного массива.
Оператор ps(A, 0) строит график только собственных значений матрицы.
Пример:
Построить псевдоспектр пятидиагональной матрицы Теплица.
А = gallery('toeppen',32,0,1,0,0,1/4);
ps(full(A)) % рис. 5.11
\
1
» * Ч :
• Ъг * >• ■ ■■
< * V*
\ х • * ***••„
t х :
: х»
.t.jc
•< .♦
/
7* 'i .
гх •
■
■1.5 i i i 1
-1 -0.5 0 0.5 1 1.5
рис. 5.11
pscont
Графики поверхностей и линий уровня псевдоспектра
Синтаксис:
pscont(Az kz npts,ax,levels)
[XzYzZznpts] = pscont(A,...)
Описание:
Оператор pscont(A, k, npts, ax, levels) строит график функции
log 10( l/norm(R(z))),
где R(z) = inv(z*I-A) - резольвента квадратной матрицы А на сетке размера nptsxnpts
[62, 92]. По умолчанию размер сетки равен
npts = round(min(max(5,sqrt(20A2*10A3/nA3)),30))
и зависит от порядка матрицы п.
5. Матрицы и линейная алгебра
363
Параметр к определяет тип графика согласно следующей таблице.
к
Тип графика
0
Палитра цветов и линии уровня, по умолчанию
1
Только линии уровня
2
Трехмерная поверхность и проекции линий уровня
3
Только трехмерная поверхность
4
Только линий уровня
Вектор ах задает пределы изменения аргументов по осям х - (ах(1), ах(2)) и у -
(ах(3), ах(4)). Если этот параметр опущен, границы вычисляются автоматически в за¬
висимости от величин собственных значений матрицы.
Линии уровня определяются вектором levels, который по умолчанию равен -10 : -1,
что соответствует значениям epsilon = 1 е-10,..., le-1.
Функция [X, Y, Z, npts] = pscont(A, ...) подавляет построение графика и возвращает
данные в виде выходных массивов X, Y, Z и числа точек сетки npts.
Пример:
Построить поверхность и линии уровня псевдоспектра пятидиагональной матрицы
Теплица.
А = gallery(*toeppen32,0,1,0,0,1/4);
pscont(full(А),2) % рис. 5.12
рис. 5.12
Наряду с пакетом тестовых матриц Test Matrix Toolbox существуют и другие кол¬
лекции, среди которых следует отметить коллекции разреженных матриц [41], плот¬
ных матриц больших размеров для несимметрической проблемы собственных значе¬
ний [33], а также прямоугольных матриц [101].
364
В. Г. Потемкин. Вычисления в среде MATLAB
GALLERY |
Набор тестовых матриц
Синтаксис:
А = gallery(3)
А = gallery(5)
[outl,out2,...] = gallery(’<имя_матрицы>',PlrP2r ...)
Описание:
Функция A = gallery(3) возвращает матрицу порядка 3 co спектром хорошо отде¬
ленных действительных собственных значений, но имеющую большое число обуслов¬
ленности по отношению к операции обращения:
А = gallery(3)
А =
-149
-50
-154
537
180
546
-27
-9
-25
d = eig(A)
d =
1
2
3
cond(A)
ans = 2.7585е+005
see(А,-1) % рис. 5.13
рис. 5.13
5. Матрицы и линейная алгебра
365
Функция А = gallery(5) возвращает целочисленную тестовую матрицу порядка 5,
имеющую различные, но плохо обусловленные собственные значения:
А = gallery(5)
А =
-9
11
-21
63
-252
70
-69
141
-421
1684
-575
575
-1149
3451
-13801
3 891
-3891
7782
-23345
93365
1024
-1024
2048
-6144
24572
Эта матрица имеет дефект и является нильпотентной с индексом нильпотентности,
равным 5:
г = rank(А)
г = 4
Поскольку ранг матрицы меньше ее порядка, то матрица А должна иметь собст¬
венное значение, равное нулю.
Вычислим собственные значения матрицы с помощью М-функции eig и оценим их
числа обусловленности с помощью М-функции condeig.
eig(A) condeig(A)
-0.040844 2.1293е+010
-0.011876 + 0.038593i 2.0796е+010
-0.011876 - 0.038593i 2.0796е+010
0.032298 + 0.022998i 2.002е+010
0.032298 - 0.022998i 2.002е+010
Из анализа полученных данных следует, что собственные значения имеют очень
большие числа обусловленности, кроме того, среди них нет нулевого значения.
Для разрешения этой проблемы можно обратиться либо к модулю jordan ППП
Symbolic Mathematics Toolbox, если он установлен на вашей системе, либо к пакету
программ JORD [23]. Отличие этих пакетов состоит в том, что ППП Symbolic Mathe¬
matics Toolbox может работать только с матрицами, элементами которых являются це¬
лые или рациональные числа, а ППП JORD работает с матрицами, заданными в ариф¬
метике с плавающей точкой.
Краткое описание ППП JORD приведено в прил. 4. Вызов модуля jord, предназна¬
ченного для анализа структуры клеток Жордана, дает следующие результаты:
Jstr = jord(А,0)
Jstr = 0 0 0 0 0 1
Это означает, что исследуемая матрица состоит из единственной клетки Жордана
порядка 5, которую можно вычислить следующим образом:
[eigval.
Jstr,R,Jord]
= jstruct(А);
Jord
Jord =
0
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
Число обусловлености
задачи
kH(R)=
1|R|1*1|LH
кН = 7.44е+005
366
В. Г. Потемкин. Вычисления в среде MATLAB
Функция [outl, out2, ...] = gallery('<HMH_MaTpHUbi>', Pl, P2, ...) возвращает тестовую
матрицу с именем <имя_матриг/ы> из набора приведенных ниже тестовых матриц.
При вызове, как правило, указывается в качестве входного параметра порядок матри¬
цы, но могут потребоваться и другие параметры. Вы-юв описания той или иной функ¬
ции реализуется с помощью следующей формы оператора help:
help private/'<имя_матрицы>'
Набор включает более 50 матриц, которые могут быть использованы для тестиро¬
вания алгоритмов:
cauchy
dramadah
ipj fact
mini j
randhess
triw
chebspec
fiedler
jordbloc
moler
rando
wathen
chebvand
forsythe
kahan
neumann
randsvd
wilk
chow
frank
kms
orthog
redheff
circul
gearmat
krylov
parter
riemann
clement
grcar
lauchli
pei
ris
compar
hanowa
lehmer
poisson
smoke
condex
house
leslie
prolate
toeppen
cycol
invhess
lesp
randcolu
toeppd
dorr
in vol
lotkin
randcorr
tridiag
Эти матрицы обладают рядом специальных свойств, описанных в работе [54]. Для
удобства работы мы приводим их в виде следующей таблицы, столбцы которой имеют
такие значения:
• свойство Inverse означает, что для данной матрицы известна ее обратная матрица;
• свойство Ill-cond означает, что данная матрица плохо обусловлена по отношению
к операции обращения;
• свойство Rank означает, что данная матрица имеет дефект;
• свойство Symm означает, что данная матрица является симметрической;
• свойство Pos Def означает, что данная матрица является положительно определенной;
• свойство Orth означает, что данная матрица является ортогональной;
• свойство Eig означает, что имеется информация о спектре данной матрицы и/или ее
сингулярных числах.
Матрица
Inverse
Ill-cond
Rank
Symm
Pos Def
Orth
Eig
cauchy
J
Y
J
J
chebspec
J
s
chebvand
J
J
chow
J
J
circul
J
J
J
clement
J
V
J
J
condex
7
cycol
V
dorr
J
dramadah
J
fiedler
S
J
J
forsythe
7
V
frank
7
Y
gearmat
7
grcar
5. Матрицы и линейная алгебра
367
Матрица
Inverse
lU-cond
Rank
Symm
Pos Def
Orth
Eig
hanowa
invhess
in vol
ipj fact
jordbloc
J
7
J
Y
J
J
J
J
J
J
z
s
V
•/
J
kahan
J
7
S
kms
■/
Z
krylov
S
lauchli
lehmer
J
Z
lesp
7
lotkin
7
7
J
mini j
S
Z
7
moler
Y
Y
J
Z
neumann
J
7
orthog
parter
J
pei
J
7
J
Z
J
poisson
7
J
z
Y
prolate
7
7
z
■/
randsvd
J
J
Y
z
J
redheff
7
riemann
J
smoke
J
tridiag
J
S
J
J
z
J
triw
wathen
wilk
J
J
7
J
•/
z
z
Y
7
Напомним ряд определений, применяемых для классификации матриц [3, 54]:
• матрица называется нормальной, если выполняется условие АНА = ААН, в этом
случае матрица А приводима к диагональной форме с помощью унитарных
преобразований;
• ’ матрица называется унитарной, если она нормальная и выполняется условие
АНА = ААН = I, где I - единичная матрица;
• матрица называется нильпотентной, если выполняется условие Ак = 0 для некото¬
рого значения к;
• матрица называется инволютивной, если выполняется условие А2 = I, где I - еди¬
ничная матрица;
• матрица называется идемпотентной, если выполняется условие А2 = А;
• матрица называется ганкелевой, если ее элементы на каждой антидиагонали
одинаковые;
• матрица называется теплицевой, если ее элементы на каждой диагонали одинаковые;
• матрица называется хессенберговой, если это треугольная матрица с дополнитель¬
ной диагональю.
368
В. Г. Потемкин. Вычисления в среде MATLAB
Среди матриц, приведенных в таблице, следует выделить принадлежность к сле¬
дующим типам:
• к числу нормальных матриц относится circul;
• к числу матриц с дефектом относятся: chebspec, gallery(5), gearmat, jordblock, triw;
• к числу инволютивных матриц относятся: invol, orthog, pascal;
• к числу идемпотентных матриц относится in vol;
• к числу ганкелевых матриц относятся: hilb, ipjfact;
• к числу хессенберговых матриц относятся: chow, frank, grcar, randsvd.
cauchy ]
Синтаксис:
С = gallery ('cauchyx, у)
С = gallery(’cauchy \ x)
Матрица Коши
Описание:
Функция С = galleryfcauchy’, х, у) возвращает матрицу Коши размера пхп, элемен-
ты которой равны
C(i,j) = ,
х(0+у(Л
где х и у векторы длины п. Если указаны в качестве х и у скаляры, то они интерпрети¬
руются как векторы 1 :х и 1 :у.
Функция С = gallery('cauchy', х) возвращает матрицу Коши размера пхп, элементы
которой равны
Известны точные выражения для обратной матрицы и определителя матрицы Ко¬
ши. Определитель det(C) не равен нулю, если векторы х и у различны.
Матрица Коши является положительно определенной, если элементы векторов х
и у упорядочены следующим образом: 0 < х( 1) < ... < х(п), 0 < у(1) < ... < у(п).
Сформируем и построим характеристики матрицы Коши порядка 5, используя
в качестве входа целочисленный вектор х = 1:5.
С = gallery (’cauchy5), d = eig(C)
С =
1/2
1/3
1/4
1/5
1/6
1/3
1/4
1/5
1/6
1/7
1/4
1/5
1/6
1/7
1/8
1/5
1/6
1/7
1/8
1/9
1/6
1/7
1/8
1/9
1/10
5. Матрицы и линейная алгебра
369
d
1/1453710
5/67443
221/65821
301/3658
1491/1412
see(C,-l) % рис. 5.14
Эта матрица невырожденна, но имеет близкие к нулю собственные значения. По¬
этому она плохо обусловлена по отношению к операции обращения и имеет малые
сингулярные числа. Матрицы Коши близки по своим свойствам к матрицам Гильберта.
chebspec
Матрица Чебышева
Синтаксис:
С = gallery(’chebspecп,к)
Описание:
Функция С = gallery('chebspec', п, к) возвращает матрицу Чебышева спектрального
дифференцирования размера пхп. Параметр к может принимать значения 0 или 1;
по умолчанию 0.
Для значения к = 0 матрица С нильпотентна с индексом нильпотентности п, всегда
имеет собственный вектор вида ones(n, 1) и приводится преобразованием подобия
к единственному блоку Жордана с нулевым собственным значением:
С = gallery(1chebspec1,8);
see(Cz-l) % рис. 5.15
370
В. Г. Потемкин. Вычисления в среде MATLAB
eig(C)
008
0.06
004
0.02
0
-0.02
-О 04
-0.06
г
1 :
к
к i
*
f
*
\ j
к-
<?Г'1’
i
1 -0.05 0 0.05 01
Для значения к = 1 матрица С невырожденна, хорошо обусловлена, собственные
значения имеют отрицательные действительные части:
С = gallery('chebspec8,1);
see(C,-l) % рис. 5.16
рис. 5.16
5. Матрицы и линейная алгебра
371
chebvand | Матрица Вандермонда для полиномов Чебышева
Синтаксис:
С = gallery('chebvand',р)
С = gallery('chebvand',m,р)
Описание:
Функция С = gallery(’chebvand', р) возвращает матрицу Вандермонда для полино¬
мов Чебышева, заданных на точках, определяемых вектором р.
Функция С = galleryfchebvand', m, р) возвращает прямоугольную матрицу с ш
строками.
Если р вектор, то
С(Л j) = 7]_1(p(j)),
где - полином Чебышева степени i-1.
Если в качестве р указан скаляр, то он интерпретируется как вектор р равноудален¬
ных точек на интервале [0, 1] и используется для вычисления матрицы С.
Сформируем и построим характеристики матрицы Вандермонда для полиномов
Чебышева с параметром р, равным 8.
С = gallery('chebvand1,8);
see(С) % рис. 5.17
рис. 5.17
372
В. Г. Потемкин. Вычисления в среде MATLAB
chow I Сингулярная матрица Теплица в нижней форме Хессенберга
Синтаксис:
С = gallery('chown,alpha,delta)
Описание:
Функция С = gallery(’chow’, n, alpha, delta) возвращает сингулярную матрицу Теп¬
лица С в нижней форме Хессенберга порядка п:
С = H(alpha) + delta*eye(n),
где элементы матрицы Н удовлетворяют соотношению
Н.у(а) = а,";+1.
Параметры alpha и delta скаляры; по умолчанию они равны соответственно 1 и 0.
Матрица Н имеет следующий спектр собственных значений:
4acos^—, k = l:n — р, р = floor(n/2)-,
0, k =п-р + 1:п.
Количество нулевых собственных значений этой матрицы равно р = floor(n/2).
Исследуем сингулярную матрицу Теплица порядка 10.
С = gallery('chow',10); р = floor(length(С)/2)
p = 5 % Количество нулевых собственных значений
Сопоставим точные решения и решения, вычисленные с помощью процедуры eig.
Точные решения
eig (С)
0
1.1102е-016
0
-0.00011169
0
0.0001117
0
-6.1492е-009 + 0.000111691
о •
-б5.1492е-009 - 0.000111691
3.7321
3.7321
3
3
2
2
1
1
0.26795
0.26795
Как следует из этого сравнения, нулевые значения вычисляются с очень низкой
точностью (Ю-4); ненулевые значения вычисляются точно.
Применим для выявления структуры клеток Жордана ППП JORD:
Jstr = jord(C,0)
Jstr = 0 0 0 0 0 1
Матрица Теплица имеет клетку Жордана порядка 5. Для вычисления спектральной
структуры применим М-функцию; протокол работы этой функции имеет следующий
вид:
5. Матрицы и линейная алгебра
373
[eigval,Jstr,R,Jord] = jstruct(C);
jkO = 0 0 0 0 0 1
Собственные значения
ans =
3.732050807568870e+000
3.000000000000005e+000
2.000000000000000e+000
9.999999999999998e-001
2.679491924311337e-001
-4.822847340193695e-004
-1.493462671147447e-004
-1.493456503286722e-004
3.904885132691797e-004
3.904881381826641e-004
+8.826935389013432e-017i
-1.294917039613942e-016i
+4.450409889219872e-017i
-1.368657312351092e-017i
-1.723380553091905e-015i
+3.205377599651697e-010i
-4.587 80685493 007 5e-004i.
+4.587808879894922e-004i
+2.83 9096234009799e-004i
-2.83 9101464334976e-004i
Кластеры близких собственных значений
порог близости
threshold = 0.0010
INI = 0 5
Матрица эквивалентных возмущений
epsA=A-R*Jordt*LH с нормой
Е = 1.9614е-010
Число обусловленности задачи K(R)=||r||*||LH||
К = 145174.36
Норма невязки ||г||=||A*R-R*J||
г = 6.3027е-013
Структура клеток Жордана
Jstr =00
eigval =
0
0
5.0000
3.7321 - 0.0000i
1.0000
3.0000 + O.OOOOi
1.0000
2.0000 - O.OOOOi
1.0000
1.0000 - O.OOOOi
1.0000
0.2679 - O.OOOOi
1.0000
d = diag(Jord)
d =
0
0
0
0
0
3.7321
3.0000
2.0000
1.0000
0.2679
Для правильной оценки характеристик матрицы Теплица визуализируем ее клетку
Жордана.
see(Jord) % рис. 5.18
374
В. Г. Потемкин. Вычисления в среде MATLAB
рис. 5.18
Из анализа характеристик следует, что матрица Теплица имеет дефект, равный 1,
поскольку в окне результатов svd-разложения отмечено только 9 сингулярных чисел
и график помечен как Zero(s) omitted (Нуль(и) опущен); 5 действительных собствен¬
ных значений хорошо отделены от нулевого значения кратности 5. При анализе этой
матрицы заслуживает внимания ее псевдоспектр:
ps(Jord) % рис. 5.19
5. Матрицы и линейная алгебра
375
Из анализа границ псевдоспектра следует, что при возмущениях величиной 10J
разброс действительной и мнимой частей для нулевых собственных значений достига¬
ет величины 0.2, и это приводит к пересечению псевдоспектров.
circul
Циркулянтная матрица
Синтаксис:
С = gallery (' circul' , v)
Описание:
Функция С = galleryCcircul', v) возвращает циркулянтную матрицу С, первая строка
совпадает с вектором v. Каждая следующая строка получена циклической перестанов¬
кой элементов первой строки.
Если в качестве v указан скаляр к, то он интерпретируется как вектор,
т. е. С = galleryCcircul', 1 :k).
Для циркулянтной матрицы порядка п система собственных значений и собствен¬
ных векторов известна точно.
Если t - корень n-й степени из 1, то собственное значение циркулянтной матрицы
определяется как скалярное произведение векторов v и w = [1 112... tn l], а собственный
вектор для соответствующего собственного значения равен wH.
Рассмотрим пример циркулянтной матрицы порядка 5.
С = gallery(’circul5)
С =
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
[R,D] =
d =
eig(C);
d =
diag(D)
5
4
3
2
1
15
2.5 +
2.5 -
2.5 +
2.5 -
3.441i
3.441i
0.8123i
0.8123i
Нормируем матрицу собственных векторов:
for i = l:3
RN(:,i)=R(:,i)/R(1,i);
end
RN
RN =
11 1 1 1
1 0.30902-0.95106i 0.30902 + 0.95106i -0.80902-0.58779i -0.80902 + 0.58779i
1 -0.80902-0.58779i -0.80902+0.58779i 0.30902+0.95106i 0.30902-0.95106i
1 -0.80902+0.58779i -0.80902-0.58779i 0.30902-0.95106i 0.30902+0.95106i
1 0.30902+0.95106i 0.30902-0.95106i -0.80902+0.58779i -0.80902-0.58779i
376
В. Г. Потемкин. Вычисления в среде MATLAB
Нормированные собственные векторы совпадают с векторами wn. Проверим соот¬
ношение между собственными векторами и собственными значениями:
lambda = esort((v*RN)1)
lambda =
15
-2.5 +
-2.5 -
-2.5 +
-2.5 -
3.441i
3.441i
0.8123i
0.8123i
Это соотношение действительно выполняется.
Вычислим и построим характеристики циркулянтной матрицы:
see(C) % рис. 5.20
рис. 5.20
clement
Трехдиагональная матрица с нулевой диагональю
Синтаксис:
С = gallery('clement' ,n,sym)
Описание:
Функция С = galleryfclement’, n, sym) возвращает трехдиагональную матрицу С по¬
рядка п с нулями на диагонали и известными собственными значениями. Входной па¬
раметр sym определяет, является ли матрица Клемента симметрической; по умолча-
5. Матрицы и линейная алгебра
377
нию sym равно 0, что соответствует несимметрической матрице; для значения sym,
равного 1, матрица Клемента симметрическая.
Собственные значения для четных п принадлежат последовательности {п-1, п-3, п-5 ...)
со знаками плюс и минус; для нечетных п добавляется собственное значение 0 или 1.
Матрица С вырожденна, если п нечетно; для невырожденной матрицы ее обратная
имеет около 64 % нулевых элементов.
Рассмотрим матрицу Клемента четного порядка, равного 16.
С = gallery(1 clement1,16); lambda = eig(C)
lambda =
±15
±13
±11
± 9
± 7
± 3
± 1
see(C) % рис. 5.21
c
Рассмотрим матрицу Клемента нечетного порядка, равного 15.
С ■ gallery(’clement1,15); lambda в esort(eig(С)'
lambda =
±14
±12
378
В. Г. Потемкин. Вычисления в среде MATLAB
±10
± 8
± 6
± 4
± 2
2.8487е-015
see(С) % рис. 5.22
compar ]
pinv(C)
рис. 5.22
Матрицы сравнения
Синтаксис:
С = gallery('comparА)
С = gallery('comparА,1)
Описание:
Функции С = gallery(’compar', А) и С = gallery(’compar', А, 0) возвращают матрицу
С = diag(B) - tril(B,-l) - triu(B, 1),
где В = abs(A).
Функция С = gallery('compar’, А, 1) возвращает матрицу С следующего вида:
f abs(A(z, f), i = г,
C(fJ) =
]-max(A(f,:)), i * j.
5. Матрицы и линейная алгебра
379
Диагональные элементы этой матрицы равны абсолютным значениям диагональ¬
ных элементов матрицы А, а внедиагональные элементы - заменяются максимальным
по модулю значением элемента строки со знаком минус. Треугольные матрицы сохра¬
няют свою структуру без изменения.
Сформируем в качестве базовой матрицу спектрального дифференцирования Че¬
бышева порядка 4:
А = gallery(1chebspec’,4), г = rank(А)
А =
3.1667
-4.0000
1.3333
-0.5000
1.0000
-0.3333
-1.0000
0.3333
-0.3333
1.0000
0.3333
-1.0000
0.5000
-1.3333
4.0000
-3.1667
г = 3
see(А) % рис. 5.23, а
Это вырожденная матрица с дефектом, равным 1.
Построим для матрицы Чебышева матрицу сравнения первого типа.
С = gallery(’compar',А), г = rank(С)
С =
3.1667
-4.0000
-1.3333
-0.5000
-1.0000
0.3333
-1.0000
-0.3333
-0.3333
-1.0000
0.3333
-1.0000
-0.5000
-1.3333
-4.0000
3.1667
г = 4
see(С) % рис. 5.23,6
Эта матрица имеет полный ранг и 4 действительных собственных значения.
Построим для матрицы Чебышева матрицу сравнения первого типа:
С = gallery('comparА,1), г = rank(С)
С =
3.1667
-4.0000
-4.0000
-4.0000
-1.0000
0.3333
-1.0000
-1.0000
-1.0000
-1.0000
0.3333
-1.0000
-4.0000
-4.0000
-4.0000
3.1667
г = 4
see(С) % рис. 5.23,в
Эта матрица имеет полный ранг и 4 хорошо отделенных действительных собствен¬
ных значения.
380
В. Г. Потемкин. Вычисления в среде MATLAB
’s V %
рис. 5.23
5. Матрицы и линейная алгебра
381
condex
Примеры матриц при оценке числа обусловленности
Синтаксис:
С = gallery(’condex’rn,k,theta)
Описание:
Функция С = gallery(’condex', n, k, theta) возвращает для различных значений пара¬
метра к следующие примеры матриц, связанные с оценкой чисел обусловленности
различными алгоритмами:
к
п
Алгоритм оценки
1
4
UNPACK (rcond)
2
3
UNPACK (rcond)
3
любое
UNPACK (rcond)
4
>4
SONEST (Higham 1988)
Если назначен порядок матрицы выше рекомендуемого, то матрица расширяется
до требуемого порядка единичной матрицей, и в этом случае числа обусловленности
не изменяются; если указан меньший порядок, то формируется требуемая матрица.
Рассмотрим примеры оценки чисел обусловленности для некоторых матриц.
С = gallery('condex1,4,1)
С =
1 -1 -200
0
1 100 -100
0
1 101 -101
о о
0 100
l/rcond( C)
cond(C)
conde st(C)
40100
53057
80601
Поскольку алгоритмы дают оценку верхней грани - supremum - числа обусловлен¬
ности, то наилучшим является алгоритм, вычисляющий минимальное значение; таким
для данной матрицы является алгоритм rcond.
С = gallery(1condex3,2)
C =
1
0.9998
-2
0
0.01
-0.01
0
0
1
l/rcond(C)
cond( C)
conde st( C)
601.9
366.1
601.9
Для этого класса матриц наилучшая оценка верхней грани числа обусловленности
определяется алгоритмом cond.
382
В. Г. Потемкин. Вычисления в среде MATLAB
С = gallery('condex',4,3)
п
l/rcond(C)
cond( С)
condest(C)
4
32
12.4
32
10
5120
1918.5
5120
Для этого класса матриц наилучшая оценка верхней грани числа обусловленности
определяется алгоритмом cond.
С = gallery('condex',4,4)
С =
1.0000
0.0000
0
0.0000
59.7379
-10.6796
0
-10.6796
2.9417
0.0000
-48.0583
8.7379
0.0000
-48.0583
8.7379
40.3204
п
l/rcond(C)
cond(C)
condest(C)
4
139.0
101
139.0
10
215
101
215
40
275.6
101
275.6
Для этого класса матриц наилучшая оценка, верхней грани числа обусловленности
определяется алгоритмом cond, причем этот алгоритм дает одинаковую оценку, кото¬
рая не зависит от порядка матрицы.
сусо! | Матрица с периодически повторяющимися столбцами
Синтаксис:
С = gallery(’cycolп,к)
С = gallery(’cycol',[m n],к)
Описание:
Функция С = gallery('cycor, п, к) возвращает матрицу порядка п с периодически по¬
вторяющимися столбцами; период повторения задается параметром к (по умолчанию
к= round(n/4). Повторяющиеся столбцы формируются как массив случайных чисел
randn(m, к). Ранг такой матрицы не превышает значения к.
С = gallery('cycol',12);
see(C) % рис. 5.24
5. Матрицы и линейная алгебра
383
рис. 5.24
Функция С = gallery(’cycol’, [m n], к) возвращает прямоугольную матрицу порядка
тхп с периодически повторяющимися столбцами.
С = gallery('cycol*,[4 12]);
see(C) % рис. 5.25
рис. 5.25
384
В. Г. Потемкин. Вычисления в среде MATLAB
dorr ~|
Матрица Дорра
Синтаксис:
D = gallery('dorrn,theta)
[c,d,e] = gallery('dorr',n,theta)
Описание:
Функция D = gallery(’dorr', n, theta) возвращает разреженную плохо обусловленную
трехдиагональную матрицу порядка п с диагонально преобладающими элементами.
Число обусловленности зависит от параметра theta; для малых неотрицательных зна¬
чений theta матрица Дорра плохо обусловлена (по умолчанию theta = 0.01).
Функция [с, d, е] = gallery('dorr', n, theta) возвращает диагонали матрицы Дорра. Для
формирования самой матрицы Дорра надо использовать оператор D = gallery('tridiag’,
с, d, е).
D = gallery(’dorr’r10);
see(full(D)) % рис. 5.26
dramadah]
Антиадамаровы матрицы
Синтаксис:
D = gallery(1dramadah’,n,k)
Описание:
Функция D = galleryfdramadah', n, k) возвращает матрицу порядка n из нулей и
единиц, которая имеет достаточно большое значение параметра mu(D) = norm(inv(D),
5. Матрицы и линейная алгебра
385
13 т. Зак. 3375
'fro’), хотя и необязательно максимальное. Матрица называется антиадамаровой, если
значение параметра mu(D) максимально. Параметр к определяет тип формируемой
матрицы.
Случай к = 1 (по умолчанию). В этом случае D - матрица Теплица порядка п со сле¬
дующими характеристиками:
• абсолютное значение определителя abs(det(D)) равно 1;
• параметр mu(D) > 0.43*(1.75)Лп.
Визуализируем матрицу и ее характеристики.
D = gallery(’dramadah',10,1); mu = norm(inv(D)fro')
mu = 109.65
see(D) % рис. 5.27
рис. 5.27
Случай k = 2. В этом случае D - верхняя треугольная матрица Теплица с кратными
собственными значениями, равными 1.
D = gallery('dramadah10,2); mu = norm(inv(D),'fro'),Jstr = jord(D,l)
mu = 55.09
Jstr =10000000001
see (D) % рис . 5.28
386
В. Г. Потемкин. Вычисления в среде MATLAB
Матрица D - I нильпотентна с показателем нильпотентности, равным 10. Степени
этой матрицы позволяют сформировать различные структуры клеток Жордана. На¬
пример, третья степень этой матрицы имеет одну клетку Жордана порядка 4 и две
клетки Жордана порядка 3:
Jstr = jord((D-eye(size(D)))A3Z0)
Jstr =0 0 0 2 1
Случай k = 3. В этом случае D- матрица Теплица порядка п, определитель которой
максимален среди всех матриц в нижней форме Хессенберга и равен n-му члену по¬
следовательности чисел Фибоначчи. Определенный интерес может представить рас¬
пределение собственных значений:
D = gallery('dramadah10/3);
mu = norm(inv(D),'fго')z detD = det(D)
mu = 2.4421
detD = 55
Это 10-й член последовательности Фибоначчи un + un+i = un+2, (u0= 0, Ui = 1, n = 0, 1,
2...).
see(D) % рис. 5.29
5. Матрицы и линейная алгебра
387
рис. 5.29
fiedler | Матрица Фидлера
Синтаксис:
F = gallery('fiedlerс)
Описание:
Функция F = gallery('fiedler’, с), где с - вектор длины п, возвращает симметриче¬
скую матрицу порядка п с элементами abs(c(i) - c(j)). Если в качестве с указан скаляр к,
то он интерпретируется как вектор 1 :к.
Обратная матрица является трехдиагональной с дополнительными элементами
в позициях (1, п) и (n, 1). Матрица Фидлера имеет преобладающее положительное соб¬
ственное значение, а остальные собственные значения отрицательны.
Точные соотношения для inv(A) и det(A) найдены Фидлером и приведены в книге [91].
F = gallery('
' fiedler1
,10),
detF
= det(F)
, d
= esort(eig(F))
F =
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
2
1
0
1
2
3
4
5
6
7
3
2
1
0
1
2
. 3
4
5
6
4
3
2
1
0
1
2
3
4
5
5
4
3
2
1
0
1
2
3
4
6
5
4
3
2
1
0
1
2
3
7
6
5
4
3
2
1
0
1
2
388
В. Г. Потемкин. Вычисления в среде MATLAB
8 7
9 8
6
7
5
6
4
5
3
4
2
3
1
2
0
1
1
0
detF
= -2304
d =
34.3429
-0
.5125
-0
.5540
-0
.6298
-0
.7722
-1
.0000
-1
.5053
-2
.4259
-6
.5114
-20
.4317
see(F
,-1) % рис.
5.30
рис. 5.30
forsythe ~|
Матрица Форсайта
Синтаксис:
F = gallery('forsythen,alpha,lambda)
Описание:
Функция F = galleryfforsythe’, n, alpha, lambda) возвращает матрицу порядка n, со¬
ставленную из клетки Жордана с собственным значением lambda и дополнительным
элементом F(n, 1) = alpha. По умолчанию значения alpha и lambda равны sqrt(eps)
и 0 соответственно.
5. Матрицы и линейная алгебра
389
Характеристический полином матрицы Форсайта равен
det(F-s*I) = (lambda-s)An - alpha*(-l)An.
Примеры:
F = gallery(1 forsythe1#10);
eig(F)
ans =
-0,16494
-0.13344
+ 0
.096948i
-0.13344
0
.096948i
-0.050969
+
0.15687i
-0.050969
-
0.15687i
0.050969
+
0.15687i
0.050969
-
0.15687i
0.16494
0.13344
+ 0
.096948i
0.13344
0
.096948i
see(F) % рис.
5.31
рис. 5.31
frank I Матрица Франка
Синтаксис:
F = gallery(’frankn,k)
390
В. Г. Потемкин. Вычисления в среде MATLAB
Описание:
Функция F = gallery(’frank', n, к) возвращает матрицу Франка порядка п. Это матри¬
ца в верхней форме Хессенберга с определителем, равным 1. Параметр к по умолча¬
нию равен 0; при к = 1 элементы матрицы отражены относительно антидиагонали.
Собственные значения этой матрицы могут быть выражены через нули полиномов
Эрмита соответствующего порядка; все они положительны и образуют пары взаимно¬
обратных чисел. Если порядок матрицы нечетный, то одно из собственных значений
равно 1.
Матрица Франка имеет floor(n/2) плохо обусловленных собственных значений: при
к = 0 это минимальные собственные значения; при к = 1 это максимальные собствен¬
ные значения.
Случай к = 0.
F = gallery(1 frank1z7)
F
condeig(F)
7
6
5 •
4
3
2
1
16.003
1.4837
6
6
5
4
3
2
1
7.4676
1.5761
0
5
5
4
3
2
1
2.9992
1.5879
0
0
4
4
3
2
1
1
11.163
0
0
0
3
3
2
1
0.062487
252.66
0
0
0
0
2
2
1
0.13391
362.98
0
0
0
0
0
1
1
0.33342
120.99
see(F) % рис. 5.32
рис. 5.32
5. Матрицы и линейная алгебра
391
Случай к = 1.
F = gallery('frank7,1)
F
eig(F)
condeig(F)
1
1
1
1
1
1
1
16.003
362.98
1
2
2
2
2
2
2
7.4676
252.66
0
2
3
3
3
3
3
2.9992
120.99
0
0
3
4
4
4
4
1
11.163
0
0
0
4
5
5
5
0.33342
1.5879
0
0
0
0
5
6
6
0.13391
1.5761
0
0
0
0
0
6
7
0.062487
1.4837
Сравнение вышеприведенных таблиц действительно подтверждает, что обе матри¬
цы Франка имеют одинаковый спектр собственных значений, но для матриц Франка
при к = 0 плохо обусловленными являются минимальные, а при к = 1 - максимальные
собственные значения.
Gearmat ] Матрица Гира
Синтаксис:
G = gallery('gearmatn,i,j)
Описание:
Функция G = gallery(’gearmat’, n, i, j) возвращает матрицу Гира порядка п с едини¬
цами на первой поддиагонали и первой наддиагонали, также с элементом sign(i) в по¬
зиции (1, abs(i)) и элементом signfj) в позиции (п, n+1-absQ)); остальные элементы мат¬
рицы равны нулю. По умолчанию i = n, a j = -п.
Матрица Гира вырожденна, может иметь собственные значения кратности 2 или 3
и быть) неполного ранга.
Собственные значения и собственные векторы этой матрицы известны и равны
\k = 2cos(aJ;
rk = [sin( w + ак); sin(w + 2ак);... sin( w + пак)].
Значения параметров ак и w приведены в работе [45].
Проанализируем матрицу Гира восьмого порядка.
G = gallery('gearmat1,8), eig(G), condeig(G)
G
eig(G)
conde ig(G)
0
i
0
0
0
0
0
1
1.8478
1.0824
1
0
1
0
0
0
0
0
1.4142
1.4142
0
1
0
1
0
0
0
0
0.76537
2.6131
0
0
1
0
1
0
0
0
3.254e-009
9.2656e+007
0
0
0
1
0
1
0 •
0
-3.254e-009
9.2656e+007
0
0
0
0
1
0
1
0
-0.76537
2.6131
0
0
0
0
0
1
0
1
-1.4142
1.4142
-1
0
0
0
0
0
1
0
-1.8478
1.0824
Собственные значения, близкие к нулю, очень плохо обусловлены.
392
В. Г. Потемкин. Вычисления в среде MATLAB
Определим структуру клеток Жордана для нулевого собственного значения матри¬
цы Гира порядка 8.
Jstr = jord(G,0)
Jstr =0 0 1
Матрица Жордана для данной матрицы Гира имеет одну клетку Жордана поряд¬
ка 2, остальные собственные значения различны и хорошо отделены:
Jord
Jord =
0
1.0000
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
-1.8478
0
0
0
0
0
0
0
0
-1.4142
0
0
0
0
0
0
0
0
1.8478
0
0
0
0
0
' 0
0
0
1.4142
0
0
0
0
0
0
0
0
0.7654
0
0
0
0
0
0
0
0
-0.7654
Визуализируем матрицу Гира и ее характеристики:
see(G) % рис. 5.33
рис. 5.33
grcar I Матрица Теплица с чувствительными собственными значениями
Синтаксис:
G = gallery('grcarп,к)
5. Матрицы и линейная алгебра
393
Описание:
Функция G = gallery('grcar’, n, к) возвращает матрицу Теплица порядка п с едини¬
цами на главной диагонали и к наддиагоналях, а также со значениями -1 на первой
поддиагонали. Значение к по умолчанию равно 3. Эти матрицы имеют весьма харак¬
терные спектры собственных значений.
G = gallery(’дгсаг*,11);
see(G) % рис. 5.34
рис. 5.34
hanowa ~|
Матрица с собственными значениями с постоянной
действительной частью
Синтаксис:
Н = gallery('hanowa'zn,d)
Описание:
Функция H = gallery('hanowa', n, d) возвращает матрицу порядка п, где n - четное
число.
Такая матрица может быть представлена в блочном виде:
Н =
d еуе(1: т)
diag(l: т)
-diag(l: т)
d еуе(1: т)
Матрица имеет комплексные собственные значения
\k = d + ik, к = 1, ..., т.
394
В. Г. Потемкин. Вычисления в среде MATLAB
По умолчанию d равно -1.
Н = gallery(’hanowa6), d = eig(H)
н =
-1
0
0
-1
0
0
0
-1
0
0
-2
0
0
0
-1
0
0
-3
1
0
0
-1
0
0
0
2
0
0
-1
0
0
0
3
0
0
-1
d =
-1
+
li
-1
-
li
-1
+
3i
-1
-
3i
-1
+
2i
-1
-
2i
see(H,-1)
% рис.
5.35
рис. 5.35
house I Матрица Хаусхолдера
Синтаксис:
[v,beta] = gallery('house',x)
5. Матрицы и линейная алгебра
395
Описание: .
Функция [v, beta] = galleryfhouse’, x) для заданного вектора-столбца х длиной п
возвращает вектор v и скаляр beta, такие, что матрица
Н = eye(n,) - beta*v*v'
является матрицей Хаусхолдера, для которой выполняется соотношение
Н*х = -sign(x(l))*norm(x)*el, el = [1 0 0 ...]'.
Заметим, что для комплексного числа z знак определяется соотношением
sign(z) = exp(i*angle(z)),
что совпадает со значением z./abs(z), если z не равно нулю.
Если х = 0, то v = 0 и beta = 1.
Сформируем параметры v и beta, а затем и матрицу Хаусхолдера порядка 5.
[v,beta] = gallery(■house1,(1:5)1)
v =
8.41.62
2.0000
3.0000
4.0000
5.0000
beta = 0.0160
H = eye(5) - beta*v*v'
H =
-0.1348
-0.2697
-0.4045
-0.5394
-0.6742
-0.2697
0.9359
-0.0961
-0.1282
-0.1602
-0.4045
-0.0961
0.8558
-0.1923
-0.2403
-0.5394
-0.1282
-0.1923
0.7437
-0.3204
-0.6742
-0.1602
-0.2403
-0.3204
0.5995
Вычислим структуру спектра матрицы Хаусхолдера.
Jstr, Jord
[eigval,Jstr,R,Jord] =
jstruct(H)
; eigval,
eigval =
1
4
-1
1
Jstr =
1
4
Jord =
1.0000
0
0
0
0
0
1.0000
0
0
0
0
0
1.0000
0
0
0
0
0
1.0000
0
0
0
0
0
-1.0000
Эта матрица имеет 4 собственных значения, равных 1, и одно собственное значе¬
ние, равное -1.
see(H) % рис. 5.36
396
В. Г. Потемкин. Вычисления в среде MATLAB
Invhess ~|
рис. 5.36
Обратная к матрице в верхней форме Хессенберга
Синтаксис:
I = gallery ('invhessх,у)
Описание:
Функция I = galleryfinvhess', х, у), где х и у - произвольные векторы-строки длины
п и п-1 соответственно, формирует матрицу, обратную матрице в верхней форме Хес¬
сенберга. Если х скаляр, равный к, то он интерпретируется как вектор 1 : к, в этом слу¬
чае вектор у полагается равным -х(1 : n -1).
Формируемая матрица будет невырожденной, если выполняются условия: х(1) = О
и x(i+l) = y(i) для всех i. При этом ей обратная является матрицей в верхней форме
Хессенберга.
Сформируем 2 случайные вектор-строки х и у с числом элементов 5 и 4 соответст¬
венно, вычислим матрицу I и ей обратную Н.
х = randn(1,5); у = randn(1,4);
I = gallery(
т —
1invhess•,х,у), Н
= inv(I)
± —
-0.43256
1.1909
1.1909
1.1909
1.1909
-0.43256
-1.6656
1.1892
1.1892
1.1892
-0.43256
-1.6656
0.12533
-0.037633
-0.037633
-0.43256
-1.6656
0.12533
0.28768
0.32729
-0.43256
-1.6656
0.12533
0.28768
-1.1465
5. Матрицы и линейная алгебра
397
I
-0.6755
-1.9514
-1.9514
-1.9514
-1.9514
-0.6755
2.7868
-0.3174
-0.3174
-0.3174
-0.6755
2.7868
-0.0168
0.5883
0.5883
-0.6755
2.7868
-0.0168
0.2717
0.8290
-0.6755
2.7868
-0.0168
0.2717
-0.9141
-0.8707
5.6868
5.7357
-8.1850
-3.8472
-0.2111
1.3583
1.0451
-1.4913
-0.7010
0.0000
-3.3268
-6.1882
6.4726
3.0424
-0.0000
-0.0000
• 3.1577
-2.7218
-0.4360
0
0
0
0.5737
-0.5737
Последняя действительно является матрицей в верхней форме Хессенберга.
see(I) % рис. 5.37
рис. 5.37
invol
Инволютивная матрица
Синтаксис:
I = gallery ('involп)
Описание:
Функция I = gallery('invor, п) возвращает матрицу порядка п, которая удовлетворяет
свойству инволютивности 1*1 = еуе(п)) и является плохо обусловленной. Матрица име¬
ет собственные значения, равные 1 и -1, которые являются кратными.
398
В. Г. Потемкин. Вычисления в среде MATLAB
Матрицы А = (еуе(п) -1)/2 и А = (еуе(п) + 1)/2 удовлетворяет свойству идемпотент¬
ности А*А = А.
Проанализируем инволютивную матрицу порядка 7.
I = gallery(1 invol1,7); k = condest(I)
k = 1.9247e+010
Эта матрица плохо обусловлена по отношению к операции обращения. Ее спектр
содержит кратные собственные значения:
[eigval,Jstr,R,Jord] = jstruct(I);
Кластеры близких собственных значений
порог близости
threshold = 0.0001
INI =
-1 4
1 3
Матрица эквивалентных возмущений
epsA=A-R*Jordt*LH с нормой
Е = 2.6385е-005
Число обусловленности задачи kH(R)=||r||*||LH||
кН = 90033.41
Норма невязки | I г| | = | |A*R-R*J| |
г = 3.5320е-010
Структура клеток Жордана
Jstr =
-1.0000 4.0000
1.0000 3.0000
Жорданова форма этой матрицы имеет следующий вид:
Jord
Jord =
0000
0
0
0
0
0
0
0
-1.0000
0
0
0
0
0
0
0
-1.0000
0
0
0
0
0
0
0
-1.0000
0
0
0
0
0
0
0
1.0000
0
0
0
0
0
0
0
1.0000
0
0
0
0
0
0
0
1.0000
Все собственные значения имеют простую кратность.
see(I,-l) % рис. 5.38
5. Матрицы и линейная алгебра
399
рис. 5.38
ipjfact
Факториальные матрицы Ганкеля
Синтаксис:
[T,d] = gallery('ipjfact',n,k)
Описание:
Функция [I, d] = galleryfipjfact', n, k) возвращает в зависимости от значения пара¬
метра к две формы факториальных матриц Ганкеля порядка п с элементами
(f + j)! для к=0 (по умолчанию)',
[(/ + ;)! •
В качестве второго выходного параметра возвращается определитель соответст¬
вующей факториальной матрицы Ганкеля.
Точные выражения для обратных факториальных матриц Ганкеля приведены в ра¬
боте [51].
Факториальные матрицы Ганкеля характеризуются большим разбросом собствен¬
ных значений:
400
В. Г. Потемкин. Вычисления в среде MATLAB
Форма 1:
[I,detl] = gallery(1 ipjfact1,5)
I =
2
6
24
120
720
6
24
120
720
5040
24
120
720
5040
40320
120
720
5040
40320
362880
720
5040
40320
362880
3628800
detl = 7.1664e+009
d = eig(I)
d =
0.026221
0.71531
24.495
4255.3
3.6656e+006
see(I,-l) % рис. 5.39,a
Форма 2:
[I,detl] = gallery(1 ipjfact1,5,1)
I =
0.5
0.16667
0.041667
0.0083333
0.0013889
0.16667
0.041667
0.0083333
0.0013889
0.00019841
0.041667
0.0083333
0.0013889
0.00019841
2.4802е-005
0.0083333
0.0013889
0.00019841
2.4802е -005
2.7557е-006
0.0013889
0.00019841
2.4802е-005
2.7557е-006
2.7557е-007
detl = 1.49480-
021
d = eig(I)
d =
-0.01459
-7.1109e-007
1.8166e-009
0.00014226
0.55753
see(I,-l) % рис. 5.39,6
5. Матрицы и линейная алгебра
401
б
рис. 5.39
402
В. Г. Потемкин. Вычисления в среде MATLAB
jordblock~|
Синтаксис:
J = gallery(’jordbloc', n,lambda)
Блок Жордана
Описание:
Функция J = galleryfjordbloc’, n, lambda) возвращает блок Жордана порядка п с соб¬
ственным значением lambda. По умолчанию lambda равно 1.
Сформируем блок Жордана порядка 5 для собственного значения -2.
J = gallery(1jordbloc 1,5,-2)
J =
-2
1
0
0
0
0
-2
1
0
0
0
0
-2
1
0
0
0 .
0
-2
1
0
0
0
0
-2
see(J) %
рис.
5.40
рис. 5.40
kalian I Матрица Кахана
Схптаксис:
К = gallery('kahan', [m n],theta,pert)
К = gallery('kahan',n,theta,pert)
5. Матрицы и линейная алгебра
403
Описание:
Функция К = gallery('kahan', [m n], theta, pert) возвращает прямоугольную матрицу
Кахана в верхней трапецеидальной форме. Диапазон возможных значений параметра
О < theta < pi; по умолчанию theta равно 1.2. Параметр pert позволяет оценить влияние
ошибок округления на возможные перестановки столбцов. Для этого диагональные
элементы матрицы Кахана подвергаются возмущению pert* eps*diag([n:-1:1]).
По умолчанию pert равно 25, что гарантирует отсутствие перестановок при работе
в IEEE-арифметике с матрицами, порядок которых не превышает 90.
К = gallery( 'kalian', [5 7])
К =
0000
-0.3624
-0.3624
-0.3624
-0.3624
-0.3624
-0.3624
0
0.9320
-0.3377
-0.3377
-0.3377
-0.3377
-0.3377
0
0
0.8687
-0.3148
-0.3148
-0.3148
-0.3148
0
0
0
0.8097
-0.2934
-0.2934
-0.2934
0
0
0
0
0.7546
-0.2734
-0.2734
see(К) % рис. 5.41
Функция К = gallery('kahan’, n, theta, pert) возвращает матрицу Кахана порядка п
в верхней треугольной форме. Диапазон возможных значений параметра 0 < theta < pi;
по умолчанию theta равно 1.2. Параметр pert позволяет оценить влияние ошибок ок¬
ругления на возможные перестановки столбцов. Для этого диагональные элементы
404
В. Г. Потемкин. Вычисления в среде MATLAB
матрицы Кахана подвергаются возмущению pert*eps*diag([n:-1:1]). По умолчанию pert
равно 25, что гарантирует отсутствие перестановок при работе в IEEE-арифметике
с матрицами, порядок которых не превышает 90.
К = gallery ( 'kalian', 7)
К =
0000
-0.3624
-0.3624
-0.3624
-0.3624
-0.3624
-0.3624
0
0.9320
-0.3377
-0.3377
-0.3377
-0.3377
-0.3377
0
0
0.8687
-0.3148
-0.3148
-0.3148
-0.3148
0
0
0
0.8097
-0.2934
-0.2934
-0.2934
0
0
0
0
0.7546
-0.2734
-0.2734
0
0
0
0
0
0.7033
-0.2549
0
0
0
0
0
0
0.6555
see(К) % рис. 5.42
рис. 5.42
Для исследования влияния ошибок округления при изменении параметра pert целе¬
сообразнее использовать визуализацию псевдоспектра матрицы:
see(К,1) % рис. 5.43
5. Матрицы и линейная алгебра
405
kms
рис. 5.43
Теплицева матрица в форме KMS
Синтаксис:
К = gallery('kmsn,rho)
Описание:
Функция К = gallery('kms', n, rho) возвращает симметрическую теплицеву матрицу
порядка п в форме KMS (Kac-Murdock-Szego) с элементами
. K(i,j) = rhoA(abs(i-j))
для действительных значений rho. Для комплексных rho элементы ниже главной диа¬
гонали являются комплексно-сопряженными к элементам выше диагонали. По умол¬
чанию rho равно 0.5.
Теплицева матрица в форме KMS имеет следующие свойства:
• существует разложение
К = LDL’,
L = inv(triw(n,-rho,1)')
D(i,i) = (1-abs(rho)л2)*eye(n),
исключение составляет элемент D(l, 1), который равен 1;
• является положительно определенной, если 0 < abs(rho) < 1;
• обратная матрица - трехдиагональная.
Проанализируем теплицеву матрицу в форме KMS порядка 5.
К = gallery('kms1,5)
К =
1
1/2
1/4
1/8
1/16
1/2
1
1/2
1/4
1/8
1/4
1/2
1
1/2
1/4
1/8
1/4
1/2
1
1/2
1/16
1/8
1/4
1/2
1
see(К) % рис.
5.44
406
В. Г. Потемкин. Вычисления в среде MATLAB
рис. 5.44
Это симметрическая положительно определенная матрица с одинаковыми элемен¬
тами на каждой диагонали, она имеет хорошо отделенный спектр собственных значений.
krylov
Матрица Крылова
Синтаксис:
К = gallery('krylov',А,х,j)
К = gallery('krylov',n)
Описание:
Функция К = gallery('krylov', А, х, j) возвращает прямоугольную матрицу Крылова
размера nxm вида
К = [х, Ах, А2х,...,Ат1х],
где А - произвольная матрица порядка п; х - вектор длины п. По умолчанию х = ones(n, 1)
ит = п.
Обращение в форме К = galleryfkrylov’, п) равносильно обращению galleryfkrylov’,
randn(n)). ■
Визуализируем матрицу Крылова порядка 10 и ее характеристики.
К = gallery('krylov'г10); k = condest(K)
к = 4.1367е+005
see(K,-l) % рис. 5.45
5. Матрицы и линейная алгебра
к
рис. 5.45
Это плохо обусловленная матрица с очень большим разбросом собственных значений.
lauchli
Матрица Лаучли
■Синтаксис:
L = gallery (' lauchli n,mu)
Описание:
Функция L = gallery('lauchli’, n, mu) возвращает прямоугольную матрицу Лаучли
(Lauchli) размера (п+1)хп вида [ones(l, n); mu*eye(n)]. Параметр mu по умолчанию ра¬
вен sqrt(eps).
Матрица Лаучли дает хорошо известный пример проблемы, которая возникает
в методе наименьших квадратов и других смежных областях и связана с псевдообра¬
щением.
Рассмотрим прямоугольную матрицу Лаучли р
азмера 6x5.
L = gallery('lauchli1,5)
т —
.Ь —
1 1
1
1
1
1.4901е-008 0
0
0
0
0 1.4901е-008
0
0
0
0 0 1.4901е-
-008
0
0
0 0
0 1.4901е-
-008
0
0 0
0
0
1.4901е-008
see(L) % рис. 5.46,а
408
В. Г. Потемкин. Вычисления в среде MATLAB
L
a
б
рис. 5.46
5. Матрицы и линейная алгебра
409
При работе с этой матрицей из-за наличия малых сингулярных чисел должны воз¬
никнуть проблемы при выполнении операции псевдообращения, когда формируется
квадратная матрица вида L’*L:
Lt = L'*L, г = rank(Lt)
Lt =
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
r = 1
Эта квадратная матрица порядка 5 имеет ранг, равный 1, и характеристики, пред¬
ставленные на рис. 5.46, б.
Исследуем структуру клеток Жордана для кратного собственного значения, равного
нулю.
[eigval,Jstr,R,Jord] = jstruct(Lt)
jkO =0 4
Собственные значения после процедуры qz
ans =
1.986027322597819e-016
5 . OOOOOOOOOOOOOOOe+OOO
2.201649645530207e-016
1.924001712205549e-016
1.938142016919247e-016
Кластеры близких собственных значений
порог близости
threshold = 1.0000е-004
1N1 = 0 4
Матрица эквивалентных возмущений
epsA=A-R*Jordt*LH с нормой
Е = 4.2378е-015
Число обусловленности задачи K(R)=||R||*||LH||
К = 1.00
Норма невязки | | г | | = | |A*R-^R*J| |
г = 4.1553е-015
Структура клеток Жордана
Jstr =04
eigval =
0 4
5 1
Jstr =04
R =
-0.2675
-0.7719
0.2713
0.2429
0.4472
-0.0854
0.5378
0.0774
0.7053
0.4472
-0.6278
0.1931
-0.3916
-0.4639
0.4472
0.6420
-0.1754
-0.5975
-0.0064
0.4472
0.3387
0.2165
0.6404
-0.4779
0.4472
410
В. Г. Потемкин. Вычисления в среде MATLAB
Jord
О О
О О
О О
О О
О О
ООО
ООО
ООО
ООО
0 0 5
Кратные собственные значения, равные нулю, являются простыми.
lehmer | Матрица Лехмера
Синтаксис:
L = gallery('lehmer',n)
Описание:
Функция L = galleryflehmer’, п) возвращает симметрическую положительно опре¬
деленную матрицу Лехмера (Lehmer) порядка п с элементами
А(/, у) = —, если j>i;
J
A(j,f) = A(i,j).
Матрица Лехмера обладает следующими свойствами:
• все элементы неотрицательные числа;
• обратная матрица трехдиагональная и известна точно;
• число обусловленности лежит в пределах
n < cond(L) <4*n*n.
Рассмотрим матрицу Лехмера порядка 5.
L = gallery(1lehmer1,5)
L- =
1
1/2
1/3
1/4
1/5
1/2
1
2/3
1/2
2/5
1/3
2/3
1
3/4
3/5
1/4
1/2
3/4
1
4/5
1/5
2/5
3/5
4/5
1
invL = inv(L)
invL =
1.3333
-0.66667
0
0
0
-0.66667
2.1333
-1.2
0
0
0
-1.2
3.0857
-1.7143
0
0
0
-1.7143
4.0635
-2.2222
0
0
0
-2.2222
2.7778
see(L,-l) % рис.
5.47
5. Матрицы и линейная алгебра
411
рис. 5.47
Это симметрическая положительно определенная рациональная матрица, обратная
к которой является трехдиагональной.
leslie I Матрица модели популяции Лесли
Синтаксис:
L = gallery('leslieа,Ь)
L = gallery('leslie',n)
Описание:
Функция L = gallery('leslie’,a,b) возвращает матрицу L порядка п для модели попу¬
ляции Лесли, которая определяется средним числом рождений, задаваемых вектором
а(1 :п), и вектором естественного отбора b( 1 :n-1). Матрица L в основном состоит из ну¬
лей, за исключением первой строки, равной вектору а(1:п), и первой поддиагонали,
совпадающей с вектором Ь(1:п-1). Для модели популяции характерно, что все a(i) не¬
отрицательны, a b(i) положительны и ограничены значением 1.
Функция L = gallery(’leslie',n) возвращает матрицу L порядка п, для которой вектор
а = ones(n,l), а вектор b = ones(n-l,l).
Рассмотрим матрицу модели популяции Лесли порядка 10:
L = gallery(1leslie1,10);
see(L) % рис. 5.48
412
В. Г. Потемкин. Вычисления в среде MATLAB
lesp
Матрица с действительными собственными значениями высокой
чувствительности
Синтаксис:
L = gallery('lesp',n)
Описание:
Функция L = gallery(’lesp’, п) возвращает матрицу порядка п, собственные значения
которой достаточно равномерно расположены в интервале [-2*п-3.5, -4.5].
Эта матрица подобна симметрической трехдиагональной матрице с теми же эле¬
ментами на главной диагонали и единицами на поддинагонали и наддиагонали; преоб¬
разование подобия реализуется диагональной матрицей D = diag(l!, 2!,..., п!).
Чувствительность собственных значений возрастает экспоненциально по мере рос¬
та порядка матрицы.
L = gallery(1lesp1,5)
L =
-5
2
0
0
0
1/2
-7
3
0
0
0
1/3
-9
4
0
0
0
1/4
-11
5
0
0
0
1/5
-13
Построим подобную ей трехдиагональную матрицу с единицами на первой наддиа¬
гонали и подддиагонали.
5. Матрицы и линейная алгебра
413
D = diag([1,2,prod(l:3),prod(l:4),prod(l:5)]); LL = D*L/D
LL =
-5
1
0
0
0
1
-7
1
0
0
0
1
-9
1
0
0
0
1
-11
1
0
0
0
1
-13
Визуализируем матрицу lesp порядка 10 и ее характеристики.
L = gallery (1 lesp1, Ю);
see(L) % рис. 5.49
lotkin Матрица Лоткина
Синтаксис:
L = gallery('lotkinn)
Описание:
Функция L = galleryflotkin', n) возвращает матрицу Лоткина, которая совпадает
с матрицей Гильберта порядка п, когда ее первая строка заменена единицами. Матрица
Лоткина - это несимметрическая, плохо обусловленная матрица с большим числом
отрицательных собственных значений малой величины. Обратная матрица является
целочисленной и точно известна.
Рассмотрим матрицу Лоткина порядка 8.
414
В. Г. Потемкин. Вычисления в среде MATLAB
L = gallery(1lotkin1,8); к = condest(L), d = eig(L)
к = 2.9913e+010
d =
2.3011
-0.2204
-0.056677
-0.0021042
-7.3199e-005
-1.6576e-006
-2.2257e-008
-1.3406e-010
see(L) % рис. 5.50
рис. 5.50
Эта матрица плохо обусловлена по отношению к операции обращения и имеет 7
из 8 собственных значений, близких к нулю.
minij
Симметрическая положительно определенная матрица
Синтаксис:
М = gallery('minijn)
Описание:
Функция М = gallery('minij', п) возвращает симметрическую положительно опреде¬
ленную матрицу порядка п с элементами
М (i, j ) = min(i , j ) .
5. Матрицы и линейная алгебра
415
Рассмотрим матрицу minij порядка 5.
М = gallery('minij1г5)
м =
1
1
1
1
1
1
2
2
2
2
1
2
3
3
3
1
2
3
4
4
1
2
3
4
5
see(М,-1)
% рис.
5.51
рис. 5.51
Эта матрица обладает следующими свойствами:
• Обратная матрица inv(M) является трехдиагональной:
invM = inv(M)
invM =
2
-1
0
0
0
-1
2
-1
0
0
0
-1
2
-1
0
0
0
-1
2
-1
0
0
0
-1
1
• Матрица Гивенса
Н = 2*М -
ones (size(М))
н =
1
1
1
1
1
1
3
3
3
3
1
3
5
5
5
1
3
5
7
7
1
3
5
7
9
416
В. Г. Потемкин. Вычисления в среде MATLAB
имеет в качестве обратной трехдиагональную:
invH = inv(H)
invH =
3/2
-1/2
0
0
0
1/2
1
-1/2
0
0
0
-1/2
1
-1/2
0
0
0
-1/2
1
-1/2
0
0
0
-1/2
1/2
Ее собственные значения равны
Л* =0.5sec2 (2*-1)^- , к=\,...,п
lambda = 0.5*sec((2*k-l)*pi/20).A2
ezg(W)
5.125428154684583е-001
6.298080918412499е-001
9.999999999999998е-001
2.425919998159591е+000
2.043172909453068е+001
5.125428154684583е-001
6.298080918412493е-001
9.999999999999982е-001
•2.425919998159589е+000
2.043172909453070е+001
Различие в вычисленных собственных значениях от точных отмечено полужирным
шрифтом.
Матрица Гивенса и ее характеристики представлены на рис. 5.52.
see(H,-l) % рис. 5.52
рис. 5.52
• Матрица Mt
Mt = (n+1)*ones(size(М))-М
5. Матрицы и линейная алгебра
417
14 т. Зак. 3375
5
4
4
4
4
5
4
3
3
3
5
4
3
2
2
5
4
3
2
1
для п, равного 5, имеет вид
п = 5;
Mt = (n+1)*ones(size(М))-М
Mt =
5
5
5
5
5
Ее элементы определяются соотношением
Mt (i, j) = max(i,j),
и поэтому она может быть названа maxij по
обратная maxij, является трехдиагональной:
invMt = inv(Mt)
invMt =
-4/5
1
О
О
О
1
-2
1
О
О
аналогии с матрицей М = minij. Матрица,
О
1
-2
1
О
О
О
О
1
-1
О
О
1
-2
1
Матрица maxij и ее характеристики представлены на рис. 5.53.
see(Mt,-l) % рис. 5.53
moler ~|
Синтаксис:
М = gallery('molern,alpha)
Матрица Моулера
418
В. Г. Потемкин. Вычисления в среде MATLAB
Описание:
Функция М = gallery('moler’, n, alpha) возвращает симметрическую положительно
определенную матрицу Моулера порядка п, элементы которой равны
... fminG', j),
M(z, _/) = •! .
[i, i = j.
Эта матрица связана с верхней треугольной матрицей U = triw(n, alpha) соотношением
М = U’*U.
По умолчанию alpha = -1. Одно из собственных значений матрицы Моулера имеет
значение, близкое к нулю.
Рассмотрим матрицу Моулера порядка 5.
М = gallery('molег5), d = eig(M)
м =
.1
-1
-1
-1
-1
-1
2
0
0
0
-1
0
3
1
1
-1
0
1
4
2
-1
0
1
2
5
0.0086462722839608
2.27845048260459
2.39646853198614
2.82893478242033
7.48749993070498
see(M,-1) % рис. 5.54
рис. 5.54
5. Матрицы и линейная алгебра
419
neumann I
Матрица Неймана
Синтаксис:
N = gallery( ’neumann' , [m n] )
N = gallery('neumannn)
Описание:
Функция N = gallery('neumann’, [m n]) возвращает сингулярную с диагональным
преобладанием по строкам матрицу Неймана размера mxn, которая возникает в дис¬
кретной задаче Неймана при пятиточечной аппроксимации на регулярной сетке.
Ф Функция N = gallery(’neumann', п) возвращает матрицу Неймана только для значе¬
ний п, являющихся полным квадратом некоторого целого числа. Матрица Неймана
формируется в разреженном виде, причем один из собственных векторов равен ones(n, 1).
Р усмотрим квадратную матрицу Неймана порядка 9.
У = gallery(’neumann9)
see(full(N)) % рис. 5.55
рис. 5.55
Предлагаем читателю самостоятельно сделать выводы о свойствах этой матрицы.
orthog I Ортогональные и близкие к ним матрицы
Синтаксис:
О = gallery('orthog',n,k)
420
В. Г. Потемкин. Вычисления в среде MATLAB
Описание:
Функция О = gallery(’orthog’, п, к) возвращает в зависимости от значения параметра
к одну из перечисленных ниже матриц порядка п. При к > 0 формируется строго орто¬
гональная матрица, а при к < 0 - ортогональная матрица с диагональным масштабиро¬
ванием. По умолчанию к равно 1.
Случай к = 1. В этом случае формируется ортогональная матрица следующего вида:
Эта матрица имеет кратные собственные значения, равные -1 и 1.
Рассмотрим ортогональную матрицу 01 порядка 5 и определим структуру ее кле
ток Жордана.
01 = gallery(*orthog1,5); d = eig(Ol)
d =
-1'
-1
1
1
1
Jstr = jord(01,l), Jstr = jord(01,-l)
Jstr = 13
Jstr =-12
Эти клетки Жордана имеют простую структуру.
Случай к = 2. В этом случае формируется ортогональная матрица следующего вида:
Эта матрица имеет кратные собственные значения, равные -1 и 1.
Рассмотрим ортогональную матрицу 02 порядка 5 и определим структуру ее кле¬
ток Жордана.
02 = gallery('orthog',5,2); d = eig(02)
d =
-1
-1
1
1
1
Jstr = jord(02,l), Jstr = jord(02,-l)
Jstr = 13
Jstr =-12
Клетки Жордана имеют простую структуру, и матрица 02 по своим свойствам
аналогична матрице 01.
Случай к = 3. В этом случае формируется ортогональная комплексная матрица Фурье
следующего вида:
5. Матрицы и линейная алгебра
421
(r-l)(5-l)
27U Л
и J’
Эта матрица соответствует матрице fft(eye(n))/sqrt(n). Ее спектр состоит из значе¬
ний {-1 1 -j j}.
Рассмотрим матрицу Фурье порядка 5.
ОЗ = gallery('orthog',5,3);
Jstr = jord(03,l),
Jstr = jord(03,i),
Jstr = 1
Jstr = -1
Jstr = 0 + li
Jstr = 0 - li
Jstr = jord(03,-l)
Jstr = jord(03,-i)
2
1
1
1
Случай k = 4. В этом случае формируется матрица Хелмерта, которая соответствует
матрице в нижней форме Хессенберга, первая строка которой заменена на следую¬
щую:
ones(1:n)/sqrt(п).
Рассмотрим матрицу Хелмерта порядка 5.
04 = gallery('orthog1,5,4);
see(04) % рис. 5.56
рис. 5.56
Случай к = 5. В этом случае формируется ортогональная матрица следующего вида:
" J
422
В. Г. Потемкин. Вычисления в среде MATLAB
Эта симметрическая матрица возникает при работе с преобразованием Хартли. Она
имеет кратные собственные значения, равные -1 и 1.
Рассмотрим ортогональную матрицу 05 порядка 5 и определим структуру ее кле¬
ток Жордана.
05 = gallery(’orthog1,5,5); d = eig(05)
d =
-1
-1
1
1
1
Jstr = jord(05,l), Jstr = jord(05,-l)
Jstr = 13
Jstr = -12
Клетки Жордана имеют простую структуру, и матрица 05 по своим свойствам
аналогична матрицам 01 и 02.
Случай k = -1. В этом случае формируется ортогональная матрица следующего вида:
O.jG', j) = cosf(i-1)0 -1)-^-
п-1
Эта симметрическая матрица Вандермонда возникает при отыскании экстремума
полинома Чебышева T(n -1).
Рассмотрим ортогональную матрицу 0_1 порядка 5.
0_1 = gallery(’orthog1,5,-1); d = eig(O_l)
see(0_l) % рис. 5.57
рис. 5.57
5. Матрицы и линейная алгебра
423
Случай к = -2. В этом случае формируется ортогональная матрица следующего вида:
O_2(i, j) = cos
Эта симметрическая матрица Вандермонда возникает при отыскании экстремума
полинома Чебышева Т(п).
Рассмотрим ортогональную матрицу О_2 порядка 5.
О_2 = gallery(1orthog1,5,-2); d = eig(O_2)
d =
-1.6382 +
-1.6382 -
1.8608
1.6317 +
1.6317 -
see(O_2) % рис.
0.25353i
0.25353i.
0.2657i
0.2657i
5.58
рис. 5.58
parter
Теплицева матрица с сингулярными значениями, близкими к л
Синтаксис:
Р = gallery('parter'zп)
Описание:
Функция Р = gallery(’parter', п) возвращает матрицу Р порядка п с элементами
424
В. Г. Потемкин. Вычисления в среде MATLAB
1
i-j-0.5
Эта матрица является матрицей Коши и теплицевой матрицей одновременно; часть
ее максимальных сингулярных чисел расположена вблизи значения тс.
Р = gallery('parter1,8); sv = svd(P)
SV =
3.14159265347603
3.14159263512181
3.14159131936263
3.14153629454613
3.14005961337616
3.11402050998757
2.83146652738175
1.34902476540515
Сравнивая co значением pi = 3.14159265358979, можно убедиться, что максималь¬
ное сингулярное число совпадает со значение тс до девятого знака после запятой.
Матрица parter и ее характеристики представлены на рис. 5.59.
see(P) % рис. 5.59
рис. 5.59
Эта матрица имеет 6 практически одинаковых по величине сингулярных чисел,
близких к значению числа тс.
5. Матрицы и линейная алгебра
425
Pie |
Симметрическая матрица
Синтаксис:
Р = gallery('pei' ,n,alpha)
Описание:
Функция P = galleryfpei’, n, alpha) возвращает симметрическую матрицу
P = alpha*eye(n) + ones(n).
По умолчанию alpha равно 1. Матрица сингулярна при значениях alpha, равных 0 и -п.
Рассмотрим матрицу pei порядка 8 при значении параметра alpha, равного 1Ж.
Р = gallery(1pei1,8); d = eig(P)
d =
1
1
1
1
1
1
1
9
Определим структуру клеток Жордана для собственного значения, равного 1.
Jstr = jord(Pfl)
Jstr =1 7
Данная матрица имеет кратные собственные значения простой структуры.
Характеристики матрицы pei показаны на рис. 5.60.
see(P,-l) % рис. 5.60
Р - pinv(P)
0 5
О
•0.5
О
8
Предлагаем читателю самостоятельно оценить характеристики этой матрицы.
426
В. Г. Потемкин. Вычисления в среде MATLAB
poisson
Матрица Пуассона
Синтаксис:
Р = gallery(’poissonп)
Описание:
Функция Р = gallery('poisson’, п) возвращает разреженную блочную трехдиагональ¬
ную матрицу порядка пЛ2, которая возникает в связи с дискретизацией уравнения Пу¬
ассона на основе пятиточечной аппроксимации на сетке размера пхп.
Рассмотрим матрицу Пуассона порядка 8 при значении параметра alpha равного 1.
Р = gallery('poisson1,4); d = eig(P)
d =
0.76393
1.7639
1.7639
2.7639
3
3
4
4
4
4
5
5
5.2361
6.2361
6.2361
7.2361
Определим структуру клеток Жордана для кратных собственных значений.
Jstr = jordCP/3)/ Jstr = jord(P,4), Jstr = jord’(P,5)
Jstr =32
Jstr =44
Jstr =52
Все кратные значения имеют простую структуру.
Характеристики матрицы Пуассона показаны на рис. 5.61.
5. Матрицы и линейная алгебра
427
Предлагаем читателю самостоятельно оценить характеристики этой матрицы.
prolate
Симметрическая плохо обусловленная теплицева матрица
Синтаксис:
Р = cillery(’prolate',n,w)
Описание:
Функция Р = galleryfprolate', n, w) возвращает симметрическую теплицеву матрицу
порядка п со следующими свойствами:
• при значениях параметра 0 < w < 0.5 матрица Р положительно определена и плохо
обусловлена;
• собственные значения различные, лежат в интервале (0, 1) и группируются вблизи
0 и 1;
• по умолчанию значение w равно 0.25.
Визуализируем плохо обусловленную теплицеву матрицу порядка 5 и ее характе¬
ристики.
Р = gallery(’prolate1г5)
see(Pz-l) % рис. 5.62
428
В. Г. Потемкин. Вычисления в среде MATLAB
Предлагаем читателю самостоятельно оценить характеристики этой матрицы.
randcolu ~|
Случайная матрица с нормированными столбцами и известными
сингулярными числами
Синтаксис:
R = gallery('randcoluп)
R = gallery('randcoluх)
R = gallery('randcolux,m)
R = gallery(’randcolux,m,k)
Описание:
Функция R = gallery('randcolu’, n) возвращает случайную матрицу порядка п со сле¬
дующими свойствами:
• все столбцы имеют значение нормы
,norm(R(:,i))=1, i=l,...,n;
• квадраты сингулярных значений подчиняются равномерному закону распределения;
• произведение R’*R формирует корреляционную матрицу, которая совпадает со зна¬
чением оператора gallery('randcorr', п).
Функция R = gallery('randcolu’, х), где х - вектор положительных величин х(1:п),
формирует случайную матрицу порядка п, сингулярные числа которой определяются
вектором х. Должно соблюдаться условие
5. Матрицы и линейная алгебра
429
Функция R = gallery('randcolu', x, m), где m > n, формирует матрицу размера mxn.
Функция R = gallery('randcolu', x, m, k) также формирует случайную матрицу раз¬
мера mxn, но при этом имеет регулирующий параметр к, который поддерживает сле¬
дующие опции:
к
Реализуемая опция
0
Матрица diag(x) сначала подвергается случайному двустороннему ортогональному
преобразованию, а затем последовательности вращений Гивенса; применяется
по умолчанию
1
Ортогональные преобразования не выполняются; это ускоряет процедуру форми¬
рования матрицы, но может приводить к сохранению достаточно большого коли¬
чества неслучайных нулевых элементов
Более полную информацию о матрицах этого типа можно найти в работе [38].
Построим и исследуем случайную матрицу с нормированными столбцами и из¬
вестными сингулярными числами порядка 10.
R = gallery(1randcolu1,10);
see(R) % рис. 5.63
рис. 5.63
Читатель может самостоятельно проверить, что сформированная матрица отвечает
всем сформулированным выше свойствам.
430
В. Г. Потемкин. Вычисления в среде MATLAB
randcorr
Случайная корреляционная матрица
Синтаксис:
R = gallery('randcorrп)
R = gallery('randcorrх)
R = gallery('randcoluх,k)
Описание:
Функция R = galleryfrandcorr’, n) возвращает случайную корреляционную матрицу
порядка п со следующими свойствами:
• это симметрическая положительно полуопределенная матрица с единицами на диа¬
гонали;
• ее собственные значения подчиняются равномерному закону распределения.
Функция R = gallery('randcorr', х), где х - вектор неотрицательных величин х(1:п),
формирует случайную корреляционную матрицу порядка п, собственные значения ко¬
торой определяются вектором х. Должно соблюдаться условие
11x11, =п.
Функция R = gallery('randcorr’, х, к) также формирует случайную корреляционную
матрицу, но при этом имеет регулирующий параметр к, который поддерживает сле¬
дующие опции:
к
Реализуемая опция
0
Матрица diag(x) сначала подвергается случайному двустороннему ортогональному
преобразованию, а затем последовательности вращений Гивенса; применяется
по умолчанию
1
Ортогональные преобразования не выполняются; это ускоряет процедуру форми¬
рования матрицы, но может приводить к сохранению достаточно большого коли¬
чества неслучайных нулевых элементов
Более полную информацию о генерации случайных корреляционных матриц мож¬
но найти в работах [35, 38].
Построим и исследуем случайную матрицу с нормированными столбцами и из¬
вестными сингулярными числами порядка 10.
R = gallery('randcorr10);
see(R,-l) % рис. 5.64
5. Матрицы и линейная алгебра
431
•X X
• X • • X ••
к-хх---
XX
Читатель может самостоятельно проверить, что сформированная матрица отвечает
всем сформулированным выше свойствам.
randhess | Случайная ортогональная матрица в верхней форме Хессенберга
Синтаксис:
R = gallery('randhessn)
R = gallery('randhess'zx)
’ Описание:
Функция R = gallery('randhess', n) возвращает случайную действительную ортого¬
нальную матрицу порядка п в верхней форме Хессенберга.
Функция R = galleryfrandhess', х), где х произвольный действительный вектор дли¬
ны n > 1, возвращает детерминированную ортогональную матрицу.
Матрица R формируется как произведение n-1 вращения Гивенса.
Визуализируем случайную ортогональную матрицу порядка 5 и ее характеристики.
R = gallery(1randhess1,5)
see(R,-l) % рис. 5.65
432
В. Г. Потемкин. Вычисления в среде MATLAB
Предлагаем читателю самостоятельно оценить характеристики этой матрицы.
rando I Случайная матрица из элементов -1,0,1
Синтаксис:
R = gallery(’rando',[m n],k)
R = gallery('randon,k)
Описание:
Функция R = gallery('rando', [m n], k) возвращает случайную матрицу размера mxn
со следующими свойствами, зависящими от параметра к:
к
Описание матрицы
1
A(i, j) = 0 или 1 с равной вероятностью; используется по умолчанию
2
A(i, j) = -1 или 1 с равной вероятностью
3
A(i, j) = -1,0 или 1 с равной вероятностью
Функция R = gallery('rando’, п, к) возвращает случайную квадратную матрицу по¬
рядка п с теми же свойствами.
Визуализируем случайную матрицу порядка 5, составленную из элементов, равных
-1,0, 1, и ее характеристики.
5. Матрицы и линейная алгебра
433
R = gallery('rando'z5,3)
R =
1
1
0
0
-1
-1
0
1
1
0
0
-1
1
1
1
0
1
1
0
-1
1
0
-1
1
-1
see(R) %
рис.
5.66
Предлагаем читателю самостоятельно оценить характеристики этой матрицы.
randsvd| Случайная матрица с предопределенными сингулярными числами
Синтаксис:
R = gallery('randsvd', [m n],kappa,mode,kl,ku)
R = gallery('randsvd',n,kappa,mode,kl,ku)
Описание:
Функция R = gallery('randsvd’, [m n], kappa, mode, kl, ku) возвращает случайную
ленточную матрицу размера mxn с числом обусловленности cond(R) = kappa и распре¬
делением сингулярных чисел, зависящим от параметра mode.
mode
Описание матрицы
1
Одно большое по величине сингулярное число
2
Одно малое по величине сингулярное число
434
В. Г. Потемкин. Вычисления в среде MATLAB
mode
Описание матрицы
3
Сингулярные числа в геометрической прогрессии, по умолчанию
4
Сингулярные числа в арифметической прогрессии
5
Случайные сингулярные числа, логарифм которых распределен равномерно
<0
Эти опции аналогичны значениям abs(mode), но диагональные элементы мат¬
рицы сингулярных чисел расположены в обратном порядке
По умолчанию параметр kappa равен sqrt(l/eps). Параметры к1 и ки определяют ко¬
личество используемых нижних и верхних поддиагоналей; если эти параметры опуще¬
ны, матрица предполагается полной; если указано только kl, то по умолчанию ku = kl.
Функция R = gallery('randsvd', n, kappa, mode, kl, ku) возвращает случайную ленточ¬
ную матрицу порядка п.
Особым является случай kappa < 0. При этом R - случайная, полная, симметриче¬
ская, положительно определенная матрица с числом обусловленности cond(A) =
= abs(kappa). В этом случае не сингулярные числа, а собственные значения располо¬
жены, как указано в вышеприведенной таблице. Параметры kl и ku не учитываются.
Рассмотрим в качестве иллюстрации свойств случайных матриц с предопределен¬
ными сингулярными числами и собственными значениями случай, когда эти характе¬
ристики подчиняются арифметической прогрессии. Соответствующие результаты
представлены на рис. 5.67, а соответственно рис. 5.67, б.
Сингулярные числа
в арифметической прогрессии
R = gallery('randsvd',
5,sqrt(1/eps),4)
sv = svd(R)
sv =
1.000000000000000e+000
7.500000037252901e-001
5.000000074505806e-001
2.500000111758708e-001
1.490116122057600e-008
Собственные значения
в арифметической прогрессии
R = gallery('randsvd',
5,-sqrt(1/eps), 4)
d = eig (R)
d =
1.490116119735800e-008
1.348699152281810e-006
1.220703125000908e-004
1.104854345603978e-002
1.000000000000000e+000
Предлагаем читателю самостоятельно рассмотреть другие варианты размещения
сингулярных чисел и собственных значений.
5. Матрицы и линейная алгебра
435
redheff
Матрица Редхеффера
Синтаксис:
R = gallery('redheff',n)
Описание:
Функция R = gallery(’redheff, n) возвращает матрицу Редхеффера порядка п, со¬
ставленную из нулей и единиц с элементами
R(i, У) =
1, если j = 1 | jmodz = 0;
О, в остальных случаях.
Матрица Редхеффера обладает следующими свойствами:
• она имеет n - floor(log2(n)) - 1 собственных значений, равных 1;
• максимальное действительное собственное значение (спектральный радиус), рав¬
ное приблизительно sqrt(n);
• остальные собственные значения достаточно малые.
Рассмотрим матрицу Редхеффера порядка 32.
R = double(gallery('redheff1,32));
[eigval,Jstr,R,Jord] = jstruct(R);
eigval
eigval =
7.3829 - 1.7537e-014i
1
1
26
0.84408 - 0.14432i
1
0.84408 + 0.14432i
1
0.22058 - 0.40213i
1
0.22058 + 0.40213i
1
-3.5122 - 2.2509e-016i
1
Jstr =
1 8 4 2 1
Матрица Редхеффера порядка 32 имеет 26 кратных собственных значений, рав¬
ных 1, со следующей структурой клеток Жордана: {Jo, Jb J2, J3} = {8 4 2 1}.
Визуализируем матрицу Редхеффера порядка 32 и ее характеристики.
see(R,-l) % рис. 5.68
436
В. Г. Потемкин. Вычисления в среде MATLAB
pinv(R)
рис. 5.68
Предлагаем читателю самостоятельно убедиться, что матрица обладает перечис¬
ленными выше свойствами.
riemann | Матрица Римана
Синтаксис:
R = gallery('riemannn)
Описание:
Функция R = galleryfriemann', п) возвращает матрицу Римана, которая определяет¬
ся следующим образом:
R = A(2:n + l, 2:и + 1);
f i -1, если j mod i = 0;
А(Л J)= ,
[-1, в остальных случаях.
Матрица Римана обладает следующими свойствами:
• каждое собственное значение d(i) удовлетворяет условию
abs(d(i)) < п* *(п+2)/(п+1);
• все собственные значения d(i), за исключением самое большее к собственных зна¬
чений, удовлетворяющих условию
к < floor(п+1-sqrt(п+1)),
5. Матрицы и линейная алгебра
437
принадлежат интервалу
i < d(i) < i+1;
• все целые числа в интервале
((п+1)/3, (п+1)/2]
являются собственными значениями.
Рассмотрим матрицу Римана порядка 20.
R = gallery('riemann',20);
d = eig(R);
После соответствующей сортировки собственные значения можно раположить так,
чтобы они отвечали вышеприведенным свойствам.
i
d
Свойство
1
-0.1027
2
1.3795 + 1.5150i
Семь собственных значений не удовлетворяют условию
3
1.3795 - 1.5150i
i < d(i) < i+1,
4
5
6
7
3.0945
4.8149
" 5.3837
778616
и это количество удовлетворяет неравенству
7 < floor(n+1-sqrt(п+1))|п=20 = 16
8
8
Целые числа в интервале
9
9
((п+1)/3,(п+1)/2]|п=20 =(7 10.5]
10
10
являются собственными значениями
11
11.1352
12
12.6039
Собственные значения удовлетворяют условию
13
14
13.3090
14.4762
i < d(i) < i+1.
15
15.4080
16
16.7276
17
17.4142
18
18.7933
Все собственные значения находятся в пределах
19
19.5153
спектрального радиуса
20
20.8063
К = п*(п+2)/(п+1)|п=20 = 20.95
Визуализируем матрицу Римана порядка 20 и ее характеристики.
see(R,-l) % рис. 5.69
438
В. Г. Потемкин. Вычисления в среде MATLAB
рис. 5.69
ris I Матрица Риса
Синтаксис:
R = gallery('risn)
Описание:
Функция R = gallery('ris’, n) возвращает симметрическую ганкелеву матрицу поряд¬
ка п с элементами
R(z,
7) =
0.5
п - i - j +1.5
Собственные значения матрицы Риса группируются вблизи точек л/2 и -п/2. Эта
матрица была предложена Рисом и описана в работе [78].
Рассмотрим матрицу Риса порядка 20.
R = gallery('ris20); d = eig(R)
d =
-1.570796326794897e+000
-1.570796326794896e+000
-1.570796326794895e+000
-1.570796326794894e+000
-1.570796326794556e+000
-1.570796326487869e+000
-1.570796182381368e+000
5. Матрицы и линейная алгебра
439
-1.570760165925614e+000
-1.566140891405847е+000
-1.323129903071750е+000
5.852523012269753е-001
1.531527019779563е+000
1.570348024373438е+000
1.57079385264651бе+000
1.570796319589803е+000
1.570796326783760е+000
1.57079632б794887е+000
1.570796326794896е+000
1.570796326794897е+000
1.570796326794898е+000
Собственные значения матрицы Риса обнаруживают исключительную близость к зна¬
чениям ±тт/2, которые в арифметике с плавающей точкой равны ±1.570796326794897. Да¬
же отличия только в 15-м знаке после запятой сохраняют изолированность этих собст¬
венных значений и не образуют кластеров кратных значений.
see(R,-l) % рис. 5.70
рис. 5.70
smoke
Комплексная матрица с известным спектром
Синтаксис:
S = gallery(’smoken)
S = gallery('smoke',n,1)
440
В. Г. Потемкин. Вычисления в среде MATLAB
Описание:
Функция S = gallery (’smoke’, п) возвращает матрицу порядка п с единицами на пер¬
вой наддиагонали и в позиции (n, 1), а также комплексными корнями n-й степени из 1
вдоль главной диагонали:
A(i, ;) =
1, (i, / + !)&(«, 1);
О, в остальных случаях.
Собственными значениями этой матрицы являются следующие комплексные числа:
Функция S = gallery(’smoke', n, 1) возвращает матрицу вида
АО, j) =
,2п
е п , j = г,
1, j = / + 1;
О, в остальных случаях.
В отличие от предыдущего случая в этой матрице элемент А(п,1) равен нулю.
Собственными значениями этой матрицы являются следующие комплексные числа:
&
-е п , к =1,...,п.
Визуализируем эти 2 типа матриц и построим их характеристики (рис. 5.71, а и б).
S = gallery(1 smoke1,10);
S = gallery('smoke1,10,1);
рис. 5.71
Предоставляем читателю возможность самостоятельно изучить характеристики
этих матриц.
5. Матрицы и линейная алгебра
441
toeppd |
Симметрическая положительно полуопределенная теплицева
матрица
Синтаксис:
Т = gallery (’toeppd',n,m,w, theta)
Описание:
Функция Т = gallery(’toeppd', n, m, w, theta) возвращает симметрическую положи¬
тельно полуопределенную теплицеву матрицу порядка п, сформированную как сумма
ш аналогичных матриц ранга 2 (а для некоторых theta ранга 1). По умолчанию ш = п,
w = rand(m, 1), theta = rand(m, 1).
Матрица формируется следующим образом:
т
т = у , Tt (z, j) = cos(2n0t (i - j).
k=l
Рассмотрим симметрическую положительно полуопределенную теплицеву матрицу
порядка 10.
Т = gallery(1toeppd1,10) ;
see(T,-l) % рис. 5.72
рис. 5.72
Предлагаем читателю самостоятельно проанализировать характеристики этой мат¬
рицы.
442
В. Г. Потемкин. Вычисления в среде MATLAB
toeppen ]
Пятидиагональная разреженная теплицева матрица
Синтаксис:
Т = gallery('toeppenn,а,b,с,d,е)
Описание:
Функция Т = gallery('toeppen', n, a, b, с, d, е) возвращает пятидиагональную разре¬
женную теплицеву матрицу порядка п с постоянными значениями на соответствую¬
щих диагоналях. Эти значения можно задать первым элементам соответствующих
диагоналей Т(3, 1) = а, Т(2, l) = b, Т(1, 1) = с, T(l,2) = d, Т(1, 3) = е.
По умолчанию (a, b, с, d, е) = (1, -10, О, 10, 1), что соответствует матрице Рутисхау-
зера. Эта матрица имеет собственные значения, расположенные на сегменте
2*cos(2*t) + 20*i*sin(t), 0 < t < ceil(n/2).
Рассмотрим матрицу Рутисхаузера порядка 10.
Т = gallery(’toeppen10); d = sort(eig(full(T)))
d =
1.5642 -
2.8425i
1.5642 +
2.8425i
1.0092 -
8.299И
1.0092 +
8.299П
0.07625 -
13.087i
0.07625 +
13.087i
-0.93799 -
16.819i
-0.93799 +
16.819i
-1.7117 -
19.188i
-1.7117 +
19.188i
Визуализируем матрицу Рутисхаузера и ее характеристики,
see(full(Т)z-1) % рис. 5.73
рис. 5.73
5. Матрицы и линейная алгебра
Из анализа графиков следует, что собственные значения этой матрицы действи¬
тельно расположены вблизи линии сегмента, отмеченной на графике собственных зна¬
чений.
tridiag | Трехдиагональная разреженная матрица
Синтаксис:
Т = gallery('tridiagс,d,е)
Т = gallery(’tridiagn,с,d,е)
Описание:
Функция Т = galleryftridiag’, с, d, е) возвращает трехдиагональную разреженную
матрицу с поддиагональю с, диагональю d и наддиагональю е. Векторы сие должны
иметь длину length(d) - 1.
Функция Т = galleryftridiag’, n, с, d, е), где с, d, е - скаляры, возвращает трехдиаго¬
нальную разреженную теплицеву матрицу порядка п с поддиагональными элементами,
равными с, диагональными - d - и наддиагональными - е. Эта матрица имеет следую¬
щие собственные значения [91]:
Xk = d + 2yfcecos(k ——), к = 1, .... п.
и + 1
Оператор Т = galleryftridiag’, п) равносилен оператору Т = galleryftridiag’, n, -1,2,-1),
что определяет симметрическую положительно определенную разреженную матрицу
вторых центральных разностей.
Рассмотрим трехдиагональную разреженную матрицу вторых центральных разно¬
стей и вычислим ее собственные значения по аналитической зависимости и с помо¬
щью М-функции eig.
Т = gallery('tridiag',10)
d = 2+2*cos(k*pi/ll)'
d = eig(full(Т))
3.918985947228995е+000
3.918985947228995е+000
3.682507065662362е+000
3.682507065662362е+000
3.309721467890570е+000
3.3 09721467890570е+000
2.830830026003773е+000
2.83 083 0026003773е+000
2.284629676546570е+000
2.284629676546570е+000
1.715370323453430е+000
1.715370323453429е+000
1.169169973996227е+000
1.169169973996227е+000
6.902785321094300е-001
6.902785321094298е-001
3.174929343376378е-001
3.174929343376378е-001
8.101405277100526е-00
8.101405277100485е-002
Практически собственные значения верны с точностью до 12-го знака после запятой.
Визуализируем трехдиагональную разреженную матрицу вторых центральных раз¬
ностей и ее характеристики.
see(full(Т),-1) % рис. 5.74
444
В. Г. Потемкин. Вычисления в среде MATLAB
т
рис. 5.74
Предлагаем читателю самостоятельно проанализировать характеристики этой мат¬
рицы.
triw |
Верхняя треугольная матрица
Синтаксис:
Т = gallery(’triw', [m n],alpha,k)
T = gallery('triw',n,alpha,k)
Списание:
Функция Т = gallery(’triw', [m n], alpha, k) возвращает прямоугольную верхнюю
трапецеидальную матрицу с единицами на диагонали и значениями alpha на первых к
наддиагоналях.
Функция Т = gallery('triw', n, alpha, к) возвращает верхнюю треугольную матрицу
порядка п. По умолчанию alpha = -1, k = п - 1. Эта матрица была предметом дискуссии
в работах Кахана, Голуба и Уилкинсона [50, 57, 80, 97].
В работе [80] показано, что число обусловленности матрицы при значении а, рав¬
ном 2, определяется следующим образом:
cond(gallery('triw',n,2))
5. Матрицы и линейная алгебра
445
для больших значений abs(alpha) число обусловленности приблизительно равно
( тт
cond (gallery (’ triwnz alpha) ) = I а Г sin
^4/7-2
Возмущение элемента T(n, 1) на величину (~22~n) делает матрицу сингулярной,
так же как и возмущение всех элементов первой строки на величину (-21-").
Рассмотрим верхнюю треугольную матрицу порядка 10 с параметром а, равным-1,
и к, равным 9.
Т = gallery(’triw*,10);
see(T) % рис. 5.75
Эта матрица имеет единственное собственное значение, равное 1, и образует клетку
Жордана порядка 10.
Jstr = jord(T,l)
Jstr = 10000000001
Рассмотрим верхнюю треугольную матрицу порядка 10 при значении а, равном 2,
и к, равном 9, и вычислим число обусловленности.
Т = gallery(1triw',10,2); к = cond(T)
к = 161.45
446
В. Г. Потемкин. Вычисления в среде MATLAB
Последнее значение точно совпадает с теоретической величиной, равной
ctg2(7l/4O).
wathen | Матрица метода конечных разностей
Синтаксис:
W = gallery('wathen',nx,ny)
W = gallery('wathen',nx,ny,1)
Описание:
Функция W = gallery('wathen', nx, ny) возвращает случайную разреженную матрицу
порядка п, равного
п = 3*пх*пу+2*пх+2*пу+1.
Это симметрическая положительно определенная матрица, соответствующая схеме
двумерной восьмиточечной аппроксимации на сетке размера пххпу [94].
Функция W = gallery('wathen’, nx, ny, 1) возвращает диагонально масштабирован¬
ную матрицу, такую, что ее собственные значения удовлетворяют неравенству
0.25 < eig(W) < 4.5.
Рассмотрим симметрическую положительно определенную матрицу, соответст¬
вующую схеме двумерной восьмиточечной аппроксимации на сетке размера 3x3.
W = gallery('wathen'z3,3);
see(full(W),-1) % рис. 5.76,a
Из анализа рис. 5.76 следует, что разброс собственных значений весьма велик; оце¬
ним его по числу обусловленности матрицы.
k = cond(full(W))
к = 406.71
Если выполнить масштабирование этой матрицы, то разброс можно сократить бо¬
лее чем в 20 раз:
W = gallery('wathen',3,3,1);
see(full(W)t-1) % рис. 5.76,6
5. Матрицы и линейная алгебра
447
Вычислим отношение максимального и минимального собственного числа:
d = eig (full (W)); kh=max(d)/min(d)
kh = 18
Это отношение, как и следует ожидать, равно 18.
448
В. Г. Потемкин. Вычисления в среде MATLAB
Матрицы Уилкинсона
Синтаксис:
[W,b]
= gallery('wilkп)
Описание:
Функция [W, b] = gallery(’wilk', п) возвращает различные матрицы или системы ли¬
нейных уравнений, порядок которых равен п, и которые предлагались и обсуждались
Уилкинсоном в связи с разработкой численных алгоритмов линейной алгебры.
Функция [W, b] = galleryfwilk’, 3) формирует линейную систему с матрицей W по¬
рядка 3 в верхней треугольной форме, которая иллюстрирует возможные погрешности
решения [95].
рис. 5.77
Функция [W, b] = gallery('wilk', 4) формирует линейную систему с матрицей W
в нижней треугольной форме, которая является плохо обусловленной [99].
[W, b] = gallery('wilk1,4)
w =
9.143е-005
0
0
0.8762
7 .
156е-005
0
0.7943
0.8143
9.504е-005
0.8017
0.6123
0.7165
see(W,-1) %
рис
. 5.78.
о
о
о
7.123е-005
0.6524
0.3127
0.4186
0.7853
5. Матрицы и линейная алгебра
449
15 т. Зак. 3375
рис. 5.78
Функция W = gallery('wilk', 5) возвращает симметрическую положительно опреде¬
ленную матрицу порядка 5, сформированную из матрицы Гильберта следующим обра¬
зом [25]:
Н = hilb(6);
W = Н(1:5,2:6)*1.8144
W =
0.9072
0.6048
0.4536
0.36288
0.3024
0.6048
0.4536
0.36288
0.3024
0.2592
0.4536
0.36288
0.3024
0.2592
0.2268
0.36288
0.3024
0.2592
0.2268
0.2016
0.3024
0.2592
0.2268
0.2016
0.18144
г,-1) % рис.
5.79
450
В. Г. Потемкин. Вычисления в среде MATLAB
Функция W - gallery('wilk’, 21) возвращает трехдиагональную матрицу Уилкинсона
порядка 21, связанную с решением проблемы собственных значений [25]. Эта матрица
соответствует М-функции wilkinson ядра системы MATLAB и обладает следующими
характеристиками:
W = gallery('wilk',21);
see(W,-l) % рис. 5.80
Сопутствующие функции'. MAGIC, HDLB, INVHILB, HADAMARD, WILKINSON.
5.3. Характеристики матриц
При работе с матрицами как специальными математическими объектами представ¬
ляют интерес их структурные характеристики - образ и ядро, обобщенные числовые
характеристики - определитель, след, норма, ранг, а также характеристики вычисли¬
тельных операций - числа обусловленности. Именно эти характеристики описаны
в данном разделе.
NORM |
Нормы векторов и матриц
Синтаксис:
n = norm(v,p)
n = norm(v)
n = norm(A,p)
n = norm(А,'fro')
n = norm(А)
5. Матрицы и линейная алгебра
451
Описание:
Нормы векторов
Функция n = norm(v, р) вычисляет р-норму вектора v, которая определяется сле¬
дующим образом [96]:
Справедливы следующие соотношения:
norm(v) = norm(v,2);
norm(v,inf) = max(abs(v));
norm(v,-inf) = min(abs(v)).
Нормы матриц
Функция n = norm(A, p) вычисляет подчиненную р-норму матрицы А только для
значений р, равных 1, 2, inf. Возможно также вычисление нормы Фробениуса, которая
не является подчиненной.
Справедливы следующие соотношения:
norm(A,l) = max (sum(abs (А) )) ;
norm (Az inf) = max (sum (abs (A' ) ) ) ;
norm(A,'fro') = sqrt(sum(diag(A'*A)));
norm(A) = norm(A,2) = omax(A).
Примеры:
Сформируем некоторый вектор v и вычислим для него различные виды норм.
v = -3:2
v = -3 -2 -1 0 1 2
Оператор
Значение
norm(v, 1)
9
norm(v, 2)
4.35889894354067
norm(vz 3)
3.55689330449006
norm(v, 10)
3.01025585810624
norm(v, inf)
3
norm(v,-inf)
0
Как следует из анализа результатов, с ростом номера нормы ее значение монотонно
убывает от 9 до 3.
Сформируем матрицу Теплица порядка 5 и вычислим для нее различные виды
норм.
А = toeplitz(1:5, 1.5:4.5);
Оператор
Значение
norm(A, 1)
15
norm(A, 2)
12.1001440512427
norm (Az inf).
14
norm(Az 'fro 1)
12.9421791055448
Сопутствующие функции’. COND, CONDEST, NORMEST.
452
В. Г. Потемкин. Вычисления в среде MATLAB
Оценка 2-нормы матрицы
NORMEST |
Синтаксис:
nrm = normest(S)
пгт = normest(S,tol)
[nrm,count] = normest(...)
Описание:
Функция nrm = normest(S) вычисляет оценку 2-нормы матрицы S. Эта функция
предназначена прежде всего для разреженных матриц, хотя она работает правильно
и может быть полезна для больших полных матриц. Используйте эту функцию, когда
вычисление нормы требует слишком большого времени, а на практике допустима при¬
близительная оценка.
Функция nrm = normest(S, tol) позволяет задать относительную погрешность вы¬
числений взамен принятой по умолчанию величины 1е-6.
Функция [nrm, count] = normest(...) возвращает оценку 2-нормы, а также количество
использованных итераций.
Пример:
Сравним количество итераций при вычислении нормы матрицы Уилкинсона по¬
рядка 101с относительными погрешностями 1е-6 и 1 е-12.
W = wilkinson(101);
tic, [nrm, count] = normest (W),toe
nrm = 50.746
count = 60
elapsed_time = 0.04
tic,[nrm,count] = normest(W,le-12),toe
nrm = 50.746
count = 172
elapsed_time = 0.09
Оценка нормы для обоих вариантов расчета одинакова, но при вычислениях с уд¬
военной точностью требуется почти в 3 раза больше итераций. На компьютере с час¬
тотой 1700 МГц время счета равно соответственно 0.04 и 0.09 с.
Сопутствующие функции'. COND, CONDEST, NORM, RCOND, SVD.
RANK . ~~| Ранг матрицы
Синтаксис:
г = rank(А)
г = rank(A,tol)
Описание:
Функция г = rank(A) возвращает ранг матрицы, который определяется как количе¬
ство сингулярных чисел, превышающих порог max(size(A))*norm(A)*eps.
Функция г = rank(A, tol) возвращает ранг матрицы, который определяется несколько
иначе, а именно как количество сингулярных чисел, превышающих заданный порог tol.
Алгоритм:
Существует несколько способов вычисления ранга матрицы. В системе MATLAB
использован метод, основанный на вычислении сингулярных чисел матрицы А;
он реализован на основе М-функции svd. Это наиболее надежный алгоритм, и он сов¬
падает с применяемым в пакете UNPACK [31].
5. Матрицы и линейная алгебра
453
s = svd(A) ;
tol = max(size(A))*s(1)*eps;
r = sum(s>tol).
Сопутствующая функция - SPRANK.
DET I Определитель матрицы
Синтаксис:
d = det(A)
Описание:
Функция d = det(A) вычисляет определитель квадратной матрицы; если матрица А
целочисленная, то результатом является также целое число.
Алгоритм:
Определитель матрицы вычисляется на основе треугольного разложения методом
исключения Гаусса:
[L,U] = lu(A);
s = det(L);
d = s*prod(diag(U)).
Пример:
Вычислить определитель и ранг для матриц Гильберта различного порядка.
for i = 3:11
Н = hilb(i);
detH(i-2) = det(H);
rankH(i-2) = rank(H);
n(i-2) = i;
end
[n1 detH' condH1 rankH']
п
det(H)
rank(H)
3
0.00046296
3
4
1.6534е-007
4
5
3.7493е-012
5
6
5.3673е-018
6
7
4.8358е-025
7
8
2.7371е-033
8
ч 9
9.7203е-043
9
10
2.1644е-053
10
11
3.0273е-065
10
12
2.8581е-078
11
Как следует из анализа расчетов, определитель матрицы Гильберта имеет очень
малые величины, однако в матрице появляется дефект, когда ее порядок становится
равным 11 •
Возникающие при этом нулевые собственные значения являются изолированными,
а число обусловленности для задачи на собственные значения равно 1.00.
454
В. Г. Потемкин. Вычисления в среде MATLAB
[eigval,Jstr,RzJord] = jstruct(H);
jkO = 0 4
Собственные значения:
d =
1.774883179499381e+000
3.623821286994228e-001
4.030962170533796e-002
3 ..114434327653173e-003
1.774285129435794e-004
7.542405920670207e-006
2.371759474210075e-007
5.368378374510837e-009
8.283328733308410e-011
7.807114016662148e-013
3.397191639392360e-015
Кластеры близких собственных значений
порог близости
threshold = 1.0000е-004
1N1 = 0.00.00 6.0000
Матрица эквивалентных возмущений
epsA = A-R*Jordt*LH с нормой
Е = 5.3684е-009
Число обусловленности задачи kH(R) = | |r| |*| |LH| |
кН = 1.00
Норма невязки ||г||=||A*R-R*J||
г = 5.3684е-009
Jstr = []
Кратных решений нет. Все решения изолированные
Визуализируем матрицу Гильберта порядка 11 и ее характеристики.
see(H,-l) % рис. 5.81
рис. 5.81
Сопутствующие функции'. COND, CONDEST, INV, LU, RREF, /, \.
5. Матрицы и линейная алгебра
455
След матрицы
TRACE |
Синтаксис:
t = trace(А)
Описание:
Функция t = trace(A) вычисляет след квадратной матрицы, равный сумме ее диаго¬
нальных элементов.
Алгоритм:
Алгоритм вычисления следа матрицы на языке MATLAB - это однострочный М-
файл:
t = sum(diag(А)).
Пример:
Вычислить след, определитель и ранг для матриц Гильберта различного порядка.
for i = 3:12
Н = hilb(i);
detH(i-2) = det(H);
rankH(i-2) = rank(H);
trH(i-2) = trace(H);
n(i-2) = i;
end
[n• trH1 detH1 rankH'J
п
trace(H)
det(H)
rank(H)
3
1.5333
0.00046296
3
4
1.6762
1.6534е-007
4
5
1.7873
3.7493е-012
5
6
1.8782
5.3673е-018
6
7
1.9551
4.8358е-025
7
8
2.0218
2.7371е-033
8
9
2.0806
9.7203е-043
9
10
2.1333
2.1644е-053
10
11
2.1809
3.0273е-065
10
12
2.2244
2.8581е-078
11
Сопутствующие функции'. DET, EIG.
COND, CONDEST,
RCOND
Оценки числа обусловленности
k = condest(A)
[k,v] = condest(A)
k_1 = rcond(A)
Синтаксис:
к = cond(A)
к = cond(A,p)
Определение:
Число обусловленности по отношению к операции обращения - это мера относи¬
тельной погрешности, связанная с вычислением обратной матрицы и равная
456
В. Г. Потемкин. Вычисления в среде MATLAB
,.J|AA- ||
II ДА || ’
где || ДА || - норма погрешностей исходной матрицы.
Число обусловленности характеризует точность операций обращения матрицы или
решения системы линейных уравнений.
Описание:
Функция k = cond(A) возвращает число обусловленности матрицы А по отношению
к операции обращения, которое равно отношению максимального и минимального
сингулярного числа:
к=-^.
^min
Функция k = cond(A, р) возвращает число обусловленности матрицы А относитель¬
но р-нормы
k = /wr/n(A, р) */wrm(mv(A), р), р = 1, 2, inf, 'fro'.
Функции cond(...) неприменимы для разреженных матриц.
Функция k = condest(A) вычисляет оценку верхней грани числа обусловленности
по 1-норме.
Функция [k, v] = condest(A) вычисляет, кроме оценки верхней грани числа обу¬
словленности, также и вектор v, такой, что справедливо соотношение
ZA norm(k, l)*norm(y, 1)
И(7Г/И(АУ, 1) = " .
Это означает, что вектор v может служить аппроксимацией нуль-вектора матрицы
А, если к велико.
Функции condest(...) применимы для действительных, комплексных и разреженных
матриц. В них реализован алгоритм Хейджера в модификации Хайема [53].
Функция k_l = rcond(A) возвращает величину, обратную значению числа обуслов¬
ленности матрицы А относительно 1-нормы. Если матрица А хорошо обусловлена,
то значение к_1 близко к единице; если матрица А плохо обусловлена, то значение к_1
близко к нулю.
Примеры:
Оценим число обусловленности специальной тестовой матрицы, используя М-
функцию cond.
С = gallery(’condex*,4,1)
k_l = cond(С,1), k_2 = cond(C,2),
k_inf = cond(C,inf), k_fro = cond(C,'fro')
1 -1 -200
0 1 100
0 1 101
0 0 0
0
-100
-101
100
5. Матрицы и линейная алгебра
457
к_1 = 80601
к_2 = 53057
k_inf = 41006
k_fro = 60142
В результате оценки числа обусловленности можно упорядочить следующим образом:
к_inf < к_2 < k_fго < к_1.
Оценим число обусловленности той же матрицы, используя 3 типа оценки:
l/rcond(C),cond(С),condest(С)
l/rcond( С)
cond( С)
condest(C)
40100
53057
80601
Поскольку алгоритмы дают оценку верхней грани числа обусловленности, то наи¬
лучшим является алгоритм, вычисляющий минимальное значение; таким в данном
случае является алгоритм rcond.
Обратимся к тестовой матрице Уилкинсона порядка 101:
W = wilkinson(101); cond(W),l/rcond(W),condest(sparse(W))
l/rcond(W)
cond(W)
conde st( sparse( W) )
276.28
199.94
276.28
В этом случае наилучшим является алгоритм cond.
Сопутствующие функции', COND, CONDEST, NORM, NORMEST, RANK, SVD.
NULL I Базисы ядра матрицы
Синтаксис:
Q = null(A)
Q = null(A,’r')
Описание:
Функция Q = null(A) возвращает базис ядра (нуль-пространства) матрицы А; если
Q непустая матрица, то справедливы следующие соотношения:
Q'*Q = eye(size(А));
A*Q = 0.
Такой базис называется ортонормальным.
Количество столбцов матрицы Q определяет размерность нуль-пространства или
дефект матрицы А, что можно вычислить следующим образом:
defect = size(null(А), 2).
Функция Q = null(A, 'г') возвращает для целочисленной матрицы А базис нуль-
пространства в рациональных числах, так называемый рациональный базис, вычисля¬
емый с помощью функции rref.
На практике для численных расчетов предпочтителен ортонормальный базис, а для
методических целей - рациональный базис.
458
В. Г. Потемкин. Вычисления в среде MATLAB
Примеры:
Вычисление дефекта, следа, определителя и ранга матриц Гильберта порядка от 10
до 20.
for i = 10:20
Н = hilb(i);
detH(i-9) = det(H);
rankH(i-9) = rank(H);
trH(i-9) = trace(H);
defect(i-9) = size(null(H),2);
n(i-9) = i;
end
[n1 defect1 trH’ detH' rankH1]
п
defect
trace(H)
det(H)
гапк(Н)
10
0
2.1333
2.1644е-053
10
11
1
2.1809
3.0273е-065
10
12
1
2.2244
2.8581е-078
11
13
2
2.2644
4.4480е-092
11
14
3
2.3014
-3.9220е-107
11
15
3
2.3359
-2.1903е-120
12
16
4
2.3681
2.4240е-135
12
17
5
2.3984
6.2628е-150
12
18
6
2.4270
-5.6313е-166
12
19
6
2.4540
-2.2316е-180
13
20
7
2.4797
-1.1004е-195
13
Как следует из анализа результатов; по мере увеличения порядка дефект матрицы
Гильберта растет и для матрицы порядка 20 достигает значения 7.
Рассмотрим целочисленную матрицу ранга 1 и вычислим ортонормальный и ра¬
циональный базисы ее нуль-пространства.
А = repmat([1 2 3],3,1)
А =
12 3
12 3
12 3
Ортонормальный базис
Q = null(А)
Рациональный базис
Qr = null(А,1 г')
Q =
Qr =
0.96362
0
-2 -3
-0.14825
-0.83205
1 0
-0.22237
0.5547
0 1
Для ортонормального базиса в пределах машинной точности выполняются сле¬
дующие свойства:
Q**Q
ans =
1 -1.3878е-017
-1.3878е-017 1
A*Q
5. Матрицы и линейная алгебра
459
ans
2.2204e-016
2.2204e-016
2.2204e-016
2.2204e-016
2.2204e-016
2.2204e-016
Сопутствующие функции'. QR, ORTH, SUBSPACE.
ORTH |
Синтаксис:
Q = orth(A)
Ортонормальный базис образа матрицы
Описание:
Функция Q = orth(A) возвращает ортонормальный базис матрицы А; столбцы Q оп¬
ределяют то же пространство, что и столбцы А, но столбцы Q при этом ортогональны,
т. е. выполняется условие
Q'*Q •= eye(size(А)).
Количество столбцов матрицы Q соответствует рангу матрицы А, и его можно вы¬
числить следующим образом:
rank = size(orth(А),2).
Пример:
Вычислим ранг и дефект матриц Гильберта порядка от 10 до 20.
for i = 10:20
Н = hilb(i);
rankH(i-9) = size(orth(H),2);
n(i-9) = i;
end
[n1 rankH' n1-rankH']
п
rank(H)
defect
10
10
0
11
10
1
12
11
1
13
11
2
14
11
3
15
12
3
16
12
4
17
12
5
18
12
6
19
13
6
20
13
7
Сопутствующие функции: NULL, RANK, SVD.
subspace"~|
Синтаксис:
theta = subspace(A,B)
Угол между двумя подпространствами
460
В. Г. Потемкин. Вычисления в среде MATLAB
Описание:
Функция theta = subspace(A, В) возвращает угол между двумя подпространствами,
натянутыми на столбцы матриц А и В; если а и b - векторы единичной длины, то вы¬
числяется угол между двумя векторами
theta = acos(a'*b).
Если некоторая реализация физического эксперимента описывается массивом А,
а другая реализация - массивом В, то функция subspace(A, В) определяет меру количе¬
ства новой информации, полученной из второго эксперимента и не связанную со слу¬
чайными ошибками.
Пример:
Рассмотрим два подпространства матрицы Адамара, столбцы которой, как извест¬
но, взаимно ортогональны.
Н = hadamard(8);
А = Н(:,2:4); В = Н(:,5:8);
size(A), size(B)
ans =83
ans =84
Размеры этих подпространств различны, но для нахождения угла между ними не¬
обязательно, чтобы их размеры точно совпадали. Геометрически ищется угол между
двумя гиперплоскостями, погруженными в пространство более высокой размерности.
theta = subspace(А,В)
theta = 1.5708
Этот угол совпадает с л/2, в чем можно убедиться, вычисляя разность
theta - pi/2
ans = 0.
Сопутствующие функции'. NULL, ORTH, QR.
RREF ~~| Треугольная форма матрицы
Синтаксис:
R = rref(A) [Rzjb] = rref(A) rrefmovie (А)
R = rref(A,tol) [R/jb] = rref(A,tol) rrefmovie(Aztol)
rrefmovie
Описание:
Функция R = rref(A) осуществляет приведение матрицы к треугольной форме
на основе метода исключения Гаусса с частичным выбором ведущего элемента.
По умолчанию используется следующее значение порога для принятия решения о ма¬
лости исключаемого элемента:
tol = max(size(A)*eps*norm(A,inf).
Функция R = rref(A, tol) осуществляет приведение матрицы к треугольной форме
на основе метода исключения Гаусса с частичным выбором ведущего элемента для за¬
данного значения порога tol.
5. Матрицы и линейная алгебра
461
Функции [R, jb] = rref(A) и [R, jb] = rref(A, tol), кроме треугольной формы, возвра¬
щают также вектор jb, обладающий следующими свойствами:
• г = lengthQb) может служить оценкой ранга матрицы А;
• при решении систем линейных уравнений Ах = b переменные x(jb) являются свя¬
занными переменными;
• столбцы А(:, jb) определяют базис матрицы А;
• R( 1 : г, jb) - единичная.
Операторы rrefmovie(A) и rrefmovie(A, tol) реализуют пошаговую процедуру при¬
ведения матрицы к треугольной форме с выводом на экран промежуточных результатов.
Оператор rrefmovie демонстрирует пошаговую процедуру приведения некоторой
матрицы размера 8 х 6 с рангом 4 к треугольной форме.
Примеры:
Выполним приведение магической матрицы порядка 4 к треугольгной форме.
А =
magic(4),
[R/jb]=rref(A)t г = length(jb)
А =
16
2
3
13
5
11
10
8
9
7
6
12
4
14
15
1
R =
1
0
0
1
0
1
0
3
0
0
1
-3
0
0
0
0
jb
= 1
2
3
г
= 3
Читатель может самостоятельно убедиться, что полученные характеристики удов¬
летворяют перечисленным выше свойствам.
Сопутствующие функции: INV, LU, RANK.
5.4. Решение систем линейных алгебраических уравнений
/
Решатель систем уравнений
Синтаксис:
X = В\А
X = В/А
Описание:
Функция X = В \ А находит решение системы уравнений вида АХ = В, где А - пря¬
моугольная матрица размера m х п и В - матрица размера п х к.
Функция X = В / А находит решение системы уравнений вида ХА = В, где А - пря¬
моугольная матрица размера n х m и В - матрица размера m х к.
462
В. Г. Потемкин. Вычисления в среде MATLAB
Алгоритм:
Решение систем линейных алгебраических уравнений (СЛАУ) вида X = А \ В
и X = В / А реализовано в MATLAB с помощью специального монитора, который
мы будем называть решателем СЛАУ. Он использует разные алгоритмы решения в
зависимости от структуры матрицы А.
• Если А - треугольная матрица с точностью до перестановки ее строк или столбцов,
то решение таких систем уравнений может быть эффективно вычислено методом
обратной подстановки. Проверка матрицы, является ли она верхней треугольной,
осуществляется для полных матриц проверкой на нуль всех элементов, лежащих
ниже диагонали; для разреженных матриц - определением структуры ее элементов.
Большинство матриц нетреугольной структуры выявляются почти мгновенно, так
что такая проверка требует очень малого времени.
• Если матрица А - симметрическая или эрмитова с положительными диагональны¬
ми элементами, то применяется разложение Холецкого (функция chol). Если при
этом матрица А положительно определена, то алгоритм Холецкого позволяет эф¬
фективно найти решение. Матрицы, не являющиеся положительно определенными,
выявляются почти мгновенно. Разложение Холецкого имеет вид:
А = L*LT,
где LT- верхняя треугольная матрица. После этого решение X можно получить,
решая последовательно 2 треугольные системы
X = LT\(L\B).
• Если А - разреженная матрица, то применяется следующий алгоритм:
perm = symmmd(A); % Симметрическая упорядоченность
R = chol(A(perm,perm)); % Разложение Холецкого
Y = R'\B(perm); % Решение для нижней треугольной матрицы
X(permz :) = R\Y; % Решение для верхней треугольной матрицы
• Если А - произвольная квадратная матрица, то треугольное разложение вычисляет¬
ся методом исключения Гаусса с частичным выбором главного элемента (функция
lu). Если А - разреженная матрица, применяется алгоритм упорядочения по разре¬
женности столбцов (функции colmmd и spparms). В результате имеем следующее
разложение:
А = L*U,
где L - нижняя, a U - верхняя треугольные матрицы. После этого решение X мож¬
но получить, решая последовательно 2 треугольные системы
х = и\ (IAB) .
• Если А - несимметрическая разреженная матрица, применяется алгоритм
UMFPACK (Unsymmetric MultiFrontal PACKage) [39]. Он гарантирует существен¬
ное ускорение при работе с такими системами. Метод поддержан двумя новыми
опциями М-функции lu:
[LZUZPZQ] = lu(X)
[LZUZPZQ] = lu(Xzthresh)
5. Матрицы и линейная алгебра
463
Эти функции возвращают нижнюю треугольную матрицу L, верхнюю треугольную
матрицу U и матрицы перестановок Р и Q такие, что справедливо соотношение
P*A*Q = L*U.
Параметр thresh позволяет контролировать выбор главного элемента, его значение
находится в интервале [0.0, 1.0], по умолчанию 0.1.
При решении систем вида В\А пакет UMFPACK применяется только для квадрат¬
ных разреженных матриц, которые не являются ленточными. В этом случае для
управления выбором главного элемента используется новая опция М-функции
spparms - параметр ’piv_tol’ из интервала значений [0.0, 1.0], по умолчанию 0.1.
Информация о пакете UMFPACK доступна на сайте
http://www.cise.ufl.edu/research/sparse/umfpack/.
Руководство пользователя по пакету UMFPACK версии 4.0 [39] размещено в раз¬
деле http://www.cise.ull.edU/research/sparse/umfpack/v4.0/UserGuide.pdf.
• Если А - плотная прямоугольная матрица, то применяется QR-разложение на осно¬
ве преобразований Хаусхолдера следующего вида:
А*Р = Q*R,
где Р- матрица преобразований; Q- ортогональная и R- верхняя треугольная
(функция qr) матрицы. Решение, соответствующее минимуму квадрата ошибки, на¬
ходится согласно следующему соотношению:
X = P*(R\(QT*B) ) .
• Если А - разреженная квадратная ленточная матрица, то применяются специаль¬
ные решатели для ленточных матриц. Если А - действительная трехдиагональная
матрица с плотностью ленты, равной 1 (отсутствуют нулевые элементы), а правая
часть - действительный вектор В,'то решение вычисляется очень быстро на основе
метода исключения Гаусса без выбора главного элемента.
Если решатель определяет, что В - это матрица, а не вектор, либо матрицы А или В
комплексные, либо плотность ленты bandden превышает значение 0.5, использу¬
емое по умолчанию, то решение ищется с использованием пакета LAP АСК.
• Если А - прямоугольная разреженная матрица, то решение вычисляется с исполь¬
зованием QR-разложения.
Решатели линейных систем не применяются, если матрица А является комплексной
прямоугольной.
Диагностические сообщения:
При решении систем линейных уравнений: если А - квадратная вырожденная мат¬
рица, выдается сообщение
Matrix is singular to working precision.
Для выбранной точности матрица вырожденна.
При поэлементном делении: если массив-делитель имеет нулевые элементы, выдает¬
ся сообщение
Divide by zero.
Деление на нуль.
464
В. Г. Потемкин. Вычисления в среде MATLAB
На ЭВМ, где не реализован стандарт IEEE-арифметики, обе вышеприведенные
операции будут выдавать сообщение об ошибке. На ЭВМ, где реализован стандарт
ЕЕЕ-арифметики, например на PC, будут генерироваться только предупреждения.
При этом при решении систем будут возвращаться матрицы, часть элементов которых
будет иметь значение Inf; при поэлементном делении результатом могут быть как зна¬
чения Inf, так и значение NaN.
Если результат обращения матрицы не является надежным, выдается сообщение
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = xxx
Предупреждены:. Матрица близка к вырожденной или плохо масштабирована.
Результаты могут быть неточными. Число обусловленности RCOND = ххх.
При решении систем линейных уравнений: если прямоугольная матрица А имеет
неполный столбцовый ранг, выдается сообщение
Warning: Rank deficient, rank = xxx tol = xxx
Предупреждение: Неполный ранг, ранг rank = ххх точность tol = xxx.
Сопутствующие функции'. CHOL, DET, INV, LU, ORTH, PERMUTE, IPERMUTE, QR,
RREF.
[NV | Обращение матрицы
Синтаксис:
Y = inv(A)
Определение:
На практике вычисление явной обратной матрицы требуется не так часто. Как пра¬
вило, говоря о задаче обращения, имеют в виду нахождение решений систем линейных
уравнений. В рамках системы MATLAB для этих целей рекомендуется использовать
решатели систем, т. е. операторы вида х = А\Ъ или х = Ь/ А, а не операцию х =
= inv(A)*b.
Описание:
Функция Y = inv(A) вычисляет матрицу, обратную квадратной матрице А. В случа¬
ях, когда матрица А плохо масштабирована или близка к вырожденной, выдаются со¬
общения.
Функция реализована с использованием утилит пакета LAP АСК [31].
Диагностические сообщения:
В процессе выполнения функции inv на рабочих станциях и компьютерах с IEEE-
арифметикой возможно появление следующего предупреждения:
Matrix is singular to working precision.
При заданной точности матрица вырожденна.
При этом формируется матрица, все элементы которой равны Inf.
На машинах без IEEE-арифметики эта ситуация рассматривается как ошибка.
Если выполненное обращение ненадежно, появляется сообщение
5. Матрицы и линейная алгебра
465
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = xxx
Предупреждение: Матрица близка к вырожденной.
Результаты могут быть неточными. RCOND = ххх.
Примеры:
Рассмотрим пример, демонстрирующий различие в определении решения систем
линейных уравнений с помощью операций х = inv(A) *Ьих = А\Ь.
Сформируем случайную матрицу А порядка 500, норма которой равна 1, а число
обусловленности равно 1е10. В качестве точного решения сформируем случайный
вектор х размера 500x1 и определим правую часть уравнения Ь.
п = 500;
Q = orth(randn(n,n)); d = logspace(0,-10,n);
A = Q*diag(d)*Q*; k = cond(A), nrm = norm(A)
x = randn(n,1);
b = A*x;
k = le+010
nrm = 1
Выполним расчеты на компьютере с частотой 1700 МГц и оценим время решения.
tic, у = inv(A)*b; toe
err = norm(y-x)
res = norm(A*y-b)
elapsed_time = 0.35
err = 5.1647e-006
res = 6.376e-007
tic, z = A\b; toe
err = norm(z-x)
res = norm(A*z-b)
elapsed_time = 0.16
err = 4.2977e-006
res = 4.014e-015
Сравнивая эти способы, можно убедиться, что расчеты выполняются с одинаковой
относительной погрешностью, которая определяется числом обусловленности. Однако
невязки отличаются на несколько порядков и для решателя они существенно меньше.
Время вычислений с помощью решателя сокращается более чем в 2 раза.
Сопутствующие функции'. PINV, COND, CONDEST, LSCOV, NNLS,SLASH.
CHOL |
Разложение Холецкого
Синтаксис:
R = chol(A)
[R,p] = chol(A)
Описание:
Функция R = chol(A) находит разложение Холецкого для действительных симмет¬
рических и комплексных эрмитовых матриц. Если А - положительно определенная
матрица, то матрица R - верхняя треугольная и удовлетворяет соотношению R’ * R = А;
в противном случае появляется сообщение об ошибке.
Функция [R, р] = chol(A) не генерирует сообщения об ошибке, но формирует диаг¬
ностический выходной параметр р, который принимает следующие значения:
466
В. Г. Потемкин. Вычисления в среде MATLAB
р
Условие
0
А - положительно определенная матрица
>0
R - верхняя треугольная матрица порядка q = р -1, такая, что
R’*R = A(1 : q, 1 : q)
Программа chol использует утилиты пакета LAP АСК [31].
Примеры:
Рассмотрим матрицу Паскаля, составленную из биномиальных коэффициентов.
Это положительно определенная целочисленная матрица, а ее разложение Холецкого
также целочисленно и формируется из части биномиальных коэффициентов:
eig(A)
А
R
= chol(А)
1
1
1
1
1
1
1
1
1
1 .
1
2
3
4
5
0
1
2
3
4
1
3
6
10
15
0
0
1
3
6
1
4
10
20
35
0
0
0
1
4
1
5
15
35
70
0
0
0
0
1
eig(A)
0.010835
0.18124
1
5.5175
92.29
Разрушим положительную определенность этой матрицы, вычтя из ее последнего
элемента 1, и матрица станет вырожденной:
А = A-diag([0 0 0 0 1]), [Rzp] = chol(A), d = eig(A)
A
[R,p]
= chol(A)
eig(A)
1
1
1
1
1
1
1
1
1
-1.7828e-017
1
2
3
4
5
0
1
2
3
0.15001
1
3
6
10
15
0
• 0
1
3
0.95224
1
4
10
20
35
0
0
0
1
5.3531
1
5
15
35
69
p
= 5
91.545
Вычислим матрицу
S = R'*R
S =
1
1
1
1
1
2
3
4
1
3
6
10
1
4
10
20
Из-за появления дефекта матрица S совпадает лишь с подматрицей порядка 4 ис¬
ходной матрицы, но не с самой матрицей.
Сопутствующие функции: CHOLINC, CHOLUPDATE.
CHOLUPDATE ~| Разложение Холецкого модифицированной матрицы
Синтаксис:
Rl = cholupdate(R,х)
Rl = cholupdate(R,х,'+')
Rl = cholupdate(R,х, )
[Rl,p] = cholupdate(R,х, ‘ )
5. Матрицы и линейная алгебра
467
Описание:
Функция Rl = cholupdate(R, х) вычисляет разложение Холецкого для матрицы А +
+ х*хт, которая является суммой положительно определенной матрицы А и некоторой
матрицы ранга 1, если известно разложение Холецкого R матрицы А.
Функция Rl = cholupdate(R, х,'+') равносильна функции Rl = cholupdate(R, х).
Функция Rl = cholupdate(R, х, возвращает разложение Холецкого для матрицы
А - х*хт. Сообщение об ошибке формируется в тех случаях, если R не является разло¬
жением Холецкого матрицы А, если модифицированная матрица не является положи¬
тельно определенной, если она не имеет разложения Холецкого.
Функция [Rl, р] = cholupdate(R, х, не генерирует сообщения об ошибке, а фор¬
мирует диагностический выходной параметр р, который принимает следующие значения:
р
Условие
0
R1 - разложение Холецкого матрицы А - х*хт
>0
Новое разложение Холецкого не формируется. R1 - разложение Холецко¬
го матрицы А
1
Модифицированная матрица не является положительно определенной
2
Модифицированная матрица не имеет разложения Холецкого
Функции cholupdate(...) могут применяться только для полных матриц.
Алгоритм: '
Программа chol использует утилиты пакета UNPACK [40].
Примеры:
Рассмотрим матрицу Паскаля порядка 4, составленную из биномиальных коэффи¬
циентов.
А
= pascal(4),
R =
chol(А)
А
1
1
1
1
1
2
3
4
1
3
6
10
1
4
10
20
R
1
1
1
1
0
1
2
3
0
0
1
3
0
0
0
1
Добавим к матрице А матрицу ранга 1, сформированную на основе некоторого век¬
тора х, и вычислим разложение Холецкого модифицированной матрицы, используя
ранее полученное разложение.
х = [0
0
0 1]
■ •
/
Ат = А
+
х*х»
Ат =
1
1
1
1
1
2
3
4
1
3
6
10
1
4
10
21
468
В. Г. Потемкин. Вычисления в среде MATLAB
Модифицированная матрица отличается от исходной матрицы Паскаля значением
последнего элемента.
Вычислим новое разложение, используя только прежнее разложение Холецкого.
Rl = cholupdate(R,x)
Rl =
1 1
1
1
0 1
2
3
0 0
1
3
0 0
Q
1.4142
Попытаемся вычислить разложение Холецкого, если исходную матрицу модифи¬
цировать вычитанием из ее последнего элемента единицы.
[Rl/P]
= cholupdate(Rfx,* -1)
Rl =
1
1
1
1
0
1
2
3
0
0
1
3
0
0
0
1
P =
1
Из полученного результата следует, что модифицированная матрица не является
положительно определенной и сохранилось разложение Холецкого матрицы Паскаля.
Вычислим разложение Холецкого для
матрицы Паскаля, из последнего элемента
которой вычтена величина, равная 1/2.
х = [ООО l/sqrt(2)]';
[R1/P1 = cholupdate(R,x,1)
Rl =
1 1
1
1
0 1
2
3
0 0
1
3
0 0
0
0.70711
P = o
В этом случае параметр р равен 0 и
разложение Холецкого модифицированной
матрицы существует.
Сопутствующие функции'. CHOL, QRUPDATE.
LU
LU-разложение
Синтаксис:
[L,U] = 1и(А)
[L,U,P] = lu(A)
Y = lu(A)
[L,U,P,Q] = lu(A)
[L,U,P] = lu(A,thresh)
[L,U,P,Q] = lu(a,thresh)
Определение:
Разложение матрицы, основанное на М-функции 1и, представляет исходную матри¬
цу А как произведение двух треугольных, одна из которых является нижней, а вто¬
рая- верхней треугольной. Такое разложение носит название LU-разложения, реже -
LR-разложения.
5. Матрицы и линейная алгебра
469
Описание:
Функция [L, U] = lu(A) находит LU-разложение для произвольной квадратной мат¬
рицы А в виде произведения нижней треугольной матрицы L (возможно с перестанов¬
ками) и верхней треугольной матрицы U, так что выполняется сооношение
А = L*U.
Функция [L, U, Р] = 1и(А) находит разложение для произвольной квадратной мат¬
рицы А в виде трех составляющих - нижней треугольной матрицы L, верхней тре¬
угольной матрицы U и матрицы перестановок Р, так что выполняется сооношение
Р*А = L*U.
Функция Y = 1и(А) возвращает для плотных матриц А выход, формируемый утили¬
тами пакета LAP АСК [31]. Для разреженных матриц А функция возвращает нижнюю
треугольную матрицу L без единиц на главной диагонали, а также верхнюю треуголь¬
ную матрицу U, размещенную в том же массиве Y. Иными словами, разложение Y =
= 1и(А) связано с разложением [L,U,P] = lu(A) следующим соотношением:
Y = U+L-speye(size(А)),
при этом матрица перестановок Р оказывается потерянной.
Функция [L, U, Р, Q] = 1и(А) для разреженной матрицы А возвращает нижнюю тре¬
угольную матрицу L, верхнюю треугольную матрицу U, матрицу перестановок Р
и матрицу упорядочения столбцов Q, такие, что выполняется соотношение
P*X*Q = L*U.
В этом случае применяются утилиты пакета UMFPACK [39], что приводит к суще¬
ственному повышению эффективности вычислений. Если исходная матрица А являет¬
ся пустой или не является разреженной, М-функция 1и генерирует сообщение
об ошибке.
Функция [L, U, Р] = lu(X, thresh) позволяет управлять выбором главного элемента
при работе с разреженными матрицами, где параметр thresh выбирается из диапазона
[О, 1], и позволяет установить порог выбора. Выбор главного элемента реализуется,
когда диагональный элемент в столбце не превышает произведения величины внедиа¬
гонального элемента и параметра thresh. Значение thresh = 0 означает выбор в качестве
ведущего диагонального элемента; значение thresh, равное 1, используется по умолчанию.
Функция [L, U, Р, Q] = lu(X, thresh) позволяет управлять выбором главного элемен¬
та при применении пакета UMFPACK. В этом случае параметр thresh соответствует
параметру piv_tol, который должен принадлежать интервалу [0.0, 1.0]. Значения, рав¬
ные 1.0 или 0.0, соответствуют обычному механизму выбора главного элемента.
По умолчанию принято значение, равное 0.1. Меньшие значения параметра piv_tol
приводят к более разреженным матрицам L и U; большие - позволяют получить более
точное решение (но не всегда) и, как следствие, приводят к росту времени вычисления.
При выбранном ведущем столбце с номером j процедуры пакета UMFPACK выбирают
в качестве ведущей такую строку i, чтобы ее главный элемент был больше или равен
абсолютному значению главного элемента столбца, умноженному на величину piv_tol.
470
В. Г. Потемкин. Вычисления в среде MATLAB
Для комплексных матриц абсолютное значение элемента вычисляется по следующему
соотношению:
abs(a) = abs(real(a)) + abs(imag(а)).
Для удобства последующего справочного использования сконцентрируем описание
аргументов для различных вариантов обращения в одном месте.
Описание аргументов:
Аргумент
Описание
А
Исходная прямоугольная матрица.
thresh
Порог для выбора главного элемента; допустимые значения из интервала [0, 1].
Если при вызове функции используется 4 выходных аргумента, то значение по¬
рога для выбора главного элемента 0.1, в остальных случаях 1.0
L
Нижняя треугольная матрица либо ее произведение с матрицей перестановок Р*
и
Верхняя треугольная матрица
Р
Матрица перестановок строк, которая удовлетворяет одному из следующих со¬
отношений: L*U = Р*Х или L*U = P*X*Q. Предназначена для обеспечения вы¬
числительной устойчивости
Q
Матрица перестановок столбцов, которая удовлетворяет соотношению
P*X*Q = L*U. Предназначена для увеличения степени разреженности
Примеры:
Рассмотрим плотную квадратную матрицу порядка 3.
А = [1 2 3
4 5 6
7 8 0] ;
Выполним LU-разложение, используя следующий синтаксис для вызова функции 1и:
[L,U] = lu(A)
L =
0.14286 1 0
0.57143 0.5 1
10 0
U =
7 8 0
0 0.85714 3
0 0 4.5
Здесь матрица L представлена с учетом матрицы перестановок, а матрица U - верх¬
няя треугольная.
Для того чтобы убедиться в правильности результатов, восстановим исходную
матрицу.
L*U
ans
=
1
2
3
4
5
6
7
8
0
5. Матрицы и линейная алгебра
471
Действительно, восстановленная матрица совпадает с исходной.
Если использовать вызов М-функции lu, при котором вычисляется матрица пере¬
становок, то можно получить следующие результаты:
[L,U,P] =
lu(A)
L =
1.0000
0
0
0.1429
1.0000
0
0.5.714
0.5000
1.0000
и =
7.0000
8.0000
0
0
0.8571
3.0000
0
0
4.5000
р =
0 0 1
10 0
0 10
Убедимся, что произведение L*U удовлетворяет соотношению Р*А = L*U или,
иными словами, все элементы матрицы Р*А - L*U равны нулю.
all(all(P*A-L*U))==0
ans = 1
Зная LU-разложение, можно с высокой точностью вычислить определитель исход¬
ной матрицы.
detA = det(L)*det(U)
detA = 27
Решение системы уравнений Ax = b можно получить, решая следующие 2 тре¬
угольные системы уравнений:
у = L\b
х = U\y
Рассмотрим матрицу bucky размера 60x60 и вычислим ее LU-разложение, а также
матрицы перестановок строк и столбцов.
[L,U,P,Q] = lu(bucky);
Проверим, с какой точностью произведение L*U удовлетворяет соотношению
P*bucky*Q = L*U. Для этого сформируем матрицу Z = P*bucky*Q - L*U и вычислим
ее 1-норму.
Z = P*bucky*Q - L*U; nrmZ = norm(Z,l)
nrmZ = 7.9936e-015
Результат свидетельствует о том, что проверяемое соотношение выполняется
с очень высокой точностью.
LU-разложение используется при вычислении определителей, нахождении обрат¬
ных матриц и в решателях систем линейных уравнений.
Программа М-функции lu основана на утилитах пакетов LAP АСК и UMFPACK
[31,39].
Сопутствующие функции'. COND, DET, INV, LUINC, QR, RREF.
472
В. Г. Потемкин. Вычисления в среде MATLAB
QR
QR-разложение
Синтаксис:
Любые матрицы
[Q,R] = qr(A)
[Q,R] = qr(A,0)
Полные матрицы
[Q/R,P] = qr (А)
[Q,R,p] = qr(А,0)
Y = qr(A)
Разреженные матрицы
R = qr(A)
R = qr (A, 0)
[C,R] = qr(A,B)
[C,R] = qr(A,B,0)
Определение:
Разложение матрицы, основанное на М-функции qr, представляет исходную матри¬
цу А как произведение действительной ортонормальной или комплексной унитарной
и верхней треугольной матриц. Исходная матрица может быть в общем случае ком¬
плексной и прямоугольной. Такое разложение носит название QR-разложения.
Описание:
Функция [Q, R] = qr(А) находит QR-разложение для произвольной прямоугольной
матрицы А в виде произведения унитарной матрицы Q и верхней треугольной матри¬
цы R, так что А = Q * R.
Функция [Q, R] = qr(A, 0) находит так называемое экономичное QR-разложение для
произвольной матрицы А размера mxn, когда для случая m > п вычисляется только п
столбцов матрицы Q.
Функция [Q, R, Р] = qr(A) находит разложение для полной прямоугольной матрицы
А в виде трех составляющих - унитарной матрицы Q, верхней треугольной матрицы R
с убывающими по модулю диагональными элементами и матрицы перестановок Р, так
что А * Р = Q * R.
Функция [Q, R, р] = qr(A, 0) формирует экономичное разложение и вектор переста¬
новок р, такой, что выполняется условие Q*R = А(:, р), а элементы вектора
abs(diag(R)) расположены в убывающем порядке.
Функция Y = qr(A) возвращает матрицу Y, являющуюся выходом действительной
DGEQRF или комплексной ZGEQRF утилит пакета LAP АСК [31]. Эта матрица связа¬
на с матрицей R соотношением R = triu(Y).
Функция R = qr(A) для разреженной матрицы А возвращает только верхнюю тре¬
угольную матрицу R, которая является преобразованием Холецкого для произведения
матриц А’*А; в этом случае справедливо следующее соотношение:
R’*R = А' *А.
Применение такого синтаксиса позволяет избежать вычисления матрицы Q, кото¬
рая почти всегда является полной. Кроме того, это позволяет избежать возможной по¬
тери точности при прямом вычислении произведения матриц А'*А.
Функция R = qr(A, 0) позволяет выполнить экономичное разложение для разрежен¬
ной прямоугольной матрицы А размера mxn, когда для случая m > п вычисляется
только п столбцов матрицы R.
Функция [С, R] = qr(A, В) для разреженной матрицы А формирует матрицу С =
= Q'*B без вычисления матрицы Q, преобразуя в процессе работы алгоритма матрицу
В с помощью скрытых от пользователя ортогональных преобразований.
5. Матрицы и линейная алгебра
473
Функция [С, R] = qr(A, В, 0) позволяет выполнить экономичное разложение для па¬
ры разреженных прямоугольных матриц А и В.
Решение системы линейных уравнений А*х = b методом наименьших квадратов
может быть получено без вычисления матрицы Q с помощью следующей последова¬
тельности операторов:
[c,R] = qr(A,b)
х = R\c
Примеры:
Сформируем следующую полную прямоугольную матрицу А размера 3x4, исполь¬
зуя 12 последовательных целых чисел.
х = 1:12;
А =
reshape(х,4,3)
А =
1
5
9
2
6
10
3
7
11
4
8
12
Вычислим QR-разложение, применяя синтаксис, допустимый для любых матриц.
[Q/R] = qr(A)
Q =
-0.18257
-0.8165
0.41203
0.36088
-0.36515
-0.40825
-0.81835
-0.17407
-0.54772
2.7756е-01б
0.40063
-0.73451
-0.7303
0.40825
0.0056997
0.54769
R =
-5.4772
?12.78
-20.083
0
-3.266
-6.532
0
0
4.463е-015
0
0
0
Результатом QR-разложения являются полная матрица Q размера 4x4 и верхняя
треугольная матрица R размера 4x3, произведение которых равно исходной матрице.
Проверим, что это действительно так.
all(all(A-Q*R))==0
ans = 1
Вычислим экономичное QR-разложение, применяя синтаксис, верный для полных
матриц.
[QrR/Pl = qr(A,0)
Q =
-0.42616
-0.71999
0.5375
-0.47351
-0.27529
-0.79518
-0.52087
0.16941
-0.022145
-0.56822
0.61411
0.27982
-21.119
-5.2087
-13.164
0
1.6941
0.84705
0
0
7.1089е-016
3 1
2
474
В. Г. Потемкин. Вычисления в среде MATLAB
В этом случае обе матрицы Q и R являются квадратными размера 3x3 и выполняет¬
ся следующее соотношение:
all(all(А(:,p)-Q*R))==0
ans = 1
Для рассматриваемой матрицы А решим систему уравнений Ах = Ь, если вектор b
равен
Ь = [1357]’;
Поскольку матрица А и вектор b целочисленные, то решение можно представить
в рациональных числах.
Сначала получим решение с помощью решателя СЛАУ.
х = А\Ь
Warning: Rank deficient, rank = 2 tol = 1.8757e-014.
x =
17/8
0
-1/8
Теперь применим QR-разложение в форме. ,
[Q/R/P] = qr(A);
У = Q'*b;
x = R\y;
x = P*x
Warning: Rank deficient, rank = 2 tol = 1.8757e-014.
x =
17/8
0
-1/8
Оба решения полностью совпадают.
Применим решатель для разреженных матриц, объявив матрицу А разреженной.
[c,R]=qr(sparse(A),b);
х = R\c
Warning: Rank deficient, rank = 2
x =
17/8
0
-1/8
В этом случае формируется предупреждение в другой форме.
Сопутствующие функции'. LU, NULL, ORTH, QRDELETE, QRINSERT, QRUPDATE.
QRDELETE | QR-разложение при удалении строки или столбца
Синтаксис:
[Q,R] = qrdelete(Q,R,j)
[Q1,R1] = qrdelete(Q,R,j,’col')
[Q1,R1] = qrdelete(Q,R,j,'row')
5. Матрицы и линейная алгебра
475
Описание:
Функция [Q, R] = qrdelete(Q, R, j) позволяет модифицировать известное QR-разло-
жение для матрицы А, когда из нее удаляется столбец с номером j.
Функция [Q1, Rl] = qrdelete(Q, R, j, 'соГ) равносильна функции qrdelete(Q, R,j).
Функция [Q1, Rl] = qrdelete(Q, R, j, row’) позволяет модифицировать известное QR-
разложение для матрицы А, когда из нее удаляется строка с номером].
Примеры:
Сформируем следующую полную прямоугольную матрицу А размера 3x4 и вычис¬
лим ее QR-разложение.
х = 1:12; А =
reshape(х,4,3)
[Q/R] = qr(A)
А =
1 5
9
2 6
10
3 7
11
4 8
12
Q =
-0.18257
-0.8165
0.41203
0.36088
-0.36515
-0.40825
-0.81835
-0.17407
-0.54772
2.7756е-016
0.40063
-0.73451
-0.7303
0.40825
0.0056997
0.54769
R =
-5.4772
-12.78
-20.083
0
-3.266
-6.532
0
0
4.463е-015
0
0
0
Удалим из матрицы А второй столбец и пересчитаем QR-разложение, не вычисляя
его заново и не изменяя матрицу А.
[Q1,R1] = qrdelete(Q,R,2)
QI =
-0.18257
0.8165
-0.41203
0.36088
-0.36515
0.40825
0.81835
-0.17407
-0.54772
-3.8233е-018
-0.40063
-0.73451
-0.7303
-0.40825
-0.0056997
0.54769
-5.4772
0
0
0
-20.083
6.532
0
Rl
0
При удалении столбца размер матрицы Q остался прежним - 4x4, а матрицы R стал
равным 4x2.
Теперь, не изменяя матрицы А, вычислим QR-разложение, как если бы мы удалили
из нее вторую строку.
[Q1,R1] = qrdelete(QrR/2,1 row1)
0.19612
0.94346
-0.26726
0.58835
0.10483
0.80178
0.78446
-0.31449
-0.53452
476
В. Г. Потемкин. Вычисления в среде MATLAB
R1 =
5.099
11.375
17.65
0
2.9352
5.8704
0
0
9.2854е-016
При удалении строки размеры матриц Q и R стали равными 3x3.
Сопутствующие функции: PLANEROT, QR, QRINSERT, QRUPDATE.
QRINSERT I QR-разложение при добавлении строки или столбца
Синтаксис:
LQ/R] = qrinsert(Q,R,j,х)
[Q1,R1] = qrinsert(Q,R,j,х,'col')
[Q1,R1] = qrinsert (Q,'R, j , x, ' row')
Описание:
Функция [Q, R] = qrinsert(Q, R, j, x) позволяет модифицировать ранее вычисленное
QR-разложение для матрицы А, когда перед столбцом с номером j в матрице А добав¬
ляется дополнительный столбец х. Если указать] = п+1, где п - число столбцов матри¬
цы А, то дополнительный столбец х будет п+1-м столбцом матрицы.
Примеры:
Сформируем следующую полную прямоугольную матрицу А размера 3x4 и вычис¬
лим ее QR-разложение.
х = 1:12; А =
reshape(х,4,3)
[Q/R] = qr(A)
А =
1 5
9
2 6
10
3 7
11
4 8
12
Q =
• -0.18257
-0.8165
0.41203
0.36088
-0.36515
-0.40825
-0.81835
-0.17407
-0.54772
2.7756е-016
0.40063
-0.73451
-0.7303
0.40825
0.0056997
0.54769
R =
-5.4772
-12.78
-20.083
0
-3.266
-6.532
0
0
4.463е-015
0
0
0
-
Поставим второй столбец матрицы А на место третьего и пересчитаем QR-
разложение, не вычисляя его заново и не изменяя матрицу А.
[Q1,R1] = qrinsert (Q,R, 3,А(2) )
Q1 =
-0.18257
-0.8165
0.41203
0.36088
-0.36515
-0.40825
-0.81835
-0.17407
-0.54772
2.7756е-016
0.40063
-0.73451
-0.7303
0.40825
0.0056997
0.54769
5. Матрицы и линейная алгебра
477
R1
-5.4772
-12.78
-12.78
-20.083
0
-3.266
-3.266
-6.532
0
0
2.2204е-015
4.463е-015
0
0
0
0
При добавлении столбца размер матрицы Q остался равным 4x4, а матрицы R уве¬
личился до 4x4.
Теперь, не изменяя матрицы А, вычислим ее QR-разложение, как если бы мы по¬
ставили вторую строку матрицы А на место третьей.
[Q1/R1] = qrinsert (Q, R, 3, А(2, :), * row')
Q1 =
0.1715
0.73994
0.51255
0.17359
0.36088
0.343
0.33634
-0.66304
0.54709
-0.17407
0.343
0.33634
-0.32434
-0.81488
0
0.5145
-0.067267
0.43709
0.014825
-0.73451
0.68599
-0.47087
0.037729
0.079381
0.54769
R1 =
5.831
14.063
22.295
0
3.4979
6.9958
0
0
4.8036е-015
0
0
0
0
0
0
При добавлении строки размер матрицы Q стал равным 5x5, а матрицы R - 5x4.
Сопутствующие функции’. PLANEROT, QR, QRDELETE, QRUPDATE.
QRUPDATE I QR-разложение модифицированной матрицы
Синтаксис:
[Q1,R1] = qrupdate(Q,R,u,v)
Описание:
Функция [QI, Rl] = qrupdate(Q, R, u, v), где [Q, R] = qr(A) - QR-разложение исход¬
ной матрицы А, возвращает QR-разложение модифицированной матрицы А + u*v’, где
и и v - векторы-столбцы. Эта функция может применяться только для полных матриц.
Пример:
Сформируем матрицу, которая позволяет увидеть проблемы, возникающие при
формировании произведения А’*А [49].
mu = sqrt(eps); А = [ones (1,4); пш*еуе(4)]
А =
1
1
1
1
1.4901е-008
0
0
0
0
1.4901е-008
0
0
0
0 1.
4901е-008
0
0
0
0 1.
,4901е-008
Вычислим матрицу А'*А:
478
В. Г. Потемкин. Вычисления в среде MATLAB
AtА = A'*A
AtA =
1
1
1
1
111
111
111
111
Это матрица, в которой потеряна информация о величине eps; проследим за свой¬
ствами верхней треугольной матрицы R в QR-разложении.
[QtrRt] = qr(AtA); Rt
Rt =
-2 -2 -2 -2
О 2.2204e-016 2.2204e-016 0
0 0 -4.9651e-016 -9.9301e-017
000 1.986e-016
Все элементы этой матрицы, исключая первую строку, имеют величину порядка
0(н2).
Обратимся к QR-разложению исходной матрицы А и воспользуемся функцией, вы¬
числяющей сразу матрицу R.
R = full(qr(sparse(А)))
R =
1
1
1
1
0
-2.1073е-008
-1.0537е-008
-1.0537е-008
0
0
-1.825е-008
-б.0834е-009
0
0
0
1.7206е-008
0
0
0
0
Все элементы этой матрицы, исключая первую строку, имеют величину порядка
(9(ц). Это существенно отличается от предыдущего результата.
Теперь вычислим QR-разложение рассмотренной выше матрицы А, модифициро¬
ванной матрицей ранга 1, которая формируется с помощью вектор-столбцов и и v:
и = [-1 0 0 0 0]'; v = ones(4,1);
Для вычислений воспользуемся прямым методом и сравним с результатом проце¬
дуры qrupdate.
[QTZRT] = qr(A+u*v’)
QT =
0
0
0
0
1
-1
0
0
0
0
0
-1
0
0
0
0
0
-1
0
0
0
0
0
-1
0
RT =
-1.4901е-
■008
0
0
0
0
-1.4901е-
-008
0
0
0
0
-1.4901е-008
0
0
0
0
-1.4901е-008
0
0
0
0
5. Матрицы и линейная алгебра
479
[Ql/Rl] = qrupdateCQ/R/UzV)
QI =
-2.2352e-008 -1.4901e-008 -1.4901e-008 -1.4901e-008 1
1 -3.3307e-016 -3.3307e-016 -3.0531e-016 2.2352e-008
-1.6653e-016 1 -2.2204e-016 -1.6653e-016 1.4901e-008
-2.7477e-016 -2.7477e-016 1
ООО
Rl =
1.4901е-008
1.6544е-024
0
1.4901е-008
0
0
0
0
0
0
-1.6653е-016
1
1.4901е-008
1.4901е-008
3.3087е-024
3.3 О87е-024
-3.6734е-040
-3.6734е-О40
1.4901е-008
-1.6544е-024
0
1.4901е-008
0
0
Следует отметить, что оба разложения являются правильными, но отличаются один
от другого знаками, а также значениями малых внедиагональных элементов.
Сопутствующие функции: CHOLUPDATE, QR.
PINV | Псевдообращение матрицы по Муру-Пенроузу
Синтаксис:
Р = pinv(A)
Р = pinv(Aztol)
Определение:
Матрица Р называется псевдообратной по Муру-Пенроузу, если она имеет такие же
размеры, как и матрица 'Alt+', и удовлетворяет следующим условиям [1]:
А*В*А = А;
В*А*В = В;
А*В - эрмитова матрица;
В*А - эрмитова матрица.
Вычисление матрицы Р основано на использовании М-функции svd и приравнива¬
нии к нулю всех сингулярных чисел, меньших величины tol, которая по умолчанию
принимается равной
tol = max(size(А))*norm(A)*eps.
Описание:
Функция Р = pinv(A) вычисляет матрицу Р, псевдообратную матрице А.
Функция Р = pinv(A, tol) позволяет пользователю самому назначить порог tol.
Если матрица А квадратная и невырожденная, то вычисление обратной матрицы
с использованием процедуры псевдообращения является слишком расточительной
процедурой. Если А - квадратная и вырожденная или прямоугольная матрица,
то обратной матрицы в обычном смысле не существует; в этих случаях псевдообрат-
ная матрица, построенная по правилам Мура-Пенроуза, обладает некоторыми,
но не всеми свойствами обратной.
Если А имеет строк больше, чем столбцов, и не является матрицей полного ранга,
то возникает переопределенная задача наименьших квадратов
480
В. Г. Потемкин. Вычисления в среде MATLAB
min norm(A*x-b).
Вектор x минимизирует указанную норму тогда и только тогда, когда х имеет вид
х = pinv(A)*b+(I-pinv(А)*А)*z
для некоторого z.
В системе MATLAB из множества решений используются только два следующих:
х = pinv(A)*b;
у = А\Ь.
Эти решения характеризуются следующими свойствами: решение х имеет норму
погт(х), которая минимальна в сравнении с нормой любого другого решения; решение
у имеет минимальное количество ненулевых компонентов.
Пример:
Рассмотрим квадратную сингулярную магическую матрицу порядка 8.
А = magic(8); const = trace(А), г = rank(А)
const = 260
г = 3
Константа этой магической матрицы равна 260, а ее ранг - 3.
Попробуем решить систему линейных уравнений, определяемую матрицей А
и вектором b вида
b = const*ones(8r1); bt = b1
bt = 260 260 260 260 260 260 260 260
с помощью решателя СЛАУ.
У = A\b; yt = у1
Warning: Matrix is singular to working precision,
yt = Inf Inf Inf Inf Inf Inf Inf Inf
Полученный результат не имеет практического смысла, и следует обратиться
к процедуре псевдообращения
х = pinv(A)*b; xt = х1
xt = 1 1 1 1 1 1 1 1
В этом случае результат соответствует вектору из 1.
Выделим из магической матрицы прямоугольный блок размера 8 х 7 и решим сис¬
тему {А, Ь}, используя процедуру псевдообращения и решатель СЛАУ.
А = А(:,1:7);
х = pinv(A)*b; xt = х1
у = A\b; yt = у1
xt = 0.90909 1.4545 1.2727 1.4545 1.6364 0.72727 0.54545
yt = 4 4.8 0 0 0 0 -0.8
Действительно, оба решения удовлетворяют исходному уравнению:
all(all(А*х-Ь))==0
all(all(А*у-Ь))==0
ans = 1
ans = 1
Сопутствующие функции: RANK, INV, SVD, QR.
5. Матрицы и линейная алгебра 481
16 т. Зак. 3375
LSQNONNEG I Метод наименьших квадратов с ограничениями
Синтаксис:
х = lsqnonneg(А,Ь)
х = lsqnonneg(А,Ь,хО)
х = lsqnonneg(А,Ь,хО,options)
[xzresnorm] = lsqnonneg(...)
[х,resnorm,residual] = lsqnonneg(...)
[x7resnorm,residual,exitflag] = lsqnonneg(...)
[x,resnorm,residual,exitflag,output] = lsqnonneg(...)
[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(...)
Определение:
Решение СЛАУ на основе метода наименьших квадратов связано с постановкой
следующей оптимизационной задачи: найти минимум следующего функционала для
неотрицательных значений переменной х
min—1| А*х-Ь||г, х>0.
х 2
Эта М-функция загружена в ядро системы MATLAB из ППП Optimization Toolbox.
Описание:
Функция х = lsqnonneg(A, b) находит неотрицательные решения xj > 0, j = 1,...,п
для СЛАУ Ах = Ь, где А и b - действительные матрица и вектор.
Функция х = lsqnonneg(C, d, хО) позволяет задать начальное приближение вектора
хО с неотрицательными элементами. Если это условие не выполняется, используется
значение пустого вектора, принятое по умолчанию.
Функция х = lsqnonneg(A, b, хО, options) позволяет управлять параметрами проце¬
дуры оптимизации с помощью массива записей options, который можно задать с по¬
мощью М-функции optimset. Рассматриваемый оператор использует только следую¬
щие 2 поля массива options:
Параметр
Назначение
Display:[off|iter|notify|final]
'off - вывод на экран подавлен;
'final' - выводится только окончательный результат;
'notify' - выводится информация, если процедура
оптимизации не сходится, по умолчанию
TolX:[positive scalar]
Порог завершения прщедуры по переменной х
Функция [х, resnorm] = lsqnonneg(...) возвращает значение квадрата нормы невязки:
norm(А*х-Ь)л2.
Функция [х, resnorm, residual] = lsqnonneg(...) возвращает дополнительно значение
самой невязки:
А*х-Ь.
Функция [х, resnorm, residual, exitflag] = lsqnonneg(...) возвращает значение флажка
exitflag, который может принимать следующие значения:
482
В. Г. Потемкин. Вычисления в среде MATLAB
Аргумент exitflag
Назначение
>0
Функция сходится к решению
0
Превышено предельное количество итераций. Можно увеличить
значение порога завершения То1Х
Функция [x, resnorm, residual, exitflag, output] = lsqnonneg(...) возвращает массив за¬
писей output, содержащий следующие поля:
Поле
Назначение
output.algori thm
Примененный алгоритм
output.iterations
Количество использованных итераций
Функция [х, resnorm, residual, exitflag, output, lambda] = lsqnonneg(...) возвращает
вектор множителей Лагранжа lambda со следующими значениями:
lambda
Решение x
lambda(i) <0
x(i) « 0
lambda(i) ~ 0
x(i) > 0
Алгоритм:
М-функция lsqnonneg реализует алгоритм, описанный в работе [63]. Алгоритм
стартует с некоторого допустимого набора базисных векторов и вычисляет соответст¬
вующие им множители Лагранжа lambda. Затем выбирается базисный вектор, соответ¬
ствующий максимальному значению lambda, и процедура продолжается до тех пор,
пока не будет выполнено условие lambda < 0.
Пример:
Сравним решения задачи наименьших квадратов с ограничениями и без них. Пусть
задана следующая система уравнений, описываемая парой {А, Ь}:
[
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 lsqnonneg(А,Ь)]
res = [norm(A* (A\b)-b) norm(A*lsqnonneg(А,Ь) -Ь) ]
х =
-2.5627
0
3.1108
0.69293
res = 0.66744
0.91184
Как следует из полученных решений, невязка для решения без ограничений мень¬
ше, но при этом один из компонентов вектора х отрицателен.
Получим максимально возможную информацию о процедуре оптимизации:
5. Матрицы и линейная алгебра
483
[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(A,b)
x =
0
0.69293
resnorm = 0.83146
residual =
0.6599
-0.31187
-0.35804
0.41296
exitflag = 1
output =
iterations: 1
algorithm: 'active-set using svd'
lambda =
-0.15061
-1.6653e-016
Предлагаем читателю самостоятельно проанализировать информацию о применен¬
ной процедуре.
Сопутствующие функции'. LSCOV, OPTIMSET, \.
LSCOV I Метод наименьших квадратов в присутствии возмущений
Синтаксис:
х = lscov(A,b,V)
[x,dx] = lscov(A,b,V)
Определение:
Требуется решить систему уравнений
Ах = b + v
при наличии аддитивной составляющей в виде случайного вектора возмущений v с из¬
вестной матрицей ковариаций V.
Эта задача равносильна следующей проблеме минимизации квадратичной формы:
min(A * х - b) ’inv( V)(A * х - b)
X
и ее решение имеет вид [1, 90]:
х = inv(A'*inv(V)*А)*А'*inv(V)*b.
Реально алгоритм построен так, что обращения матрицы V не выполняются.
Описание:
Функция х = lscov(A, b, V) возвращает решение х для задачи минимизации при
наличии возмущений, которая задана векторно-матричной тройкой {A, b, V}.
Функция [х, dx] = lscov(A, b, V) возвращает в векторе dx стандартные отклонения
для решения х, которые вычисляются по формулам
mse = В ' * ( inv (V) -inv (V) *A*inv (А' *inv (V) *А) *А' *inv (V) ) *В. / (m-n)
dx = sqrt(diag(inv(A'*inv(V)*A)*mse)).
484
В. Г. Потемкин. Вычисления в среде MATLAB
Пример:
Определим задачу минимизации при наличии возмущений векторно-матричной
тройкой {A, b, V}.
[
b =[
0.0372
0.2869;
0.8587;
0.6861
0.7071;
0.1781;
0.6233
0.6245;
0.0747;
0.6344
0.8405];
0.6170];
Сформируем матрицу ковариаций V для возмущения в виде случайного белого
шума с заданной интенсивностью V0 на основе статистически состоятельной выборки
из 10 000 реализаций.
V0 = 1е-3;
X = randn(10000,4)*sqrt(V0);
V = соу(Х);
Сценарий для построения графиков влияния случайного возмущения на решения
СЛАУ представлен на рис. 5.82. *
% Оценка влияния интенсивности возмущения на решения СЛАУ вида
% Ах = b + v
А =[0.0372
0.7071;
0.6233
0.6344
b =[0.8587;
0.1781;
0.0747;
0.8405];
0.2869;
0.6245;
0.6170];
i=l;
for k = -0.5:0.02:2
X = randn(10000,4)*sqrt(10л(-k)); % Формирование выборки
V = cov(X); % Вычисление матрицы ковариаций
[x,ddx] = lscov(A,b,V); % Решение СЛАУ
mx{i} = х;
i = i+1;
end
mmx = cat(2,mx{:});
k=10.л(0.5:-0.02:-2);
% Построение графиков
figure(l), semilogx(k',mmx(1,:)')
figure(2), semilogx(k',mmx(2,:)')
рис. 5.82
5. Матрицы и линейная алгебра
485
Напомним, что решение этой СЛАУ в отсутствие возмущений имеет вид:
х = А\Ь
х =
-2.5627
3.1108
Влияние интенсивности возмущения в виде случайного белого шума представлено
на графиках (рис. 5.83).
а
б
рис. 5.83
На рис. 5.83, а показано влияние возмущения на переменную хь Из анализа полу¬
ченных результатов следует, что при интенсивности возмущения менее 0.01 его влия¬
ние отсутствует и решение стабилизируется вблизи математического ожидания, рав¬
ного -2.56, что с точностью до второго знака совпадает с ранее полученным решением.
Влияние возмущения становится существенным, если его интенсивность превышает 1.
На рис. 5.83, б показано влияние возмущения на переменную хь Здесь справедливы
те же выводы: решение стабилизируется вблизи математического ожидания, равного
3.108, что с точностью до второго знака совпадает с ранее полученным решением.
Влияние возмущения становится существенным, если его интенсивность превышает 1.
Сопутствующие функции: LSQNONNEG, QR, \.
5.5. Вычисление собственных значений и сингулярных
чисел
EIG, CDF2RDF |
Собственные значения и собственные векторы матрицы
Синтаксис:
d = eig(А)
[R,D] = eig(A)
d = eig(A,B)
[V,D] = eig(A,B)
[R,D] = eig(А, 1 nobalance') [V,D] = eig(А,В,flag)
[R,D] = cdf2rdf(R,D)
486
В. Г. Потемкин. Вычисления в среде MATLAB
Определение:
Проблема собственных значений состоит в нахождении, нетривиальных решений
системы уравнений, которая может быть интерпретирована как алгебраический экви¬
валент системы ОДУ в явной форме Коши:
Аг = Лг,
где А - квадратная матрица порядка п;
г - вектор-столбец размера 1хп, называемый собственным вектором;
Л - скаляр, называемый собственным значением.
Обобщенная проблема собственных значений состоит в нахождении нетривиаль¬
ных решений системы уравнений
Аг = ХВг,
где А, В - квадратные матрицы порядка п;
г - вектор-столбец размера 1 х п, называемый обобщенным собственным вектором;
Л - скаляр, называемый обобщенным собственным значением.
Если В - невырожденная матрица, то систему можно рассматривать как алгебраи¬
ческий эквивалент системы ОДУ в неявной форме Коши, а задача может быть сведена
к обычной проблеме собственных значений
ВАг = Лг.
В случае, когда В - вырожденная матрица, система уравнений представляет собой
смешанную систему дифференциальных и алгебраических уравнений и для ее реше¬
ния необходимо применять специальные методы.
Описание:
Полная проблема собственных значений
Функция d = eig(A) вычисляет собственные значения матрицы А.
Функция [R, D] = eig(A) вычисляет диагональную матрицу D собственных значе¬
ний и матрицу R правых собственных векторов, удовлетворяющих соотношению
А * R = R * D. Эти векторы нормированы так, что норма каждого из них равна единице.
Левые собственные векторы могут быть найдены следующим образом:
[L,D] = eig(A').
Матрицы собственных значений D для А и А’ содержат одни и те же собственные
значения, хотя порядок их следования может быть различен. Матрица, левых собст¬
венных векторов удовлетворяет соотношению
A’*L = L*D.
Для согласования независимо найденных систем правых и левых собственных век¬
торов систему левых векторов необходимо нормировать так, чтобы соблюдалось условие
L*R = eye(n,n).
Функция [R, D] = eig(A, 'nobalance’) вычисляет собственные значения и собствен¬
ные векторы без предварительного масштабирования матрицы. Обычно масштабиро¬
вание улучшает обусловленность матрицы, гарантируя большую точность вычисле¬
ний. Однако когда матрица содержит очень малые по величине элементы, которые
5. Матрицы и линейная алгебра
487
находятся в пределах ошибок округления, масштабирование может сделать их срав¬
нимыми с другими элементами матрицы, что может привести к неправильным
результатам.
Функция [R, D] = cdf2rdf(R, D) преобразовывает комплексные выходы М-функции
eig в действительные. При этом комплексные собственные значения преобразовыва¬
ются в блоки размера 2 х 2, а комплексная матрица правых собственных векторов R -
в действительную матрицу, столбцы которой, соответствующие действительным соб¬
ственным значениям, сохраняются, а соответствующие комплексным - расщепляются
на два: [Re(ri) Im(ri)].
Обобщенная проблема собственных значений
Функция d = eig(A, В) вычисляет обобщенные собственные значения матрицы А.
Функция [R, D] = eig(A, В) вычисляет диагональную матрицу D обобщенных соб¬
ственных значений и матрицу R правых обобщенных собственных векторов, удовле¬
творяющих соотношению
A*R = B*R*D.
Векторы нормированы так, что норма каждого из них равна единице.
Функция [R, D] = eig(A, В, flag) позволяет задать алгоритм решения обобщенной
проблемы собственных значений с помощью аргумента flag, который может прини¬
мать следующие значения:
Аргумент flag
Назначение алгоритма
'chol'
Решает обобщенную проблему собственных значений {А, В}, выполняя
разложение Холецкого матрицы В. Используется по умолчанию для
случая симметрической (эрмитовой) матрицы А и симметрической (эр¬
митовой) положительно определнной матрицы В
’qz’
Этот алгоритм не учитывает симметрию матриц и предназначен для не¬
симметрических (неэрмитовых) матриц {А, В}
Примечание:
При применении М-функции eig(А) собственные векторы нормируются к 1.
. При применении М-функций eig(A, В), eig(A, 'nobalance’), eig(A, В, flag) собствен¬
ные векторы не нормируются.
Примеры:
Рассмотрим матрицу порядка 3 с одним действительным и парой комплексно¬
сопряженных собственных значений и выполним вычисления с использованием ком¬
плексных матриц.
Вычисления с использованием комплексных матриц
А =[ 2
-2
-0.6667;
0.6667
2
-2;
0.4
0.6667
2]
[R,D] = eig(А)
■R —
Г\. —
0.73602
0.73602
0.88268
0.15846 -
0.57788i
0.15846 +
0.57788i
-0.30441
-0.24392 -
0.19929i
-0.24392 +
0.19929i
0.35806
488
В. Г. Потемкин. Вычисления в среде MATLAB
D =
1.7904 +
1.7508i
0
0
0
1.7904 -
1.7508i
0
0
0
2.4193
[L,D] = eig(A')
L =
-0.24392 -
0.19929i
-0.24392 +
0.19929i
0.35806
0.15846 -
0.577881
0.15846 +
0.57788i
-0.30441
0.73602
0.73602
0.88268
D =
1.7904 +
1.7508i
0
0
0
1.7904 -
1.7508i
0
0
0
2.4193
Нормируем матрицу L так, чтобы выполнялось условие L'*R=I. Для этого вычис¬
лим матрицу Т= L'R, сформируем новую матрицу L = L*inv(T') и проверим справедли¬
вость выполнения соотношений L'*A*R -Эи R'*A'*L - D' в арифметике с плавающей
точкой при значении tol = 1е-14.
L = L*inv(R'*L);
all(all(abs(L'*A*R-D)<le-14)j
all(all(abs(R‘*A**L-D')<le-14))
ans = 1
ans = 1
Применяя функцию cdf2rdf, результат можно представить, используя только дейст¬
вительные матрицы, что позволяет более экономно расходовать память.
A =[
2
-2
-0.6667;
0.6667
2
-2;
0.4
0.6667
2]
Вычислим матрицу R правых собственных векторов.
[R,D]
= eig(A);
[R/D]
= cdf2rdf(R,
D)
R =
0.73602
0
0.88268
0.15846
-0.57788
-0.30441
-0.24392
-0.19929
0.35806
D =
1.7904
1.7508
0
-1.7508
1.7904
0
0
0
2.4193
Вычислим матрицу L левых собственных векторов.
[L,D] = eig(A');
[L,D] = cdf2rdf(L,D)
L =
-0.24392
-0.19929
0.35806
0.15846
-0.57788
-0.30441
0.73602
0
0.88268
1.7904
1.7508
0
-1.7508
1.7904
0
0
0
2.4193
5. Матрицы и линейная алгебра
489
Нормируем матрицу L и проверим справедливость выполнения соотношений
L’*a*R - D и R'*A'*L - D’ в арифметике с плавающей точкой при значении tol = 1 е-14.
L = L*inv(R’*L);
all(all(abs(L1*A*R-D)<le-14))
all(all(abs(R1*A'*L-D')<le-14))
ans = 1
ans = 1
Рассмотрим матрицу порядка 4, которая содержит элементы, сравнимые с ошибка¬
ми округления eps, и покажем, что в этом случае масштабирование приводит к значи¬
тельным ошибкам, а поэтому его следует принудительно избегать.
eps = eps
eps = 2.2204е-016
А =[ 3
-2
-0.9
2*eps
-2
4
-1
-eps;
-eps/4
eps/2
-1
0;
-0.5
-0.5
0.1
И
А =
3
-2
-0.9
4.4409е-016
-2
4
-1
-2.2204е-016
-5.5511е-
017 ’
1.1102е-
■016
-1
0
-0.5
-0.5
0.1
1
Результаты с масштабированием
Результаты без масштабирования
[R,D] = eig(A); D
[Rnb,Dnb] =
eig(A,'nobalance
1' ) ; Dnb
D =
Dnb =
5.5616
0
0
0
5.5616
0
0
0
0
1.4384
0
0
0
1.4384
0
0
0
0
1
0
0
0
1
0
0
0
0
■1
0
0
0
1
norm(A*R -
R*D)
norm(A*Rnb
- Rnb*Dnb)
ans =
0.52156
ans = 5.4571e-015
Как следует из этого примера, собственные значения в обоих случаях вычислены
правильно, но нормы невязок различаются очень существенно, что свидетельствует
о том, что собственные векторы в первом случае вычисляются с большой погрешно¬
стью.
Алгоритм:
Для решения полной и обобщенных проблем на собственные значения в системе
MATLAB, начиная с версии 6.0, используются утилиты пакета LAP АСК [31].
Сопутствующие функции'. BALANCE, CONDEIG, EIGS, HESS, QZ, SCHUR.
CONDEIG I Число обусловленности задачи на собственные значения
Синтаксис:
s = condeig(A)
[R,D,s] = condeig(A)
490
В. Г. Потемкин. Вычисления в среде MATLAB
Описание:
Функция s = condeig(A) вычисляет вектор чисел обусловленности задачи на собст¬
венные значения для матрицы А. Эти числа определяются как обратные значения ко¬
синусов углов между левыми и правыми собственными векторами, соответствующими
некоторому собственному значению.
Функция [R, D, s] = condeig(A) эквивалентна последовательности двух операторов:
[R,D] = eig(A);
s = condeig(А);.
Большие по величине числа обусловленности означают, что матрица А имеет соб¬
ственные значения, близкие к кратным.
Сопутствующие функции'. BALANCE, COND, EIG.
BALANCE | Масштабирование матрицы
Синтаксис:
В = balance(А)
[D,B] = balance(А)
Определение:
Несимметрические матрицы могут проявлять плохую обусловленность при вычис¬
лении их собственных значений. Малые возмущения элементов матрицы, такие, как
ошибки округления, могут вызывать значительные погрешности в собственных значе¬
ниях. Величина, связывающая погрешность вычисления собственных значений с по¬
грешностью исходных данных, называется числом обусловленности задачи на собст¬
венные значения и вычисляется следующим образом:
кН = cond(R) = norm(R)*norm(inv(R)),
где [R, D] = eig(A).
Цель масштабирования - перевести плохую обусловленность матрицы собствен¬
ных векторов в диагональное масштабирование. Масштабирование не может превра¬
тить несимметрическую матрицу в симметрическую, но делается попытка выравнять
нормы строк и соответствующих столбцов. Поскольку масштабирование реализуется
введением множителей, которые являются степенями основания 2, то никаких ошибок
округления при этом не привносится.
Описание:
Функция В = balance(A) возвращает масштабированную матрицу.
Функция [D, В] = balance(A), кроме масштабированной матрицы, возвращает также
диагональную матрицу D, элементы которой являются степенями основания 2; матри¬
ца В - это результат преобразования подобия
В = D\A*D.
Функция eig(A) автоматически масштабирует А перед вычислением собственных
значений D. Масштабирование можно подавить, если использовать обращение вида
eig(A, 'nobalance’).
5. Матрицы и линейная алгебра
491
Пример:
Рассмотрим матрицу порядка 3, которая имеет большой разброс величин элемен¬
тов - большие величины наддиагональных - и малые - поддиагональных элементов.
А =[ 1 100 10000;
0.01 1 100;
0.0001 0.01 1]
Вычислим собственные значения и векторы матрицы А
[RA,DA] = eig(A,еуе(З)), kRA = cond(RA)
RA =
1
-0.005
-5е-005
DA =
3.3307е-016
0
0
kRA = 6672.7
1 0.034992
0.01 -1
0001 0.0099965
0 0
3 0
0 0
Матрица собственных векторов плохо обусловлена.
Выполним масштабирование матрицы А.
[D,B] = balance(A), kD = cond(D)
D =
2048
0
0
0
32
0
0
0
0.25
1
1.56-25
1.2207
0.64
1
0.78125
8192
1.28
1
kD = 8192
После масштабирования значения элементов матрицы В оказались выравненными
по величине, а число обусловленности диагональной матрицы преобразования
равно 213.
Вычислим собственные значения и векторы матрицы масштабированной мат¬
рицы В.
[RB,DB] = eig (В, eye (3)), kRB = cond(RB)
RB =
1 1
-0.32 0.64
-0.4096 0.8192
DB =
1.1102e-016 0
0 3
0 0
0.095075
-0.8421
1
0
0
0
kRB = 1.5599
Матрица собственных векторов очень хорошо обусловлена. Плохая обусловлен¬
ность сконцентрирована в диагональной матрице масштабирования D.
492
В. Г. Потемкин. Вычисления в среде MATLAB
Алгоритм:
Функция balance является встроенной функцией системы MATLAB и использует
утилиты пакета LAP АСК [31].
Диагностические сообщения:
Если матрица не является квадратной, выдается сообщение
Matrix must be square.
Матрица должна быть квадратной.
Замечание:
М-функция eig(A) автоматически масштабирует матрицу А перед тем, как начать
вычисление собственных значений. Для того чтобы предотвратить такое масштабиро¬
вание следует вызывать функцию следующим образом: eig(A, 'nobalance').
В поставке системы MATLAB Version 6.5.0.180913а (R13) обнаружена несостоя¬
тельность работы М-функции eig(A). Можно обойти эту ошибку, если вызывать М-
функцию не с одним, а с двумя аргументами - в форме eig(A, eye(size(A)).
Ограничения:
Обычно масштабирование улучшает обусловленность матрицы, гарантируя боль¬
шую точность вычислений. Однако когда матрица содержит очень малые по величине
элементы, которые находятся в пределах ошибок округления, масштабирование может
сделать их сравнимыми с другими элементами матрицы, что может привести к непра¬
вильным результатам.
Замеченная ошибка:
В поставке системы MATLAB Version 6.5.0.180913а (R13) обнаружена несостоя¬
тельность работы М-функции eig(A) в сочетании с М-функцией balance в вышеприве¬
денном примере. Можно обойти эту ошибку, если вызывать М-функцию не с одним,
а с двумя аргументами в форме eig(A, eye(size(A)).
Сопутствующая функция - EIG.
PLANEROT ~|
Преобразование Гивенса
Синтаксис:
[G,y] = planerot(х)
Описание:
Функция [G, у] = planerot(x), где х - вектор-столбец из двух компонентов, возвра¬
щает ортогональную матрицу G порядка 2 со следующими свойствами:
у = Gx;
У(2) = 0.
Преобразование Гивенса применяется для исключения элементов матрицы с целью
ее приведения к более простой форме (Хессенберга, трехдиагональной и т. п.).
5. Матрицы и линейная алгебра
493
Пример:
Сформируем ортогональную матрицу Гивенса и убедимся, что выполняются пере¬
численные выше свойства.
х = [3 4] ;
[G/У] = planerot(х')
G =
0.6000 0.8000
-0.8000 0.6000
У =
5
0
Сопутствующие функции'. QRDELETE, QRINSERT.
HESS I Приведение к форме Хессенберга
Синтаксис:
Н - hess(A)
[Р, Н] = hess(A)
Определение:
Матрицей Хессенберга называется матрица, нулевые элементы которой располо¬
жены либо ниже первой поддиагонали, либо выше первой наддиагонали. Первая фор¬
ма называется верхней формой Хессенберга, а вторая - нижней формой Хессенберга.
Если матрица симметрическая или эрмитова, то она является трехдиагональной. Мат¬
рица Хессенберга имеет те же собственные значения, что и исходная плотная матрица,
но требуется существенно меньше работы для их вычисления.
Описание:
Функция Н = hess(A) возвращает матрицу в верхней форме Хессенберга.
Функция [Р, Н] = hess(A), кроме матрицы в верхней форме Хессенберга, возвраща¬
ет также унитарную матрицу преобразований Р, которая удовлетворяет следующим
условиям:
А = Р*Н*Р,
Р'*Р = eye(size(А)).
Пример:
Рассмотрим приведение матрицы А = magic(5) размера 5 х 5 к верхней форме Хес¬
сенберга.
А = magic(5), Н = hess(A)
А =
17
24
1
8
15
23
5
7
14
16
4
6
13
20
22
10
12
19
21
3
11
18
25
2
9
494
В. Г. Потемкин. Вычисления в среде MATLAB
н =
17
-28.941
1.847
-4.4603
2.2572
-27.677
33
.94
26.187
-2.228
1.2675
0
25.096
20.687
-6.6055
-0.1973
0
0
-5.963
-16.816
-12.445
0
0
0
-9.0122
10.189
А =
Н
=
17
24 1
8
15
17
-28.941
1.847 -4.4603
2.2572
23
5 7
14
16
27.
.677 33.94
26.187 -2.228
1.2675
4
6 13
20
22
0
25.096
20.687 -6.6055
-0.1973
10
12 19
21
3
0
0
-5.963 -16.816
-12.445
11
18 25
2
9
0
0
0 -9.0122
10.189
Алгоритм:
Реализация М-функции hess основана на применении утилит пакета LAP АСК [31].
Сопутствующие функции'. EIG, QZ, SCHUR.
SCHUR, RSF2CSF |
Приведение к форме Шура
Синтаксис:
Т = schur(А)
Т = schur(Azflag)
[U,T] = schur(А,...)
[U,T] = rsf2csf(U,T)
Определение:
Комплексная верхняя треугольная матрица с собственными значениями на диаго¬
нали называется комплексной формой Шура. Действительная матрица в форме Хес-
сенберга, которая содержит на диагонали действительные собственные значения,
а комплексные представлены в виде блоков размера 2x2, частично занимая первую
поддиагональ, называется действительной формой Шура.
Описание:
Функция Т = schur(A) возвращает матрицу в форме Шура.
Функция Т = schur(A, flag) возвращает для действительных матриц А действитель¬
ную либо комплексную форму Шура в зависимости от значения аргумента flag:
Значение flag
Применяемая форма Шура
'complex'
Комплексная
'real'
Действительная, по умолчанию
Функция [U, Т] = schur(A,...), кроме матрицы Шура Т, возвращает также унитарную
матрицу преобразований U, которая удовлетворяет следующим соотношениям:
А = U*T*U',
U'*U = eye(size(А)).
Если исходная матрица является комплексной, то всегда возвращается комплексная
форма Шура.
Функция [U, Т] = rsf2csf(U, Т) преобразовывает действительную форму Шура
в комплексную.
5. Матрицы и линейная алгебра
495
Пример:
Рассмотрим приведение тестовой матрицы с двумя кратными комплексными и од¬
ним действительным собственными значениями к действительной форме Шура [96].
А =[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] ;
[и,
Т] =
= schur (А,
1 real1)
и =
-0
.28684
0.6913
-0.21157
0.41345
0.47342
-0
.48543
-0.69374
-0.29048
0.25954
0.36243
-0,
.41923
0.073438
-0.035535
0.45972
-0.77862
-0,
.35304
0.1723
-0.61429
-0.66569
-0.15867
-0.
.61781
0.075826
0.7016
-0.32744
0.11445
т =
-1
0.67947
20.739
-36.202
-4.4321
0
1.5
-7.6831
13.763
9.1509
. 0
1.6595
1.5
1.1793
5.4855
0
0
0
1.5
-2.4654
0
0
0
5.1716
1.5
Преобразуем действительную форму Шура в комплексную.
[UlrTl] = rsf2csf(U/T)
U1 =
-0.2868
-0.08917 + 0.6269И
-0.29136 + 0.19186i
0.38958 + 0.2349i
-0.3402 -
0.26898i
-0.4854
-0.12242 - 0.6291И
0.29238 + 0.26342i
0.29825 + 0.1475i
-0.2136 -
0.20593i
-0.4192
-0.01498 + 0.06660i
-0.03095 +*0.03222i
-0.64073 + 0.2612i
-0.3783 +
0.442391
-0.3530
-0.2589 + 0.15625i
-0.07262 + 0.55707i
-0.13057 - 0.3782i
0.5478 +
0.09016i
-0.6178
Гр-1 —
0.2957 + 0.06876i
-0.03196 -.0.636241
0.09418 - 0.1860i
0.2694 -
0.06503i
1 ± —
-1
8.7405 + 0.61618i
-0.28637 - 18.807i
-3.6472 - 20.569i
29.79 +
2.5182i
0
1.5 + 3.5707i
6.0236
8.994 - 6.54641
-5.124 +
8.9573i
0
0
1.5 - 3.5707i
-3.7813 + 0.7977i
7.5998 +
1.3113i
0
0
0
1.5 + 3.5707i
-2.7062 +
l.lle-016i
0
0
0
0
1.5
3.5707i
Начиная с версии MATLAB 6.1 комплексную форму Шура для действительной
матрицы можно вычислить, не используя М-функцию rsf2csf.
[Ur Т] = schur(А,'complex')
и =
0.5132 + 0.0797i
0.1351 + 0.3046i
0.3705 + 0.1582i
0.3818 + 0.22881
0.4990 + 0.0989i
T =
1.5 + 3.5707i
0
0
о
о
0.0351 + 0.14241
0.2844 + 0.33441
-0.5673 + 0.0527i
-0.2524 - 0.4383i
0.4521 + 0.0326i
-4.5 + 18.717i
1.5 + 3.5707i
0
0
0
0.0727 - 0.4952i
0.0352 + 0.6745i
-0.0984 + 0.2643i
2.7e-6 + 0.0692i
-0.4571 - O.Ollli
14.725 - 1.3329i
1.143 - 0.7918i
-1 + 5.1286e-016i
0
0
-0.4446 - 0.269H
-0.2810 + 0.2705i
0.2491 - 0.181И
-0.3962 + 0.2758i
0.4847 - 0.1223i
-19.934 + 2.292i
-1.4575 - 1.5513i
6.5033 - 1.154i
1.5 - 3.5707i
0
0.3184 - 0.2945i
0.2365 - 0.1792i
-0.3785 - 0.4422i
-0.1738 + 0.5273i
0.0226 + 0.2763i
-1.5949 - 29.036i
-0.5197 - 2.79371
-3.4747 + 12.134i
4.9353 + 5.4559i
1.5 - 3.5707i
Эта форма отличается от ранее полученной расположением собственных значений
на диагонали верхней формы Шура и тем, что преобразование является комплексным.
496
В. Г. Потемкин. Вычисления в среде MATLAB
Алгоритм:
Реализация М-функции schur основана на применении утилит пакета LAP АСК [31].
Сопутствующие функции: HESS, EIG, QZ.
QZ ] Приведение пары матриц к обобщенной форме Шура
Синтаксис:
[AA,BB,Q,Z] = qz(А,В)
[АА, ВВ, Q, Z , V, W] = qz(A,B)
[ . . . ] = qz (А, В, flag)
Применение:
Многие задачи линейной алгебры: решение матричных уравнений Сильвестра
и Риккати, смешанных систем дифференциальных и линейных алгебраических уравне¬
ний - приводят к необходимости решать обобщенную проблему собственных значений:
Аг = ЛВг.
В алгоритмическом плане эта задача включает одновременное приведение пары
матриц к форме Шура.
Описание:
Функция [АА, ВВ, Q, Z] = qz(A, В) возвращает для квадратных матриц А и В верх¬
ние квазитреугольные матрицы АА и ВВ, удовлетворяющие следующим соотношениям:
Q*A*Z = АА;
Q*B*Z = ВВ.
Для комплексных матриц возвращаются комплексные треугольные матрицы АА и ВВ.
Функция [АА, ВВ, Q, Z, V, W] = qz(A, В), кроме того, возвращает матрицы обоб¬
щенных собственных векторов V и W. Если матрица АА треугольная, то диагональные
элементы alpha = diag(AA) и beta = diag(BB) являются обобщенными собственными
значениями, которые удовлетворяют соотношениям
A*V*diag(beta) = B*V*diag(alpha)
diag(beta)*W'*A = diag(alpha)*W’*B.
Собственные значения системы, эквивалентные значениям lambda = eig(A, В),
можно вычислить с помощью поэлементного деления векторов alpha и beta:
lambda = alpha./beta.
Если матрица АА не является треугольной, необходимо дальнейшая обработка
диагональных блоков размера 2x2, чтобы вычислить собственные значения системы.
Функция [...] = qz(A, В, flag) для действительной пары матриц А и В выполняет
приведение к комплексной или действительной обобщенной форме Шура в зависимо¬
сти от значения входного аргумента flag:
Значение flag
Применяемая форма Шура
'complex'
Комплексная, по умолчанию
'real’
Действительная
5. Матрицы и линейная алгебра
497
Пример:
Для системы ОДУ в неявной форме Коши, описывающих динамическую систему
с одним входом и одним выходом:
Qx + Rx = b u;
у = cTx + du
вычисление полюсов и нулей соответствующей передаточной функции можно свести
к решению следующих обобщенных проблем собственных значений [23]:
• при вычислении полюсов:
• при вычислении нулей:
-R
_ст
Рассмотрим следующую систему второго порядка с одним входом и одним выходом:
Q =[1 0;
R =[1.119 -1;
b = [0.1284;
0.192 1];
36.48 1.538];
31.096];
С = [0.6299 0];
d = -0.0723;
Вычислим полюса системы.
[АА,ВВ] = qz(-R,Q);
poles = diag(AA)./diag(BB)
poles =
-1.4245 - 6.0143i
-1.4245 + 6.0143i
Вычислим нули системы.
А = [-R b; Cd]; В = [-Q zeros(size(b)); zeros(size(С)) 0];
[AA,BB] = qz(A,B); zero = diag (AA) ./diag (BB)
zero =
-14.471
16.201
-Inf
Алгоритм:
Реализация М-функции qz основана на применении утилит пакета LAP АСК [46].
Сопутствующая функция - EIG.
POLYEIG | Вычисление собственных значений матричного полинома
Синтаксис:
[R,d] = polyeig (АО , Al,..., Ар)
d = polyeig(АО,Al,...,Ар)
Описание:
Функция [R, d] = polyeig(AO, Al, ..., Ар) решает полную проблему собственных
значений для матричного полинома степени р вида
498
В. Г. Потемкин. Вычисления в среде MATLAB
(АО + Х*А1 + ... + Хр*Ар)*г = О.
Входными переменными этой функции являются р+1 квадратная матрица АО, А1,
Ар порядка п. Выходными переменными - матрица собственных векторов R разме¬
ра пх(пхр) и вектор собственных значений d длины пхр.
Функция d = polyeig(AO, Al, Ар) с одним выходным аргументом вычисляет
только собственные значения матричного полинома.
Для некоторых значений р и п функция polyeig становится равносильной другим
функциям системы MATLAB:
• р = 0, функция polyeig(A) равносильна функции eig(A);
• р = 1, функция polyeig(A, В) равносильна функции eig(A, -В);
• n = 1, функция polyeig(aO, al, ..., ар) для скаляров аО, ..., ар равносильна функции
roots([ap ... al аО]).
Алгоритм:
Задача сводится к решению обобщенной проблемы собственных значений для па¬
ры матриц А и В порядка пхр. В частном случае, когда р = 4, эти матрицы становятся
квадратными и имеют вид:
•А-0
0
0
О'
'-А,
А2
-А,
-А/
0
I
0
0
;В =
0
I
0
0
0
0
I
0
0
0
I
0
0
0
0
I
0
0
0
I
Если одна из матриц АО или Ар (но не обе) вырожденна, то некоторые из собствен¬
ных значений могут оказаться равными нулю или Inf.
Если обе матрицы АО и Ар вырожденны, то задача оказывается плохо обусловлен¬
ной. С точки зрения теории это означает, что решения может не существовать или оно
может быть не единственным. В вычислительном отношении решение может оказать¬
ся неточным.
Реализация М-функции polyeig основана на приведении пары матриц к обобщен¬
ной форме Шура и применении утилит пакета LAP АСК [31].
Сопутствующие функции'. EIG, QZ.
SVD ~| Сингулярное разложение матрицы
Синтаксис:
s = svd(A)
[U,S,V] = svd(A)
[U,S,V] = svd(A,0)
Определение:
Если A - действительная матрица размера mxn (m > n), то ее можно представить
в виде [25]
5. Матрицы и линейная алгебра
499
Такое разложение называется сингулярным разложением матрицы А.
Матрица U сформирована из п ортонормированных собственных векторов, соот¬
ветствующих п наибольшим собственным значениям матрицы ААТ, а матрица V-
из ортонормированных собственных векторов матрицы АТА. Диагональные элементы
Si, sn матрицы S- неотрицательные значения квадратных корней из собственных
значений матрицы АТА; они называются сингулярными числами.
Допустим, что si > s2 > ... > sn > 0. Если ранг матрицы А равен г, то значения sr+1 =
= sr+2 = ... = sn = 0. Тогда существует так называемое экономное сингулярное разло¬
жение, которое связано только с г сингулярными числами, не равными нулю:
A=UrSrVrT;
<UjUr=VrVrT =Ir;
Sr = diag(sx, ..., 5r).
Описание:
Функция s = svd(A) вычисляет только сингулярные числа матрицы А.
Функция [U, S, V] = svd(A) вычисляет диагональную матрицу S тех же размеров,
что и матрица А, с неотрицательными диагональными элементами, расположенными
в порядке убывания, а также унитарные матрицы преобразований U и V.
Функция [U, S, V] = svd(A, 0) выполняет экономное сингулярное разложение.
Алгоритм:
Функция svd(A) использует утилиты пакета LAP АСК [31].
Диагностические сообщения:
' Если в течение 75 итераций QR-преобразования сингулярные значения не найдены,
выдается сообщение:
Solution will not converge.
Решение не сходится.
Примеры:
Рассмотрим прямоугольную матрицу размера 4 х 2 и вычислим ее полное сингу¬
лярное разложение.
3 4
5 6
7 8];
[U,S,V] = svd(A)
500
В. Г. Потемкин. Вычисления в среде MATLAB
и =
-0.15248
-0.82265
-0.3945
-0.37996
-0.34992
-0.42138
0.2428
0.80066
-0.54735
-0.020103
0.69791
-0.46143
-0.74479
0.38117
-0.54621
0.040738
14.269
0
0
0.62683
0
0
0
0
-0.64142
0.76719
-0.76719
-0.64142
Вычислим экономное сингулярное разложение.
[U,S,V] = svd(A,0)
и =
-0.15248
-0.82265
-0.34992
-0.42138
-0.54735
-0.020103
-0.74479
0.38117
14.269
0
0
0.62683
-0.64142
0.76719
-0.76719
-0.64142
Читатель самостоятельно может сделать вывод об эффективности экономного син¬
гулярного разложения.
Рассмотрим тестовую матрицу chebspec порядка 5, которая в пределах ошибок
округления имеет только нулевые собственные значения [54].
А = chebspec(5);
s = svd(AA3)
s =
155.54
32.863
2.7283е-014
9.5778е-015
2.3756е-015
figure(1)
semilogy(sz’-г1,1 Linewidth1,2),hold on
semilogyfs,' sk','Markersize1,5,1MarkerFaceColor', 'g');
grid on, title(1svd(A)') % рис. 5.84,a
figure(2)
ps(AA3,0); grid on, axis auto, title('eig(A)') % рис. 5.84,6
5. Матрицы и линейная алгебра
501
рис. 5.84
Из анализа графиков следует, что 3 сингулярных числа имеют значения меньше 10*14
и существенно отличаются от остальных; собственные значения находятся в круге ра¬
диусом 0.7 * 10'6, т. е. являются кратными. Дефект матрицы А3 равен трем.
В рассматриваемом случае это означает, что имеется 3 клетки Жордана, порядок
которых пока неизвестен. Применяя пакет программ JORD [23], можно установить,
что в данном случае имеется одна клетка первого и две клетки второго порядка.
Jstr = jord(AA3,0)
Jstr =0 1 2
Сопутствующие функции'. GSVD, SVDS.
GSVD | Обобщенное сингулярное разложение пары матрицы
Синтаксис:
[U,V,X,C,S] = gsvd(A,B)
[U,V,X,C,S] = gsvd(A,B,0)
sigma = gsvd(A,B)
Описание:
Функция [U, V, X, C, S] = gsvd(A, В) возвращает унитарные матрицы U и V, квад¬
ратную (как правило) матрицу X и неотрицательные диагональные матрицы С и S, та¬
кие, что справедливы следующие соотношения:
А = U*C*X'
В = V*S*X’
С'*С + S’*S = I.
Матрицы А и В должны иметь одинаковое количество столбцов, но могут иметь
разное количество строк; если А матрица размера тхр, а В - размера пхр, то U - раз¬
мера mxm, V - размера nxn, X - размера pxq, где q = min(m+n, р). Ненулевые элемен¬
ты S всегда размещены на главной диагонали. Если m > р, то ненулевые элементы С
также размещены на главной диагонали; если m < р, то ненулевые элементы размеща¬
502
В. Г. Потемкин. Вычисления в среде MATLAB
ются на диагонали diag(C, p-m). Это позволяет упорядочить диагональные элементы
таким образом, чтобы сингулярные числа располагались в неубывающем порядке.
Функция [U, V, X, С, S] = gsvd(A, В, 0) реализует экономное разложение, когда вы¬
ходные матрицы U и V содержат самое большее р столбцов, а матрицы С и S - самое
большее р строк. Обобщенные сингулярные значения при этом определяются как
diag(C)./diag(S).
Функция sigma = gsvd(A, В) возвращает вектор обобщенных сингулярных значений
sqrt(diag(C'*C)./diag(S'*S)).
Когда В квадратная несингулярная матрица, ее обобщенные сингулярные значения
совпадают с обычными сингулярными значениями svd(A/B), но отсортированными
в обратном порядке; обратные значения могут быть получены с помощью функции
gsvd(B, А).
В принятой формулировке GSVD-разложения не делается никаких предположений
относительно рангов матриц А и В. Матрица X имеет полный ранг, если и только если
матрица [А; В] имеет полный ранг. Фактически это означает, что функции svd(X)
и cond(X) равны svd([A; В]) и cond([A; В]) соответственно.
Другие формулировки, использованные, например, в работе [49], требуют, чтобы
нуль-пространства null(A) и null(B) не пересекались, и поэтому в них X заменяется на
inv(X) или inv(X’).
Заметим, что когда нуль-пространства null(A) и null(B) пересекаются, то ненулевые
элементы матриц С и S нельзя определить однозначно.
Алгоритм:
Алгоритм обобщенного сингулярного разложения использует С-S разложение,
описанное в работе [49], а также встроенные функции svd и qr. С-S разложение реали¬
зовано в виде подфункции М-файла gsvd.
Примеры:
Рассмотрим пару матриц А и В, первая из которых прямоугольная размера 5x3,
а вторая квадратная невырожденная порядка 3, и выполним их обобщенное сингуляр¬
ное разложение.
А = reshape(1:15,5,3), В = magic(3)
А =
1 6 11
2 7 12
3 8 13
4 9 14
5 10 15
В =
8 16
3 5 7
4 9 2
[U,V,X,C,S] = gsvd(A,B)
и =
0.21146
0.64566
-0.42793
-0.14298
-0.57866
0.22738
0.32958
-0.43747
0.46031
0.66061
-0.48826
0.013492
-0.44701
-0.67132
0.33308
-0.55147
-0.30259
-0.45655
0.53361
-0.33338
0.60089
-0.61868
-0.46609
-0.17963
-0.08166
5. Матрицы и линейная алгебра
503
V
0.70711
-0.69458
0.13251
5.2042е-018
-0.18739
-0.98229
-0.70711
-0.69458
0.13251
X =
2.8284
-9.3761
-6.9346
-5.6569
-8.3071
-18.33
2.8284
-7.2381
-29.726
С =
6.5244е-017
0
0
0
0.31553
0
0
0
0.98067
0
0
0
0
0
0
S =
1
0
0
0
0.94892
0
0
0
0.19565
GSVD-разложение формирует ортогональные матрицы U и V размера 5x5 и 3x3,
а также невырожденную матрицу X размера 3x3 и матрицы С и S размера 5x3 и 3x3
соответственно. Поскольку матрица А сингулярная, первый диагональный элемент
матрицы С равен 0 в пределах машинной точности.
Теперь вычислим экономное GS VD-разложение.
[U,V,X,C,S] = gsvd(A,B,0)
и =
0.57004
-0.64566
-0.42793
-0.74548
-0.32958
-0.43747
-0.17016
-0.013492
-0.44701
0.29657
0.30259
-0.45655
0.049019
0.61868
-0.46609
0.70711
0.69458
0.13251
-1.6567е-016
0.18739
-0.98229
-0.70711
0.69458
0.13251
2.8284
9.3761
-6.9346
-5.6569
8.3071
-18.33
2.8284
7.2381
-29.726
1.5381е-016
0
0
0
0.31553
0
0
0
0.98067
1
0
0
0
0.94892
0
0
0
0.19565
Экономное GSVD-разложение формирует ортогональные матрицы U и V размера
5x3 и 3x3 соответственно, а также невырожденную матрицу X размера 3x3 и матрицы
С и S размера 3x3 и 3x3 соответственно.
504
В. Г. Потемкин. Вычисления в среде MATLAB
Вычисление обобщенных сингулярных чисел:
sigma = gsvd(A,B)
sigma =
6.5244е-017
0.33252
5.0123
Сравним с обычными сингулярными числами:
svd(А/В)
ans =
5.0123
0.33252
5.608бе-017
Поскольку матрица В невырожденная, она имеет обратное расположение.
Сопутствующие функции'. QR, SVD.
5.6. Вычисление функций от матриц
EXPM, ЕХРМ1,
ЕХРМ2, ЕХРМЗ
Синтаксис:
Встроенная М-функция
Y = ехрш(А)
Вычисление матричной экспоненты
Демонстрационные М-функции
Y = expml(А)
Y = ехрш2(А)
Y = ехртЗ(А)
Описание:
Функция Y = ехрт(А) является встроенной функцией интерпретатора системы
MATLAB и вычисляет функцию еА от матрицы А.
Функция Y = expml(А) является М-файлом, который полностью соответствует
встроенной функции ехрт(А). Он вычисляет функцию еА, используя разложение Паде
матрицы А [49].
Функция Y = ехрт2(А) вычисляет функцию еА, используя разложение Тейлора
матрицы А [76]. Этот метод имеет меньшую скорость сходимости по сравнению с раз¬
ложением Паде.
Функция Y = ехршЗ(А) вычисляет функцию еА, используя спектральное разложе¬
ние матрицы А:
[R, D] = eig (А) ;
Y = R*diag(exp(diag(D)))/R.
Последние соотношения верны только для случая различных собственных значений.
Предостережение:
Функцию матричной экспоненты ехрт(А) не следует путать с функцией ехр(А),
которая вычисляет экспоненту от каждого элемента массива А.
5. Матрицы и линейная алгебра
505
Пример:
Рассмотрим тестовую матрицу chebspec порядка 5 с дефектом 1, имеющую 5 крат¬
ных собственных значений, равных нулю [54]. Вычислим матричные экспоненты
с помощью всех имеющихся в распоряжении М-функций и оценим погрешности вы¬
числения как норму разности матриц, вычисленных с помощью демонстрационных
и встроенной М-функций.
А = chebspec(5);
Y = expm(A); Y1 = expml(A); Y2 = ©xpm2 (A); Y3 = ехртЗ (A);
norml = norm(Y-Yl), norm2 = norm(Y-Y2), погтЗ = norm(Y-Y3)
norml = 0
norm2 = 9.5482e-013
norm3 = 0.010447
Замеченная ошибка:
В поставке системы MATLAB Version 6.5.0.180913а (R13) обнаружена несостоя¬
тельность работы М-функции eig(A) в составе М-функции ехртЗ. Ошибку можно
обойти, если в М-функции ехртЗ заменить вызов функции eig с одним аргументом
на вызов с двумя аргументами в форме eig(A, eye(size(A)).
Тогда значение нормы погтЗ изменится и станет равным
Y3 = ехртЗ (А); погтЗ = norm(Y-Y3)
погтЗ = 0.0018371
Как следует из анализа результатов, функции ехрш(А) и expml(A) дают совпадаю¬
щие результаты, функция ехрш2(А) имеет погрешность в пределах машинной точно¬
сти, однако функция ехртЗ (А) имеет ошибку в третьем знаке, что является следствием
того, что исходная система имеет кратные собственные значения.
Используя пакет программ JORD [23], можно выявить точную структуру формы
Жордана матрицы А.
[eigval,Jstr,R,Jord] = jstruct(A); R, Jord
R = Jord =
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
В данном случае это единственная клетка Жордана порядка 5, характеризующая
простую однократную вырожденность.
Аналитическая функция f(J), где J - клетка Жордана, соответствующая собствен¬
ному значению Л, может быть вычислена следующим образом [23]:
506
В. Г. Потемкин. Вычисления в среде MATLAB
/(J) =
f(A)
fU)
fU)
f(k,(X)
1!
2!
k!
0
f(X)
fU)
f(k 1)(X)
1!
(k-1)!
0
0
0
fU)
1!
0
0
0
f(A)
В данном случае матрица EJ = exp(J) вычисляется очень просто, поскольку для экс¬
поненты сама функция и все ее производные для значения X, равного 0, равны 1.
Сформируем вектор v, соответствующий первой строке матрицы EJ, и поместим его
в каждую строку массива EJ со сдвигом на одну позицию вправо. Таким образом будет
заполнен массив размера пх2*п, из которого можно выделить матрицу EJ размера пхп:
п = 5; v(l) = 1;
for j = 2:n
v(j) = l/prod(l:j-1);
end
for j = l:n
EJ(jz j:length(v)+j-1) = v;
end
EJ= EJ(l:n,l:n)
EJ =
1
1 1/2
1/6
1/24
0
1 • 1
1/2
1/6
0
0 1
1
1/2
0
0 0
1
1
0
0 0
0
1
а матрица
Y0=eA=ReJ R 1
вычислена так:
Y0 = R*EJ/R
Y0 =
21
-32.485 21
-15.515
7
11.157
-15.778 9.2426
-6.5355
2.9142
1
6.7646e-014 -4.9629e-014
4.0237e-014
-1.8784e-014
-0.15685
0.53553 0.75736
-0.22183
0.085786
1.868e-014
-3.1117e-014 1
-1.919e-014
1.1157e-014
Считая данное решение точным, оценим нормы невязок предыдущих решений.
norm(YO-Y) norm(YO-Yl) norm(Y0-Y2) norm(Y0-Y3)
1.1963e-012 1.1963e-012 2.6617e-013 0.0018371
Из анализа следует, что функции expml(A) и ехрш2(А) дают результаты с погреш¬
ностью в пределах ошибки округления, а функция ехртЗ(А) имеет ту же погрешность.
Сопутствующие функции: EXP, FUNM, LOGM, SQRTM.
5. Матрицы и линейная алгебра
507
LOGM
Вычисление логарифма матрицы
Синтаксис:
Y = logm(A)
[Y,esterr] = logm(A)
Описание:
Функция Y = logm(A) вычисляет функцию log(A), такую, что для большинства
матриц А должно выполняться условие
logm(expm(А) ) = А = expm(logm(A) ) .
При таком обращении возможно появление диагностического предупреждения
Warning: LOGM appears inaccurate, esterr = xxx
Предупреждение: функция LOGM вычислена неточно, esterr = xxx
Если матрица А- действительная симметрическая или комплексная эрмитова,
то теми же свойствами обладает и функция logm(A).
Функция [Y, esterr] = logm(A), кроме вычисленной матрицы, возвращает оценку
погрешности в виде относительной невязки
norm(expm(Y) - A)/norm(A).
В этом случае диагностическое сообщение не выводится.
Предостережение:
Функцию матричной экспоненты logm(A) не следует путать с функцией log(A), ко¬
торая вычисляет логарифм от каждого элемента массива А.
Пример:
Рассмотрим экспоненту матрицы Чебышева спектрального дифференцирования
порядка 5 и восстановим исходную матрицу с помощью функции матричного лога¬
рифмирования.
А = expm(chebspec(5))
А =
21
11.157
1
-0.15685
-1.5873е-015
-32.485
-15.778
-2.5955е-014
0.53553
5.7593е-016
21
9.2426
1.5418е-014
0.75736
1
-15.515
-6.5355
-9.9643е-015
-0.22183
-2.1372е-015
2.9142
4.3125е-015
0.085786
6.3144е-016
Al = logm (А)
А1 =
5.5000 + O.OOOOi
1.7071 + O.OOOOi
-0.5000 + 0.0000i
0.2929 + 0.00001
-0.5000 + O.OOOOi
-6.8284
-0.7071
1.4142
-0.7071
1.1716
O.OOOOi 2.0000 + O.OOOOi
O.OOOOi -1.4142 + O.OOOOi
O.OOOOi 0.0000 + O.OOOOi
O.OOOOi 1.4142 + O.OOOOi
O.OOOOi -2.0000 + O.OOOOi
-1.1716 - O.OOOOi
0.7071 - O.OOOOi
-1.4142 - O.OOOOi
0.7071 - O.OOOOi
6.8284 - O.OOOOi
0.5000 + O.OOOOi
-0.2929 + O.OOOOi
0.5000 + O.OOOOi
-1.7071 + O.OOOOi
-5.5000 + O.OOOOi
Восстановленная матрица имеет комплексные элементы, но их мнимые части
в пределах машинной точности равны нулю.
508
В. Г. Потемкин. Вычисления в среде MATLAB
Алгоритм:
Функция logm, как и другие функции от матриц, вычисляется с использованием ал¬
горитма Парлетта [49]. Этот алгоритм использует приведение к форме Шура и может
давать неточные или полностью несостоятельные результаты в случае кратных собст¬
венных значений.
Сопутствующие функции: EXPM, FUNM, SQRTM.
SQRTM | Вычисление функции А1/2
Синтаксис:
X = sqrtm(A)
[X,normest] = sqrtm(A)
[X,alpha,condest] = sqrtm(A)
Описание:
Функция X = sqrtm(A) вычисляет такую матрицу, которая удовлетворяет условию
X * X = А. Если все собственные значения матрицы А имеют неотрицательную дейст¬
вительную часть, то такая матрица единственна; если существуют собственные значе¬
ния с отрицательными действительными частями, то результатом является комплекс¬
ная матрица. Если матрица А вырожденна, то функции квадратного корня для такой
матрицы может не существовать и возможно появление диагностического предупреж¬
дения.
Функция [X, normest] = sqrtm(A), кроме вычисленной матрицы, возвращает оценку
погрешности в виде относительной величины невязки normest, определяемой следую¬
щим соотношением:
попп (А-Хл2 , ' fro ' ) /norm (А, ' fro ' ) .
В этом случае диагностическое сообщение не выводится.
Функция [X, alpha; condest] = sqrtm(A) возвращает параметр устойчивости alpha,
оценку числа обусловленности condest. Относительная величина невязки ограничена
значением n*alpha*eps, а норма Фробениуса относительной ошибки - величиной
n*alpha*condest*eps, где n = max(size(A)).
Замечание:
Если матрица А- действительная симметрическая или комплексная эрмитова,
то теми же свойствами обладает и функция sqrtm(A). Некоторые типы матриц, подоб¬
но матрице А = [0 1; 0 0], не имеют квадратного корня.
Предостережение:
Функцию sqrtm(A) не следует путать с функцией sqrt(A), которая вычисляет поло¬
жительный квадратный корень от каждого элемента массива.
Примеры:
Рассмотрим матричное представление разностного оператора 4-го порядка.
А =[ 5
-4
1
0
0;
-4
б
-4
1
0;
1
-4
б
-4
1;
0
1
-4
б
-4;
0
0
1
-4
5] ;
5. Матрицы и линейная алгебра
509
Эта матрица симметрическая и положительно определенная; ее единственный по¬
ложительно определенный квадратный корень представляет собой разностный опера¬
тор 2-го порядка.
X = sqrtm (А)
X =
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
-0.0000
0.0000
-1.0000
2.0000
-1.0000
-0.0000
-0.0000
-0.0000
-1.0000
2.0000
Следующая матрица не имеет квадратного корня.
А =[0 1;
О 0] ;
X = sqrtm(А)
Warning: Matrix is singular and may not have a square root.
X =
NaN Inf
NaN NaN
Матрица вида
A =[ 7 10;
15 22];
имеет 4 матрицы, являющиеся ее квадратным корнем.
М-функция sqrtm может сформировать только одно решение.
[X,alpha,condest] = sqrtm(А)
X =
1.5667 1.7408
2.6112 4.1779
alpha = 1.0159
condest = 7.3803
Все 4 решения можно получить на основе спектрального разложения исходной
матрицы.
[R,D] = eig(A)
R =
-0.8246
0.5658
D =
0.1386
0
-0.4160
-0.9094
0
28.8614
Теперь можно построить 4 матрицы SI, S2, S3, S4 с различными комбинациями
знаков диагональных элементов.
S1 =
[0.3723
0
0;
5.3723];
S2 =
[-0.3723
0
0;
5.3723] ;
S3 =
[-0.3723
0
0;
-5.3723]
S4 =
[0.3723
0
0;
-5.3723];
510
В. Г. Потемкин. Вычисления в среде MATLAB
Сформируем окончательные решения.
R*S1/RZ
Х2 = R*S2/R,
ХЗ = R*S3/RZ х4
хз =
= R*S4/R
1.5667
1.7408
-1.5667
-1.7408
2.6112
4.1779
-2.6112
-4.1779
х4 =
1.0000
2.0000
-1.0000
-2.0000
3.0000
4.0000
-3.0000
-4.0000
Функция sqrtm строит решение только для положительных значений квадратных
корней диагональной матрицы, и ее результатом может быть только положительно оп¬
ределенная матрица XI.
Сопутствующие функции’. EXPM, FUNM, LOGM.
FUNM
Вычисление произвольных функций от матрицы
Синтаксис:
Y = funm(A, fun)
[Y,esterr] = funm(A,fun)
Описание:
Функция Y = funm(A, fun) позволяет вычислить функцию от квадратной матрицы,
если ее имя или дескриптор присвоены входному аргументу fun. В процессе вычисле¬
ния возможно появление диагностического сообщения:
Warning: FUNM appears inaccurate, esterr = xxx
Предупреждение: Результат вычисления функции FUNM может быть
неточным, esterr = ххх
Для вычисления функций матричной экспоненты, логарифма и квадратного корня
рекомендуется использовать специальные М-функции expm(A), logm(A) и sqrtm(A).
Функция [Y, esterr] = funm(A, fun), кроме вычисленной матрицы, возвращает оцен¬
ку погрешности в виде относительной невязки:
esterr = norm (expm (Y)-A)/norm (А) .
В этом случае диагностическое сообщение не выводится.
Если матрица А - действительная симметрическая или комплексная эрмитова, то ее
форма Шура диагональна и результаты могут обладать очень высокой точностью.
Примеры:
Вычислим функцию синуса от магической матрицы порядка 4.
А = magic(4);
funm(A,@sin)
0.51986
-0.20364
-0.15196
-0.048605
0.26147
0.20979
0.15811
0.054753
0.003074
-0.10028
0.4165
0.46818
0.36482
0.10643
0.31315
-0.25532
5. Матрицы.и линейная алгебра
511
Вычисленная матрица должна иметь собственные значения Z(F) = sin(A(А)). Прове¬
рим это.
dA = sin(sort(eig(A)))
dA =
-0.46223
1.0367e-015
0.46223
0.52908
dF = sort(eig(F))
dF =
-0.46223
1.0931e-015
0.46223
0.52908
Следующие последовательности операторов в пределах ошибок округления долж¬
ны давать одинаковые результаты и удовлетворять условию
s*s + С*С = I,
где I = eye(size(A)).
S = funm(A,@sin); С = funm(A,@cos);
Il = S*S + C*C
E = expm(i * A); S = imag(E); C = real(E);
12 = S*S + C*C
Il =
1
-2.5674e-016
-4.7878e-016
9.09e-016
12 =
1
6.5746e-016
7.9103e-016
3.6499e-015
-3.5388e-016
1
2.0817e-016
2.2204e-016
3.5735e-015
1
5.2736e-015
-5.5789e-015
-6.6613e-016
2.7756e-016
1
6.9389e-016
6.3283e-015
2.4425e-015
1
-8.0491e-015
1.1796e-015
4.8572e-017
6.6613e-016
1
-4.5658e-015
-4.1633e-017
-5.6066e-015
1
В пределах машинной точности результаты действительно совпадают и соответст¬
вуют единичной матрице, соразмерной с исходной.
Алгоритм:
Функция funm вычисляется с использованием алгоритма Парлетта [49, 76]. Этот
алгоритм потенциально неустойчив. Если матрица имеет кратные или близкие к ним
собственные значения, то функция funm дает неточные или полностью несостоятель¬
ные результаты. При разработке алгоритма была предпринята попытка выявить эту
ситуацию и сформировать диагностическое сообщение. Однако выбранный критерий
столь чувствителен, что сообщение может быть выдано даже при точном результате.
Сопутствующие функции'. EXPM, LOGM, SQRTM, @.
5.7. Полиномы и операции над ними
CONV I
Умножение полиномов
Синтаксис:
с = conv(a,b)
Метод для класса poly пот:
у = mtimes (а, b)
512
В. Г. Потемкин. Вычисления в среде MATLAB
Определение:
Если заданы полиномы а и b степени тип соответственно, то их произведение -
это полином степени m + п, к-й элемент которого вычисляется по формуле
min(Z; т)
с(Л) = У a(j) b(k + l-j).
j = max(l, к + 1- n)
Описание:
Функция z = conv(x, у) вычисляет произведение двух полиномов а и Ь.
Пример:
Найдем произведение полиномов а(х) = х3 + 2х2 + Зх + 4 и Ь(х) = 10х2 + 20х + 30.
а = [1 2 3 4]; b = [10 20 30];
с = conv(a,b)
с = 10 40 100 160 170
а = polynom(a), b = polynom(b)
с = mtimes(a,b)
а = х^З + 2*хЛ2 + 3*х + 4
b = 10*хЛ2 + 20*х + 30
120
с = 10*хЛ5 + 40*х~4 + 100*xz'3 + 160*хЛ2 + 170*х + 120
Сопутствующие функции'. DECONV, RESIDUE.
DECONV I Деление полиномов
Синтаксис:
[q,г] = deconv(Ь,а)
Метод для класса polynom:
[q,r] = poldiv(b,a)
Определение:
Если-заданы полиномы а и Ь, то их частное q и остаток г удовлетворяют соотношению
b = q*a + г.
Описание:
Функция [q, г] = deconv(b, а) реализует деление полинома b на полином а; частное
от деления возвращается в виде вектора целой части q и вектора остатка г.
Метод [q, г] = deconv(b, а) реализует деление полинома b на полином а; частное
от деления возвращается в виде полинома целой части q и полинома остатка г.
Примеры:
Пусть заданы 2 полинома в виде векторов b и а:
Ь = [10 40 100 160 170 120]; а = [123 5];
[q#r] = deconv(b,а)
q = 10 20 30
г = 0 0 0 -10 -20 -30
5. Матрицы и линейная алгебра
513
17 т. Зак. 3375
Эти полиномы не делятся нацело, и поэтому результат состоит из целой части q
и остатка г.
Выполним ту же операцию в классе полиномов.
а = polynom(a), Ь = polynom(b)
[q#r] = poldiv(b,a)
а = х^З + 2*хЛ2 + 3*х + 5
Ь = 10*хЛ5 + 40*хЛ4 + 100*хЛ3 + 160*хЛ2 + 170*х + 120
q = 10*хЛ2 + 20*х + 30
г = -10*хЛ2 - 20*х - 30
Проверим выполнение основного соотношения.
b_ = q*a + г
Ь_ = 10*хА5 + 40*хЛ4 + 100*хЛ3 + 160*хЛ2 + 170*х + 120
Результат действительно совпадает с исходным полиномом b порядка 5.
Сопутствующая функция - CONV.
POLYDER Вычисление производных
Синтаксис:
dp = polyder(p)
dp = polyder(a,b)
[q#p] = polyder(b,a)
Метод для класса polynom:
у = diff(p)
Описание:
Функция dp = polyder(p) возвращает производную полинома dp(x)/dx.
Функция dp = polyder(a, b) возвращает производную от произведения полиномов
а(х) * Ь(х).
Функция [q, р] = polyder(b, а) возвращает производную от отношения полиномов
Ь(х)/а(х) в виде отношения полиномов q(x)/p(x).
Примеры:
Вычислим производную полинома р(х) = Зх2 + 2х +1.
р = [3 2 l];dp = polyder(p)
dp = 6 2
Вычислим производную произведения полиномов.
а = [1 3 5 7]; Ь = [32 1];
dp = polyder(a,b)
dp = 15 44 66 68 19
Вычислим производную отношения тех же полиномов Ь(х)/а(х).
b = [3 б 9]; а = [1 2 0];
[Q/PJ = polyder(b,a)
q = -18 -18
р = 1 4 4 0 0
514
• В. Г. Потемкин. Вычисления в среде MATLAB
Вычислим производную полинома р(х) = Зх2 + 2х +1 в классе объектов polynom.
р = polynom([3 2 1])
dp = diff(p)
р = 3*хЛ2 + 2*х + 1
dp = 6*х + 2
Такая форма вычислений в большей мере соответствует принятой математической
записи.
Сопутствующая функция - POLYINT.
POLYINT Вычисление интегралов
Синтаксис:
Intp = polyint(p,C)
Intp .= polyint(p)
Метод для класса polynom:
Intp = polint(p,C)
Описание:
Функция Intp = polyint(p, С) возвращает интеграл полинома р(х) с заданной посто¬
янной интегрирования С.
Функция Intp = polyint(p) возвращает интеграл полинома р(х) с постоянной интег¬
рирования, равной нулю.
Примеры:
Вычислим интеграл полинома р(х) = Зх2 + 2х +1, полагая постоянную интегрирова¬
ния равной нулю.
р = [321]; Intp = polyint(p)
Intp =1 1 1 О
Вычислим тот же интеграл в классе объектов polynom.
р = polynom([3 2 1])
Intp = polint(p)
Intp = хЛ3 + хЛ2 + х
Сопутствующая функция - POLYDER.
POLYFIT Аппроксимация данных полиномом
Синтаксис:
р = polyf it (х, у, п)
[р,S] = polyfit(х,у,п)
[p,S,mu] = polyfit(х,у,п)
Метод для класса polynom - нет.
5. Матрицы и линейная алгебра
515
Описание:
Функция р = polyfit(x, у, п) вычисляет коэффициенты аппроксимирующего поли¬
нома р(х) степени п, используя метод наименьших квадратов. Результатом является
вектор коэффициентов полинома длины п+1, расположенных по убыванию степеней
переменной:
р(х) = р.х" + р2х"~1 + ...+ рлх+ р„+1.
Функция [р, S] = polyfit(x, у, п) возвращает коэффициенты аппроксимирующего
полинома и вспомогательный массив S, который можно использовать при работе с М-
функцией polyval, чтобы оценить погрешности оценки или предсказания. Если ошибки
в исходных данных независимы и подчиняются нормальному закону распределения
с постоянной дисперсией, то функция polyval вычисляет доверительный интервал, со¬
ответствующий 50 %.
Функция [р, S, mu] = polyfit(x, у, п) возвращает коэффициенты аппроксимирующе¬
го полинома степени п, вспомогательный массив S, а также массив mu, содержащий
среднее значение и среднеквадратическое отклонение исходных данных.
Примеры:
Рассмотрим аппроксимацию функции ошибки erf(x) полиномом степени 6. По¬
скольку функция erf(x) ограничена, а полином не ограничен, то аппроксимация может
оказаться не слишком точной. Определим функцию на следующем интервале аргумен¬
та и вычислим коэффициенты аппроксимирующего полинома.
х = (0:0.1:2.5)
у = erf(х);
р = polyfit(х,у,6)
р = 0.0084 -0.0983 0.4217 -0.7435 0.1471 1.1064 0.0004
Сформируем объект класса polynom.
р = polynom(р)
р = 0.0084*хЛ6 - 0.0983*хЛ5 + 0.4217*хЛ4 - 0.7435*хЛ3 +
+ 0.1471*хЛ2 + 1.1064*х + 0.0004
Этот полином содержит 7 коэффициентов.
Для того чтобы оценить, насколько хорошо полином аппроксимирует исходные
данные, вычислим таблицу его значений и погрешностей аппроксимации.
f = polyval (р,х) ;
table = [х у f y-f]
table =
0
0
0.0004
-0.0004
0.1000
0.1125
0.1119
0.0006
0.2000
0.2227
0.2223
0.0004
0.3000
0.3286
0.3287
-0.0001
0.4000
0.4284
0.4288
-0.0004
0.5000
0.5205
0.5209
-0.0004
0.6000
0.6039
0.6041
-0.0002
0.7000
0.6778
0.6778
0.0000
0.8000
0.7421
0.7418
0.0003
516
В. Г. Потемкин. Вычисления в среде MATLAB
0.9000
0.7969
0.7965
0.0004
1.0000
0.8427
0.8424
0.0003
1.1000
0.8802
0.8800
0.0002
1.2000
0.9103
0.9104
-0.0000
1.3000
0.9340
0.9342
-0.0002
1.4000
0.9523
0.9526
-0.0003
1.5000
.0.9661
0.9664
-0.0003
1.6000
0.9763
0.9765
-0.0002
1.7000
0.9838
0.9838
0.0000
1.8000
0.9891
0.9889
0.0002
1.9000
0.9928
0.9925
0.0003
2.0000
0.9953
(Г. 9951
0.0002
2.1000
0.9970
0.9969
0.0001
2.2000
0.9981
0.9982
-0.0001
2.3000
0.9989
0.9991
-0.0003
2.4000
0.9993
0.9995
-0.0002
2.5000
0.9996
0.9994
0.0002
На выбранном
интервале погрешность
аппроксимации находится в пределах
третьего или четвертого знака после запятой.
За пределами интервала аппроксимации поведение полинома становится неустой¬
чивым и аппроксимация разрушается, как это показано на рис. 5.85.
х = (0: 0.1: 5)’;
у = erf(х);
f = polyval(р,х);
plot (х,у, ’ о' , х, f , ' - ') % рис. 5.85
axis([0 502])
Алгоритм:
Модуль polyfit формирует матрицу Вандермонда, элементы которой равны степе¬
ням аргумента:
V(i,j) = xr,
5. Матрицы и линейная алгебра
517
а затем решается система линейных уравнений по методу наименьших квадратов:
р = y/v.
Сопутствующие функции'. POLY, POLYVAL, ROOTS.
POLYVAL | Вычисление полинома
Синтаксис:
у = polyval (р,Х)
у = polyval(р,Х, [],mu)
[у,delta] = polyval(pzX,S)
[yzdelta] = polyval (р, X, Szinu)
Метод для класса polynom:
у = polyval(pzX)
Описание:
Функция Y= polyval (p, X) вычисляет значение полинома р в точках, заданных мас¬
сивом X. Вектор коэффициентов р размера 1х(п+1) задает следующий полином:
р(х) = р1хп + ргхп~' + ...+ р„х+ рП+1.
Функция у = polyval(p, X, [], mu) вычисляет значение полинома р в точках, удовле¬
творяющих соотношению
X = (х~Щ)/Ц2 ,
где рц =теап(х), ц2 = std(x). Параметры щ и ц2 объединяются в вектор mu, который
может быть получен с помощью процедуры polyfit.
Функция [Y, delta] = polyval(p, X, S), где S - вспомогательный массив записей,
сформированный М-функцией polyfit. Он предназначен для оценки погрешности вы¬
числения значений полинома. Если ошибки в исходных данных для модуля polyfit не¬
зависимы и подчиняются нормальному закону распределения с постоянной дисперси¬
ей, то доверительный интервал для значений массива Y ± delta соответствует 50 %.
Функция [Y, delta] = polyval(p, X, S, mu) вычисляет значения полинома для данных,
которые центрированы и нормированы с использованием вектора mu.
Метод у = polyval(p, X) для объектов класса polynom вычисляет значения полинома
в точках, заданных массивом X.
Примеры: *
Вычислим значения полинома р(х) = Зх2 + 2х +1 в точках х = [5 7 9].
Р = [3 2 1]; х = [579];
у = polyval(р,х)
у = 86 162 262
Вычислим значения того же полинома как объекта класса polynom.
у = polyval(polynom(р),х)
у = 86 162 262
Сопутствующие функции'. POLYFIT, POLYVALM.
518
В. Г. Потемкин. Вычисления в среде MATLAB
POLYVALM ~|
Вычисление матричного полинома
Синтаксис:
Y = polyvalm(р, S)
Метод для класса polynom - нет.
Описание:
Функция Y = polyvalm(p, S) вычисляет значение матричного полинома
р(Х) = р,Хл + р2Хп'1 +...+ р„х + р„+1
для матрицы X = S. Вектор р - вектор коэффициентов матричного полинома.
Пример:
Рассмотрим матрицу Паскаля порядка 4, составленную из биномиальных коэффи¬
циентов.
S = pascal(4)
S =
111
12 3
13 6
1 4 10
1
4
10
20
Вычислим характеристический полином этой матрицы.
р = poly(S)
р = 1 -29
72 -29
1
Сравним результаты применения функций polyvalm и polyval.
polyvalm (pz S)
ans =
1.5987е-013
3.3396е-013
8.9528е-013
2.0464е
4.5475е-013
1.0054е-012
2.8635е-012
6.974е
9.4857е-013
2.1032е-012
6.5263е-012
1.5962е
1.6271е-012
3.8654е-012
1.2264е-011
3.0195е
polyval(P/S)
ans =
16
16
16
16
16
15
-140
-563
16
-140
-2549
-12089
16
-563
-12089
-43779
Матрица polyvalm(p, S) в пределах машинной точности - нулевая матрица, что со¬
ответствует теореме Кэли - Гамильтона, утверждающей, что всякая матрица удовле¬
творяет своему характеристическому уравнению.
Для работы с полиномиальными матрицами в среде системы MATLAB разработан
специальный пакет программ Polynomial Toolbox [52].
Сопутствующая функция - POLYVAL.
5. Матрицы и линейная алгебра
519
ROOTS |
Вычисление корней полинома
Синтаксис:
г = roots(р)
Метод для класса polynom:
г = roots(р)
Описание:
Функция г = roots(p) вычисляет вектор-столбец корней полинома
р(х) = рхх" + ргх"'х + ...+ р„х + рП+1.
Метод г = roots(p) вычисляет корни полинома в классе объектов polynom.
Пример:
Вычислим корни полинома р(х) = х3 + Зх2 + 5х +7.
Р = [1 3 5 7];
г = roots(р)
г =
-2.1795
-0.41025 + 1.7445i
-0.41025 - 1.7445i
г = roots(polynom(р))
г =
-2.1795
-0.41025 + 1.7445i
-0.41025 - 1.7445i
Алгоритм:
В основу алгоритма положено вычисление собственных значений сопровождаю¬
щей матрицы полинома:
А = diag(ones(п-2,1),-1);
А(1,:) = -с(2:П-1)./с(1);
eig(A)
Можно показать, что результаты вычисления являются собственными значениями
сопровождающей матрицы А в пределах ошибки округления, но это не означает, что
они соответствуют корням полинома в пределах ошибки округления коэффициентов
полинома [96].
Сопутствующие функции'. COMPAN, POLY.
COMPAN|
Сопровождающая матрица для полинома
Синтаксис:
С = сошрап(р)
Метод для класса polynom:
С = compan(p)
Определение:
Определение сопровождающей матрицы и ее применение в практических задачах
описано в работах [49, 58, 96]. Первая строка сопровождающей матрицы есть вектор
520
В. Г. Потемкин. Вычисления в среде MATLAB
коэффициентов полинома с обратными знаками и расположенными по убыванию сте¬
пеней, исключая коэффициент при старшей степени, который должен быть равен 1 :
С(1,:) = -р(2:п)/р(1).
Описание:
Функция С = compan(p) формирует сопровождающую матрицу С для полинома р,
заданного своими коэффициентами.
Метод С = compan(p) формирует сопровождающую матрицу С в классе объектов
polynom.
Пример:
Полиному (х - 1 )(х - 2)(х + 3) = х3 - 7х + 6 соответствует вектор коэффициентов
р = [1 0 -7 б];
С = compan(p)
С =
0 7-6
10 0
0 10
В классе объектов polynom эти вычисления можно организовать иначе:
х = polynom([1 0]);
р = (х-1) * (х-2) * (х+3)
С = сохпрап(р)
р = хЛ3
- 7*х + 6
С =
0
7 -6
1
0 0
0
1 0
Сопутствующие функции'. EIG, POLY, ROOTS.
POLY | Вычисление характеристического полинома
Синтаксис:
р = poly(A)
р = poly(г)
Метод для класса polynom - нет.
Описание:
Функция р = poly(A), где А - матрица порядка п, вычисляет вектор-строку коэффи¬
циентов характеристического полинома
p(s) = det(sl-А) = pts" + р^"'1 +...+ pns+ рп+1.
Функция р = poly(r), где г - вектор-столбец корней некоторого полинома, вычис¬
ляет вектор-строку коэффициентов этого полинома.
5. Матрицы и линейная алгебра
521
Пример:
Рассмотрим рациональную матрицу А, вычислим коэффициенты ее характеристи¬
ческого полинома, его корни и по ним вновь восстановим характеристический поли¬
ном.
А = [-5/3
-1
-2/3
-5/6
1/4
11/12
1/6
-17/4
-19/12];
р = poly(А)
р = 1
3
5
7
г = roots(р)
г = -2.1795
-0.4102 + 1.7445i
-0.4102 - 1.74451
р = poly(r)
р = 1 3 5 7
Алгоритм:
Алгоритмы, используемые в М-файлах poly и roots, иллюстрируют интересный ас¬
пект современного подхода к вычислению собственных значений. Процедура poly(A)
формирует характеристический полином матрицы А, а последовательность процедур
roots(poly(A)) вычисляет корни этого полинома, которые являются собственными зна¬
чениями матрицы А. Однако обе процедуры используют М-функцию eig, которая ос¬
нована на преобразованиях подобия. Таким образом, классический подход, который
определяет собственные значения как корни характеристического полинома, фактиче¬
ски не применяется.
Если А квадратная матрица порядка п, то М-функция poly(A) вычисляет коэффици¬
енты характеристического уравнения так, что коэффициент pi при старшей степени
равен 1. Алгоритм реализован следующим образом:
z = eig(А);
с = zeros(n+1,1); с(1) = 1;
for j = 1:п
c(2:j+l) = с(2:j+1)-z(j)*с(1: j) ;
end
Можно показать, что М-функция poly вычисляет коэффициенты характеристиче¬
ского уравнения в пределах ошибок округления матрицы А. Это справедливо даже
в тех случаях, когда собственные значения матрицы плохо обусловлены [96]. Тради¬
ционные алгоритмы вычисления коэффициентов характеристического полинома, ко¬
торые не используют информации о собственных значениях, не обладают столь удов¬
летворительными вычислительными свойствами.
Сопутствующие функции'. RESIDUE, ROOTS.
RESIDUE, RESI2~~| Разложение на простые дроби
Синтаксис:
[r,p,q] = residue(b,a) [b,a] = residue(г,р,k)
rj = resi2(b,a,pole,m,j)
522
В. Г. Потемкин. Вычисления в среде MATLAB
Метод для класса polynom - нет.
Определение:
Вычеты, полюсы и целая часть отношения двух полиномов b(s) и a(s) могут быть
представлены следующим образом для случая простых и кратных корней:
простые корни:
b(s) г, г, гп , ч
- + ±...+ +<?(s) ,
a(s) s-pj s-p2 s-pn
• входные переменные - векторы b и а определяют коэффициенты полиномов числи¬
теля и знаменателя по убывающим степеням s;
• выходные переменные - вектор-столбец г вычетов, вектор-столбец р полюсов
и вектор-строка q целой части дробно-рациональной функции;
• количество полюсов определяется по формуле
n = length(a)-l = length(r) = length(p);
• вектор коэффициентов многочлена прямой передачи будет пустым, если
length(b) < length(a); в противном случае length(q) = lengthfb) - length(a) + 1;
кратные корни:
если p(j) = . . . = р(]+ш-1) - полюс кратности т, то разложение на простые дроби вклю-
чает член [79]
, ГМ , , rj+m-i
s-Pj (s-Pj)2 ■” (s-Pj)m ’
Описание:
Функция р = [г, р, q] = residue(b, а) вычисляет вычеты, полюсы и целую часть от¬
ношения двух полиномов b(s) и a(s).
Функция rj = resi2(b, a, pole, m, j) вычисляет вектор коэффициентов разложения
дробно-рациональной функции b(s)/a(s) для полюса pole, имеющего кратность т. Па¬
раметр j указывает, какой из коэффициентов rj вычисляется при данном обращении
к функции; по умолчанию j = m; если не указано т, то оно принимается равным 1,
т. е. функция определяет вычеты для простых корней.
Функция [b, а] = residue(r, р, к) с тремя входными и двумя выходными параметрами
выполняет обратную функцию свертки разложения в дробно-рациональную функцию
отношения двух полиномов b(s) и a(s).
Примеры:
Рассмотрим дробно-рациональную функцию отношения двух полиномов Ь(х)/а(х)
с некратными корнями.
Ь = [3 2 1]; а = [1357];
[r,p,k] = residue(b,а)
г =
1.7642
0.61789 + 0.7589И
0.61789 - 0.7589И
5. Матрицы и линейная алгебра
523
р =
-2.1795
-0.41025 + 1.7445i
-0.41025 - 1.7445i
к = []
Поскольку порядок числителя меньше порядка знаменателя, целая часть функции
отсутствует.
Восстановим исходную дробно-рациональную функцию, используя следующее об¬
ращение:
[blzal] = residue(г,р,к)
Ы = 3 2 1
al = 1 3 5 7
Поменяем местами числитель и знаменатель дробно-рациональной функции,
а = [3 2 1]; Ь = [1357];
[r,p,q] = residue(bzа)
г =
0.51852
0.51852
Р =
-0.33333
-0.33333
q = 0.33333
1.8332i
+ 1.8332i
+ 0.4714i
0.4714i
0.77778
В этом случае появляется целая часть функции, определяемая вектором q.
Обратимся к случаю кратных корней и рассмотрим следующую дробно-рацио¬
нальную функцию:
Ь = [3 2 1]; а = [133 1];
d = roots(а)
d =
-1
-1 +8.3089e-006i
-1 -8.3089e-006i
Точность вычисления не слишком велика. Проверим, что эта функция имеет крат¬
ные корни в точке -1:
Jstr = jord(compan(a)z-1)
Jstr = -1 0 0 1
Действительно, сопровождающая матрица compan(a) имеет клетку Жордана по¬
рядка 3. Это означает, что разложение дробно-рациональной функции должно иметь
вид
Ь(1) _ Г1 , Г2 ! Г3
a(s) s+1 (s+1)2 (s+1)3 ’
где вычеты rl, г2, гЗ вычисляются следующим образом:
rl = resi2(bzaz-lz3Z1)
r2 = resi2(bzaz-lz3Z2)
r3 = resi2(bzaz-lz3Z3)
524
В. Г. Потемкин. Вычисления в среде MATLAB
rl = 3
r2 = -4
r3 = 2
Ограничения:
В вычислительном отношении разложение дробно-рациональной функции на про¬
стые дроби плохо обусловлено. Если полином знаменателя имеет корни, близкие
к кратным, то малые возмущения исходных данных могут привести к большим по¬
грешностям вычисления полюсов и вычетов. Предпочтительнее использовать матрич¬
ные описания или представление таких функций в виде нулей и полюсов.
Сопутствующие функции'. POLY, ROOTS.
5. Матрицы и линейная алгебра
525
6. РАБОТА С РАЗРЕЖЕННЫМИ МАТРИЦАМИ
При решении многих прикладных задач приходится иметь дело с разреженными
матрицами, т. е. с матрицами, имеющими много нулевых элементов. К числу таких
задач в первую очередь следует отнести граничные задачи для систем дифференци¬
альных уравнений в частных производных. Возникающие при этом модели - это, как
правило, квадратные матрицы высокого порядка с малым количеством ненулевых диа¬
гоналей.
Известно, что матрица порядка п требует для своего хранения п2 байт оперативной
памяти, а время выполнения матричных операций пропорционально п3. Поэтому, ко¬
гда количество неизвестных переменных достигает нескольких сотен, вычисления
с полными матрицами становятся неэффективными и необходимо принимать во вни¬
мание степень разреженности матрицы, т. е. отношение количества ненулевых элемен¬
тов к общему количеству элементов матрицы.
Для разреженной матрицы S порядка m х п с количеством ненулевых элементов
nnz(S) требования к объему оперативной памяти пропорциональны nnz. Вычислитель¬
ная сложность операций с элементами разреженной матрицы также пропорциональна
nnz, линейно зависит от ш и п и не зависит от произведения ш х п. Сложность такой
операции, как решение системы линейных уравнений с разреженной матрицей, зави¬
сит от упорядочения элементов и заполненности матрицы.
При работе с разреженными матрицами соблюдается фундаментальный принцип
вычислительной сложности: время, необходимое для выполнения матричных опера¬
ций с разреженной матрицей, пропорционально количеству арифметических операций
с ненулевыми элементами. Это подтверждает широко распространенное правило: вре¬
мя вычислений пропорционально количеству операций с плавающей точкой.
В версии MATLAB 6 включен ряд новых М-функций, а также модернизированы
существующие, в частности процедура condest теперь обеспечивает более точные
оценки числа обусловленности, ускорены процедуры eigs и svds, которые теперь ис¬
пользуют библиотеку ARPACK на языке Fortran. Новые функции colamd и symamd
реализуют приближенное упорядочение с минимальным числом перестановок, чтобы
увеличить разреженность факторизующих множителей. Новые процедуры symmlq,
minres и lsqr реализуют итерационные алгоритмы для решения СЛАУ с произвольными
симметрическими матрицами и проблемы, связанные с методом наименьших квадратов.
6.1. Элементарные разреженные матрицы
SPARSE | Формирование разреженной матрицы
Синтаксис:
S = sparse(А)
S = sparse(i, j, s,m,n,nzmax)
S = sparse(i, j,s,m,n)
4ЙМОГгПИ0И
526
S = sparse(i,j,s)
S = sparse(m,n)
Описание:
Функция sparse - это встроенная функция, которая формирует матрицы в соответ¬
ствии с правилами записи разреженных матриц, принятыми в системе MATLAB; ко¬
личество входных аргументов этой функции - от 1 до 6.
Функция S = sparse(A) преобразовывает полную матрицу в разреженную, удаляя
из описания нулевые элементы; если исходная матрица разреженная, то sparse(S) воз¬
вращает S.
Общая форма функции S = sparse(i, j, s, m, n, nzmax) использует строки массива [i j s]
для формирования разреженной матрицы размера m х п с ненулевыми элементами,
количество которых не превышает nzmax. Векторы i и j задают позиции элементов
и являются целочисленными, а вектор s определяет числовые значения элементов, ко¬
торые могут быть действительными или комплексными. При формировании разре¬
женной матрицы все строки вида [i j 0] из описания удаляются. Длина результирую¬
щего вектора s точно совпадает с количеством ненулевых элементов разреженной
матрицы.
Обращение вида S = sparse(i, j, s, m, n) предполагает по умолчанию, что nzmax =
= length(s).
Обращение вида S = sparse(i, j, s) предполагает, что m = max(i) и n = max(j); эти
функции вычисляются раньше, чем будут удалены строки с нулевыми значениями s.
Обращение вида S = sparse(m, п) резервирует пространство для разреженной мат¬
рицы и равносильно обращению sparse([ ],.[ ], [ ], m, n, 0), где все m х п элементов яв¬
ляются нулевыми.
Над разреженными матрицами могут совершаться любые арифметические, логиче¬
ские и индексные операции, то же справедливо и для смешанных операндов - полных
и разреженных массивов. Операции с однородными операндами возвращают тот же
тип операнда; в случае смешанных операндов, как правило, возвращается полный тип,
за исключением случаев, когда в явном виде сохраняется разреженный тип. Например,
при поэлементном умножении массивов А .* S, где S - разреженный массив.
Некоторые операции, например S >= 0, приводят к генерации так называемых
BS(Big 5расе)-матриц, которые имеют разреженную структуру, но очень большое ко¬
личество нулевых элементов.
Примеры:
Функция S = sparse(l:n, 1 :n, 1) формирует единичную матрицу размера n х п с раз¬
реженной структурой и коэффициентом заполнения 1/п. Тот же результат может быть
получен с помощью оператора S = sparse(eye(n, п)), но при этом промежуточная мат¬
рица будет иметь полную структуру.
Массив вида В = sparse( 10000, 10000, pi), состоящий из одного элемента, вероятно,
не очень полезен, но такое обращение допустимо. Не пытайтесь применить функцию
full(B), вам потребуется 800 Мбайт памяти.
Следующая последовательность операторов сначала определяет структуру некото¬
рого произвольного массива S, а затем формирует соответствующий массив разрежен¬
ной структуры:
6. Работа с разреженными матрицами
527
[i,j,s] = find(S);
[m,n] = size(S) ;
S = sparse(i,j,s,m,n);
Эта последовательность операторов равносильна одному оператору sparse(S).
Сопутствующие функции-. DIAG, FIND, FULL, NNZ, NONZEROS, NZMAX, SPONES,
SPRANDN, SPRANDSYM, SPY.
SPDIAGS j Формирование диагоналей разреженной матрицы
Синтаксис:
[B,d] = spdiags(А)
В = spdiags(A,d)
А = spdiags(В,d,А)
А = spdiags(В,d,m,п)
Описание:
Функция spdiags расширяет возможности встроенной функции diag и позволяет ра¬
ботать с различными комбинациями следующих трех матриц, которые могут быть как
входами, так и выходами функции spdiags.
А - матрица размера m х п, как правило (но не обязательно), разреженная с ненуле¬
выми элементами на р диагоналях.
В - матрица размера min(m, п) х р, как правило (но не обязательно), полная, столб¬
цы которой являются диагоналями А.
d - вектор длины р, целочисленные элементы которого определяют номера ненуле¬
вых диагоналей А (верхние диагонали нумеруются положительными числами, ниж¬
ние - отрицательными).
Грубо говоря, матрицы А, В и вектор d связаны друг с другом следующим образом:
for к = 1:р
В(:,к) = diag(A,d(k))
end
Функция spdiags определяет следующие 4 операции в зависимости от количества
входных аргументов:
• выделить все ненулевые диагонали:
[В, d] = spdiags(А);
• выделить указанные диагонали:
. В = spdiags(A, d);
• заменить указанные диагонали матрицы А:
А = spdiags(В, d, А);
• сформировать разреженную матрицу размера m х п по известным диагоналям:
А = spdiags(В, d, m, n) ;
Пример:
Сформировать трехдиагональную разреженную матрицу для разностного операто¬
ра 2-го порядка, заданного на сетке из девяти узлов.
528
В. Г. Потемкин. Вычисления в среде MATLAB
n = 9; е = ones(n,l);
A = spdiags([e -2*e e], -1:1,11/11);
spy(A) % рис. 6.1,a
Теперь из нее можно сформировать тестовую матрицу Уилкинсона wilkinson(n),
изменяя элементы главной диагонали:
А = spdiags(abs(-(п-1)/2:(п-1)/2)1, О, А) ;
spy(А) % рис. 6.1,6
а
рис. 6.1
Рассмотренные матрицы отличаются одним ненулевым элементом.
В заключение выделим ненулевые диагонали матрицы Уилкинсона:
В = spdiags(А)
В =
1-2 0
•1 -2 1
1-2 1
1-2 1
1-2 1
1-2 1
1-2 1
1-2 1
0,-2 1
Рассмотрим пример прямоугольного массива размера 7x4 с тремя ненулевыми диа¬
гоналям^:
[11
0
13
0
0
22
0
24
0
0
33
0
41
0
0
44
0
52
0
0
0
0
63
0
0
0
0
74];
6. Работа с разреженными матрицами
529
Определим структуру этого массива.
[B,d] = spdiags(А); В, р = d'
В =
41
11
0
52
22
0
63
33
13
74
.44
24
-3
0
2
Ненулевыми для этого массива являются поддиагональ с номером -3, основная
диагональ с номером 0 и наддиагональ с номером 2.
Теперь для исходного массива А можно построить массив разреженной структуры:
А = spdiags(В,d,7,4)
А =
(1,1)
11
(4,1)
41
(2,2)
22
(5,2)
52
(1,3)
13
(3,3)
33
(6,3)
63
(2,4)
24
(4,4)
44
(7,4)
74
Рассмотрим пример,
когда массив диагоналей В имеет количество элементов
в столбце, превышающее длину соответствующих диагоналей.
В = repmat((1:6)
*, [1
7])
В =
1
1
1
1
1
1
1
2
2
2
2
2
2
2
3
3
3
3
3
3
3
4
4
4
4
4
4
4
5
5
5
5
5
5
5
6
6
6
6
6
6
6
С помощью вектора р можно задать 7 ненулевых диагоналей для матрицы размера
6x6.
р =
[-4
-2
-1
0
3 4 5];
А =
spdiags(В,
Р/
6,6); full(А)
ans
=
1
0
0
4
5
6
1
2
0
0
5
6
1
2
3
0
0
6
0
2
3
4
0
0
1
0
3
4
5
0
0 2
0
4
5
6
Эта матрица характеризуется следующей структурой диагоналей:
530
В. Г. Потемкин. Вычисления в среде MATLAB
[В d]=spdiags(А); В,
р = d'
В =
1
1
1
1
0
0
0
2
2
2
2
0
0
0
0
3
3
3
0
0
0
0
4
4
4
4
0
0
0
0
5
5
5
5
0
0
0
0
6
6
6
6
р = -4
-2
-1
0
3
4
5
Сопутствующая функция - DIAG.
SPEYE
Единичная разреженная матрица
Синтаксис:
S = speye (m,n)
S = speye(n)
Описание:
Функция speye(m, п) формирует разреженную матрицу размера m х п с единицами
на главной диагонали и нулевыми внедиагональными элементами.
Функция speye(n) равносильна функции speye(n, п).
Пример:
Оператор А = speye( 1 000) формирует разреженный массив, соответствующий еди¬
ничной матрице размера 1000x 1000 и требует для этого всего 16 Кбайт памяти.
Аналогичный конечный результат может быть получен с помощью оператора А =
= sparse(eye( 1000,1000)), но в этом случае промежуточная матрица будет полной.
Сопутствующие функции'. SPALLOC, SPONES, SPRAND, SPRANDN, SPRANDSYM.
SPRAND,
SPRANDN
Случайные разреженные матрицы
Синтаксис:
R = sprand(S)
R = sprand(m,n,alpha)
R = sprand(mzn,alpha,rcond)
R = sprandn(S)
R = sprandn(m,n,alpha)
R = sprandn(m,n,alpha,rcond)
Описание:
Матрица вида R = sprand(S) имеет ту же структуру, которую имеет и разреженная
матрица S, но при этом значения ее ненулевых элементов распределены по равномер¬
ному закону в интервале (0, 1).
Матрица вида R = sprand(m, n, alpha) - это случайная разреженная матрица, которая
имеет приблизительно alpha * m * п ненулевых элементов, распределенных по равно¬
мерному закону, где alpha- коэффициент заполнения со значением в пределах
0 < alpha < 1.
Матрица вида R = sprand(m, n, alpha, rcond) в дополнение к вышеперечисленным
условиям имеет также число обусловленности по отношению к операции обращения,
близкое к значению rcond. Матрица R формируется в виде суммы матриц ранга 1.
6. Работа с разреженными матрицами
531
Если rcond - вектор длины 1г < min(m, п), то матрица R имеет в качестве первых
1г сингулярных чисел значения вектора rcond, а остальные сингулярные числа равны
нулю. В этом случае матрица R генерируется с помощью матриц случайных плоских
вращений, которые применяются к диагональной матрице с заданным спектром син¬
гулярных чисел.
Матрица вида R = sprandn(S) имеет ту же структуру, которую имеет и разреженная
матрица S, но при этом значения ее ненулевых элементов распределены по нормаль¬
ному закону со средним, равным нулю, и дисперсией 1.
Матрица вида R = sprandn(m, n, alpha) - это случайная разреженная матрица, кото¬
рая имеет приблизительно alpha * m * п ненулевых элементов, распределенных
по нормальному закону, где alpha - коэффициент заполнения со значением в пределах
О < alpha < 1.
Матрица вида R = sprandn(m, n, alpha, rcond) в дополнение к вышеперечисленным
условиям имеет также число обусловленности по отношению к операции обращения,
близкое к значению rcond. Если rcond - вектор длины lr < min(m, п), то матрица R име¬
ет в качестве первых 1г сингулярных чисел значения вектора rcond, а остальные сингу¬
лярные числа равны нулю. В этом случае матрица R генерируется с помощью матриц
случайных плоских вращений, которые применяются к диагональной матрице с задан¬
ным спектром сингулярных чисел. Такие матрицы играют важную роль при анализе
алгебраических и топологических структур.
Примеры:
Построим случайную разреженную матрицу порядка 10 с ненулевыми элементами,
распределенными по равномерному закону в интервале (0, 1), коэффициентом запол¬
нения 0.5 и пятью заданными сингулярными числами.
R = sprand(10,10,0.5,[1 le-1 1е-2 1е-3 1е-4]);
s = svd(full(R));
subplot(1,2,1), spy(R),hold on
subplot(1,2,2), semilogy(s,*-r*,'Linewidth*,2),hold on
semilogy (s,* sk*,'Markersize *,5,'MarkerFaceColor',*g*);
grid on, title(*svd(R)*), hold off % рис. 6.2
532
В. Г. Потемкин. Вычисления в среде MATLAB
Эта случайная матрица имеет 54 ненулевых элемента, 5 ее сингулярных чисел
имеют заданные значения, остальные близки к нулю.
Построим случайную разреженную матрицу порядка 10 с ненулевыми элементами,
распределенными по нормальному закону со средним, равным нулю, и дисперсией 1,
коэффициентом заполнения 0.5 и пятью заданными сингулярными числами.
R = sprandn(10,10,0.5, [1 le-1 1е-2 1е-3 1е-4]);
s = svd(full(R));
subplot(1,2,1),spy(R),hold on
subplot (1,2,2), semi logy (s, 1-r', 'Linewidth' ,2), hold on
semilogy(sz 'sk', 'Markersize',5, 'MarkerFaceColor', 'g');
grid on, title('svd(R)'), hold off % рис. 6.3
рис. 6.3
Эта случайная матрица имеет 52 ненулевых элемента, 5 ее сингулярных чисел
имеют заданные значения, остальные близки к нулю.
Сопутствующая функция - 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.
6. Работа с разреженными матрицами
533
Матрица вида R = sprandsym(n, alpha) - это случайная симметрическая разреженная
матрица, которая имеет приблизительно alpha х m х п ненулевых элементов, распреде¬
ленных по нормальному закону, где alpha - коэффициент заполнения со значением
в пределах 0 < alpha < 1 и каждый элемент сформирован в виде суммы нескольких
нормально распределенных чисел.
Матрица R = sprandsym(n, alpha, rcond) имеет число обусловленности по отноше¬
нию к операции обращения, равное rcond. Значения случайных элементов находятся
в пределах [-1 1] и симметричны относительно нуля, однако закон распределения
не является равномерным. Если rcond - вектор длины п, то матрица 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 игнорируется.
Пример:
Построим случайную симметрическую разреженную матрицу порядка 10 с ненуле¬
выми элементами из интервала [-1 1], коэффициентом заполнения 0.5 и числом обу¬
словленности 1е-1.
R = sprandsym(5,0.5,1:-0.1:0.6); full(R)
ans =
1
0
0
0
0
0
0.70005
0.0012534
0.0029953
-0.00090066
0
0.0012534
0.68704
0.071655
0.081174
0
0.0029953
0.071655
0.87124
-0.05149
0
-0.00090066
0.081174
-0.05149
0.74167
subplot(1,2,1),spy(R),hold on
subplot(l,2,2),ps(R,0);
grid on,axis auto,title('eig(R)1) % рис. 6.4
534
В. Г. Потемкин. Вычисления в среде MATLAB
о
рис. 6.4
Эта матрица имеет 17 ненулевых элементов, и все 5 ее собственных чисел имеют
заданные значения.
Сопутствующие функции'. SPRAND, SPRANDN.
6.2. Преобразование разреженных матриц
FIND
Определение индексов ненулевых элементов
Синтаксис:
к = find(x)
[i,j] = find(X)
[i,j,s] = find(X)
к = find(<условие>)
[i,j] = find(<условие >)
[ifj, s] = find(<условие >)
Описание:
Функция к = find(x) определяет индексы ненулевых элементов вектора х; если та¬
ких элементов нет, то результатом является пустой вектор. Если входом является мат¬
рица X, то при данном способе вызова функции find она рассматривается как вектор-
столбец хранения x(i), образованный объединением столбцов исходной матрицы.
Функция [д, j] = find(X) возвращает индексы строк и столбцов ненулевых элементов
матрицы X; часто используется при работе с разреженными матрицами.
Функция [i, j, s] = fmd(X) возвращает индексы, а также вектор-столбец s ненулевых
элементов матрицы X.
Если в качестве аргумента функции find используется <условие>, то первые две
функции обладают теми же свойствами, а функция [i, j, s] = Ппб(<условие>) будет
формировать в качестве вектора s логический вектор единиц вместо значений ненуле¬
вых элементов.
Пример:
Определить индексы ненулевых элементов матрицы Уилкинсона порядка 4.
W = gallery('wilkinson1,4)
W =
1.5
1
0
0
1
0.5
1
0
0
1
0.5
1
0
0
1
1.5
6. Работа с разреженными матрицами
535
s
1.5
1
1
0.5
1
1
0.5
1
1
1.5
Определить индексы элементов матрицы Уилкинсона порядка 4, которые превы¬
шают значение 1.
[i,j,s] = find(W > 1)
i = j =
1 1
4 4
1
1
В этом случае вектор s является логическим массивом, состоящим из единиц.
Сопутствующие функции: NONZEROS, SPARSE.
FULL | Преобразование разреженной матрицы в полную
Синтаксис:
А = full(S)
Описание:
Функция А = full(S) изменяет способ хранения матрицы в памяти компьютера; если
исходная матрица А была полной, то функция full(A) возвращает А.
Пусть X - матрица размера m х n с nz = nnz(X) ненулевыми элементами. Тогда для
размещения выхода функции full(X) требуется пространство для ш * п действительных
чисел, в то время как входная разреженная матрица sparse(X) требует пространства для
размещения только nz действительных и nz + п целых чисел. Большинству компьюте¬
ров для хранения действительного числа нужно вдвое больше памяти, чем для целого.
Для таких компьютеров хранение в форме sparse(X) будет экономичнее, чем в форме
full(X), если коэффициент заполнения alpha будет удовлетворять условию
alpha = nnz/(mxn)<2/3.
Однако обработка разреженных матриц требует существенно большего числа опе¬
раций, чем полных, так что коэффициент заполнения должен быть существенно мень¬
ше, чем 2/3, чтобы работа с разреженной матрицей оказалась более эффективной.
Пример:
Рассмотрим случайную разреженную матрицу порядка 200 с коэффициентом за¬
полнения около 2/3.
S = sprand(200,200,2/3);
А = full(S); whos
536
В. Г. Потемкин. Вычисления в среде MATLAB
Пате
(переменная)
Size
(размер массива)
Bytes
(размер памяти)
Clas
(тип массива)
А
200 by 200
320000
double array
S
200 by 200
234840
double array (sparse)
Grand total is 59503 elements using 554840 bytes.
Общее количество элементов - 59 503, использовано 554 840 байт.
Таким образом, хранение массива данных в разреженной форме сокращает потреб¬
ность в памяти приблизительно на 1/3.
Обратите также внимание, что в отличие от версии 5 в версии MATLAB 6 характе¬
ристика массива sparse является атрибутом.
Сопутствующая функция - SPARSE.
SPCONVERT | Преобразование данных в ASCII-формате
в массив разреженной структуры
Синтаксис:
S = spconvert(D)
Описание:
М-функции load и save поддерживают работу с массивами разреженной структуры,
поэтому нет необходимости вводить специальные команды для загрузки и выгрузки
разреженных массивов. Однако если внешний файл содержит данные о массиве раз¬
реженной структуры в ASCII-формате, то требуется преобразование этих данных
во внутреннюю форму хранения. Предполагается, что внешний файл может быть ор¬
ганизован в виде массива со структурой [i j s] или [i j r s], а число строк должно быть
равно nnz или nnz + 1. Массив с тремя столбцами соответствует действительным эле¬
ментам, а с четырьмя столбцами - комплексным. Последняя строка массива типа [m п 0]
или [т п 0 0] может служить для задания размеров разреженной матрицы.
Функция spconvert применяется только для ASCII-файлов и файлов с расширением
mat. Если матрица D имеет разреженную структуру, то никаких преобразований
не требуется.
Пример:
С помощью встроенного редактора создадим ASCII-файл, содержащий следующие
записи, и сохраним его в рабочем каталоге work под именем 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
6. Работа с разреженными матрицами
537
Массив состоит из 11 строк. В данном случае последняя строка не является необ¬
ходимой, поскольку размер матрицы был определен указанием ненулевого элемента
(4, 4).
Следующая последовательность операторов загружает данные и восстанавливает
разреженную матрицу sparse(triu(hilb(4))).
load uphi11.dat
H = spconvert(uphill)
H =
(1,1)
1
(1,2)
0.5
(2,2)
0.33333
(1,3)
0.33333
(2,3)
0.25
(3,3)
0.2
(1,4)
0.25
(2,4)
0.2
(3,4)
0.16667
(4,4)
0.14286
Сопутствующие функции: LOAD, SAVE.
6.3. Работа с ненулевыми элементами
ISSPARSE | Проверка принадлежности к классу разреженных матриц
Синтаксис:
k = issparse(X)
Описание:
Функция issparse(X) принимает значение 1, если матрица X является разреженной,
и 0, если полной.
. Поскольку большинство функций системы MATLAB работает корректно с обоими
типами матриц, то на практике применение функции issparse для распознавания типа
матрицы достаточно редко.
Пример:
Допустим, что мы хотим использовать разные процедуры оценки нормы матрицы
для случая разреженной и полной матрицы. Тогда можно применить следующий опе¬
ратор условия, чтобы различить эти два случая:
if issparse(X)
nrm = normest(X).
else
nrm - norm(X)
end
Сопутствующие функции: FULL, SPARSE.
538
В. Г. Потемкин. Вычисления в следе MATLAB
Количество ненулевых элементов
NNZ |
Синтаксис:
nz = nnz(S)
Описание:
Функция nnz(S) определяет количество ненулевых элементов в разреженной мат¬
рице S.
Коэффициент заполнения разреженной матрицы, который выводится на экран
по команде whos, определяется по формуле nnz(S)/prod(size(S)).
Пример:
Матрица Уилкинсона - это трехдиагональная матрица порядка 21 с 20 ненулевыми
элементами на каждой диагонали.
W = sparse(wilkinson(21)); nz = nnz(W)
nz = 60
Сопутствующие функции'. FIND, ISA, NONZEROS, NZMAX, SIZE, WHOS.
NONZEROS | Формирование вектора ненулевых элементов
Синтаксис:
v = nonzeros(S)
Описание:
Функция nonzeros(S) формирует вектор ненулевых элементов матрицы, выбирая их
по столбцам. Эта функция аналогична функции [i, j, s] = find(X), но в отличие от по¬
следней формирует только третий выход s. При этом, как правило, выполняется условие
length(v) = nnz(S) < nzmax(S) < prod(size(S)).
Сопутствующие функции: FIND, ISA, NNZ, NZMAX, SIZE, WHOS.
Количество ячеек памяти для размещения
ненулевых элементов
Синтаксис:
n = nzmax(S)
Описание:
Для полной матрицы F - это общее количество элементов, определяемое соотно¬
шением nzmax(F) = prod(size(F)); для разреженной - это количество ячеек для разме¬
щения ненулевых элементов. Как правило, функции nnz(S) и nzmax(S) дают одинако¬
вые значения. Однако в случае операций над разреженными матрицами, в результате
которых возникают новые ненулевые элементы, например операций умножения и LU-
разложения, может быть выделено больше элементов памяти, чем это требуется при
конкретном вычислении, т. е. выполняется условие nnz(S) < nzmax(S).
NZMAX ]
6. Работа с разреженными матрицами
539
Этот параметр целесообразно применять в операторах sparse(i, j, s, m, n, nzmax) или
spalloc(m, n, nzmax) для предварительного выделения памяти.
Сопутствующие функции'. FIND, ISA, NNZ, NONZEROS, SIZE, WHOS.
SPALLOC~| Выделить пространство памяти для разреженной матрицы
Синтаксис:
S = spalloc(m,n,nzmax)
Описание:
Функция S = spalloc(m, n, nzmax) создает массив для размещения разреженной мат¬
рицы размера m х п с учетом того, что количество ненулевых элементов не превышает
nzmax. Затем матрица может быть заполнена по столбцам. Функция spalloc(m, п,
nzmax) равносильна форме функции sparse([ ],[],[ ], m, n, nzmax).
Пример:
Если известно, что случайная матрица порядка 5 должна иметь максимум 3 нену¬
левых элемента на столбец, то наиболее эффективный способ ее формирования сле¬
дующий:
п = 5; S = spalloc(n,n,3*n);
for j = l:n
S (: , j )
= [zeros(n-3, 1)1
round(rand(3,1)1’]';
end
full(S)
ans =
0
0
0
.0
0
0
0
Q
0
0
1
1
1
1
0
1
0
1
1
1
0
0
1
1
0
Действительно, сформированная матрица имеет максимум 3 ненулевых элемента
на столбец.
Сопутствующая функция - SPARSE.
SPFUN I Вычисление функции только для ненулевых элементов
Синтаксис:
f = spfun(fun,S)
Описание:
Функция spfun применяет заданную функцию только к ненулевым элементам раз¬
реженной матрицы. Аргумент fun- это либо имя, либо дескриптор вычисляемой
функции, которая в качестве входного аргумента использует массив S.
540
В. Г. Потемкин. Вычисления в среде MATLAB
Пример:
Функция вида f = spfun(@exp, S) вычисляет разреженную матрицу с тем же коэф¬
фициентом заполнения, который имеет и матрица S, если не учитывать появления
элементов exp(-inf) —> 0. В то же время функция exp(S) применяет функцию ехр к каж¬
дому элементу матрицы S и нулевые элементы становятся единичными.
Пусть задана диагональная разреженная матрица размера 4x4:
S = spdiags([1:4]1,0,4,4)
S =
(1,1) 1
(2,2) 2
(3.3) 3
(4.4) 4
Функция
f = spfun(@ехр,S)
f =
(1.1) 2.7183
(2.2) 7.3891
(3.3) 20.086
(4.4) 54.598
имеет тот же коэффициент заполнения, что и матрица S.
В то же время функция exp(S) содержит единицы на месте нулей:
full(exp(S))
ans =
2.7183
1.0000
1.0000
1.0000
1.0000
7.3891
1.0000
1.0000
1.0000
1.0000
20.0855
1.0000
1.0000
1.0000
1.0000
54.5982
Функцию spfun можно оформить в виде объекта inline для задания любой элемен¬
тарной функции fun следующим образом:
g = ipline(1spfun(fun,S)1)
g =
Inline function:
g(S,fun) = spfun(fun,S)
Теперь можно вычислить заданную функцию для ненулевых элементов, применяя
следующий оператор, весьма близкий к естественной математической нотации:
g(S,@exp)
ans =
(1.1) 2.7183
(2.2) 7.3891
(3.3) 20.086
(4.4) 54.598
Сопутствующие функции'. @, INLINE.
6. Работа с разреженными матрицами
541
SPONES I Формирование матрицы связности
Синтаксис:
R = spones(S)
Определение:
Матрицей связности для разреженной матрицы S называется такая матрица R, ко¬
торая имеет структуру матрицы S, но ее ненулевые элементы заменены единицами.
Эта матрица позволяет характеризовать структуру разреженной матрицы и формиро¬
вать граф этой матрицы.
Описание:
Функция R = spones(S) генерирует для заданной разреженной матрицы матрицу
связности, которая имеет структуру матрицы S, в которой ненулевые элементы заме¬
нены единицами.
Примеры:
Функция с = sum(spones(S)) вычисляет количество ненулевых элементов каждого
столбца.
Функция г = sum(spones(S’))' вычисляет количество ненулевых элементов каждой
строки. При этом соблюдается условие (
sum(с) = sum(г) = nnz(S).
Сопутствующие функции'. NNZ, SPALLOC, SPFUN.
6.4. Характеристики разреженной матрицы
NORMEST | Оценка 2-нормы разреженной матрицы
Синтаксис:
nrm = normest(S)
пгт = normest(S, tol)
[nrm,ent] = normest(S)
Описание:
Эта функция изначально предназначалась для работы с разреженными матрицами,
хотя она работает корректно и может быть полезна для оценки нормы и больших пол¬
ных матриц.
Функция nrm = normest(S) вычисляет оценку 2-нормы матрицы S с относительной
погрешностью 1 е-6 (по умолчанию).
Функция nrm = normest(S, tol) вычисляет оценку 2-нормы матрицы S с заданной
относительной погрешностью tol.
Функция [nrm, ent] = normest(S) позволяет определить количество итераций, ис¬
пользованных при вычислении оценки нормы.
542
В. Г. Потемкин. Вычисления в среде MATLAB
Алгоритм:
Каждая итерация включает операцию умножения матрицы S на ее транспониро¬
ванную S'. Такие операции выполняются до тех пор, пока две последовательные оцен¬
ки нормы не будут различаться в пределах заданной погрешности tol.
Пример:
Сравним эффективность вычисления 2-нормы для полных и разреженных матриц
достаточно высокой размерности, имея в виду, что процедура вычисления нормы пол¬
ной матрицы включает операцию SVD-разложения.
i = 1;
for k = 20:20:300
W = sparse(wilkinson(k));
tic, normest (W) ; ts(i) = toe;
tic, norm(full (W)); tf(i) = toe;
x(i) = k;
i = i+1;
end
plot(x,tf,'-ob*),hold on
plot(x,ts,1-sr1) % рис. 6.5
Аппроксимируем полученные данные с помощью опции Basic Fitting меню Tools
в окне Figure. Соответствующие аппроксимирующие полиномы равны:
для кривой tfull:
pfull = 3.4458е-008*хлЗ - 7.0472е-006*хл2 + 0.00065695*х - 0.017122;
для кривой tsparse:
psparse = 5.5551е-007*хл2 + 0.00010259*х + 0.016549.
Сравнивая эффективность оценки нормы для полной и разреженной матриц, следу¬
ет заметить, что преимущество использования процедуры normest проявляется только
для матриц, порядок которых превышает значение 160, и для значения п, равного 300,
6. Работа с разреженными матрицами
543
время работы процедуры norm в 5 раз превышает время работы процедуры normest.
Значения самих оценок практически совпадают, в чем читатель может убедиться само¬
стоятельно.
Сопутствующие функции: COND, CONDEST, NORM, RCOND, SVD.
CONDEST | Оценка числа обусловленности матрицы по 1-норме
Синтаксис:
с = condest(А)
[c,v] = condest(А)
Описание:
Функция с = condest(A) вычисляет оценку числа обусловленности матрицы А
по отношению к операции обращения. Вычисленное значение с является нижней
оценкой числа обусловленности матрицы А по 1-норме.
Функция [с, v] = condest(A), кроме того, вычисляет такой вектор v, который удов¬
летворяет соотношению ||Av|| = ||A||*||v||/c. Таким образом, для больших значений
с вектор v является аппроксимацией нуль-вектора матрицы А.
Эта функция применима как к действительным, так и к комплексным, полным
и разреженным матрицам.
Пример:
Вычислим оценки нижней границы числа обусловленности для матрицы Уилкин¬
сона порядка 200, используя М-функции cond, rcond и condest.
W = wilkinson(200);
cond(W,1),1/rcond(W),condest(sparse(W))
ans = 612.613258163289
ans = 612.613258163289
ans = 612.613258163289
Все процедуры дают одинаковые оценки нижней границы числа обусловленности.
Алгоритм:
Алгоритм реализует весьма эффективный блочный метод, описанный в работе [56].
Сопутствующие функции’. COND, RCOND, NORMEST.
SPRANK | Структурный ранг разреженной матрицы
Синтаксис:
г = sprank(S)
Определение:
Структурный ранг матрицы вводится для характеристики случайных матриц с про¬
извольным количеством нулей и единиц. Для величины структурного ранга всегда вы¬
полняется условие
sprank(A) > rank(А);
544
В. Г. Потемкин. Вычисления в среде MATLAB
более того, в точной арифметике с вероятностью 1 выполняется условие
sprank(A) == rank(full(sprandn(A))).
Он широко применяется в теории графов и тесно связан с матрицей связности раз¬
реженной матрицы.
Описание:
Функция г = sprank(S) вычисляет структурный ранг разреженной матрицы S.
Пример:
Матрица размера 3x3 следующего вида:
’2 0 1
А= О О О
3 0 х
имеет структурный ранг sprank(A) = 2 при любом значении х; что касается ранга этой
матрицы, то rank(A) = 2 всюду, кроме точки х = 3/2, где он равен 1.
Проверим, что матрицы такой структуры имеют структурный ранг, равный 2, хотя
конкретно заданная матрица может иметь и меньший ранг. Для этого сформируем сле¬
дующую разреженную матрицу:
S = sparse(3,3);
S(l,l) = 2; S(l,3) = 1; S(3,l) = 3; S(3,3) = 3/2-le-15
spl = sprank(S)
sp2 = rank(full(sprandn(S)))
ranks = rank(full(S))
S =
(1,1)
(3,1)
(1.3)
(3.3)
spl = 2
sp2 = 2
ranks = 1
2
3
1
Сопутствующие функции-. DMPERM, RANK.
6.5. Визуализация разреженных матриц
GPLOT I
Построение графа
Синтаксис:
gplot(R,xy)
gplot(R,xy,'LineSpec')
[X,Y] = gplot(R,xy)
6. Работа с разреженными матрицами
545
18 т. Зак. 3375
Определение:
Граф G - это множество узлов, пронумерованных от 1 до п, и множество соедине¬
ний (ребер) между ними. Для построения графа требуется 2 матрицы: матрица связно¬
сти R и матрица координат размещения узлов ху. Матрица связности R такова, что
ее элемент R(i, j) = 1, если узел i связан с узлом]; матрица координат узлов размера
п х 2 определяет координаты узлов xy(i,:) = [x(i) y(i)].
Описание:
Функция gplot(R, ху) выполняет построение графа, заданного матрицей связности
R и матрицей координат ху.
Обращение в форме gplot(A, ху, 'LineSpec') позволяет изменить цвет и тип линий,
соединяющих узлы; по умолчанию принято LineSpec = g-.
Функция вида [X, Y] = gplot(A, ху) формирует массив координат вершин графа,
причем каждая пара вершин выделена значениями типа NaN. Эти векторы могут быть
использованы в дальнейшем для построения графа.
Пример:
Рассмотрим матрицу bucky размера 60x60, которую связывают с описанием формы
купола (Buckminster Fuller dome, отсюда название bucky). Ее граф соединений, описы¬
ваемый разреженной матрицей связности размера 60 х 60, напоминает футбольный
мяч или структуру молекулы углерода С60.
[В#ху] = bucky;
gplot (В,ху (:, [1 2]),1 г-1),axis square % рис. 6.6
рис. 6.6
Сопутствующие функции'. PLOT, SPY, TREELAYOUT, TREEPLOT, UNMESH.
SPY
Визуализировать структуру разреженной матрицы
Синтаксис:
spy(S)
spy(S,'Marksize')
spy(S, 'LineSpec')
spy(S,'Marksize', 'LineSpec')
spy(S, 'LineSpec','Marksize')
546
В. Г. Потемкин. Вычисления в среде MATLAB
Описание:
Функция spy(S) отображает на графике структуру произвольной разреженной мат¬
рицы S.
Функция вида spy(S, 'MarkSize') позволяет управлять размером маркера, исполь¬
зуемого для вывода точек; по умолчанию параметр MarkSize равен 6 пикселам.
Функция вида spy(S, ’LineSpec’) позволяет управлять типом и цветом выводимых
точек по правилам указания свойства 'LineSpec' функции plot.
Функции spy(S, 'MarkSize', 'LineSpec') и spy(S, 'LineSpec', 'MarkSize') объединяют
возможности двух вышеописанных функций.
Пример:
Отобразим в виде графика структуру матрицы bucky размера 60x60, используя
красный маркер в виде точки размером 16 пикселов:
В = bucky;
spy(В,16,1.г1) %
о
10
20
30
40
50
60
0 10 20 30 40 50 60
nz = 180
рис. 6.7
Сопутствующие функции’. FIND, GPLOT, LINESPEC, SYMAMD, SYMMMD, SYMRCM.
6.6. Алгоритмы упорядочения
RANDPERM
Формирование случайных перестановок
Синтаксис:
р = randperm(n)
Описание:
Функция р = randperm(n) выполняет случайную перестановку целых чисел от 1 до п.
Сопутствующая функция - PERMUTE.
6. Работа с разреженными матрицами
547
DM-декомпозиция разреженной матрицы
DMPERM |
Синтаксис:
р = dmperm(S)
[p,q,r] = dmperm(S)
[p,q,r,s] = dmperrn(S)
Описание:
Функция p = dmperm(S) возвращает вектор максимального соответствия; если ис¬
ходная матрица S имеет полный столбцовый ранг, то матрица S(p,:) является квадрат¬
ной с ненулевой диагональю. Матрица S(p,:) называется декомпозицией Далмейджа-
Менделъсона (Dulmage-Mendelsohn) или DM-декомпозицией.
Функция [р, q, г] = dmperm(S) определяет такую перестановку строк р и такую пе¬
рестановку столбцов q для квадратной матрицы S, что S(p, q) - матрица в верхней тре¬
угольной форме. Третий выходной аргумент г - это целочисленный вектор, который
описывает границы блоков, так что блок к матрицы S(p, q) имеет следующие границы:
г(к): r(k + 1) - 1.
Функция [р, q, г, s] = dmperm(S) определяет такую перестановку строк р и такую
перестановку столбцов q для прямоугольной матрицы S, что S(p, q) есть матрица
в верхней треугольной форме. Границы k-го блока определяются параметрами г и s со¬
гласно соотношению (r(k): r(k + 1) -1, s(k): s(k + 1) - 1).
Если матрица S не является квадратной или не имеет полного ранга, то ее первый
блок может иметь больше столбцов, чем строк, а последний - больше строк, чем
столбцов. Все другие блоки являются квадратными и неприводимыми.
Если S - приводимая матрица, то линейная система Sx - b может быть решена при¬
ведением S к верхней блочной треугольной форме с последующим применением об¬
ратных подстановок.
В терминах теории графов диагональные блоки соответствуют компонентам Холла
смежного графа матрицы А.
Более полную информацию о приведении разреженных матриц к блочной тре¬
угольной форме можно найти в работе [82].
Примеры:
Сформируем случайную разреженную матрицу S порядка 5 с коэффициентом за¬
полнения 0.5.
S = sprand(5,5,0.5); ranks = rank(full(S))
ranks = 5
Эта матрица имеет полный столбцовый ранг и для нее существует DM-
декомпозиция к квадратной матрице с ненулевой диагональю:
[p,q,r,s] = dmperm(S);
A =full(S(p,q))
А =
0.69318
0.65011
0
0.049162
0.98299
0
0.29741
0
0.0055839
0
0
0
0.41222
0.45069
0
0
0.46077
0.45735
0.81593
0
0
0
0
0
0.90161
548
В. Г. Потемкин. Вычисления в среде MATLAB
Здесь элементы неприводимых блоков выделены полужирным шрифтом. Убедим¬
ся, что эти же блоки определяются параметрами г и s.
г, S
г = 1 2 5 6
s — 1 2 5 6
Читатель может самостоятельно проверить, что вычисленные границы соответст¬
вуют неприводимым блокам.
Теперь сформируем случайную разреженную матрицу S порядка 5 с коэффициен¬
том заполнения 0.5, не имеющую полного ранга.
S = sprand(5,5,0.5); ranks = rank(full(S))
ranks = 4
Эта матрица может быть приведена к следующей блочной верхней треугольной
форме:
[p,q,r,s] = dmperm(S);
А = full(S(p,q))
А =
0
0.45106
0.90282
0
0
0.52076
0.39391
0.82886
0.80452
0.16627
0
0
0
0.56919
0
0
0
0
0
0.71812
0
0
0
0
0
В этом случае существует 3 блока, выделенные полужирным шрифтом: блок 1 име¬
ет размер 2x3, блок2 - 1x1, блок2 - 2x1. Первый и последний блоки являются прямо¬
угольными, блок 2 - квадратный.
Сопутствующая функция - SPRANK.
COLPERM | Упорядочение столбцов с учетом их разреженности
Синтаксис:
j = ’colperm(S)
Описание:
Функция] = colperm(S) возвращает такой вектор перестановок], что столбцы мат¬
рицы S(:, j) будут упорядочены по возрастанию числа ненулевых элементов. Эту про¬
цедуру целесообразно применять перед тем, как выполнить LU-разложение.
Если S - симметрическая матрица, то оказываются упорядоченными и строки
и столбцы. Если к тому же матрица S является еще и положительно определенной,
то такую процедуру перестановок целесообразно применять перед тем, как выполнить
разложение Холецкого.
Алгоритм:
Алгоритм очень прост, он реализует сортировку столбцов по числу ненулевых эле¬
ментов и выглядит следующим образом:
[ I, □ ] = find(S);
[ignore,р] = sort(diff(find(diff([0 j' inf]))));
6. Работа с разреженными матрицами
549
Примеры:
Рассмотрим матрицу
А = [ones(l,n); ones(n-l,l) speye(n-1,n-1)]
при n = 4
n = 4;
A = [ones(l,n);
A = full(A)
A =
1 1
1 1
1 0
1 0
ones (n-1,1) speye (n-1,n-1) ] ;
1 1
0 0
1 0
0 1
Ее LU-разложение представляет почти полную матрицу:
luA = lu(A)
luA =
1 1
-1 -1
-1 О
-1 -1
1 1
О -1
-1 -1
-1 2
Функция упорядочения столбцов j = colperm(A) возвращает вектор перестановок
j = [2:n 1], так что матрица A(j, j) имеет следующий вид:
j = colperm(A);
Aj j
Ajj
=
1 0
0
•1
0 1
0
1
0 0
1
1
1 1
1
1
а ее LU-разложение имеет такую же структуру ненулевых элементов, как и в исходной
матрице:
lu(A(j,j))
ans =
1
0
0
1
0
1
0
1
0
0
1
1
-1
-1
-1
-2
Сопутствующие функции'. CHOL, COLMMD, LU, SYMRCM.
COLMMD |
Синтаксис:
р = colmmd(S)
MMD-упорядочение по разреженности столбцов
550
В. Г. Потемкин. Вычисления в среде MATLAB
Описание:
Функция р = colmmd(S) возвращает такой вектор упорядоченности столбцов для
несимметрической матрицы S, что матрица S(:, р) будет иметь более разреженное LU-
разложение, чем исходная матрица S.
Такое упорядочение автоматически применяется системой MATLAB при выполне¬
нии операций обращения \ и / при решении систем линейных уравнений с разрежен¬
ными матрицами.
Алгоритм:
Алгоритм MMD-упорядочения по разреженности столбцов для симметрических
матриц описан в обзоре Джорджа (George) и Лиу (Liu) [46]. Для несимметрических
матриц аналогичный алгоритм разработан заново и описан в работе Гильберта
(Gilbert), Моулера (Moler) и Шрайбера (Schriber) [47]. Он напоминает прежний алго¬
ритм для матрицы А’ * А, но в действительности такая матрица не формируется.
На каждом шагу алгоритма из оставшихся выбирается вершина низшего порядка,
т. е. столбец, имеющий минимальное количество ненулевых элементов, удаляет эту
вершину и строит новый граф, объединяя строки. После п шагов все столбцы оказы¬
ваются удаленными и перестановка завершается. Для ускорения этого процесса ис¬
пользуются специальные приемы для одновременного выполнения нескольких шагов.
Пример:
Интересный пример для анализа графов представляет модель, носящая название
Виску ball. Она представляет собой 60 точек, равномерно распределенных на сфере,
так что расстояние до соседних точек одинаково; каждая точка связана только с тремя
соседними. Модель Виску ball ассоциируется с четырьмя физическими объектами:
геодезическим куполом (Buckminster Fuller dome);
моделью атома углерода С60;
усеченным 20-гранником (икосаэдром);
моделью футбольного мяча.
Матрица связности для модели Виску ball - это симметрическая матрица размера
60x60 с тремя ненулевыми элементами в каждой строке и каждом столбце, так что
общее количество ненулевых элементов 180.
Ее граф имеет 60 вершин, которые пронумерованы так, что половина из них нахо¬
дится в одной, а половина в другой полусфере (рис. 6.8, а), и эти половины соединены
вместе. Такая нумерация приводит к структуре матрицы, изображенной на рис. 6.8, б.
[B,V] = bucky;
k = 1:30;
gplot(В(k,k),V(k,[1 2])),axis equal % рис. 6.8,a
for j=l:30
text(V(j,l),V(j,2)+0.04,int2str(j));
end
spy(В) % рис. 6.8,6
6. Работа с разреженными матрицами
551
а
б
В(:,р)
в
рис. 6.8
Выполним упорядочение по разреженности столбцов.
р = colmmd(B);
spy(В(:,р),16,'г')
Структура матрицы В (рис. 6.8, б) при этом разрушается (рис. 6.8, в).
Если сравнить LU-разложения матрицы В (рис. 6.9, а) и переупорядоченной матри¬
цы В(:, р) (рис. 6.9, б), можно увидеть, что количество ненулевых элементов в них
равно 795 и 645 соответственно.
spy(lu(B),16,’г*) % рис. 6.9,а
spy(lu(B(:,р)),16,’г1) % рис. 6.9,6
552
В. Г. Потемкин. Вычисления в среде MATLAB
lu(B)
lu(B(:,p))
рис. 6.9
Сопутствующие функции'. CHOL, COLAMD, COLMMD, LU, SPPARMS, SYMAMD,
SYMMMD, SYMRCM.
COLAMD | Приближенное упорядочение по разреженности столбцов
Синтаксис:
р = colamd(S)
р = colamd(S,knobs)
[р,stats] = colamd(S)
[р,stats] = colamd(S,knobs)
Описание:
Функция p = colamd(S) возвращает приближенный вектор упорядоченности столб¬
цов для разреженной матрицы S. Если матрица S несимметрическая, то S(:,p) будет
иметь более разреженное LU-разложение, чем S. Разложение Холецкого для матрицы
S(:, р)' * S(:, р) также будет более разреженным, чем у матрицы S’*S.
Функция р = colamd(S, knobs) использует входной аргумент knobs для указания, ка¬
кие строки и столбцы прямоугольной разреженной матрицы могут не приниматься
во внимание. Если S - матрица размера mxn, то строки с номерами, превышающими
значение (knobs(l))*n, игнорируются. Аналогично столбцы с номерами, превышаю¬
щими значение (knobs(2))*m, не учитываются в процедуре упорядочения. Если аргумент
knobs отсутствует, то по умолчанию он равен knobs(l) = knobs(2) = spparms('wh_frac').
Функции [р, stats] = colamd(S) и [р, stats] = colamd(S, knobs) имеют дополнительный
выходной аргумент stats - вектор-строку из 20 элементов. Элементы с 8-го по 20-й
в настоящее время не задействованы. Оставшиеся 7 элементов от 1-го до 7-го содер¬
жат следующие характеристики процедуры приближенного упорядочения:
6. Работа с разреженными матрицами
553
Параметр
Характеристика процедуры приближенного упорядочения
stats(1)
Число заполненных или пустых строк, игнорируемых при упорядочении
stats(2)
Число заполненных или пустых столбцов, игнорируемых при упорядочении
stats(3)
Количество элементов, удаленных при упорядочении. Эта величина порядка
2.2*nnz(S) + 4*m + 7*п для больших разреженных матриц
stats(4)
0 - если матрица состоятельна; 1 - если матрица несостоятельна
stats(5)
Индекс количества столбцов, которые не отсортироаны или содержат повто¬
ряющиеся значения; 0 - если таких столбцов нет
stats(6)
Индекс количества строк, которые содержат повторяющиеся значения или
выходящие за допустимые границы для столбцов, определяемых параметром
stats(5); 0 - если таких строк нет
stats(7)
Количество строк, которые содержат повторяющиеся значения или их номе¬
ра выходят за допустимые границы
Параметры stats (4:7) содержат информацию, необходимую для продолжения про¬
цедуры colamd.
Встроенные функции системы MATLAB, как правило, обеспечивают формирова¬
ние состоятельных разреженных матриц, которые не содержат повторяющихся строк
или столбцов, с невозрастающими значениями числа ненулевых элементов по столб¬
цам и т. п.
Если матрица оказывается несостоятельной, то нельзя гарантировать, что процеду¬
ра colamd может быть продолжена. Если номер строки повторяется два или более раз
для одного столбца либо выходит за допустимые пределы, то процедура colamd может
исправить эти ошибки, игнорируя повторяющиеся строки или корректируя столбец,
используя копию исходной разреженной матрицы S.
Если же матрица оказывается несостоятельной по иным причинам, то выполнение
процедуры colamd прекращается и выдается сообщение об ошибке.
Алгоритм:
Процедура colamd, впервые включенная в состав системы MATLAB 6, считается
более эффективной, чем процедура colmmd (как по быстродействию, так и по качеству
упорядочения. Авторами кода являются Stefan I. Larimore и Timothy A. Davis
(davis@cise.ufl.edu) из университета штата Флорида http://www.cise.ufl.edu/research/sparse/).
Алгоритм разработали John Gilbert (фирма Xerox PARC) и Esmond Ng (Oak Ridge Na¬
tional Laboratory).
Пример:
Обратимся к матрице bucky и применим приближенное AMD-упорядочение.
[B/V] = bucky;
spy(В) % рис. 6.10,а
[р,stats] = colamd(В);
spy(B(:,р),16,*г1) % рис. 6.10,6
Структура матрицы В (рис. 6.10, а) при этом разрушается (рис. 6.10, б).
554
В. Г. Потемкин. Вычисления в среде MATLAB
в
0
-j—_—, , , г
10
* * ♦
: ♦ • ♦ ♦
> . * *
20
***:%
• * •
30
40
♦ *
*
♦ *:**♦ • • -
♦ • •♦♦♦
50
Ч:
♦ : ♦ ♦
60
* * * t
* * ♦ ♦
. . 1 •
С
1 10 20 30 40 50 60
nz = 180
В(:, р)
б
:. 6.10
а
Анализ параметра stats
stats(1:7)
ans =0 0 2 О
ООО
свидетельствует о том, что матрица bucky является состоятельной, ни строки,
ни столбцы при AMD-упорядочении не игнорировались, а количество удаленных эле¬
ментов равно 2.
Если сравнить LU-разложения матрицы В (рис. 6.11, а) и переупорядоченной мат¬
рицы В(:, р) (рис. 6.11, б), можно увидеть, что количество ненулевых элементов в них
равно 795 и 660 соответственно.
spy(lu(B),16,*г') % рис. 6.11,a
spy(lu(В(:,р)),16,'г') % рис. 6.11,6
1и(В) 1и(В(:, р))
а
б
рис. 6.11
6. Работа с разреженными матрицами
555
По сравнению с MMD-упорядочением количество ненулевых элементов в LU-
разложении несколько больше.
Сопутствующие функции'. COLMMD, COLPERM, SPPARMS, SYMAMD, SYMMMD,
SYMRCM.
SYMRCM
RCM-упорядочение
Синтаксис:
г = symrcm (S)
Описание:
Функция г = symrcm(S) возвращает такой вектор упорядоченности для симметри¬
ческой матрицы S, что S(r, г) будет концентрировать ненулевые элементы вблизи диа¬
гонали. Это хорошее упорядочение как для LU-, так и для ЬЬт-разложения матрицы,
что позволяет отказаться от работы с элементами, удаленными от диагонали. Такое
упорядочение называется упорядочением Катхилла - Макки (Cuthill - McKee) или
RCM -упорядочением.
Для действительных симметрических разреженных матриц собственные значения
S(r, г) совпадают с собственными значениями S, но времени на вычисление eig(S(r, г))
будет затрачиваться существенно меньше, чем для eig(S).
Пример:
Вновь обратимся к матрице bucky и применим RCM-упорядочение.
[Brv]= bucky;
р = symrcm(В);
R = В(ргр);
figure(1), spy(В) % рис.
figure(2), spy(R) % рис.
6.12,а
6.12,6
. J , , . г
♦ ♦
♦ ♦
0
♦♦ t ♦♦
чч ♦ ♦
♦
♦ «л*
♦X « ♦
♦
*44. ♦
10
ч ♦♦ ♦ ♦♦♦
♦♦ ♦ ч
* ♦ ч
♦ * *«л ♦
♦ ♦ ♦
• ♦ . ' ♦ ■
♦
* .
♦ ж *♦>*
20
* « ч
♦ ♦ ♦♦ ч
30
40
Ч ♦ ♦ Ч
ч ♦ \
ч ♦ ч
ч ♦ ч
Ч * ♦ i
ч ♦ ♦ ч
**♦
Ч ♦ Ч
* ЧЧф
♦ 1 ♦ ♦ ♦
. ♦ *•
50
м ч
♦д Ч
Ч ♦ Л
Ч ♦ ♦ t
60
ч: \
556
В. Г. Потемкин. Вычисления в среде MATLAB
В результате RCM-упорядочения исходная матрица (рис. 6.12, а) с шириной поло¬
сы, равной
[irj] = find(В); bwB = max(i-j)+l
bwB = 35
преобразована в матрицу с узкой полосой вблизи диагонали (рис. 6.12, б), ширина ко¬
торой равна
[i,j] = find(R); bwR = max(i-j)+l
bwR = 11
Ширина полосы матрицы А равна 35, а матрицы R - 11.
Сопутствующие функции'. COLAMD, COLMMD, COLPERM, SYMAMD, SYMMD.
SYMMMD~| Симметрическое упорядочение
Синтаксис:
р = symmmd(S)
Описание:
Функция р = symmmd(S) возвращает такой вектор упорядоченности столбцов для
симметрической положительно определенной матрицы S, что S(:, р) будет иметь более
разреженное ЬЬт-разложение, чем исходная матрица S.
Такое упорядочение автоматически применяется системой MATLAB при выполне¬
нии операций обращения \ и / при решении линейных систем с разреженными матри¬
цами. Некоторые опции и параметры, обусловленные эвристическими свойствами ис¬
пользуемого алгоритма, можно изменить, применяя процедуру настройки параметров
spparms.
Алгоритм:
Алгоритм упорядочения для симметрических матриц основан на алгоритме упоря¬
дочения по разреженности столбцов. Фактически функция symmmd формирует матри¬
цу К с такой структурой ненулевых элементов, что симметрическая матрица К' * К
имеет такую же структуру ненулевых элементов, как и исходная матрица S, а затем
вызывается функция colmmd для К.
Пример:
Сравним два алгоритма упорядочения, реализованные в виде функций symrcm
и symmmd, которые предшествуют ЬЬт-разложению (разложение Холецкого) матрицы
bucky размера 60 х 60, которая описывает граф связности bucky (рис. 6.13, а) и имеет
структуру (рис. 6.13, 6).
[B/V] = bucky; В = В + 4*speye(60);
figure(1),gplot(В,V(:,[1 2])),axis equal % рис. 6.13,a
figure(2),spy(B,6,'or1) % рис. 6.13,6
6. Работа с разреженными матрицами
557
Хотя эта задача и не является очень сложной, тем не менее поведение алгоритмов
упорядочения является типичным. Применение функции symrcm порождает ленточ¬
ную матрицу (рис. 6.13, в), которая после ЬЬт-разложения оказывается целиком запол¬
ненной внутри ленты (рис. 6.13, г).
р = symrcm(B);
figure(1),spy(В(р,р),16,1 г’) % рис. 6.13,в
figure(2),spy(chol(В(р,р)),16,’г1) % рис. 6.13,г
Применение функции symmmd порождает ленточную матрицу с крупными блока¬
ми нулевых элементов (рис. 6.13, д), которые не заполняются и в процессе LLT-
разложения (рис. 6.13, е). Следовательно, алгоритм симметрической упорядоченности
требует меньшего времени и объема памяти в процессе ЬЬт-разложения.
р = symmmd(В);
figure(l),spy(B(p,p),16,*г*) % рис. 6.13,д
figure(2),spy(chol(В(р,р)),16,’г1) % рис. 6.13,е
SYMAMD | Приближенное симметрическое упорядочение
Синтаксис:
р = symamd (S)
р = symamd(S,knobs)
[р,stats] = symamd(S)
[р,stats] = symamd(S,knobs)
Описание:
Функция p = symamd(S) для симметрической положительно определенной разре¬
женной матрицы S возвращает такой вектор упорядочения, что матрица S(p, р) будет
иметь большее разложение Холецкого, чем исходная матрица S. Для этого в процедуре
symamd формируется такая матрица М, чтобы выполнялось условие spones(M’*M) =
= spones (S), т. е. чтобы матрицы связности для М’*М и исходной матрицы S были
одинаковыми, а затем вычисляется вектор AMD-упорядочения р = colamd(M). Функ¬
ция symamd применима и для симметрических полуопределенных матриц. Матрица
должна быть квадратной, причем в алгоритме используются только ее поддиагонали.
Функция р = symamd(S, knobs) использует входной аргумент knobs, который в силу
симметричности исходной матрицы является скаляром. Он служит для указания, какие
строки и столбцы исходной матрицы могут не приниматься во внимание. Если S -
матрица размера пхп, то строки и столбцы с номерами, превышающими значение
knobs*n, игнорируются. Если аргумент knobs отсутствует, то по умолчанию он равен
knobs = spparms('wh_frac').
Функции [р, stats] = symamd(S) и [р, stats] = symamd(S, knobs) имеют дополнитель¬
ный выходной аргумент stats - вектор-строку из 20 элементов. Элементы с 8-го по 20-й
в настоящее время не задействованы. Оставшиеся 7 элементов от 1-го до 7-го содер¬
жат следующие характеристики процедуры приближенного упорядочения:
558
В. Г. Потемкин. Вычисления в среде MATLAB
Сопутствующие функции'. COLAMD, COLMMD, COLPERM, SYMAMD, SYMRCM.
6. Работа с разреженными матрицами
559
Параметр
Характеристика процедуры приближенного упорядочения
stats(1)
Число заполненных или пустых строк, игнорируемых при упорядочении
stats(2)
Число заполненных или пустых столбцов, игнорируемых при упорядочении
stats(3)
Количество элементов, удаленных при упорядочении. Эта величина порядка
8.4*nnz(tril(S,-1 ))+9
stats(4)
0 - если матрица состоятельна; 1 - если матрица несостоятельна
stats(5)
Индекс количества столбцов, которые не отсортированы или содержат по¬
вторяющиеся значения; 0 - если таких столбцов нет
stats(6)
Индекс количества строк, которые содержат повторяющиеся значения или
выходящие за допустимые границы для столбцов, определяемых параметром
stats(5);
0 - если таких строк нет
stats(7)
Количество строк, которые содержат повторяющиеся значения или их номе¬
ра выходят за допустимые границы
Параметры stats (4:7) содержат информацию, необходимую для продолжения про¬
цедуры symamd.
Встроенные функции системы MATLAB, как правило, обеспечивают формирова¬
ние состоятельных разреженных матриц, но пользователь может сформировать несо¬
стоятельные матрицы, например, используя инструменты смешанного программиро¬
вания на языках С или Fortran и передавая данные М-функции symamd. Именно
поэтому процедура symamd проверяет исходную матрицу на состоятельность, прове¬
ряя следующие свойства, и, если возможно, исправляет ошибки:
• Если номер строки два или более раз оказывается связанным с одним и тем же
столбцом, то процедура symamd игнорирует повторные вхождения, продолжает
обработку и фиксирует эти ситуации в векторе параметров stats(4:7).
• Если номер строки выходит за допустимые пределы, то процедура symamd коррек¬
тирует столбец, используя копию исходной разреженной матрицы S, и продолжает
вычисления. Эти ситуации фиксируются в векторе параметров stats(4:7).
• Если же матрица оказывается несостоятельной по иным причинам, то выполнение
процедуры symamd прекращается и выдается сообщение об ошибке.
Пример:
Применим алгоритм приближенного симметрического упорядочения к матрице
bucky размера 60 х 60, исследованной при анализе М-функции symmmd, и сравним
эффективность этих процедур.
[B,V] = bucky; В = В + 4*speye(60);
р = symmmd(B);
figure(1),spy(B(p,p),16,'r1) % рис. 6.14,a
figure(2),spy(chol(B(p,p)),16,'r*) % рис. 6.14,6
p = symamd (В) ;
figure(2),spy(chol(B(p,p)),16,*r1) % рис. 6.14,в
560
В. Г. Потемкин. Вычисления в среде MATLAB
о
а
о
10
20
30
40
50
GO
О 10 20 30 40 50 60
пг = 360
б
рис. 6.14
в
О 10 20 30 40 so ет
nz = 348
Сравнивая результаты упорядочения, следует отметить, что процедура symamd
формирует верхнюю треугольную матрицу с меньшим числом ненулевых элементов,
чем процедура symmmd: 348 и 360 ненулевых элементов соответственно.
Алгоритм:
Процедура symamd, впервые включенная в состав системы MATLAB 6, считается
более эффективной, чем процедура symmmd, как по быстродействию, так и по качест¬
ву упорядочения. Авторами кода являются Stefan I. Larimore и Timothy A. Davis
(davis@cise.ufl.edu) из университета штата Флорида (http://www.cise.ufl.edu/re-
search/sparse/.) Алгоритм разработали John Gilbert (фирма Xerox PARC) и Esmond Ng
(Oak Ridge National Laboratory).
Сопутствующие функции: COLAMD, COLMMD, COLPERM, SPPARMS, SYMMMD,
SYMRCM.
6.7. Алгоритмы линейной алгебры
Факторизация разреженных матриц
LUINC |
Неполное LU-разложение
Синтаксис:
LU = luinc(S, '.0')
[L,U] = luinc(S, 'О' )
[L, U, Р] = luinc(S,'0’)
LU = luinc(S,droptol
[L,U] = luinc(S,droptol)
[L,U,P] = luinc(S,droptol)
LU = luinc(S,options)
[L,U] = luinc(S,options)
[L,U,P] = luinc(S,droptol)
Определение:
Оператор luinc реализует 2 варианта неполного LU-разложения:
• с заданным порогом разреженности;
• с нулевым уровнем расширения.
6. Работа с разреженными матрицами
561
Оператор luinc реализует разложение исходной матрицы S на нижнюю треуголь¬
ную L, верхнюю треугольную U и матрицу перестановок Р. Алгоритмы, использован¬
ные для реализации неполного LU-разложения, описаны в работе [86].
LU-разложения могут быть использованы для предварительной факторизации ис¬
ходных симметрических положительно определенных матриц при решении итератив¬
ными методами больших систем линейных уравнений.
Описание:
Функция LU = luinc(S, ’О’) выполняет неполное LU-разложение для разреженной
квадратной матрицы S с нулевым уровнем расширения. Треугольные множители име¬
ют ту же структуру разреженности, что и исходная матрица S, а их произведение со¬
гласуется с полной матрицей с учетом перестановок строк. Оператор LU = luinc(S, ’О')
возвращает нижний и верхний треугольные множители в матрице LU либо в исходной
матрице S, если выходной массив не указан. Матрица перестановок потеряна. Условие
nnz(luinc(S, ’О') = nnz(S) выполняется с точностью до тех элементов, которые равны
нулю в пределах ошибок округления.
Функция [L, U] =‘luinc(S, ’О') возвращает верхнюю треугольную матрицу U и про¬
изведение матрицы перестановок и нижнего треугольного множителя в матрице L.
Структуры разреженности матриц L, U и S несопоставимы, но количество ненулевых
элементов с точностью до ошибок округления удовлетворяет условию nnz(L) +
+ nnz(U) = nnz(S) + п, где n — порядок матрицы S. Произведение L*U согласуется со
структурой разреженности матрицы S, так что матрица (L*U).*spones(S) - S имеет
элементы порядка eps.
Функция [L, U, Р] = luinc(S, ’О') возвращает нижнюю треугольную матрицу L, верх¬
нюю треугольную матрицу U и матрицу перестановок Р. Матрица L имеет такую же
структуру разреженности, как и матрица S, с учетом перестановок строк. При этом
выполняется условие spones(L) = spones(tril(P*S)) с точностью до возможного исклю¬
чения единиц на диагонали L, где P*S может быть равно 0, и нулей в L, где P*S может
быть не равно 0 с точностью до ошибок округления. Матрица U согласуется
со структурой разреженности верхней треугольной матрицы P*S, так что spones(U) =
= spones(triu(P*S)) с точностью до возможного исключения нулей в U, где P*S может
быть не равно 0 с точностью до ошибок округления. Произведение L*U согласуется
со структурой разреженности матрицы P*S, так что матрица (L*U).*spones(P*S) - P*S
имеет элементы порядка eps.
Функция LU = luinc(S, droptol) выполняет неполное LU-разложение для произволь¬
ной разреженной матрицы S с заданным порогом разреженности droptol. Порог раз¬
реженности - это минимальное значение элемента матрицы, при котором он прирав¬
нивается нулю. Неполное LU-разложение с заданным порогом разреженности является
непрерывной аппроксимацией полного LU-разложения; по мере уменьшения порога
разреженности аппроксимация становится все точнее и при пороге, равном нулю, пе¬
реходит в точное LU-разложение. Для каждого столбца треугольного множителя эле¬
менты, не превышающие локального порога разреженности, исключаются. Локальный
порог разреженности - это произведение порога разреженности и нормы соответст¬
вующего столбца исходной матрицы localdroptol = droptol*norm(S(:, j). Исключение из
этого правила составляют только диагональные элементы, которые не должны обну¬
ляться, чтобы избежать сингулярности.
562
В. Г. Потемкин. Вычисления в среде MATLAB
Функция [L, U] = luinc(S,droptol) возвращает верхнюю треугольную матрицу U и
произведение матрицы перестановок и нижнего треугольного множителя в матрице L.
Функция [L, U, Р] = luinc(S, droptol) возвращает нижнюю треугольную матрицу L,
верхнюю треугольную матрицу U и матрицу перестановок Р. Произведение L*U явля¬
ется аппроксимацией матрицы P*S.
Функция LU = luinc(S, options) позволяет указать дополнительные опции в массиве
записей с четырьмя полями.
Поле
Назначение
options.droptol
Порог разреженности
options.milu
Модифицированное LU-разложение
options.udiag
Заменить нули на диагонали матрицы U
options.thresh
Порог для выбора ведущего элемента
При установке следует указывать только те поля, которые необходимы. Эти поля
имеют следующие спецификации.
Параметр droptol - это неотрицательное число, которое используется в качестве
порога разреженности при реализации неполного LU-разложения. Это разложение ос¬
новано на LU-разложении с использованием локального порога разреженности. При
значении droptol, равном 0, выполняется полное LU-разложение.
Параметр milu позволяет выбрать одну из форм LU-разложения: модифицирован¬
ное (milu = 1), либо немодифицированное (milu = 0 и по умолчанию). Модификация
заключается в том, что малые элементы вновь формируемого столбца не отбрасыва¬
ются, а вычитаются из диагонали верхнего треугольного множителя U.
Параметр udiag принимает значение 0 или 1 (по умолчанию 0). Если udiag равно 1,
то все нулевые диагональные элементы верхней треугольной матрицы R заменяются
значением локального порога разреженности localdroptol, чтобы избежать сингулярности.
Параметр thresh позволяет задать порог при выборе ведущего элемента; он прини¬
мает значение в диапазоне от 0 до 1 (по умолчанию 1). Если диагональный элемент
по модулю меньше, чем произведение внедиагонального элемента на множитель
thresh, то роль ведущего переходит к внедиагональному элементу. При значении
thresh, равном 0, в качестве ведущего всегда выбирается диагональный элемент.
Функция [L, U] = luinc(S, options) возвращает верхнюю треугольную матрицу U и
произведение матрицы перестановок и нижнего треугольного множителя в матрице L.
Функция [L, U, Р] = luinc(S, options) возвращает нижнюю треугольную матрицу L,
верхнюю треугольную матрицу U и матрицу перестановок Р. Произведение L*U явля¬
ется аппроксимацией матрицы P*S.
Ограничения:
Функция применима только к квадратным разреженным матрицам.
Примеры:
Рассмотрим тестовую матрицу west0479 размера 479x479.
load west0479, S = west0479;
figure(1)rspy(S,10,1r’) % рис. 6.15,a
figure(2),spy(lu(S),10,'r1) % рис. 6 . 1 t: , 6
6. Работа с разреженными матрицами
563
я б
рис. 6.15
Исходная матрица S имеет 1887 ненулевых элементов, ее полное LU-разложение -
16 777 элементов.
Вычислим неполное LU-разложение для разреженной матрицы S с нулевым уров¬
нем расширения, т. е. без увеличения количества ненулевых элементов, и выявим раз¬
личия в матрицах L и P*S:
[L/UjP] = luinc(Sr101);
isequal(spones(U), spones(triu(P*S)))
ans = 1
nnz(spones(L) ~= spones(tril(P*S)))
ans = 74
D = (L*U).*spones(P*S)-P*S; normest(D)
ans = 7.1089e-015
Структуры разреженности матриц L и P*S различаются в 74 элементах: 73 элемен¬
та на диагонали, где в матрице L стоят единицы, а в матрице P*S - нули, а также в по¬
зиции (206, 113), где в матрице L стоит 0, а в матрице P*S стоит -1. Матрица D имеет
элементы порядка eps.
Проанализируем точность неполного LU-разложения в зависимости от значения
используемого порога разреженности. Порог разреженности равный нулю, соответст¬
вует полному LU-разложению; его увеличение уменьшает количество ненулевых эле¬
ментов в LU-разложении, но при этом увеличивает погрешность аппроксимации, оце¬
ниваемую величиной
norm (L*U-P*SZ1)/norm(S,1) .
На рис. 6.16 показаны структуры матриц неполного LU-разложения, соответст¬
вующие различным значениям порога разреженности.
i = 1; к = [-8 -4 -2 0];
for j = к
subplot(2,2,i),spy(luinc(S,10Ak(i))); % рис. 6.16
i = i+1;
end
564
В. Г. Потемкин. Вычисления в среде MATLAB
Из анализа структур и их характеристик ясно следует, что количество ненулевых
элементов в неполном LU-разложении уменьшается по мере увеличения порога раз¬
реженности.
Однако при этом уменьшается и точность LU-разложения, как это следует из ре¬
зультатов, представленных на рис. 6.17, где показаны зависимости числа ненулевых
элементов и величины относительной точности неполного LU-разложения.
i = 1; к = -10:2:0;
for j = к
[L,U,P] = luinc(S,10Л(k(i)));
nz (i) = nnz (L) ;
nrm(i) = norm(L*U-P*S, 1) /norm(S, 1) ;
x(i) = 10A(k(i));
i = i+1;
end
subplot(2,1,1),semilogx(x,nz)
subplot(2,1,2),loglog(x,nrm) % рис. 6.17
Сопутствующие функции'. LU, CHOLINC, BICG.
6. Работа с разреженными матрицами
565
Неполное разложение Холецкого
CHOLINC |
Синтаксис:
R = choline(S,droptol) R = choline (S, ' 0 ' ) R = choline (S, ' inf ')
R = choline(S,options) [R,p] = choline(Sz '0')
Определение:
Оператор choline реализует 2 варианта неполного разложения Холецкого:
• с заданным порогом разреженности;
• с нулевым уровнем расширения.
Разложения Холецкого могут быть использованы для предварительной факториза¬
ции исходных симметрических положительно определенных матриц при решении
больших систем линейных уравнений итеративными методами.
Описание:
Функция R = cholinc(S, droptol) выполняет неполное разложение Холецкого для
разреженной матрицы S с заданным порогом разреженности droptol. Порог разрежен¬
ности - это минимальное значение элемента матрицы, при котором он приравнивается
нулю.
Функция R = cholinc(S, options) позволяет указать дополнительные опции в массиве
записей с тремя полями:
Поле
Назначение
options.droptol
Порог разреженности
options.michol
Модифицированное разложение Холецкого
options.rdiag
Заменить нули на диагонали матрицы R
При установке следует указывать только те поля, которые необходимы. Эти поля
имеют следующие спецификации.
Параметр droptol - это неотрицательное число, которое используется в качестве
порога разреженности при реализации неполного разложения Холецкого. Это разло¬
жение основано на неполном LU-разложении без выбора ведущего элемента и на по¬
следующем масштабировании строк верхней треугольной матрицы U, используя в ка¬
честве масштабирующего множителя значение квадратного корня диагонального
элемента. Поскольку ненулевые значения U(i, j) ограничены снизу величиной
droptol*norm(S(:, j)), то ненулевые значения R(i,j) ограничены снизу величиной
droptol*norm(S(:, j))/R(i, i), определяемой как локальный порог разреженности для
разложения Холецкого. При значении droptol, равном 0, и по умолчанию выполняется
полное разложение Холецкого.
Параметр michol позволяет выбрать либо модифицированное (michol =1), либо не-
модифицированное (michol = 0 и по умолчанию) разложение Холецкого.
Параметр rdiag принимает значение 0 или 1 (по умолчанию 0). Если rdiag равно 1,
то все нулевые диагональные элементы верхней треугольной матрицы R заменяются
значением sqrt(localdroptol), чтобы избежать сингулярности.
Функция R = cholinc(S, 'О’) выполняет неполное разложение Холецкого для разре¬
женной симметрической положительно определенной матрицы S с нулевым уровнем
расширения, т. е. без увеличения количества ненулевых элементов. Верхняя треуголь-
566
В. Г. Потемкин. Вычисления в среде MATLAB
ная матрица R имеет в основном ту же структуру, что и triu(S), хотя некоторые эле¬
менты S, не равные нулю, с точностью до ошибок округления, могут иметь нулевые
значения в матрице R. Следует заметить, что положительная определенность исходной
матрицы не гарантирует существования разложения с требуемыми свойствами. Когда
факторизация невозможна, формируется сообщение об ошибке. Если факторизация
успешна, матрицы R'*R и S имеют одинаковую структуру разреженности.
Функция [R, р] = cholinc(S, ’О’) с двумя выходными аргументами не приводит
к формированию сообщения об ошибке: если R существует, то р равно 0; но если фак¬
торизация невозможна, то р положительное целое число, a R верхняя треугольная мат¬
рица размера qxn, где q = р-1, так что структура R и верхней треугольной подматрицы
размера qxn одинаковы. Матрицы R'*R и подматрица S размера qxq имеют одинако¬
вую структуру разреженности.
Функция R = cholinc(S, ’inf) выполняет разложение Холецкого для положительно
полуопределенных матриц, когда в процессе факторизации появляются нулевые веду¬
щие элементы. В этом случае соответствующему диагональному элементу верхней
треугольной матрицы R присваивается значение inf, а остальным элементам строки-
нулевые значения. Таким образом, соответствующий элемент в векторе решения при¬
нудительно приравнивается нулю. В случае отрицательного значения ведущего эле¬
мента формируется сообщение об ошибке.
Ограничения:
Функция применима только к квадратным разреженным матрицам; при обращении
к функциям cholinc(S, 'О’) и cholinc(S, ’inf) матрица S должна быть действительной.
Примеры:
Рассмотрим симметрическую положительно определенную матрицу S, связанную
с пятиточечной аппроксимацией лапласиана на сетке размера пхп типа ’С’, задаваемой
функцией numgrid.
п = 15; S = delsq(numgrid(*С1zn));
figure (1), spy (numgrid('С1 zn)) ; % рис. 6.18,а
figure(2),spy(S,\r') % рис. 6.18,6
б
рис. 6.18
6. Работа с разреженными матрицами
567
Вычислим полное и неполное с нулевым уровнем расширения разложения Холец-
кого и сравним количество ненулевых элементов в соответствующих матрицах.
С = chol(S); nC = nnz(C)
RO = choline(S,* 0'); nRO = nnz(RO)
nC = 1557
nRO = 391
Если количество ненулевых элементов в исходной матрице составляло 643 элемен¬
та, то для полного разложения Холецкого оно равно 1557, а для неполного с нулевым
уровнем расширения - 391.
Сформируем сингулярную матрицу S2, задав ее диагональный элемент S2(101, 101)
равным нулю, и вычислим неполное разложение Холецкого с нулевым уровнем рас¬
ширения.
S2 = S; S2(101,101) = 0;
[R/P1 = choline(S2,10'); p,nr = nnz(R)
p = 101
nr = 290
Поскольку матрица сингулярна, то разложение Холецкого было прервано в строке
с номером 101 и множитель R имеет размер 100x139. Такое неполное разложение Хо¬
лецкого имеет всего 290 ненулевых элементов.
Оценим погрешности неполного разложения Холецкого исходной и сингулярной
матриц.
DI = (R01*R0).*spones(S)-S; normDl = normest(Dl)
D2 = (R'*R).*spones(S2)-S2;
normD2 = normest(D2),normD2_100 = normest(D2(1:100,1:100))
normDl = 1.0512e-015
normD2 = 7.2974
normD2_100 = 1.0512e-015
Норма невязок для разложения Холецкого исходной матрицы находится на уровне
машинной точности, в то время как для сингулярной матрицы она равно 7.3; однако
для подматрицы размера 100x139 норма невязок также находится на уровне машинной
точности.
На рис. 6.19 показаны структуры матриц неполного разложения Холецкого, соот¬
ветствующие различным значениям порога разреженности.
i = 1; k = [-inf -3 -2 -1];
for j = к
subplot(2,2,i),spy(choline(S,10Ak(i))); % рис. 6.19
i = i+1;
end
568
В. Г. Потемкин. Вычисления в среде MATLAB
cholinc(S.O) cholinc(S,1e-3)
рис. 6.19
Из анализа структур и их характеристик ясно следует, что количество ненулевых
элементов в неполном разложении Холецкого уменьшается по мере увеличения порога
разреженности.
Однако при этом уменьшается и точность разложения, как это следует из результа¬
тов, представленных на рис. 6.20, где показаны зависимости числа ненулевых элемен¬
тов и величины относительной точности неполного разложения Холецкого.
i = 1; к = -4:0;
for j = к
R = choline (S, 10А (к(i))) ;
nz(i) = nnz(R);
nrm(i) = norm(R' *R-S, 1) /norm(S, 1);
x(i) = 10A(k(i));
i = i+1;
end
subplot(2,1,1),semilogx(x,nz)
subplot(2,1,2),loglog(x,nrm) % рис. 6.20
6. Работа с разреженными матрицами
569
Пусть задана положительно полуопределенная разреженная матрица
S = sparse([1
0
3
0;
0
25
0
30;
3
0
9
0;
0
30
0
661 J);
Ее разложение Холецкого имеет нулевой ведущий элемент в строке 3:
[R/P] = chol(S); р
Р = 3
Тогда неполное разложение Холецкого формирует верхнюю треугольную матрицу
Rinf, третий диагональный элемент которой равен inf:
Rinf = choline(S,1 inf');
full(Rinf)
ans =
1
0
3
0
0
5
0
6
0
0
Inf
0
0
0
0
25
Алгоритмы:
Алгоритмы для М-функций R = cholinc(X, droptol) и R = cholinc(X,options) получе¬
ны соответствующей настройкой параметров М-функции [L,U] = luinc(X,options).
При реализации М-функции R = cholinc(X, ’inf) использован алгоритм из работы [100].
Сопутствующие функции’. CHOL, LUINC, PCG.
Решение систем линейных уравнений
Решение систем линейных алгебраических уравнений (СЛАУ) реализуется двумя
классами методов - прямыми и итерационными. Прямые методы находят точные ре¬
шения системы за конечное число шагов; они обычно используют различные варианты
метода исключения Гаусса и выполняют факторизацию матрицы в виде LU-
разложения или разложения Холецкого. Прямые методы работают достаточно быстро
и широко применяются на практике, если достаточны объемы памяти для их реализа¬
ции. Прямые методы реализованы в системе MATLAB как встроенные функции и об¬
ладают наивысшей эффективностью для матриц общего вида.
Итерационные методы находят за конечное число шагов только приближенное ре¬
шение и работают с матрицей в целом, а не с отдельными ее элементами. Итерацион¬
ные методы обычно применяются к специальным классам уравнений, как правило
больших порядков [34]. Они реализуются в системе MATLAB в виде М-файлов и мо¬
гут включать в качестве вспомогательных операций алгоритмы прямых методов.
В состав версии системы MATLAB 6 для решения СЛАУ с разреженными матри¬
цами включены следующие 9 М-функций, реализующих итерационные алгоритмы:
570
В. Г. Потемкин. Вычисления в среде MATLAB
Функция
Метод
Симметрические положительно определенные матрицы
Peg
Предобусловленный метод сопряженных градиентов
Симметрические положительно полуопределенные матрицы
minres
Метод минимальной невязки
symmlq
Симметрический LQ-алгоритм
Несимметрические квадратные матрицы
bieg
Метод бисопряженных градиентов
biegstab
Устойчивый метод бисопряженных градиентов
cgs
Квадратичный метод сопряженных градиентов
gmres
Обобщенный метод минимальной невязки
qmr
Метод квазиминимальной невязки
Прямоугольные матрицы
lsqr
LSQR-реализация метода сопряженных градиентов
Всем методам может предшествовать процедура предобусловливания, или, иными
словами, все методы могут использовать предобусловливатель. Это означает следую¬
щее. Если задана СЛАУ вида
Ах = Ь,
то она заменяется эквивалентной СЛАУ вида
М"1Ах = М"1Ь.
Матрица М называется предобусловливателем и предназначена для того, чтобы ус¬
корить сходимость выбранного итерационного метода. В качестве процедур предобу¬
словливания можно использовать алгоритмы факторизации.
Симметрические положительно определенные матрицы
PCG : I Предобусловленный метод сопряженных градиентов
Синтаксис:
х = pcg(Azb)
х = peg(Az bztol)
х = peg(A,b,tolzmaxit)
x = peg(Azbztolzmaxit,M)
x = pcg(Azbztolzmaxit,MlzM2)
x = pcg(AzbztolzmaxitzMlzM2zxO)
x = peg(afunzbztolzmaxitzmlfunzm2funzxOzplzp2,...)
[xz flag] = peg(...)
[xzflagzrelres] = peg(...)
[xzflag,relres, iter] = peg(...)
[xzflag,relres, iter, resvec] = peg(...)
6. Работа с разреженными матрицами
571
Описание:
Функция х = pcg(A, b) реализует попытку решения системы линейных уравнений
А*х = b относительно неизвестного вектора х. Матрица А порядка п предполагается
симметрической и положительно определенной. Решение начинается с начального
приближения, по умолчанию соответствующего нулевому вектору длины п, и итера¬
ции продолжаются до тех пор, пока метод сойдется, либо произойдет останов вычис¬
лений, либо будет превышено максимальное число итераций. Сходимость достигнута,
когда относительная погрешность norm(b - A*x)/norm(b) становится меньше или рав¬
ной заданной погрешности вычислений (по умолчанию 1е-6). Максимальное число
итераций принимается по умолчанию равным min(n, 20). Никакой предварительной
обработки матрицы не выполняется.
Функция х = pcg(A, b, tol) позволяет задать погрешность вычисления tol.
Функция х = pcg(A, b, tol, maxit) позволяет изменить значение максимального чис¬
ла итераций.
Функции х = pcg(A, b, tol, maxit, М) и х = pcg(A, b, tol, maxit, Ml, М2) используют
вспомогательные матрицы М либо М = М1*М2 для того, чтобы преобразовать исход¬
ную систему в вид М*у = Ь, где у = inv(M)*A*x, и повысить тем самым эффективность
решения. Поскольку решения системы вида М*у = b ищутся с помощью встроенного
решателя, разумно выполнить факторизацию матрицы М, используя разложение Хо¬
лецкого. Тогда решение будет использовать 2 оператора
R = Chol(М);
х = рсд(А, Ь, tol, maxit, R’, R).
В этом случае матрица М должна быть симметрической и положительно опреде¬
ленной. Если в качестве матриц М, Ml, М2 будет указана пустая матрица, то она ин¬
терпретируется как единичная, т. е. никаких вспомогательных операций не выполняется.
Функция х = pcg(A, b, tol, maxit, Ml, М2, х0) позволяет изменить вектор начальной
оценки решения хО. Если в качестве вектора хО будет указан пустой массив, то в этом
случае он интерпретируется как нулевой, т. е. используемый по умолчанию.
Обращение к функции в форме х = pcg(afun, b, tol, maxit, mlfun, m2fun, хО, pl,p2,...)
позволяет передать функциям afun(x, pl, р2,...), mlfun(x, р1,р2,...) и m2fun(x, pl, р2,...)
параметры pl, р2,...- при этом функции могут быть заданы своим именем или деск¬
риптором.
Для всех вышеописанных форм вызова возвращается решение х. Если решение по¬
лучено, то оно всегда сопровождается значением относительной погрешности и чис¬
лом использованных итераций. Если превышено максимальное число итераций или
процедура прекратила счет, выводится соответствующее предупреждающее сообщение.
Функция [х, flag] = pcg(...) возвращает решение и флаг, указывающий на характер
сходимости решения:
Значение флага
Информация о сходимости
0
Процедура peg сходится к решению при заданной точности tol в преде¬
лах числа итераций maxit
1
Процедура peg превысила максимальное число итераций maxit, не дос¬
тигнув сходимости
2
Одна из вспомогательных систем вида М*у = г плохо обусловлена
и не возвращает приемлемого решения из встроенного решателя
572
В. Г. Потемкин. Вычисления в среде MATLAB
Значение флага
Информация о сходимости
3
Процедура остановлена, поскольку две последовательные оценки реше¬
ния оказались одинаковыми
4
Одна из величин в процессе выполнения процедуры вышла за пределы
допустимых чисел в арифметике с плавающей точкой
Если значение флага не равно 0, то возвращается то решение, которое соответству¬
ет минимальной относительной погрешности для всех выполненных шагов. При ука¬
зании в качестве выходного параметра флага никаких сообщений не выводится.
Функция [х, flag, relres] = pcg(...) возвращает также относительную погрешность
решения norm(b - A*x)/norm(b). Если значение флага равно 0, то relres < tol.
Функция [х, flag, relres, iter] = pcg(...) возвращает номер итерации, на которой было
получено решение; этот номер удовлетворяет условию
О < iter < maxit.
Функция [х, flag, relres, iter, resvec] = pcg(...) возвращает нормы невязок на каждой
итерации в виде вектора resvec, начиная с невязки resvec(l) = norm(b - А*хО). Если
значение флага равно 0, то вектор resvec имеет длину iter+1 и значение последнего
компонента должно удовлетворять условию
resvec(end) < tol*norm(b).
Примеры:
Рассмотрим систему линейных уравнений А*х = Ь, связанную с пятиточечной ап¬
проксимацией лапласиана на сетке размера пхп:
п = 25; А = delsq(numgrid('С* ,n)) ; b = ones(length(А),1);
[x,flag] = pcg(A,b); flag
flag = 1
Значение флага равно 1, что означает отсутствие сходимости при точности 1е-6
(по умолчанию) в пределах 20 итераций (по умолчанию).
Выполним факторизацию матрицы А с помощью неполного разложения Холецко-
го, установим относительную погрешность решения 1е-8 и максимальное число ите¬
раций 10.
R = choline(А,1е-3);
[х2, flag2,relres2,iter2,resvec2] = pcg(A,b,le-8,10, R' ,R);
flag2,relres2,iter2,resvec2
flag2 = 0
relres2 = 1.2059e-009
iter2 = 6
resvec2 =
20.761
1.5687
0.060282
0.0014501
6.2128e-005
1.4513e-006
2.5036e-008
Значение флага flag2 равно 0, что означает сходимость с точностью relres2, равной
1.2е-009 на 6-й итерации (параметр iter2). Это достигнуто за счет процедуры предобу-
словливания, в данном случае предварительной факторизации матрицы с порогом раз¬
6. Работа с разреженными матрицами
573
реженности le-З. Значение resvec2(l) равно norm(b), а значение resvec2(7) равно
norm(b - А* *х2). Теперь можно построить график относительной погрешности решения
на каждой итерации (рис. 6.21), используя функцию:
semilogy(0: iter2z resvec2/norm(b) , '-г', 1 Linewidth1,2), hold on
semilogy(0:iter2,resvec2/norm(b), 'sk'z 'Markersize',5, 'MarkerFaceColor', 'g');
Сопутствующие функции'. BICG, BICGSTAB, CGS, CHOLINC, GMRES, LSQR, MINRES,
QMR, SYMMLQ,
Симметрические произвольные матрицы
MINRES | Метод минимальной невязки
Синтаксис:
х = minres(А,b)
х = minres(A,b,tol)
• x = minres(A,b,tol,maxit)
x = minres(A,b,tol.maxit,M)
x = minres(A,b,tol,maxit,Ml,М2)
x = minres(A,b,tol,maxit,Ml,М2,xO)
x = minres(afun,b,tol,maxit,mifun,m2fun,xO,pl,p2,...)
[x,flag] = minres(A,b,...)
[x,flag,relres] = minres(A,b,...)
fx,flag,relres,iter] = minres(A,b,...)
[x,flag,relres,iter,resvec] = minres(A,b,...)
[x,flag,relres,iter,resvec,resveccg] = minres(A,b,...)
Описание:
Функция x = minres(A, b) реализует попытку найти решение СЛАУ вида А*х = b
с минимальной нормой невязки. Матрица А порядка п предполагается квадратной
симметрической, но не обязательно положительно определенной [81]. Предполагается,
что эта матрица высокой размерности и разреженная. Вектор-столбец b имеет длину п.
574
В. Г. Потемкин. Вычисления в среде MATLAB
Матрица А может быть задана в виде функции afun(x), которая возвращает вычислен¬
ный вектор А*х. Если процедура сходится, сообщение об этом выводится на экран
терминала. Если же по завершении допустимого максимума итераций или по иной
причине сходимость не наблюдается, выдается предупреждение с указанием относи¬
тельной погрешности norm(b - A*x)/norm(b) и номера итерации, когда метод потерпел
неудачу.
Функция х = minres(A, b, tol) позволяет задать погрешность вычисления tol. Если
tol = [], то по умолчанию применяется значение 1 е-6.
Функция х = minres(A, b, tol, maxit) позволяет изменить значение максимального
числа итераций. Если maxit = [], то по умолчанию применяется значение min(n, 20).
Функции х = minres(A, b, tol, maxit, М) и х = qmr(A, b, tol, maxit, Ml, М2) исполь¬
зуют симметрические положительно определенные обусловливатели в виде матриц М
и М = Ml *М2 для того, чтобы эффективно решить СЛАУ вида
inv(sqrt(М))*A*inv(sqrt(М))*у = inv(sqrt(М))*b
относительно новой переменной у и вернуть исходное решение в форме
х = inv(sqrt(М))*у.
Если М = [], то предобусловливатель не применяется. Аргумент М можно задавать
в виде М-функции, которая вычисляет вектор М\х.
Функция х = minres(A, b, tol, maxit, Ml, М2, х0) позволяет изменить вектор началь¬
ной оценки решения хО. Если в качестве вектора хО будет указан пустой массив,
то в этом случае он интерпретируется как нулевой, т. е. используемый по умолчанию.
Обращение к функции в форме х = minres(afun, b, tol, maxit, mlfun, m2fun, x0, pl, p2,...)
позволяет передать функциям afun(x, pl,p2,...), mlfun(x, pl,p2,...) и m2fun(x,pl,p2,...)
параметры pl,p2,...; при этом функции могут быть заданы своим именем или деск¬
риптором.
Для всех вышеописанных форм вызова возвращается решение х. Если решение по¬
лучено, то оно всегда сопровождается сообщением о величине относительной погреш¬
ности и количестве использованных итераций. Если превышено максимальное число
итераций или процедура прекратила счет, выводится соответствующее предупреж¬
дающее сообщение.
Функция [х, flag] = minres(...) возвращает решение и флаг, указывающий на харак¬
тер сходимости решения:
Значение флага
Информация о сходимости
0
Процедура minres сходится к решению при заданной точности tol в преде¬
лах числа итераций maxit
1
Процедура minres превысила максимальное число итераций maxit, не дос¬
тигнув сходимости
2
Предобусловливатель М не возвращает приемлемого решения
3
Процедура остановлена, поскольку две последовательные оценки решения
оказались одинаковыми
4
Одна из величин в процессе выполнения процедуры вышла за пределы до¬
пустимых чисел в стандарте IEEE-арифметики
6. Работа с разреженными матрицами
575
Если значение флага не равно 0, то возвращается то решение, которое соответству¬
ет минимальной относительной погрешности для всех выполненных шагов. При ука¬
зании в качестве выходного параметра флага никаких сообщений не выводится.
Функция [х, flag, relres] = qmr(...) возвращает также относительную погрешность
решения norm(b - A*x)/norm(b). Если значение флага равно 0, то relres < tol.
Функция [х, flag, relres, iter] = qmr(...) возвращает номер итерации, на которой было
получено решение; этот номер удовлетворяет условию
О < iter < maxit.
Функция [х, flag, relres, iter, resvec] = qmr(...) возвращает нормы невязок на каждой
итерации в виде вектора resvec, начиная с невязки
resvec(1) = norm(b - А*хО).
Функция [х, flag, relres, iter, resvec, resveccg] = minres(A, b, ...) дополнительно воз¬
вращает нормы невязок сопряженных градиентов на каждой итерации в виде вектора
resveccg.
Примеры:
Рассмотрим решение СЛАУ порядка 100.
п = 100; on = ones(n,l);
А = spdiags([-2*on 4*on -2*on]r-1:1,п,п);
b = sum(A, 2) ;
tol = le-10; maxit = 50;
Ml = spdiags(4*on,0,n,n);
x = minres(A,b,tol,maxit,Ml, [],[]) ;
minres converged at iteration 49 to a solution with relative
residual 4.7e-014
minres сходится к решению на итерации 49 с относительной погрешностью
4.7е-014
Начиная с версии MATLAB 6, это же решение можно получить, используя сле¬
дующую вспомогательную процедуру afun:
function у = afun(x,n)
у = 4*х;
у(2:п)= у(2:п) - 2*х(1:п-1);
у(1:п-1) = у(1:п-1) - 2*х(2:п);
п = 100; on = ones(n,l);
А = spdiags([-2*on 4*on -2*on],-1:1,п,п);
b = sum (А, 2);
tol = le-10; maxit = 50;
Ml = spdiags(4*on,0,n,n);
xl = minres(@afun,b,tol,maxit,Ml,[],[],n);
minres converged at iteration 49 to a solution with relative
residual 4.7e-014
minres сходится к решению на итерации 49 с относительной погрешностью
4.7е-014
Рассмотрим СЛАУ с симметрической матрицей, которая не может быть решена
с помощью процедуры peg.
576
В. Г. Потемкин. Вычисления в среде MATLAB
А = diag([20:-1:1, -1:-1:-20]);
b = sum(А,2); % Решением является вектор из 1.
х = pcg(A,b); % Ошибка на первой итерации.
peg stopped at iteration 1 without converging to the desired
tolerance le-006 because a scalar quantity became too small
or too large to continue computing. The iterate returned
(number 0) has relative residual 1
peg прервана на итерации 1 для заданной точности 1е-006; эта величина
слишком мала или велика, чтобы продолжать вычисления. Номер
возвращаемой итерации - 0, относительная невязка - 1
Процедура minres легко справляется с этой симметрической матрицей:
х = minres(А,Ь,1е-6,50);
minres converged at iteration 41 to a solution with relative
residual 2.6e-009
minres сходится к решению на итерации 41 с относительной погрешностью
2.6е~009
Сопутствующие функции: BICG, BICGSTAB, CGS, CHOLINC, GMRES, LSQR, PCG,
QMR, SYMMLQ, @, \.
SYMMLQ | Симметрический LQ-метод
Синтаксис:
х = symmlq(A,b)
х = symmlq(A,b,tol)
х = symmlq(A,b,tol,maxit) .
х = symmlq(A,b,tol.maxit,М)
x = symmlq(A,bztol,maxit,Ml,М2)
x = symmlq(AzbztolzmaxitzMlzМ2zxO)
x = symmlq(afunzbztolzmaxitzmifunzm2funzxOzplzp2z...)
[xzflag] = symmlq(A,b,...)
-[x, flag, relres] = symmlq(Az bz ... )
*[x, flag, relres, iter] = symmlq (A, bz ... )
[xzflag,relres,iter, resvec] = symmlq(A,b,...)
[x,flag,relres,iter,resvec,resveccg] = symmlq(A,b,...)
Описание:
Функция x = symmlq(A, b) реализует попытку найти решение СЛАУ вида А*х = Ь.
Матрица А порядка п предполагается квадратной симметрической, но не обязательно
положительно определенной [81]. Предполагается, что эта матрица высокой размерно¬
сти и разреженная. Вектор-столбец b имеет длину п. Матрица А может быть задана
в виде функции afun(x), которая возвращает вычисленный вектор А*х. Если процедура
сходится, сообщение об этом выводится на экран терминала. Если же по завершении
допустимого максимума итераций или по иной причине сходимость не наблюдается,
выдается предупреждение с указанием относительной погрешности norm(b -
- A*x)/norm(b) и номера итерации, когда метод потерпел неудачу.
Функция х = symmlq(A, b, tol) . позволяет задать погрешность вычисления tol. Если
tol = [], то по умолчанию применяется значение 1 е-6.
6. Работа с разреженными матрицами 577
19 т. Зак. 3375
Функция х = symmlq(A, b, tol, maxit) позволяет изменить значение максимального
числа итераций. Если maxit = [], то по умолчанию применяется значение min(n, 20).
Функции х = symmlq(A, b, tol, maxit, М) и х = qmr(A, b, tol, maxit, Ml, М2) исполь¬
зуют симметрические положительно определенные обусловливатели в виде матриц М
и М = М1*М2 для того, чтобы эффективно решить СЛАУ вида
inv(sqrt(М))*A*inv(sqrt(М))*у = inv(sqrt(М))*b
относительно новой переменной у и вернуть исходное решение в форме
х = inv(sqrt(М))*у.
Если М = [], то предобусловливатель не применяется. Аргумент М можно задавать
в виде М-функции, которая вычисляет вектор М\х.
Функция х = symmlq(A, b, tol, maxit, Ml, М2, х0) позволяет изменить вектор на¬
чальной оценки решения хО. Если в качестве вектора хО будет указан пустой массив,
то в этом случае он интерпретируется как нулевой, т. е. используемый по умолчанию.
Обращение к функции в форме х = symmlq(afun, b, tol, maxit, mlfun, m2fun, x0, pl,
p2,...) позволяет передать функциям afun(x, pl, p2,...), mlfun(x, pl, p2,...) и
m2fun(x, pl, p2,...) параметры pl, p2,...; при этом функции могут быть заданы своим
именем или дескриптором.
Для всех вышеописанных форм вызова возвращается решение х. Если решение по¬
лучено, то оно всегда сопровождается сообщением о величине относительной погреш¬
ности и количестве использованных итераций. Если превышено максимальное число
итераций или процедура прекратила счет, выводится соответствующее предупреж¬
дающее сообщение.
Функция [х, flag] = symmlq(...) возвращает решение и флаг, указывающий на харак¬
тер сходимости решения:
Значение флага
' Информация о сходимости
0
Процедура symmlq сходится к решению при заданной точности tol в пре¬
делах числа итераций maxit
1
Процедура symmlq превысила максимальное число итераций maxit, не дос¬
тигнув сходимости
2
Предобусловливатель М не возвращает приемлемого решения
3
Процедура остановлена, поскольку две последовательные оценки решения
оказались одинаковыми
4
Одна из величин в процессе выполнения процедуры вышла за пределы до¬
пустимых чисел в стандарте IEEE-арифметики
5
Предобусловливатель М не является симметрической положительно опре¬
деленной матрицей
Если значение флага не равно 0, то возвращается то решение, которое соответству¬
ет минимальной относительной погрешности для всех выполненных шагов. При ука¬
зании в качестве выходного параметра флага никаких сообщений не выводится.
Функция [х, flag, relres] = qmr(...) возвращает также относительную погрешность
решения norm(b - A*x)/norm(b). Если значение флага равно 0, то relres < tol.
Функция [х, flag, relres, iter] = qmr(...) возвращает номер итерации, на которой было
получено решение; этот номер удовлетворяет условию
578
В. Г. Потемкин. Вычисления в среде MATLAB
О < iter < maxit.
Функция [x, flag, relres, iter, resvec] = qmr(...) возвращает нормы невязок на каждой
итерации в виде вектора resvec, начиная с невязки
resvec(l) = norm(b - А*хО).
Функция [х, flag, relres, iter, resvec, resveccg] = symmlq(A, b, ...) дополнительно воз¬
вращает нормы невязок сопряженных градиентов на каждой итерации в виде вектора
resveccg.
Примеры:
Рассмотрим решение СЛАУ порядка 100.
п = 100; on = ones(n,l);
А = spdiags([-2*on 4*on -2*on]r-1:1,n,n);
b = sum(A,2);
tol = le-10; maxit = 50;
Ml = spdiags(4*on,0,n,n);
x = symmlq(A,b, tol,maxit,Ml, [],[]);
symmlq converged at iteration 49 to a solution with relative
residual 4.3e-015
symmlq сходится к решению на итерации 49 с относительной погрешностью
4.Зе-015
Начиная с версии MATLAB 6, это же решение можно получить, используя сле¬
дующую вспомогательную процедуру afun:
function у = afun(x,n)
у = 4*х;
у(2:п) = у(2:п) - 2*х(1:п-1);
y(l:n-l) = у(1:П-1) - 2*х(2:п);
xl = symmlq(@afun,b,tol,maxit,Ml,[],[] ,n);
symmlq converged at iteration 49 to a solution with relative
residual 4.3e-015
symmlq сходится к решению на итерации 49 с относительной погрешностью
4.Зе-015
Рассмотрим СЛАУ с симметрической матрицей, которая не может быть решена
с помощью процедуры peg.
А = diag([20:-1:1, -1:-1:-20]);
b = sum (А, 2); % Решением является вектор из 1.
х = pcg(A,b); % Ошибка на первой итерации.
peg stopped at iteration 1 without converging to the desired
tolerance le-006 because a scalar quantity became too small or
too large to continue computing. The iterate returned (number 0)
has relative residual 1
peg прервана на итерации 1 для заданной точности 1е-006; эта величина
слишком мала или велика, чтобы продолжать вычисления. Номер
возвращаемой итерации - 0, относительная невязка - 1
6. Работа с разреженными матрицами
579
Процедура symrnlq легко справляется с этой симметрической матрицей:
х = symmlq(A,b,1е-6,50);
syiranlq converged at iteration 41 to a solution with relative
residual 2.6e-009
symmlq сходится к решению на итерации 41 с относительной погрешностью
2.6е-009
Сопутствующие функции: BICG, BICGSTAB, CGS, CHOLINC, GMRES, LSQR, PCG,
QMR, SYMMLQ, @, \.
Несимметрические квадратные матрицы
BICG I Метод бисопряженных градиентов
Синтаксис:
х = bicg(А,Ь)
х = bicg(A,b,tol)
х = bicg(A,b,tol,maxit)
х = . bicg (A, b, tol,maxit,М)
x = bicg(A,b,tol,maxit,Ml,М2)
x = bicg(A,b,tol,maxit,Ml,M2/xO)
x = bicg(afun,b,tol,maxit,mlfun,m2fun,xO,pl,p2,...)
[x,flag] = bicg(...)
[x,flag,relres] = bicg(...)
[x,flag,relres,iter] = bicg(...)
[x,flag,relres,iter,resvec] = bicg(...)
Описание:
Функция x = bicg(A, b) реализует попытку решения системы линейных уравнений
А*х = b относительно неизвестного вектора х. Матрица А порядка п предполагается
произвольной квадратной. Решение начинается с начального приближения, по умол¬
чанию соответствующего нулевому вектору длины п, и итерации продолжаются до тех
пор, пока метод сойдется, либо произойдет останов вычислений, либо будет превыше¬
но максимальное число итераций. Сходимость достигнута, когда относительная по¬
грешность погш(Ь - A*x)/norm(b) становится меньше или равной заданной погрешно¬
сти вычислений (по умолчанию 1е-6). По умолчанию максимальное число итераций
равно min(n, 20). Никакой предварительной обработки матрицы не выполняется.
Функция х = bicg(A, b, tol) позволяет задать погрешность вычисления tol.
Функция х = bicg(A, b, tol, maxit) позволяет изменить значение максимального чис¬
ла итераций.
Функции х = bicg(A, b, tol, maxit, М) и х = bicg(A, b, tol, maxit, М1, М2) используют
вспомогательные матрицы М либо М=М1*М2 для того, чтобы преобразовать исход¬
ную систему в вид М*у = Ь, где у = inv(M)*A*x, и достичь более высокой эффективно¬
сти решения. Поскольку решения системы вида М*у = b ищутся с помощью встроен¬
ного решателя, разумно выполнить факторизацию матрицы М, используя LU-разло-
жение. Тогда решение будет использовать 2 оператора
R = 1и(М);
х = bicg(A, b, tol, maxit, R', R).
580
В. Г. Потемкин. Вычисления в среде MATLAB
Если в качестве матриц М, Ml, М2 будет указана пустая матрица, то в этом случае
она интерпретируется как единичная, т. е. никаких вспомогательных операций не вы¬
полняется.
Функция х = bicg(A, b, tol, maxit, Ml, М2, хО) позволяет изменить вектор начальной
оценки решения хО. Если в качестве вектора хО будет указан пустой массив, то в этом
случае он интерпретируется как нулевой, т. е. используемый по умолчанию.
Обращение к функции в форме х = bicg(afun, b, tol, maxit, ml fun, m2fun, xO, pl, p2,...)
позволяет передать функциям afun(x, pl, p2,...), mlfun(x, pl, p2,...) и m2fun(x, pl, p2,...)
параметры pl, p2,...; при этом функции могут быть заданы своим именем или деск¬
риптором.
Для всех вышеописанных форм вызова возвращается решение х. Если решение по¬
лучено, то оно все равно сопровождается сообщением о величине относительной по¬
грешности решения и количестве использованных итераций. Если превышено макси¬
мальное число итераций или процедура прекратила счет, выводится соответствующее
предупреждающее сообщение.
Функция [х, flag] = bicg(...) возвращает решение и флаг, указывающий на характер
сходимости решения:
Значение флага
Информация о сходимости
0
Процедура bicg сходится к решению при заданной точности tol в пределах
числа итераций maxit
1
Процедура bicg превысила максимальное число итераций maxit, не достиг¬
нув сходимости
2
Одна из вспомогательных систем вида М*у = г плохо обусловлена и не воз¬
вращает приемлемого решения из встроенного решателя
3
Процедура остановлена, поскольку две последовательные оценки решения
оказались одинаковыми
4
Одна из величин в процессе выполнения процедуры вышла за пределы до¬
пустимых чисел в арифметике с плавающей точкой
Если значение флага не равно 0, то возвращается то решение, которое соответству¬
ет минимальной относительной погрешности для всех выполненных шагов. При ука¬
зании в качестве выходного параметра флага никаких сообщений не выводится.
Функция [х, flag, relres] = bicg(...) возвращает также относительную погрешность
решения norm(b-A*x)/norm(b). Если значение флага равно 0, то relres < tol.
Функция [х, flag, relres, iter] = bicg(...) возвращает номер итерации, на которой было
получено решение; этот номер удовлетворяет условию
О < iter < maxit.
Функция [х, flag, relres, iter, resvec] = bicg(...) возвращает нормы невязок на каждой
итерации в виде вектора resvec, начиная с невязки resvec(l) = norm(b - А*хО). Если
значение флага равно 0, то вектор resvec имеет длину iter + 1 и значение последнего
компонента должно удовлетворять условию
resvec(end) < tol*norm(b).
Примеры:
Рассмотрим систему линейных уравнений А*х = Ь, связанную с тестовой матрицей
west0479 размера 479x479.
6. Работа с разреженными матрицами
581
load west0479
A = west0479; b = sum(A,2);
Поскольку вектор равен сумме столбцов матрицы системы, то решением такой сис¬
темы является единичный вектор размера 479x1; порядок матрицы не слишком велик,
поэтому найдем точное решение этой системы с помощью встроенного решателя.
х = A\b; norm(b - А*х)/norm(b)
ans = 8.3154е-017
Теперь найдем решение, используя функцию bicg
[х,flag,relres,iter,resvec] = bicg (A,b);
flag, relres, iter
flag = 1
relres = 1
iter = 0
Значение флага равно 1, что означает отсутствие сходимости при точности 1е-6
(по умолчанию) в пределах 20 итераций (по умолчанию). Значение параметра iter, рав¬
ное 0, свидетельствует о том, что процедура неустойчива, поскольку нулевое прибли¬
жение имеет наименьшую относительную погрешность по сравнению с последующи¬
ми шагами; минимальная погрешность relres равна 1.
Построим график относительной погрешности на каждой итерации (рис. 6.22), ис¬
пользуя функцию
senilogy(0:20,resvec/norm(b),'-г*,'Linewidth*,2), hold on
semilogy(0:20,resvec/norm(b),'sk*,'Markersize',5,'MarkerFaceColor',*g*);
set(gca,'YMinorGrid','off *,'XMinorGrid*,'off *,'YMinorTick','on','GridLineStyle',•-')
xlabel('Номер итерацииFontName'Arial Cyr','Fontsize10)
ylabel('||b - Ax||/|jb||',* Fontsize',10),grid on % рис. 6.22
рис. 6.22
Этот график свидетельствует о неустойчивости вычислительной процедуры.
Выполним факторизацию матрицы А с помощью неполного LU-разложения с по¬
рогом разреженности 1е-5.
[L1,U1] = luinc(А,1е-5);
Warning: Incomplete upper triangular factor has 1 zero diagonal.
It cannot be used as a preconditioner for an iterative method.
582
В. Г. Потемкин. Вычисления в среде MATLAB
Предупреждение: Верхний треугольный множитель имеет I нулевой элемент
на диагонали.
Его нельзя применять в качестве предобусловливателя для итерационного метода.
Предупреждение указывает на сингулярность LU-разложения при заданном пороге
разреженности. Уменьшим порог разреженности до 1е-6.
[L2/U2] = luinc (А, 1е-б);
nzA = nnz(A),nzL2 = nnz(L2),nzU2 = nnz(U2)
nzA = 1887
nzL2 = 6231
nzU2 = 4559
В этом случае предупреждающих сообщений нет и все элементы матрицы U2 не¬
нулевые. Теперь можно воспользоваться процедурой bicg.
[х, flag,relres,iter,resvec] = bicg(A,b,le-15,10,L2,U2);
flag,relres,iter
flag = 0
relres = 2.8664e-016
iter = 8
Требуемое решение получено на 8-й итерации.
Если уменьшать порог разреженности, то будет возрастать количество ненулевых
элементов неполного LU-разложения и увеличиваться точность аппроксимации ис¬
ходной матрицы. В этом случае предобусловленная система будет приближаться
к следующему виду:
inv(U)*inv(L)*L*U*x = inv(U)*inv(L)*b,
где матрицы L и U - истинные множители полного LU-разложения.
Построим образы структур матриц неполного LU-разложения для различных зна¬
чений коэффициента разреженности.
1 = 1 f к = -12 :2 : - б ;
for j = к
subplot(2,2,i),spy(luinc(A,10Ak(i))); % рис. 6.23
i = i+1;
end
рис. 6.23
6. Работа с разреженными матрицами
583
Как следует из анализа полученных структур, при уменьшении коэффициента раз¬
реженности от 1е-6 до 1е-12 количество ненулевых элементов возрастает от 10311
до 12 930, т. е. более чем на 20 %.
Проследим, как изменяется точность факторизации исходной матрицы в зависимо¬
сти от порога разреженности при использовании в качестве предобусловливателя не¬
полного LU-разложения.
i = 1; к = -14:2:-б;
for j = к
[L2,U2] = luinc(А,10А(к(i))) ;
[x,flag,relres,iter,resvec] = bicg(A,b,le-15,10,L2,U2);
semilogy(0: iter,resvec/norm(b),'-r',’Linewidth’, 2), hold on
semilogy(0:iter,resvec/norm(b),’sk’,’Markersize’,5,’MarkerFaceColor’,*g*);
i = i+1;
end
xlabel(’Номер итерации’, 'FontName’, 'Arial Cyr','Fontsize',10)
ylabel(’||b - Ax||/||b||',’Fontsize’,10),grid on % рис. 6.24
set(gca,'GridLineStyle’, '-')
\\
X \
к
L
1е-1дЧ
Пе-12 \
Че-10
1е-8
ТеД
012345678
Номер итерации
рис. 6.24
При пороге разреженности 1е-6 требуется 8 итераций для сходимости метода со¬
пряженных градиентов с машинной точностью, при пороге разреженности 1е-8 уже
требуется всего 5 итераций, при пороге 1е-10 - 3 итерации, при пороге 1е-12 - 2 итера¬
ции. При пороге разреженности 1е-14 точность решения до 12 десятичных знаков дос¬
тигается уже на первой итерации.
Сопутствующие функции'. BICGSTAB, CGS, GMRES, LSQR, LUINC, PCG, QMR,
SYMMLQ, @Д
BICGSTAB I Устойчивый метод бисопряженных градиентов
Синтаксис:
х = bicgstab(А,Ь)
х = bicgstab(A,b,tol)
х = bicgstab(A,b,tol,maxit)
584
В. Г. Потемкин. Вычисления в среде MATLAB
х = bicgstab(A,b,tol,maxit,М)
x ;= bicgstab (A, b, tol,maxit,Ml,М2)
x = bicgstab(A,b,tol,maxit,Ml,М2,xO)
x = bicgstab(afunzbztol,maxit,mlfun,m2fun,xO,pl,p2,...)
[xzflag] = bicgstab(...)
[x,flag,relres] = bicgstab(...)
[x,flag,relres,iter] = bicgstab(...)
[x, flag, relres, iter, resvec], = bicgstab(... )
Описание:
Функция x = bicgstab(A, b) реализует попытку решения системы линейных уравне¬
ний А*х = b относительно неизвестного вектора х. Матрица А порядка п предполага¬
ется произвольной квадратной. Решение начинается с начального приближения,
по умолчанию соответствующего нулевому вектору длины п, и итерации продолжают¬
ся до тех пор, пока метод сойдется, либо произойдет останов вычислений, либо будет
превышено максимальное число итераций [93]. Сходимость достигнута, когда относи¬
тельная погрешность norm(b - A*x)/norm(b) становится меньше или равной заданной
погрешности вычислений (по умолчанию 1е-6). По умолчанию максимальное число
итераций равно min(n, 20). Никакой предварительной обработки матрицы не выполня¬
ется.
Функция х = bicgstab(A, b, tol) позволяет задать погрешность вычисления tol.
Функция х = bicgstab(A, b, tol, maxit) позволяет изменить значение максимального
числа итераций.
Функции х = bicgstab(A, b, tol, maxit, М) и х = bicgstab(A, b, tol, maxit, Ml, М2) ис¬
пользуют вспомогательные матрицы М либо М=М1*М2 для того, чтобы преобразо¬
вать исходную систему в вид М*у = Ь, где у = inv(M)*A*x, и достичь более высокой
эффективности решения. Поскольку решения системы вида М*у = Ь ищутся с помо¬
щью встроенного решателя, разумно выполнить факторизацию матрицы М, используя
LU-разложение. Тогда решение будет использовать 2 оператора:
R = 1и(М);
х = bicgstab(A, b, tol, maxit, R’, R).
Если в качестве матриц М, Ml, М2 будет указана пустая матрица, то она интерпре¬
тируется как единичная, т. е. никаких вспомогательных операций не выполняется.
Функция х = bicgstab(A, b, tol, maxit, Ml, М2, х0) позволяет изменить вектор на¬
чальной оценки решения хО. Если в качестве вектора хО будет указан пустой массив,
то он интерпретируется как нулевой, т. е. используемый по умолчанию.
Обращение к функции в форме х = bicgstab(afun, b, tol, maxit, ml fun, m2fun, xO, pl,
p2,...) позволяет передать функциям afun(x, pl, p2,...), mlfun(x, pl, p2,...) и
m2fun(x, pl, p2,...) параметры pl, p2,...; при этом функции могут быть заданы своим
именем или дескриптором.
Для всех вышеописанных форм вызова возвращается решение х. Если решение по¬
лучено, то оно все равно сопровождается сообщением о величине относительной по¬
грешности решения и количестве использованных итераций. Если превышено макси-
6. Работа с разреженными матрицами
585
мальное число итераций или процедура прекратила счет, выводится соответствующее
предупреждающее сообщение.
Функция [х, flag] = bicgstab(...) возвращает решение и флаг, указывающий на харак¬
тер сходимости решения:
Значение флага
Информация о сходимости
0
Процедура bicgstab сходится к решению при заданной точности tol в пре¬
делах числа итераций maxit
1
Процедура bicgstab превысила максимальное число итераций maxit, не дос¬
тигнув сходимости
2
Одна из вспомогательных систем вида М*у = г плохо обусловлена и не воз¬
вращает приемлемого решения из встроенного решателя
3
Процедура остановлена, поскольку две последовательные оценки решения
оказались одинаковыми
4
Одна из величин в процессе выполнения процедуры вышла за пределы до¬
пустимых чисел в стандарте IEEE-арифметики
Если значение флага не равно 0, то возвращается то решение, которое соответству¬
ет минимальной относительной погрешности для всех выполненных шагов. При ука¬
зании в качестве выходного параметра флага никаких сообщений не выводится.
Функция [х, flag, relres] = bicgstab(...) возвращает также относительную погреш¬
ность решения norm(b - A*x)/norm(b). Если значение флага равно 0, то relres < tol.
Функция [х, flag, relres, iter] = bicgstab(...) возвращает номер итерации, на которой
было получено решение; этот номер удовлетворяет условию
О < iter < maxit
и может принимать либо целочисленное значение, либо целочисленное значение плюс
0.5, поскольку для устойчивости метода используется половинный шаг.
Функция [х, flag, relres, iter, resvec] = bicgstab(...) возвращает нормы невязок на ка¬
ждой итерации в виде вектора resvec, начиная с невязки
resvec(1) =.norm(b - A*x0).
Если значение флага равно 0, то вектор resvec имеет длину 2*iter + 1; значение по¬
следнего компонента должно удовлетворять условию
resvec(end) < tol*norm(b).
Примеры:
Рассмотрим систему линейных уравнений А*х = Ь, связанную с тестовой матрицей
west0479 размера 479x479.
load west0479
А = west0479; b = sum(A,2);
Найдем решение, используя функцию bicgstab.
[х,flag] = bicgstab(A,b); flag
flag = 1
586
В. Г. Потемкин. Вычисления в среде MATLAB
Значение флага равно 1, что означает отсутствие сходимости при точности 1е-6
(по умолчанию) в пределах 20 итераций (по умолчанию).
Выполним факторизацию матрицы А с помощью неполного LU-разложения с по¬
рогом разреженности 1е-5.
[L1/U1] = luinc (А, 1е-5);
[xl,flagl,relresl,iterl] = bicgstab(A,b,le-б,20,LI,Ul);
flagl,relresl,iterl
Warning: Incomplete upper triangular factor has 1 zero diagonal.
It cannot be used as a preconditioner for an iterative method.
Предупреждение: Верхний треугольный множитель имеет 1 нулевой элемент
на диагонали.
Его нельзя применять в качестве предобусловливателя для итерационного метода.
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 0.000000e+000.
Предупреждение: Матрица близка к вырожденной или плохо масштабирована.
Результат может быть неточным. RCOND = 0.000000е+000.
flagl = 2
relresl = 1
iterl = 0
Значение флага, равное 2, связано с тем, что верхняя треугольная матрица U1 имеет
на диагонали нуль и выполнение процедуры прекращается на первой итерации. Пре¬
дупреждение указывает на вырожденность системы Ul*y = г.
Уменьшим порог разреженности до 1 е-6.
[L2,U2] = luinc (А, 1е-б);
В этом случае предупреждающих сообщений нет и все элементы матрицы U2 не¬
нулевые. Теперь можно воспользоваться процедурой bicgstab:
[x2,flag2,relres2,iter2,resvec2] = bicgstab (A, b, le-15,10, L2,U2) ;
flag2, relres2, iter2
flag2 = 0
relres2 = 2.8534e-016
iter2 = 6
Требуемое решение получено на 6-й итерации.
Теперь можно построить относительную погрешность решения на каждой итера¬
ции (рис. 6.25), используя следующие операторы:
semilogy(0: 0.5:iter2,resvec2/norm(b), ' -г', 'Linewidth' ,2),hold on
semilogy (0: 0.5:iter2,resvec2/norm(b),' sk','Markersize',5,'MarkerFaceColor','g');
xlabel('Номер итерации','FontName','Arial Cyr','Fontsize',10)
ylabel('||b - Ax||/||b||','Fontsize',10),grid on % рис. 6.25
6. Работа с разреженными матрицами
587
рис. 6.25
Сопутствующие функции'. BICG, CGS, GMRES, LSQR, LUINC, PCG, QMR, SYMMLQ,
@ Д
CGS I Квадратичный метод сопряженных градиентов
Синтаксис:
х = cgs(A,b)
х = cgs(A,b,tol)
х = cgs(A,b,tol,maxit)
x = cgs (A,b, tol,maxit,M)
x = cgs(A,b,tol,maxit,Ml,М2)
x = cgs(A,b,tol,maxit,Ml,М2,xO)
x = cgs(afun,b,tol,maxit,mlfun,m2fun,xO,pl,p2,...)
[x,flag] = cgs(...)
[x,flag,relres] = cgs(...)
[x,flag,relres,iter] = cgs(...)
[x,flag,relres,iter,resvec] = cgs(...)
Описание:
Функция x = cgs(A, b) реализует попытку решения системы линейных уравнений
А*х = b относительно неизвестного вектора х. Матрица А порядка п предполагается
произвольной квадратной. Решение начинается с начального приближения, по умол¬
чанию соответствующего нулевому вектору длины п, и итерации продолжаются до тех
пор, пока метод сойдется, либо произойдет останов вычислений, либо будет превыше¬
но максимальное число итераций [88]. Сходимость достигнута, когда относительная
погрешность norm(b - A*x)/norm(b) становится меньше или равной заданной погреш¬
ности вычислений (по умолчанию 1е-6). Максимальное число итераций принимается
по умолчанию равным min(n, 20). Никакой предварительной обработки матрицы
не выполняется.
Функция х = cgs(A, b, tol) позволяет задать погрешность вычисления tol.
588
В. Г. Потемкин. Вычисления в среде MATLAB
Функция х = cgs (A, b, tol, maxit) позволяет изменить значение максимального числа
итераций.
Функции х = cgs(A, b, tol, maxit, М) и х = cgs(A, b, tol, maxit, Ml, М2) используют
вспомогательные матрицы М либо М=М1*М2 для того, чтобы преобразовать исход¬
ную систему в вид М*у = Ь, где у = inv(M)*A*x, и достичь более высокой эффективно¬
сти решения. Поскольку решения системы вида М*у = b ищутся с помощью встроен¬
ного решателя, разумно выполнить факторизацию матрицы М, используя LU-разложе¬
ние. Тогд^ решение будет использовать 2 оператора:
R = lu(М);
х = cgs(A, b, tol, maxit, R', R).
Если в качестве матриц М, Ml, М2 будет указана пустая матрица, то она интерпре¬
тируется как единичная, т. е. никаких вспомогательных операций не выполняется.
Функция х = cgs(A, b, tol, maxit, Ml, М2, хО) позволяет изменить вектор начальной
оценки решения хО. Если в качестве вектора хО будет указан пустой массив, то в этом
случае он интерпретируется как нулевой, т. е. используемый по умолчанию.
Обращение к функции в форме х = cgs(afun, b, tol, maxit, ml fun, m2fun, xO,pl,
p2,...) позволяет передать функциям afun(x, pl, p2,...), mlfun(x, pl, p2,...) и
m2fun(x, pl, p2,...) параметры pl, p2,...; при этом функции могут быть заданы своим
именем или дескриптором.
Для всех вышеописанных форм вызова возвращается решение х. Если решение по¬
лучено, то оно все равно сопровождается сообщением о величине относительной по¬
грешности решения и количестве использованных итераций. Если превышено макси¬
мальное число итераций или процедура прекратила счет, выводится соответствующее
предупреждающее сообщение.
Функция [х, flag] = cgs(...) возвращает решение и флаг, указывающий на характер
сходимости решения:
Значение флага
Информация о сходимости
0
Процедура cgs сходится к решению при заданной точности tol в пределах
числа итераций maxit
1
Процедура cgs превысила максимальное число итераций maxit, не достиг¬
нув сходимости
2
Одна из вспомогательных систем вида М*у = г плохо обусловлена и не воз¬
вращает приемлемого решения из встроенного решателя
3
Процедура остановлена, поскольку две последовательные оценки решения
оказались одинаковыми
4
Одна из величин в процессе выполнения процедуры вышла за пределы до¬
пустимых чисел в стандарте IEEE-арифметики
Если значение флага не равно 0, то возвращается то решение, которое соответству¬
ет минимальной относительной погрешности для всех выполненных шагов. При ука¬
зании в качестве выходного параметра флага никаких сообщений не выводится.
Функция [х, flag, relres] = cgs(...) возвращает также относительную погрешность
решения norm(b - A*x)/norm(b). Если значение флага равно 0, то relres < tol.
6. Работа с разреженными матрицами
589
Функция [х, flag, relres, iter] = cgs(...) возвращает номер итерации, на которой было
получено решение; этот номер удовлетворяет условию
О < iter < maxit.
Функция [х, flag, relres, iter, resvec] = cgs(...) возвращает нормы невязок на каждой
итерации в виде вектора resvec, начиная с невязки
resvec(1) = norm(b - А*хО).
Если значение флага равно 0, то вектор resvec имеет длину iter + 1; значение последне¬
го компонента должно удовлетворять условию
resvec(end) <tol*norm(b).
Примеры:
Рассмотрим систему линейных уравнений А*х = Ь, связанную с тестовой матрицей
west0479 размера 479x479:
load west0479
А = west0479; b = sum(A, 2);
Найдем решение, используя функцию cgs.
[х, flag! = cgs(А, b); flag
flag = 1
Значение флага равно 1, что означает отсутствие сходимости при точности 1е-6
(по умолчанию) в пределах 20 итераций (по умолчанию).
Выполним факторизацию матрицы А с помощью неполного LU-разложения с по¬
рогом разреженности 1е-6.
[L2,U2] = luinc(А,1е-6);
В этом случае предупреждающих сообщений нет и все элементы матрицы U2 не¬
нулевые. Теперь можно воспользоваться процедурой cgs.
[x2,flag2,relres2,iter2,resvec2] = cgs(A,b,le-15,10,L2,U2);
flag2,relres2,iter2
flag2 = 0
relres2 = 7.8833e-016
iter2 = 5
Требуемое решение получено на 5-й итерации.
Теперь можно построить относительную погрешность решения на каждой итера¬
ции (рис. 6.26), используя следующие операторы:
semilogy(0:iter2,resvec2/norni(b),'-г','Linewidth',2),hold on
semilogy(0:iter2,resvec2/norm(b),'sk','Markersize', 5,'MarkerFaceColor','g');
xlabel('Номер итерации','FontName', 'Arial CyrFontsize10)
ylabel(*||b - Ax||/||b||','Fontsize',10),grid on % рис. 6.26
590
В. Г. Потемкин. Вычисления в среде MATLAB
рис. 6.26
Сопутствующие функции: BICG, BICGSTAB, GMRES, LUINC, MINRES, PCG, QMR,
SYMMLQ, @,\.
GMRES I Обобщенный метод минимальной невязки
Синтаксис:
х = gmres(A,b,restart)
х = gmres(A,b,restart,tol)
х = gmres(A,b,restart,tol,maxit)
x = gmres(A,b,restart,tol,maxit,M)
x = gmres(A,b,restart,tol,maxit,Ml,М2)
x = gmres(A,b,restart,tol,maxit,Ml,М2,xO)
x = gmres(afun,b,tol,maxit,mlfun,m2fun,xO,pl,p2,...)
[x,flag] = gmres(...)
[x,flag,relres].= gmres(...)
[x*, flag, relres, iter] = gmres (... )
[x,flag,relres,iter,resvec] = gmres(...)
Описание:
Функция x = gmres(A, b, restart) реализует попытку решения системы линейных
уравнений А*х = b относительно неизвестного вектора х. Матрица А порядка п пред¬
полагается произвольной квадратной. Решение начинается с начального приближения,
по умолчанию соответствующего нулевому вектору длины п; процедура gmres выпол¬
няет рестарт по прошествии restart итераций, используя решение на последней итера¬
ции в качестве начального для следующего цикла; итерации продолжаются до тех пор,
пока метод сойдется, либо произойдет останов вычислений, либо будет превышено
максимальное число итераций [85]. Сходимость достигнута, когда относительная по¬
грешность norm(b - A*x)/norm(b) становится меньше или равной заданной погрешно¬
сти вычислений (по умолчанию 1е-6). По умолчанию максимальное число итераций
равно min(n, 20). Никакой предварительной обработки матрицы не выполняется.
Функция х = gmres(A, b, restart, tol) позволяет задать погрешность вычисления tol.
6. Работа с разреженными матрицами
591
Функция х = gmres(A, b, restart, tol, maxit) позволяет изменить значение максималь¬
ного числа итераций.
Функции х = gmres(A, b, restart, tol, maxit, М) и х = gmres(A, b, restart, tol, maxit, Ml,
М2) используют вспомогательные матрицы М либо М=М1*М2 для того, чтобы преоб¬
разовать исходную систему в вид М*у = Ь, где у = inv(M)*A*x, и достичь более высо¬
кой эффективности решения. Поскольку решения системы вида М*у = b ищутся с по¬
мощью встроенного решателя, разумно выполнить факторизацию матрицы М,
используя LU-разложение. Тогда решение будет использовать 2 оператора
R = 1и(М);
х = gmres(A, b, restart, to.l, maxit, R', R) .
Если в качестве матриц М, Ml, М2 будет указана пустая матрица, то она интерпре¬
тируется как единичная, т. е. никаких вспомогательных операций не выполняется.
Функция х = gmres(A, b, restart, tol, maxit, Ml, М2, xO) позволяет изменить вектор
начальной оценки решения хО. Если в качестве вектора хО будет указан пустой массив,
то в этом случае он интерпретируется как нулевой, т. е. используемый по умолчанию.
Обращение к функции в форме х = gmres(afun, b, tol, maxit, ml fun, m2fun, xO, pl, p2,...)
позволяет передать функциям afun(x, pl,p2,...), mlfun(x, pl, p2,...) и m2fun(x, pl, p2,...)
параметры pl, p2,...; при этом функции могут быть заданы своим именем или деск¬
риптором.
Для всех вышеописанных форм вызова возвращается решение х. Если решение по¬
лучено, то оно все равно сопровождается сообщением о величине относительной по¬
грешности решения и количестве использованных итераций. Если превышено макси¬
мальное число итераций или процедура прекратила счет, выводится соответствующее
предупреждающее сообщение.
Функция [х, flag] = gmres(...) возвращает решение и флаг, указывающий на харак¬
тер сходимости решения:
Значение флага
Информация о сходимости
0
Процедура gmres сходится к решению при заданной точности tol в преде¬
лах числа итераций maxit
1
Процедура gmres превысила максимальное число итераций maxit, не дос¬
тигнув сходимости
2
Одна из вспомогательных систем вида М*у = г плохо обусловлена
и не возвращает приемлемого решения из встроенного решателя
3
Процедура остановлена, поскольку две последовательные оценки решения
оказались одинаковыми
Если значение флага не равно 0, то возвращается то решение, которое соответству¬
ет минимальной относительной погрешности для всех выполненных шагов. При ука¬
зании в качестве выходного параметра флага никаких сообщений не выводится.
Функция [х, flag, relres] = gmres(...) возвращает также относительную погрешность
решения norm(b - A*x)/norm(b). Если значение флага равно 0, то relres < tol.
592.
В. Г. Потемкин. Вычисления в среде MATLAB
Функция [х, flag, relres, iter] = gmres(...) возвращает номера итераций внешнего
и внутреннего циклов, на которых было достигнуто решение; номер итерации внешне¬
го цикла iter(l) удовлетворяет условию
О < iter(l) < maxit;
номер итерации внутреннего цикла iter(2) удовлетворяет условию
О < iter(2) < restart.
Функция [х, flag, relres, iter, resvec] = gmres(...) возвращает нормы невязок на каж¬
дой итерации в виде вектора resvec, начиная с невязки
resvec(1) = norm(Ь-А*хО).
Если значение флага равно 0 и iter = [i j], то вектор resvec имеет длину (i - 1)*
^restart + j + 1; значение последнего компонента должно удовлетворять условию
resvec(end) < tol*norm(b).
Примеры:
Рассмотрим систему линейных уравнений А*х = Ь, связанную с тестовой матрицей
west0479 размера 479x479:
load west0479
А = west0479; b = sum(А,2);
Найдем решение, используя функцию gmres.
[x,flag] = gmres(A,b,5); flag
flag = 1
Значение флага равно 1, что означает отсутствие сходимости при точности 1е-6
(по умолчанию) в пределах 20 итераций-(по умолчанию).
Выполним факторизацию матрицы А с помощью неполного LU-разложения с по¬
рогом разреженности 1е-5.
[L1/U1] = luinc(А,1е-5)
[xl,flagl] = gmres(A,b,5,le-б,5,L1,U1); flagl
flagl = 2
Значение флага, равное 2, связано с тем, что верхняя треугольная матрица U1 имеет
на диагонали нуль и выполнение процедуры прекращается на первой итерации. Пре¬
дупреждение указывает на вырожденность системы Ш *у = г.
Выполним факторизацию матрицы А с помощью неполного LU-разложения с по¬
рогом разреженности 1е-6.
[L2,U2] = luinc(А,1е-б);
В этом случае предупреждающих сообщений нет и все элементы матрицы U2 не¬
нулевые. Теперь можно воспользоваться процедурой gmres.
[х2,flag2,relres2,iter2,resvec2] = gmres (A,b, 4, le-15,10,L2,U2);
flag2,relres2,iter2
flag2 = 0
relres2 = 8.5343e-017
iter2 = 4 4
Требуемое решение получено на 4-й внешней итерации после 16 внутренних ите¬
раций.
6. Работа с разреженными матрицами
593
Выполним процедуру gmres, осуществляя рестарт на 4, 6 и 8-й итерациях.
[L2,U2] = luinc(А,1е-б);
tol = 1е-15;
[х4, flag4,relres4/iter4,resvec4] = gmres (A,b,4, tol, 5,L2,U2); flag4
[хб, flag6, relres6, iter6,resvec6] = gmres (A,b, 6, tol,3,L2,U2); flag6
[x8,fIag8,relres8,iter8,resvec8] = gmres(A,b,8,tol,3,L2,U2); flag8
flag4 = 0
flagS = 0
flag8 = 0
Все соответствующие значения флагов равны 0 и процедура gmres сходится, если
выполнена предварительная факторизация матрицы с порогом разреженности 1е-6.
На рис. 6.27 показаны графики сходимости итераций при рестартах на 4, 6 и 8-й
итерациях.
semilogy(0:Iength(resvec4)-l,resvec4/norm(b)z'-г* , 'Linewidth’,2),hold on
semilogy (0:length(resvec4)-1,resvec4/norm (b), 'sk*,'MarkerSize',5,'MarkerFaceColor','g');
semilogy(0:length(resvec6)-1,resvec6/norm (b), • -r' z’Linewidth’z2),hold on
semilogy(0:length(resvec6)-1,resvec6/norm (b),'sk'z'Markersize',5,'MarkerFaceColor*z'g');
semilogy(0:length(resvec8)-1,resvec8/norm(b)z'-r'z'Linewidth’,2),hold on
semilogy(0:length(resvec8)-1,resvec8/norm(b)z'sk','Markersize',5,'MarkerFaceColor'z'g');
xlabel('Номер итерации','FontName','Arial Cyr','FontSize',10)
ylabel('||b - Ax||/||b||'z'FontSize',10),grid on % рис. 6.27
рис. 6.27
Из анализа полученных данных следует, что чем позже выполняется рестарт, тем
меньше требуется работы для достижения заданной точности решения.
Сопутствующие функции'. BICG, BICGSTAB, CGS, LSQR, LUINC, MINRES, PCG,
QMR, SYMMLQ, @,\.
QMR | Метод квазиминимальной невязки
Синтаксис:
х = qmr(А, Ь)
х = qmr(A,b,tol)
х = qmr(A,b,tol,maxit)
594
В. Г. Потемкин. Вычисления в среде MATLAB
х = qmr(A,b,tol,maxit,M)
x = qmr(A,b,tol,maxit,Ml,М2)
x = qmr(A,b,tol,maxit,Ml,М2,xO)
x = qmr(afun,b,tol,maxit,mlfun,m2fun,x0,pl,p2,...)
[x,flag] = qmr(...)
[x,flag,relres] = qmr(...)
[x,flag,relres,iter] = qmr(...)
[x,flag,relres,iter,resvec] = qmr(...)
Описание:
Функция x = qmr(A, b) реализует попытку решения системы линейных уравнений
А*х = b относительно неизвестного вектора х. Матрица А порядка п предполагается
произвольной квадратной. Решение начинается с начального приближения, по умол¬
чанию соответствующего нулевому вектору длины п, и итерации продолжаются до тех
пор, пока метод сойдется, либо произойдет останов вычислений, либо будет превыше¬
но максимальное число итераций [43]. Сходимость достигнута, когда относительная
погрешность norm(b - A*x)/norm(b) становится меньше или равной заданной погреш¬
ности вычислений (по умолчанию 1 е-6). По умолчанию максимальное число итераций
равно min(n, 20). Никакой предварительной обработки матрицы не выполняется.
Функция х = qmr(A, b, tol) позволяет задать погрешность вычисления tol.
Функция х = qmr(A, b, tol, maxit) позволяет изменить значение максимального чис¬
ла итераций.
Функции х = qmr(A, b, tol, maxit, М) и х = qmr(A, b, tol, maxit, Ml, М2) используют
вспомогательные матрицы М либо М=М1*М2 для того, чтобы преобразовать исход¬
ную систему в вид М*у = Ь, где у = inv(M)*A*x, и повысить эффективность решения.
Поскольку решения системы вида М*у = b ищутся с помощью встроенного решателя,
разумно выполнить факторизацию матрицы М, используя LU-разложение. Тогда ре¬
шение будет использовать 2 оператора:
R = 1и(М);
х = qmr(A, b, tol, maxit, R', R).
Если в качестве матриц М, Ml, М2 будет указана пустая матрица, то в этом случае
она интерпретируется как единичная, т. е. никаких вспомогательных операций не вы¬
полняется.
Функция х = qmr(A, b, tol, maxit, Ml, М2, х0) позволяет изменить вектор начальной
оценки решения хО. Если в качестве вектора хО будет указан пустой массив, то в этом
случае он интерпретируется как нулевой, т. е. используемый по умолчанию.
Обращение к функции в форме х = qmr(afun,b, tol, maxit, ml fun, m2fun, x0,pl,p2,...)
позволяет передать функциям afun(x, pl, p2,...), mlfun(x, pl, p2,...) и m2fun(x, pl, p2,...)
параметры pl, p2,при этом функции могут быть заданы своим именем или деск¬
риптором.
Для всех вышеописанных форм вызова возвращается решение х. Если решение по¬
лучено, то оно всегда сопровождается сообщением о величине относительной погреш¬
ности и количестве использованных итераций. Если превышено максимальное число
итераций или процедура прекратила счет, выводится соответствующее предупреж¬
дающее сообщение.
6. Работа с разреженными матрицами
595
Функция [х, flag] = qmr(...) возвращает решение и флаг, указывающий на характер
сходимости решения:
Значение флага
Информация о сходимости
0
Процедура qmr сходится к решению при заданной точности tol в преде¬
лах числа итераций maxit
1
Процедура qmr превысила максимальное число итераций maxit, не дос¬
тигнув сходимости
2
Одна из вспомогательных систем вида М*у = г плохо обусловлена
и не возвращает приемлемого решения из встроенного решателя
3
Процедура остановлена, поскольку две последовательные оценки реше¬
ния оказались одинаковыми
4
Одна из величин в процессе выполнения процедуры вышла за пределы
допустимых чисел в стандарте IEEE-арифметики
Если значение флага не равно 0, то возвращается то решение, которое соответству¬
ет минимальной относительной погрешности для всех выполненных шагов. При ука¬
зании в качестве выходного параметра флага никаких сообщений не выводится.
Функция [х, flag, relres] = qmr(...) возвращает также относительную погрешность
решения norm(b - A*x)/norm(b). Если значение флага равно 0, то relres < tol.
Функция [х, flag, relres, iter] = qmr(...) возвращает номер итерации, на которой было
получено решение; этот номер удовлетворяет условию
О < iter < maxit.
Функция [х, flag, relres, iter, resvec] = qmr(...) возвращает нормы невязок на каждой
итерации в виде вектора resvec, начиная с невязки
resvec(1) = norm(b - А*хО).
Если значение флага равно 0, то вектор resvec имеет длину iter + 1; значение по¬
следнего компонента должно удовлетворять условию
resvec(end) < tol*norm(b).
Пример:
Рассмотрим систему линейных уравнений А*х = Ь, связанную с тестовой матрицей
west0479 размера 479x479:
load west0479
А = west0479; b = sum(A, 2);
Найдем решение, используя функцию qmr.
[х,flag] = qmr(A,b); flag
flag = 1
Значение флага равно 1, что означает отсутствие сходимости при точности 1е-6
(по умолчанию) в пределах 20 итераций (по умолчанию).
Выполним факторизацию матрицы А с помощью неполного LU-разложения с по¬
рогом разреженности 1е-6.
[L2,U2] = luinc(А,1е-6);
596
В. Г. Потемкин. Вычисления в среде MATLAB
В этом случае предупреждающих сообщений нет и все элементы матрицы U2 не¬
нулевые. Теперь можно воспользоваться процедурой cgs.
[х2,flag2,relres2,iter2,resvec2] = qmr (A,b, le-15,10, L2,U2) ;
flag2,relres2,iter2
flag2 = 0
relres2 = 2.8715e-016
iter2 = 8
Требуемое решение получено на 8-й итерации.
Теперь можно построить относительную погрешность решения на каждой итера¬
ции (рис. 9.14), используя функцию
semilogy(0:iter2,resvec2/norm(b), '-г*, 1 Linewidth', 2), hold on
semilogy(0:iter2,resvec2/norm(b), *sk', 'Markersize5, 'MarkerFaceColor', 'g');
x lab el (’ Номер итерации ’ , ’ FontName ’ , 'Arial Cyr' , ' Fontsize' , 10)
уlabel('||b - Ax||/||b||1,'Fontsize*,10),grid on % рис. 6.28
рис. 6.28
Сопутствующие функции: BICG, BICGSTAB, CGS, GMRES, LSQR, LUINC, MINRES,
PCG, SYMMLQ, @,\.
Прямоугольные матрицы
LSQR
LSQR-реализация метода сопряженных градиентов
Синтаксис:
х = lsqr(Azb)
х = lsqr(Az bztol)
x = lsqr(Azbztol,maxit)
x = lsqr(Azbztol.maxitzM)
x = lsqr(Azbztol,maxit,Ml,М2)
x = lsqr(AzbztolzmaxitzMlzМ2zxO)
x = lsqr(afunzbztolzmaxitzmifunzm2funzxO,pl,p2, ...)
[xzflag] = lsqr(Azbz...)
6. Работа с разреженными матрицами
597
[x,flag,relres] = lsqr(A,b,...)
[x,flag,relres,iter] = lsqr(A,b,...)
[x,flag,relres,iter,resvec] = lsqr(A,b,...)
[x, flag, relres, iter, resvec, lsvec] = lsqr (A, b,’. . . )
Описание:
Функция x = lsqr(A, b) реализует попытку найти решение СЛАУ вида А*х = Ь, если
матрица А является квадратной, в противном случае решение ищется по методу наи¬
меньших квадратов, чтобы минимизировать норму невязки norm(b - А*х) [81]. Пред¬
полагается, что эта матрица высокой размерности, разреженная и имеет размер mxn.
Вектор-столбец b имеет длину т. Матрица А может быть задана в виде функции
afun(x), которая возвращает вектор А*х, а при обращении в форме afun(x, 'transp') -
вектор А'*х. Если процедура сходится, сообщение об этом выводится на экран терми¬
нала. Если же по завершении допустимого максимума итераций или по иной причине
сходимость не наблюдается, выдается предупреждение с указанием относительной по¬
грешности norm(b - A*x)/norm(b) и номера итерации, когда метод потерпел неудачу.
Функция х = lsqr(A, b, tol) позволяет задать погрешность вычисления tol. Если tol = [],
то по умолчанию применяется значение 1 е-6.
Функция х = lsqr(A, b, tol, maxit) позволяет изменить значение максимального чис¬
ла итераций. Если maxit = [], то по умолчанию применяется значение min(m, п, 20).
Функции х = lsqr(A, b, tol, maxit, М) и х = qmr(A, b, tol, maxit, Ml, М2) используют
обусловливатели в виде матриц М и М = М1*М2 размера пхп для того, чтобы эффек¬
тивно решить СЛАУ вида
A*inv(М) *у = b
относительно новой переменной у и вернуть исходное решение в форме
х = М*у.
Если М = [], то предобусловливатель не применяется. Аргумент М можно задавать
в виде М-функции mfun(x), которая возвращает вектор М\х, а при обращении
mfun(x,'transp') - М'\х.
Функция х = lsqr(A, b, tol, maxit, Ml, М2, хО) позволяет задать вектор начальной
оценки решения хО размера nxl. Если в качестве вектора хО будет указан пустой мас¬
сив, то в этом случае он интерпретируется как нулевой, т. е. используемый по умолчанию.
Обращение к функции в форме х = lsqr(afun, b, tol, maxit, mlfun, m2fun, хО, pl, р2,...)
позволяет передать функциям afun(x, р1,р2,...) и afun(x,pl,p2,...,'transp'), а также анало¬
гичным функциям mlfun и m2fun параметры pl, р2,...; при этом функции могут быть
заданы своим именем или дескриптором.
Для всех вышеописанных форм вызова возвращается решение х. Если решение по¬
лучено, то оно всегда сопровождается сообщением о величине относительной погреш¬
ности и количестве использованных итераций. Если превышено максимальное число
итераций или процедура прекратила счет, выводится соответствующее предупреж¬
дающее сообщение.
Функция [х, flag] = lsqr(...) возвращает решение и флаг, указывающий на характер
сходимости решения:
598
В. Г. Потемкин. Вычисления в среде MATLAB
Значение флага
Информация о сходимости
0
Процедура lsqr сходится к решению при заданной точности tol в пределах
числа итераций maxit
1
Процедура lsqr превысила максимальное число итераций maxit, не достиг¬
нув сходимости
2
Предобусловливатель М не возвращает приемлемого решения
3
Процедура остановлена, поскольку две последовательные оценки решения
оказались одинаковыми
4
Одна из величин в процессе выполнения процедуры вышла за пределы
допустимых чисел в стандарте IEEE-арифметики
Если значение флага не равно 0, то возвращается то решение, которое соответству¬
ет минимальной относительной погрешности для всех выполненных шагов. При ука¬
зании в качестве выходного параметра флага никаких сообщений не выводится.
Функция [х, flag, relres] = qmr(...) возвращает также относительную погрешность
решения norm(b - A*x)/norm(b). Если значение флага равно 0, то relres < tol.
Функция [х, flag, relres, iter] = qmr(...) возвращает номер итерации, на которой было
получено решение; этот номер удовлетворяет условию
О < iter < maxit.
Функция [х, flag, relres, iter, resvec] = qmr(...) возвращает нормы невязок на каждой
итерации в виде вектора resvec, начиная с невязки
resvec (1) = попп(Ь - А*хО).
Функция [х, flag, relres, iter, resvec, lsvec] = lsqr(A, b,...) дополнительно возвращает
в виде вектора lsvec нормы вектора невязок для нормальных уравнений на каждой
итерации.
попп((A*inv(M))'*(В-А*Х))/norm(A*inv(M), 'fro').
Следует заметить, что оценка нормы (A*inv (М), ’fro’) изменяется и обнадеживаю¬
ще улучшается на каждой итерации.
Пример:
Рассмотрим решение СЛАУ порядка 100.
п = 100; on = ones(n,l);
А = spdiags([-2*on 4*on -on],-1:l,n,n);
b = sum(A, 2);
tol = le-8; maxit =15;
Ml = spdiags([on/(-2) on]t-1:0,n,n);
М2 = spdiags([4*on -on], 0:1,n, n) ;
x = lsqr(A,b,tol,maxit,Ml,М2,[]);
lsqr converged at iteration 11 to a solution with relative
residual 3.5e-009
lsqr сходится к решению на итерации 11с относительной погрешностью 3.5е-009
Начиная с версии MATLAB 6 это же решение можно получить, используя следую¬
щую вспомогательную процедуру afun:
6. Работа с разреженными матрицами
599
I function у = afun(x,n,transp—flag)
if (nargin > 2) & strcmp(transp_flag, 'transp')
у = 4 * x;y(l:n-l) = y(l:n-l) - 2 * x(2:n);
y(2:n) = y(2:n) - x(l:n-l);
else
у = 4 * x;
y(2:n) = y(2:n) - 2 * x(l:n-l);
y(l:n-l) = y(l:n-l) - x(2:n);
end
xl = lsqr(@afun,b,tol,maxit,Ml,М2,[],n);
lsqr converged at iteration 11 to a solution with relative
residual 3.5e-009
lsqr сходится к решению на итерации 11с относительной погрешностью 3.5е-009
Сопутствующие функции: BICG, BICGSTAB, CGS, GMRES, MINRES, NORM, PCG,
QMR, SYMMLQ, @, \.
Вычисление собственных значений и сингулярных чисел
В состав ядра системы MATLAB 6 включено две М-функции для вычисления от¬
дельных собственных значений и сингулярных чисел для больших разреженных мат¬
риц - это функции eigs и svds.
EIGS I
Вычисление отдельных собственных значений и векторов
Синтаксис:
d = eigs(А)
d = eigs(A,k)
d = eigs(A,k,sigma)
d = eigs(A,k,sigma,options)
d = eigs(A,B,...)
[V,D] = eigs(A,...)
[V,D,flag] = eigs(A,...)
d = eigs(Afun,n)
d = eigs (Afun, n, k)
d = eigs(Afun,n,k,sigma)
d = eigs(Afun,n,k,sigma,options)
d = eigs (Afun, n,k, sigma, opt ions, pl, p2
d = eigs(Afun,n,B,...)
[V,D] = eigs(Afun,n,...)
[V,D,flag] = eigs(Afun,n,-••)
Описание:
Процедуры eigs решают полную проблему A*v = lambda*v и обобщенную пробле¬
му A*v = lambda*B*v собственных значений для произвольной квадратной матрицы А
[64, 89]. При этом вычисляется фиксированное или заданное количество максималь¬
ных по модулю собственных значений и соответствующих векторов, в противовес
процедуре eig, которая вычисляет все собственные значения и векторы.
Функции d = eigs(A) и d = eigs(Afun, п) решают задачу на собственные значения,
когда в качестве первого входного аргумента используется либо квадратная матрица
(полная или разреженная, симметрическая или несимметрическая, действительная или
комплексна^; либо строка с именем М-файла, либо декскиптор функции. В последних
двух случХях должен быть указан второй аргумент п, задающий порядок матрицы.
600
В. Г. Потемкин. Вычисления в среде MATLAB
Функции d = eigs(A, k) и d = eigs(Afun, n, k) позволяют задать требуемое количест¬
во к максимальных по модулю собственных значений (по умолчанию k = min(n, 6)).
Функции d = eigs(A, k, sigma) и d = eigs(Afun, n, k, sigma) позволяют с помощью
параметра sigma специфицировать вычисляемые собственные значения. Параметр
sigma может быть либо числом, либо строкой из двух символов.
Если значение параметра sigma равно 0, то вычисляется к минимальных по модулю
собственных значений; если sigma действительное или комплексное число, то оно ин¬
терпретируется как уставка, которая указывает, что должно быть вычислено к бли¬
жайших к sigma собственных значений. Если значение sigma точно совпало с собст¬
венным значением, функция окажется несостоятельной из-за деления на нуль
в выражении l/(lambda - sigma). В этом случае следует начать вычисления с новым
значением sigma, близким, но не равным прежнему значению.
Если параметр sigma - строка из двух символов, то определены следующие специ¬
фикации для собственных значений:
sigma
Назначение
'lm'
Вычислить максимальные по модулю значения (по умолчанию)
'sm'
Вычислить минимальные по модулю значения (эквивалентно sigma = 0)
Для действительных симметрических матриц
'1а'
Вычислить максимальные по модулю действительные собственные значения
'sa'
Вычислить минимальные по модулю действительные собственные значения
'be'
Вычислить floor(k/2) минимальных и ceil(k/2) максимальных по модулю собст¬
венных значений
Для несимметрических и комплексных матриц
'1г'
Вычислить значения с максимальными действительными частями
'sr'
Вычислить значения с минимальными действительными частями
'И'
Вычислить значения с максимальными мнимыми частями
'si'
Вычислить значения с минимальными мнимыми частями
Функции d = eigs(A, k, sigma, options) и d = eigs(Afun, n, k, sigma, options) позволя¬
ют задать следующие опции в массиве записей options:
Опция
Описание
Возможные
значения
options.issym
1 - если матрица А симметрическая;
О-в остальных случаях
{0} 11
options.isreal
1 - если матрица А действительная;
О-в остальных случаях
0|{1}
options.tol
Условие сходимости:
norm(A*V-V*D) < tol*norm(A)
<число>|{eps}
options.maxit
Максимальное количество итераций
<целое>|{300}
options.p
Размерность базиса Арнольда
<целое>|{2*к}
6. Работа с разреженными матрицами
601
Опция
Описание
Возможные
значения
options.v0
Начальный вектор для факторизации Арнольда
rand(п, 1) --. 5
options.disp
Уровень вывода информации в рабочее окно
0|{1}|2
options.cholB
1 - если матрица имеет разложение Холецкого;
О-в остальных случаях
{0} |1
options.permB
Вектор перестановок permb, когда В имеет раз¬
ложение chol(B(permb, permb))
регтпВ | {1 :п}
Обращение в форме eigs(Afun, п,...) допускает использование М-функции Afun
вместо матрицы А. При этом М-функция у = Afun(x) должна формировать следующие
выходные аргументы:
Выходной аргумент
Условие формирования
А*х
Если параметр sigma отличен от 'sm’ или не указан
А\х
Если параметр sigma равен 0 или ’sm'
(A-sigma*I) \х
Если sigma ненулевой скаляр; I = eye(size(A))
(A-sigma*B)\х
Если sigma ненулевой скаляр
Матрицы A, A-sigma*I и A-sigma*B, формируемые М-функцией Afun, предполага¬
ются действительными и несимметричными, если только не задействованы специаль¬
ные опции opts.isreal и opts.issym. Следует иметь в виду, что всегда обращение вида
eigs(A,...) можно заменить обращением eigs(Afun, п,...), где Afun - это имя или деск¬
риптор функции.
Функции eigs(Afun, n, k, sigma, opts, pl, р2,...) и eigs(Afun, п, В, к, sigma, opts, pl, p2,...)
позволяют передать в функцию Afun(x, pl, р2,...) дополнительные аргументы.
Функции d = eigs(A, В,...) и d = eigs(Afim, п, В,...) решают обобщенную задачу на
собственные значения. Матрица В имеет такие же размеры, как и матрица А; если
матрица В не указана, то используется единичная матрица В = eye(size(A)).
Выход d - это вектор, содержащий к собственных значений.
В случае двух выходных аргументов функции [V, D] = eigs(A,...) и [V, D] =
= eigs(Afun, п,...) формируются матрица V размера kxn и диагональная матрица D раз¬
мера kxk, такие, что A*V = V*D или A*V = B*V*D.
В случае трех выходных аргументов функции [V, D, flag] = eigs(A,...) и [V, D, flag] =
= eigs(Afun, n,...) выходной аргумент flag указывает, была ли решена проблема собст¬
венных значений с заданной точностью; значение flag = 0 указывает на сходимость,
а значение flag = 1 - на расходимость процедуры.
Примеры:
Первый пример демонстрирует применение дескриптора функции для организации
вычисления собственных значений для больших разреженных матриц. Эта новая тех¬
нология характерна для системы MATLAB версии 6.5.
Вычислим 5 минимальных по модулю собственных значений конечно-разностной
аппроксимации лапласиана, заданного на сетке типа 'С' размера 15x15.
А в delsq(numgrid('С1,15));
dl в eigs(А,5,’sm'); dl
602
В. Г. Потемкин. Вычисления в среде MATLAB
dl =
0.551973690758782
0.478711803607021
0.346893034468926
0.267566663779184
0.133415799576330
Начиная с версии MATLAB 6 это же решение можно получить, используя следую¬
щую вспомогательную процедуру Afun:
function у = dnRk(x,R,k)
у = (delsq(numgrid(R,к)))\x;
Для вызова М-функции eigs в этом случае необходимо передать дополнительные
аргументы: тип сетки - ’С и ее размер - 15. Используя новый синтаксис, это можно
выполнить следующим образом:
Xi = size(А, 1);
opts.issym = 1;
d2 = eigs(@dnRk,n,5,'sm',opts,’С’,15); d2
d2 =
0.551973690758785
0.478711803607020
0.346893034468926
0.267566663779186
0.133415799576329
Рассмотрим разреженную матрицу west0479 размера 479x479, которая имеет дей¬
ствительные и комплексно-сопряженные собственные значения. Функция eig вычис¬
ляет все 479 собственных значений; с помощью функции eigs можно вычислить задан¬
ное количество минимальных и максимальных по модулю собственных значений.
load west0479
d = eig(full(west0479));
dim = eigs(west0479,8);
dsm = eigs(west0479,6,'sm');
figure(1) % рис. 6.29,a
semilogy(real(d(l:8)),abs(imag(d(l:8))),'o'),hold on
semilogy(real (dim), abs (imag(dim)), ' + 1) ,grid on
set(gca,1GridLineStyle1,1 - 1)
set (gca, 'YMinorGrid', ’off1, 1 XMinorGrid’, ’off ’, ’YMinorTick', ’on’)
legend(' eigs(A,8)', ' eig(A)', 2)
figure(2) % рис. 6.29,6
plot(real(dsm), abs(imag(dsm)),’o’),hold on
plot(real(d(end-5:end)),abs(imag(d(end-5:end))),' +')
legend(' eigs(A,6,"sm")', ’ eig(A)’,2)
plot(real(dsm),-abs(imag(dsm)),’o')
plot(real(d(end-5 send)),-abs(imag(d(end-5 send))),’ + ')
grid on, set(gca,'GridLineStyle’,’-’)
6. Работа с разреженными матрицами
603
Максимальные по модулю собственные
Минимальные по модулю собственные
значения
-0.015
значения
I о eigs(A,6,"sm“) I
I + eig(A)
©
s
kJ
32
©
а б
рис. 6.29
На рис. 6.29, а показаны только 4 из 8 комплексно-сопряженных и максимальных
по модулю собственных значения, а на рис. 6.29, б - все 6 комплексно-сопряженных
минимальных по модулю собственных значений.
Матрица А = delsq(numgrid(’C', 30)) - это симметрическая положительно опреде¬
ленная матрица порядка 632 с хорошо отделенными собственными значениями, рас¬
положенными в интервале (0, 8), но при этом имеется 18 простых кратных значений,
равных 4. М-функция eig вычисляет все 632 собственных значения; с помощью М-
функции eigs вычисляется 6 минимальных и максимальных по модулю собственных
значений.
А = delsq(numgrid('С’, 30));
tic,Jstr = jord(A,4),toe
Jstr = 4 18
elapsed—time = 29.232
d = eig(full(A));
[dum, ind] = sort(abs(d));
dim = eigs(A);
dsm = eigs(A,6,'sm');
subplot(2,1,1) % рис. 6.30,a
plot(dim, 1bo•),hold on
plot(d(ind(end:-1:end-5)),' r+'),hold off
legend('eigs(A) ' , 'eig(full(A))1,3)
set(gca,'XLim',[0.5 6.5])
set(gca,'GridLineStyle','-')
subplot(2,1,2) % рис. 6.30,6
plot(sort(dsm),'bo'),hold on
plot(d(ind(l:6)),'r+'),hold off
legend('eigs(A,6,''sm'')','eig(full(A))',2)
set(gca,'XLim',[0.5 6.5])
set(gca,'GridLineStyle','-')
604
В. Г. Потемкин. Вычисления в среде MATLAB
8
рис. 6.30
Однако нас может интересовать, как М-функция eigs для разреженных матриц по¬
зволяют выявить кратные собственные значения. Ранее с помощью М-функции jord
было установлено, что все кратные значения являются простыми, и на это понадоби¬
лось 29.2 с на компьютере с тактовой частотой 1700 МГц. Попытка вычислить крат¬
ные собственные значения, используя обращение вида
eigs(А,18,4.0) ,
оказывается безуспешной. Поэтому определим уставку sigma, равную 4 - 1е-6, и попы¬
таемся вычислить 18 ближайших собственных значений, а также 20 собственных зна¬
чений вблизи значения 4 с помощью М-функции eig.
sigma = 4 - le-б;
d = eigs(А,18,sigma); d
dd = dA(find(dA>3.97&dA<4.03));
plot(dd,'ob’),hold on
plot(2:19,d,'+r1),grid on % рис. 6.31
рис. 6.31
6. Работа с разреженными матрицами
605
Алгоритм:
Используемые алгоритмы и их реализация выполнены в виде библиотеки ARPACK
на языке Fortran [65].
Сопутствующие функции’. EIG, SVDS.
SVDS ~“| Вычисление отдельных сингулярных чисел
Синтаксис:
s = svds(А)
s = svds(А,к)
s = svds(А,к/0)
[U,S,V] = svds(Az ...)
Описание:
Функция s = svds(A) вычисляет 5 максимальных сингулярных чисел и связанных
с ними сингулярных векторов произвольной прямоугольной матрицы А.
Функция s = svds(A, к) вычисляет к максимальных сингулярных чисел и связанных
с ними сингулярных векторов.
Функция s = svds(A, к, 0) вычисляет к минимальных сингулярных чисел.
Функция [U, S, V] = svds(A,...) формирует следующие выходные аргументы:
• матрицу U размера тхк с ортонормированными столбцами;
• диагональную матрицу сингулярных чисел S размера кхк;
• матрицу V размера пхк с ортонормированными столбцами.
Произведение U*S*V’ является наилучшей аппроксимацией ранга к для исходной
прямоугольной матрицы А.
Алгоритм:
Функция svds(A, к) использует функцию eigs для вычисления к максимальных соб¬
ственных значений и соответствующих собственных векторов для расширенной мат¬
рицы В = [0 А; А’ 0] размера (m+n)x(m+n).
Функция svds(A, к, 0) использует функцию eigs для вычисления 2к минимальных
собственных значений и соответствующих собственных векторов для матрицы В =
= [0 А; А' 0], а затем из них выбирается к положительных.
Примеры:
Рассмотрим разреженную матрицу west0479 размера 479x479. Функция svd вычис¬
ляет все 479 сингулярных чисел; с помощью функции svds легко вычислить заданное
количество минимальных и максимальных сингулярных чисел.
load west0479
s = svd(full(west0479));
si = svds(west0479,4);
ss = svds(west0479,6,0);
figure(1) % рис. 6.32,a
plot(s(1:4)z'o')/hold on
plot(si/'+1),grid on
legend(’ svds(A/4)'/ 1 svd(A),,l)
figure(2) % рис. 6.32,6
606
В. Г. Потемкин. Вычисления в среде MATLAB
plot(sort(ss),'о*)/hold on
plot(sort(s(end-5:end))
legend(' svds(A,6,0)'
Максимальные сингулярные числа
1 + '),grid on
svd(A)1,4)
Минимальные сингулярные числа
рис. 6.32
Максимальное сингулярное число матрицы west0479 может быть вычислено не¬
сколькими способами:
tic,sdl = svds (west0479,1), toe
tic,sd2 = max(svd(full(west0479))),toe
tic,sd3 = norm( full(west0479)),toe
tic,sd4 = norms st(west0479),toe
sdl = 3.1895e+005
elapsed—time =0.11
sd2 = 3.1895e+005
elapsed—time = 1.262
sd3 = 3.1895e+005
elapsed—time = 1.242
sd4.= 3.1894e+005
elapsed—time = 0.441
Как следует из полученных результатов, работа с разреженными матрицами позво¬
ляет существенно сократить время вычислений.
Сопутствующие функции'. SVD, EIGS.
6.8. Операции над деревьями
ETREE I
Синтаксис:
Дерево матрицы
р = etree(А)
р = etree(A, ’col' )
р = etree(А,'sym')
[p,q] = etree(A)
[p,q] = etree(A,'col')
[p,q] = etree(A,'sym')
6. Работа с разреженными матрицами
607
Описание:
Функция р = etree(A) возвращает структуру дерева для квадратной симметрической
матрицы А; значение p(j) - это родитель столбца с номером j в дереве; если p(j) = О,
то столбец] - корень дерева.
Функция р = etree(A, 'соГ) возвращает структуру дерева для матрицы А’ * А.
Функция р = etree(A, ’sym') равносильна функции р = etree(A).
Функция [р, q] = etree(A, ...) в дополнение к структуре дерева возвращает также
вектор перестановок столбцов q.
Пример:
Рассмотрим матрицу А следующего вида:
А = [1 0
0 1;
0 10 0;
0 0 1 0; 1 0 0 1]
А =
1
0
0
1
0
1
0
0
0
0
1
0
1
0
0
1
Эта матрица симметрическая, и применение функции etree дает следующий результат:
[p,q] = etree(А)
р = 4 О О О
q = 2 3 1 4
Сопутствующие функции’. ETREEPLOT, TREELAYOUT, TREEPLOT.
ETREEPLOT I Построение дерева матрицы
Синтаксис:
etreeplot(А)
еtreeplot(А, с, d)
Описание:
Функция etreeplot(A) строит дерево для квадратной матрицы А; если матрица не¬
симметрическая - то для А + Alt+'.
Функция etreeplot(A, с, d) в дополнение к построению дерева для квадратной мат¬
рицы А позволяет управлять путем задания параметров с и d соответственно цветом
и символами обозначения узлов и ребер. Если один из параметров заменен на ”,
то на график не будут выводиться либо ребра, либо узлы. Если эти параметры не ука¬
заны, то принимаются их значения по умолчанию.
Пример:
Рассмотрим матрицу А следующего вида:
А =
[1 0
0 1;
0 10 0;
0 0 1 0; 1 0 0 1]
А =
1
0
0
1
0
1
0
0
0
0
1
0
1
0
0
1
608
В. Г. Потемкин. Вычисления в среде MATLAB
Эта матрица симметрическая, и применение функций etree и etreeplot дает следую¬
щие результаты:
[p#q] = etree(А)
etreeplot(А) % рис. 6.33
р = 4 О О О
q = 2 3 1 4
На рис. 6.33 показан график соответствующего дерева.
рис. 6.33
Сопутствующие функции'. ETREE, TREELAYOUT, TREEPLOT.
TREELAYOUT | Разметить дерево
Синтаксис:
[x,y,h,s] = treelayout(parent,post)
Описание:
Функция [х, у, h, s] = treelayout(p, q) использует в качестве входных параметров
вектор p(j), отождествляемый либо с родителем столбца с номером j в дереве, либо
с корнем дерева, если p(j) = 0, а также вектор q перестановки столбцов. Если вектор q
не указан, то он вычисляется в процессе выполнения функции.
Выходные параметры х и у - это векторы координат узлов дерева, которое разме¬
щается в пределах единичного квадрата, чтобы сделать график удобным для воспри¬
ятия.
Дополнительные выходные параметры h и s определяют соответственно высоту
и количество узлов.
Эту функцию целесообразно использовать в сочетании с функцией построения
графа gplot.
Пример:
Рассмотрим матрицу А следующего вида:
А =
[1 0
0 1;
0 1 0 0; 0 0 1 0; 1 0 0 1Г
А =
1
0
0 1
0
1
0 0
0
0
1 0
1
0
0 1
6. Работа с разреженными матрицами
609
20 т. Зак. 3375
Эта матрица симметрическая, и применение функций etree, treelayout и gplot дает
следующие результаты:
[P/q] = etree(А)
[x,y,h,s] = treelayout(pzq);
gplot(A,[x* у'],1r-1),hold on
gplot(A,[x1 y’Jr’bo1) % рис. 6.34
p = 4 0 0 0
q = 2 3 1 4
На рис. 6.34 показан график соответствующего дерева.
рис. 6.34
Сопутствующие функции'. ETREE, ETREEPLOT, TREEPLOT.
TREEPLOT | Построение дерева матрицы
Синтаксис:
treeplot(р)
treeplot(р,с,d)
Описание:
Функция treeplot(p) строит дерево, если задан вектор p(j), отождествляемый либо
с родителем столбца с номером] в дереве, либо с корнем дерева, если p(j) = 0.
Функция treeplot(p, с, d) в дополнение к построению дерева позволяет управлять
цветом и символами обозначения узлов и ребер путем задания соответственно пара¬
метров end. Если один из параметров заменен на ”, то на график не будут выводиться
либо ребра, либо узлы. Если эти параметры не указаны, то принимаются их значения
по умолчанию.
Пример:
Рассмотрим матрицу А следующего вида:
А =
[1 0
0 1;
0 10 0;
0 0 1 0; 1 0 0 1]
А =
1
0
0
1
0
1
0
0
0
0
1
0
1
0 .
0
1
Эта матрица симметрическая, и применение функций etree и treeplot дает следую¬
щие результаты:
610
В. Г. Потемкин. Вычисления в среде MATLAB
о
4
[PzQ] = etree(А)
treeplot(p,'bo','г') % рис. 6.3 5
p = 4 0 0
q = 2 3 1
На рис. 6.35 показан график соответствующего дерева.
Сопутствующие функции'. ETREE, TREELAYOUT, TREEPLOT.
6.9. Вспомогательные операции
SPPARMS I Установка параметров для алгоритмов упорядочения и прямого
решения линейных уравнений
Синтаксис:
spparms
values = spparms
[keys,values] = spparms
value = spparms('key')
Описание:
spparms('key',value)
spparms(values)
spparms('default')
spparms('tight')
Работа с разреженными матрицами в системе MATLAB организована с помощью
специального монитора SParse MONItor. Большинству пользователей знание служеб¬
ных команд работы с монитором совершенно необязательно. Эти команды предназна¬
чены только для тех пользователей, которые хотели бы увидеть и, возможно, изменить
работу алгоритмов упорядочения и решения систем линейных уравнений.
Функция spparms сама по себе выводит на экран описания текущих установок.
Функция values = spparms выводит на экран значения этих установок.
Функция [keys, values] = spparms выводит вектор значений и символьную матрицу,
строки которой являются ключами параметров монитора SParse MONItor.
Функция value = spparms(‘<Knio4>‘) выводит значение параметра для данного ключа.
Функция spparms('<KnK)4>’, <значение>) устанавливает один или более настраи¬
ваемых параметров, которые используются в функциях упорядочения colmmd
и symmmd, а также в операциях решения систем линейных уравнений / и \.
Функция spparms(values) применяется без выходных параметров и устанавливает
значения, указанные во входном векторе.
6. Работа с разреженными матрицами
611
Функция spparms(’default') устанавливает значения по умолчанию.
Функция spparms(’tight') устанавливает параметры алгоритмов упорядочения
по разреженности к наиболее "строгим" значениям, что приводит к процедурам упоря¬
дочения без удаления строк, которые требуют большего времени выполнения.
В нижеследующей таблице приведены расшифровки ключей для параметров и их
значений по умолчанию и в "строгом смысле".
Параметр
Ключ
Значения
no умолчанию
в "строгом смысле"
values(1)
'spumoni'
0
0
values(2)
'thr rel'
l.i
1
values(3)
'thr abs
1
0
values(4)
'exact—d'
0
1
values(5)
’supernd'
3
1
values(6)
'rreduce'
3
1
values(7)
'wh frac'
0.5
0.5
values(8)
' autornmd ’
1
1
values(9)
’autoamd'
1
1
values(10)
'piv tol'
0.1
0.1
values(11)
’bandden'
0.5
0.5
При этом ключи имеют следующие предназначения:
Ключи
Предназначение
'spumoni'
Флаг монитора SParse MONItor:
0 - не выводит диагностических сообщений, по умолчанию;
1 - выводит информацию, о выбранном алгоритме;
2 - выводит детальную информацию о работе алгоритмов упорядочения
'thr.rel'
'thr_abs'
Порог минимальной разреженности
thr rel *mindegree+thr abs
'exact—d'
0 - использование приближенных значений разреженности;
тЮ - использование точных значений разреженности
'supernd'
Целое > 1 - объединение узлов каждые supernd шагов
'rreduce'
Целое > 1 - удаление строк каждые rreduce шагов
'wh_frac'
Строки с коэффициентом заполнения, превышающим wh frac, не учитыва¬
ются (процедура colmmd)
'autornmd'
Ф 0 - в процедурах \ и / использовать MMD-упорядочения
'autoamd'
Ф 0 - в процедурах \ и / использовать упорядочение colamd
'piv_tol'
Параметр для порога выбора главного элемента при использовании пакета
UMFPACK
'bandden'
Плотность ленты для ленточных матриц и при применении пакета LAPACK.
По умолчанию 0.5
Замечания:
Решатели \ и /, основанные на разложении Холецкого, используют при работе
с симметрическими положительно определенными матрицами процедуру symmmd [47].
612
В. Г. Потемкин. Вычисления в среде MATLAB
Решатели \ и /, основанные на LU-разложении, используют при работе с произ¬
вольными квадратными матрицами процедуру colamd (пакет UMFPACK) [39].
Решатели \ и /, основанные на QR-разложении, используют при работе с прямо¬
угольными матрицами процедуру colmmd.
Примеры:
Ниже приведены примеры выполнения вспомогательных операций и дан перевод
сообщений системы.
spparms('default1)
No sparse monitor output.
mmd: threshold = 1.l*mindegree+l
using approximate degrees in A'*A,
supemode amalgamation every 3 stages,
row reduction every 3 stages,
withhold rows at least 50% dense in colmmd.
Minimum degree orderings used by \ and /.
Residual scale parameter:
0.001*max(abs(A)).
Монитор SParse MONItor не формирует
выходных данных
mmd: threshold = 1.l*mindegree+l
порог для приближеннего упорядочения
при работе с матрицей А'*А,
объединение узлов - каждые 3 шага,
редукция строк - каждые 3 шага;
сохранять строки с разреженностью
не менее 50 %.
Для операций \ и / применять MD-упоря-
дочения.
Параметр невязки:
0.001*max(abs(А)).
[keys, values] = spparms
keys = values =
spumoni
0
thr_rel
1.1
thr_abs
1
exact—d
0
supernd
3
rreduce
3
wh_frac
0.5
autommd
1
autoamd
1
piv_tol
0.1
bandden
0.5
Сопутствующие функции'. \, CHOL, COLAMD, COLMMD, SYMMMD.
SYMBFACT ~|
Характеристики разложения Холецкого
Синтаксис:
count = symbfact(A)
count = symbfact(A,'col')
count = symbfact(A,'sym')
[countzhzparentzpostzR] = symbfact(...)
6. Работа с разреженными матрицами
613
Описание:
Функция count = symbfact(A) вычисляет количество элементов в строках верхнего
треугольного множителя разложения Холецкого исходной симметрической матрицы
А. Эта функция выполняется значительно быстрее, чем chol(A).
Функция count = symbfact(A, ’соГ) анализирует матрицу А'*А, не формируя ее в яв¬
ном виде.
Функция count = symbfact(A, 'sym') аналогична процедуре count = symbfact(A).
Функция [count, h, p, q, R] = symbfact(A, f) возвращает несколько дополнительных
выходных параметров:
• h - высоту графа;
• р - параметры графа;
• q - вектор перестановки столбцов;
• R - матрицу связности, соответствующую множителю chol(A).
Пример:
Рассмотрим матрицу А следующего вида:
А =
[4 0
0 1;
0 1 0 0; 0 0 1 0; 1 0 0 1]
А =
4
0
0 1
0
1
0 0
0
0
1 0
1
0
0 1
Эта симметрическая положительно определенная матрица, и применение функции
chol(A) дает следующий результат:
L = chol(А)
L =
2 О
О 1
О О
О О
О 0.5
0 0
1 0
0 0.86603
Применение функции symbfact(A) вычисляет количество элементов в строках мат¬
рицы L.
с = symbfact(A)
с = 2 1 1 1
Если к матрице А применить алгоритм симметрической упорядоченности, то нену¬
левые элементы в разложении Холецкого будут концентрироваться вблизи диагонали.
Рассмотрим последовательность процедур.
г
L
L
= symmmd(А);
= chol(А(г,г)),с =
symbfact(A(r,r))
с
1
0
0
о
1
о
1
о
о
1
0
0
2
0
2
0
0
0.5
0.86603
1
614
В. Г. Потемкин. Вычисления в среде MATLAB
Обращение вида [count, h, р, q, R] = symbfact(A) вычисляет параметры для построе¬
ния графа матрицы. Следующая последовательность операторов позволяет построить
граф с пронумерованными вершинами.
[xzy] = treelayout (pzq);
gplot(Az[x' у1]/’bo1)/hold on
gplot(A,[x1 y1],’r’)
for j=l:size(A,1)
text(x(j)+0.02zу(j)+0.02/int2str(j))
end % рис. 6.36
рис. 6.36
<
р4
о2
63
(
Сопутствующие функции’. CHOL, ETREE, TREELAYOUT.
SPAUGMENT~~|
Формирование расширенной матрицы для метода
наименьших квадратов
Синтаксис:
S = spaugment(А)
S = spaugment(А,с)
Описание:
Функции S = spaugment(A) и S = spaugment(A, с) формируют разреженную квад¬
ратную симметрическую матрицу следующей блочной структуры:
S = [с*1 А; А' 0].
6. Работа с разреженными матрицами
615
Такая расширенная матрица используется для минимизации квадратичной формы
min IIЬ-Ах ||.
Если г = b - Ах выполняет роль невязки, ас- масштабирующий множитель,
то применение метода наименьших квадратов сводится к решению следующей СЛАУ:
cl
А
г/С
Гь'
_А(с)
0
X
0
Если исходная матрица А имеет размер m х п, то расширенная матрица S имеет
размер (т + п) х (т + п). В обозначениях системы MATLAB эту систему можно опи¬
сать так:
S*[r/с; х] = [b; z],
где z = zeros(n, 1).
Определение оптимального масштабного множителя с основано на вычислении
значений min(svd(A)) и norm(r), что требует больших объемов расчетов. Если значение
с не указано явно в виде второго параметра, то по умолчанию применяется значение
max(abs(A)))/1000.
Операция решения систем линейных уравнений х = А\Ь автоматически формирует
расширенную матрицу, определяя значение с по умолчанию.
Замечание:
В предшествующих версиях системы MATLAB расширенная матрица использова¬
лась решателями \ и / и разреженных СЛАУ в случае прямоугольных матриц. Теперь
вместо этого применяется решение проблемы наименьших квадратов на основе QR-
разложения [81].
Пример:
' Рассмотрим простую систему из трех уравнений с двумя неизвестными
х, + 2х2 = 5;
• Зх. =6;
4х2 =7.
Поскольку эта система небольших размеров, она может быть решена
с использованием обычных конструкций системы MATLAB, в данном случае - пол¬
ных матриц.
А = [1 2; 3 0; 0 4] ;
b = [567]’;
х = А\Ь
х =
1.9592
1.7041
Это решение по методу наименьших квадратов.
616
В. Г. Потемкин. Вычисления в среде MATLAB
Подход на основе расширенной матрицы использует функцию spaugment:
S = spaugment(А, 1);
в этом случае формируется вспомогательная расширенная матрица следующего вида:
full(S)
ans =
1
0
0
1
2
0
1
0
3
0
0
0
1
0
.4
1
3
0
0
0
2
0
4
0
0
В этом примере использовано значение масштабного множителя с = 1 и для удоб¬
ства чтения распечатана полная матрица S. Даже в этом простом примере более поло¬
вины элементов матрицы S равны нулю.
Вспомогательная система использует также расширенный вектор для правой части,
который формируется в виде
У = [Ь; 0; 0];
в результате решение вычисляется с помощью решателя линейных уравнений
z = S\y;
z =
-0.36735
0.12245
0.18367
1.9592
1.7041
Здесь первые 3 компонента характеризуют вектор невязки г, а последние 2 - опре¬
деляют решение х, которое совпадает с приведенным выше.
Сопутствующая функция - SPPARMS.
DELSQ | Формирование конечно-разностной аппроксимации лапласиана
Синтаксис:
L = delsq(G)
Описание:
Функция L = delsq(G) формирует разреженную матрицу, соответствующую пяти¬
точечной конечно-разностной аппроксимации лапласиана на сетке G, которая может
быть сформирована с помощью функции numgrid.
Сопутствующие функции'. DELSQ, NUMGRID.
NUMGRID | Формирование двумерных сеток
Синтаксис:
G = numgrid('R',п)
6. Работа с разреженными матрицами
617
Описание:
Функция G = numgrid(’R', п) задает точки двумерной сетки размера пхп, располо¬
женной в области {-1 < х < 1, -1 < у < 1}, геометрия которой определяется символом
’R’, который может принимать следующие значения:
Тип области
Описание области
’S'
Квадратная область
' L'
L-подобная область, составляющая 3/4 полного квадрата
•с
С-подобная область, составляющая 1/4 полного квадрата
' D'
Круг единичного радиуса
'А'
Диск
' H'
Сердцеподобная кардиоида
'В'
Область с вырезом в виде бабочки
•N'
Квадратная область с ячеистым разбиением
Функция spy(numgrid(’R', п)) позволяет отобразить на графике вид этой области.
Функция delsq(numgrid(’R', п)) генерирует пятиточечную конечно-разностную ап¬
проксимацию лапласиана на заданной сетке.
Пример:
Построим набор описанных выше областей для сетки размера 25x25 (рис. 6.37).
п = 25;
figure(1)
subplot(1,2,1),spy(numgrid('S',n))
subplot (1,2,2), spy (numgrid (’L*,n))
figure(2)
subplot(1,2,1),spy(numgrid('C1,n))
subplot(1,2,2),spy(numgrid('D1 ,n))
figure(3)
subplot (1,2,1), spy (numgrid ('A' ,n))
subplot(1,2,2),spy(numgrid(1H1,n))
figure(4)
subplot(1,2,1),spy(numgrid(*B1 ,n))
subplot (1,2,2), spy (numgrid( ’N' ,n))
618
В. Г. Потемкин. Вычисления в среде MATLAB
1
о
5
10
15
20
25
О
V
:::::::::::::::::::::::
♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦
:::::::::::::::::::::::
♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦
♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦
:::::::::::::::::::::::
:::::::::::
:::::::::::
:::::::::::
ю
nz = 385
20
о
■с*
а
5
10
15
20
25
0
♦♦♦♦♦♦♦♦♦
:::::::::::::::::::::::
5
44444444444444444444444
44444444444444444444444
44444444444444444444444
10
444444444444444444444
:::::::::::::::::::::::
44444444444444444444444
44444444444444444444444
44444444444444444444444
44444444444444444444444
44444444444444444444444
"ЧШШШШШ
15
44444444444444444444444
4444Ф4444444444
20
♦•♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦*
♦♦♦♦♦♦♦♦«♦♦♦
444444444444
444444444444
"ШШШШГ
444444444444
25
444444444
] 10 20
С
) 10 20
nz = 431
б
nz = 437
’А'
1
л
Н
5
5
10
10
15
15
20
20
25
25
О
10
nz = 292
20
О
10
nz = 230
20
в
/
0
1\|’
5
♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦
♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦
♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦
♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦
♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦
♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦
♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦
♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦
♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦
♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦
10
15
20
♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦
♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦
♦♦♦♦♦♦♦♦♦«♦♦♦♦♦♦♦♦♦♦о
♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦
♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦
25
С
1 10 20
nz = 529
г
рис. 6.37
Сопутствующая функция - DELSQ.
6; Работа с разреженными матрицами
619
Приложение 1. Код М-функции dec2binvec
function out = dec2binvec(dec,n)
% DEC2BINVEC Преобразовать десятичное число в логический вектор
% двоичного кода.
%
% DEC2BINVEC(D) возвращает двоичное представление целого числа D
% в виде логического вектора. Младший бит соответствует первому
% столбцу.
%
% DEC2BINVEC(D,N) возвращает двоичное представление по меньшей мере
% с N значащими битами.
%
% Пример:
% dec2binvec(23) возвращает двоичный код [1 1 1 0 1]
%
% Сопутствующие функции: BINVEC2DEC, DEC2BIN.
%
% МР 11-11-98
% Copyright 1998-2002 The MathWorks, Inc.
% $Revision: 1.5 $ $Date: 2002/03/25 15:57:23 $
% Ошибка, если аргумент dec не задан.
if nargin < 1
error('D должно быть определено. Введите ’'daqhelp dec2binvec'',
чтобы получить больше информации.’);
end
% Ошибка, если аргумент dec не имеет тип double.
if ~isa(dec, 'double')
error('D должно иметь тип double.');
end
% Error if a negative number is passed in.
if (dec < 0)
error('D должно быть положительным.');
end
% Получить строковое представление двоичного кода для десятичного
числа
switch nargin
case 1
out = dec2bin(dec);
case 2
out = dec2bin(dec,n);
end
% Преобразовать двоичную строку в логический вектор
out = logical(str2num([fliplr(out)/blanks(length(out))]')') ;
620
Приложение 2. Текстовый редактор Editor
Редактор Editor системы MATLAB позволяет выполнять редактирование любых
текстовых файлов в режиме графического интерфейса. В ОС Microsoft Windows этот
редактор можно запускать вне системы MATLAB в качестве независимо исполняемо¬
го приложения. Запуск редактора можно осуществить либо запуская файл $mat-
labroot/bin/win32/meditor.exe, либо дважды кликнув М-файл системы MATLAB в ка¬
кой-либо папке проводника системы Windows. Количество возможных запусков
программы meditor.exe не ограничено и никак не связано с лицензией на саму систему
MATLAB.
Если редактор функционирует как независимо исполняемое приложение, то он
не связан с системой MATLAB и поэтому нельзя выполнить никаких вычислений, по¬
лучить доступ к справочной системе, поместить редактор на рабочий стол. Он остает¬
ся независимо исполняемым, даже если будет запущена на выполнение система MAT¬
LAB. Однако функции редактирования текста могут быть использованы в полной мере.
При установке системы MATLAB на платформе ОС Windows независимо испол¬
няемое приложение meditor автоматически ассоциируется с файлами, имеющими рас¬
ширение .т. Поэтому, активизируя такой файл, пользователь автоматически открыва¬
ет редактор Editor. К сожалению, такое же расширение имеют файлы системы
Maple V, поэтому следует быть внимательными при установлении ассоциативной свя¬
зи М-файла с редактором, если на компьютере установлена система Maple V.
Выполним запуск редактора Editor из окна запуска программ ОС Windows (рис. П-2.1)
рис. П-2.1
В результате откроется окно независимо исполняемого приложения Editor (рис. П-2.2).
/1ИДИОГИ1И0И
621
|Э> Untitled
Это окно имеет всего 5 опций основного меню и несколько стандартных кнопок
редактирования на инструментальной панели. Для того чтобы активизировать послед¬
ние, необходимо открыть для редактирования некоторый файл. Обратимся к папке
work системы MATLAB (рис. П-2.3).
рис. П-2.3
622
В. Г. Потемкин. Вычисления в среде MATLAB
Здесь имеется возможность открыть файлы системы с различными расширениями.
Откроем М-файл collatz (рис. П-2.4).
рис. П-2.4
Запуск редактора в среде MATLAB. Выполним запуск редактора из среды системы
MATLAB. Это можно сделать из командной строки, из меню File, используя кнопку
инструментальной панели. Мы воспользуемся меню быстрого запуска Super Tray
(рис. П-2.5).
ф MATLAB ►
Toolboxes ►
SiTnulink ►
Blocksets ►
Ml Command History
I Desktop Tools ►!
@ Web ►
Ml Current Directory
Preferences...
-Д Editor
Help
Ml Launch Pad
Demos
ZJPath
I^Start
Ml Workspace
рис. П-2.5
В результате будет открыто окно редактора/отладчика, показанное на рис. П-2.6.
Приложение 2. Текстовый редактор Editor
623
рис. П-2.6
Это окно отличается от окна независимо исполняемого редактора Editor тем, что
основное меню и инструментальная панель расширены дополнительными опциями.
Это обусловлено тем, что в дополнение к функциям редактора добавились функции
отладчика Debugger, который функционирует в среде системы MATLAB.
Поскольку в этом случае редактор/отладчик является неотъемлемой частью систе¬
мы MATLAB, разместим это окно на рабочем столе, используя опцию Dock <имя_М-
файла> меню View (рис. П-2.7).
□ & § ? ®
♦Д MATLAB
. П-2.7
Ln 1 Coll
624
В. Г. Потемкин. Вычисления в среде MATLAB
Именно такой рабочий стол и такую операционную среду мы будем предполагать
при изложении операций с текстовым редактором. Такая операционная среда имеет
свои особенности. В зависимости от того, какое окно рабочего стола является актив¬
ным, включаются соответствующие опции основного меню.
Мы будем предполагать, что активным является окно текстового редактора Editor.
Информация о редактируемом файле размещается в строке сообщений системы и из¬
меняется при переходе от одного редактируемого файла к другому.
Перечислим опции основного меню, относящиеся к управлению текстовым редак¬
тором.
Меню File. Меню File содержит 5 опций, связанных с редактором Editor:
• New - создать новый М-файл;
• Open - открыть М-файл;
• Close <имя_М-файла> - закрыть М-файл;
• Save - сохранить М-файл;
• Save As - сохранить М-файл с новым именем.
Меню Edit. Меню Edit содержит 10 опций, связанных с редактором Editor:
• Cut - вырезать выделенное;
• Сору - скопировать выделенное;
• Paste - вставить содержимое буфера;
• Paste Special - вставить содержимое буфера с помощью мастера импорта;
• Select All - выделить все;
• Delete - удалить выделенное;
• Find and Replace - найти и заменить;
• Find Selection - найти выделенное;
• Go to Line - перейти на строку;
• Set/Cleur Bookmark - установить/удалить закладку.
Меню View. Меню View содержит 1 опцию, связанную с редактором Editor:
• Undock <имя_М-файла> - выгрузить окно редактора с рабочего стола в отдельное
окно.
Меню Text. Меню Text содержит 8 опций, связанных с редактором Editor:
• Evaluate Selection - выполнить выделенное;
• Format Selected Comments - форматировать выделенные комментарии;
• Comment - закомментировать строку;
• Uncomment - снять комментарий со строки;
• Decrease Indent - уменьшить отступ;
• Increase Indent - увеличить отступ;
• Balance Delimiters - выделить текст, помещенный внутри скобок (),[],{};
• Smart Indent - стандартный отступ.
Приложение 2. Текстовый редактор Editor
625
Меню Window. Меню Window содержит 2 опции, связанные с редактором Editor:
• Close All - закрыть все окна редактора Editor;
• <имя_М-файла> - закрыть окно редактора для данного М-файла.
Меню Help. Меню Help содержит 1 опцию, связанную с редактором Editor:
• Using the M-file Editor - открыть в области просмотра обозревателя Help страницу
Editing and Debugging М-Files.
Контекстное меню. Окно текстового редактора Editor, как и все окна рабочего стола,
сопровождается контекстным меню, которое включает следующие опции:
• Evaluate Selection - выполнить выделенное;
• Open Selection - открыть выделенное;
• Help on Selection - дать справку по выделенному;
• Cut - вырезать выделенное;
• Сору - скопировать выделенное;
• Paste - вставить содержимое буфера;
• Format Selected Comments - форматировать выделенные комментарии;
• Comment - закомментировать строку;
• Uncomment - снять комментарий со строки;
• Smart Indent - стандартный отступ
Инструментальная панель. Инструментальная панель текстового редактора Editor
показана на рис. П-2.8.
d & о I х ча a- 1 е I м д I
рис. П-2.8
Иконки редактирования на инструментальной панели имеют следующее назначение:
Иконка
Описание
Di
[New M-file |
Открыть новый М-файл
-Й
| Open file |
Открыть файл
д.
| Save |
Сохранить файл
A
H
Удалить выделенный фрагмент
В
|copy|
Копировать выделенный фрагмент
626
В. Г. Потемкин. Вычисления в среде MATLAB
Иконка
Описание
.а
| Paste |
Вставить выделенный фрагмент
ni
|Undo|
Отменить ввод
|Redo|
Восстановить ввод
sjl
1 Print I
Вывести на печать
|
Find text |
Найти заданный текст
AU
Показать список подфункций данной функции
1
Show function |
Действия, аналогичные применению кнопок инструментальной панели, можно реа¬
лизовать с помощью опций меню File, Edit и контекстного меню.
Создание нового М-файла. Для того чтобы создать в редакторе новый М-файл, сле¬
дует кликнуть либо на кнопке New M-file на инструментальной панели редактора, ли¬
бо на такой же кнопке на инструментальной панели системы, либо выбрать опцию
File -> New -> M-file рабочего стола системы MATLAB. Можно также создать новый
М-файл, используя опцию New -> M-file контекстного меню окна текущего каталога
Current Directory. Если при этом редактор не был открыт, то происходит его открытие
и появляется пустой шаблон; если же он был открыт, то к открытым окнам добавляет¬
ся окно с пустым шаблоном для написания текста программы.
Для этих же целей можно использовать режим команд в окне Command Window.
Команда edit, введенная в текущей командной строке, создает новый М-файл в тексто¬
вом редакторе Editor. Если применяется команда edit <имя_файла>, то появляется сле¬
дующее окно подсказки (рис. П-2.9).
рис. П-2.9
• Если кликнуть на кнопке Yes, то будет создан пустой шаблон с именем файла
и расширением т. Если вы не хотите, чтобы появлялось это окно, а файл создавал¬
ся автоматически, кликните в окне контроля на Do not show this prompt again.
• Если кликнуть на кнопке No, то новый файл создаваться не будет.
Приложение 2. Текстовый редактор Editor
627
Закрытие М-файла. Если при закрытии текущего М-файла он является единствен¬
ным, то закрывается и сам редактор файлов. Если открыто несколько М-файлов,
то следует закрыть каждый из них. Если при закрытии файла в нем не сохранены из¬
менения, появляется следующее окно подсказки (рис. П-2.10).
рис. П-2.10
Если окно редактора/отладчика включено в состав рабочего стола, а именно такую
конфигурацию мы предполагаем при изложении материала этой книги, то закрытие
редактора/отладчика возможно только после закрытия каждого из открытых в нем
файлов.
Редактирование М-файлов
При написании М-файлов следует помнить о некоторых правилах, реализованных
в системе MATLAB, которые касаются использования регистров клавиатуры, ввода
длинных инструкций, подавления вывода результатов вычислений и т. п.
Учет регистра. Прежде всего следует помнить, что система MATLAB различает реги¬
стры клавиатуры. Нельзя вводить имя М-функцииначиная_сзаглавной буквы, все бук-
вы должны быть строчными; в случае имен переменных - это будут разные перемен-
ные. Чтоже касается использования заглавных букв в справках, выводимых в команд¬
ное окно по команде help <имя_М-функции>, то это обусловлено только стремлением
выделить имя функции по отношению к остальному тексту. В данной версии системы
некоторые функции, реализующие интерфейс с языком Java, используют смешанные
регистры, и это отражается в справках по соответствующим М-функциям. Пробелы,
окружающие такие операторы, как не являются обязательными и используются
только для облегчения восприятия.
Последовательность инструкций. Чтобы ввести несколько инструкций в одной стро¬
ке, следует использовать разделитель точка с запятой (;).
Пример:
Построить таблицу логарифмов, записав все инструкции в одной строке
format short; х = (1:10)’; logs = [х loglO(x)].
logs. =
1.0000
0
2.0000
0.3010
3.0000
0.4771
4.0000
0.6021
5.0000
0.6990
6.0000
0.7782
7.0000
0.8451
8.0000
0.9031
9.0000
0.9542
10.0000
1.0000
628
В. Г. Потемкин. Вычисления в среде MATLAB
Многострочные инструкции. Если инструкция не помещается на одной строке, ис¬
пользуйте разделитель чтобы указать, что она имеет продолжение на следующей
строке.
Пример:
Записать оператор формирования числовой последовательности, используя 2 строки.
s = 1 — 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + 1/7 ...
- 1/8 + 1/9 - 1/10 + 1/11 - 1/12;
При переносе строковых выражений в одинарных кавычках последние должны
быть использованы в каждой строке. Максимальное количество символов в одной
строке ограничено значением 4096.
Пример:
Сформировать перечень заголовков таблицы.
['Author Last Name Author First Name1 ...
1 Author Middle Initial1] *
ans = Author Last Name Author First Name Author Middle
Initial
Подавление вывода результата. Для того чтобы предотвратить вывод результатов
вычисления отдельной инструкции, следует завершать ее разделителем (;). Если не¬
сколько графических команд использовано в одной строке, то в качестве разделителя
можно употребить запятую (,).
Оформление М-файлов
Выделение цветом. При вводе символьных конструкций, служебных слов if, else for,
end и т. п. для удобства зрительного восприятия они выделяются цветом.
Отступы. Операторы управления потоком - условия, цикла и др. - для удобства вос¬
приятия выделяются отступами. Для этого предназначены опции Decrease Indent, In¬
crease Indent, Smart Indent меню Text. Последняя опция также доступна из контекст¬
ного меню в окне редактора/отладчика.
Ввод комментариев. Знаком комментария является символ %. Он может быть приме¬
нен для всей строки в целом или для ее заключительной части. Для того чтобы заком¬
ментировать одну или несколько строк М-файла, необходимо, прежде всего, выделить
такие фрагменты. Для выделения отдельной строки необходимо кликнуть левой кноп¬
кой мыши слева от нее; для выделения нескольких последовательных строк следует
либо, не отпуская кнопки мыши, переместиться на нужное количество строк вверх или
вниз, либо использовать для этих целей быструю клавишу Shift, чтобы отметить тре¬
буемые строки, даже если они не являются последовательными.
Для того чтобы закомментировать или раскомментировать строку или группу
строк, можно использовать опции Comment и Uncomment меню Text или контекстно¬
го меню редактора.
Проверка соответствия скобок. Если поместить курсор внутри скобок (), [ ] или { }
и выбрать опцию Balance Delimiters меню Text, то все символы между соответст¬
вующими скобками окажутся подсвеченными, как это показано в следующих строках.
Приложение 2. Текстовый редактор Editor
629
[L2,U2] = luinc(A,|10A(k(i)));
Text —> Balance Delimiters
[L2,U2] = luinc(A,1СГ (k(i))) ;
Перемещение по тексту М-файла
Переход на строку с указанным номером. Номера строк М-файла указываются слева
от соответствующей строки (рис. П-2.11).
i = 1; к = -10:1:0;
for j = к
[L,U,P] = luinc(S,10A(к(i)));
nz(i) = nnz(luinc(S,10A(к(i))));
nrm(i) = norm(L*U-P*S,l)/norm(S,l);
x(i) = 10A(k(i));
i = i+1;
end
рис. П-2.11
Для того чтобы перейти на нужную строку, необходимо применить опцию Go to
Line меню Edit. Появится окно (рис. П-2.12, а) с указанием номера строки текущего
размещения курсора; следует изменить номер строки на требуемый (рис. П-2.12, б)
и нажать клавишу ОК.
рис. П-2.12
Работа с закладками. На произвольных строках М-файла могут быть установлены за¬
кладки для быстрого перехода от одной строки к другой. В частности, это бывает
удобно, когда М-файл очень длинный. Например, если вы работаете с некоторой стро¬
кой, а вам потребовалась другая часть файла, то вам следует заложить закладку на те¬
кущей строке, перейти к другой части М-файла, а затем вернуться назад. Для того что¬
бы установить закладку, необходимо поместить в любом месте этой строки курсор
и выбрать опцию Set Bookmark из меню Edit. Иконка закладки появится в левой час¬
ти текущей строки (рис. П-2.13).
1
2
3
4
5
6
7
8
end
□
1; к = -10:1:0;
j = к
[L,U,P] = luinc(S,10A(к(i)));
nz(i) = nnz(luinc(S,10A(к(i))));
nrm(i) = norm(L*U-P*S,l)/norm(S,l);
x(i) = 10A(k(i));
i = i+1;
рис. П-2.13
630
В. Г. Потемкин. Вычисления в среде MATLAB
Мы видим в тексте 2 закладки; теперь можно переходить от одной закладки
к другой, используя опции Next Bookmark и Previous Bookmark из меню Edit.
Для того чтобы удалить закладку, необходимо поместить в любом месте этой стро¬
ки курсор и выбрать опцию Clear Bookmark из меню Edit. При закрытии М-файла за¬
кладки не сохраняются.
Переход к строкам подфункции. Для того чтобы внутри М-файла перейти к его под¬
функциям ? необходимо на инструментальной панели выбрать кнопку и клик¬
нуть на ней. Из списка появившихся функций выбрать нужную (рис. П-2.14). Всплы¬
вающий список не включает внешних функций, вызываемых из М-файла, а только те,
которые являются подфункциями.
D
1
2
3
4
5
-
6
-
7
8
9
10
11
12
-
13
-
14
-
15
function у = variance(x)
% Вычислить несмещенную оценку
% по следователь-нести чисел :<
mu = sum(х)/length(х);
tot = sqsum(x,mu);
у = tot/(length (x)-1);
variance
sqsum
function tot = sqsum(x,mu)
3 Вычислить суиму квадратов элементов
zi центрированной последовательности
tot = О,
for i =
tot
end
1:length(x)
= tot + ((x (i)-mu)A2);
рис. П-2.14
Найти выделенный текст. Если в текущем М-файле выделить некоторый фрагмент
строки, то с помощью опции Find Selection меню Edit можно найти и другие вхожде¬
ния этого фрагмента в тексте файла. Как только такое вхождение найдено, оно выде¬
ляется. Используя опцию Find Selection, можно найти следующее вхождение и т. д.
Чтобы найти предшествующее вхождение, следует воспользоваться быстрыми кла¬
вишами Ctrl+Shift+F3.
Поиск и замена строки. В системе версии MATLAB 6 можно выполнять поиск за¬
данных фрагментов как в одном, так и сразу в нескольких М-файлах. При работе с ре¬
дактором Editor достаточно на инструментальной панели редактора выбрать кнопку
I м
Find text либо опцию Find and Replace меню Edit (рис. П-2.15).
рис. П-2.15
Приложение 2. Текстовый редактор Editor
631
Теперь в поле Find what следует ввести фрагмент для поиска, а в поле Replace
with - фрагмент для замены; в окне списка Look in выбрать конкретный файл или ка¬
талог для поиска вхождений фрагмента; ограничить поиск с помощью окон контроля
Match case, Whole word или Wrap around.
Ситуация будет несколько иной, если поиск ведется во всех М-файлах некоторого
каталога, в данном случае текущего (рис. П-2.16).
рис. П-2.16
В этом случае окно контроля Wrap around заменяется на окно Subdirectories. Ес¬
ли теперь активировать поиск с помощью кнопки Find, то окно Find (рис. П-2.16) рас¬
ширится и примет вид, показанный на рис. П-2.17.
xj
Find what
Replace with.
Look in: jEditor-Current File s Directory
F Match case F Whole word F Subdirectories Close |
60 matches of"length" in 18 files.
Directories searched:[c:\MATLAB6p5\work
Find: length
рис. П-2.17
632
В. Г. Потемкин. Вычисления в среде MATLAB
Анализируя полученный результат, можно сделать следующий вывод: фрагмент
length встречается 60 раз в 18 М-файлах, размещенных в каталоге C:\MAT-
LAB6p5\work.
Теперь можно, открыть любой М-файл этого каталога либо дважды кликнув левой
кнопкой мыши, либо кликнув правой кнопкой мыши и выбрав опцию Open контекст¬
ного меню.
Запуск М-файлов на выполнение. Если редактируемый М-файл является сценарием
и, как следствие, не требует входных аргументов, то его можно запустить на выполне-
|Г?|
ние либо с помощью кнопки Run fLJ инструментальной панели редактора, либо
с помощью опции Run из меню Debug рабочего стола. Следует заметить, что если
в М-файл вносились изменения и он не был после этого сохранен, то при запуске на
выполнение эти изменения автоматически учитываются. Если запуск несохраненного
М-файла выполняется из меню Debug, то опция Run заменяется на Save and Run.
Распечатка М-файла. Для того чтобы распечатать текст М-файла, можно либо при-
менить кнопку Print инструментальной панели редактора, либо воспользоваться
опцией Print из меню File рабочего стола.
Настройка параметров редактора Editor
Оглавление настроек редактора Editor содержит 4 пункта: Font&Colors, Display,
Keyboard&Indenting и Autosave. На рис. П-2.18 показано окно установки общих на¬
строек обозревателя Editor/Debugger Preferences.
рис. П-2.18
Приложение 2. Текстовый редактор Editor
633
Поле Editor позволяет установить тип применяемого редактора. Мы будем рас¬
сматривать случай, когда установлен встроенный редактор/отладчик MATLAB editor.
Поле Most recently used file list позволяет указать в окне списка Number of entries
количество имен М-файлов, которые отражаются в нижней области меню File; в дан¬
ном случае эта установка равна 4.
Поле M-file comment formatting предназначено для того, чтобы задать максималь¬
ное количество символов в строке комментария, если используется опция автоматиче¬
ской свертки строки Autowrap comments.
Окно контроля Automatically open files when debugging, которое по умолчанию
выделено, предназначено для того, чтобы при запуске М-файлов, содержащих кон¬
трольные точки, редактор/отладчик открывался автоматически.
Окно контроля On restart open files from previous MATLAB session предназначено
для того, чтобы при последующем запуске системы MATLAB в окне редакто-
ра/отладчика были открыты те же М-файлы, которые использовались в предыдущем
сеансе работы.
На рис. П-2.19 показано окно настройки шрифтов и цвета для редактора/отладчика.
рис. П-2.19
Поле Font позволяет установить шрифт, который будет применяться в редакторе.
Если установлена кнопка выбора Use desktop font, то применяется шрифт рабочего
стола. Если пользователь желает употребить другой шрифт, необходимо сделать ак¬
тивной кнопку выбора Use custom font.
Поле Colors позволяет установить цвета, которые будут применяться для символов
текста Text color, для цвета фона Background color, а также цвета для выделения син¬
таксических особенностей вводимого текста Syntax highlighting.
634
В. Г. Потемкин. Вычисления в среде MATLAB
На рис. П-2.20 показано окно настройки самого окна редактора/отладчика.
рис. П-2.20
Поле Opening files in editor определяет способ открытия М-файлов при запуске
редактора/отладчика. Если выбрана кнопка Single window contains all files (tabbed
style), то все редактируемые М-файлы размещаются в одном окне (рис. П-2.21) с пе¬
речнем их кнопок вызова в нижней части окна. Простое нажатие такой кнопки позво¬
ляет переходить от одного редактируемого М-файла к другому.
рис. П-2.21
Приложение 2. Текстовый редактор Editor
635
Если выбрана кнопка Each file is displayed in its own window, то редактируемые M-
файлы размещаются каждый в своем окне. При выбранном в этой книге способе фор¬
мирования рабочего стола системы MATLAB первый способ открытия М-файлов
в одном представляется предпочтительным.
Поле Display определяет стиль оформления окна редактора/отладчика. Кнопка вы¬
бора Show toolbar управляет выводом в окно инструментальной панели; кнопка выбо¬
ра Show line numbers управляет нумерацией строк; кнопка выбора Enable datatips
in edit mode позволяет просматривать значения вычисленных переменных в режиме
редактирования.
Поле Prompt управляет появлением окна подсказки, когда при вводе команды edit
<имя_файла> оказывается, что такого файла не существует. В этом окне пользователю
предлагается создать файл (рис. П-2.22); здесь же пользователь может отменить вывод
этой подсказки в дальнейшем.
MATLAB Editor
Xj
File rr.m does not exist. Do you wantto create it?
Г Do not showthis prompt again.
Г Yes ~~] No |
рис. П-2.22
Последующее восстановление вывода подсказки возможно с помощью кнопки кон¬
троля Show dialog prompt when editing files that do not exist (рис. П-2.20) окна Edi-
tor/Debugger Display Preferences.
На рис. П-2.23 показано окно настройки Keyboard and Indenting Preferences.
рис. П-2.23
636
В. Г. Потемкин. Вычисления в среде MATLAB
Это окно во многом схоже с окном настроек Keyboard and Indenting Preferences
командного окна Command Window.
Поле M-file indenting for Enter key позволяет установить стиль применения отсту¬
пов при наборе текстов программ в редакторе. Возможен выбор одного из трех стилей:
No indent - все строки вводятся без отступа; управление отступом можно выпол¬
нить вручную;
Block indent - повторяется отступ, установленный вручную в предыдущей строке;
Smart indent - отступы устанавливаются автоматически так, чтобы обеспечить
наибольшие удобства для чтения программы. На рис. П-2.23 выбрана именно эта оп¬
ция, и мы рекомендуем ее к установке.
Поле Key bindings позволяет выбрать стиль работы с быстрыми клавишами в зави¬
симости от используемого типа редактора, предназначенного либо для работы в среде
ОС Windows - опция Windows, либо в среде ОС Unix - опция Emacs.
Поле Tabs and indents позволяет задать размеры отступов и табуляции. Опция Tab
size задает количество пробелов при применении клавиши табуляции Tab. Если эта
опция изменяется, автоматически изменяется табуляция строк редактируемого М-
файла, но только при условии, что не включена кнопка выбора Tab key inserts spaces.
Если вы предпочитаете управлять табуляцией вручную, включите кнопку выбора Tab
key inserts spaces.
Опция Indent size задает размер отступа в режиме Smart indent.
Кнопка выбора Emacs style Tab key smart indenting устанавливает режим, анало¬
гичный Smart indent при работе с редакторами среды Unix.
Поле Parentheses Matching содержит набор настроек, которые позволяют фикси¬
ровать несоответствия открывающих и закрывающих скобок в двух режимах: при на¬
боре текста - опция Match parentheses while typing - и при нажатии стрелочных кла¬
виш - опция Match parentheses on arrow key movement.
Остановимся только на установлении опций при контроле соответствия скобок при
вводе текста программы Match parentheses while typing (рис. П-2.24).
При фиксации соответствия (опция Show match with) можно установить один
из следующих способов фиксации ввода открывающей и закрывающей скобок
(рис. П-2.24, а):
Balance - выражение в скобках выделяется вертикальными разделителями;
Underline - обе скобки подчеркиваются;
Highlight - обе скобки выделяются цветом;
Bold - обе скобки выделяются полужирным шрифтом.
При фиксации несоответствия скобок возможен выбор следующих предупрежде¬
ний (рис. П-2.24, б):
Веер - выдача звукового сигнала;
Strikethrough - перечеркивание вводимого символа;
Gray - выделение вводимого символа серым цветом;
None - отсутствие реакции.
Приложение 2. Текстовый редактор Editor
637
г Parentheses matching
I*7 Match parentheses while typing
{[Highlight
Show match with:
Show mismatch with:
Balance
.Underline
Г Match parentheses onMIffiMtfflffl
■fit
□i
Cancel Af
Help
рис. П-2.24
На рис. П-2.25 показано окно настройки Editor/Debugger Autosave Preferences.
рис. П-2.25
В этом окне устанавливается возможность автоматического сохранения редакти¬
руемой программы, если включена кнопка выбора Autosave on. Следующие ниже поля
позволяют установить требуемые параметры сохранения.
Поле Save options содержит следующие опции:
Save every n minutes. Установить интервал сохранения М-файла в минутах.
Save untitled files. При включении этой кнопки выбора файл, которому не присвоено
имя, будет автоматически сохраняться под именем Untitled.asv. Если такое имя уже
присвоено, то будут присваиваться нумерованные имена Untitled2.asv, Untitled3.asv
ит. д.
638
В. Г. Потемкин. Вычисления в среде MATLAB
Поле Filename позволяет установить расширение для сохраняемого М-файла и со¬
держит следующие опции:
SavReplace extension with. Ввести желаемое расширение для сохраняемого М-файла.
По умолчанию в среде ОС Windows выбрано расширение asv (сокращение от
autosave).
Append filename with. Добавить к имени файла символ ~ Эта опция включена только
в том случае, если пользователь устанавливает свое расширение.
Поле Location указывает место размещения сохраняемых файлов и включает сле¬
дующие опции:
Source file directories. Эта опция устанавливается по умолчанию и означает, что фай¬
лы сохраняются в той же папке, где находится источник.
Single directory. Пользователь может указать специальную папку для сохранения соз¬
даваемых М-файлов.
Командный режим работы с редактором поддерживается оператором edit.
EDIT | Построение дерева матрицы
Синтаксис:
Графический режим:
опции New или Open меню File
Режим командной строки:
edit
edit fun.m
edit file.ext
edit funl fun2 fun3 ...
edit class/fun
edit private/fun
edit class/private/fun
Описание:
Команда edit открывает окно редактора Editor.
Команда edit fun.m открывает редактор и М-файл с именем fun в окне редактора.
Имя fun может быть частичным или полным путем доступа. Если М-файл с таким
именем отсутствует, появляется окно подсказки, предлагающее создать файл с таким
именем.
Команда edit file.ext открывает файл с указанным расширением.
Команда edit funl fun2 fun3 ... позволяет открыть сразу несколько файлов в вы¬
бранном текстовом редакторе.
Команды edit class/fun, edit private/fun, edit class/private/fun можно применять для
редактирования метода, частной функции или частного метода для данного класса.
Сопутствующие функции'. OPEN, TYPE.
Приложение 2. Текстовый редактор Editor
639
Приложение 3. Класс объектов polynom
В системе MATLAB, которая ориентирована на алгебраические операции, такой
класс объектов крайне необходим. Конечно, полином от одной переменной - это про¬
сто вектор его коэффициентов, но уже произведение двух полиномов - это достаточно
сложная конструкция, не говоря уже о делении полиномов. Первый шаг при построе¬
нии класса объектов polynom - это выбор структуры данных.
Структура объекта. Для класса polynom соответствующий полиномиальный объект
можно описать в виде вектор-строки, содержащей коэффициенты степеней перемен¬
ной в убывающем порядке. Так что объект р, принадлежащий к классу polynom, - это
структура с единственным полем р.с, которое содержит коэффициенты полинома.
Каталог класса. М-файлы, определяющие методы обработки объектов класса
polynom, объединяются в каталог класса с именем @ polynom, который обязательно
является подкаталогом некоторого каталога, описанного в пути доступа системы
MATLAB, но не самим каталогом. При работе каталог класса никогда не должен быть
текущим.
Конструктор класса. Конструктором класса polynom является М-файл с именем
polynom.m, который создает объекты класса polynom и приписывает им метку класса.
Создадим в каталоге work подкаталог @polynom и разместим в нем конструктор
полиномов polynom.m.
function р = polynom(v)
% POLYNOM Конструктор полиномов.
% Функция р = polynom(v) формирует полином, используя
% вектор v, содержащий коэффициенты степеней переменной х,
% расположенные в убывающем порядке.
if nargin == О
р.с = [ ];
• р = class(р,’polynom’);
elseif isa(vz 'polynom')
P = v;
else
p. c = v ( : ) . ' ;
p = class(p,'polynom');
end
Система MATLAB позволяет вызывать конструктор, не указывая входных аргу¬
ментов. В этом случае конструктор создает шаблон объекта, как правило, с пустыми
полями. Также возможно, что конструктор будет вызываться с аргументом входа, ко¬
торый уже является объектом данного класса. В этом случае конструктор обычно воз¬
вращает входной аргумент. Функция isa позволяет проверить принадлежность объекта
к классу. Если аргумент входа существует и не принадлежит к классу polynom, то он
640
переформируется так, чтобы быть вектор-строкой и присваивается полю .с результата.
И наконец, функция class приписывает созданный объект к классу polynom.
При работе с полиномами полезно иметь объект х, который представляет собой
независимую переменную х. Это реализуется оператором
х = polynom([1 0])
х =
polynom object: 1-by-l
Теперь необходимо определить методы для работы с объектами класса polynom.
Методы для класса polynom. Для того чтобы класс объектов вписывался в среду сис¬
темы MATLAB и выполнял свое функциональное назначение, для него должны быть
предусмотрены следующие методы:
• преобразование полиномов в класс double;
• преобразование полиномов в класс char;
• метод вывода на терминал display;
• метод обработки индексных ссылок subsref;
• переопределение арифметических операций +, -, * и Л;
• переопределение М-функций polyval, diff, roots, plot.
Преобразование класса. Для обеспечения интерфейса между типами данных нового
класса и традиционными типами данных необходимо предусмотреть преобразование
первых во вторые. Наиболее важными в системе MATLAB являются типы данных
массива чисел с удвоенной точностью double и массива символов char.
Для класса объектов polynom функция преобразования в класс double - это очень
простой М-файл @polynom/double.m, который восстанавливает вектор коэффициентов:
function с = double(р)
% POLYNOM/DOUBLE
% Преобразование объекта polynom в вектор коэффициентов.
% .Функция с = DOUBLE(р) преобразовывает объект polynom
% в вектор сг содержащий коэффициенты полинома по степеням
% переменной х в убывающем порядке.
с = р. с ;
Преобразование в класс char формирует строку символов, состоящую из степеней
независимой переменной х. Фактически, как только переменной х присвоено значение,
строка становится синтаксически правильным выражением системы MATLAB.
М-файл @polynom/char.m имеет следующий вид:
function s = char(p)
% POLYNOM/CHAR CHAR(p) формирует строковое представление
% для полинома р.
с = р. с ;
if all(c == 0)
s = 'О';
Приложение 3. Класс объектов polynom 641
21 т. Зак. 3375
else
d = length(p.с)-1;
s = [ ] ;
for a = c;
if a ~= 0;
if -isempty(s)
if а >
0
s =
[s ’ + ’];
else
s =
[s ’ - ’] ;
а =
-a;
end
end
if a ~= 1
| d == 0
s = [s
num2str(a)];
if d >
0
s =
[s
end
end
if d >= 2
s = [s
’хЛ' int2str
elseif d =
:= 1
s = [s
' x' ] ;
end
end
d = d - 1;
end
end
Вывод на терминал. Метод с именем display вызывается всякий раз, когда оказывает¬
ся, что исполняемый оператор не заканчивается точкой с запятой. Для многих классов
метод display может просто выводить на экран имя переменной, а затем использовать
конвертор char, чтобы печатать содержимое или значение переменной. Для этого слу¬
жит метод @polynom/display.m. Тело этой функции может быть без изменения исполь¬
зовано в каталогах других методов.
function display(р)
% POLYNOM/DISPLAY Вывести на экран терминала объект класса polynom.
disp(' ');
disp([inputname(1),' = '])
disp(' ');
disp([’ ' char(p)])
disp(' ');
Полином с индексными ссылками. Допустим, что задание полинома с индексными
ссылками должно приводить к его вычислению для значений каждого индекса. Иными
словами, если задан некоторый полином
р = polynom([l 0 -2 -5]);
642
В. Г. Потемкин. Вычисления в среде MATLAB
то следующая форма с индексной ссылкой должна возвращать значения полинома при
значениях аргумента х, равных 3 и 4:
Р( [3 4])
Соответствующий метод вычисления полинома для нескольких значений аргумен¬
та реализуется с помощью М-функции @polynom/subsref.m, которая имеет следующий
вид:
function b = subsref(a,s)
% SUBSREF
switch s.type
case '()'
ind = s.subs{:};
for k = 1:length(ind)
b(k) = eval(strrepfchar(a),'x',num2str(ind(k))));
end
case '.'
b=a.c;
otherwise
error(’Задать в форме p(x) ’)
end
Это реализация использует преобразование полинома в тип данных char, уже
имеющемуся в составе методов; в дальнейшем используется функция strrep, чтобы
выполнить подстановку всех значений аргумента для вычисления значений полинома.
Переопределение арифметических операций. Каждый встроенный оператор в сис¬
теме MATLAB имеет имя. Поэтому любой оператор может быть переопределен путем
создания М-файла с соответствующим именем в каталоге классов.
Операция сложения полиномов. Если р или q - полиномы, то выражение вида р + q
задает вызов метода @polynom/plus.m, если он существует.
В данном случае это М-файл вида:
function г = plus(p, q)
% POLYNOM/PLUS Операция p+q для объектов polynom.
р = polynom(р);
q = polynom(q);
k = length(q.c) - length(p.c);
r = polynom([zeros(1,k) p.c] + [zeros(l,-k) q.c]);
Прежде всего, М-функция метода преобразует оба аргумента входа в класс
polynom. Это гарантирует, что выражения типа р + 1, которые включают как объект
типа polynom, так и объект типа double, будут вычисляться правильно.
Функция затем обращается к двум векторам коэффициентов и в случае необходи¬
мости дополняет один из них нулями, чтобы выравнять их длины. Фактическое сло¬
жение - просто сумма двух векторов коэффициентов, к которой применяется в третий
раз конструктор polynom, чтобы сформировать правильный тип результата.
Приложение 3. Класс объектов polynom
643
Операция вычитания полиномов. Если р или q - полиномы, то выражение вида р - q
задает вызов метода @polynom/minus.m, если он существует.
В данном случае это М-файл вида:
function г = minus(p,q)
% POLYNOM/MINUS Операция p-q для полиномов
р = polynom(p);
q = polynom(q);
к = length(q.c) - length(p.c);
r = polynom([zeros(1,k) p.c] - [zeros(l,-k) q.c]);
Операция умножения полиномов. Если р или q - полиномы, то выражение вида p*q
задает вызов метода @polynom/mtimes.m, если он существует. Метод @poly-
nom/mtimes.m вычисляет произведение полиномов p*q. Буква ш в начале имени функ¬
ции обусловлена тем, что это есть переопределение функции умножения матриц. Ум¬
ножение двух полиномов сводится к операции свертки векторов коэффициентов:
function г = mtimes(p, q)
% POLYNOM/MTIMES Операция p*q умножения полиномов
р = polynom (р) ;
q = polynom(q);
г = polynom(conv(p.c, q.c));
Операция деления полиномов. Если р или q - два полинома, то М-функция
@polynom/poldiv.m реализует деление полиномов в соответствии с функцией deconv,
которая вычисляет целую часть и остаток при делении двух полиномов от одной пере¬
менной:
function [q,r] = poldiv(p,q)
% POLYNOM/POLDIV Операция p(x)/q(x) деления полиномов
p = polynom (p) ;
q = polynom (q) ;
[q/Г] = deconv(p.c,q.c);
q. = polynom (q) ;
r = polynom(r);
Операция возведения полиномов в степень. Если р или q - полиномы, то выражение
вида рлк задает вызов метода @polynom/mpowers.m, если он существует. Возведение
полинома в степень сводится к операции многократного умножения полиномов:
function г = mpower(p,k)
% POLYNOM/MTIMES Операция рЛк возведения полиномов в степень
р = polynom(р);
q =Р;
for j=l:k-l
p=mtimes (р, q) ;
end
г = p;
644
В. Г. Потемкин. Вычисления в среде MATLAB
Переопределение функций. Для объектов класса polynom включим в состав методов
следующие М-функции: polyval, diff, roots, plot.
Функция polyval. Эта функция вычисляет значение полинома для заданного множе¬
ства точек. В данном случае это будет метод @polynom/polyval.m, который основан на
методе Горнера.
function у = polyval(р,Х)
% POLYNOM/POLYVAL POLYVAL(р,х) вычисляет значение полинома р
% в точках массива X.
у = zeros(size(X));
for а = р.с
у = у.*Х + а;
end
Функция diff. Эта функция вычисляет производную полинома по его аргументу.
Соответствующий метод @polynom/diff.m реализуется следующим образом:
function q = diff(p)
% POLYNOM/DIFF
% Функция DIFF(p) - производная полинома р.
с = р.с;
d = length(с) - 1; % степень полинома
q = polynom(p.c(l:d).*(d:-l:l));
Функция polint. Эта функция вычисляет интеграл полинома с учетом постоянной
интегрирования. Соответствующий метод @polynom/polint.m реализуется следующим
образом:
function Intp = polint(р,С)
% POLYNOM/POLINT Интегрирование полинома
if nargin<2, С = 0; end
р = polynom (р) ;
q = polyint(p.c, С);
Intp = polynom(q);
Функция roots. Эта функция вычисляет корни полинома. В данном случае это будет
метод @polynom/roots.m, который реализуется следующим образом:
function г = roots(р)
% POLYNOM/ROOTS. ROOTS(р) - вектор, содержащий корни полинома р.
г = roots(р.с);
Функция plot. Эта функция строит график полинома. В данном случае это будет ме¬
тод @polynom/plot.m. Чтобы переопределить функцию plot для некоторого класса, на¬
до просто разместить М-файл plot.m в соответствующем каталоге класса.
Результирующий метод @polynom/plot.m имеет вид:
Приложение 3. Класс объектов polynom
645
function plot(p)
% POLYNOM/PLOT
% Функция PLOT(p) строит график полиномиального объекта р.
г = max(abs(roots(р)));
х = (-1.1:.01:1.1)*r;
у = polyval(р,х);
plot(х,у);
title(char(р) )
grid on
В заключение проверим набор созданных методов для класса объектов polynom,
используя функцию methods.
methods polynom
Methods
for class
polynom:
char
double
mtimes
polynom
subsref
diff
minus
plot
polyval
display
mpower
plus
roots
Тест:
того чтобы проверить возможности работы с классом объектов polynom, реа¬
лизуем следующий тест, при выполнении которого будут вызваны почти все методы
этого класса - возведение полинома в степень, приведение подобных членов, диффе¬
ренцирование и построение графика:
х = polynom([1 0] ) ;
р = polynom([1 0 -2 -5]);
plot(diff(рА2+10*р+20*х)-20) % рис. П-3.1
рис. П-3.1
646
В. Г. Потемкин. Вычисления в среде MATLAB
Приложение 4. Пакет прикладных программ JORD
Назначение пакета: приведение к форме Жордана произвольной комплексной
матрицы с кратными собственными значениями и вычисле¬
ние цепочек корневых векторов.
1. Теоретические предпосылки
Задана комплексная несимметрическая квадратная матрица А и требуется вычис¬
лить ее нормальную форму Жордана. Полагаем, что матрица А задана с ограниченной
точностью в арифметике с плавающей точкой и вычисления выполняются с конечной
точностью. Поскольку понятие нормальной формы Жордана основано на математиче¬
ских соотношениях, заданных с абсолютной точностью, то необходимо некоторое
уточнение этой структуры в случае вычислений с ограниченной точностью.
1.1. Математические основы
Каждая квадратная матрица А характеризуется спектром собственных значений
..., с алгебраическими кратностями tv ..., tp, такими, что к=п , где п-
к=1
порядок матрицы. Каждому собственному значению Хк соответствует по крайней ме¬
ре один собственный вектор г*, удовлетворяющий соотношению
Art=Atrt. (П-4.1)
Если собственному значению \к соответствует sk линейно независимых собствен¬
ных векторов, то число sk характеризует геометрическую кратность собственного
значения. Если для некоторого значения Л геометрическая кратность s меньше ал¬
гебраической г, то матрица А имеет дефект и собственных векторов недостаточно,
чтобы построить n-мерное пространство; поэтому требуется дополнить 5 собственных
векторов t - s корневыми векторами, порождаемыми цепочками вида
(А-Л1)Г/ =гм, / = 1...Л, (П-4.2)
где h - высота цепочки; I - порядок корневого вектора, при этом г0 = 0 , Tj- собствен¬
ный вектор, а вектор гЛ замыкает цепочку корневых векторов. Если геометрическая
кратность 5 > 1, то матрица А называется дефектной.
Соотношения (П-4.2) можно представить в матричной форме следующим образом:
AR* = R* J*,
Rk =[r1...rj,
ХШЛИОГтПИФИ
647
1
К
1
J*=
0
К 1
К.
Формируя матрицу размера п х п
(П-4.3)
R = [Rb Rq], tk =n ,
*=!
получим
AR = RJ,
где матрица J = Jr® J2® ... ®J* является нормальной формой Жордана.
(П-4.4)
Теорема (В. Н. Кублановская [9])
Пусть матрица А е Спхп и Л = 0 - собственное значение с кратностью t и структу¬
рой Жордана
а0={3„52, 8„};
= пк ~nk-i;
пк =dimN(A‘)-dimK(A‘’1),
(П-4.5)
г^е 5* - количество блоков Жордана порядка к, к = l...h;
h - высота цепочки Жордана;
dim К(А*) - размерность нуль-пространства матрицы Ак.
Тогда существует такая унитарная матрица Ре Спхп, что
где
РНАР =
Ао
0
1
2J Ч
, РН1Р =
I, 0
0 1„_,
ЧН *—1
t
n-t_
_t n-t_
(П-4.6)
a det(Ar) Ф 0, т. е. спектры матриц Ао и Аг не пересекаются.
1 0
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
!SI
1 1
1 1
1 1
1 1
1 1
1
1
1
0 м3
1
1
1
4-
0
мА.,
i
I
0
—ir-1 1 *—
>= | «2
>=Чч
V
648
В. Г. Потемкин. Вычисления в среде MATLAB
Если представить Р в блочном виде
(П-4.7)
то оболочка span{Ро} = Х(А;) является максимальным инвариантным подпространст¬
вом, соответствующим собственному значению Л = 0. Более того, пересечение нуль-
пространств К(А*)\ К(А<_1) определяется пк столбцами подматрицы Р0А., т. е. корне¬
выми векторами степени к.
1.2. Алгоритм
Вычислительные алгоритмы для нахождения нормальной формы Жордана для за¬
данной матрицы А конструируются двумя способами - на основе преобразований
[9, 10, 60] и на основе метода обратных итераций [98]. Обратные итерации используют
характерную структуру цепочек вида (П-4.2) и связаны с решением последовательно¬
сти линейных уравнений, близких к вырожденным. Методы, основанные на преобра¬
зованиях, связаны с построением таких матриц X в соотношениях (П-4.4), которые яв¬
ляются произведениями матриц элементарных преобразований. Оказывается
возможным применять только унитарные матрицы и матрицы исключения. Алгоритм
построения унитарного базиса последовательности нуль-пространств основан на тео¬
реме В. Н. Кублановской, приведенной выше.
Будем считать, что исходная матрица А приведена к верхней треугольной форме
(Шура) Т с помощью функций schur и rsf2csf; кроме того, выделены кластеры близких
собственных значений, удовлетворяющих условию
afo(\-X.)<le-4. (П-4.8)
Эти собственные значения могут оказаться как кратными с геометрической крат¬
ностью 5 > 1, так и просто различными с алгебраической кратностью t > 1 и 5 = 1. Для
выделения кратных собственных значений используется процедура jord, основанная на
модулях пакета SNAE [17]: struct, rgsvd, kroneck. Выявление структуры кратных соб¬
ственных значений, основанное на RGSVD-разложении [59], гарантирует получение
достоверного результата и позволяет в дальнейшем провести уточнение полученного
решения.
Теперь для каждого кратного собственного значения можно найти такую нильпо¬
тентную матрицу, которая позволит построить клетку Жордана для данного собствен¬
ного значения. Для этого для каждого кратного собственного значения X сформируем
матрицу Т, = Т - AI и выполним ее разложение по сингулярным числам
‘ Ti = Ui Ej v;1, (П-4.9)
отсортировав диагональные элементы Sj в порядке возрастания.
Тогда матрица
Т2 = Uj Е, V” = V” Т, у , (П-4.10)
Приложение 4. Пакет прикладных программ JORD
649
имеет нормы столбцов, равные сингулярным числам матрицы Ть и поэтому первые п}
из них можно заменить нулями. Продолжим те же операции над подматрицей размера
(и - /П])х(и - т\) в правом нижнем углу. Повторяя эти операции, придем к матрице В
следующего вида:
’0
0
0|
X
X | X
0
0
о 1
X
1
X 1 X
1
1
1
1
о I в’ в,.
0
0
о!
X
X 1 X
v 1 12 1 13
—
.L
—
0 ! 0 "! в,,
0
0
о 1
0
0 I х
I I 23
Т “1
1
1
01 0 1 0
0
0
0|
0
0 | х
Li i J
— —
—
1-
—
—— —
0
0
0|
0
0'0
где блоки Bzy имеют размеры щхп;. По отношению к этой матрице будем говорить, что
построена матрица со структурой п = п2 п3 ], в данном случае п = [3 2 1]; согла¬
сно соотношениям (П-4.5), Oto = {1, 1, 1} и при описании алгоритма будет использо¬
вана следующая таблица:
MA TP ИЦА
C
TP
УК
ТУРА
«1
«2
n3
m
n
8,
32 S3
0
0
0
X
X
X
3
3
1
пц
0
0
0
X
X
X
2
2
1
0
0
0
X
X
X
1
1
1
m2
0
0
0
0
0
X
0
0
0
0
0
0
X
m3
0
0
0
0
0
0
Приведение к матрице со структурой п реализовано с помощью модуля jvec.
Структура п является одним из выходных параметров этого модуля. Модуль jvec по¬
строен на базе модуля rgsvd пакета SNAE [17] и обращение к нему имеет вид
* [A,B,n,P,Q] = jvec(А,В,Р,Q);
Дальнейшее использование последовательности унитарных преобразований позво¬
ляет привести к верхней треугольной форме блоки В^+1. Первым приводится блок
Bh-i.h (в данном случае h = 3) с использованием QR-разложения, затем блок В12.
В результате матрица В примет вид
’0
0
0
1 f
1 'll
X
1 x'
0
0
0
1 0
1
r2l
1
1 X
1
0
0
0
1 0
L
0
1
1 X
L
0
0
0
1 о
0
1
0
0
0
! о
0
1 0
o'
'o'
o'
|0-
'o’
;o]
(П-4.12)
650
В. Г. Потемкин. Вычисления в среде MATLAB
Такая структура - это самое большее, что можно получить, используя только уни¬
тарные подобные преобразования. Появляющиеся здесь связывающие элементы игра¬
ют важную роль при дальнейшем построении нормальной формы Жордана. Для це¬
почки высоты к справедливо следующее неравенство для произведения связывающих
элементов:
an_„,t(B‘)<|z;1x^1x...x^|<ol(B‘), k = \...h, i = \...nk (П-4.13)
к-\
где тк =£nj ■
J=1
Приведение к данной форме реализовано с помощью модуля qr системы MATLAB,
а также модулей nblock, indbl, select и insert пакета JORD.
Теперь необходимо выполнить исключение ненулевых элементов матрицы В
(П-4.12). Процесс исключения выполняется по строкам снизу вверх и по столбцам-
справа налево, используя подобные матрицы исключения вида
P,=I-qe;„ qv=by/^.
(П-4.14)
После исключения элементов возникает матрица
'0
0
0
X
X
X
0
0
0
X
X
X
0
0
0
X
X
X
0
0
0
0
0
X
0
0
0
0
0
X
0
0
0
0
0
0
0
*12
0
0
В2з
0
0
0
'0
0
0
1
1 '11
0
' О’
0
0
0
■0
Г21
1 0
1
0
0
0
! о
1
0
1 0
1
0
0
0
1 0
0
1 г
I Г12
0
0
0
! о
0
1 0
о"
"о"
о
|0
’"o'
То]
(П-4.15)
Эта матрица представляет собой нормальную форму Жордана с точностью до пе¬
рестановок и масштабирования связывающих элементов.
После перестановок матрица В примет следующий вид
0 Гц
0
0
0
0
0
Г12
0
0
0
в =
0
0
0
0
0
Г21
0
0
0
0
0
(П-4.16)
После восстановления диагональных элементов блок В будет приведен к нормаль¬
ной форме Жордана
Приложение 4. Пакет прикладных программ JORD
651
"К Г11
К
О
J* =
к
о
о
о
к
О
О
О
О
Г 21
К
о
о
о
о
о
к.
(П-4.17)
В результате обработки всех блоков кратных собственных значений исходная мат¬
рица будет приведена к треугольной блочно-диагональной форме вида
Ji X
J2
X
X
X
X
Т =
х
х
х
Аг_
Следующий шаг состоит в приведении матрицы (П-4.18) к блочно-диагональной
форме вида
J! X
X
X '
J2
X
X
J2
X
X
R = R
J,
X
J*
Ar_
A,._
где матрица R имеет вид
i
им
N2
R4-1.S Rb
Rr.
а размер блоков Rpq равен
р
>1
•»ХКИ)
p = l...k, q = 2...r; tij = size(lj)
Определение матриц RTO связано с решением уравнений Ляпунова вида
(П-4.18)
(П-4.19)
(П-4.20)
(П-4.21)
(П-4.22)
для следующих матриц Т и R
652
В. Г. Потемкин. Вычисления в среде MATLAB
где Тр =
J,
х
J2
X
X
J,
т
J
R
R
р
u PQ
;R =
р
Р<1
0
0
р = I...к .
(П-4.23)
Блочно-диагональная матрица в соотношении (П-4.19) является двухдиагональной
матрицей, верхняя диагональ которой состоит из связывающих элементов. Индикато¬
рами плохой обусловленности задали вычисления клеток Жордана являются вырож¬
денность матрицы корневых векторов R и малые значения связывающих элементов.
Поэтому в заключение алгоритма при приведении связывающих элементов к 1 реали¬
зовано сравнение этих элементов с порогом 1е-6. В этом случае возможно возникно¬
вение новой структуры клеток Жордана; приведение к этой структуре достигается
за счет обнуления элементов матрицы LH*A*R, расположенных вне двух первых диа¬
гоналей. Это достигается изменением порога отсечения нулевых элементов в диапазо¬
не от 1е-7 до 1 е-2, после чего задача объявляется неразрешимой для исходных данных
и предлагается проверить заданную матрицу и выполнить ее масштабирование.
1.3. Оценка точности решения
Погрешность решения оценивается следующей нормой невязки:
Е = no rm (A - R*Jord*inv(R)) ,
где матрица Jord имеет ненулевые элементы только на главной и первой верхней диа¬
гонали.
2. Состав пакета
Пакет программ JORD реализован на языке MATLAB и включает следующие 11
модулей и файлы тестовых данных:
Модуль
Тестовые данные
cluster.m
indbl.m
insert.m
jord.m
jordscr.m
jrlyap.m
jr_table.m
jstruct.m
jvec.m
nblock.m
select.m
j rtest.mat
Кроме основных, пакет использует модули пакетов CONTROL SYSTEM TOOL¬
BOX и SNAE, а также ядра системы MATLAB, перечисленные в следующей таблице:
Приложение 4. Пакет прикладных программ JORD
653
Основные модули
Вспомогательные
модули
Принадлежность ППП или системе
j struct.m
ППП JORD
cluster.in
ППП JORD
jord.m
j r_table.m
j struct.m
ППП JORD
jvec .m
indbl.m
nblock.m
insert.m
select.m
ППП JORD
qz .m
Ядро системы MATLAB
jrlyap.m
ППП CONTROL SYSTEM TOOLBOX
struct
rgsvd
kroneck
ППП SNAE
[Struct I Приведение к форме Жордана
Назначение:
Приведение к форме Жордана произвольной комплексной матрицы, выделение
клеток Жордана для кратных собственных значений и вычисление цепочек корневых
векторов.
Вызов функции:
[eigval,Jstr,R,Jord] = jstruct(A)
Используемые функции:
MATLAB: qz.
CONTROL SYSTEM TOOLBOX: lyap.
ППП JORD: cluster, jord,jr_table,jstruct, jvec, indbl, insert, nblock, select.
Входные переменные:
A - произвольная комплексная матрица.
Выходные переменные:
eigval - массив собственных значений матрицы А следующей структуры:
lambda
nl
-7
2
0
6
-1+j
1
-1-j
1
Jstr - массив, характеризующий структуру кратных собственных значений:
lambda
J1J2J3
-7
0 1
0
111
654
В. Г. Потемкин. Вычисления в среде MATLAB
[JI...Jk] - мультииндекс структуры Жордана для кратного собственного значения;
Jord - форма Жордана матрицы А;
R - матрица приведения к форме Жордана (матрица собственных и корневых век¬
торов).
cluster | Выделить кластеры кратных собственных значений
Назначение:
Функция CLUSTER выделяет из диагональных элементов верхней треугольной
матрицы Т в комплексной форме Шура кластеры кратных собственных значений, ис¬
ходя из условия
abs(Xi - Л5-) < threshhold,
по умолчанию threshhold = le-4;
формируется скорректированная матрица Т с кратными собственными значениями,
равными среднеарифметическому всех значений в кластере.
Вызов функции:
[lambda,lambda,Т] = cluster(Т,threshhold)
Используемые функции:
MATLAB: length, find.
ППП JORD: нет.
Входные переменные:
Т - матрица в комплексной форме Шура;
threshhold - порог для включения собственного значения в кластер.
Выходные переменные:
lambda - вектор собственных значений для кластеров;
nlambda - число элементов в кластере;
Т - матрица в комплексной форме Шура с кратными значениями.
jord | Выявить структуры клеток Жордана
Назначение:
Функция Jord выявляет структуру клеток Жордана для кластеров кратных собст¬
венных значений.
Вызов функции:
Jord = jord(Т,lambda))
Используемые функции:
ППП SNAE: struct, rgsvd, kroneck.
Приложение 4. Пакет прикладных программ JORD
655
Входные переменные:
Т - произвольная матрица с известным спектром собственных значений или мат¬
рица в комплексной форме Шура;
lambda - вектор собственных значений для кластеров.
Выходные переменные:
Jord - массив следующей структуры:
lambda
Л
J2
J3
-50
0
1
0
1
1
1
[Ji J2 ... Jk] - мультииндекс структуры Жордана для кратного собственного значения.
jr_table | Таблица структуры клеток Жордана
Назначение:
Функция JR TABLE формирует таблицу кратных собственных значений и мульти¬
индексов структуры Жордана.
Вызов функции:
j г_table(lmbdk,А)
Используемые функции:
MATLAB: int2str.
Входные переменные:
Т - произвольная матрица с известным спектром собственных значений или мат¬
рица в комплексной форме Шура;
lambda - вектор собственных значений для кластеров.
Выходные переменные:
Таблица следующего вида, которая характеризует структуру клеток Жордана:
k
Ik
Л
J2
J3
1
-50
0
1
2
0
1
1
1
jvec | Выделить клетки Жордана для нулевых собственных значений
Назначение:
Функция JVEC реализует строго эквивалентные преобразования пучка квадратных
матриц {А 1, В1} с выделением клеток Жордана для нулевых собственных значений.
Вызов функции:
[А2,В2,n,Pl,Q1] = jvec(Al,Bl,Р,Q,шеря)
656
В. Г. Потемкин. Вычисления в среде MATLAB
Используемые функции:
MATLAB: rank, svd, size.
ППП JORD: нет.
Входные переменные:
Al, Bl - квадратные матрицы пучка D1(X) = Al - Л*В1;
P, Q - матрицы преобразования: начальные Р = Q = I(size(Al));
meps - точность вычисления ранга (по умолчанию 1 е-8).
Выходные переменные:
А2, В2 - квадратные матрицы пучка D2(A) = А2 - Л*В2 после одного шага RGSVD-
алгоритма для клетки кратного собственного значения;
n = [n 1 п2 ... nk] - структура клетки Жордана, пк - размерность пересечения нуль-
‘ пространств NCA^VNCA1"'1);
Pl, Q1 - матрицы преобразования: А2 = Q*A1*P, В2 = Q*B1*P.
indbl | Вычислить индексы блоков
Назначение:
Функция INDBL вычисляет индексы блока Aij по номеру блока BN для матрицы А
следующей структуры:
/И1
тг
/Из
А11(В1) А12(В2) А13(ВЗ)
А21(В4) А22(В5) А23(В6)
А31(В7) А32(В8) АЗЗ(В9)
Вызов функции:
[IZJ] = indbl(nbl, m,n)
Используемые функции:
MATLAB: length, rem.
ППП JORD: нет.
Входные переменные:
nbl - номер блока BN;
m, n - векторы, задающие структуру блочной матрицы.
Выходные переменные:
I, J - индексы блока BN с номером nbl.
insert Вставить блок
Назначение:
Функция INSERT вставляет в матрицу А блок Bij из следующей структуры:
Приложение 4. Пакет прикладных программ JORD
657
Ш]
т2
т3
В11(В1)В12(В2)В13(ВЗ)
В21(В4) В22(В5) В23(В6)
В31(В7) В32(В8) ВЗЗ(В9)
Вызов функции:
А = insert (A, Bi j ,m, n, i , j )
Используемые функции:
MATLAB: sum.
ППП JORD: нет.
Входные переменные:
А - матрица, в которой должен быть обновлен блок (i,j);
Bij - блок для вставки в матрицу А;
m, п - векторы размеров блоков m = [3 2 1], п = [3 2 1];
i, j - индексы блока Bij в составе матрицы А (блок BN с номером N(i,j)).
Выходные переменные:
А - блочная матрица с обновленным блоком (i,j).
nblock | Вычислить номер блока
Назначение:
Функция NBLOCK вычисляет номер nbl блока BN по индексам блока Aij для мат¬
рицы А следующей структуры:
ДИ]
иг3
А11(В1) А12(В2) А13(ВЗ)
А21(В4) А22(В5) А23(В6)
А31(В7) А32(В8) АЗЗ(В9)
Вызов функции:
nbl = nblock(i,j,m,n)
Используемые функции:
MATLAB: length.
ППП JORD: нет.
Входные переменные:
i, j - индексы блока с номером nbl;
m, n - векторы, описывающие структуру блочной матрицы.
Выходные переменные:
nbl - номер блока BN.
658
В. Г. Потемкин. Вычисления в среде MATLAB
Выделить блок
select
Назначение:
Функция SELECT выбирает блок Aij из матрицы А следующей структуры:
щ п2 п3
тх А11(В 1) А12(В2) А13(ВЗ)
т2 А21(В4) А22(В5) А23(В6)
т3 А31(В7) А32(В8) АЗЗ(В9)
Вызов функции:
Bij = select (A,in, n, i, j )
Используемые функции:
MATLAB: sum.
ППП JORD: нет.
Входные переменные:
A - исходная матрица, размеченная на блоки векторами т, п;
т, п - векторы размеров блоков т = [3 2 1], п = [3 2 1];
i, j - индексы блока Aij (блок BN с номером N(i,j)).
Выходные переменные:
Bij - вектор, не содержащий одинаковых элементов.
jrlyap | Решение уравнений Ляпунова
Назначение:
Функция LYAP из пакета CONTROL SYSTEM TOOLBOX предназначена для ре¬
шения уравнений Ляпунова.
Вызов функции:
X- = jrlyap(А,С)
X = jrlyap(А,В,С)
Описание:
Функция X = jrlyap(A, С) решает уравнения Ляпунова специального вида:
А*Х + Х*А’ = -С.
Функция X = jrlyap(A, В, С) решает уравнения Ляпунова общего вида:
А*Х + Х*В = -С.
Используемые функции:
ППП JORD: нет
Входные переменные:
А, В, С - исходные матрицы уравнения Ляпунова.
Приложение 4. Пакет прикладных программ JORD
659
Выходные переменные:
X - матрица, в общем случае прямоугольная - решение уравнения Ляпунова.
3. Пример использования и результаты проверки
Обратимся к набору тестовых матриц, объединенных в МАТ-файл jrtest, и загрузим
его в рабочую область:
load jrtest
who
Your variables are:
А10
А249
А346.
А38210
А5
А8
А13
А250
А362
А38216
• А6
Этот файл содержит 11 наборов данных, выберем набор А10 и обратимся к модулю
jstruct. Приведенный ниже протокол вычислений поясняет, как выделяются кластеры
кратных собственных значений и вычисляются структуры клеток Жордана.
[eigval,jrtest] = jstruct(А10);
Собственные значения
ans =
1.000000000000015e+000
1.000000000000014e+000
1.139748175005581e-005
-2.238301811318049e-005
1.098553633443666e-005
7.000015938730899e+000
7.000009261525642e+000
6.999974799743427e+000
-1.337948840754229e-011
1.339424011824620e-011
7.000000000000012e+000
7.000000000000015e+000
-4.756449455977730e-015
-1.OOOOOOOOOOOOOOle+OOOi
+1.000000000000002e+000i
+1.926593016475980e-005i
+2.378655934851566e-007i
-1.950379576076453e-005i
+1.989716800598368e-005i
-2.375231508541116e-005i
+3.855147079427918e-006i
-7.064341039015967e-009i
+7.064341038770417e-009i
’Кластеры близких собственных значений
порог близости
threshold = 1.0000е-004
1N1 =
0 6.0000
7.0000 + 0.0000i 5.0000
Матрица эквивалентных возмущений
epsA=A-R*Jordt*LH с нормой
Е = 4.9912е-012
Число обусловлености задачи K(R)=|IR||*||LH||
К = 8277.98
Норма невязки | I г| | = | |A*R-R*J| |
г = 2.7701е-014
660
В. Г. Потемкин. Вычисления в среде MATLAB
Структура
клеток Жордана
Jstr =
7
2 0 1
0
111
eigval =
7.0000
5.0000
! 0
6.0000
1.0000
- l.OOOOi 1.0000
1.0000
+ l.OOOOi 1.0000
Исследуемая матрица имеет 4 собственных значения, два из которых являются
простыми - это пара комплексных собственных значений, и два действительных соб¬
ственных значения, которые образуют кластеры кратных значений, соответствующие
следующим клеткам Жордана:
• кластер, соответствующий нулевому собственному значению, имеет по одной клет¬
ке Жордана первого, второго и третьего порядка;
• кластер, соответствующий собственному значению равному 7, имеет 2 клетки
Жордана первого порядка и 1 клетку Жордана третьего порядка.
Приложение 4. Пакет прикладных программ JORD
661
индексный указатель
Операторы системы MATLAB 6.x
Команды общего назначения
Операторы
Назначение
Настройка параметров операционной среды
matlabrc
Запуск системы MATLAB
matlabroot
Определение корневого каталога
diary
Ведение дневника сеанса работы
printopt
Задание опций печати
quit
Завершение работы в системе MATLAB
exit
Завершение работы в системе MATLAB
Управление операционной системой
!
Выполнить команду операционной DOS
dos
Выполнить команду DOS и возвратить результат
getenv
Получить значение переменной среды окружения
cd
Изменить текущий каталог
pwd
Путь доступа к текущему каталогу
fileattrib
Получить/установить атрибуты файлов и каталогов
copyfile
Копировать файл или каталог
movefile
Переместить файл или каталог
delete
Удалить файл
dir
Содержимое текущего каталога
filesep
Разделитель каталогов для используемой операционной системы
isdir
Проверить, является ли аргумент каталогом
mkdir
Создать каталог
rmdir
Удалить каталог
tempdir
Имя рабочего каталога DOS
tempname
Имя временного файла
system
Выполнить команду операционной системы и возвратить результат
perl
Выполнить команду языка Perl и возвратить результат
unix
Выполнить команду ОС Unix и возвратить результат
computer
Определить тип используемого компьютера
isunix
Проверить, является ли версия MATLAB версией для ОС Unix
ispc
Проверить, является ли версия MATLAB версией для PC (Windows)
^ИДНОГтПИОИ
662
Управление командным окном
clc
Очистить командное окно
home
Поместить курсор в начальную позицию
echo
Эхо-команда
more
Управление выводом страниц
format
Управление форматом вывода чисел в командное окно
type
Вывод в командное окно содержимого ASCII-файла
what
Список файлов в текущем каталоге
type
Просмотр текста М-файла
edit
Редактирование текста М-файла
lookfor
Поиск М-файлов по ключу
Ctrl+S
Контекстный поиск символов в командном окне
Tab Completion
Дополнение имени до полного <символы>+ТаЬ(+ТаЬ)
Управление рабочей областью
who
Список текущих переменных
whos
Список текущих переменных с подробностями
load
Считывание переменных из МАТ-файла
save
Запись переменных в МАТ-файл
clear
Удаление переменных и функций из памяти
inmem
Список функций, загруженных в рабочую область памяти
pack
Дефрагментация рабочей области памяти
workspace
Активизировать окно рабочей области Workspace
Управление текущим каталогом
fileparts
Выделить составляющие пути доступа
fullfile
Сформировать полное имя файла из частей
what
Вывод списка файлов
which
Вывод списка файлов
copyfile
Скопировать файл
open
Открыть файл
delete
Удалить файл
filebrowser
Активизировать окно текущего каталога Current Directory
Управление путями доступа
matlabpath
Определить путь доступа
pathdef
Определить путь доступа
path
Определить/установить путь доступа
pathsep
Определить разделитель в списке путей доступа
partialpath
Определить частичный путь доступа
genpath
Выделить подкаталоги
path2rc
Сохранить список путей доступа
Индексный указатель
663
addpath
Добавить каталог к пути доступа
rmpath
Удалить каталог из пути доступа
rehash
Обновить кеш-память
editpath
Открыть окно Set Path
pathtool
Открыть окно Set Path
Справочные команды
version
Справка об используемой версии системы MATLAB и виртуальной
машины Java
ver
Справка о составе текущей версии системы MATLAB и ее расширений
license
Определение номера лицензии
info
Информация о системе MATLAB и фирме-производителе
whatsnew
Документация Release Notes в окне Help
help
Справка об операторе в командной строке
helpwin
Справка об операторе в окне Help
helpdesk
Доступ к HTML-документации в окне Help
helpbrowser
Доступ к HTML-документации в окне Help
doc
Просмотр HTML-документов в окне Help
web
Открыть Web-браузер
finddemo
Определить расположение демонстрационных файлов
demo
Справка о демонстрационных примерах в окне Help
Классы объектов
Операторы создания объектов
logical
Создать логическую переменную
char
Создать массив символов
single
Создать массив чисел одинарной точности
double
Создать массив чисел удвоенной точности
int8
Преобразовать в 8-битовое целое со знаком
intl6
Преобразовать в 16-битовое целое со знаком
int32
Преобразовать в 32-битовое целое со знаком
int64
Преобразовать в 64-битовое целое со знаком
uint8
Преобразовать в 8-битовое целое без знака
uintl6
Преобразовать в 16-битовое целое без знака
uint32
Преобразовать в 32-битовое целое без знака
uint64
Преобразовать в 64-битовое целое без знака
cell
Создать массив ячеек
struct
Создать массив записей
inline
Создать объект inline
664
В. Г. Потемкин. Вычисления в среде MATLAB
Арифметические операторы
+
plus
Сложение
+
uplus
Унарное сложение
-
minus
Вычитание
-
uminus
Унарное вычитание
*
mtimes
Умножение матриц
в *
times
Поэлементное умножение для массивов
А
mpower
Возведение матрицы в степень
Л
power
Возведение в степень для массивов
\
mldivide
Левое деление матриц
/
mrdivide
Правое деление матриц
• \
ldivide
Левое деление для массивов
./
rdivide
Правое деление для массивов
kron
Тензорное произведение векторов
Операторы отношения
= =
eq
Тождественно
~=
пе
He тождественно
<
It
Меньше
>
gt
Больше
<=
le
Меньше или равно
>=
ge
Больше или равно
Логические операторы
&
and
Логическое И
& &
Логическое И для операндов типа logical
1 ' or
Логическое ИЛИ
1 1
Логическое ИЛИ для операндов типа logical
not
Логическое НЕТ
хог
Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ
any
Истинно, если хотя бы 1 элемент вектора не равен нулю
all
Истинно, если все элементы вектора не равны нулю
Специальные символы
Сечение массива
( )
Указание последовательности выполнения операций
[ J
Формирование массива
{ }
Многомерные массивы
•
Десятичная точка (разделитель)
Выделение поля структуры
Указатель на каталог-родитель
Индексный указатель
665
• • •
Продолжение строки
/
Разделитель
7
Подавление вывода результата
%
Комментарий
I
Вызов команды операционной системы
=
Присваивание
Кавычка
.1 transpose
Транспонирование элементов массива
1 ctranspose
Транспонирование элементов матрицы
[, ]
horzcat
Объединение элементов в строку
[; ]
vertcat
Объединение элементов в столбец
( ), <
subsasgn
Присваивание подмассива
( ), <
subsref
Ссылка на подмассив
subsindex
Индекс подмассива
Операторы поразрядной обработки
bitand
Поразрядное И
bi temp
Биты дополнения
bitor
Поразрядное ИЛИ
bi tmax
Максимальное число разрядов
bitxor
Поразрядное ИСКЛЮЧАЮЩЕЕ ИЛИ
bitset
Задать бит
bitget
Узнать бит
bitshift
Поразрядный сдвиг
Операторы обработки множеств
union
Объединение множеств
unique
Выделение множества
intersect
Пересечение множеств
setdiff
Разность множеств
setxor
ИСКЛЮЧАЮЩЕЕ ИЛИ для множеств
ismember
Истинно, если это элемент множества
Специальные переменные и константы
ans
Результат выполнения последней операции
eps
Машинная точность
realmax
Наибольшее число с плавающей точкой
realmin
Наименьшее число с плавающей точкой
Pi
л = 3.141592653589793е+000
666
В. Г. Потемкин. Вычисления в среде MATLAB
i/ j
Мнимая единица,
inf
Бесконечное значение, ©©
NaN
Нечисловое значение
isnan
Истинно, если нечисловое значение
isinf
Истинно, если бесконечное значение
isfinite
Истинно, если конечное значение
Класс INLINE
inline
Конструктор объектов INLINE
argnames
Получить имена аргументов функции INLINE
char
Преобразовать объект INLINE в массив символов полей
formula
Получить формулу функции INLINE
vectorize
Представить функцию INLINE в векторной форме
Функции вычисления времени и дат
Текущее время и дата
clock
Текущее время и дата в форме вектора
date
Текущая дата в форме строки
now
Текущее время и дата в форме числа
Основные функции
datenum
Последовательный номер даты с 01-Jan-0000
datestr
Строковое представление даты
datevec
Векторное представление даты
calendar
Календарь текущего месяца
weekday
День недели
eomday
Последний день месяца
datetick
Форматирование меток осей датой
cputime
Время работы центрального процессора в секундах
tic
Начало отсчета
toe
Конец отсчета
etime
Интервал использованного времени
Массивы и матрицы
Массивы и матрицы специального вида
zeros
Формирование массива нулей
ones
Формирование массива единиц
eye
Формирование единичной матрицы
repmat
Формирование многомерного массива на основе данного
Индексный указатель
667
rand
Формирование массива элементов, распределенных по равномерному
закону
randn
Формирование массива элементов, распределенных по нормальному
закону
linspace
Формирование линейного массива равноотстоящих узлов
logspace
Формирование узлов логарифмической сетки
meshgrid
Формирование узлов двумерной и трехмерной сеток
Формирование векторов и подматриц
Характеристики массивов
size
Размер массива
length
Длина вектора
ndims
Количество размерностей массива
is empty
Истинно, если массив пустой
isequal
Истинно, если два массива идентичны
isnumeric
Истинно, если массив числовой
islogical
Истинно, если массив имеет тип данных logical
logical
Преобразовать числовой тип данных в тип logical
Операции над массивами и матрицами
reshape
Преобразование размеров и размерностей матрицы
diag
Формирование или извлечение диагоналей матрицы
tril
Формирование нижней треугольной матрицы
triu
Формирование верхней треугольной матрицы
fliplr
Отражение матрицы относительно вертикальной оси
flipud
Отражение матрицы относительно горизонтальной оси
flipdim
Отражение многомерного массива относительно указанной размерно¬
сти
rot90 •
Поворот матрицы на 90°
find
Определить индексы ненулевых элементов
end
Последний индекс многомерной матрицы
sub2ind
Преобразование многомерной нумерации в последовательную
ind2sub
Преобразование последовательной нумерации в многомерную
Многомерные массивы
cat
Объединить массивы
ndims
Размерность массива
ndgrid
Сгенерировать сетку для многомерной функции
permute
Перестановка размерностей массива
ipermute
Обратная перестановка размерностей массива
shiftdim
Изменить размерность массива
squeeze
Удалить одну из размерностей
668
В. Г. Потемкин. Вычисления в среде MATLAB
Массивы ячеек
cell
Создать массив ячеек
celldisp
Показать содержимое массива ячеек
cellplot
Показать графическую структуру массива ячеек
deal
Установить соответствие входов с выходами
iscell
Истинно, если это массив ячеек
cell2struct
Преобразовать массив ячеек в массив структур
num2cell
Преобразовать числовой массив в массив ячеек
struct2cell
Преобразовать массив структур в массив ячеек
Массивы записей
struct
Создать массив записей
fieldnames
Получить имена полей
getfield
Получить содержимое полей
setfield
Установить содержимое полей
rmfield
Удалить поле
isfield
Истинно, если это поле массива записей
isstruct
Истинно, если это массив записей
Объектно-ориентированное программирование
Объектно-ориентированное программирование
class
Создать объект или возвратить класс объекта
methods
Показать методы данного класса
isa
Истинно, если объект принадлежит данному классу
isobject
Истинно, если это объект
inferiorto
Отношение низшего класса
superiorto
Отношение высшего класса
Переопределение методов
minus
Переопределить метод для a - b
plus
Переопределить метод для а + b
times
Переопределить метод для а. * b
mtimes.
Переопределить метод для а * b
mldivide
Переопределить метод для а\Ь
mrdivide
Переопределить метод для а/Ь
rdivide
Переопределить метод для а./Ь
ldivide
Переопределить метод для а.\Ь
power
Переопределить метод для а.ЛЬ
mpower
Переопределить метод для аЛЬ
uminus
Переопределить метод для -а
uplus
Переопределить метод для +а
Индексный указатель
669
horzcat
Переопределить метод для [a b]
vertcat
Переопределить метод для [а; b]
le
Переопределить метод для а <= b
It
Переопределить метод для а < b
gt
Переопределить метод для а > b
ge
Переопределить метод для а >= b
eq
Переопределить метод для а==Ь
ne
Переопределить метод для а~=Ь
not
Переопределить метод для ~а
and
Переопределить метод для а&Ь
or
Переопределить метод для а|Ь
subsasgn
Переопределить метод для a(i)=b, a{i}=b, a.field=b
subsref
Переопределить метод для a(i), a{i}, a.field
colon
Переопределить метод для а:Ь
transpose
Переопределить метод для а.’
ctranspose
Переопределить метод для а’
subsindex
Переопределить метод для х(а)
Программирование и отладка М-файлов
Операторы программирования
for...end
Оператор цикла с определенным числом операций
if...else
Оператор условия
switch...case
Оператор переключения
try...catch
Оператор перехвата и обработки ошибок
while...end
Оператор цикла с неопределенным числом операций
break
Оператор прерывания цикла
continue
Оператор прерывания текущей итерации
return
Оператор возврата в вызывающую функцию
nargchk
Проверка количества входных аргументов
nargin
Определение количества входных аргументов
nargout
Определение количества выходных аргументов
varargin
Список переменной длины для входных аргументов
varargout
Список переменной длины для выходных аргументов
inputname
Определение имени переменной по номеру входного аргумента
error
Формирование сообщения об ошибке
warning
Формирование предупреждений
lasterr
Сообщение о последней ошибке
lastwarn
Сообщение о последнем предупреждении
errortrap
Установка флага управления программой при возникновении ошибки
670
В. Г. Потемкин. Вычисления в среде MATLAB
Отладка М-файлов
debug
Просмотреть список команд отладки
dbstop
Задать контрольную точку
dbclear
Удалить контрольную точку
dbcont
Продолжить выполнение
dbdown
Перейти в стеке вызываемых М-функций сверху вниз
dbstack
Вывести стек вызываемых М-функций
dbstatus
Просмотреть список контрольных точек
dbstep
Выполнить одну или несколько команд отладки
dbtype
Распечатать М-файл с пронумерованными строками
dbup
Перейти в стеке вызываемых М-функций снизу вверх
dbquit
Завершить отладку
Профилирование М-файлов
profile
Профиль времени исполнения М-файла
profreport
Отчет о профиле
depfun
Определить список вызываемых функций для данного М-файла
depdir
Определить каталоги размещения вызываемых функций для данного
М-файла
Импорт и экспорт файлов
Функции графического интерфейса
uiimport
Запустить Мастер импорта Import Wizard
clipboard
Обмен массивами символов с буфером обмена
f info
Определить тип файла
importdata
Загрузить данные из файла
open
Открыть файл с заданным расширением
saveas
Сохранить графическое окно в файле с заданным расширением
load
Прочитать переменные из МАТ-файла
save
Записать переменные в МАТ-файл
Файлы в текстовом формате
csvread
Прочитать числовой файл с разделителем запятая
csvwrite
Записать числовой файл с разделителем запятая
dlmread
Прочитать числовой файл с разделителем в ви^е ASCII-кода
dlmwrite
Записать числовой файл с разделителем в виде ASCII-кода
textread
Прочитать текстовый файл
Файлы электронных таблиц
xlsinfo
Получить информацию о таблице Microsoft Excel
xlsread
Прочитать электронную таблицу Microsoft Excel
wklinfо
Получить информацию о таблице Lotus 1-2-3
wklread
Прочитать электронную таблицу Lotus 1-2-3
wklwrite
Записать массив чисел в электронную таблицу Lotus 1-2-3
Индексный указатель
671
Графические файлы
iminfо
Получить информацию о графическом файле
imread
Считать графическое изображение из файла
imwrite
Записать графическое изображение в файл
Аудио-файлы
wavinfo
Получить информацию о звуковом файле с расширением wav
wavread
Считать звуковой файл с расширением wav
wavwrite
I
Записать звуковой файл с расширением wav
Видео-файлы
aviinfо
Получить информацию о видеофайле с расширением avi
aviread
Считать видеофайл *
aviwrite
Создать видеофайл
addframe
Добавить кадр к видеофайлу
close(avifile)
Закрыть видеофайл
Файлы в формате научных данных
cdfinfo
Получить информацию о CDF-файле в формате Common Data Format
cdfread
Считать данные из CDF-файла
fitsinfo
Получить информацию о FITS-файле в формате Flexible Image Trans¬
port System
fitsread
Считать данные из FITS-файла
hdf
Интерфейс с библиотеками научных данных в форматах HDF и HDF-EOS
hdfinfо
Получить информацию о файлах в форматах HDF и HDF-EOS
hdfread
Считать данные из файлов в форматах HDF и HDF-EOS
hdftool
Графический интерфейс для считывания данных из файлов в форма¬
тах HDF и HDF-EOS
Операции ввода-вывода файлов
Открытие и закрытие файлов
fopen
Открыть файл
fclose
Закрыть файл
Двоичные файлы
fread
Прочитать двоичные данные из файла
fwrite
Записать двоичные данные в файл
Форматированные файлы
fscanf
Прочитать форматированные данные из файла
fprintf
Записать форматированные данные в файл
fgetl
Прочитать строку файла, удалив символ конца строки
fgets
Прочитать строку файла, сохранив символ конца строки
input
Интерактивный ввод
672
В. Г. Потемкин. Вычисления в среде MATLAB
Позиционирование файла
ferror
Запросить информацию об ошибке ввода-вывода
f eof
Проверить признак конца файла
f seek
Установить указатель в заданную позицию
ftell
Запросить позицию указателя в файле
frewind
Установить указатель в начало файла
Язык программирования MATLAB
Математические функции
Тригонометрические функции
sin
Синус
sinh
Гиперболический синус
asin
Арксинус
asinh
Г иперболический ареасинус
cos
Косинус
cosh
Гиперболический косинус
acos
Арккосинус
acosh
Гиперболический ареакосинус
tan
Тангенс
tanh
Г иперболический тангенс
atan
Арктангенс
atan2
Арктангенс от двух аргументов
a tanh
Г иперболический ареатангенс
sec
Секанс
sech
Гиперболический секанс
asec
Арксеканс
asech
Гиперболический ареасеканс
CSC
Косеканс
csch
Гиперболический косеканс
acsc
Арккосеканс
acsch
Гиперболический ареакосеканс
cot
Котангенс
coth
Гиперболический котангенс
acot
Арккотангенс
acoth
Гиперболический ареакотангенс
Трансцендентные функции
ехр
Экспоненциальная функция
log
Функция натурального логарифма
loglO
Логарифм по основанию 10
Индексный указатель
673
22 т. Зак. 3375
1од2
Логарифм по основанию 2
pow2
Экспонента по основанию 2
sqrt
Функция квадратного корня
nextpow2
Ближайшая степень экспоненты по основанию 2
Функции обработки комплексных чисел
abs
Абсолютное значение комплексного числа
angle
Аргумент комплексного числа
conj
Комплексно-сопряженное число
imag
Мнимая часть комплексного числа
real
Действительная часть комплексного числа
unwrap
Непрерывная функция фазового угла
isreal
Истинно, если это массив-действительных чисел
complex
Создать переменную с атрибутом complex (комплексную перемен¬
ную)
cplxpair
Сортировка комплексно-сопряженных пар
Округление и модульная арифметика
fix
Усечение дробной части числа
floor
Округление до меньшего целого
ceil
Округление до большего целого
round
Округление до ближайшего целого
mod
Остаток в смысле модульной арифметики
rem
Остаток от деления с учетом знака
sign
Знак числа
Специальные математические функции
airy
Функция Эйри
besselj
Функция Бесселя первого рода
bessely
Функция Бесселя второго рода
be.sselh
Функция Бесселя третьего рода (функция Ганкеля)
besseli
Модифицированная функция Бесселя первого рода
besselk
Модифицированная функция Бесселя второго рода
beta
Полная бета-функция
betainc
Неполная бета-функция
betaln
Натуральный логарифм полной бета-функции
ellipj
Эллиптические функции Якоби
ellipke
Полные эллиптические интегралы
erf
Функция ошибки
erf c
Остаточная функция ошибки
erf ex
Масштабированная остаточная функция ошибки
erfinv
Обратная функция ошибки
674
В. Г. Потемкин. Вычисления в среде MATLAB
expint
Интегральная показательная функция
gamma
Полная гамма-функция
gammainc
Неполная гамма-функция
gammain
Натуральный логарифм полной гамма-функции
legendre
Функция Лежандра
cross
Векторное произведение векторов
dot
Скалярное произведение векторов
Теоретико-числовые функции
factor
Разложение числа на простые множители
isprime
Истинно, если число простое
primes
Формирование списка простых чисел
gcd
Наибольший общий делитель
1cm
Наименьшее общее кратное
rat
Приближение числа в виде рациональной дроби
rats
Вычисления в поле рациональных чисел
perms
Формирование всех перестановок элементов вектора
nchoosek
Вычисление числа сочетаний,
factorial
Вычисление факториала числа
Функции преобразования систем координат
cart2sph
Преобразование декартовой системы в сферическую
cart2pol
Преобразование декартовой системы в полярную
pol2cart
Преобразование полярной системы в декартову
sph2cart
Преобразование сферической системы в декартову
Линейная алгебра
Коллекция матриц
comp ап
Сопровождающая матрица
gallery
Пакет тестовых матриц
hadamard
Матрица Адамара
hankel
Матрица Ганкеля
hilb
Матрица Гильберта
invhilb
Матрица, обратная матрице Гильберта
magic
Магический квадрат
pascal
Матрица Паскаля
rosser
Матрица Рессера
toeplitz
Матрица Теплица
vander
Матрица Вандермонда
wilkinson
Матрица Уилкинсона
Индексный указатель
675
Матричный анализ
norm
Вычисление норм векторов и матриц
rank
Вычисление ранга матрицы
det
Вычисление определителя матрицы
trace
Вычисление следа матрицы
null
Вычисление нуль-пространства матрицы
orth
Вычисление ортонормального базиса матрицы
rref
Приведение к треугольной форме
subspace
Вычисление угла между подпространствами
Решение систем линейных уравнений
\ и /
Решатели систем уравнений
inv
Вычисление обратной матрицы
cond
Вычисление числа обусловленности по отношению к задаче обраще¬
ния матрицы
chol
Разложение Холецкого
choline
Неполное разложение Холецкого
cholupdate
Разложение Холецкого матрицы А ± х*х'
lu
LU-разложение
luinc
Неполное LU-разложение
qr
QR-разложение
qrupdate
Разложение Холецкого для матрицы А + u*v'
lsqnonneg
Метод наименьших квадратов с неотрицательными ограничениями
pinv
Псевдообращение по Муру-Пенроузу
lscov
Метод наименьших квадратов в присутствии шумов
Собственные значения и сингулярные числа
eig
Полная проблема собственных значений
svd
Сингулярное разложение
eigs
Вычисление отдельных собственных значений
svds
Вычисление отдельных сингулярных чисел
poly
Вычисление характеристического полинома
polyeig
Решение полиномиальных матричных уравнений
condeig
Вычисление числа обусловленности по отношению к задаче на собст¬
венные значения
hess
Приведение матрицы к форме Хессенберга
qz
Обобщенная проблема собственных значений
schur
Приведение матрицы к форме Шура
Вычисление функций от матриц
ехрт
Вычисление матричной экспоненты
logm
Вычисление логарифма матрицы
sqrtm
Вычисление функции А1/2
funm
Вычислений произвольных функций от матриц
676
В. Г. Потемкин. Вычисления в среде MATLAB
Утилиты
qrdelete
Удалить столбец из QR-разложения
qrinsert
Добавить столбец в QR-разложение
rsf2csf
Преобразование действительной формы Шура в комплексную
cdf2rdf
Преобразование комплексной формы Шура в действительную
balance
Масштабирование матрицы
planerot
Формирование матрицы вращения Гивенса
Полиномы и операции над ними
polyval
Вычисление полинома
polyvalm
Вычисление матричного полинома
poly
Вычисление характеристического полинома
residue
Разложение на простые дроби
roots
Вычисление корней полинома
polyfit
Аппроксимация данных полиномом
polyder
Вычисление производной полинома
polyint
Вычисление интеграла от полинома
conv
Умножение полиномов
deconv
Деление полиномов
Разреженные матрицы
Элементарные матрицы
sparse
Формирование разреженной матрицы
speye
Единичная разреженная матрица
sprand
Случайная разреженная матрица с элементами, распределенными
по равномерному закону
sprandn
Случайная разреженная матрица с элементами, распределенными по
нормальному закону
sprandsym
Случайная разреженная симметрическая матрица
spdiags
Формирование диагоналей разреженной матрицы
Характеристики матриц
normest
Оценка 2-нормы разреженной матрицы
condest
Оценка числа обусловленности по 1-норме
sprank
Вычисление структурного ранга
Преобразование матриц
full
Преобразование разреженной матрицы в полную
find
Определение индексов ненулевых элементов
spconvert
Восстановление разреженной матрицы из внешнего ASCII-формата
Индексный указатель
677
Работа с ненулевыми элементами
nnz
Количество ненулевых элементов
nonzeros
Формирование вектора ненулевых элементов
nzmax
Количество ячеек памяти для размещения ненулевых элементов
spones
Формирование матрицы связности
spalloc
Выделить память для разреженной матрицы
issparse
Истинно, если матрица разреженная
spfun
Вычисление функции только для ненулевых элементов
Операции над графом разреженной матрицы
etree
Вычисление дерева структуры
etreeplot
Построение дерева структуры
treelayout
Разметка дерева структуры
treeplot
Построение дерева структуры
Алгоритмы упорядочения
colmmd
Упорядочение по разреженности столбцов
symmmd
Симметрическая упорядоченность
symrcm
RCM-упорядоченность
colperm
Упорядочение столбцов с учетом их разреженности
randperm
Формирование случайных перестановок
dmperm
DM-декомпозиция разреженной матрицы
Решение СЛА У с разреженными матрицами
luinc
Неполное LU-разложение
choline
Неполное разложение Холецкого
peg
Метод сопряженных градиентов
minres
Метод минимальной невязки
symmlq
Симметрический LQ-алгоритм
bieg
Метод бисопряженных градиентов
bicgstab
Устойчивый метод бисопряженных градиентов
cgs
Квадратичный метод сопряженных градиентов
gmres
Обобщенный метод минимальной невязки
gmr
Метод квазиминимальной невязки
lsgr
LSQR-реализация метода сопряженных градиентов
Визуализация разреженных матриц
gplot
Построение графа структуры
spy
Визуализация структуры разреженной матрицы
Вспомогательные операции
spparms
Установка параметров для алгоритмов обработки
symbfact
Характеристики разложения Холецкого
spaugment
Формирование расширенной матрицы для метода наименьших квад¬
ратов
678
В. Г. Потемкин. Вычисления в среде MATLAB
Обработка строк
Основные функции
blanks
Сформировать строку пробелов
cellstr
Преобразовать массив символов в массив ячеек для строк
char
Сформировать массив символов
deblank
Удалить пробелы в конце строки
double
Преобразовать символы строки в числовые коды
Проверка строк
ischar
Истинно, если это массив символов (строка)
iscellstr
Истинно, если это массив ячеек для строк
isletter
Истинно, если это символ алфавита
isspace
Истинно, если это пробел
Операции над строками
strcat
Горизонтальное объединение строк
strvcat
Вертикальное объединение строк
strcmp
Сравнить строки
strncmp
Сравнить п символов строк
findstr
Найти заданную строку в составе другой строки
strjust
Выравнять массив символов
strmatch
Найти все совпадения
strrep
Заменить одну строку другой
strtok
Найти часть строки, ограниченную разделителями
upper
Перевести все символы строки в верхний регистр
lower
Перевести все символы строки в нижний регистр
Преобразования строк
num2str
Преобразование числа в строку
int2str
Преобразование целого в строку
mat2str
Преобразование матрицы в строку
str2mat
Объединение строк в матрицу
str2num
Преобразование строки в арифметическое выражение и его вычисление
sprintf
Записать форматированные данные в виде строки
sscanf
Прочитать строку с учетом формата
Преобразования систем счисления
hex2num
Преобразовать шестнадцатеричное число в число удвоенной точности
hex2dec
Преобразовать шестнадцатеричное число в десятичное число
dec2hex
Преобразовать десятичное число в шестнадцатеричную число
bin2dec
Преобразовать двоичную строку в десятичное число
dec2bin
Преобразовать десятичное число в двоичную строку
base2dec
Преобразовать В-строку в десятичное число
dec2base
Преобразовать десятичное число в В-строку
Индексный указатель
679
Алгоритмы обработки данных
Базовые операции
max
Максимальный компонент массива
min
Минимальный компонент массива
mean
Компонент средних значений массива
median
Компонент срединных значений массива
std
Компонент стандартных отклонений массива
sort
Сортировка по возрастанию
sortrows
Сортировка строк по возрастанию
sum
Суммирование элементов массива
prod
Произведение элементов массива
cumsum
Суммирование с накоплением
cumprod
Произведение с накоплением
Численное интегрирование
cumtrapz
Численное интегрирование методом трапеций с накоплением
trapz
Численное интегрирование методом трапеций
quad
Численное интегрирование методом квадратур
quadl
Численное интегрирование методом Лобатто адаптивных квадратур
dblquad
Вычисление двойного интеграла
triplequad
Вычисление тройного интеграла
Вычисление конечных разностей
diff
Аппроксимация производных конечными разностями
gradient
Вычисление градиента функции
del2
Аппроксимация лапласиана
Вычисление минимумов и нулей функций
fmin
Вычисление минимума функции одной переменной
fmins
Вычисление минимума функции нескольких переменных
f zero
Нахождение нулей нелинейной функции одной переменной
Оптимизация
fminbnd
Scalar bounded nonlinear function minimization
fminsearch
Безусловная нелинейная минимизация функции многих переменных,
метод Нелдера-Мида
optimset
Создать/изменить опции оптимизации
optimget
Получить опции оптимизации
Аппроксимация и интерполяция данных
Алгоритмы
interpl
Одномерная табличная интерполяция
interplq
Быстрая одномерная интерполяция
680
В. Г. Потемкин. Вычисления в среде MATLAB
interp2
Двумерная табличная интерполяция
interp3
Трехмерная табличная интерполяция
interpn
N-мерная табличная интерполяция
interpft
Аппроксимация периодической функции
griddata
Интерполяция на неравномерной сетке
griddata3
Трехмерная интерполяция на неравномерной сетке
griddatan
N-мерная интерполяция на неравномерной сетке
pchip
Интерполяция кусочно-гладкими кубическими полиномами Эрмита
(Piecewise Cubic Hermite Interpolating Polynomial - PCHIP)
ppval
Аппроксимация кусочно-гладкими полиномами
spline
Интерполяция кубическим сплайном
Геометрический анализ данных
Алгоритмы
delaunay
Триангуляция Делоне
delaunay3
Трехмерная триангуляция Делоне
delaunayn
N-мерная триангуляция Делоне
dsearch
Триангуляция Делоне для ближайшей точки
dsearchn
N-мерная триангуляция Делоне для ближайшей точки
tsearch
Поиск наилучшей триангуляции
tsearchn
Поиск наилучшей N-мерной триангуляции
convhull
Вычисление выпуклой оболочки
convhulln
Вычисление N-мерной выпуклой оболочки
voronoi
Вычисление диаграммы Вороного
voronoin
Вычисление N-мерной диаграммы Вороного
inpolygon
Истинно, если точка внутри полигона
rectint
Область пересечения прямоугольника
polyarea
Область многоугольника
Решатели дифференциальных уравнений
Обыкновенные дифференциальные уравнения (ОДУ)
odell3
Нежесткие ОДУ, метод переменных состояний
odel5S’
Жесткие ОДУ, метод переменных состояний
ode23
Нежесткие ОДУ, метод низкого порядка
ode23 s
Жесткие ОДУ, метод Рунге-Кутты 3-го порядка
ode23t
Умеренно жесткие ОДУ и смешанные дифференциально-алгеб¬
раические уравнения (ДАУ), метод трапеций
ode23tb
Жесткие ОДУ, метод низкого порядка
ode45
Нежесткие ОДУ, метод Рунге - Кутты 4-го порядка
dde2 3
Решение ОДУ с запаздывающим аргументом
bvp4c
Решение ОДУ с двухточечными граничными условиями
Индексный указатель
681
Уравнения в частных производных первого порядка
pdepe
Решение уравнений параболического и эллиптического типов с на¬
чальными граничными условиями
Дескрипторная поддержка опций решателей
odeset
Создать/изменить опции ODE-решателя
odeget
Получить опции ODE-решателя
ddeset
Создать/изменить опции DDE-решателя
ddeget
Получить опции DDE-решателя
bvpset
Создать/изменить опции BVP-решателя
bvpget
Получить опции BVP-решателя
Формирование выходов решателя
deval
Решение дифференциального уравнения
odeplot
Формирование процессов как функций времени
odephas2
Двумерная фазовая плоскость
odephas3
Трехмерная фазовая плоскость
odeprint
Командное окно вывода на печать
bvpinit
Формирование начальных приближений для функции BVP4C
pdeval
Интерполяция решения, полученного с помощью функции PDEPE
Преобразование Фурье и корреляционный анализ сигналов
Преобразования Фурье
f f t
Одномерное дискретное преобразование Фурье
fft2
Двумерное дискретное преобразование Фурье
fftn
N-мерное дискретное преобразование Фурье
ifft
Обратное одномерное преобразование Фурье
if f t2 4
Обратное двумерное преобразование Фурье
if f tn
Обратное N-мерное преобразование Фурье
fftshift
Преобразование Фурье со сдвигом постоянной составляющей
ifftshift
Обратное преобразование Фурье со сдвигом постоянной состав¬
ляющей
Свертка и фильтрация
filter’
Дискретная одномерная фильтрация
filter2
Дискретная двумерная фильтрация
conv
Свертка одномерных массивов
conv2
Свертка двумерных массивов
convn
Свертка N-мерных массивов
deconv
Операция, обратная свертке (деление полиномов)
detrend
Удаление линейного тренда
682
В. Г. Потемкин. Вычисления в среде MATLAB
Корреляционный анализ
corrcoef
Вычисление коэффициентов корреляции
COV
Вычисление матрицы ковариаций
Графика
Задание осей координат
axis
Масштабирование и вывод осей координат
grid
Управление выводом сетки
hold
Управление режимом сохранения графического окна
subplot
Разбиение графического окна
zoom
Изменение масштаба в графическом окне
Надписи и пояснения к графикам
xlabel
Обозначение оси x
ylabel
Обозначение оси у
zlabel
Обозначение оси z
clabel
Маркировка линий уровня
colorbar
Шкала палитры
title
Заголовок графика
text
Добавление к текущему графику текста
gtext
Размещение текста на графике с помощью мыши
legend
Пояснение к графику
Создание твердой копии и сохранение графика
orient
Размещение твердой копии на странице
print
Вывод графика на печать или в файл
printopt
Задание опций печати по умолчанию
Двумерная графика
Элементарная графика
lot
График в линейном масштабе
loglog
График в логарифмическом масштабе
semilogx
График в полулогарифмическом масштабе по оси х
semilogy
График в полулогарифмическом масштабе по оси у
polar
График в полярных координатах
plotyy
График с двумя вертикальными осями
Специальная графика
area
Закраска областей графика
bar
Столбцовая диаграмма
barh
Столбцовая диаграмма с горизонтальным расположением
Индексный указатель
683
comet
Движение точки по траектории
compass
График векторов-стрелок, исходящих из начала координат
errorbar
График с указанием интервала погрешности
feather
График векторов-стрелок, исходящих из равноотстоящих точек
горизонтальной оси
fill
Закраска многоугольников
hist
Построение гистограммы
pareto
График результатов профилирования программы
pie
Круговая диаграмма
plotmatrix
График матрицы
quiver
График поля направлений
ribbon
Изображение линий на трехмерном графике
stairs
Ступенчатый график
stem
График дискретных значений
Трехмерная графика
Элементарная графика
plot3
Построение линий и точек в трехмерном пространстве
contour
Изображение линий уровня для трехмерной поверхности
contourc
Формирование массива описания линий уровней
contour3
Изображение трехмерных линий уровня
meshgrid
Формирование двумерных массивов X и Y
mesh
Трехмерная сетчатая поверхность
meshc
Трехмерная сетчатая поверхность с проекцией линий постоянного
уровня
meshz
Трехмерная сетчатая поверхность с плоскостью отсчета на нулевом
уровне
surf
Цветная сетчатая поверхность
surf c
Цветная сетчатая поверхность с проекцией линий постоянного
уровня
surf 1
Цветная сетчатая поверхность с подсветкой
Специальная графика
ЬагЗ
Трехмерная столбцовая диаграмма
bar3h
Трехмерная столбцовая диаграмма с горизонтальным расположе¬
нием
comet3
Движение точки по траектории в трехмерном пространстве
contourf
График линий уровня с раскрашенными областями
fill3
Раскраска многоугольников в трехмерном пространстве
pie3
Секторная диаграмма
quiver3
График поля направлений в трехмерном пространстве
slice
Сечения функции от трех переменных
684 В.Г Потемкин. Вычисления в среде MATLAB
stem3
График дискретных значений в трехмерном пространстве
trimesh
Трехмерная поверхность с треугольными ячейками
trisurf
Трехмерная сетчатая поверхность с треугольными ячейками
waterfall
Трехмерная поверхность без прорисовки ребер сетки
Управление свойствми графических объектов
Управление цветом
caxis
Установление соответствия между палитрой цветов
и масштабированием осей
colormap
Палитра цветов
colstyle
Выделить цвет и стиль для графика из заданного массива
pcolor
Палитра псевдоцветов
rgbplot
Изображение палитры
spinmap
Вращение палитры
hsv2rgb
Преобразование hsv-палитры в rgb-палитру
rgb2hsv
Преобразование rgb-палитры в hsv-палитру
shading
Затенение поверхностей
brighten
Управление яркостью
contrast
Палитра серого с повышенной контрастностью
hidden
Управление удалением невидимых линий
whitebg
Управление цветом фона
colordef
Определить схему цветов для графического объекта Figure
Палитры цветов
autumn
ъ
Палитра с оттенками красного и желтого
bone
Серая палитра с оттенком синего
colorcube
RGB-палитра с оттенками серого
cool
Палитра с оттенками голубого и фиолетового
copper
Линейная палитра в оттенках меди
flag
Палитра с чередованием красного, белого, синего и черного
gray
Линейная палитра в оттенках серого
hot
Палитра с чередованием черного, красного, желтого и белого
hsv
Палитра радуги
jet .
Разновидность hsv-палитры
lines
Палитра, определяемая свойством ColorOrder
Pink
Розовая палитра с оттенками пастели
prism
Палитра с чередованием красного, оранжевого, желтого, зелено¬
го, синего и фиолетового
spring
summer
Палитра с оттенками желтого и фиолетового
Палитра с оттенками желтого и зеленого
white
winter
Палитра белого
Палитра с оттенками голубого и зеленого
Индексный указатель
685
Управление подсветкой
diffuse
Эффект диффузного рассеяния
lighting
Управление подсветкой
material
Эффект рассеяния материала поверхности
specular
Эффект зеркального отражения
surfnorm
Построение нормалей к поверхности
Управление углом просмотра
view
Управление положением точки просмотра
viewmtx
Вычисление матрицы управления углом просмотра
rotate3d
Интерактивные повороты трехмерного объекта
Объемные тела
Объемные графические объекты
cylinder
Объемный цилиндр
ellipsoid
Объемный эллипсоид
patch
Закрашенный многоугольник
sphere
Объемная сфера
surf2patch
Преобразовать графический объект Surface в графический объект
Patch
Визуализация объемных тел
coneplot
Построить векторы скоростей в виде конуса трехмерного вектор¬
ного поля
contourslice
Построить линии постоянного уровня в сечениях объема
curl
Вычислить ротор и угловую скорость векторного ПОЛЯ
divergence
Вычислить дивергенцию векторного поля
flow
Функция скорости потока струи в бесконечном объеме
interpstreamspeed
Интерполировать линии тока, используя значения скорости потока
isocaps
Вычислить геометрию торца поверхности постоянного уровня
isocolors
Вычислить цвета вершин поверхности постоянного уровня
isonormals
Вычислить нормали в вершинах поверхности постоянного уровня
isosurface
Извлечь данные о поверхности постоянного уровня из описания
объемного тела
reducepatch
Редукция количества объектов Patch
reducevolume
Редукция количества элементов для описания объемного тела
shrinkfaces
Сокращение размеров объектов Patch
slice
Изобразить плоскости срезов в объеме
smooth3
Сглаживание данных по трем измерениям
stream2
Вычислить линии тока в двух измерениях
stream3
Вычислить линии тока в трех измерениях
streamline
Изобразить линии тока
686
В. Г. Потемкин. Вычисления в среде MATLAB
streampar tides
Изобразить частицы потока для объемных данных
streamribbon
Изобразить ленты потока для объемных данных
streamslice
Изобразить линии потока для объемных данных
streamtube
Изобразить струи потока для объемных данных
subvolume
Выделить подмножество из объемных данных
volumebounds
Возвратить предельные значения координат и цветов для объем¬
ных данных
Дескрипторная графика
Объекты дескрипторной графики
figure
Графический объект Figure
axes
Графический объект Axes
line
Графический объект Line
Rectangle'
Графический объект Rectangle
text
Графический объект Text
surface
Графический объект Surface
patch
Графический объект Patch
light
Графический объект Light
image
Графический объект Image
Создание и управление графическим окном
figure
Открыть графическое окно (команда)
gcf
Получить дескриптор графического объекта Figure
elf
Очистить графическое окно
shg
Показать графическое окно (для совместимости с версией 3.5)
close
Закрыть графическое окно
refresh
Обновить графическое окно
Создание и управление осями координат
axes
Создать оси координат (команда)
box
Окружить оси прямоугольником или параллелепипедом
cla
Очистить оси координат
gca
Получить дескриптор графического объекта Axes
hold •
Сохранить оси координат
ishold
Истинно, если оси координат сохранены
Операции над графическими объектами
set
Установить свойства графического объекта
get
Получить свойства графического объекта
reset
Восстановить штатные значения свойств
delete
Удалить графический объект
geo
Получить дескриптор текущего объекта
Индексный указатель
687
ginput
Снять координаты точки с помощью мыши
drawnow
Выполнить очередь задержанных графических команд
findall
Найти все графические объекты
allchild
Найти всех потомков графического объекта
findobj
Найти объекты с заданными свойствами
copyobj
Скопировать сам объект и порожденные им графические объекты
setappdata
Приписать данные графическому объекту
getappdata
Получить данные, приписанные графическому объекту
rmappdata
Удалить данные, приписанные графическому объекту
isappdata
Истинно, если данные приписаны графическому объекту
Утилиты
closereq
Запрос на закрытие графического окна
ishandle
Истинно, если это дескриптор
newplot
Восстановление штатных значений свойства NextPlot
Построение графиков для объектов INLINE и функций с дескриптором
ezplot
Построение графика функции
ezplot3
Построение параметрической кривой в трехмерном пространстве
ezpolar
Построение графика функции в полярных координатах
ezcontour
Построение линий уровня
ezcontourf
Построение закрашенных областей с линиями уровня
ezmesh
Построение трехмерных сетчатых поверхностей
ezmeshc
Построение трехмерных сетчатых поверхностей с линиями уровня
ezsurf
Построение трехмерных цветных сетчатых поверхностей
ezsurfc
Построение трехмерных цветных сетчатых поверхностей с линиями
уровня
fplot
Построение графика явной функции
Графический интерфейс пользователя (GUI)
Создание объектов GUI
uicontrol
Создать управляющий элемент (команда)
uimenu
Создать меню (команда)
uicontextmenu
Создать контекстное меню (команда)
Средства проектирования GUI
guide
Вызов интерактивного средства GUIDE
propedit
Редактор свойств
align
Средство выравнивания и расположения объектов
cbedit
Редактор ответных вызовов
menuedit
Редактор меню
688
В. Г. Потемкин. Вычисления в среде MATLAB
Диалоговые панели
dialog
Создание шаблона диалоговой панели
msgbox
Диалоговая панель сообщений
errordig
Диалоговая панель сообщения об ошибке
warndlg
Диалоговая панель предупреждения
helpdig
Диалоговая панель подсказки
inputdig
Диалоговая панель ввода
listdig
Диалоговая панель просмотра списка
questdig
Диалоговая панель вопроса
pagedlg
Диалоговая панель расположения страницы
printdig
Диалоговая панель печати
waitbar
Стандартная панель ожидания
uigetfile
Стандартная диалоговая панель открытия файла
uiputfile
Стандартная диалоговая панель записи файла
uisetcolor
Стандартная диалоговая панель выбора цвета
uisetfont
Стандартная диалоговая панель выбора шрифта
Операции над объектами GUI
gcbo
Получить дескриптор повторно вызываемого объекта
gcbf
Получить дескриптор повторно вызываемого графического окна
waitforbuttonpress
Ожидание нажатия кнопки клавиатуры или мыши
rbbox
Растянуть прямоугольник с помощью мыши
selectmoveresize
Выбор, перемещение, изменение размеров, копирование объек¬
тов с помощью мыши
dragrect
Переместить прямоугольник с помощью мыши
waitfor
Блокировать выполнение в ожидании события
uiwait
Блокировать выполнение в ожидании возобновления
uiresume
Возобновить выполнение после блокирования
Разное
Работа с графическими изображениями
Базовые операции
image
Вывод графического изображения
imagesc
Масштабирование и вывод графического изображения
imfinfо
Информация о структуре графического файла
imread
Read image from graphics file
imwrite
Write image to graphics file
im2java
Convert image to Java image
Индексный указатель
689
23 т. Зак. 3375
Утилиты
brighten
Brighten or darken color map
colorbar
Display color bar (color scale).
colormap
Color look-up table
contrast
Gray scale color map to enhance image contrast
gray
Linear gray-scale color map
Анимация и видеоклипы
Анимационные возможности
capture
Захват графической фигуры
getframe
Создать фрейм для анимации
moviein
Выделить память под фреймы анимации
movie
Выполнить анимацию
rotate
Вращение графического объекта
frame2im
Преобразование фрейма в графический образ
im2 frame
Преобразование графического образа в фрейм
Работа с объектами звука
Объекты звука
audioplayer
Windows audio player object
audiorecorder
Windows audio recorder object
Воспроизведение звука
sound
Озвучить одномерный массив чисел
soundsc
Масштабировать и озвучить одномерный массив чисел
wavplay
Play sound using Windows audio output device
wavrecord
Record sound using Windows audio input device
Утилиты
mu21in
Преобразование ц-кодированного сигнала в линейный
lin2mu
Преобразование линейного сигнала в ц-кодированный
Интерфейсы с ОС Windows (DDE и СОМ)
Интерфейс DDE
ddeadv
Установить консультативную связь
ddeexec
Послать строку на выполнение
ddeinit
Инициировать DDE-диалог
ddepoke
Послать данные в приложение
ddereq
Запросить данные от приложения
ddeterm
Завершить DDE-диалог
ddeunadv
Завершить консультативную связь
690
В. Г. Потемкин. Вычисления в среде MATLAB
Интерфейс ActiveX
actxcontrol
Создать элемент управления
actxserver
Создать локальный или удаленный сервер
activex
Конструктор интерфейса ActiveX
Индексный указатель
691
предметный указатель
", 462
/
/,462
А
ABS, 248, 255, 673
ACOS, 273, 672
ACOSH, 294, 672
ACOT, 283, 672
АСОТН, 305, 672
ACSC, 270, 672
ACSCH, 290, 672
activex, 690
actxcontrol, 690
actxserver, 690
addframe, 671
addpath, 663
AIRY, 316, 673
align, 687
ALL, 57, 664
and, 664,669
ANGLE, 249, 673
ans, 665
ANY, 57, 664
area, 682
ASEC, 276, 672
ASECH, 297, 672
ASIN, 266, 672
ASINH, 287, 672
ASSIGNIN, 121
ATAN, 280, 672
ATAN2, 280, 672
ATANH, 301,672
audioplayer, 689
audiorecorder, 689
autumn, 684
avifile/close, 671
aviinfo, 671
aviread, 671
aviwrite, 671
axes, 686
axis, 682
В
BALANCE, 491,676
bar, 682
bar3, 683
bar3h, 683
barh, 682
BASE2DEC, 47,678
BENCH, 231
BESSELH, 314,673
BESSELI, 311,673
BESSELJ, 309,673
BESSELK, 311, 673
BESSELY, 309, 673
BETA, 321, 673
BETAINC, 321, 673
BETALN, 321, 673
BICG, 580, 677
BICGSTAB, 584, 677
BIN2DEC, 45,678
BIT AND, 76,665
BITCMP, 76,665
BITGET, 74, 665
BITMAX, 75, 665
BITOR, 77, 665
BITSET, 75, 665
BITSHIFT, 78,665
BITXOR, 77,665
blanks, 678
bone, 684
box, 686
BREAK, 127, 669
BRIGHTEN, 684, 689
BUILTIN, 121
4ИЙИОГ/ИИ0И
692
bvp4c, 680
bvpget, 681
bvpinit, 681
bvpset, 681
C
CALENDAR, 85, 666
capture, 689
CART2POL, 306, 674
CART2SPH, 308, 674
cat, 667
caxis, 684
cbedit, 687
cd, 661
CDF2RDF, 486,676
cdfinfo, 671
cdfread, 671
CEIL, 244, 673
cell, 663, 668
cell2struct, 668
celldisp, 668
cellplot, 668
cellstr, 678
CGS, 588, 677
char, 663, 678
CHOL, 466, 675
choline, 677
CHOLINC, 566, 675
CHOLUPDATE, 467
cla, 686
clabel, 682
class, 668
clc, 662
clear, 662
elf, 686
clipboard, 670
CLOCK, 81,666
close, 686
closereq, 687
Cluster, 655
COLAMD, 553
COLMMD, 550, 677
colon, 669
colorbar, 682, 689
colorcube, 684
colordef, 684
colormap, 684, 689
COLPERM, 549, 677
colstyle, 684
comet, 683
comet3, 683
COMP AN, 520, 674
compass, 683
COMPLEX, 247, 673
computer, 662
COND, 456, 675
CONDEIG, 490, 675
CONDEST, 456, 544, 676
coneplot, 685
CONJ, 253, 673
CONTINUE, 669
CONTINUE, 128
contour, 683
contour3, 683
contourc, 683
contourf, 683
contourslice, 685
contrast, 684, 689
CONV, 512, 676, 681
conv2, 681
convhull, 680
convn, 681
cool, 684
copper, 684
copyfile, 661, 662
copyobj, 687
corrcoef, 682
COS, 271, 672
COSH, 292, 672
COT, 282, 672
COTH, 303, 672
cov, 682
CPLXPAIR, 254, 673
CPUTIME, 89, 666
cross, 674
CSC, 268, 672
CSCH, 289, 672
csvread, 670
csvwrite, 670
ctranspose, 665, 669
Предметный указатель
693
Ctrl+S, 662
cumprod, 679
cumsum, 679
cumtrapz, 679
curl, 685
cylinder, 685
D
DATE, 80, 666
DATENUM, 83, 666
DATESTR, 81, 666
DATETICK, 87, 666
DATEVEC, 84,666
DBCLEAR, 205, 670
DBCONT, 206, 670
DBDOWN, 208, 670
dblquad, 679
DBQUIT, 210, 670
DBSTACK, 207, 670
DBSTATUS, 208, 670
DBSTEP, 206, 670
DBSTOP, 204, 670
DBTYPE, 209, 670
DBUP, 208, 670
dde23,680
ddeadv, 689
ddeexec, 689
ddeget, 681
ddeinit, 689
ddepoke, 689
ddereq, 689
ddeset, 681
ddeterm, 689
ddeunadv, 689
deal, 668
deblank, 678
debug, 670
DEC2BASE, 46, 678
DEC2BIN, 45, 678
DEC2HEX, 46,678
DECONV, 513, 676, 681
del2, 679
delaunay, 680
delaunay3,680
delaunayn, 680
delete, 661, 662, 686
DELSQ, 617
demo, 663
depdir, 670
depfun, 670
DET, 454, 675
detrend, 681
deval, 681
DIAG, 340, 667
dialog, 688
diary, 661
diff, 679
diffuse, 685
dir, 661
DISP, 133
divergence, 685
dlmread, 670
dlmwrite, 670
DMPERM, 548, 677
doc, 663
dos, 661
double, 663, 678
dragrect, 688
drawnow, 687
dsearch, 680
dsearchn, 680
E
ECHO, 210, 662
EDIT, 639, 662
editpath, 663
EIG, 486, 675
EIGS, 600, 675
ELLIPJ, 327, 673
ELLIPKE, 329,673
ellipsoid, 685
end, 667
EOMDAY, 86,666
EPS, 43, 665
eq, 664, 669
ERF, 330, 673
ERFC, 330, 673
ERFCINV, 330
ERFCX, 330, 673
ERFINV, 330, 673
694
В. Г. Потемкин. Вычисления в среде MATLAB
ERROR, 171, 669
errorbar, 683
ERRORDLG, 141, 688
errortrap, 669
ETIME, 90, 666
ETREE, 607, 677
ETREEPLOT, 608, 677
EVAL, 117
EVALC, 117
EVALIN, 122
EXIST, 62
exit, 661
EXP, 259, 672
EXPINT, 334,674
EXPM, 505,675
EXPM1,5O5
EXPM2, 505
EXPM3, 505
EYE, 339,666
ezcontour, 687
ezcontourf, 687
ezmesh, 687
ezmeshc, 687
ezplot, 687
ezplot3,687
ezpolar, 687
ezsurf, 687
ezsurfc, 687
F
FACTOR, 238, 674
FACTORIAL, 242
fclose, 671
feather, 683
feof, 672
ferror, 672
FEVAL, 119
fft, 681
fft2, 681
fftn, 681
fftshift, 681
fgetl, 671
fgets, 671
fieldnames, 668
figure, 686
fileattrib, 661
filebrowser, 662
fileparts, 662
filesep, 661
fill, 683
fill3,683
filter, 681
filter2, 681
FIND, 535, 667,676
finddemo, 663
findobj, 687
findstr, 678
finfo, 670
fitsinfo, 671
fitsread, 671
FIX, 244,673
flag, 684
flipdim, 667
FLIPLR, 344, 667
FLIPUD, 345,667
FLOOR, 244, 673
flow, 685
fmin, 679
fminbnd, 679
fmins, 679
fminsearch, 679
fopen, 671
FOR...END, 124
for... end, 669
format, 662
fplot, 687
FPRINTF, 134, 671
frame2im, 689
fread, 671
frewind, 672
fscanf, 671
fseek, 672
ftell, 672
FULL, 536, 676
fullfile, 662
FUNM, 511,675
fwrite, 671
fzero, 679
Предметный указатель
695
G
GALLERY, 365, 674
cauchy, 369
chebspec, 370
chebvand, 372
chow, 373
circul, 376
clement, 377
compar, 379
condex, 382
cycol, 383
dorr, 385
dramadah, 385
fiedler, 388
forsythe, 389
frank, 390
gearmat, 392
grcar, 393
hanowa, 394
house, 395
invhess, 397
invol, 398
ipjfact, 400
jordblock, 403
kahan, 403
kms, 4Q6
krylov, 407
lauchli, 408
lehmer, 411
leslie, 412
lesp, 413
lotkin, 414
minij, 415
moler, 418
neumann, 420
orthog, 420
parter, 424
pie, 426
poisson, 427
prolate, 428
randcolu, 429
randcorr, 431
randhess, 432
rando, 433
randsvd, 434
redheff, 436
riemann, 437
ris, 439
smoke, 440
toeppd, 442
toeppen, 443
tridiag, 444
triw, 445
wathen, 447
wilk, 449
GAMMA, 318, 674
GAMMAINC, 318, 674
GAMMALN, 318, 674
gca, 686
gcbf, 688
gcbo, 688
GCD, 239, 674
gcf, 686
geo, 686
ge, 664, 669
genpath, 663
get, 686
getappdata, 687
getenv, 661
getfield, 668
getframe, 689
ginput, 687
GLOBAL, 108
gmr, 677
GMRES, 591, 677
GPLOT, 545, 677
gradient, 679
gray, 684, 689
grid, 682
griddata, 680
griddata3, 680
griddatan, 680
GSVD, 502
gt, 664, 669
gtext, 682
guide, 687
696
В. Г. Потемкин. Вычисления в среде MATLAB
н
HADAMARD, 347, 674
HANKEL, 348, 674
hdf, 671
hdfinfo, 671
hdfread, 671
hdftool, 671
help, 663
helpbrowser, 663
helpdesk, 663
HELPDLG, 143, 688
helpwin, 663
HESS, 494, 675
HEX2DEC, 46, 678
HEX2NUM, 48, 678
hidden, 684
HELB, 349, 674
hist, 683
hold, 682, 686
home, 662
horzcat, 665, 669
hot, 684
hsv, 684
hsv2rgb, 684
I
i, 666
IF...ELSE, 128
if...else; 669
ifft, 681
ifft2, 681
ifftn, 681
im2frame, 689
im2java, 688
imag, 673
IMAG, 252
image, 688
IMAGE, 686
imagesc, 688
imfinfo, 688
iminfo, 671
importdata, 670
imread, 688
imread, 671
imwrite, 688
imwrite, 671
ind2sub, 667
Indbl, 657
INF, 28, 666
inferiorto, 668
info, 663
inline, 664, 666
inline/argnames, 666
inline/char, 666
inline/formula, 666
inline/vectorize, 666
inmem, 662
inpolygon, 680
INPUT, 137, 671
INPUTDLG, 144, 688
INPUTNAME, 116
INPUTNAME, 669
Insert, 657
int2str, 678
interpl, 679
interp lq, 679
interp2, 680
interp3, 680
interpft, 680
interpn, 680
interpstreamspeed, 685
INTERSECT, 70, 665
INV, 465, 675
INVHILB, 349, 674
ipermute, 667
IS*, 59
isa, 668
isappdata, 687
iscell, 668
iscellstr, 678
ischar, 678
isdir, 661
isempty, 667
isequal, 667
isfield, 668
isfinite, 666
ishandle, 687
ishold, 686
isinf, 666
Предметный указатель
697
ISKEYWORD, 29
isletter, 678
islogical, 667
ISMEMBER, 64, 665
isnan, 666
isnumeric, 667
isobject, 668
isocaps, 685
isocolors, 685
isonormals, 685
isosurface, 685
ispc, 662
isprime, 674
isreal, 673
isspace, 678
ISSPARSE, 538, 677
isstruct, 668
isunix, 662
J
j, 666
jet, 684
Jord, 655
Jr_table, 656
Jrlyap, 659
Jstruct, 654
Jvec, 656
К
KEYBOARD, 138
kron, 664
L
LASTERR, 172, 669
LASTERROR, 172
LASTWARN, 169, 669
LCM, 240, 674
ldivide, 664, 668
le, 664, 669
legend, 682
LEGENDRE, 335, 674
length, 667
license, 663
light, 686
lighting, 685
lin2mu, 689
line, 686
lines, 684
linspace, 667
LISTDLG, 146, 688
load, 662,670
LOG, 261,672
LOGIO, 261,672
LOG2,42, 246, 261, 673
logical, 663, 667
loglog, 682
LOGM, 508, 675
logspace, 667
lookfor, 662
lower, 678
LSCOV, 484, 675
lsgr, 677
LSQNONNEG, 482
LSQR, 597
It, 664, 669
LU, 469, 675
luinc, 677
LUINC, 561, 675
M
MAGIC, 351, 674
mat2str, 678
material, 685
matlabpath, 662
matlabrc, 661
matlabroot, 661
max, 679
mean, 679
median, 679
MENU, 138
menuedit, 687
mesh, 683
meshc, 683
meshgrid, 667, 683
meshz, 683
methods, 668
MFILENAME, 175
min, 679
698
В. Г. Потемкин. Вычисления в среде MATLAB
MINRES, 574, 677
minus, 664, 668
MISLOCKED, 123
mkdir, 661
mldivide, 664, 668
MLOCK, 122
MOD, 245, 673
more, 662
movefile, 661
movie, 689
moviein, 689
mpower, 664, 668
mrdivide, 664, 668
MSGBOX, 140, 688
mtimes, 664, 668
mu21in, 689
MUNLOCK, 123
N
NaN, 28, 666
NARGCHK, 115,669
NARGIN, 112, 669
NARGOUT, 112, 669
NARGOUTCHK, 115
Nblock, 658
NCHOOSEK, 244, 674
ndgrid, 667
ndims, 667
ne, 664, 669
newplot, 687
nextpow2, 673
nnls, 675
NNZ, 539, 677
NONZEROS, 539, 677
NORM, 451,675
NORMEST, 453, 542, 676
not, 664, 669
NOW, 80, 666
NULL, 458, 675
num2cell, 668
num2str, 678
NUMGRID, 617
NZMAX, 539, 677
о
odel13, 680
odel5s, 680
ode23, 680
ode23s, 680
ode23t, 680
ode23tb, 680
ode45, 680
odeget, 681
odephas2, 681
odephas3, 681
odeplot, 681
odeprint, 681
odeset, 681
ones, 666
open, 662, 670
optimget, 679
optimset, 679
or, 664, 669
orient, 682
ORTH, 460, 675
P
pack, 662
PAGEDLG, 147, 688
pareto, 683
partialpath, 663
PASCAL, 354, 674
patch, 685, 686
path, 662
path2rc, 663
pathdef, 662
pathsep, 662
pathtool, 663
PAUSE, 117, 137
PCG, 571,677
pchip, 680
pcolor, 684
pdepe, 681
pdeval, 681
perl, 661
PERMS, 243, 674
permute, 667
PERSISTENT, 111
Предметный указатель
699
PI, 27, 666
pie, 683
pie3, 683
pink, 684
PINV, 480, 675
PLANEROT, 493, 676
plot, 682
plot3, 683
plotmatrix, 683
plotyy, 682
plus, 664, 668
POL2CART, 306, 674
polar, 682
poly, 676
POLY, 521,675
polyarea, 680
POLYDER, 514, 676
POLYEIG, 498, 675
POLYFIT, 515, 676
POLYINT, 515
POLYVAL, 518, 676
POLYVALM, 519, 676
POW2, 42, 247, 263, 673
power, 664, 668
ppval, 680
PRIMES, 239, 674
print, 682
PRINTDLG, 148, 688
printopt, 661, 682
prism, 684
prod, 679
PROFILE, 211,670
PROFREPORT, 212, 670
propedit, 687
PSI, 324
pwd, 661
Q
QMR, 594
QR, 473, 675
QRDELETE, 475, 676
QRINSERT, 477, 676
QRUPDATE, 478
quad, 679
quadl, 679
QUESTDLG, 149, 688
quit, 661
quiver, 683
quiver3, 683
qz, 675
QZ, 497
R
rand, 667
randn, 667
RANDPERM, 547, 677
RANK, 453, 675
RAT, 241, 674
RATS, 241, 674
rbbox, 688
RCOND, 456
rdivide, 664, 668
REAL, 252, 673
REALMAX, 44, 665
REALMIN, 44, 666
rectint, 680
reducepatch, 685
reducevolume, 685
refresh, 686
rehash, 663
REM, 245, 673
repmat, 667
reset, 686
reshape, 667
RESI2, 522
RESIDUE, 522, 676
RETHROW, 174
RETURN, 130, 669
rgb2hsv, 684
rgbplot, 684
ribbon, 683
rmappdata, 687
rmdir, 661
rmfield, 668
rmpath, 663
ROOTS, 520, 676
ROSSER, 355, 674
ROT90, 346, 667
rotate, 689
rotate3d, 685
700
В. Г. Потемкин. Вычисления в среде MATLAB
ROUND, 244, 673
RREF, 461,675
RSF2CSF, 495, 676
RUN, 116
S
save, 662, 670
saveas, 670
SCHUR, 495, 675
SEC, 275, 672
SECH, 296, 672
Select, 658
selectmoveresize, 688
semilogx, 682
semilogy, 682
set, 686
setappdata, 687
SETDIFF, 71, 665
setfield, 668
SETXOR, 73, 665
shading, 684
shg, 686
shiftdim, 667
shrinkfaces, 685
SIGN, 251,256, 673
SIN, 265, 672
single, 663
SINH, 285, 672
size, 667
slice, 683, 685
smooth3, 685
sort, 679
sortrows, 679
sound, 689
soundsc, 689
SPALLOC, 540, 677
SPARSE, 526, 676
SPAUGMENT, 615, 677
SPCONVERT, 537, 676
SPDIAGS, 528, 676
specular, 685
SPEYE, 531, 676
SPFUN, 540, 677
SPH2CART, 308, 674
sphere, 685
spinmap, 684
spline, 680
SPONES, 542, 677
SPPARMS, 611,677
SPRAND, 531, 676
SPRANDN, 531,676
SPRANDSYM, 533, 676
SPRANK, 544, 676
spring, 684
SPRINTF, 134, 678
SPY, 546, 677
SQRT, 257, 673
SQRTM, 509, 675
squeeze, 668
sscanf, 678
stairs, 683
std, 679
stem, 683
stem3, 684
str2mat, 678
str2num, 678
strcat, 678
strcmp, 678
stream2, 685
stream3, 685
streamline, 685
streamparticles, 686
streamribbon, 686
streamslice, 686
streamtube, 686
strjust, 678
strmatch, 678
stmcmp, 678
strrep, 678
strtok, 678
struct, 664, 668
struct2cell, 668
strvcat, 678
sub2ind, 667
subplot, 682
subsasgn, 669
subsindex, 665, 669
SUBSPACE, 460, 675
subsref, 665, 669
subvolume, 686
Предметный указатель
701
sum, 679
summer, 684
superiorto, 668
surf, 683
surf2patch, 685
surface, 686
surfc, 683
surf], 683
surfnorm, 685
SVD, 499, 675
SVDS, 606, 675
SWITCH...CASE, 131
SWITCH...CASE, 669
SYMAMD, 558
SYMBFACT, 613, 677
SYMMLQ, 577, 677
S YMMMD, 557, 677
SYMRCM, 556, 677
system, 661
T
Tab Completion, 662
TAN, 278, 672
TANH, 299, 672
tempdir, 661
tempname, 661
Test Matrix Toolbox
fv, 360
gersh, 361
ps, 362
pscont, 363
see, 359
text, 682, 686
textread, 670
TIC, 89, 666
times, 664, 668
title, 682
TOC, 89, 666
TOEPLITZ, 356, 674
TRACE, 456, 675
transpose, 665, 669
trapz, 679
TREELAYOUT, 609, 677
TREEPLOT, 610, 677
TRIL, 342, 667
trimesh, 684
triplequad, 679
trisurf, 684
TRIU, 343, 667
TRY... CATCH, 170
TRY...CATCH, 669
tsearch, 680
tsearchn, 680
type, 662
U
UICONTROL, 687
UIGETDIR, 151
UIGETFJLE, 152, 688
uiimport, 670
uimenu, 687
uintl6, 663
uint32, 663
uint64, 663
uint8, 663
UIPUTFILE, 153, 688
uiresume, 688
UISETCOLOR, 154, 688
UISETFONT, 155, 688
uiwait, 688
uminus, 664, 668
UNION, 68, 665
UNIQUE, 67, 665
unix, 661
unwrap, 673
uplus, 664, 669
upper, 678
V
VANDER, 357, 674
VARARGIN, 113, 669
VARARGOUT, 114, 669
ver, 663
version, 663
vertcat, 665, 669
view, 685
viewmtx, 685
volumebounds, 686
voronoi, 680
702
В. Г. Потемкин. Вычисления в среде MATLAB
w
WAITBAR, 157, 688
waitfor, 688
waitforbuttonpress, 688
WARNDLG, 142, 688
WARNING, 168, 669
waterfall, 684
wavinfo, 671
wavplay, 689
wavread, 671
wavrecord, 689
wavwrite, 671
web, 663
WEEKDAY, 86, 666
what, 662
whatsnew, 663
which, 662
WHILE...END, 126, 669
white, 684
whitebg, 684
who, 662
whos, 662
WILKINSON, 358, 674
winter, 684
wk 1 info, 670
wklread, 670
wk 1 write, 670
workspace, 662
X
xlabel, 682
xlsinfo, 670
xlsread, 670
XOR, 55, 664
Y
ylabel, 682
Z
zeros, 666
zlabel, 682
zoom, 682
Л
Логические операции, 54, 56
&, 54
&&, 56
|, 54
54
and, 54
not, 54
or, 54
M
Мнимая единица
I, 27
J, 27
О
Операции отношения
~=, 49
<, 49
<=, 49
= =, 49
>, 49
>=, 49
eq, 49
ge, 49
gt, 49
le, 49
It, 49
ne, 49
C
Специальные символы, 664
Предметный указатель
703
ЛИТЕРАТУРА
На русском языке:
1. Алберт А. Регрессия, псевдоинверсия и рекуррентное оценивание: Пер. с англ.
М.: Наука, 1977. 224 с.
2. Борисевич В. Д., Потемкин В. Г, Струнков С. П. Пакет прикладных программ
для решения систем нелинейных алгебраических уравнений от двух переменных:
Учеб, пособие. М: МИФИ, 1998. 52 с.
3. Воеводин В. В., Кузнецов Ю. А. Матрицы и вычисления. М.: Наука. Гл. редакция
физ.-мат. лит., 1984. 320 с.
4. Голуб Дж., Ван Лоун Ч. Матричные вычисления: Пер. с англ. М.: Мир, 1999. 548 с.
5. Дьяконов В., Круглов В. Математические пакеты расширения MATLAB: Специ¬
альный справочник. СПб.: Питер, 2001. 480 с.
6. Заде Л., Дезоер Ч. Теория линейных систем. Метод пространства состояний:
Пер. с англ. М.: Наука, 1970. 704 с.
7. Икрамов X. Д. Численное решение матричных уравнений. М.: Наука, 1984. 192 с.
8. Корн Г., Корн Т. Справочник по математике для научных работников и инжене¬
ров. М.: Наука, 1968. 720 с.
9. Кублановская В. Н. Метод решения полной проблемы собственных значений для
вырожденных матриц // Журнал вычислительной и математической физики. -
1968. Т. 6, №4. С.1-14.
10. Кублановская В. Н. Алгоритм АВ и его свойства // Численные методы и вопросы
организации вычислений. - 1980. Т. 102, №4. С.42-60.
11. Лавров К. Н., Цыплякова Т. П. Финансовая аналитика. MATLAB 6 /Под общ. ред.
В. Г. Потемкина. М.: ДиалогтМИФИ, 2001. 368 с. (Пакеты прикладных программ;
Кн. 3).
12. Лазарев Ю. Ф. MATLAB 5.x. Киев: Издательская группа BHV, 2000. 384 с.
13. Ланкастер П. Теория матриц: Пер. с англ. М.: Наука, 1978. 280 с.
14. Мартынов Н. Н., Иванов А. П. MATLAB 5.x. Вычисления, визуализация, про¬
граммирование. М.: КУДИЦ-ОБРАЗ, 2000. 336 с.
15. Медведев В.С., Потемкин В.Г. Control System Toolbox/ MATLAB 5 для студентов
/Под общ. ред. В.Г. Потемкина. М.: Диалог-МИФИ, 1999. 287 с. (Пакеты при¬
кладных программ; Кн. 1).
16. Медведев В. С., Потемкин В.Г. Нейронные сети. MATLAB 6 / Под общ. ред.
В. Г. Потемкина. М.: Диалог-МИФИ, 2002. 496 с. (Пакеты прикладных программ;
Кн. 4).
17. Потемкин В. Г. Алгоритм решения СНАУ на основе спектрального разложения
матричных пучков И Вестник Российской транспьютерной ассоциации. 1994,
№2(13). С.5-18.
/ШОГ/ИИ0И
704
18. Потемкин В. Г. Система инженерных и научных расчетов MATLAB 5.x: В 2 т.
Т. 1. М.: Диалог-МИФИ, 1999. 304 с.
19. Потемкин В. Г. Система инженерных и научных расчетов MATLAB 5.x: В 2 т.
Т. 2. М.: Диалог-МИФИ, 1999. 366 с. .
20. Потемкин В. Г. Введение в MATLAB. М.: Диалог-МИФИ, 2000. 247 с.
21. Потемкин В. Г. Инструментальные средства MATLAB 5.x. М.: Диалог-МИФИ,
2000. 336 с.
22. Потемкин В. Г. MATLAB 6: среда проектирования инженерных приложений.
М.: Диалог-МИФИ, 2003. 448 с.
23. Потемкин В. Г. Пакет программ JORD. http/Zwww.matlab.ru, 2003.
24. Рудаков П. И., Сафонов И. В. Обработка сигналов и изображений. MATLAB 5.x
/Под общ. ред. В. Г. Потемкина. М.: Диалог-МИФИ, 2000. 416 с. (Пакеты при¬
кладных программ; Кн. 2).
25. Уилкинсон, Райнш. Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра:
Пер. с англ. М.: Машиностроение, 1976. 390 с.
26. Энциклопедия кибернетики: В 2 т. Киев: Гл. редакция УСЭ, 1975. Т. 1. 607 с.; Т. 2.
623 с.
На английском языке:
27. [Ml] Abramovitz М., Stegun I. A. Handbook of Mathematical Functions. National Bu¬
reau of Standards, Applied Math. Series #55. Dover Publications, 1965. Есть русский
перевод: Справочник по специальным функциям с формулами, графиками и таб¬
лицами / Под ред. М. Абрамовича и И. Стигана. М.: Наука, Гл. редакция физ.-мат.
лит., 1979. 832 с.
28. AcklamP. J. MATLAB array manipulation tips and tricks. Oslo: University of Oslo,
Department of Mathematics, May 2000. 31 p. http://wvvw.math.uio.no/~jacklanV.
29. Amos D. E. "A Subroutine Package for Bessel Functions of a Complex Argument and
. Nonnegative Order". Sandia National Laboratory Report, SAND85-1018, May, 1985.
30. Amos, D. E., "A Portable Package for Bessel Functions of a Complex Argument and
Nonnegative Order," Trans. Math. Software, 1986.
31. Anderson E., Bai Z., Bischof C., Blackford S., Demmel J., Dongarra J., Du Croz J.,
Greenbaum A., Hammarling S., McKenney A., Sorensen D. LAP ACK User's Guide.
Third Edition, SIAM, Philadelphia, 1999: http://www.netlib.org/lapack/lug/ lapack lug.html
32. ANSI specification X3.159-1989: "Programming Language C," ANSI, 1430 Broadway,
New York, NY 10018.
33. Bai Z. A collection of test matrices for large scale nonsymmetric eigenvalue problems
(version 1.0). Manuscript. 1994.
34. Barrett R., et al. Templates for the Solution of Linear Systems: Building Blocks for It¬
erative Methods. SIAM, Philadelphia, 1994.
35. Bendel R. B., Mickey M. R. "Population Correlation Matrices for Sampling Experi¬
ments" Commun. Statist. Simulation Compute B7, 1978. P. 163-182.
Литература
705
36. Brawer R., Pirovino M. The linear algebra of the Pascal matrix. //Linear Algebra and
Appl. 1992. Vol. 174. P. 13-23.
37. Cody W. J. An Overview of Software Development for Special Functions //Lecture
Notes in Mathematics. Berlin, 1976. Vol. 506.
38. Davies P. I., Higham N. J. "Numerically Stable Generation of Correlation Matrices and
Their Factors", BIT, Vol. 40, 2000. P. 640-651.
39. Davis T. A. UMFPACK Version 4.0. User Guide. Dept, of Computer and Information
Science and Engineering, Univ. of Florida, Gainesville, FL, 2002.
http://www.cise.ufl.edU/research/sparse/umfpack/v4.0/UserGuide.pdf
40. Dongarra J. J., Bunch J. R., Moler С. B., Stewart G. W. UNPACK User's Guide. Phila¬
delphia, 1979.
41. 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 Labora¬
tory, Didcot, Oxon, UK. 1992. P. 84.
42. Forsythe G. E., Moler С. B. Computer Solution of Linear Algebraic Systems. Есть рус¬
ский перевод: Форсайт Дж., Моулер К. Численное решение систем линейных ал¬
гебраических уравнений. М.: Мир, 1969.
43. Freund R. W., Nachtigal N. М. QMR: A quasi-minimal residual method for non-
Hermitian linear systems. J. Numer. Math., 60, 1991, pp. 315-339.
44. Garbow B. S., Boyle J. M., Dongarra J. J., Moler С. B.. Matrix Eigensystem Routines -
EISPACK Guide Extension // Lecture Notes in Computer Science. Berlin, 1977.
Vol. 51.
45. Gear C. W. "A Simple Set of Test Matrices for Eigenvalue Programs", Math. Comp.,
Vol. 23 (1969), pp. 119-125.
46. George A., Liu J. The evolution of the minimum degree ordering algorithm // SIAM
Review. 1989. Vol. 31. P.1-19.
47. Gilbert J. R., Moler C., Schreiber R.« Sparse Matrices in MATLAB: Design and Imple¬
mentation // SIAM Journal on Matrix Analysis and Applications. 1992. Vol. 13. P. 333-356.
48. Golomb S. W., Baumert L. D. The search for Hadamard matrices // Amer. Math.
Monthly. Vol. 70, 1963. P.12-17.
49. Golub G. H., Van Loan C. F. Matrix Computations. Есть русский перевод: Го¬
луб Дж., Ван Лоун Ч. Матричные вычисления. М.: Мир, 1999. 548 с.
50. Golub G. Н., Wilkinson J. Н. Ill-conditioned eigensystems and the computation of
the Jordan canonical form, SIAM Review, 18(4), 1976. P.578-619.
51. Gover M. J. C. The explicit inverse of factorial Hankel matrices. Dept, of Mathematics,
University of Bradford, 1993.
52. Henrion D., Hromcik M., Kwakemaak H., Pejchova S., Sebek M., Strijbos Rens C. W.
Polynomial Toolbox Version 1.6. Tutorial. 1998: http://www.math.utwente.nl/polbox
53. Higham N.J. Fortran Codes for Estimating the One-Norm of a Real or Complex Matrix,
with Applications to Condition Estimation. ACM Trans. Math. Soft., 14,1988. P.381-396.
54. Higham N. J. The Test Matrix Toolbox for MATLAB (version 3.0) # Numerical Analy¬
sis Report. Manchester, 1995. Vol. 276.
706
В. Г. Потемкин. Вычисления в среде MATLAB
55. Higham N. J. Accuracy and Stability of Numerical Algorithms. Society for Industrial
and Applied Mathematics, Philadelphia, 1996.
56. Higham N. J., Tisseur F. A Block Algorithm for Matrix 1-Norm Estimation, with
an Application to 1-Norm Pseudospectra. SIAM Journal Matrix Anal. Appl., Vol. 21,
No. 4, 2000. P.1185-1201.
57. Kahan W. Numerical linear algebra. Canadian Math. Bulletin, 9, 1966. P. 757-801.
58. Kenney C., Laub A. J. Controllability and stability radii for companion form systems
//Math. Control Signals Systems. 1988. Vol. 1. P. 239—256.
59. Kagstrom B. RGSVD - an algoithm for computing the Kronecker structure and reduc¬
ing subspaces of singular A - X*B pencils. SIAM J.Sci.Stat.Comput., vol. 7, No. 1,
Jan. 1966. P. 185-211.
60. Kagstrom B., Ruhe A. An algorithm for numerical computation of the Jordan normal
form of a complex matrix. ACM Transactions on Mathematical Software. N. 6, №3,
1980. P. 398-419.
61. Knuth D. The Art of Computer Programming, Vol. 2, Addison-Wesley: Reading MA,
1973. Есть русский перевод: Кнут Д. Искусство программирования. В 3 т. Т. 2:
Получисленное программирование. М.: Мир, 1986.
62. Kostin V. I. Linear algebra algorithms with guaranteed accuracy // Technical Report
TR/PA/93/05, CERF ACS, Toulouse, France, 1993.
63. Lawson C. L., Hanson R. J. Solving Least Squares Problems. Есть русский перевод:
Лоусон Ч., Хенсон Р. Численное решение задач метода наименьших квадратов.
М.: Наука, 1986.
64. Lehoucq R. В., Sorensen D. С. Deflation Techniques within an Implicitly Restarted It¬
eration. SIAM Journal on Matrix Analysis and Applications. 17, 1996. P.789-821.
65. Lehoucq R. B., Sorensen D. C., Yang C. ARPACK Users' Guide: Solution of Large-
Scale Eigenvalue Problems with Implicitly Restarted Amoldi Methods, SIAM Publica¬
tions, Philadelphia, 1998.
66. MATLAB. The Language of Technical Computing. Getting Started with MATLAB.
The MathWorks, Inc., July 2002. 138 p.
67. MATLAB. The Language of Technical Computing. Release Notes for release 13.
The MathWorks, Inc., July 2002.43 p.
68. MATLAB. The Language of Technical Computing. Using MATLAB. Version 6.
The MathWorks, Inc., July 2002. 1177 p.
69. MATLAB. The Language of Technical Computing. Creating Graphical User Interfaces.
The MathWorks, Inc., July 2002. 184 p.
70. MATLAB. The Language of Technical Computing. MATLAB Function Reference.
Version 6. Volume 1: A:E. The MathWorks, Inc., July 2002. 695 p.
71. MATLAB. The Language of Technical Computing. MATLAB Function Reference.
Version 6. Volume 2: F:O. The MathWorks, Inc., July 2002. 824 p.
72. MATLAB. The Language of Technical Computing. MATLAB Function Reference.
Version 6. Volume 3: P:Z. The MathWorks, Inc., July 2002. 858 p.
Литература
707
73. Moler С. В. MATLAB’s magical mystery tour //The MathWorks Newsletter. 1993.
Vol. 7(1).
74. Moler C. Floating Points: IEEE standard unifies arithmetic model. The MathWorks,
Inc., Fall'96,1996. http://www.mathworks.com/company/newsletter/pdf/Fall96Cleve.pdf.
75. Moler С. B., Stewart G. W. An Algorithm for Generalized Matrix Eigenvalue Problems
// SIAM J. Numer. Anal. 1973. Vol. 10, No. 2..
76. Moler С. B., Van Loan. Nineteen Dubious Ways to Compute the Exponential of a Ma¬
trix // SIAM Review, 1979. Vol. 20. P. 801-836.
77. Moler C. Benchmarks - LINPACK and MATLAB. The MathWorks, Inc., SumFaH'94,
1994. http://www.mathworks.com/company/newsletter/pdf/SumFall94Cleve.pdf
78. Nash J. C Compact Numerical Methods for Computers: Linear Algebra and Function
Minimisation. 2nd edition, Adam Hilger, Bristol, 1990.
79. Oppenheim A. V., Schafer R. W. Digital Signal Processing. Prentice-Hall, 1975. P. 56-58.
80. Ostrowski A. M. On the spectrum of a one-parametric family of matrices, J. Reine
Angew. Math., 193 (3/4), 1954. P.143-160.
81. Paige С. C. Saunders M. A. Solution of Sparse Indefinite Systems of Linear Equations
H SIAM J. Numer. Anal., Vol.12, 1975. P.617-629.
82. Pothen A.,Chin-Ju Fan Computing the Block Triangular Form of a Sparse Matrix
// ACM Transactions on Mathematical Software, Vol. 16, No. 4, Dec. 1990. P. 303-324.
83. Pratt W. K. Digital Signal Processing. New York: John Wiley&Sons, 1978.
84. Ryser H. J. Combinatorial Mathematics. New York: John Wiley&Sons, 1963.
85. Saad Y., Schultz M. H. GMRES: A generalized minimal residual algorithm for solving
nonsymmetric linear systems // SIAM J. Sci. Stat. Comput., July 1986, Vol. 7, No. 3,
P. 856-869.
86. Saad Y. Iterative Methods for Sparse Linear Systems. PWS Publishing Company, 1996.
87. Smith В. T., Boyle J. M., Dongarra J. J., Garbow B. S., Ikebe Y., Klema V., Moler
С. B. Matrix Eigensystem Routines - EISPACK Guide // Lecture Notes in Computer
Science. Berlin, 1976. Vol. 6.
88. Sonneveld P. CGS: A fast Lanczos-type solver for nonsymmetric linear systems
// SIAM J. Sci. Stat. Comput., January 1989, Vol. 10, No. 1. P. 36-52.
89. Sorensen D. C. Implicit Application of Polynomial Filters in a к-step Amoldi Method
// SIAM Journal on Matrix Analysis and Applications. 13, 1992. P. 357-385.
90. Strang G. Introduction to Applied Mathematics. Wellesley-Cambridge, 1986.
91. Todd J., Basic Numerical Mathematics, Vol. 2: Numerical Algebra, Birkhauser, Basel
& Academic Press, New York, 1977.
92. Trefethen L.N. Pseudospectra of matrices, in D.F. Griffiths and G.A. Watson, eds, Nu¬
merical Analysis 1991, Proceedings of the 14th Dundee Conference, vol. 260, Pitman
Research Notes in Mathematics, Longman Scientific and Technical, Essex, UK, 1992.
P. 234-266.
93. Van der Vorst H. A. BI-CGSTAB: A fast and smoothly converging variant of BI-CG
for the solution of nonsymmetric linear systems // SIAM J. Sci. Stat. Comput., March
1992, Vol. 13, No. 2. P. 631-644.
708
В. Г. Потемкин. Вычисления в среде MATLAB
94. Wathen A.J. Realistic eigenvalue bounds for the Galerkin mass matrix // IMA J. Numer.
Anal., 7, 1987. P. 449-457.
95. Wilkinson J. H. Error analysis of direct methods of matrix inversion // J. Assoc. Com-
put. Mach., 8, 1961. P.281-330.
96. Wilkinson J. H. The Algebraic Eigenvalue Problem. Oxford, 1965. Есть русский пере¬
вод: Уилкинсон Дж. X. Алгебраическая проблема собственных значений.
М.: Наука, 1970.
97. Wilkinson J. Н. Singular-value decomposition - basic aspects, in D.A.H. Jacobs, ed.,
Numerical Software - Needs and Availability, Academic Press, London, 1978. P. 109-135.
98. Wilkinson J. H. Kronecker’s canonical form and QZ-algorithm // Lin. Alg. Appl. V. 28,
1979. P.285-303.
99. Wilkinson J. H. Rounding Errors in Algebraic Processes // Notes on Applied Science,
No. 32, Her Majesty’s Stationery Office, London, 1963.
100. Zhang Y. Solving Large-Scale Linear Programs by Interior-Point Methods Under the
MATLAB Environment // Technical Report TR96-01. Department of Mathematics and
Statistics, University of Maryland Baltimore County.
101. Zielke G. Report on test matrices for generalized inverses / /Computing. 1986. Vol. 36.
P. 105-162.
Литература
709
ОГЛАВЛЕНИЕ
ВВЕДЕНИЕ 3
1. ОРГАНИЗАЦИЯ ВЫЧИСЛЕНИЙ 10
1.1. ВВОД И РЕДАКТИРОВАНИЕ ОПЕРАТОРОВ 11
1.2. Выполнение М-файлов 19
1.3. Вывод РЕЗУЛЬТАТОВ ВЫЧИСЛЕНИЙ 22
2. ЯЗЫК MATLAB 24
2.1. Специальные символы, переменные и константы 24
Специальные символы 24
Переменные 25
Константы 26
Ключевые слова 29
2.2. Операторы языка MATLAB 30
2.3. Арифметические операторы 30
Операции над массивами 30
Операции над матрицами 32
Операции над объектами 36
Характеристики арифметики с плавающей точкой 38
2.4. Операторы отношения и логические операторы 48
Операции отношения 48
Логические операции 50
Функции истинности 57
2.5. Операторы обработки множеств 63
2.6. Операторы побитовой обработки 74
2.7. Вычисление дат, времени и интервалов 78
Функции вычисления дат, времени и интервалов 79
Время и даты 80
Преобразование форматов 81
День и дата 85
Интервалы времени 89
ЛИМОГ/ПИФИ
710
3. ПРОГРАММИРОВАНИЕ И ОТЛАДКА 91
3.1. Сценарии и функции 91
М-сценарии 91
М-функции 93
Практические рекомендации по оформлению М-файлов 96
3.2. Выполнение М-функций 98
Вызов М-функций 104
Операторы объявления переменных 108
Операторы исполнения М-функций 116
Операторы управления исполнением кода 123
Операторы организации циклов 124
Оператор условного перехода 128
Оператор переключения 131
3.3. Диалог с пользователем 132
Базовые операторы диалога 133
Диалоговые панели 139
3.4. Программирование ошибочных ситуаций 157
Предупреждения и сообщения об ошибках 157
Программирование предупреждений и сообщений 159
Операторы формирования предупреждений и сообщений 167
3.5. Отладка и профилирование М-файлов 175
Инструментальное средство Editor/Debugger 176
Сеанс отладки 180
Профилирование М-файлов 186
Режим графического интерфейса 187
Режим командной строки 197
Операторы отладки и профилирования 204
3.6. Эффективность вычислений в среде MATLAB 214
Источники повышения производительности 214
Тесты оценки производительности 226
4. МАТЕМАТИЧЕСКИЕ ФУНКЦИИ 238
4.1. Элементарные функции 238
Теоретико-числовые функции 238
Округление и модульная арифметика 244
Функции описания чисел с плавающей точкой 246
Функции описания комплексных чисел 247
Трансцендентные функции 255
Функции синуса 265
Функции косинуса 271
Функции тангенса и котангенса 278
Оглавление
711
Гиперболические функции 285
Функции гиперболического синуса 285
Функции гиперболического косинуса 292
Функции гиперболического тангенса и котангенса 299
Преобразования систем координат 306
4.2. Специальные функции 308
Функции Бесселя 309
Гамма-функция и родственные ей функции 318
Эллиптические функции и интегралы 327
Интегралы вероятностей 330
Интегральная показательная функция 334
Функции Лежандра 335
5. МАТРИЦЫ И ЛИНЕЙНАЯ АЛГЕБРА 339
5.1. Операции над матрицами как числовыми массивами 339
5.2. Коллекция матриц 347
Галерея тестовых матриц 359
5.3. Характеристики матриц 451
5.4. Решение систем линейных алгебраических уравнений 462
5.5. Вычисление собственных значений и сингулярных чисел 486
5.6. Вычисление функций от матриц.' 505
5.7. ПОЛИНОМЫ И ОПЕРАЦИИ НАД НИМИ 512
6. РАБОТА С РАЗРЕЖЕННЫМИ МАТРИЦАМИ 526
6.1. Элементарные разреженные матрицы 526
6.2. Преобразование разреженных матриц 535
6.3. Работа с ненулевыми элементами 538
6.4. Характеристики разреженной матрицы 542
6.5. Визуализация разреженных матриц 545
6.6. Алгоритмы упорядочения 547
6.7. Алгоритмы линейной алгебры 561
Факторизация разреженных матриц 561
Решение систем линейных уравнений 570
Симметрические положительно определенные матрицы 571
Симметрические произвольные матрицы 574
712
В. Г. Потемкин. Вычисления в среде MATLAB
Несимметрические квадратные матрицы 580 1
Прямоугольные матрицы 597
Вычисление собственных значений и сингулярных чисел 600
6.8. Операции над деревьями 607
6.9. Вспомогательные операции 611
ПРИЛОЖЕНИЕ 1. КОД М-ФУНКЦИИ DEC2BINVEC 620
ПРИЛОЖЕНИЕ 2. ТЕКСТОВЫЙ РЕДАКТОР EDITOR 621
Редактирование М-файлов 628
Оформление М-файлов 629
Перемещение по тексту М-файла 630
Настройка параметров редактора Editor 633
ПРИЛОЖЕНИЕ 3. КЛАСС ОБЪЕКТОВ POLYNOM 640
ПРИЛОЖЕНИЕ 4. ПАКЕТ ПРИКЛАДНЫХ ПРОГРАММ JORD 647
1. Теоретические предпосылки 647
1.1. Математические основы 647
1.2. Алгоритм 649
1.3. Оценка точности решения.. 653
2. Состав пакета 653
3. Пример использования и результаты проверки 660
ИНДЕКСНЫЙ УКАЗАТЕЛЬ 662
Операторы системы MATLAB 6.x 662
Команды общего назначения 662
Классы объектов 664
Функции вычисления времени и дат ." 667
Массивы и матрицы 667
Объектно-ориентированное программирование 669
Программирование и отладка М-файлов 670
Импорт и экспорт файлов 671
Операции ввода-вывода файлов 672
Язык программирования MATLAB 673
Математические функции 673
Линейная алгебра 675
Разреженные матрицы 677
Обработка строк 679
Алгоритмы обработки данных 680
Оглавление
713
Аппроксимация и интерполяция данных 680
Геометрический анализ данных 681
Решатели дифференциальных уравнений 681
Преобразование Фурье и корреляционный анализ сигналов 682
Графика 683
Двумерная графика 683
Трехмерная графика 684
Управление свойствми графических объектов 685
Объемные тела 686
Дескрипторная графика 687
Графический интерфейс пользователя (GUI) 688
Разное 689
Работа с графическими изображениями 689
Анимация и видеоклипы 690
Работа с объектами звука 690
Интерфейсы с ОС Windows (DDE и СОМ) 690
ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ 692
ЛИТЕРАТУРА 704
714
В. Г. Потемкин. Вычисления в среде MATLAB
„j и a a у j „j ;
e-mail: dialog@bitex.ru
http://www.bitex.ru/-dialog
j и z! a и ;□ a a a
21И/1ИОГ/ИИ0И
320-43-77, 320-43-55
факс: 320-31-33
□□qшышшсашошоашшашшшшошшшш
Предлагает книги
Авраамова О. Д.
Язык VRML. Практическое руководство
Архипенков С. Я., Голубев Д. В., Максименко О. Б.
ХРАНИЛИЩА ДАННЫХ
РАЗРАБОТКА БИЗНЕС-ПРИЛОЖЕНИЙ В ЭКОНОМИКЕ НА БАЗЕ MS EXCEL.
Под ред. к. т. н. А. И. Афоничкина
Бартеньев О. В.
ФОРТРАН ДЛЯ ПРОФЕССИОНАЛОВ.
Математическая библиотека IMSL. В 3-х частях
Бартеньев О. В.
1С:ПРЕДПРИЯТИЕ: программирование для всех
Березин Б. И., Березин С. Б.
НАЧАЛЬНЫЙ КУРС С и С++
Ватолин Д., Ратушняк А., Смирнов М., Юкин В.
МЕТОДЫ СЖАТИЯ ДАННЫХ. Устройство архиваторов, сжатие
изображений и видео.
Вовк Е. Т.
PAGEMAKER 6.5. Самоучитель.- 2-е изд.
Гусева А. И.
Учимся программировать: PASCAL 7.0. Задачи и методы их решения. -
2-е изд., перераб. и доп.
Гусева А. И.
УЧИМСЯ ИНФОРМАТИКЕ. - 2-е изд., дополн. и испр.
Гусева А. И.
СЕТИ И МЕЖСЕТЕВЫЕ КОММУНИКАЦИИ. Windows 2000
a u xi La и a 2) a lu 715 „J и
w E-mail: dialog@bitex.ru. Http://www.bitex.ru/~dialog.
Тел.: 320-43-77, 320-43-55
Епанешников А., Епанешников В.
Программирование в среде TURBO PASCAL 7.0.
4-е изд., испр. и дополи.
Епанешников А., Епанешников В.
DELPHI. Проектирование СУБД
Лукин С. Н.
ТУРБО-ПАСКАЛЬ 7.0. Самоучитель для начинающих.
Лукин С. Н.
VISUAL BASIC. Самоучитель для начинающих
Лукин С. Н.
WORD и WINDOWS. Самоучитель для начинающих.
Практичекие советы
Маклаков С. В. Моделирование бизнес-процессов с AllFusion Process Modeler
(BPwin 4.1)
Маклаков С. В.
Создание информационных систем с AllFusion Modeling Suite
Низаметдинова Н. Н.
СОВРЕМЕННАЯ РУССКАЯ ПУНКТУАЦИЯ
Пильщиков В. Н.
Программирование на языке АССЕМБЛЕРА
Полищук В., Полищук А.
AUTOCAD 2002
Потемкин В. Г, MATLAB 6.
Среда проектирования инженерных приложений
Рашевская М. А.
CORELDRAW. Практическое руководство
Рудаков II. И., Финогенов К. Г.
ЯЗЫК АССЕМБЛЕРА: уроки программирования
Федоров А., Елманова Н.
Введение в OLAP-технологии Microsoft
Хейфец А. Л.
ИНЖЕНЕРНАЯ КОМПЬЮТЕРНАЯ ГРАФИКА. AutoCAD
716 ш шшшшшшшшшшшсаш
E-mail: dialog@bitex.ru. http://www.bitex.ru/~dialog.
Тел.: 320-43-77, 320-43-55
Финогенов К. Г.
WIN32. Основы программирования. Учебный курс
Фролов А. В., Фролов Г. В.
Язык С #, Самоучитель
Цисарь И. Ф., Нейман В. Г.
КОМПЬЮТЕРНОЕ МОДЕЛИРОВАНИЕ ЭКОНОМИКИ
Книги по MATLAB
Потемкин В. Г. Инструментальные средства MATLAB 5.x
Лавров К. Н., Цыплякова Т. П. Финансовая аналитика. MATLAB 6.
(Под общ. ред. к. т. н. В. Г. Потемкина)
Потемкин В. Г., Медведев В. С. Нейронные сети. MATLAB 6
Новые книги
Куправа Т. A. EXCEL. Практическое руководство
Полищук В. В., Полищук А. В. AutoCAD 2004.
Практическое руководство
Потемкин В. Г. Вычисления в среде MATLAB
Фомичев В. М. Дискретная математика и криптология
(курс лекций)
Черных И. В. SIMULINK: среда создания инженерных
приложений
Шумаков П.В. ADO.NET и создание приложений баз данных
в среде Microsoft Visual Studio.NET
шшшштшсашштсашшш 717 □□□□□□□□□□□□□□
E-mail: dialog@bitex.ru. Http://www.bitex.ru/~dialog.
Тел.: 320 -43- 77, 320-43-55
Адрес: Москва, ул. Москворечье,
дом 31, корп. 2
Проезд: м. Каширская (первый вагон из центра),
авт. 95,117, 275, 298, 738 (не экспресс), 740 и тролл. 71
до ост. "Институт МИФИ" (кинотеатр "Мечта")
МИФИ
шоссе
ш□ □ а□ □□ аш□ □ □ □□ 718 а ааааааааааааа
КНИГИ ИЗДАТЕЛЬСТВА "ЛИДАОГ-МИФИ"
МОЖНО ЗАКАЗАТЬ В ИНТЕРНЕТ-МДГДЗИНЕ OZON
ф
Интернет-магазин OZON (www.ozon.ru) -
лидер российской электронной коммерции
Предлагает выбрать и пробрести:
специальную и художественную литературу,
изданную российскими и зарубежными издательствами,
музыкальную и видео продукцию на различных носителях,
мультимедийные издания и компьютерные программы.
В постоянно пополняемом каталоге -
110 000 книг, 33000 видеокассет, 27 000 аудио CD и кассет,
6500 компьютерных программ и мультимедиа изданий,
2500 DVD и видео CD.
К Вашим услугам разделы
«РАРИТЕТЫ», «БИБЛИОФИЛ», «АНТИКВАРИАТ»,
«ИКОНЫ», «ДЕТСКИЙ МИР».
Экономьте время - делайте Ваш выбор.
Вы покупаете - мы доставляем!
УДОБНЫЕ СПОСОБЫ ОПЛАТЫ И ДОСТАВКИ.
Собственная курьерская служба OZONa доставляет заказы жителям Москвы
и Подмосковья, Санкт-Петербурга и Ленинградской области, Великого Новгорода,
Владивостока, Екатеринбурга, Казани, Калининграда, Нижнего Новгорода,
Новосибирска, Омска, Хабаровска. Кроме того, курьерская доставка осуществляется
в Израиле, Украине и во Франции.
Интернет-магазин OZON
www.ozon.ru
Россия, Москва, 117420, Наметкина, 10
Тел. (095) 363 99 25. Факс (095) 718 34 88
Много формул
и запутанные модели?
Можно проще!
Используйте мощь вашего компьютера
для моделирования и решения реальных задач!
4
Обратившись в SoftLine, вы в кратчайшие сроки
решите проблемы с научным программным
обеспечением.
Получив консультации менеджеров, вы
подберете все необходимые инструменты для
работы в вашей области.
Компания SoftLine поможет вам также в выборе
обучающих курсов и пригласит на регулярно
проводимые семинары по математическим и
статистическим пакетам.
scientific software
4-7 (095) 232-0023
www.softline.ru
RESEARCH
^'StatSoft
The MathVVbrks
matteoFt.
Hapiesoft
4^^ electronics
I Потемкин Валерий
Георгиевич
Доцент кафедры Автоматики Московского
fiHxeHepHO-0H3M4ecKoro института
государственного университета), кандидат
/технических наук. Автор книг по системе
1 MATLAB, начиная с момента зарождения
j системы. Первая его книга по системе
MATLAB 4.0 была выпущена в 1994 году
в издательстве МИФИ объемом 132 страницы
и тиражом 250 экземпляров. На ее основе
в 1997 году в издательстве ДИАЛОГ-МИФИ
вышла книга по системе MATLAB 5.0, тираж
которой уже составил 5000 экземпляров.
Именно это издание является наиболее
цитируемым, и оно послужило основой для
широкого распространения системы MATLAB
в нашей стране. Общий тираж книг, выпущенных
по системе MATLAB 5.x, превысил 12000
экземпляров.
ВЫЧИСЛЕНИЯ
Новый цикл книг по системе MATLAB
открылся книгой
«MATLAB 6: среда проектирования
инженерных приложений».
Выходящая в свет книга «Вычисления в
среде MATLAB»
является второй в этом цикле,
посвященном новому ядру системы
MATLAB.
Новая версия системы MATLAB 6.5
несет в себе существенные улучшения
даже по отношению к версии 6.1.
В нее включены новые компоненты и
выполнено обновление материала:
рабочий стол допускает одновременное
размещение всех инструментальных средств
системы MATLAB;
• улучшен графический интерфейс рабочего
стола;
• разработан ускоритель времени
исполнения JIT-Accelerator;
i возможности функции ezplot
распространены на объекты класса
inline;
• в состав специальных функций
включена дигамма-функция;
i тип данных sparse преобразован в
атрибут sparse;
обновлен раздел, связанный с
обработкой разреженных матриц;
существенно повышена эффектив¬
ность решения СЛАУ с треугольными
и ленточными матрицами.
ИЗДАТЕЛЬСТВО
<^ШОГИ1И0И
Тел.: 320-4377, 320-4355
Факс 320-3133
e-mail: dialog@bitex.ru
http://www.bitex.ru/~dialog