Текст
                    Л. Л. Голубева
А. Э. Малевич
Н. Л. Щеглова
ОМПЫОТЕРНАЯ
МАТЕМАТИКА
ЧИСЛОВОЙ ПАКЕТ
MATLAB
ЛАБОРАТОРНЫЙ
ПРАКТИКУМ

УДК 519.67-37 ББК 22.19 Г62 Рекомендовано Ученым советом механико-математического факультета 16 сентября 2008 г., протокол № 1 Рецензенты: доктор физико-математических наук, профессор А. П. Садовский; доктор технических наук, профессор В. А. Липницкий Голубева, Л. Л. Г62 Компьютерная математика. Числовой пакет MatLab : лаб. прак- тикум / Л. Л. Голубева, А. Э. Малевич, Н. Л. Щеглова. - Минск : БГУ, 2008.-171 с.: ил. ISBN 978-985-518-081-5. В лабораторном практикуме по одному из разделов дисциплины «Компь- ютерная математика», посвященному применению пакета MatLab, содержится необходимый теоретический материал, изложены и проиллюстрированы много- численными примерами методы решения основных типов задач, приведены упражнения для самостоятельной работы. Предназначено для студентов механико-математического факультета БГУ очной и заочной формы обучения, а также для всех, кто занимается научными исследованиями и инженерной работой, где требуется математика. УДК 519.67-37 ББК 22.19 ISBN 978-985-518-081-5 © Голубева Л. Л., Малевич А. Э., Щеглова Н. Л., 2008 © БГУ, 2008
Л. Л. Голубева А. Э. Малевич Н. Л. Щеглова ОМПЫОТЕРНАЯ МАТЕМАТИКА ЧИСЛОВОМ ПАКЕТ MATLAB Лабораторный практикум МИНСК БГУ 2008
СОДЕРЖАНИЕ ВВЕДЕНИЕ.............................................................3 ТЕМА 1. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB................................5 1.1. Структура системы MATLAB......................................5 1.2. Интерфейс пользователя........................................5 1.2.1. Командное окно...........................................7 1.2.2. Окно просмотра рабочего пространства....................13 1.2.3. Справочная система......................................14 1.2.4. Редактор-отладчик М-файлов..............................15 1.3. Лабораторный практикум № 1...................................15 1.3.1. Теоретические вопросы...................................15 1.3.2. Задания.................................................16 ТЕМА 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ.........................................18 2.1. Арифметические вычисления....................................18 2.2. Числа........................................................18 2.2.1. Рациональные числа......................................18 2.2.2. Комплексные числа.......................................19 2.2.3. Специальные числа.......................................20 2.3. Простейшие вычисления........................................21 2.3.1. Операторы...............................................21 2.3.2. Форматы представления данных............................22 2.3.3. Встроенные математические функции.......................22 2.4. Данные в MATLAB..............................................23 2.4.1. Типы данных.............................................23 2.4.2. Переменные..............................................24 2.4.3. Типы массивов...........................................26 2.5. Векторы......................................................27 2.5.1. Вектор-строки...........................................27 2.5.2. Специальные вектор-строки...............................29 2.5.3. Вектор-столбцы..........................................31 2.5.4. Вектор-функции..........................................33 2.5.5. Операции с векторами....................................34 2.6. Матрицы......................................................37 2.6.1. Создание матриц.........................................37 2.6.2. Специальные матрицы.....................................38
Содержание 169 2.6.3. Доступ к элементам матрицы.............................39 2.6.4. Преобразования матриц..................................42 2.6.5. Размеры матриц.........................................43 2.7. Операции над матрицами......................................44 2.7.1. Арифметические операции................................44 2.7.2. Операции отношения и логические операции...............45 2.7.3. Матричные функции......................................46 2.8. Текстовые строки............................................47 2.8.1. Простейшие операции со строками........................47 2.8.2. Массивы строк..........................................48 2.9. Структуры...................................................49 2.9.1. Создание структуры.....................................49 2.9.2. Функции для работы со структурами......................50 2.10. Массивы ячеек..............................................53 2.10.1. Создание массива ячеек................................53 2.10.2. Функции для работы с массивами ячеек..................54 2.11. Лабораторный практикум №2..................................56 2.11.1. Теоретические вопросы.................................56 2.11.2. Задания...............................................57 ТЕМА 3. ЭЛЕМЕНТЫ ПРОГРАММИРОВАНИЯ..................................67 3.1. Управление вычислением......................................67 3.1.1. Оператор условия if....................................68 3.1.2. Оператор переключения switch...........................69 3.1.3. Оператор цикла while...................................71 3.1.4. Оператор цикла for.....................................72 3.2. Лабораторный практикум № 3..................................74 3.2.1. Теоретические вопросы..................................74 3.2.2. Задания................................................75 ТЕМА 4. СЦЕНАРИИ, ФУНКЦИИ И ПЕРЕМЕННЫЕ.............................81 4.1. Типы М-файлов...............................................81 4.1.1. Сценарии...............................................81 4.1.2. Функции................................................82 4.1.3. Рекурсия...............................................86 4.1.4. Использование функции в качестве параметра.............87 4.2. Переменные и их область действия............................89 4.2.1. Глобальные переменные..................................89 4.2.2. Устойчивые переменные..................................90 4.3. Отладка М-функций...........................................91 4.4. Лабораторный практикум №4...................................92 4.4.1. Теоретические вопросы..................................92 4.4.2. Задания................................................92
170 Содержание ТЕМА 5. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ...................96 5.1. Правила создания класса......................................96 5.2. Лабораторный практикум № 5..................................97 5.2.1. Теоретические вопросы..................................97 5.2.2. Задания................................................98 ТЕМА 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА...................................102 6.1. Двумерная графика...........................................102 6.1.1. 2П-графики функций....................................103 6.1.2. Диаграммы и гистограммы................................ПО 6.1.3. Контурные графики.....................................114 6.1.4. Векторные поля........................................115 6.2. Трехмерная графика..........................................116 6.2.1. ЗП-графики функций и поверхностей.....................117 6.3. Оформление графиков функций.................................122 6.3.1. Управление видом графика..............................122 6.3.2. Изменение свойств линии...............................124 6.3.3. Надписи на графиках...................................125 6.4. Сохранение графических изображений..........................126 6.5. Лабораторный практикум № 6..................................127 6.5.1. Теоретические вопросы.................................127 6.5.2. Задания...............................................128 ТЕМА 7. ОСНОВЫ ДЕСКРИПТОРНОЙ ГРАФИКИ..............................132 7.1. Описание графических объектов...............................132 7.1.1. Иерархия графических объектов.........................132 7.1.2. Дескрипторы графических объектов......................133 7.1.3. Свойства графических объектов figure и axes...........137 7.1.4. Свойства по умолчанию графических объектов............137 7.2. Лабораторный практикум №7...................................142 7.2.1. Теоретические вопросы.................................142 7.2.2. Задания...............................................142 ТЕМА 8. ИМПОРТ И ЭКСПОРТ ДАННЫХ...................................145 8.1. Чтение/запись файлов разных форматов........................145 8.2. Протокол-файл...............................................146 8.3. Сохранение данных рабочего пространства.....................146 8.4. Низкоуровневый файловый ввод-вывод..........................148 8.4.1. Работа с именем файла.................................148 8.4.2. Работа с бинарными и текстовыми файлами...............149 8.5. Работа с графическими файлами...............................152 8.6. Лабораторный практикум № 8..................................153 8.6.1. Теоретические вопросы.................................153 8.6.2. Задания...............................................153
Содержание 171 ТЕМА 9. ГРАФИЧЕСКИЙ ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЯ.....................157 9.1. Интерактивный интерфейс..................................157 9.2. GUI и дескрипторная графика..............................158 9.2.1. Управляющие элементы...............................158 9.2.2. Основные свойства управляющих элементов............159 9.3. Среда GUIDE..............................................163 9.4. Лабораторный практикум № 9...............................164 9.4.1. Теоретические вопросы..............................164 9.4.2. Задания............................................164 ЛИТЕРАТУРА.....................................................167

ВВЕДЕНИЕ MATLAB® (MATrix LABoratory) - это высокоэффективная система инженерных и научных расчетов фирмы The MathWorks, Inc (USA). Вы- числения, визуализация и программирование в ней представлены в удоб- ной для работы среде, где задачи и решения выражены в знакомой мате- матической форме. Представление данных в виде массивов (матриц и векторов) обеспечивает пользователю широкие возможности решения задач, связанных с матрицами и матричными вычислениями, по сравне- нию с большинством языков программирования. Наиболее известные области применения системы MATLAB: • математические вычисления; • разработка алгоритмов; • сбор информации; • вычислительный эксперимент, имитационное моделирование, маке- тирование; • анализ данных, исследование и визуализация результатов; • научная и инженерная графика; • разработка приложений, включая создание графического интерфейса пользователя GUI. В практическом пособии, состоящем из девяти тем, излагаются ос- новы работы в среде MATLAB: Тема 1 - назначение и структура пакета MATLAB, графический ин- терфейс пользователя. Тема 2 - представление данных в виде массивов, матриц и векторов, вычисления арифметических выражений. Тема 3 - основные конструкции языка программирования MATLAB. Тема 4 - сценарии и функции, локальные и глобальные переменные. Тема 5 - основы объектно ориентированного программирования. Тема 6 - высокоуровневая графика. Тема 7 - графические объекты как элементы дескрипторной графики. Тема 8 - импорт и экспорт данных, организация работы с файлами. Тема 9 - создание приложений, оснащенных графическим интерфей- сом пользователя.
4 Введение По каждой теме приведены основные понятия, примеры, теоретиче- ские вопросы и практические задания. Перед тем как приступить к вы- полнению заданий, следует тщательно проработать все примеры, пред- ложенные в изучаемой теме. Предлагаемом практическое пособие в первую очередь адресовано студентам механико-математического и физического факультетов уни- верситета, но может использоваться студентами инженерно-технических специальностей, аспирантами, преподавателями, научными работниками и всеми, кто в той или иной степени связан с научными исследованиями и инженерной работой, где требуется математика. В настоящее время широко используется MATLAB версии 6.5, не- давно вышла версия 7.0.1 Service Pack 1. Для получения последней информации о MATLAB и других про- дуктах MathWorks обращайтесь к www.mathworks.com.
ТЕМА 1 НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB MATLAB - это интерактивная система, ориентированная на работу с матрицами, что позволяет эффективно решать многие вычислительные задачи, связанные с векторно-матричными формулировками. Поддерживая диалоговый интерактивный режим для выполнения простых вычислений и операций, современный MATLAB - это одновре- менно и операционная среда, и язык программирования, на котором мо- гут быть написаны программы, в том числе и сложные программы с раз- витым графическим интерфейсом. 1.1. Структура системы MATLAB Система MATLAB состоит из пяти основных частей: • среда разработки; • библиотека математических функций; • язык программирования; • высокоуровневая и дескрипторная графика; • интерфейс прикладного программирования. 1.2. Интерфейс пользователя Среда разработки - это набор инструментов и средств, которые помогают использовать функции и файлы MATLAB, а также поддержи- вают связь MATLAB с пользователем и другими приложениями. Среда разработки включает в себя рабочий стол MATLAB Desktop, браузеры справочной системы Help, файлов и поискового пути Search Path. Интерфейс рабочего стола MATLAB Desktop представляет собой графический интерфейс, содержащий следующие элементы (рис. 1.1): • несколько окон; • меню, пункты которого автоматически перенастраиваются в зависи- мости от того, какое окно является в данный момент активным;
6 Тем al. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB • кнопку Start для получения доступа к содержимому рабочей сре- ды, модулям Toolbox, справочной системе и демонстрационным программам; • панель инструментов с кнопками и раскрывающимся списком; • строку состояния. Меню изменяется, Используйте tab Просмотр и в зависимости от для перехода к изменение Перемещение Command Window за того, с чем вы Workspace Вызов текущей пределы рабочего стола. работаете. браузеру помощи. директории. Просматривайте или Нажмите Start для г ; Тяните за разделительную ямлтлгл „ выполняйте ранее \п оы строго доступа к полосу для изменения Вводите команды в „„„„„ил™., использовавшиеся команды .. , возможностям Matlab. размеров окон. командной строке Matlab. с помощью Command History. Рис. 1.1. Внешний вид рабочего стола MATLAB Desktop К окнам MATLAB Desktop относятся: • командное окно Command Window; • окно просмотра рабочего пространства Workspace Browser;
1.2. Интерфейс пользователя 7 • окно текущего каталога Current Directory; • окно истории команд Command History; • окно редактора-отладчика М-файлов M-file Editor/Debugger; • окна для работы с графикой Figures. Вспомогательные окна: • окно редактора массивов Array Editor; • диалоговое окно установки путей Set Path; • окно Launch Pad доступа к различным модулям Toolbox; • окно графического редактора Layout Editor для создания GUI; • окно просмотра справочной системы Help Browser. Окна рабочей среды самостоятельны, «склеены» между собой, мо- гут располагаться в виде вкладок или в виде отдельных окон. Технология Drag&Dock позволяет полностью перенастраивать внешний вид MATLAB Desktop по желанию пользователя. Если в MATLAB Desk- top отсутствуют некоторые окна, то в меню Desktop следует выбрать соответствующие пункты Command Window, Workspace, Current Directory, Command History, Launch Pad или выбрать пункт меню Desktop | Desktop Layout ► Default для восстановления настроек интерфейса MATLAB Desktop по умолчанию. 1.2.1. Командное окно Командное окно Command Window используется для работы в ин- терактивном режиме: для вычисления выражений, ввода данных, созда- ния переменных, вызова команд, функций, сценариев и вывода результа- тов их выполнения по типу вопрос - ответ (рис. 1.1). • Ввод команды или выражения осуществляется в командном окне Command Window только в строке, помеченной символом » при- глашения командной строки. • Завершение ввода команды и передача управления MATLAB для ее выполнения: клавиша <Enter>. • Подавление вывода результатов в командное окно: точка с запятой ; в конце любой команды. • Компактная форма вывода результатов: команда format compact.
8 Т е м a 1. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB • Повторное занесение в командную строку ранее введенной команды или выражения: клавиши < т > и <; >. • Перемещения по командной строке с выражением: клавиши <^>, <^>, <Home>, <End>. • Если после перемещения по рабочей области окна Command Window пропала командная строка с мигающим курсором, то следует нажать <Enter>. • Разбиение логической строки (не более 256 символов) на несколько физических строк: ввод трех идущих подряд точек и нажатие клави- ши <Enter>. Выполнение команды: нажатие на клавишу <Enter> в последней строке, не содержащей трех идущих подряд точек. • Прокрутка содержимого окна Command Window: клавиши клавиату- ры <PageUp>, <PageDown>, <Ctrl+Home>, <Ctrl+End> и полоса прокрутки (Scrollbar). • Очистка командного окна Command Window: команда » clc. • Дополнительные возможности просмотра и повторного вызова ранее введенных команд: окно истории команд Command History. Пример 1.1 Создать вектор-строку V = (5.1 6.2 -3.1 9.7). » V = [5.1 6.2 -3.1 9.7]; или: » V = [5.1, 6.2, -3.1, 9.7] V = 5.1 6.2 -3.1 9.7 Узнать размерность массива V. » ndims (V) ans = 2 » size(V) ans = 1 4
1.2. Интерфейс пользователя 9 Пример 1.2 Создать вектор-строку V из 6 идущих подряд натуральных чисел, начиная с 1. Вывести элементы массива V в командное окно. Прочитать содержимое второго элемента массива V. Удалить четвертый элемент. » V = 1:6 V = 1 2 3 4 5 6 » V(2) ans = 2 » V(4) = [] V = 1 2 5 6 Пример 1.3 Вычислить сумму вектор-столбцов а = 4 b = 7 к 7 » а = [1; 4; 7]; » Ь = [1.2; 4.4; 7.9]; » с = а + Ь Л1.2Л 4.4 7.9 с 1.2 8.4 14.9 Пример 1.4 Создать матрицу С = (0 1), £> = (-! -2 В D ' 7 » А = [12; 3 4];
10 Т е м a 1. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB » В = [3:5; 6:1:8]; » С = [01]; » D = [-1:-1:-3]; » F = [А В;С D] F = 1 2 3 4 5 3 4 6 7 8 0 1-1-2 -3 Вывести вторую строку матрицы F. » F(2,:) ans = 3 4 6 7 8 Удалить третий столбец матрицы F. » F(:,3) = [] F = 12 4 5 3 4 7 8 0 1-2-3 Пример 1.5 Создать матрицу 4x4- магический квадрат. » magic(4) ans = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 Пример 1.6 Построить графики функций sin(x), cos (2х) в одной системе координат. Аргумент х изменяется от -2л до 2л с шагом 0.01. » х = -2*pi : 0.01 : 2*pi; » у = sin(x);
1.2. Интерфейс пользователя 11 » plot(х, у, х, sin(-x).*cos(2*x)) После выполнения команд на экране появляется окно Figure 1 с графиками функций, изображенное на рис. 1.2. Рис. 1.2. Графики функций Такой же график будет получен, если две последние строки кода за- менить на следующий: » plot(x,[ sin(x); sin(-х).*cos(2*х)]) Пример 1.7 Введите команды » х=0:0.01:2*pi; » y=sin(x); » plot(х, у) Затем введите команды » z=cos (х); » plot(х, z) Наконец, введите команды
12 Т е м a 1. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB Т=[у; z] ; » plot(х, Т) Пример 1.8 Операции над матрицами: » а=[1 23] % создание вектор-строки а = 12 3 » Ь=[4 5 6] ; » а+Ь % поэлементное сложение векторов ans = 5 7 9 » а*Ь % матричное умножение ??? Error using ==> mtimes Inner matrix dimensions must agree. » a.*b % поэлементное умножение ans = 4 10 18 » b' % комплексно-сопряженное транспонирование ans = 4 5 6 » a*b' % матричное умножение ans = 32 Пример 1.9 Введите в командном окне следующие команды: » clear » area = pi*rA2 В чем ошибка? Теперь введите команды
1.2. Интерфейс пользователя 13 » г=2; » area = pi*rA2 Теперь введите команду » area = @(г) р±*г.Л2, которая создает функцию для вычисления площади круга. Определенная таким образом функция называется анонимной. Вызов: » s = area([2,3]) s = 12.5664 28.2743 1.2.2. Окно просмотра рабочего пространства • Рабочее пространство Workspace: специальная область памяти компьютера для хранения данных в течение сеанса работы MATLAB. • Окно Workspace Browser: просмотр данных. • Окно редактора массивов Array Editor: просмотр и редактирова- ние визуально представленных данных рабочего пространства. • Данные из рабочего пространства Workspace сохраняются и загру- жаются в MATLAB-формате. • Сохранение данных: save < File_name > <VariablesList>: » save - сохранение всех данных в стандартный файл (по умол- чанию MATLAB. mat); » save path\File_name - сохранение всех данных в указан- ный файл; » save path\File_name namel name2 - сохранение от- дельных переменных в указанный файл. • Загрузка данных: load < File_name > <VariablesList>: » load - загрузка данных из файла по умолчанию MATLAB . mat; » load file_name - загрузка из указанного файла; » load file_name namel name2 - чтение отдельных пере- менных из указанного файла. • Помощь: команды » help save или » help load. • Вывод списка всех переменных, входящих на данный момент в рабо- чее пространство Workspace: команда » who.
14 Т е м a 1. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB • Информация о размере и типе переменных: команда » whos. • Очистка рабочего пространства Workspace и удаление всех данных: команда » clear. • Удаление из рабочего пространства Workspace переменных с име- нами namel и name2: команда » clear namel name2. 1.2.3. Справочная система • Открытость кода встроенных функций MATLAB. • Полная справочная система с подробным описанием компонентов MATLAB, его структуры, встроенных функций и примерами. • Доступ из командной строки к кратким сведениям о встроенных функциях: - doc - запуск справочной системы по всем разделам MATLAB в отдельном окне Help; - help - вывод разделов встроенной справки в командное окно; - help group - обзор указанного раздела в командном окне. На- пример, » help el fun - обзор элементарных функций; - help function - описание указанной функции или команды в командном окне; - helpwin - запуск краткой справочной системы по разделам MATLAB в окне Help; - helpdesk - запуск справочной системы по всем разделам MATLAB в отдельном окне Help; - lookf or Key - поиск М-файлов по ключу; - demo - демонстрационные примеры в окне Help; - type <function> - просмотр текста М-файла. • Встроенные М-функции и команды MATLAB при вызове пишутся строчными буквами. Пример 1.10 » help for - получить справку об операторе цикла for; » help format - получить справку о форматах вывода данных.
1.3. Лабораторный практикум № 1 15 1.2.4. Редактор-отладчик М-файлов Назначение: создание, редактирование, отладка, сохранение и выпол- нение М-файлов (М-сценариев, М-функций). • Вызов: - главное меню File | New ► M-f ile, File | Open..., - команда » edit или команда » edit M-file_name. • Подготовка и запуск М-сценария из командного окна: - открыть редактор-отладчик М-файлов М-File Editor; - ввести код и сохранить его в файле MFile . m; - установить окно текущего директория Current Directory на подкаталог, где сохранен файл MFile .m; - в командном окне Command Window ввести команду » MFile. 1.3. Лабораторный практикум № 1 1.3.1. Теоретические вопросы 1. Назначение пакета MATLAB, версии. 2. Сравнение MATLAB с другими математическими пакетами. 3. Интерфейс пользователя пакета MATLAB. 4. Шесть основных компонент интерфейса пользователя MATLAB. 5. Модификация расположения окон интерфейса MATLAB. 6. Восстановление расположения окон интерфейса MATLAB. 7. Назначение окна Command Window. 8. Назначение окна Workspace Browser. 9. Назначение окна Current Directory. 10. Назначение окна Command History. 11. Назначение окна Figure. 12. Назначение окна M-f ile Editor. 13. Назначение Help & Demo. 14. Интерактивный режим работы. 15. Составные части командного окна. 16. Приглашающий символ командной строки. 17. Разделение логической команды на несколько физических строк. 18. Получение интерактивной справки. 19. Подавление вывода результата выполнения команды.
16 Т е м a 1. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB 20. Построение графика функции, нескольких функций. 21. Очистка командного окна. 22. Очистка рабочего пространства. 23. Сохранение данных рабочего пространства. 24. Загрузка данных рабочего пространства. 25. Вывод списка всех переменных рабочего пространства. 1.3.2. Задания Задание 1.1 Запустите MATLAB. Модифицируйте расположение всех открытых окон интерфейса пользователя MATLAB. Последовательно закройте все окна MATLAB Desktop, кроме командного окна Command Window. Восстановите настройки по умолчанию интерфейса MATLAB Desktop, выбрав пункт меню Desktop | Desktop Layout ► Def ault. Задание 1.2 Протестируйте пример «Traveling Salesman» из демонстраци- онной программы DEMO. В командной строке введите команду » help travel. Исследуйте результат выполнения этой команды. Затем введите команду » type travel и изучите код данного примера. Задание 1.3 Исследуйте результат выполнения команды » help help. Задание 1.4 В командной строке введите команду » help plot. Изучите способы построения графиков функций. Постройте график функции: а) у = — sin(3x)cos(2x); 4 ч V5 2 с) у = — X ; е sin(3x-5л/11)-л/8- Зя Ь) у = —--------; е“2+4 1Ч J8(x+0.17l)2 „ d) у = -хз--------— + 2л, 5 где переменная х изменяется в пределах от -Зя до Зя с шагом 0.01.
1.3. Лабораторный практикум № 1 17 Задание 1.5 В командной строке введите команду » help for. Изучите пра- вила организации цикла при помощи команды for. Организуйте цикл, вычисляющий факториал числа. Найдите значения 10!, 18!, 38!. Задание 1.6 Постройте графики функций 2sin(-5x), 3cos(0.2x) в одной системе координат. Переменная х изменяется от -6л до 6л с шагом 0.01. Задание 1.7 Напишите анонимную функцию, вычисляющую: а) объем цилиндра volum= pi*rA2*h.; b) площадь поверхности цилиндра; с) площадь поверхности правильного тетраэдра; d) площадь треугольника по формуле Герона. Задание 1.8 Полиномы Чебышева. Постройте графики шести функций, соот- ветствующих полиномам Чебышева, в одной системе координат. Значе- ние аргумента изменяется в пределах от -1 до 1 с шагом 0.01. Полиномы генерируйте в цикле. Определите, как будут храниться значения поли- номов. Рекурсивная формула определения полиномов имеет вид Tn(x) = 2x*Tn-i(x) -Тп_2 (х) ; Ti(x)=x; Т0(х)=1; Рис. 1.3. Графики полиномов Чебышева
ТЕМА 2 ДАННЫЕ И ВЫЧИСЛЕНИЯ Все данные в MATLAB представляются в виде массивов, использо- вание которых позволяет эффективно решать многие вычислительные задачи, связанные с векторно-матричными формулировками. 2.1. Арифметические вычисления Встроенные функции MATLAB позволяют находить значения раз- личных выражений. Команды для вычисления выражений имеют вид, свойственный всем языкам программирования высокого уровня. • При записи оператора с неявным присваиванием вида х + у резуль- тат присваивается автоматически создаваемой системой переменной с именем ans (ANS we г). • При записи оператора с явным присваиванием вида а = х + у ре- зультат присваивается переменной, стоящей слева от знака равенства. • Точка с запятой в конце любой команды подавляет вывод результатов на экран. • Переменные с результатом выполнения любого арифметического действия размещаются в рабочем пространстве. 2.2. Числа 2.2.1. Рациональные числа • Ввод в десятичной системе счисления. • Формат: [Знак] Число [Экспонента]: - знак: + или - число: минимально одна цифра; целочисленное или вещественное представление; - экспонента: е или Е перед целым числом.
2.2. Числа 19 • Представление в бинарной системе: 1 бит - знак; 11 бит - экспонента; 52 бита - мантисса. • Диапазон: - наименьшее положительное число: 1 • 2^“21°’ = 2.225074-10-308 - наибольшее число: (2-2“52)-2^10“^ =1.797693- 1О+308 . - (относительная) точность: 2 52 = 2.220446 • 10 lfi. Пример 2.1 » format short » format long » 1.2345е-78 » pi ans = ans = 1.2345е-078 3.14159265358979 » format long » realmax » format short » realmax ans = ans = 1 . 797693134862316e+308 1. 7977e+308 » format long » realmin » format long » intmax('uint64') ans = ans = 2.2250 7385850 72 01e-3 0 8 18446744073709551615 2.2.2. Комплексные числа • Представление: два рациональных числа через знак + или - . • Мнимая часть числа: символ i либо j. • Если мнимая часть числа равна нулю, то выводится только вещест- венное число. • Комплексные числа при умножении, делении и возведении в степень заключаются в круглые скобки. • Для вычисления комплексно-сопряженного числа применяется апост- роф, который следует набирать сразу за числом, без пробела.
20 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ • Возможно использование комплексных чисел в качестве аргументов встроенных элементарных функций. Пример 2.2 » sqrt(-l.O) ans = 0 + l.OOOOi » 0+5.6j ans = 0 + 5.6000i » 3+2i' ans = 3.0000 - 2.0000i » (2.+3i)*(3+5j) ans = -9.0000 +19.0000i » 5+0i ans = 5 » (l+5i+ 3+2i')' ans = 4.0000 - 3.0000i » sin(3i) ans = 0 +10.0179i » 1.2+3.4E5i ans = 1.2000e+000 +3.4000e+005i Пример 2.3 » sqrt(-1.0)*(2.+3i)*3-(7-1.5j)A2+(l+5i+ 3+2i')' ans = -48.7500 +9.0000i 2.2.3. Специальные числа • pi: число ti; • Inf: бесконечность (°°): - возникает при переполнении; - имеет знак. • NaN: нечисловое значение (Not a Number): - возникает при вычислениях с неопределенным результатом; - операции с NaN возвращают NaN.
2.3. Простейшие вычисления 21 Пример 2.4 » 1е309 ans = Inf » le308-Inf ans = -Inf » 1/lnf ans = О » Inf-Inf ans = NaN » Inf+NaN ans = NaN » 1/NaN ans = NaN » 1/0 Warning: Divide ans = Inf by zero » -1/0 Warning: Divide ans = -Inf by zero » 0/0 Warning: Divide ans = NaN by zero 2.3. Простейшие вычисления 2.3.1. Операторы • Операторы: +, . *, . . /, \, . \, Л, . Л, ', • Порядок операций: - возведение в степень Л; - умножение и деление *, /, \; - сложение и вычитание +, - слева направо. • Изменение порядка: (). Пример 2.5 » 5+4*3Л2 ans = » 3Л3Л3 ans = » 3Л(3Л3) ans = 41 19683 7.6256е + 012
22 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ » 10/2 ans = 5 » 10\2 ans = 0.2000 » -1\0 ans = О 2.3.2. Форматы представления данных • Вид, в котором выводится результат вычислений, зависит от формата вывода, установленного в MATLAB. • Переустановка формата: команда » format. • Выбранный формат сохраняется до переустановки другого формата. • Формат вывода действует только при отображении данных. • Компактная форма вывода результатов: команда format compact. • Если при отображении слишком большого или малого числа резуль- тат не укладывается в установленный формат short, то данный ре- зультат будет выведен в экспоненциальной форме. • При вводе десятичных дробей используется точка. • Информация о форматах: команда » help format. Пример 2.6 х = [—4/3 1.2345е-6] format short -1.3333 0.0000 format short e -1.3333e+000 1.2345e-006 format short g -1.3333 1.2345e-006 format long -1.33333333333333 0.00000123450000 format long g -1.33333333333333 1.2345e-006 format rat -4/3 1/810045 format + — + 2.3.3. Встроенные математические функции Встроенные математические функции MATLAB включают следую- щие элементарные функции: • без параметров: pi, i, j, eps, realmin, realmax;
2.4. Данные в MATLAB 23 • тригонометрические sin, asin, sinh, asinh. Аналогично для cos, tan, cot, sec, esc; • экспоненциальные: exp, log, loglO, log2, pow2, sqrt, nthroot, nextpow2; • комплексные: abs, angle, complex, conj, imag, real, isreal; • округления: fix, floor, ceil, round; • деления с остатком: mod, rem; • знака: sign. Обратите внимание • Имена функций набираются строчными буквами. • Аргументы функций заключаются в круглые скобки и разделяются запятыми. • Выходные параметры функций заключаются в квадратные скобки и разделяются запятыми или пробелами. • Список всех встроенных элементарных функций с их кратким описа- нием: команда » help el fun. • Список всех встроенных специальных математических функций (функции Бесселя, полиномы Лежандра, гамма-функции и т. д.) с их кратким описанием: команда » help speefun. 2.4. Данные в MATLAB 2.4.1. Типы данных • Все данные MATLAB являются массивами. • Размерность массивов не надо указывать явно. • Минимальная размерность массива 0 х 0 и может увеличиваться до требуемого значения динамически. • Типы данных: logical, char, int8, uint8, intl6, uintl6, int32, uint32, int64, uint64, single, double, cell, struct, function handle, user classes,java classes. • По умолчанию все числовые переменные считаются матрицами с комплексными числами.
24 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ • Вычисления выполняются с удвоенной точностью, поэтому большин- ство функций работают с массивами чисел удвоенной точности (dou- ble), а также со строками (char). • MATLAB использует целые числа для индексирования, а также для работы с графикой. • Индексы начинаются с 1. • Тип sparse предназначен для работы с разреженными матрицами. • Типы int*, uint* предназначены для обработки изображений и эффективного хранения данных в памяти. • Перечень встроенных типов данных: команда » help datatypes. 2.4.2. Переменные • Имя переменной начинается с буквы, содержит буквы, цифры и сим- вол подчеркивания. • Допустимы имена любой длины, но MATLAB идентифицирует их по первым 31 символам и различает верхний и нижний регистры. • Для того чтобы объявить переменную S и определить ее значение, достаточно в командной строке ввести команду » S = 12.47. MATLAB создаст для скалярной величины переменную в виде дву- мерного массива S размером 1x1, определит ее тип double, при- своит указанное значение и выведет результат в окно Command Window. • Переменная есть массив. Двумерный массив - это матрица, одномер- ный массив - это вектор-строка или вектор-столбец, скаляр - это мат- рица размером 1x1. Все массивы имеют размерность и валентность, которые изменяются динамически (увеличиваются или уменьшаются по мере необходимости). • Переменные в MATLAB не нужно предварительно описывать, указы- вая их тип и размерность. Все данные хранятся в виде массивов: чи- словые переменные (внутренний тип numeric), текстовые строки (char), ячейки (cell) и структуры (struct), при помощи которых создаются пользовательские объекты (user object). • Числовые массивы состоят из комплексных чисел с двойной точно- стью (тип double) и могут храниться в обычном (тип full) или в упакованном виде в случае разреженной матрицы (тип sparse).
2.4. Данные в MATLAB 25 • Существует несколько дополнительных форматов записи данных в файлы (int8, uint8,...), отличающихся количеством используемых байтов на единицу информации. • Для представления чисел на экране используются различные форматы вывода (команда format). • Для подавления вывода информации на экран в конце оператора ста- вится точка с запятой ;. • Зарезервированные имена: ans, pi, NaN, Inf, end. • Специальная переменная ans содержит результат последней выпол- ненной операции, если во введенной команде отсутствует операция присваивания результата «=». Переменную ans можно использовать в выражениях и командах. • Команда » clear очищает рабочее пространство Workspace. • Команда » clear namell name2 удаляет из рабочего простран- ства Workspace переменные с именами namel и name2. • Если в командной строке ввести имя переменной и нажать <Enter>, то в окне Command Window распечатается ее содержимое. • Команда » who возвращает в окне Command Window список всех переменных, содержащихся в Workspace. • Команда » whos возвращает список всех переменных, содержа- щихся в Workspace, с указанием их размерности, количества байт в памяти и класса (типа). • Команда » class (obj) возвращает класс объекта obj. • Команда »isa(obj, ' class_name') возвращает 1, если объ- ект obj принадлежит классу class_name или производному от него, и 0 в противном случае. Пример 2.7 » 1+18 ans = 19 » S = ans +7 S = 26 » S (2) = -4 S = 26 -4
26 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ » size(S) ans =1 2 » S(l) = [] S = -4 » size(S) ans =1 1 » S = 'This is MATLAB'; » size(S) ans =1 14 2.4.3. Типы массивов Массивы - основные объекты системы MATLAB, над которыми выполняются действия. Типы массивов: • одномерные массивы - векторы; • двумерные массивы - матрицы; • многомерные массивы - тензоры. Обратите внимание • Матрица - наиважнейший формат данных в MATLAB. • Создание матрицы - операция конкатенации [ ]. • Ввод элементов одной строки - через запятую , или пробел. • Ввод строк - через точку с запятой ;. • Скаляр - матрица (1x1). • Вектор может быть представлен вектор-столбцом (матрица (их 1)) или вектор-строкой (матрица (1 х п)). • Доступ к элементу - при помощи операции индексации (): - один индекс (порядковый номер элемента); - группа индексов, разделяемых запятыми (первый индекс - номер строки, второй - номер столбца, все остальные - номера страниц). • Индексация начинается с 1. • Последнее значение индекса - end. • Векторы, как правило, используются для циклов и индексов.
2.5. Векторы 27 • Элементы любого массива упорядочены по столбцам. • Способы создания массивов: - ввод поэлементно всех значений (операция индексации ()); - ввод полного списка элементов (операция конкатенации [ ]) для векторов и матриц; - операция формирования диапазона значений :; - присваивание значения самому последнему элементу массива; - встроенные функции генерации массивов. • Справка об элементарных матрицах и матричных манипуляциях: ко- манда » help elmat. Пример 2.8 » А=1 А = 1 » А(1,2)=2 А = 1 2 » А(2,1)=3 А = 1 2 3 О » а(4)=4 А = 1 2 3 4 2.5. Векторы 2.5.1. Вектор-строки Пример 2.9 Создание вектор-строки операцией конкатенации. Разделители эле- ментов строки - пробелы или запятые.
28 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ » VI = [103-5] VI = 1 0 3-5 » [-l,2+3j,5-41,4.5] ans = -1.0000 2.0000+3.0000i 5.0000-4.00001 4.5000 Создание вектор-строки поэлементно. » Ь(1)=1; Ь(2)=3; Ь(3)=-5; Ь(4)=2 Ъ = 13-52 Создание вектор-строки при помощи операции формирования диапазона значений. Первое число - начальное значение, второе - шаг, третье - ко- нечное значение. » V = 1 : 3 : 12 V = 1 4 7 10 Создание вектор-строки присваиванием значения последнему элементу. » V3 (3) = 9 V3 = 0 0 9 Создание вектор-строки операцией конкатенации двух строк. » v= [vi v3] V = 1 0 3 -5 0 0 9 Изменение существующего элемента. » V(3)=17 V = 1 0 17 -5 0 0 9 Изменение группы элементов. » V(5:7)=4 V =
2.5. Векторы 29 1 0 17 -5 4 4 4 Чтение несуществующего элемента. » V(9) ??? Index exceeds matrix dimensions. Запись несуществующего элемента. » V(9)=2 V = 10 17 -5 44402 Операция конкатенации. » V=[V 8 9] V = 10 17 -5 4440289 Удаление элемента или группы элементов операцией [ ]: » v(3) = [] V = 10 -5 4440289 » V([l 4 5]) = [] V = 0 -5 4 0 2 8 9 » V=l:15; » V([l:2:end])=[] v = 2 4 6 8 10 12 14 2.5.2. Специальные вектор-строки • a:s:b: операция формирования диапазона значений. Вектор [а, a + s, a + 2*s, a+n*s], где n=f loor ( (a-b)/s). Аналог: функция colon (a, s,b). • a: b = a: 1: b: операция формирования диапазона значений с шагом s = l. Аналог: функция colon (a,b). • linspace (а, Ь, п): генерация вектора из п значений арифметиче- ской прогрессии в пределах [ а, Ь].
30 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ • linspace(a,b)=linspace(а,Ь,100). • logspace (а, Ь, п): генерация вектора (1хп), значения которого изменяются с постоянным шагом в логарифмической метрике в пре- делах [10а, 10ь]. logspace (a, b) = logspace (а, Ь, 50). Пример 2.10 Создание вектор-строки операцией диапазона значений. » V=l:2:10 V = 1 3 5 7 9 » V=[l:5] V = 1 2 3 4 5 » V=[4.3:8.9] V = 4.3000 5.3000 6.3000 7.3000 8.3000 » V=[2.1:-0.3:1.1] V = 2.1000 1.8000 1.5000 1.2000 » V=[l:3 -5 6:-2:0] V = 123 -5 6 420 » V=l:5:2 V = 1 » V=l:-1 V = Empty matrix: l-by-0 Пример 2.11 » linspace(1, 2, 5) ans = 1 1.25 1.5 1.75 2
2.5. Векторы 31 Пример 2.12 » logspace(-1, 2, 5) ans = 0.1 0.56234 3.1623 17.783 100 Пример 2.13 Определение количества элементов, валентности и размера вектора при помощи встроенных функций: length - количество элементов; ndims - валентность; size- размер вдоль каждого из измерений. » VI = [103-5] VI = 1 0 3-5 » length(VI) ans = 4 » ndims(VI) ans = 2 » size(VI) ans = 1 4 Таким образом, вектор VI хранится в двумерном массиве VI размер- ностью 1x4 (одна строка и четыре столбца). 2.5.3. Вектор-столбцы Пример 2.14 Задание вектор-столбца операцией конкатенации. Элементы разде- ляются точкой с запятой. » si = [ 1; 3; -12] si = 1
32 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ 3 -12 Поэлементное задание вектор-столбца. Для каждого элемента указыва- ются два индекса. » Ь(1,1)=1; Ь(2,1)=3; Ь(3,1)=-45 Ъ = 1 3 -45 Создание вектор-столбца операцией конкатенации двух столбцов. » S =[sl; si] S = 1 3 -12 1 3 -12 Пример 2.15 Определение количества элементов, валентности и размера вектор- столбца при помощи встроенных функций. » si = [ 1; 3; -12]; » length(si) ans = 3 » ndims(si) ans = 2 » size(sl) ans = 3 1
2.5. Векторы 33 2.5.4. Вектор-функции • norm (V, р): р-норма вектора V: - norm(V,p): возвращает ||v|| = для 1 <= р <= оо; Р V к=1 - norm (V): возвращает norm (V, 2); - norm (A, inf): возвращает max (abs (V)); - norm (A, -inf): возвращает min (abs (V) ); • скаляры: min, max, sum, prod, mean, median; • векторы той же длины: sort, cumsum, cumprod, fix; • векторы другой длины: diff, find, unique; • справка: команда » help data fun. Пример 2.16 Округление элементов вектора в сторону нуля. » V=randn(1,5) *100 V = 29.4411 -133.6182 71.4325 162.3562 -69.1776 » Vl=fix(V) VI = 29 -133 71 162 -69 Сортировка вектора. » [S,I]=sort(VI) S = -133 -69 29 71 162 I = 2 5 13 4 Индексы положительных элементов. » ind=find(Vl>0) ind = 1 3 4
34 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ 2.5.5. Операции с векторами Все поэлементные операции применимы как к вектор-строкам, так и вектор-столбцам. Рассмотрим действие этих операций на примере двух векторов: » vl = [423]; » v2 = [3 -2 0]; Размеры векторов, к которым применяются поэлементные операции, должны совпадать. Пример 2.17 Нахождение суммы (+) и разности (-) двух векторов. » s = vl+v2 S = 7 0 3 Пример 2.18 Оператор . *: поэлементное умножение векторов. В результате по- лучится вектор той же длины, что и исходные, с элементами, равными произведению соответствующих элементов исходных векторов: » u = vl.*v2 u = 12 -4 0 Пример 2.19 Оператор . л: поэлементное возведение в степень: » u = vl.A3 U = 64 8 27 Показателем может быть вектор той же длины, что и возводимый в степень. При этом каждый элемент первого вектора возводится в сте- пень, равную соответствующему элементу второго вектора: » u = vl.Av2
2.5. Векторы 35 u = 64 0.2500 1 Пример 2.20 Оператор ./: поэлементное деление векторов одинаковой длины, при этом элементы первого вектора делятся на соответствующие элемен- ты второго вектора: » u = vl./v2 U = 1.3333 -1 Inf Оператор . \: обратное поэлементное деление элементов второго вектора на соответствующие элементы первого. » u = vl.\v2 U = 0.75 -1 0 Пример 2.21 К поэлементным относятся и операции с вектором и числом. Сло- жение вектора и числа прибавляет число к каждому элементу вектора: » u = vl+10 U = 14 12 13 То же самое справедливо и для вычитания. Пример 2.22 Поэлементное умножение вектора на число как справа, так и слева приведет к одинаковому результату: vl*10 = 10*vl. Делить при по- мощи знака / можно вектор на число: vl/Ю. Деление числа на вектор 10/vl приводит к сообщению об ошибке. Для деления числа на каж- дый элемент вектора используется операция . / » и = 10./vl U = 2.5 5 3.3333
36 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ или: » u =vl.\ 10 U = 2.5 5 3.3333 Пример 2.23 V.', V': транспонирование, комплексно-сопряженное транспони- рование. » V = [3+i; -2-2i; 10]; » V1=V' V = 3-li -2+2i 10 » V2=V.' V2 = 3+li -2-2i 10 Таким образом, операции 'и . ' над вещественными векторами приведут к изменению геометрии вектора: вектор-строка превратится в вектор-столбец и наоборот. Пример 2.24 Элементарные математические функции работают с массивами по- элементно. Так, в результате выполнения команд » х = -2*pi : 0.01 : 2*pi; » у = sin(x); » plot(х,у) MATLAB создаст два вектора по 1257 элементов (вектор х - значе- ний аргумента и вектор у - значений функции sin) и выведет график функции sin на экран. Пример 2.25 Матричное умножение двух векторов. » а = [12 3]; Ь = [4 5 6]; » а*Ь
2.6. Матрицы 37 ??? Error using ==> mtimes Inner matrix dimensions must agree. » a*b' ans = 2.6. Матрицы 2.6.1. Создание матриц Пример 2.26 Создание матрицы операцией конкатенации. Разделители элементов строки - пробелы или запятые, разделитель строк - точка с запятой. » А=[1 2 3; 4,5,6] А = 12 3 4 5 6 Создание матрицы как вектор-строки, каждый элемент которой яв- ляется вектор-столбцом. » А = [[1; 4] [2; 5] [3; 6]] 12 3 4 5 6 Создание матрицы поэлементно. » А(1,1) = 1; А(1,2) = 2; А(1,3) = 3; » А(2,1) = 4; А(2,2) = 4; А(2,3) = 6 А = 12 3 4 5 6 Создание матрицы присваиванием значения последнему элементу. » В(2,3)=1 В =
38 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ ООО 0 0 1 Создание матрицы операцией конкатенации матриц. Аналог функ- ций cat (1, Al, А2), cat (2, Al, А2). [0 00; 111]; » Al = [123; » A = [Al A2; 4 5 6] ; A2 = A2, Al] A = 1 2 3 0 0 0 4 5 6 1 1 1 0 0 0 1 2 3 1 1 1 4 5 6 Блок-матрицы. » All =[111 ; 111]; A12 = [2 2; 2 2]; » А21 = [3 3; 3 3; 3 3]; » А22 = [444; 444; 444]; » А =[[All А12; А21 А22], [5;5;5;5;5];[6 6 6 6 6 6]] А = 1 1 1 2 2 5 1 1 1 2 2 5 3 3 4 4 4 5 3 3 4 4 4 5 3 3 4 4 4 5 6 6 6 6 6 6 2.6.2. Специальные матрицы • [ ]: пустая матрица (0x0); • diag(X,k): создание диагональной матрицы или выделение диаго- нали; • eye (m, n): (m х п)-матрица с единицами на главной диагонали; • gallery (...): функция, позволяющая получать более пятидесяти стандартных матриц; • eye (m, n): (m х п)-матрица с единицами на главной диагонали;
2.6. Матрицы 39 • hilb(n): (n x п)-Гильбертова матрица с элементами l/(i+j-1); • magic (n): (их п)-матрица магического квадрата с числами от 1 до п2; • ones (m, n): (m х п)-матрица из единиц; • rand(m,n): (m х п)-матрица случайных чисел со значениями из ин- тервала [0, 1]; • randn(m,n): (m х п)-матрица равномерно распределенных случай- ных чисел; • tril (X, к): выделение нижней треугольной части матрицы X; • triu (X, к): выделение верхней треугольной части матрицы X; • zeros (m, n): (m x п)-матрица из нулей. Пример 2.27 » А=[] А = [] » eye(2,3) ans = 10 0 0 10 » magic(3) ans = 8 16 3 5 7 4 9 2 » diag([1 2 3]) ans = 10 0 0 2 0 0 0 3 » triu(magic(3)) ans = 8 1 6 0 5 7 0 0 2 » rand(3) ans = 0.9501 0.4860 0.4565 0.2311 0.8913 0.0185 0.6068 0.7621 0.8214 2.6.3. Доступ к элементам матрицы • Доступ к элементу - при помощи операции индексации (): - один индекс (порядковый номер элемента); - группа индексов, разделяемых запятыми (первый индекс - номер строки, второй - номер столбца).
40 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ • Первое значение индекса - 1, последнее значение - end. Отрицатель- ное или нулевое значение индекса приводит к сообщению об ошибке. • В качестве индекса может задаваться вектор. • : - краткая форма записи 1: end. • Чтение несуществующего элемента: сообщение об ошибке. • Запись несуществующего элемента: недостающие элементы заполня- ются нулями. • В памяти компьютера элементы матрицы хранятся по столбцам. А = Ч 2 3^ 4 5 6 7 8 9 \ 7 => А = ^12 <*13 ^21 ^22 ^23 fl31 6Z32 6Z33 j => A = ' ar я4 а-,л °з 6z6 a9 Пример 2.28 » А = [11:19; 21:29] А = 11 12 13 14 15 16 17 18 19 21 22 23 24 25 26 27 28 29 » А(2,4) ans = 24 » А(8) ans = 24 » А(1:2:end) ans = 11 12 13 14 15 16 17 18 19 » А(:,2) ans = 12 22 » А(:, [2 6 4]) ans
2.6. Матрицы 41 12 16 14 22 26 24 » А(:,1:2 :end) ans = 11 13 15 17 21 23 25 27 » А(2,:) ans = 21 22 23 24 » А(:,5:end-l) = [] А = 11 12 13 14 21 22 23 24 19 29 25 26 27 28 29 19 29 » A(l:3,2:3) = ones(3,2) А = 11 1 1 14 19 21 1 1 24 29 0 110 0 » А = А([1 3],[5 1]) А = 19 11 0 0 » А(3,3) ??? Index exceeds matrix dimensions. » A(3,3) = 100 A = 19 11 0 0 0 0 0 0 100
42 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ 2.6.4. Преобразования матриц • А.', А': транспонирование, комплексно-сопряженное транспониро- вание. Аналог функций transpose (А), ctranspose (А). • А (:): преобразование матрицы в вектор-столбец. • diag(A,k): создание диагональной матрицы или выделение диаго- нали. • f liplr (А), f lipud (А), rot90 (А): отражение, поворот. • reshape (A, rn, cn): (гп хсп) матрица из А. Элементы выбирают- ся последовательно по столбцам. • repmat (A, rb, cb): (rbxcb) блок-матрица из матрицы А. • tril (A, k), triu (А, к): выделение нижней или верхней треуголь- ной части матрицы А. Пример 2.29 » А=[1:3] А = 12 3 » А(2, :) =А+3 А = 12 3 4 5 6 » А([3 4] ,:)=А+6 А = 12 3 4 5 6 7 8 9 10 11 12 » fliplr(А) ans = 3 2 1 6 5 4 9 8 7 12 11 10 » flipud(А) ans = 10 11 12 7 8 9 4 5 6 1 2 3
2.6. Матрицы 43 » rot90 (А) » reshape(А,2,6) ans 3 6 9 12 ans 1 7 2 8 3 9 2 5 8 11 4 10 5 11 6 12 1 4 7 10 » tril(A,-l) » repmat(А,1,2) ans = ans = 0 0 0 1 2 3 1 2 3 4 0 0 4 5 6 4 5 6 7 8 0 7 8 9 7 8 9 10 11 12 10 11 12 10 11 12 » diag([1,2,3],-2) » diag(A,-2) ans = ans = 0 0 0 0 0 7 0 0 0 0 0 11 1 0 0 0 0 0 2 0 0 0 0 0 3 0 0 2.6.5. Размеры матриц • size (A): вектор с количеством строк и столбцов матрицы А. • size (А, к) : к=1: количество строк, к=2: количество столбцов. • [г, с] =size (А): количество строк в г, количество столбцов в с. • length (А): возвращает max (size (А) ) или 0 для пустой матрицы. Пример 2.30 » А = ones(3,5); » size(А) ans = 3 5 » [г, с]=size(А) г = » size(А,2) ans = 5 » length(А) ans = 3 5
44 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ с 5 2.7. Операции над матрицами 2.7.1. Арифметические операции • . л: поэлементные операторы сложения, вычита- ния, умножения, деления и возведения в степень. Если один из опе- рандов - скаляр, то он воздействует на каждый элемент другого опе- ранда; • А+В: матричное сложение, аналог А. +В; • A-В: матричное вычитание, аналог А. -В; • А*В: матричное умножение (по правилу «строка на столбец»); • Алп: n-кратное матричное умножение; • Х=В/А: левостороннее деление, решение системы линейных уравне- ний ХА=В; • Х=А\В: правостороннее деление, решение системы линейных уравне- ний АХ=В; • А. ': транспонирование матрицы; • А': комплексно-сопряженное транспонирование матрицы. Пример 2.31 » А = [12; 34]; В=еуе(2); » А+1 ans = 2 4 » А.*3 ans = 3 9 12 » А.л3 ans = 1 27 64 » А*А ans = 7 15 10 22 »Х = А\В X = -2.0 1.0 1.5 -0.5 » А. ' ans = 1 2 3 5 3 4
2.7. Операции над матрицами 45 » А+В ans = 2 3 » А.*А ans = 2 1 4 5 9 16 » А./В Warning: by zero, ans = 1 Inf Divide Inf 4 2.7.2. Операции отношения и логические операции • >, >=. <, <=. ==, ~=: операторы отношения, аналоги функций gt, де, It, le, eq, пе. Поэлементные сравнения матриц одинакового разме- ра. Скаляр сравнивается с каждым элементом массива. Результат - логическая матрица. • Операции ==, ~= проводят сравнения вещественных и мнимых час- тей комплексных чисел, а операции >, <, >=, <= - только вещест- венных частей. • &, |, логические операторы, аналоги функций and, or, not, xor. • find: выделение части массива, элементы которого удовлетворяют определенному условию. • isempty, isfinite, isinf, isnan, isprime, isreal: по- строение логических матриц в зависимости от выполнения условия. Пример 2.32 » А = [01; 23]; В=еуе(2); » А<=В ans = 1 0 0 0 » А&В ans = 0 0 0 1 » isprime (А) ans = 0 0 1 1 » A(find((А>2) | (А<1)))= 9 А = 9 2 3 9
46 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ 2.7.3. Матричные функции • sum, prod: сумма (произведение) всех элементов вектора; сумма (произведение) элементов каждого столбца/строки матрицы; • max, min: максимальный (минимальный) элемент вектора; макси- мальный (минимальный) элемент в каждом столбце/строке матрицы; • sort: сортировка, действие аналогично предыдущим функциям; • all: проверка на наличие нулевого элемента в массиве; • any: проверка на наличие ненулевого элемента в массиве; • find: нахождение индексов и значений ненулевых элементов; • spy: визуализация ненулевых элементов матрицы; • norm (М): норма матрицы; • скаляр: rank, det, trace, cond; • вектор: poly, eig, cumprod, fix, min, max, sum, prod; • матрица: inv, pinv, null; • несколько матриц: eig, lu, qr, svd; • справка: команда » help mat fun. Пример 2.33 » A = [2 » min (A) 8 4; 7 3 9]; В = [7 1 1; 4 4 0]; » min (A, [] , 1) ans = 2 3 4 ans = 2 3 4 » min (A, ans = 2 3 » min (A, ans = 2 [] , 2) 5) 5 4 » min (min (A) ) ans = 2 » min (A, B) ans = 2 1 1 5 3 5 4 3 0 » [a,i] a = = min (A) » sort(A) ans =
2.8. Текстовые строки 47 2 3 4 2 3 4 i = 7 8 9 12 1 2.8. Текстовые строки 2.8.1. Простейшие операции со строками • Тип данных char («символ»); • текстовые данные, в том числе и одиночный символ, заключаются с обеих сторон в апострофы: • » si = 'a'; s2='abcd'; s3 = 'Hello, MATLAB!' • символьные переменные в виде массивов (в системе MATLAB все есть массив) типа char; • печатаемые символы из стандартного набора ASCII представлены числами от 32 до 255; • для ввода русских символов следует выбрать в меню File | Pref- erences ► Command Windows Font шрифт с русской кодиров- кой; • конвертация данных: double , char; • ввод текстовых строк: - групповое присваивание: команда » s2= ' abed'; - поэлементное присваивание с помощью операции индексации: »s2(l)='a'; s2(2)='b'; s2(3)='c'; s2(4)='d'; - операция конкатенации: команда » s2 = [' ab' ' с ' ' d' ]; • вывод текстовой строки в командное окно: команда disp; • ввод с клавиатуры числового или текстового значения переменной: команда input; • функции работы со строками: char, num2str, int2str, strcat, strveat, findstr, stremp, strrep, upper, lower, blanks; • логические запросы: is a, is char, is letter, is space; • справка: help strfun.
48 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ Пример 2.34 Вывод в командное окно текстовой строки. » х = 17; » message = [' Variable х = » disp( message ) int2str(x)]; Пример 2.35 Вывод в командное окно сообщения-приглашения для ввода с кла- виатуры числового значения переменной: » X = input('X = ? ') Ввод числа с клавиатуры заканчивается нажатием клавиши <Enter>. Введенное число сохраняется в переменной X. Специальный набор из двух символов /п внутри строки-аргумента функции input приводит к выводу сообщения в двух строках. Пример 2.36 Вывод в командное окно сообщения-приглашения для ввода с кла- виатуры текстового значения переменной: » str = input('str = ', 's') Ввод текста с клавиатуры заканчивается нажатием клавиши <Enter>. Если нажать <Enter>, не введя с клавиатуры никакого текста, то пере- менная str примет значение пустого массива. Проверка: функция- индикатор isempty(str). 2.8.2. Массивы строк • Массив строк - матрица, состоящая из символов. • Разделитель строк в массиве - точка с запятой ;. • Строки в массиве должны быть одинаковой длины. • Короткие строки дополняют пробелами. • Функция char решает задачу объединения строк разной длины. • Доступ к строкам в массиве: операция индексации.
2.9. Структуры 49 Пример 2.37 » name=['MATLAB 'MAPLE ';'MATHEMATICA'] name = MATLAB MAPLE MATHEMATICA » name = char('MATLAB','MAPLE','MATHEMATICA'); » name(1,:) ans = MATLAB 2.9. Структуры 2.9.1. Создание структуры • Структуры - объекты данных (тип struct), содержащие разную по- именованную информацию (поля структуры). • Форма: VariableName. FieldName. • Создание структуры: - присваивание значений всем полям при помощи оператора при- сваивания; - функция-конструктор struct, позволяющая внести значения сра- зу в несколько полей структуры. • Набор полей структуры (массива структур) можно изменять динами- чески. • Поля структуры могут содержать любой тип данных. • Отдельная структура - это структурный массив размерности 1x1. • Вложенность структур: в качестве имени вложенной структуры вы- ступает имя поля внешней структуры. • Доступ к структурам, входящим в массив, осуществляется при помо- щи индексации: VariableName (1). • Доступ к элементу матрицы, являющейся значением поля структуры, происходит при помощи двух операций индексации и одной операции доступа к полю структуры: VariableName (1) . FieldName(l, 2).
50 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ • Вывод содержимого отдельных полей массива структур: фигурные скобки {VariableName. FieldName}, если с полем связаны сим- вольные данные, и квадратные скобки [Variable- Name . FieldName], если с полем связаны числовые данные. • Если два массива структур имеют одинаковый набор полей, то допус- кается групповое присваивание. 2.9.2. Функции для работы со структурами • Функции для работы со структурами: - fieldnames: получение названий полей структуры; - getf ield: получение содержимого определенных полей; - rmfield: удаление полей структуры; - set field: присвоение значения полю структуры; - struct: создание структур и массива структур; - struct2cell: преобразование массива структур в ячейки; - deal: организация доступа к полям массива структур; - is struct: проверка, является ли указанный объект структурой; - isfield: проверка, содержит ли структура указанное поле. Пример 2.38 » Human = struct('NameIvan'Age28); » Human.Info = [1 2; 3 4]; Или: » Human.Name ='Ivan'; » Human.Age = 28; » Human.Info = [11 12; 13 14] Human = Name: 'Ivan' Age: 28 Info: [2x2 double] » Human(2).Info = [21 22; 23 24] Human = 1x2 struct array with fields:
2.9. Структуры 51 Name Age Info » Human(2) ans = Name: [] Age: [] Info: [2x2 double] » Human (3) = struct ('Name', 'Ann', 'Age' 'Info',[]); » size(Human) ans = 1 3 » Human(1).Number = 123456; Human = 1x3 struct array with fields: Name Age Info Number » Student=struct('Name','Anton', 'Age',19,... 'Info',[], 'Number',[]); » Human(2) = Student; » {Human.Name} ans = 'Ivan' 'Anton' 'Ann' » [А В C]=deal(Human.Name) A = Ivan В = Anton C = Ann
52 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ Пример 2.39 Вложенные структуры: » ext.data=3 ext = data: 3 » inn.data=[l 234] inn = data: [1234] » inn.x=lll; » ext.inn=inn ext = data: 3 inn: [1x1 struct] » ext.inn.data(3)=0 ext = data: 3 inn: [1x1 struct] Пример 2.40 Введите команды » S=struct('name','Ben',... 'age',21,'info',[1,2;3,4]); » S(3).name='Emil'; » S(3).age=19; » S(3).info=[ll 12; 13 14]; » S=[S,struct('name','Anna','age',20,... 'info',[10; 01]),... struct('name', 'Paul', 'age',19, 'info', [0,0;0,0])]; Теперь введите команды » S » S.info
2.10. Массивы ячеек 53 » S(l).info(2,l) » a=[S.info] Что происходит в результате применения следующих команд: fieldnames, isfield, setfield, getfield, rmfield? Пример 2.41 Введите команды » clear S » S=struct('name','Benage',21,'info',[1 2;3 4]); » S=[S; struct('name','Annaage',20, ,... 'info',[10; 01]); ,... struct('name','Paul','age',19,'info',[0,0;0,0])] В чем разница между примерами 2.40 и 2.41? 2.10. Массивы ячеек 2.10.1. Создание массива ячеек • Массив ячеек (тип cell): хранение разнородных объектов (масси- вов разных размерностей, разнотипных данных). • Массив ячеек состоит из ячеек, или контейнеров, каждый из которых может содержать данные разных типов. • Массив ячеек может быть полем структуры. • Создание массива ячеек: - присваивание значений всем ячейкам при помощи оператора при- сваивания; - функция-конструктор cell, позволяющая внести значения сразу в несколько ячеек массива. • Ячейка - это содержимое плюс некоторая оболочка (служебная струк- тура данных) вокруг этого содержимого, позволяющая хранить в ячейке произвольные типы данных любого размера.
54 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ • Выражение любого типа данных можно превратить в ячейку, заклю- чив его в фигурные скобки. • (): доступ к ячейке. • {}: доступ к содержимому ячейки. 2.10.2. Функции для работы с массивами ячеек • cell: создание пустого массива ячеек заданного размера; • cellfun: применение функции к содержимому массива ячеек; • cellstr: преобразование массива символов в массив ячеек; • се112struct /cell2matrix: преобразование массива ячеек в мас- сив структуры / в матрицу; • struct2cell num2cell: преобразование массива структур / чи- слового массива в ячейки; • deal: извлечение содержимого ячеек; • cellplot: отображение содержимого массива ячеек в графическом окне; • celldisp: вывод содержимого массива ячеек в командное окно; • iscellstr: проверка, является ли объект массивом ячеек из строк; • is cell: проверка, является ли указанный объект массивом ячеек. Пример 2.42 Создание массива ячеек: » W = {[7 9] 'Hello' 3+4i; [1 2;3 4] -5 'abc'}; » h_struct =struct('f1',[ 1 2 3],'f2','а'); » W(l,4) = { h_struct } W = [1x2 double] 'Hello' [3+4i] [1x1 struct] [2X2 double] [ -5] 'abc' [] » W(l,l) ans = [1x2 double] » W{1,1} ans =7 9
2.10. Массивы ячеек 55 Пример 2.43 Хранение текстовых строк разной длины: »W{1}= 'MATLAB'; W{2}= 'MAPLE'; W{3}= ' MATHEMATICA' W = 'MATLAB' 'MAPLE' 'MATHEMATICA' » [A,B,C] = deal(W{:}) A = MATLAB В = MAPLE C = MATHEMATICA Пример 2.44 Использование функции-конструктора: » W = cell(size(ones(2,2))) W = [] [] [] [] или » W = cell(2,2); » W{1,1}=[2 3] w = [1x2 double] [] [] [] Удаление некоторого диапазона ячеек из массива ячеек: » W(2, :) = [] W = [1x2 double] [] Доступ к ячейке и содержимому ячейки: » W(l,l) ans
56 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ [1x2 double] » W{1,1} ans = 2 3 2.11. Лабораторный практикум № 2 2.11.1. Теоретические вопросы 1. Разделители операторов, комментарии и «длинные» операторы. 2. Основной тип данных в MATLAB. 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. Способы объединения строк разной длины в массив.
2.11. Лабораторный практикум № 2 57 2.11.2. Задания Задание 2.1 Запустите MATLAB, введите команду» help datatypes и изучите встроенные типы данных, представленные в MATLAB. Задание 2.2 Тщательно проработайте все примеры данной темы. Задание 2.3 Формат представления данных определяется командой format. Команда » help format выводит список возможных форматов представления данных. Создайте матрицу » А = [ 20*rand(2,3)-7; 0 Inf NaN] и введите команды » format compact, format long; A » format short e; A » format rat; A » format +; A » format short; A Задание 2.4 Введите команды и изучите результаты их выполнения. а) 1°°, 2°° b) oo+oo, 00—00 с) ехр(оо), ехр(-оо) d) sign(NaN), sign(-NaN) е) sign(oo), sign (-оо) f) NaN f oo f 1 д) 1/оо, -1*оо, 1/NaN h) log(oo), log(-oo), log(O) Задание 2.5 Сложите, отнимите, умножьте и разделите два числа 1+31 и 1-21.
58 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ Задание 2.6 Вычислите значения: sin(57i/l 1)—л/8 —Зл: е“2+4 2+3/ 2—3/ 4-z 1+4/ ’ с) (У7-5к)2 . Задание 2.7 Вычислите полярные представления для этого функции angle и abs. комплексных чисел. Изучите f) sin 11+y/l-i a) z = (l-3z)5+(l+3z)5 ; b) (2-Q7 . |-l+z|(-l+z) ’ d) z = 5-1+2z' +(-l+2z)5 . Задание 2.8 Вычислите значения e1+21, (l+2i)e, (1+21) (1+21) Задание 2.9 Найдите все решения уравнения | b+2i | + | 8-411 =30. Задание 2.10 Создайте матрицу b как вектор-строку 1x4 b= (1 2 3 4). Транс- понируйте вектор-строку b в вектор-столбец с.
2.11. Лабораторный практикум № 2 59 Задание 2.11 Создайте вектор-строку 1x4 x=(l+2i 2-j 3 4). Введите ко- манды и определите, в чем состоит их отличие? » у=х' » z=x.' Переведите вектор-строку х в вектор-строку Х= (l-2i 2+i 3 4). Задание 2.12 2 3 Создайте матрицу А как матрицу 4x3 А= 10 5 6 8 9 11 12 4 7 Для этого введите в командном окне команды » clear А » А = [1, 2, 3; 4 5 6; 7, 8, 9; 10 11 12] Предложите еще 3-4 варианта создания матрицы А. Задание 2.13 ( 1 Создайте матрицу А как матрицу 4x3 А = 2 3 " -5 6 18 -9 4 7 -10 11 12 Выполните над матрицей А следующие действия (каждое действие вы- полняется над исходной матрицей А): § задайте два способа доступа к элементу 7; § задайте три способа доступа к последнему элементу матрицы; § выделите третью строку матрицы; § переставьте в матрице первый и третий столбцы; § измените порядок следования строк матрицы;
60 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ § найдите минимальное значение в каждом столбце; § найдите максимальное значение каждой строки; § найдите минимальное и максимальное значение матрицы; § транспонируйте матрицу в вектор-столбец; § транспонируйте матрицу в вектор-строку; § выберите из матрицы все элементы с нечетными порядковыми но- мерами; § все отрицательные элементы матрицы замените на 0; § все элементы матрицы с порядковыми номерами, кратными 3, заме- ните на 33; § удалите второй столбец; § удалите третью строку; § удалите число 18. Задание 2.14 Создайте матрицы размером 4 х 4 из 0 и 1 при помощи встроенных функций zeros, ones и eye. Задание 2.15 Создайте симметричную матрицу А размером 10 х 10 из случай- ных чисел между 0 и 8. Задание 2.16 Создайте матрицы размером 3 х 4 из случайных чисел при помощи встроенных функций rand и randn. Определите размер матриц при по- мощи функции size. Найдите минимальный и максимальный элементы. Задание 2.17 Создайте матрицы размером 3 х 3, 4 х 4, 5 х 5, содержащие значения от 1 до п2 (магические квадраты) при помощи функции magic. Выдели- те из матрицы 5x5 верхнюю и нижнюю треугольные матрицы при по- мощи встроенных функций tril и triu.
2.11. Лабораторный практикум № 2 61 Задание 2.18 Задайте команды » clear » А = [1, 2, 3; 4 5 6; 7, 8, 9] ; Доступ к элементу матрицы выполняется при помощи команды » а=А(2,3); или » a=A(N); Значение N равно... ? Задание 2.19 Задайте команды » clear » А = [1, 2, 3; 4 5 6; 7, 8, 9] ; Последовательно введите команды, выполняющие доступ к элемен- там матрицы, и изучите результаты их выполнения. » Ь=А(3,:) » Ь=А(:,2) » Ь=А(1:3,2) » В=А(1:3,2:3) » В=А([1 3],:) » В=А([3 2 1],:) » В=А(:,[3:-1:1]); » А(:) » р=[3 1 2]; » п=[2 3 1]; » А(р, :) » А(п, :) » А(:,р) » А(:,п)
62 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ » А(р,р) » А(п,п) Задание 2.20 Последовательно введите команды, выполняющие арифметические действия над матрицами, и изучите результаты их выполнения. » А = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12] » В = А' » С = А. ' » G = Сл2 » D= -А » В = А + А; » С = А' * А; » D = В - А; » а = [1:4]; » Е = а' * а; » f = а * а' ; » Ь = 2; » d = А/Ь; » В = А.л2; » В = А./А; » С = А.*А; » b=diag(A) » B=diag(b) Задание 2.21 Задайте магическую матрицу А 5 х 5. Какие значения принимают следующие выражения? а)А(2,:) b)A(:,4) с) A(end, :) d)A([l,5]) е) A(l,5:-2:1) f) А(5:-1:1,5:-1:1) g) A(l:2:end) h) А(:) i) A(:,end)
2.11. Лабораторный практикум № 2 63 Задание 2.22 Задайте магическую матрицу А размера 6 х 6 и докажите все ее ма- гические свойства. Задание 2.23 Создайте матрицу А= [ a jk] размером 6x6 следующего вида: а) диагональная, со значениями 1, 2, 3, 4, 5, 6 по диагонали; Ь) треугольная (наддиагональная): из j>k следует ajk=0; с) строготреугольная: из j^k следует ajk=0; d) единичная диагональная; е) мономиальная: в каждой строке и в каждом столбце имеется лишь один элемент, отличный от нуля. Изучите для этого функции diag, spdiags, tril, triu. Задание 2.24 Создайте тридиагональную матрицу размером 5 х 5 с единицами по главной диагонали, двойками по диагонали на одну ниже главной, трой- ками по диагонали на одну выше главной. Изучите для этого функции diag, spdiags. Задание 2.25 Задайте две матрицы А и В размером 10 х Ю. Последовательно введите команды, выполняющие логические действия и операции отно- шения над матрицами, и изучите результаты их выполнения. » А>В А==В А~=В А<=В » spy(A>0) spy(A<0.1) spy(А>=В) Задание 2.26 Для 4-х матриц и векторов А 2x3, В 3x3, v 3x1, w 2x1 вы- полните последовательно операции с целью контроля их легитимности: » А+В А+А В+В v+w v-w » А*В В*А А' *В В*А' А*А А' *А А*А' В*В
64 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ » A*v v*A v*A' A'*v w*A' v*v' v'*v B*v B*w Задание 2.27 Запишите следующую систему линейных уравнений в матричной форме и решите ее в MATLAB: а) x+y+z+u=0; х-у=1; u+z-y=-l; z-x=l. Ь) x+z=4; y+z=2; 2х-4у=2. с) х=2у; y+z=5; x-u=2; x+u=3y+l. d) xi-x2=5; х2-х3+х4=3; х3-х4=1; xi+x4=3 . е) 3x+y-z=7; x+2z=3; y-z=0. Задание 2.28 Изобразите графики функций cos и sin в интервале [-Зл/4; 2л] в одной системе координат. Примените команду hold on. Задание 2.29 Изобразите графики функций yi (х) =х2, у2 (х) =х4, у3 (х) =х8, у4 (х) =х16, в области хе[0;2], уе[0;2] в одной системе координат разными цветами. Задание 2.30 Изобразите графики 5 степенных функций уп(х)=хп, п=1-?5, в области -2<х<2, -2<у<2 в одной системе координат. Графики функ- ций нечетных степеней изобразите красным цветом (' г'), а нечетных - черным (' к'). Задание 2.31 1 0^ Ш Решите систему линейных уравнений 2 3 2 1 1 2 4 2 1 1 х= 2 1 2 1 0
2.11. Лабораторный практикум № 2 65 Задание 2.32 Изобразите графики функций уп(х)=х1/п, п=1-?4, в области 0<х<4 в одной системе координат линиями разного цвета и толщины. Задание 2.33 Создайте матрицы А размером 12 х 18 и В размером 3x6. а) Выделите из матрицы А подматрицу S с 9-й по 12-ю строку и с 3-го по 6-й столбец. Ь) Вставьте в матрицу А матрицу В, начиная с 6-й строки и 12-го столбца. м о с) Создайте матрицу D размером 30 х 30 вида D = т . О /1 У 7 Задание 2.34 Создайте целочисленную случайную матрицу А размером 5x5. Разделите ее на четыре матрицы: В размером 3 х 3, S размером 3x2, D размером 2x3, Е размером 2x2. Задание 2.35 Создайте матрицы А (10 х 5) и В (12 х 6) из случайных чисел. Пусть матрица С будет матрицей 10 х 9, у которой первые три столбца равны первым трем столбцам матрицы А. Остальные столбцы получа- ются из матрицы В, причем три последние строки матрицы В игнори- руются. Создайте матрицу D (10 х 6), у которой четные столбцы полу- чаются из четных столбцов матрицы С, а нечетные - из нечетных столб- цов А. Задание 2.36 Игра «Жизнь» (Conway's Game of Life). Задан торический мир X размером М х М клеток (М = 101), первоначально заселенный живыми организмами с вероятностью 10 %. В каждой клетке может находиться
66 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ ровно один живой организм. В каждом следующем поколении: организм зарождается в пустой клетке, вокруг которой собрались ровно 3 орга- низма, или организм погибает: • от ТОСКИ, если у него меньше двух соседей; • ГОЛОДА, если у него больше трех соседей. Смена поколений равна 100. Каждое поколение отображать графически. Прервать надоевшую эпоху можно, нажав клавиши Ctrl-C. Рис. 2.1. Игра «Жизнь»
ТЕМА 3 ЭЛЕМЕНТЫ ПРОГРАММИРОВАНИЯ Система MATLAB включает в себя язык программирования - высокоуровневый язык с операторами управления, функциями, структу- рами данных, вводом-выводом и возможностями объектно ориенти- рованного программирования. 3.1. Управление вычислением • Операторы управления: операторы ветвления и операторы цикла: - if: оператор условия: вычисляет логическое выражение и выпол- няет группу операторов, если выражение истинно; - switch: оператор переключения: выполняет группу операторов в зависимости от значения переменной или выражения; - while: оператор цикла: повторяет группу операторов до тех пор, пока выполняется логическое условие; - for: оператор цикла: выполняет группу операторов заданное чис- ло раз; - break: оператор управления: выполняет досрочный выход из цик- лов for или while; - continue: оператор управления: передает управление следующей итерации циклов for или while. • Логические выражения операторов управления задаются операторами отношения или логическими операторами: - >, >=, <, <=, ==, ~=: операторы отношения, аналоги функций gt, ge, It, le, eq, пе.; - &, |, логические операторы, аналоги функций and, or, not, xor; - find: выделение части массива, элементы которого удовлетворя- ют определенному условию; - all: проверка на наличие нулевого элемента в массиве;
68 Т е м a 3. ЭЛЕМЕНТЫ ПРОГРАММИРОВАНИЯ - any: проверка на наличие ненулевого элемента в массиве. В слу- чае применения к матрицам функции all и any возвращают значения по каждому столбцу; - isempty, isfinite, isinf, isnan, isprime, isreal, isstr, ischar: индикаторные функции. • Обработка исключительных ситуаций: - назначение: операторы, выполнение которых может привести к ошибке, заключаются в конструкцию между try и catch; - если эти операторы выполняются без ошибок, то управление пере- дается первой команде, стоящей после ключевого слова end; - если возникает ошибка во время выполнения любого из этих опе- раторов, то управление передается блоку, заключенному между ключевыми словами catch и end. Если и здесь встречается ошибка, то выполнение программы прекращается; - ключевые слова try, catch, end. 3.1.1. Оператор условия if • Синтаксис: if expression_l statements_l elseif expression_2 stat ement s_2 else statements_3 end • Назначение: оператор условия: вычисляет логическое выражение и выполняет группу операторов, если выражение истинно. • Ключевые слова if («если»), else («иначе»), elseif («иначе, если»), end («конец всей конструкции»). • Ветви elseif, else могут отсутствовать. • Запись if А равносильна записи if А ~=0 и записи if all(A(:)). • Запись if ~А равносильна записи if А ==0.
3.1. Управление вычислением 69 • В условных выражениях можно использовать не только переменные, но и массивы; в этом случае истинность условия наступает, когда ис- тинным является условие для каждого элемента массива. Пример 3.1 Изучить работу условного оператора, в результате выполнения ко- торого переменная z получает значение -1, так как матрица А содер- жит элемент, меньший 1, и все условие считается ложным. » А = [7 8; 1 if А >= 1 0]; z = 1, else z = -1, end z = -1 Пример 3.2 Определить знак S рационального числа X: Вариант 1: if X>0 S = 1; elseif X<0 S =-l; else end S = 0; Вариант 2: if X>0 S = 1; elseif ~X S = 0; else end S =-l; Вариант 3 (без оператора if): S = (Х>0)-(Х<0); 3.1.2. Оператор переключения switch • Синтаксис: switch switch_expr
70 Т е м a 3. ЭЛЕМЕНТЫ ПРОГРАММИРОВАНИЯ case case_expr, statement, ..., statement case {case_exprl, case_expr2, case_expr3,...} statement, ..., statement otherwise, statement, ..., statement end • Назначение: оператор переключения: выполняет группу операторов в зависимости от значения переменной или выражения. • Ключевые слова switch («переключить»), case («случай»), otherwise («иначе»), end («конец всей конструкции»). • Значение выражения переключения switch_expr может быть ска- ляром или строкой. • В случае совпадения значения выражения со значением, указанным после case или с одним из значений из списка case, выполняется нижестоящая ветка; если нет совпадения ни с одним из перечислен- ных значений, то выполняется ветка, стоящая после ключевого слова otherwise. • Строк с ключевым словом case может быть много, а строка с клю- чевым словом otherwise -только одна. • После выполнения какой-либо из ветвей case происходит обязатель- ный выход из оператора switch, поэтому в конструкции нет необ- ходимости использовать оператор break. Пример 3.3 appl = 'MATLAB'; switch upper(appl) case {'MATLAB','MATHCAD'} disp('Application is numeric') case {'MAPLE','MATHEMATICA'} disp('Application is symbolic') otherwise disp('Unknown application') end
3.1. Управление вычислением 71 Пример 3.4 п=7; switch п case {1,4,9} fprintf('%d - Quadrate\n',n); case {2,3,5,7} fprintf('%d - Prima\n',n); case 6 fprintf('%d - factorial 3!\n',n); case 8 fprintf('%d - Cubic\n',n); otherwise dispf'n must be natural number from 1 to 9.'); end 3.1.3. Оператор цикла while • Синтаксис: while expression statements end • Назначение: повторяет группу операторов до тех пор, пока выполня- ется логическое условие. • Ключевые слова while («пока»), end («конец конструкции»). • В логическом условии можно использовать не только переменные, но и массивы; в этом случае истинность условия наступает, когда истин- ным является условие для каждого элемента массива. • Цикл while можно прервать, если применить оператор break внутри тела цикла; во вложенных циклах оператор break осуществ- ляет выход только из самого внутреннего цикла. • Передать управление следующей итерации цикла while можно при помощи оператора continue.
72 Т е м a 3. ЭЛЕМЕНТЫ ПРОГРАММИРОВАНИЯ Пример 3.5 Вычислить сумму отрезка ряда £1 /п !: » S=0; п=1; х=1; while х > 1е-10 S = S + х; n = n + 1; х = 1/factorial(n); end » x X = 1. 1471e-011 » n n = 14 Пример 3.6 Найти наибольшее число п, для которого можно вычислить п!. » f=l; п=1; while ~isinf(f) n=n+l; f=f*n; end » n—1 ans = 170 3.1.4. Оператор цикла for Цикл for используется при выполнении заранее определенного числа повторяющихся действий. • Синтаксис: for count = expression statements end
3.1. Управление вычислением 73 • Назначение: выполняет группу операторов заданное число раз. • Ключевые слова for («для»), end («конец всей конструкции»). • count - имя переменной цикла; набор возможных значений для пе- ременной цикла поставляет выражение expression. • Чаще всего выражение expression определяется с помощью опера- ции формирования диапазона значений: for count = start:step:final statements end • Переменная цикла count может принимать не только целые, но и вещественные значения любого знака. • Цикл for можно прервать, если применить оператор break внут- ри тела цикла; во вложенных циклах оператор break осуществляет выход только из самого внутреннего цикла. • Передать управление следующей итерации цикла for можно при по- мощи оператора continue. Пример 3.7 Заполнение матрицы Гильберта. k=4; а = zeros(к,к); for m = 1:к for n = 1:к a(m,n) = 1/(m+n -1); end end Пример 3.8 Вместо операции задания диапазона можно явно указывать весь на- бор возможных значений в виде вектор-строки. » for n = [1, 3, 9] а(п) = пЛ2; end
74 Т е м a 3. ЭЛЕМЕНТЫ ПРОГРАММИРОВАНИЯ » а а = 10900000 81 Обратите внимание Для повышения эффективности программы очень важно векторизо- вать алгоритм. Везде, где это возможно, вместо операторов цикла лучше применять эквивалентные по результатам векторные или матричные операции, так как последние исполняются в системе MATLAB быстрее. Например, вместо к=0; for х = 0:0.01:2*pi к=к+1; у(к) = cos(х); end лучше использовать векторизованную версию кода: х = 0:0.01:2*pi; у = cos(х); так как такой код быстрее исполняется и записывается короче. 3.2. Лабораторный практикум № 3 3.2.1. Теоретические вопросы 1. Операторы управления: операторы ветвления и операторы цикла. 2. Условный оператор if. 3. Оператор переключения switch. 4. Оператор цикла for. 5. Оператор цикла while. 6. Операторы break, continue. 7. Векторизация алгоритма. 8. Обработка исключительных ситуаций. 9. Что получится в результате деления -1/0, 1/0, 0/0.
3.2. Лабораторный практикум № 3 75 3.2.2. Задания Задание 3.1 Чему равно наибольшее число, для которого можно вычислить фак- ториал? (Помощь: Inf, isinf (n)) Задание 3.2 В командной строке введите команду » help while. Изучите правила организации цикла при помощи команды while. Организуйте цикл, вычисляющий факториал числа. Найдите значения 5!, 8!, 23!. Задание 3.3 Организуйте цикл, в котором вводите с клавиатуры название дня недели, и при помощи оператора switch определите номер дня недели по названию дня недели. Выход из цикла - по вводу текстовой строки «exit». Обработайте некорректный ввод названия дня недели. Для орга- низации ввода числа с клавиатуры выполните сначала задания 3.8 и 3.9. Задание 3.4 Организуйте цикл, в котором вводите с клавиатуры номер месяца, и при помощи оператора switch определите название месяца по его но- меру. Обработайте некорректный ввод номера дня недели. Выход из цикла - по вводу числа 0. Для организации ввода числа с клавиатуры выполните сначала задания 3.8 и 3.9. Задание 3.5 При помощи операторов for и if создайте матрицу А = 2 -1 0 0 -12-10 0-12-1 0 0-12 < 7 Создайте эту же матрицу, не используя операторы управления.
76 Т е м a 3. ЭЛЕМЕНТЫ ПРОГРАММИРОВАНИЯ Задание 3.6 Вычислите значение выражения Результат должен равняться золотому сечению (1+д/5)/2. Задание 3.7 Последовательность чисел Фибоначчи имеет следующий вид: Пк — Пк-1 + Пк-2, П1 = п2 = 1. Вычислите следующие 10 элементов этой последовательности при по- мощи оператора цикла. Начните с вектора [1 1 ]. На каждом шаге цикла добавляйте к этому вектору один элемент. Какой элемент будет превы- шать значение 1О20? Для этого организуйте цикл с подходящим услови- ем. Последовательность Фибоначчи может быть представлена формулой Ffe-(1-F)fe и, —----_------ к V5 где F = i+Vs 2 Вычислите значения с 12-го по 20-й элемент этой последовательности, не используя для организации вычисления циклы.
3.2. Лабораторный практикум № 3 77 Задание 3.8 Функция input. Введите и выполните команды » M=input('Input (nx2)-Matrix: ') Input (nx2)-Matrix: [1 2;4 1;5 1] M = 1 2 4 1 5 1 Задание 3.9 Функция input и disp. Введите и выполните команды » A=input('Input the Number : A = ') Input the Number: A = 325 A = 325 » disp(['The Number A is: int2str(A)]) The Number A is: 325 » S=input('Input the String : S = ', 's') Input the String: S = hello S = hello Задание 3.10 SD-графика. Введите команды » a=linspace(1,10,100); » [к у]=meshgrid(a); » z=sin(x).*cos(у); » surf(x,у,z) Теперь введите команды
78 Т е м a 3. ЭЛЕМЕНТЫ ПРОГРАММИРОВАНИЯ » colormap winter % default, hot, cool, spring, % summer, autumn, gray, pink... » shading flat % interp, faceted Что изменилось в графическом окне Figure? Задание 3.11 Оформление графиков функций. » X=linspace(0,2*pi); Y=[sin(X);cos(X)]; plot(X,Y) title('Trigonometrische Funktionen') xlabel('Winkel \alpha'); text(pi/4,sin(pi/4),' sin \pi/4 = cos \pi/4') axis equal axis tight grid on legend(['sin \alpha';'cos \alpha'],-l) Задание 3.12 Построение графиков в разных системах координат в одном графи- ческом окне. Введите команды » [X,Y]=meshgrid(-1:.05:1); Z=X.Л3-3*Х.*Y.л2; surf(X,Y,Z) axis equal axis tight box on Теперь введите следующие команды: » ind=Z>-0.1 & Z<0.1; Z(ind)=NaN; subplot(1,2,1) surf(X,Y,Z)
3.2. Лабораторный практикум № 3 79 Что получится в результате выполнения команды » subplot(1,2,1) ? Теперь введите команды » subplot(1,2,2) contour(X,Y,Z,20); axis equal axis tight colorbar('horiz') ; Изучите работу функции subplot. Задание 3.13 «Томограмма». ЗБ-графика и анимация. Построить график за- данной функции двух переменных и просканировать (снизу вверх) ее го- ризонтальные уровни (рис. 3.1). Рис. 3.1. Сканирование 3D-поверхности линиями уровня
80 Т е м a 3. ЭЛЕМЕНТЫ ПРОГРАММИРОВАНИЯ Для этого разбить графическое окно Figure на две системы коор- динат: • в левой системе координат изобразить саму поверхность (3D- поверхность); • в правой системе координат нарисовать карту ее произвольного гори- зонтального сечения (2В-изображение). В цикле для любого уровня Z = Z 0: • из поверхности ВЫРЕЗАТЬ данный уровень; • справа изобразить карту данного уровня, то есть местоположение вырезанных ячеек.
ТЕМА 4 СЦЕНАРИИ, ФУНКЦИИ И ПЕРЕМЕННЫЕ Режимы работы: • Работа в интерактивном режиме: ввод команд с клавиатуры в ко- мандной строке командного окна Command Window. • Работа с М-файлами: сохранение последовательности команд в текстовых файлах, дополнение их комментариями и выполнение из редактора М-файлов или запуск из командной строки в ко- мандном окне Command Window. Для работы с М-файлами предназначен встроенный текстовый ре- дактор М-файлов, который вызывается командой меню File | New ► M-file и работает в своем собственном окне, обеспечивая создание, редактирование, запуск и отладку кода. 4.1. Типы М-файлов М-файлы: содержат команды и операторы MATLAB. Типы М-файлов: • файл-сценарии (Script M-files), содержащие последо- вательность команд; • файл-функции (Function M-files), в которых описыва- ются функции. 4.1.1. Сценарии Сценарий (script) - это текстовый файл, в котором записаны команды, подлежащие последовательному выполнению. Свойства сце- нария: • нет специального оформления; • доступны все переменные, определенные в рабочем пространстве; • не допускает входных и выходных параметров;
82 Т е м a 4. СЦЕНАРИИ, ФУНКЦИИ И ПЕРЕМЕННЫЕ • все переменные, которые создаются и используются в сценарии, со- храняются в рабочем пространстве Workspace и доступны по окон- чании работы сценария; • предназначен для упрощения многократного вызова группы команд; • не может использоваться в качестве операндов в выражениях или в качестве входных аргументов функций; • сохранение в файл на диске: текстовый файл с расширением m (на- пример, f i 1 е 1. m); • для выполнения сценария содержащий его М-файл должен находить- ся в текущем каталоге Current Directory либо путь к нему должен быть указан в пути поиска Search Path; • сохраненный сценарий в любой момент можно выполнить одним из следующих способов: - целиком или частично из редактора М-файлов; - целиком из командного окна, если набрать в командной строке имя файла (без расширения), содержащего сценарий, и нажать клавишу <Enter>; - целиком из другого сценария, если в качестве команды указать имя файла (без расширения), содержащего сценарий. 4.1.2. Функции • Функции оформляются в виде текстовых файлов с расширением т. • Определение М-функции: function [<список_вых_параметров>] = имя_функции (<список_вход_параметров>) • М-функция включает следующие компоненты: - строка заголовка функции задает имя функции, количество и порядок следования выходных и входных аргументов; - первая строка подсказки определяет исчерпывающее крат- кое назначение функции; выводится на экран командой lookfor или help; - текст подсказки представляет собой более детальное описа- ние назначения и способов вызова функции, выводится на экран командой help;
4.1. Типы М-файлов 83 - тело функции представляет собой непосредственно програм- мный код, который реализует вычисления и присваивает значения выходным аргументам; - комментарий представляет собой текст внутри программного кода, описывающий алгоритм выполнения функции. • По умолчанию внутренние переменные являются локальными и хра- нятся во внутреннем рабочем пространстве, относящемся к данной функции. • Функция используется для расширения возможностей языка MATLAB. • Функция может использоваться как составная часть выражения или в качестве аргумента другой функции. • Имя функции должно начинаться с буквы, может содержать любые буквенно-цифровые символы и символ подчеркивания. • Допустимость имени функции: команда » isvarname my fun. • Уникальность имени функции определяется по первым N=namelengthmax символам. • MATLAB различает верхний и нижний регистр. • Функция допускает входные и выходные параметры. • Входные аргументы функции заключаются в круглые скобки и сле- дуют после имени функции. • Если функция имеет несколько выходных аргументов, то они заклю- чаются в квадратные скобки. • Для разделения входных аргументов используется запятая, для разде- ления выходных аргументов используется запятая или пробел. • В зависимости от количества входных и выходных аргументов объяв- ления функции могут иметь следующие представления: function у = funcName(х) function [] = funcName(х,у,z) function funcName(х) function [x,y,z] = funcName() function [x у z] = funcName(a,b) function funcName • Одна и та же функция может вызываться с разным числом входных и выходных аргументов (механизм перегрузки функций); при опреде-
84 Т е м a 4. СЦЕНАРИИ, ФУНКЦИИ И ПЕРЕМЕННЫЕ лении функции в списках входных и выходных аргументов должно указываться их максимально допустимое количество. • Имена фактических параметров, передаваемых в функцию, могут не совпадать с именами формальных аргументов, указанных в определе- нии функции. • Однострочным комментарием является любая последовательность символов, располагающаяся за знаком % и до конца текущей строки. • Для записи комментария более чем на одну строку следует использо- вать пару символов % { и %}, которые должны занимать отдельные строки непосредственно перед блоком комментария и за ним. • М-файлы могут содержать коды нескольких функций. Первая функ- ция в файле - это первичная (основная) функция, вызываемая по име- ни М-файла. Другие функции внутри файла - это подфункции, кото- рые являются видимыми только в пределах данного файла. • Справка help видит только первичную функцию и не видит под- функции. • Каждая функция имеет собственный заголовок. Подфункции следуют друг за другом непрерывно. Ключевое слово function или конец файла означают конец функции (никаких специальных признаков конца функции нет). Подфункции могут вызываться в любом порядке, в то время как основная функция выполняется первой. • Если имя файла и имя функции не совпадают, то внутреннее имя функции игнорируется. Вызов функции происходит по имени файла. • Частные функции размещаются в подкаталогах со специальным име- нем private, видимы только для ограниченной группы функций, находящихся в каталоге предыдущего уровня. • Удаление откомпилированной функции из памяти: команда »clear func_name. • Новые функции добавляются к словарю системы MATLAB и стано- вятся доступными наряду со встроенными функциями. • При включенном режиме echo функция выполняется в режиме ин- терпретации и на экран выводятся результаты выполнения каждого оператора. • Функции внутри одного и того же М-файла не могут обращаться к одним и тем же переменным, если они не объявлены глобальными пе-
4.1. Типы М-файлов 85 ременными внутри соответствующих функций или не переданы им в качестве параметров. • В качестве имени подфункции можно использовать имена функций системы MATLAB, т. к. когда приходит вызов функции из М-файла, то MATLAB в первую очередь проверяет, не является ли эта функция подфункцией. • Переменные vargout, vargin имеют тип cell. Они возвращают (назначают) список выходных (входных) аргументов переменной длины. • Переменные nargout, nargin определяют число реально задан- ных выходных (входных) аргументов функции. • Команда exist проверяет, существует ли переменная или файл с указанным именем. • Оператор return - это оператор выхода из функции. При вводе в командной строке оператор return позволяет закончить отладку. Пример 4.1 function n = factorial(п) FACTORIAL Factorial function. FACTORIAL(N) for scalar N, is the product of all the integers from 1 %to N, FACTORIAL(N) for N-D matrix, is the factorial for each element of N. о\° о\° о\° о\° о\° N = n(:); if any(fix(N)~=N)||any(N<0)||... ~isa(N,'double')||~isreal(N) error('MATLAB:factorial:NNegativelnt', ... 'N must be a matrix of non-negative integers.') end n(N>170) = 171; m = max ([1; n(:)]); N = [11 cumprod(2:m)]; n(:) = N(n+1); » help factorial
86 Т е м a 4. СЦЕНАРИИ, ФУНКЦИИ И ПЕРЕМЕННЫЕ FACTORIAL Factorial function. FACTORIAL(N) for scalar N, is the product of all the integers from 1 %to N, FACTORIAL(N) for N-D matrix, is the factorial for each element of N. » lookfor factorial FACTORIAL Factorial function. Пример 4.2 Вызвать М-сценарий: » run MyScript Пример 4.3 Вызвать М-функцию myfunc с тремя входными и двумя выходны- ми аргументами, подавив вывод на экран: » [X, Y] = myfunc(х, у, Z); 4.1.3. Рекурсия • Функции могут вызывать сами себя (рекурсия); • каждое вложение имеет собственные локальные переменные; • максимальный уровень вложенности составляет 500: команда » get(0, 'RecursionLimit'); • изменить максимальный уровень вложенности: команда » set (0, 'RecursionLimit', N). Пример 4.4 function s=summa(n) if n==l s=l; else s=n+summa(n-1); end; » summa(500) ans = 125250
4.1. Типы М-файлов 87 » summa(501) ??? Maximum recursion limit of 500 reached. » get(0,'RecursionLimit') ans = 500 4.1.4. Использование функции в качестве параметра • Передача функции как текстовой строки: - имя функции передается как текстовая строка ' FuncName '; - функция используется через feval (Name, ParametersList); - список параметров передается при непосредственном вызове функции. Пример 4.5 function plot_sf(f,xmin,xmax) x = xmin:0.01:xmax; y=feval(f,x); plot(x,y) » f='sin' f = sin » plot_sf(f,0,pi) • Передача функции как указателя: - имя функции передается как указатель @FuncName; - функция используется при помощи feval (Name, Parameter- sList) ; - список параметров передается при непосредственном вызове функции. Пример 4.6 function plot_hf(f,xmin,xmax) x = xmin:0.01:xmax;
88 Т е м a 4. СЦЕНАРИИ, ФУНКЦИИ И ПЕРЕМЕННЫЕ y=feval(f,х); plot(х,у) » f=@sin f = @ sin » plot_hf(f,0,pi) • Передача функции как встроенной функции: - создается встроенный объект: inline (' Expression'); - имена параметров определяются автоматически; - функция используется прямым вызовом. Пример 4.7 function plot_if(f,xmin,xmax) x = xmin:0.01:xmax; y=f(x); plot(x,y) » f=inline('sin(x)') f = Inline function: f (x) = sin (x) » plot_if(f,0,pi) • Создание и использование анонимной функции: - код состоит из одного выражения; - параметры задаются в круглых скобках через запятую после сим- вола Пример 4.8 » area = @(г) 4*pi*rA2 % площадь сферы Вызов: » area(2) » агеа(З)
4.2. Переменные и их область действия 89 4.2. Переменные и их область действия Область действия (scope rules) переменной - это правила, кото- рые устанавливают, какие данные доступны из данного места програм- мы. С точки зрения области действия переменных различают три типа переменных. • Локальные переменные - это переменные, объявленные внутри функ- ции. Локальная переменная доступна только внутри функции, в кото- рой она объявлена, и существует до тех пор, пока выполняется функ- ция. При выходе из функции эта переменная и ее значение теряются. • Формальные параметры - это переменные, объявленные при описа- нии функции как ее аргументы. Область действия формальных пара- метров - блок, являющийся телом функции. • Глобальные переменные - это переменные, объявленные при помощи ключевого слова global. 4.2.1. Глобальные переменные • Команда global name_l,... объявляет переменные глобальными. • Если эта переменная в момент объявления не существует, то ей при- сваивается значение пустого массива [ ]. • Обращение к глобальной переменной возможно из любой функции, где эта переменная объявлена глобальной. • Команда clear global name_l,... удаляет указанные глобальные переменные. • Команда clear global удаляет все глобальные переменные. • Команды who global и whos global выводят список гло- бальных переменных. • Команда isglobal (name_l) определяет, является ли указанная переменная глобальной. • Если при объявлении переменной глобальной уже существует пере- менная с тем же именем в рабочей области, то MATLAB выдает пре- дупреждающее сообщение и переводит переменную в разряд гло- бальных переменных.
90 Т е м a 4. СЦЕНАРИИ, ФУНКЦИИ И ПЕРЕМЕННЫЕ Пример 4.9 В файле Init. m определены две функции: первичная функция 1п- it (xmin, xmax, step) и подфункция ShowNext (dx, у). Переменная FP объявлена глобальной и видима в обеих функциях, function Init(xmin,xmax,step) global FP FP= struct('data',[xmin NaN],... 'xLim',[xmin xmin+step],'yLim',[-1 1]); for x=xmin:step:xmax; ShowNext(step,sin(20*x)+sin(23*x)); pause (0.01); end function ShowNext(dx,y) global FP xl=FP.data(end,1)+dx; FP.data= [FP.data; xl y]; xLim(2)=xl; FP.yLim=[min([min(FP.data(:,2)) FP.yLim]) ... max([max(FP.data(:,2)) FP.yLim])]; axis([FP.xLim FP.yLim]); plot(FP.data(:,1),FP.data(:,2)); drawnow » Init(0, 2*pi, 0.01) 4.2.2. Устойчивые переменные • Устойчивые переменные (persistent variables) - это локаль- ные переменные, сохраняющие значение между вызовами функции. • Устойчивые переменные объявляются и используются только в пре- делах М-функции. • Значение устойчивых переменных сохраняется от одного вызова функции до другого.
4.3. Отладка М-функций 91 • Переменная должна быть объявлена устойчивой до того, как она бу- дет использоваться в функции. • Объявить устойчивую переменную можно при помощи команды persistent name_l,... • При объявлении устойчивой переменной MATLAB присваивает ей значение []. • MATLAB очищает все устойчивые переменные, используемые в функции, если функция очищается по команде clear func_name или если редактируется М-файл, содержащий данную функцию. Пример 4.10 function findSum(inputvalue) persistent SUM_X if isempty(SUM_X) SUMX = 0; end SUMX = SUMX + inputvalue 4.3. Отладка М-функций • Окно редактирования М-файлов является одновременно и окном встроенного отладчика medit.exe. • Пункты меню и кнопки панели инструментов, позволяющие выпол- нять отладочные действия: - Set/Clear Breakpoint F12: поставить/убрать точку останова; - Clear All Breakpoints: убрать все точки останова; - Step In F11: выполнять построчно с заходом в вызываемые функции; - Single Step Fl0: выполнять построчно; - Continue: выполнять до следующей точки останова; - Stop if Errors/Warnings...: установить режимы отладки при возникновении определенных ситуаций; - Quit Debugging: завершить отладку. • Чтобы в режиме отладки просмотреть значение переменной, доста- точно подвести курсор к ее имени в тексте функции, после чего на эк- ране появится всплывающий желтый прямоугольник со значением переменной внутри него.
92 Т е м a 4. СЦЕНАРИИ, ФУНКЦИИ И ПЕРЕМЕННЫЕ • Содержимое любой переменной может быть выведено в командном окне указанием ее имени и нажатием клавиши <Enter>. • Приглашение командной строки в режиме отладки: К». • Команды отладки: dbstep, dbstop, dbcont, dbclear, dbquit. 4.4. Лабораторный практикум № 4 4.4.1. Теоретические вопросы 1. Режимы работы в MATLAB. 2. Типы М-файлов. 3. Различия между М-сценарием и М-функцией. 4. Как создать функцию в MATLAB. 5. Типовая структура М-файла. 6. Оператор заголовка функции. 7. Входные/выходные параметры функции. 8. Что является признаком конца функции. 9. Как оформить комментарий. 10. Типы функций. 11. Первичные функции. 12. Подфункции. 13. Анонимные функции. 14. Частные функции. 15. Видимость имен функций. 16. Проверка параметров функций. 17. Переменные и их область действия. 18. Локальные, глобальные переменные. 19. Устойчивые переменные. 20. Перегрузка функций. 21. Отладка функций. 4.4.2. Задания Задание 4.1 Напишите анонимную функцию, вычисляющую: а) площадь треугольника по формуле Герона; Ь) длину окружности;
4.4. Лабораторный практикум № 4 93 с) площадь круга; d) площадь кругового сектора; е) площадь правильного многоугольника; f) объем цилиндра; g) площадь полной поверхности цилиндра; h) объем конуса; i) объем усеченного конуса; j) объем шара; к) площадь сферы. Задание 4.2 Напишите рекурсивную функцию, высчитывающую факториал за- данного числа. Задание 4.3 Напишите функцию, высчитывающую первые п полиномов Чебы- шева. Первая строка М-функции должна иметь вид function Т = tscheby(x,n) Полиномы рассчитываются по формуле То (х) =1; Ti(x) = х; Tn(x) = 2x*Tn-i (х) - Тп_2 (х) ; Постройте графики функций в интервале [-1,1]. Задание 4.4 Напишите М-функцию вида: а) х, х<0 Ъ) /(х) = < х2,0 < х < 2; 1,|х|<1 С) /(%) = - х2,1 < |х| < 2; 4,х>2 Л* X 2 f (х) = ] sin Протестируйте функцию для значений х= [-2, 1/3, 3/2, 2, 6]. По- стройте график функции в интервале [-3,3].
94 Т е м a 4. СЦЕНАРИИ, ФУНКЦИИ И ПЕРЕМЕННЫЕ Задание 4.5 Напишите рекурсивную функцию, высчитывающую последователь- ность чисел Фибоначчи: Пк — Пк-1 + Пк-2, П1 = п2 = 1. Задание 4.6 Вычислите рекурсивно значение выражения: 1 + 1 1 + 1 Задание 4.7 «Скользящий график». Напишите функцию, отображающую скользящий график заданной функции. Функция должна иметь следую- щий заголовок и подсказку: function KM4(dx,y) % КМ4 -- Floating Plot о о % Graphics Initialization: % km4('reset[xmin xmax]) - reset plot area % km4('reset')-reset plot area ([xmin xmax]=[0 100]) % Input the next point of graphics: % km4(dx,y) - add new point to current plot % km4(y) - add new point to current plot (step dx=l) % EXAMPLE:
4.4. Лабораторный практикум № 4 95 % >> km4('reset',[0 80]) % >> for х=0:0.01:10*pi;... % km4(0.1,sin(20*х)+sin(23*х)); pause(O.Ol); end File Edit View Insert Tools Desktop Window Help Figure 1 Puc. 4.1. Скользящий график Функция должна выводить график указанной функции. Количество точек вдоль оси X фиксировано. Если номер текущей отображаемой точ- ки превышает заданное количество точек, то график сдвигается влево вдоль оси X («скользит»), так чтобы количество отображаемых точек вдоль оси X оставалось постоянным. Диапазон значений вдоль оси Y корректируется программно таким образом, чтобы весь график попадал в область вывода, как показано на рис. 4.1.
ТЕМА 5 ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ Современное объектно ориентированное программирование осно- вано на возможности введения новых типов данных и определения опе- раций для них. В MATLAB классы пользователя User Classes на- следуют родительскому классу struct, т. е. все новые типы (классы) данных базируются на структурах. 5.1. Правила создания класса Рассмотрим последовательность создания класса в среде MATLAB на примере класса myclass. • Класс - это папка-контейнер - каталог с именем .„\@myclass. • Для работы с классом myclass текущий каталог Current Direc- tory должен быть открыт на папке, содержащей папку-класс @myclass. • Имя функции-конструктора класса должно совпадать с названием класса (функция myclass, описанная в М-файле myclass .m). • Объект класса хранит свои данные в структуре, все поля которой яв- ляются скрытыми (private). • Функции-методы класса реализуются в М-файлах. Функция-метод - это функция, один из аргументов которой - объект данного класса. Имя М-файла - имя действия, реализованного функцией. • Скрытые частные (private) функции класса myclass размещаются в папке @myclass\private, не имеют в качестве входного аргу- мента объект класса, используются как вспомогательные функции и не оперируют непосредственно с объектом класса. • Базовые методы классов MATLAB: - class constructor: создание объекта класса; - double, char: конверторы;
5.2. Лабораторный практикум № 5 97 - display: вывод содержимого объекта в командное окно, если вы- ражение не завершается разделителем точкой с запятой; - set и get: доступ к свойствам объекта (функция get - чтение значений свойств, а функция set - запись новых значений); - subsref: индексная ссылка (переопределение методов для опера- торов a(i), a{i}, a. field); - subsasgn: индексное присваивание (переопределение методов для операторов a(i)=b, a{i}=b, a.field=b); - subindex: индексный дескриптор, т. е. использование объекта класса в качестве целочисленного индекса другого объекта (переоп- ределение методов для х(а)); - end: последний индекс по указанной размерности. • Переопределение арифметических функций и операторов: функции plus, minus, mtimes, ... • Команда » clear classes вызывается после каждого переоп- ределения класса для удаления объектов класса. • Встроенные функции MATLAB для идентификации объектов классов: - class (р): определение класса объекта; - isa(p, 'myclass '): проверка принадлежности объекта данному классу; - isob ject (р): выявление принадлежности объекта к какому-либо классу MATLAB; - methods ('myclass '): вывод списка методов данного класса; - whos р: вывод подробной информации об объекте. 5.2. Лабораторный практикум № 5 5.2.1. Теоретические вопросы 1. Справочные функции: class, is а. 2. Основные принципы ООП, реализованные в MATLAB. 3. Правила создания нового класса. 4. Функции для идентификации класса. 5. Конструктор класса, типы конструкторов. 6. Деструктор класса.
98 Тема5. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ 7. Методы класса. 8. Работа с индексами: subsref, subsagn, subindex. 9. Правила переопределения арифметических операций, имена фай- лов для реализации базовых операций MATLAB. 10. Полиномы в MATLAB, функции: conv, roots, polyval. 11. Изменение свойств объекта: set, get. 12. Конверторы double и char. 13. Вывод на печать display. 14. Дифференцирование и интегрирование: dif f, int. 15. Нахождение корней roots и построение графика plot. 5.2.2. Задания Задание 5.1 Создайте класс polynom. В классе должны быть реализованы методы, определяющие функциональное назначение данного класса. Для создания объектов класса polynom используется функция- конструктор. Конструктор должен находиться в М-файле с именем @polynom/polynom.m. Данный конструктор создает полином из за- данного вектора коэффициентов полинома при убывающих степенях пе- ременной х. В примере применяются три типа конструктора. • Конструктор по умолчанию. Создается шаблон объекта, обычно с пустыми полями. В отдельных случаях поля инициализируются неко- торыми начальными значениями. • Конструктор копирования. Конструктор возвращает копию объекта. При этом в конструкторе необходимо использовать функцию isa(p, 'polynom'), чтобы определить: является ли входной аргу- мент объектом данного класса? • Конструктор с параметрами. Конструктор создает структуру и ини- циализирует ее поля, используя входные данные. Затем из этой структуры конструируется сам объект при помощи встроенной функ- ции class (). У этой функции есть два обязательных параметра. Первый - структура, которая будет представлять данные объекта, а второй - текстовая строка, содержащая имя создаваемого класса. function р = polynom(а) %POLYNOM Polynomial class constructor.
5.2. Лабораторный практикум № 5 99 % р = POLYNOM(v) if nargin == О р.с = []; % default constructor р = class(р, 'polynom'); elseif isa(a,'polynom') % copy-constructor p = a; else p.c = a(:).'; % constructor with parameters p = class(p,'polynom'); end Для преобразования объекта одного класса к другому классу ис- пользуется функция-конвертор. Имя этой функции и имя ее М-файла должно совпадать с именем класса, к которому она будет преобразовы- вать исходный объект. Для преобразования объекта класса polynom обратно в вектор его коэффициентов используется метод double (): function с = double(р) % @polynom/double.m. с = р.с; Теперь можно преобразовывать векторы в полиномы и обратно: » р = polynom([1 2 -4 5]); » double(р) ans = 12-45 Для преобразования объекта к текстовому виду используется метод char (). В примере класса polynom этот метод определяется в М-файле @polynom/char. m и используется следующим образом: » р = polynom([1 2 -4 5]); » char(p) ans = хл3 +2*хл2 - 4*х + 5 Преобразование к текстовому виду используется в методе dis- play (), который относится к базовым методам классов MATLAB. Этот
100 Тема5. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ метод вызывается всякий раз, когда в среде MATLAB введено выраже- ние, не завершенное точкой с запятой. function display(р) % @polynom/display.m disp(' '); disp([inputname(1),' = ']) disp(' '); disp([' ' char(p)]) disp(' '); Для переопределения основных математических операторов необ- ходимо в папке-контейнере, содержащей методы класса, создать М-файл с именем, соответствующим имени переопределяемого оператора, и в этом файле определить функцию с этим же именем. Так функция, опре- деленная в файле @polynom/plus . m, складывает полиномы. function г = plus(p,q) % @POLYNOM/PLUS.М р = polynom(p); q = polynom(q); k = length(q.c) - length(p.c); r = polynom([zeros(1,k) p.c] + [zeros(l,-k) q.c]); Вызов: » p = polynom([l 2 -1 3]); q = polynom([4 -5]); pl = p + 1; s = p + q; Создайте класс-папку @polynom, определите структуру для хране- ния данных, реализуйте для класса polynom следующие методы: • char - преобразование полинома к тестовому виду; • diff - вычисление производной полинома; • display - вывод в командное окно; • double - функция-конвертор полинома в вектор его коэффициентов; • int - вычисление неопределенного интеграла полинома р. int (р) возвращает интеграл с нулевым свободным членом, int(p,c) воз- вращает интеграл со свободным членом с;
5.2. Лабораторный практикум № 5 101 • minus - вычитание полиномов; • mtimes - умножение полиномов; • plot - построение графика полинома р. Команда plot (р) выводит график полинома в диапазоне, содержащем все его корни. Команда plot (р, х) выводит график полинома в заданной области определе- ния; • plus - сложение полиномов; • polynom - конструктор; • polyval - вычисление значения полинома р в точке х; • roots - вычисление всех корней полинома; • subsref - операция индексной ссылки, реализующая вычисление значения полинома в указанных точках.
ТЕМА 6 ВЫСОКОУРОВНЕВАЯ ГРАФИКА Высокоуровневая графика (High-Level Graphics) включает команды и функции, предназначенные для построения графи- ков в прямоугольных и полярных системах координат, трехмерных по- верхностей и линий уровня, гистограмм, диаграмм, анимации и т. д. Графические команды высокого уровня автоматически контролируют масштаб, выбор цветов, маркировку осей. • Все графические изображения строятся в специальном графическом окне Figure. • Создание нового окна: пункт меню File | New ► New Figure или команда figure. • Активизация окна с номером N или создание окна с указанным номе- ром: figure(N). • Переключение между окнами: Alt+Tab. • Построение нескольких графиков: - в одной системе координат: hold on; - одном окне в разных системах координат: subplot; - разных графических окнах: figure. • Удаление графика: elf, elf reset, cla, cla reset. • Закрытие графического окна: close (FigureN), close all. 6.1. Двумерная графика • График функции одной переменной, векторных и матричных данных в линейном масштабе в декартовой системе координат: plot. - plot (х, у) - график с узлами (хк, ук); - plot (у) - график с узлами (к, ук); - дополнительный строковый аргумент задает:
6.1. Двумерная графика 103 § тип маркеров: ., +, *, о, х, s, d, v, л, <, >, р, h; § стиль линии: :, -., — ; § цвет линии: у, m, с, г, g, b, w, к; - plot (xl,yl,x2,y2,„.) или plot (х, [yl;у2;уЗ,...]) - по- строение нескольких графиков в одной системе координат; - справка: » help plot. • График в полулогарифмическом или логарифмическом масштабах: semilogx (логарифмический масштаб по оси х), semilogy (лога- рифмический масштаб по оси у) и loglog (логарифмический мас- штаб по обеим осям). • График в полярных координатах: polar, ezpolar. • Триангуляционный график: triplot. • Диаграммы и гистограммы: area, bar, barh, hist, pie, rose, stem. • Двумерный закрашенный многоугольник: fill. • График функции в указанном интервале: fplot, ezplot. • Анимированный график плоской линии: comet. • Ступенчатый график: stairs. • График дискретных значений: steam. • Графики линий уровня: contour, contourf. • График поля направлений: quiver, streamline; вспомогательные функции: gradient, stream2. • Справка: help graph2d, help specgraph. 6.1.1. ID-графики функций Примеры построения графиков функций одной переменной. Пример 6.1 Функция plot (рис. 6.1-6.3).
104 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА » x=-3*pi:0.01:3*pi; » y=sin(x); » plot(х,у) Рис. 6.1. Функция plot » z=x+i*y; » plot (z, '*k: ') Рис. 6.2. Функция plot » x=linspace(0,2*pi); » y=[sin(x); cos(x)]; » plot(y) Puc. 6.3. Функция plot
6.1. Двумерная графика 105 Пример 6.2 Если для графика диапазоны изменения переменных вдоль одной или обеих осей координат слишком велики, то можно воспользоваться функциями построения графиков в полулогарифмическом или логариф- мическом масштабах. Для этого предназначены функции semilogx (ло- гарифмический масштаб по оси х), semilogy (логарифмический мас- штаб по оси у) и loglog (логарифмический масштаб по обеим осям). Построить графики функций у=1п (х/2) и z=cos (In х) на отрез- ке [0.1, 10] в логарифмическом масштабе по оси х (рис. 6.4). х = 0.1:0.1:10; у=1од(х/2); z=cos(log(х)); semilogx(х,[у;z]) Рис. 6.4. Вывод графика функции в полулогарифмическом масштабе Пример 6.3 Графики двух функций в одной системе координат (рис. 6.5). » y=sin(x); » z=sin(x)/3; » plot(х, [у;z]) Рис. 6.5. Графики двух функций в одной системе координат
106 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА Пример 6.4 Построить графики в разных графических окнах. х = -pi:0.01:pi; у = sin(x); z = cos(x); u = exp(x); plot(x,y,x,z); figure; plot(x,u); Puc. 6.6. Вывод графиков в разные графические окна В результате графики функций sin и cos выводятся в одном графическом окне, а график функции ехр строится в другом графиче- ском окне, как показано на рис. 6.6. Пример 6.5 Построение графиков в одном графическом окне в разных системах координат при помощи функции subplot. Диапазоны изменения пере- менных на осях координат в этом случае независимы друг от друга. Изобразить графики функций у = х, у = х2и у = у[х в одном графи- ческом окне в разных системах координат (рис. 6.7). х=0:.1:10; у=х; w=x.A2; z=sqrt(х); subplot(2,2,1); plot(х) subplot(2,2,2); plot(x.Л2) subplot (2,2, [3 4]); plot(sqrt(x)) Puc. 6.7. Вывод графиков в разные оси координат - функция subplot
6.1. Двумерная графика 107 Пример 6.6 Построить график функции двух переменных разными способами, размещая их в разных системах координат (рис. 6.8). colormap default contour3 [X,Y,Z] = peaks(30); subplot (2,2,1); surf(X,Y,Z); title('surf') subplot (2,2,2); contour3(X,Y,Z); title('contours') subplot(2,2,3); 5 -5 contour contourf contour(X,Y,Z); title('contour') subplot(2,2,4); contourf(X,Y,Z); title('contourf') Puc. 6.8. Вывод графика в разные системы координат Пример 6.7 Визуализация графика функции в полярных координатах: функция polar (рис. 6.9). r=sin(2*t) .*cos (2*t); polar(t,r,' k') Puc. 6.9. График функции в полярных координатах - функция polar
108 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА Пример 6.8 Визуализация графика функции в полярных координатах (рис. 6.10). phi=linspace(0,2*pi); r=linspace(0,1); polar(phi,r) Puc. 6.10. График функции в полярных координатах - функция polar Пример 6.9 Изобразите график функции, заданной параметрически (рис. 6.11): х(t)=sin(21),у(t)=cos(t),0 < 111 < 2 л. x= @(t) sin (2*t); y=@(t) cos(t); ezplot(x,y,[0,2*pi]) Puc. 6.11. График функции, заданной параметрически - функция ezplot
6.1. Двумерная графика 109 Пример 6.10 График функции, заданной кусочным образом (рис. 6.12): irsin х,-Зтг<х<-л; 71—|х|,-тг< х<тг; 71 sin3 Х,7Г<Х<37Г. xl=-3*pi:0.01:-pi; yl=pi*sin(xl); х2=[-pi:0.01:pi]; y2=pi-abs(x2); x3=pi:0.01:3*pi; y3=pi*sin(хЗ). л3; plot (xl,yl,... x2,y2, ' — ' ,x3,y3) grid on Puc. 6.12. График функции, заданной кусочным образом Пример 6.11 Построить траекторию движения точки в течение 100 секунд, коор- динаты которой изменяются по закону х= (1+t2) sin (20t), у= (1+t2) cos (20t), как показано на рис. 6.13. -!D| X| t = 0:0.001:10; x=(l+t.A2).*sin(20*t); y=(l+t.A2). *cos(20*t); comet(x,y) Figure 1 File Edit Mew Insert Tools Desktop Window Help n •100 -50 0 53 Puc. 6.13. Анимированный график плоской линии - функция comet
по Т е м а 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА Пример 6.12 Построение двумерного закрашенного многоугольника (рис. 6.14). x=-3*pi:0.1:3*pi; y=sin(x); fill(х,у,'r') Рис. 6.14. Функция fill 6.1.2. Диаграммы и гистограммы Пример 6.13 Диаграмма с областями (рис. 6.15). area(rand(10,3)) grid on colormap summer set(gca,'Layer','top'); title ' Stacked Area Plot' Puc. 6.15. Диаграмма с областями - функция area
6.1. Двумерная графика 111 Пример 6.14 Столбчатая диаграмма матричных данных (рис. 6.16). d= rand(10,3); bar(d,'stacked') Puc. 6.16. Столбчатая диаграмма матричных данных Пример 6.15 Столбчатая диаграмма вектора результатов измерений в зависимо- сти от времени измерения в некоторые моменты времени. Пропущенные столбики на диаграмме соответствуют тем моментам времени, когда из- мерения не проводились (рис. 6.17). time =[0 1 2 4 6 8 9 10 11 12]; data=rand(l,10)*10; bar(time,data) Рис. 6.17. Столбчатая диаграмма - функция bar
112 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА Пример 6.16 Круговая диаграмма (рис. 6.18). x=rand(l,15); explode=x./sum(х)<.05; pie(х,explode) Рис. 6.18. Круговая диаграмма - функция pie Пример 6.17 Ступенчатый график (рис. 6.19). stairs ([1 3 6 4 2 0]); grid on Рис. 6.19. Ступенчатый график - функция stairs
6.1. Двумерная графика 113 Пример 6.18 Гистограммы векторных данных. Следующие команды заполняют вектор data числами, распределенными по нормальному закону, разби- вают интервал, которому они принадлежат, на указанное число равных частей (десять по умолчанию) и строят гистограмму попадания чисел в каждый из интервалов (рис. 6.20). data=randn(100000,1); hist(data,30) Рис. 6.20. Гистограммы векторных данных - функция hist Пример 6.19 Угловые гистограммы (в полярных координатах) дают наглядное представление о данных, связанных с измерениями направлений. Аргу- ментом функции является вектор значений в радианах (рис. 6.21). theta=2*pi*rand(l,50); rose(theta) Рис. 6.21. Угловая гистограмма в полярных координатах - функция rose
114 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА 6.1.3. Контурные графики Пример 6.2 0| Изобразить линии уровня на плоскости ху (функция contour) и подписать для каждой линии уровня соответствующее значение (функ- ция clabel), которое принимает на ней исследуемая функция, как пока- зано на рис. 6.22. [х, у] =meshgrid (-2 : .1:2,... -1:.1:1); z=x.*ехр(-х.Л2-у.Л2); [с,h]=contour(х,у,z); clabel(с,h) Рис. 6.22. Линии уровня - функция contour Наглядную информацию об изменении функции дает заливка пря- моугольника на плоскости ху цветом, зависящим от значения функции в точках плоскости (рис. 6.23). [х, у] =meshgrid (-2 : .1:2,... -1:.1:1); z=x.*ехр(-х.л2-у.л2); contourf(х,у,z); colorbar Рис. 6.23. Линии уровня - функция fcontour
6.1. Двумерная графика 115 6.1.4. Векторные поля Пример 6.21 Вычисление градиента сеточной функции. Визуализация вектор- функции (рис. 6.24). [х, у] =meshgrid (-2 : .2:2,... -1:.15:1); z=x.*ехр(-х.Л2-у.Л2); [ dx, dy ] =gradient (z, . 2,... • 15) ; quiver(x,у,dx,dy) sx=-. 75+... .l*cos(0:.1:2*pi); sy= .l*sin(0:.1:2*pi); streamline (x, у, dx, dy,... sx,sy) Puc. 6.24. Векторный анализ Пример 6.22 Визуализация вектор-функции от трех переменных, определенной на некоторой поверхности. Матрицы х, у, z описывают поверхность, а матрицы u, v, w содержат компоненты вектор-функции в соответствую- щих точках пространства (рис. 6.25).
116 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА [х, у,z]=sphere; [u,v,w]=surfnorm(x,у,z); mesh (x, y, z) hold on quiver3(x,y,z,u,v,w) Puc. 6.25. SD-векторные поля 6.2. Трехмерная графика Изображение графиков функций двух переменных (трехмерных ли- ний и поверхностей) требует реализации трехмерной графики на плос- ком экране дисплея компьютера. Высокоуровневые графические функ- ции системы MATLAB автоматически реализуют трехмерную графику. Многие приемы построения и оформления трехмерных графиков совпа- дают с теми, что используются при построении плоских графиков функ- ций одной переменной. • График функции двух переменных в линейном масштабе в декартовой системе координат: plot3. - plot3(x,y,z) - график с узлами (xk, ук, zk); - дополнительный строковый аргумент задает: § тип маркеров: ., +, *, о, х, s, d, v, Л, <, >, р, h; § стиль линии: :, -., —; § цвет линии: у, m, с, г, g, b, w, к; - plot3 (xl,yl, zl,x2,y2, z2,„.) - построение нескольких гра- фиков в одной системе координат; - справка: » help plot3. • График, заданный параметрически: ezplot3. • Поверхность, заданная параметрически: ezmesh, ezsurf.
6.2. Трехмерная графика 117 • Поверхность: mesh, surf, surfl, cylinder, sphere; вспомога- тельные функции: meshgrid, ndgrid. • Каркасные поверхности: mesh, meshc, meshz, peaks, surf, surfc, waterfall; вспомогательные функции: hidden. • Формирование, построение и маркировка линий уровня: contour, contour3,contourc, contourf, clabel. • Триангуляционная поверхность: trisurf, trimesh. • Диаграммы и гистограммы: ЬагЗ, bar3h, hist3, pie3, stem3. • Закрашенный многоугольник в трехмерном пространстве: fill3. • График функции в указанном интервале: fplot, ezplot. • Анимированный график трехмерной линии: comet3, ezplot3. • Визуализация функции трех переменных на различных плоскостях или поверхностях: slice, contourslice. • График поля направлений: quiver3, streamline. • Закрашивание поверхности: shading, brighten, colormap, co- lorbar. • Справка: help graph3d, help specgraph. 6.2.1. ЗБ-графики функций и поверхностей Пример 6.23 Построить винтовую линию, как показано на рис. 6.26. t = 0:pi/50:10*pi ; х = sin(t); у = cos (t); plot3(x, y, t); grid on Puc. 6.26. Трехмерная линия, заданная параметрически
118 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА Пример 6.24 Функция ezplot3 (рис. 6.27). rl=@ (t) exp(-0.2*t) .*cos (t); r2=@ (t) exp(-0.2*t) .*sin (t); r3 = @(t) t; ezplot3 (rl, r2, r3,... [0,20],'animate') Puc. 6.27. Анимированный график пространственной линии - функция ezplot3 Пример 6.25 Следующий код строит полигональную поверхность (рис. 6.28). х=[0 1 0; 0 1 0; 0 0 0; 0 1 0] ' ; у= [0 0 1; 0 0 0; 0 1 0; 0 0 1] ' ; z=[0 0 0; 0 0 1; 0 0 1; 1 0 0] ' ; rgb = [0 .8 .2]; fill3(х,у,z,rgb) grid on Рис. 6.28. Полигональная поверхность - функция fi!13
6.2. Трехмерная графика 119 Пример 6.26 Построение ЗВ-поверхностей (рис. 6.29). [х, у] =meshgrid (-2 : .1:2,... -1: .1:1); z=x.*ехр(-х.л2-у.л2); mesh (х, у, z) ; » surf(х,у,z) Рис. 6.29. Построение ЗП-поверхности - функции mesh, surf Пример 6.27 Построение освещенных поверхностей (рис. 6.30). [х,у,z]=peaks(100); surfl(х,у,z) shading interp colormap(gray(1000)) axis([-3,3,-3,3,-8,10]) Puc. 6.30. Построение освещенной 3D-поверхности - функция surfl
120 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА Пример 6.28 Построение линий уровня функции двух переменных (рис. 6.31). [х,у,z]=peaks(100); contour3(х,у,z,3 0); Рис. 6.31. Построение линий уровня ЗО-поверхности - функция contour3 Пример 6.29 Триангуляция в пространстве (рис. 6.32). х = rand(l,50); у = rand(l,50); z = peaks(6*х-3,6*х-3); tri = delaunay(х,у); trisurf(tri,х,у,z) 2> Рис. 6.32. Триангуляционная поверхность в ЗО-пространстве - функция trisurf
6.2. Трехмерная графика 121 Пример 6.30 Функция ezsurf. Построение параметрически заданной поверхно- сти (рис. 6.33). ezsurf (' u*cos (v) ' ,... ' u*sin (v) ' , ' 2*v',... [0,8*pi]); axis equal colormap default colorbar shading flat x = u cos(v), у = u sin(v), z = 2 v 40 30 20 10 Puc. 6.33. Параметрически заданная ЗП-поверхность - функция ezsurf Пример 6.31 Функция ezmesh. Построение параметрически заданной поверхно- сти (рис. 6.34). х=@ (theta,phi) (10+... 4*cos(theta)).*cos(phi); y=@(theta,phi) (10+... 4*cos(theta)).*sin(phi); z=@(theta,phi) 4*sin(theta) ezmesh (x, y, z) axis equal (10+4 cos(6)) соз(ф), у = (10+4 cos(6)) sin(<|>). z = 4: Puc. 6.34. Параметрически заданная ЗП-поверхность - функция ezmesh
122 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА 6.3. Оформление графиков функций Построенные графики функций должны быть максимально удобны- ми для восприятия, что достигается при помощи их правильного оформ- ления: цветом, толщиной и типом линий, которыми проведены сами гра- фики, маркерами в дискретных вычисляемых точках, а также различны- ми надписями в пределах графического окна и настройками осей систе- мы координат графического окна. 6.3.1. Управление видом графика Ниже приведены основные функции, предназначенные для установ- ки требуемого вида осей координат графического окна: • axis ( [xmin xmax ymin ymax zmin zmax]), axis ( [xmin xmax ymin ymax]): установка границ осей координат; • axis on, axis off: восстановление/отключение изображения осей и насечек; • axis (' i j '), axis (' xy'): матричная/декартова система коорди- нат; • axis square, axis normal, axis equal, axis tight, axis auto, axis manual: режимы масштабирования осей; • daspect: изменение или получение масштаба осей; • pbaspect: установка или определение соотношения длин осей; • grid on, grid off: восстановление/отключение изображения ко- ординатной сетки; • box on, box off: восстановление/отключение изображения систе- мы координат в Ьох-формате; • view ( [az, el]), view ( [x, у, z]), view (2), view (3): установка или определение точки обзора (положения камеры); • camdolly, camlookat, camorbit, campan, campos, camproj, camroll, camtarget, camup, camzoom: управление камерой. Пример 6.32 Выбор точки обзора view и управление камерой cam*. [х у z] = sphere; si = surf(x,y,z); % Нижняя сфера
6.3. Оформление графиков функций 123 hold on s2 = surf(х+3,у,z+3) ; % Средняя сфера s3 = surf(х,у,z+6); % Верхняя сфера daspect( [1 1 1]) title('view by default') pause(2) title('view(30,90)') view(30, 50) % azimuth, elevation for i=0:360 % полет камеры title(num2str(i*l,'view(azimuth=%ld,elevation=30)')) view(i*l, 30) end title('camproj orthographic') camproj orthographic title('camproj perspective') camproj perspective % Навести камеру на НИЖНЮЮ сферу title('camera look at bottom') camlookat(si) % Навести камеру на СРЕДНЮЮ сферу title('camera look at middle') camlookat(s2) % Навести камеру на ВЕРХНЮЮ сферу title('camera look at top') camlookat(s3) % Навести камеру на ВСЮ сцену title('camera look at all scene') camlookat(gca) % views the objects identified in % the vector object_handles % Стандартный вид сверху - 2D (плоский) график title('view(2) - 2D-scene - view from top') view(2) % Стандартный ЗВ-вид title('view(3) - 3D-scene') view(3)
124 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА 6.3.2. Изменение свойств линии • Дополнительный строковый аргумент функций plot, plot3 задает цвет и стиль линии и тип маркеров: - тип маркеров: ., +, *, о, х, s, d, v, Л, <, >, р, h; - стиль линии: :, -., —; - цвет линии: у, m, с, г, g, b, w, к; - в строковом аргументе можно указывать один, два или три символа; - порядок, в котором указываются символы, не существенен. • Изменение толщины линии: изменение свойства ' Linewidth' гра- фического объекта (дескрипторная графика). Пример 6.33 Изобразить график красной сплошной линией, на которой в дис- кретных вычисляемых точках проставлены черные квадраты (рис. 6.35). х = 0 : 0.1: 3; plot(x,x,'r',x,x,'ks') Рис. 6.35. Изменение свойств графика Пример 6.34 Изменить толщину линии графика (рис. 6.36). х = 0 : 0.1: 6; hl = plot(x, sin(x)); set(hl,'Linewidth',6); Puc. 6.36. Изменение толщины линии
6.3. Оформление графиков функций 125 6.3.3. Надписи на графиках Хорошее восприятие графиков во многом обеспечивается дополни- тельными элементами оформления: наличием координатной сетки, под- писями к осям системы координат, заголовком и легендой: • clabel: подписи к линиям уровня на контурных графиках; • gtext: вывод текста в интерактивно определяемое место на графике (указать место мышкой и щелкнуть); • legend: идентификация графиков (легенда); • title: вывод заголовка; • text: вывод текста в заданную позицию графика; • xlabel, ylabel, zlabel: маркировка осей; • colorbar: цветовая легенда; • grid on/off: координатная сетка. Пример 6.35 Вывод и оформление графика (рис. 6.37). Текстовые строки могут содержать специальные символы, которые вводятся внутри текста после символа \ («обратная косая черта»). Обозначения для специальных символов совпадают с обозначениями в системе подготовки научных текстов ТеХ. Angle а Рис. 6.37. Оформление графика подписями » X=linspace(0,2*pi); Y=[sin(X);cos(X)]; hl=plot(X, Y)'; set(hl(1),'linewidth',5,'linestyle','—') h2=title('Trigonometric Functions'); xlabel('Angle \alpha','fontsize',12);
126 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА h3=legend(['sin \alpha'; 'cos \alpha'],-1); set([h2,h3,gca]fontsize', 12); text(pi/4,sin(pi/4)sin\pi/4 = cos\pi/4'); axis tight, grid on 6.4. Сохранение графических изображений Форматы графических файлов: • Перечень поддерживаемых форматов: imformats, fileformats. • Изображения: - поддерживаемые графические форматы чтения и записи: JPEG, TIFF, BMP, PNG, HDF, PCX, XWD; - только чтение (MATLAB 6): GIF, ICO, CUR; - команда чтения: imread, importdata; - команда записи: imwrite; - информация о файле: iminf о; - вывод изображения: image, colormap; дополнительно: getframe, frame2im, capture; - при экспорте в графический файл записывается только клиентская часть графического окна без меню и панели инструментов; - сохранение клиентской части графического окна в выбранном формате: пункт меню File | Save as... графического окна; - команда сохранения изображения в буфере обмена в формате Bitmap:» print -dbitmap; - команда сохранения изображения в файле указанного графическо- го формата: » print -dformat filename. • Фильмы: - MATLAB-Movie: getframe, im2frame, movie; - AVI-файлы (MATLAB 6): movie2avi, aviinfo, avifile, aviread, addframe. Пример 6.36 Чтение графического файла 180 .gif. Функция imread считывает графическую информацию из файла. В массив ColorMap считывается
6.5. Лабораторный практикум № 6 127 информация о цвете, которую также необходимо загружать при выводе изображения в графическое окно. » [Image,ColorMap] = imread('180.gif'); » image(Image) Вывод изображения командой image приводит к появлению изо- бражения, как показано на рис. 6.38, а. Загрузка цветовой палитры ко- мандой colormap приводит к конечному варианту графического изо- бражения (рис 6.38, Ь). » colormap(ColorMap) Рис. 6 38. Считывание и визуализация графического файла computerwofld 6.5. Лабораторный практикум № 6 6.5.1. Теоретические вопросы 1. Высокоуровневая графика. 2. Двумерная графика. 3. Построение графиков функций в декартовых координатах. 4. Построение графиков функций в полярных координатах.
128 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА 5. Построение графиков функций, заданных параметрически. 6. Анимированный двумерный график. 7. Диаграммы и гистограммы. 8. Оформление графиков функций: оси координат. 9. Оформление графиков функций: надписи на графике. 10. Изменение свойств линий. 11. Трехмерная графика. 12. Построение поверхностей. 13. Линии уровня. 14. Управление камерой. 15. Сохранение графических изображений. 16. Форматы графических файлов. 6.5.2. Задания Задание 6.1 Построить график функции в полярных координатах: a) y=sin (2t) cos (2t) tc[O, 2л]; b) г = 2 cos (phi), -л/2 < phi < л/2. Задание 6.2 Построить график функции x(t)= efcsin t на отрезке [-2л, 2л]. Отобразить функцию x(t) на отрезке [-1, О в виде столбчатой диа- граммы без промежутков. Задание 6.3 Представить результат случайных измерений трех величин за четы- ре момента времени в виде матрицы случайных значений 3x4. Отобра- зить результат: а) в виде столбчатой диаграммы сгруппированных дан- ных с перекрывающимися столбцами; б) в виде столбчатой диаграммы с накоплением; в) в виде диаграммы с областями. Задание 6.4 В одной системе координат на отрезке [-2л, 2л] построить графики функций /(х) = е-01х sin2 х и g(x) = е~0 2х sin2 х.
6.6. Лабораторный практикум № 6 129 Задание 6.5 Построить график функции: a)/(x) = esin0-b, хе[-2л,2л]; b) /(х) = +з1соН, хе[-2л,2л]; с) /(x) = (l/3)|sinx|-2, хе[-5л,5л]; d)/(x) = 4cos|x|, хе[-2л,2л]; е)/(x) = 5sin2x-4cos|x|, |х| <5л; f) /(X) = sin2x-V3x, хе[-10, 10]. Задание 6.6 Решить графически уравнения: а)Зл=4-х; Ь) (12)' = х + 3; с) (l 3)' = х +1; d)4x=5-%; е)31"х=2%-1; f)3~x=-3/x. Задание 6.7 Построить график показательной функции /(х)=102л на отрезке [-0.5, 5] в линейном, логарифмическом и полулогарифмическом масшта- бах в одном графическом окне в разных системах координат. Задание 6.8 Построить графики изменения суточной температуры за 22 мая, 8 августа и 11 сентября. Температура измерялась в течение трех суток каждый час. Графики должны быть изображены разным цветом с марке- рами в узловых точках. Координатная сетка должна отображаться. Гра- фик должен быть снабжен всей необходимой информацией: подписями к осям координат «Время (час)» и «Температура (С)», легендой, заголов- ком «Суточные температуры». Задание 6.9 Построить график функции sin(2*t) .*cos(2*t) в полярных координатах, 1е[0,2л]. Задание 6.10 Построить график функции, заданной параметрически: а) х (t) =0.5sin (t) , у (t) =0.8cos (t), te[O, 2л];
130 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА b) x(t) = sin(2t), y(t) = cos(3t), 111 <2л; c) x(t) = (1+t2) sin(20t) , у (t) = (1-t2) cos(20t) , z=t, te[-5,5]; d) x(t)=cos(3t) cos(t), y(t)=cos(3t) sin(t), t e [0, 2л] (график трохоиды). e) x(t) =t-sin(t), у (t) =1—cos (t), 1с[0,4л]; f) x=cos(t), y=sin(t), z=t, to [0, 20л] (винтовая линия); g) x=e-|t"50|/50sin(t), y=e-|t”50|/50cos (t), z=t, t e [0, 100]; h) x(u,v)=0.3ucos(v), y(u,v)=0.3usin(v), z(u,v)=0.6u, u, v g [-2л, 2л] (конус); i) x(u,v)=cos(u)cos(v), у (u, v) =0 . 7cos (u) sin (v), z(u,v)=0.8sin(u), u, v g [-2 л, 2 л] (эллипсоид). Задание 6.11 Построить прозрачную каркасную поверхность фигуры, заданной соотношениями: а) х(u,v)=0.3 и cos(v), у(и,v)=0.3 и sin(v), z (и, v) = 0 . би, и, vg [-2л, 2л] (конус); Ъ) х(и, v)=cos(и)cos(v), у(и,v)=0.7cos(и)sin(v), z(u,v)=0.8sin(u), и, v g [-2 л, 2 л] (эллипсоид) на квадратной области определения. Задание 6.12 Построить график функции двух переменных на прямоугольной об- ласти определения: a) z (х, у) =4sin ( 2лх) cos (1.5лу) (у-1) у, xg[-1, 1], ус[0, 1]; b) z (х, у) =-e”y2cos (Злх) (1-х) ху, xg[-1, 1], ус[-2, 2]; с) z (х, у) =х2+у2, xg[-3, 3], ус[-3, 3]; d) z(x,у) = sin(Jх2+у2 +0.01)/^х2 + у2 +0.01^, xg[-8, 8], ус[-8, 8]; е) z= sin (х) . *sin (у), xg[0, 100], ус[0, 100]; f) z = sin (х) sin (у) + . 3cos (2х-3у) - . 2sin (х+2у), х, ус[0, 100].
6.6. Лабораторный практикум № 6 131 Задание 6.13 Построить графики функций, заданных кусочным образом, в интер- вале [-3,3]: а) х, х<0 f(x) = < х2,0 < х < 2; 4,х>2 Ь) Г 1,|х|<1 /(%) = - х2,1 < |х| < 2; 0,|х|>2 Задание 6.14 Построить график баллистической траектории, заданной параметри- чески: x(t) = vtcos(p), y(t) = vtsin(p) - g t2/2. Началь- ная скорость v = 10 0 км/ч, угол вылета снаряда: ср = 6 0°. Задание 6.15 Построить траекторию движения точки на плоскости или в про- странстве в течение времени t: а) х (t) =sin (t) / (t + 1) , у (t) =cos (t) / (t+ 1), te[0, 10]; b) x (t) =e”11-5°1/50sin t, у (t) =e-|t"50|/50cos t, z=t, t e [0, 100]; c) x(t)=e”°‘2t cost, у (t) =e”°‘2t sint, z=t, t e [0, 20]. Задание 6.16 Построить траекторию движения фиксированной точки на окружно- сти, катящейся по прямой (циклоиду). Циклоида описывается парамет- рическими зависимостями: x(t)= t-sin(t), у(t)=l-cos (t), te[0, 20]. Задание 6.17 Создать два графических окна. Построить в одном окне графики функций f (х) =sin х, g(x)=0.5sin х, в другом окне - график функции q(x)=ln х. Оформить графические окна: нанести заголовки, легенды, подписи к осям. Нанести координатную сетку на второй гра- фик. Аргументы изменяются в пределах [0, 10].
ТЕМА 7 ОСНОВЫ ДЕСКРИПТОРНОЙ ГРАФИКИ Дескрипторная графика (Handle Graphics) - это объект- но ориентированная графическая система, основанная на низкоуровне- вых графических функциях. Объектами дескрипторной графики являют- ся базовые графические элементы, используемые для визуализации дан- ных. Каждый графический объект пронумерован, ему присваивается уникальный идентификатор - дескриптор (handle), используя который можно управлять свойствами графических объектов при помощи соот- ветствующих функций. Дескрипторная графика позволяет также разра- батывать приложения, оснащенные полноценным графическим интер- фейсом пользователя с кнопками, пунктами меню, окнами редактирова- ния, полосами прокрутки и другими стандартными графическими ком- понентами, обычно присутствующими в интерфейсах приложений. 7.1. Описание графических объектов 7.1.1. Иерархия графических объектов • Древовидная иерархическая структура графических объектов. • Каждый тип объекта обладает своими собственными свойствами. • Каждому объекту ставится в соответствие уникальное число- дескриптор (Handle). • Типы графических объектов (рис. 7.1): - root - вершина иерархии, соответствующая экрану компьютера (Handle 0); - figure - окно для вывода графики и пользовательских интерфей- сов (Handle - номер графического окна, натуральное число); - axes - оси (система координат) в графическом окне; - uicontrol - управляющий элемент GUI; - uimenu - оконное меню пользователя;
7.1. Описание графических объектов 133 - uicontextmenu - контекстное меню пользователя, появляющее- ся при щелчке правой кнопки мыши на объекте; - image - двумерное растровое изображение (2В-объект); - light - источник освещения, воздействующий на графические объекты типа patch и surface (ЗВ-объект); - line - плоская или пространственная линия (ЗВ-объект); - patch - замкнутый закрашенный полигон с ребрами (ЗВ-объект); - rectangle - двумерная фигура, изменяющаяся от прямоугольни- ка до эллипса (2В-объект); - surface - трехмерная поверхность (ЗВ-объект); - text - символьная строка (ЗВ-объект). Рис. 7.1. Иерархия графических объектов MATLAB 7.1.2. Дескрипторы графических объектов • При помощи дескриптора Handle можно изменять свойства графи- ческого объекта; • gcf: дескриптор активного графического окна Figure; • gca: дескриптор активной системы координат Axes;
134 Т е м а 7. ДЕСКРИПТОРНАЯ ГРАФИКА • allchild(Н): дескрипторы всех графических объектов, подчинен- ных объекту с дескриптором Н; • get: показать свойства объекта: - get (Н): вывод списка текущих значений свойств графического объекта с дескриптором Н; - get (Н, 'PropertyName '): вывод текущего значения указанно- го свойства объекта; • set: установить свойства объекта или показать возможные значения отдельного свойства: - set (Н): вывод списка возможных значений всех свойств объекта; - set(H, 'PropertyName'): вывод списка возможных значений указанного свойства объекта; - set(Н, 'PropertyName','PropetyValue'): установка но- вого значения указанного свойства объекта; • set (gcf): вывод списка возможных значений всех свойств текуще- го графического окна Figure; • set (gca): вывод списка возможных значений всех свойств текущей системы координат Axes; • propedit (Н): вызов Редактора Свойств Property Editor для редактирования свойств графического объекта с дескриптором Н; • reset (Н): восстановление стандартных значений свойств по умол- чанию графического объекта с дескриптором Н; • почти все графические функции возвращают дескрипторы созданных ими графических объектов; • get (f indob j, 'type'): вывод списка типов всех созданных гра- фических объектов; • delete (f indob j (' Color' , ' k') ): поиск и удаление всех объек- тов красного цвета; • delete (f indob j (' type ' , ' Line ') ): удаление всех графических объектов типа «линии». Пример 7.1 Функция get: вывод списка текущих значений свойств графическо- го объекта.
7.1. Описание графических объектов 135 » t = 0:pi/20:2*pi; » h=plot(t,sin(t)) % h = 152.0089 » get(h) Color: EraseMode: LineStyle: Linewidth: Marker: MarkerSize: MarkerEdgeColor: MarkerFaceColor: XData: YData: ZData: BeingDeleted: ButtonDownFcn: Children: Clipping: CreateFcn: DeleteFcn: BusyAction: Handlevisibility: HitTest: Interruptible: Selected: SelectionHighlight: Tag: Type : UIContextMenu: UserData: Visible: Parent: DisplayName: XDataMode: XDataSource: YDataSource: ZDataSource: графический объект line [1 0 0] 'normal' 0.5000 'none' 6 'auto' 'none' [1x41 double] [1x41 double] [1x0 double] ' off ' [] [0x1 double] ' on ' [] [] 'queue' ' on ' ' on ' ' on ' ' off ' ' on' 'line' [] [] ' on' 151.0048 'manual'
136 Т е м a 7. ДЕСКРИПТОРНАЯ ГРАФИКА Пример 7.2 Графические объекты и их свойства. Функция set: установка новых значений свойств графических объектов (рис. 7.2). » X=linspace(-pi/2,3*pi); » Y=[sin(X);cos(X)]; » hl=plot(X, Y)' hl = 152.0114 153.0054 » set(hl(1),'linewidth',5,'linestyle','—') » set(hl(2)linewidth2) » h2=title('Trigonometric Functions'); » xlabel('Angle \alpha','fontsize',12); » h3=legend(['sin \alpha';'cos \alpha'],-1); » set([h2,h3,gca],'fontsize',12); text(3*pi/4,sin(3*pi/4),... ['sin(3*pi/4) = ',num2str(sin(3*pi/4))],... 'HorizontalAlignment','center',... 'Backgroundcolor',[.7 .9 .7]); text(pi/2,cos(pi/2),... '\leftarrowcos(\pi) = 0',... 'HorizontalAlignment','left',... 'EdgeColor','red'); » axis tight Puc. 7.2. Изменение свойств графических объектов
7.1. Описание графических объектов 137 7.1.3. Свойства графических объектов figure и axes • figure: открыть графическое окно figure (команда); • gcf: получить дескриптор текущего объекта figure; • elf: очистить графическое окно figure; • close: закрыть графическое окно figure; • refresh: обновить графическое окно figure; • axes: создать оси координат Axes (команда); • дса: получить дескриптор графического объекта Axes; • cl а: очистить оси координат Axes. 7.1.4. Свойства по умолчанию графических объектов • Возможно изменение значения свойств, установленных по умолча- нию, на уровне родительских объектов; • set (0, 'DefaultObjectProperty', Propertyvalue): измене- ние заданного по умолчанию свойства объекта на уровне родитель- ского объекта Root (все вновь создаваемые объекты выбранного типа будут иметь новое значение по умолчанию указанного свойства); • set (gcf, ' Def aultOb jectProperty', Propertyvalue): из- менение заданного по умолчанию свойства объекта на уровне роди- тельского объекта Figure (для всех вновь создаваемых в текущем графическом окне Figure объектов выбранного типа); • set (gca, ' DefaultOb jectPropertyPropertyvalue): из- менение заданного по умолчанию свойства объекта на уровне роди- тельского объекта Axes (для всех вновь создаваемых в текущей сис- теме координат Axes объектов выбранного типа); • get (0, 'default'): возвращает все измененные значения свойств по умолчанию; • get (gcf, ' def ault'): возвращает все измененные значения свойств по умолчанию для текущего графического окна; • get (gca, ' default'): возвращает все измененные значения свойств по умолчанию для текущей системы координат; • set (0, 'DefaultObjectProperty', 'remove'): восстанавли- вает значение свойства по умолчанию на уровне объекта Root;
138 Т е м а 7. ДЕСКРИПТОРНАЯ ГРАФИКА • set (gcf, ' DefaultObjectProperty' , ' remove '): восстанав- ливает системное значение свойства по умолчанию на уровне текуще- го графического окна; • set (gca, ' Def aultOb jectProperty' , ' remove '): восстанав- ливает системное значение свойства по умолчанию на уровне текущей системы координат. Пример 7.3 Установить новое значение по умолчанию, равное 2.5, для свойства «толщина линии» Linewidth графического объекта Line на уровне текущего графического окна. » set(gcf,'DefaultLineLineWidth',2.5) Пример 7.4 Установить новое значение по умолчанию, равное белому, для свой- ства «цвет» Color графического окна Figure. » set (0, 'DefaultFigureColor', 'b') Обратите внимание, что изменять значения свойств по умолчанию для графического окна Figure можно только на корневом уровне Root! Пример 7.5 При прорисовке в одной системе координат нескольких линий при помощи функции plot или plot3 по умолчанию используются: один стиль линий - сплошная линия, и циклическое чередование цветов. Сле- дующий пример (MATLAB HELP) изменяет значения по умолчанию та- ким образом, чтобы использовался для всех линий только один цвет (свойство ColorOrder) и циклическое чередование стилей (свойство LineStyleOrder). %create a figure with a white color scheme » whitebg('w') %set default property values that cause the plot %function to produce graphs using varying %linestyles, but not varying colors » set (0, 'DefaultAxesColorOrder', [0.5 0.5 0.8],...
7.1. Описание графических объектов 139 'DefaultAxesLineStyleOrder','-|—|:|-.') Теперь всякий раз при вызове команды » Z = peaks; plot(1:49,Z(1:7,:)) используется одинаковый цвет [0.5 0.2 0.8] линий и циклически изменя- ется стиль линий (рис. 7.3). Рис. 7.3. Циклическое чередование стилей линий Пример 7.6 Следующие команды назначают значения red, green и blue свойству по умолчанию ColorOrder и значения solid, dashed и dotted lines свойству по умолчанию LineStyleOrder. » set (0, 'DefaultAxesColorOrder', [1 0 0;0 1 0; 0 0 1]DefaultAxesLineStyleOrder| — I:’) Теперь при прорисовке нескольких линий MATLAB выполняет циклическую выборку всех цветов последовательно для каждого стиля линии (рис. 7.4): » t = 0:pi/20:2*pi; а = ones(length(t),9); for i = 1:9 a(:,i) = sin(t-i/5)'; end h=plot(t,a) set(h,'Linewidth2)
140 Т е м a 7. ДЕСКРИПТОРНАЯ ГРАФИКА Рис. 7.4. Циклическое чередование цветов и циклическое чередование стилей линий Пример 7.7 Следующие команды отображают регулярную трехмерную поверхность при помощи графического объекта Surface и последовательно изменяют ее вид. » title('SURFACE — regular surface') t= 0:pi/10:2*pi; [X,Y,Z]= cylinder(.7+.3*cos(t)); Z= Z-0.5; h= surface(X,Y,Z); view(3) axis square % Свойства объекта SURFACE set( h, 'FaceColor','c', 'EdgeColor','b', ... 'Linewidth3, 'Marker','©', 'MarkerSize',10, ... 'MarkerFaceColor','y', 'MarkerEdgeColor','m'); % Раскраска ребер set( h, 'FaceColor','none', 'Marker','none'); set( h,'EdgeColor','flat'); title('FaceColor = none; EdgeColor = flat') set(h,'EdgeColor','interp'); title('FaceColor = none; EdgeColor = interp') % Раскраска граней
7.1. Описание графических объектов 141 set( h, 'FaceColor','с', 'EdgeColor','none'); set( h,'FaceColor','flat'); title('FaceColor = flat; EdgeColor = none;') set(h,'FaceColor','interp'); title('FaceColor = interp; EdgeColor = none') % Раскраска ребер set( h, 'EdgeColor','k', 'Linewidth',0.5); title('FaceColor = interp; EdgeColor = black') Введите последовательно команды и изучите их действие. Пример 7.8 Графический объект Patch задается координатами своих вершин и данными цветовой палитры. Существует два способа определения гра- фического объекта Patch: • определение координат всех вершин каждого полигона, которые MATLAB соединяет в поверхность; • определение координат всех уникальных вершин и матрицы, которая указывает, как соединить эти вершины для создания поверхности. Второй способ предпочтителен в тех случаях, когда описание объ- екта содержит много вершин. Любая вершина, совместно используемая при создании нескольких многоугольников, встречается в описании только один раз. Следующий фрагмент кода строит куб, каждая грань которого рас- крашена в свой цвет: » vm=[0 0 0; 1 0 0; 1 1 0; 0 1 0; 0 0 1; ... 10 1; 111; 0 11]; fm=[l 2 6 5;2 3 7 6;3 4 8 7; 4 1 5 8; 1:4; 5:8]; elf; view(3); axis square patch('Vertices',vm,'Faces',fm,... 'FaceVertexCData',hsv(6),'FaceColor','flat'); Правильный 10-угольник желтого цвета можно построить, вызвав следующие команды: » elf
142 Т е м а 7. ДЕСКРИПТОРНАЯ ГРАФИКА t = 0:pi/5:2*pi; patch (sin(t), cos (t), 'y') axis equal 7.2. Лабораторный практикум № 7 7.2.1. Теоретические вопросы 1. Дескрипторная графика. 2. Взаимосвязь между высокоуровневой и дескрипторной графи- кой. 3. Дескриптор графического объекта. 4. Иерархия графических объектов. 5. Графический объект root. 6. Графический объект figure. 7. Графический объект axes. 8. Объекты uimenu, uicontextmenu, uicontrol. 9. Графический объект image. 10. Графический объект light. 11. Графический объект line. 12. Графический объект patch. 13. Графический объект rectangle. 14. Графический объект surface. 15. Графический объект text. 16. Управление свойствами графических объектов. 17. Свойства по умолчанию. 7.2.2. Задания Задание 7.1 Изучите свойства графических объектов и приведите примеры их использования. Задание 7.2 Графический объект Rectangle представляет двумерную закра- шенную область, которая может принимать определенную форму от прямоугольника до эллипса:
7.2. Лабораторный практикум №7 143 » elf; set (gca, 'Visible', 'off'); rectangle( 'Position', [-.9 -.4 1.8 .8], ... 'Curvature', [1 1], 'FaceColor', [1 .7 .7]); rectangle( 'Position', [-.8 -.3 1.6 .6], ... 'Curvature', [.5 .5], 'FaceColor', [.7 1 .7]); rectangle( 'Position', [-.7 -.2 1.4 .4], ... 'Curvature', [0 0], 'FaceColor', [.7 .7 1]); Получите дескриптор графического объекта Rectangle, выведите текущие и возможные значения его свойств. Постройте различные пря- моугольники, изменяя значения их свойств. Задание 7.3 Создайте два графических окна Figure и циклически выведите графики fk (х) =k sin(x) идк(х)=к cos (х), к=1, ...6, хе[-3л, Зя] поочередно в одно из окон. Задание 7.4 Следующий код использует функцию line для добавления тени к нарисованному графику функции sin. Сначала при помощи функции plot рисуется линия, и ее дескриптор сохраняется в hlinel. Затем добавляется более широкая и более светлая тень смещением по коорди- нате х. Наконец, первая линия помещается поверх второй. » t = 0:pi/20:2*pi; hlinel = plot (t, sin(t), 'k'); hline2 = line (t+.06,sin(t),'Linewidth',4, ... 'Color', [.8 .8 .8]); set (gca, 'Children', [hlinel hline2]) Добавьте еще две более широкие и более светлые линии. Затем из- мените цвет самой тонкой линии на синий, стиль - на пунктирный, а ее толщину установите равной 2 points (1 point = 1/72 inch). Изменения выполните, используя дескриптор графического объекта. Задание 7.5 Введите команды, рисующие двадцать линий разных цветов сплошной линией толщиной 0.5 (свойства по умолчанию).
144 Т е м а 7. ДЕСКРИПТОРНАЯ ГРАФИКА » t = 0:pi/20:2*pi; а = ones(length(t),9); for i = 1:20 a(:,i) = sin(t-i/5)'; end plot(t,a) Затем найдите все линии красного цвета и удалите их. После этого найдите все линии синего цвета и измените их толщину на 2. Найдите все линии какого-либо третьего цвета и измените их стиль на штрих- пунктирный. Задание 7.6 Напишите Script-файл compensline .m: % input some points using the mouse disp('Input points. Press the Return key to termi- nate the input. ') delete(gca); axes('xLim',[0 10], 'yLim',[0 10]); axis square grid on [X,Y]=ginput; % calculate a straight line K=[X(:),ones(length(X), 1)]\Y(:); m=K(l), c=K(2) % visualize the straight line plot(X,Y,'ГО') hold on C=sprintf('%d|',1:size(X,1)); C(end)=[]; text(X,Y,C,'Color','b','Fontweight','bold'); plotx=[min(X),max(X)]; plot(plotx, m*plotx+c); title(sprintf('y=%gx+%g',m,c)) ! Какие действия выполняет этот код? Подтвердите свою гипотезу вы- числениями и графическим изображением.
ТЕМА 8 ИМПОРТ И ЭКСПОРТ ДАННЫХ 8.1. Чтение/запись файлов разных форматов Протокол-файл: diary. Операции над именем файлов: fileparts, filesep, fullfile, tempdir, tempname. Перемещение данных между файлами и рабочим пространством Workspace: importdata, load, save, open, winopen. Низкоуровневый файловый ввод/вывод (Low-Level File VO): fopen, fclose,fwrite,fprintf, fread, fscanf. Форматированный или с разделителями ввод/вывод в текстовый файл: csvread, csvwrite, dlmread, dlmwrite, textread, textscan. Документы XML: xmlread, xmlwrite, xslt. Электронные таблицы (Excel и Lotus 123 файлы): xlsfinfo, xlsread, xlswrite,wklfinfo,wklread, wklwrite. Научные данные CDF, FITS, HDF форматов: cdfinfo, cdfepoch, cdfread, cdfwrite, fitsinfo, fitsread, hdf, hdfinfo, hdfread, hdf 5write. Аудио-, видеофайлы: audioplayer, audiorecorder, beep, lin2mu, mu21in, sound, soundsc, auread, auwrite, wavplay, wavread, wavrecorder, wavwrite, addframe, avifile, aviinfo, aviread, movie2avi. Графические файлы: im2 java, imfinfo, imread, imwrite. Справка: help iofun.
146 Т е м a 8. ИМПОРТ И ЭКСПОРТ ДАННЫХ 8.2. Протокол-файл • Вся информация, вводимая и выводимая в командное окно Command Window, может быть сохранена в текстовом файле. • Имя протокол-файла: diary <' ProtokolFileName' >. • Имя по умолчанию: diary. • Старт режима протоколирования: diary on. • Окончание режима протоколирования: diary off. • Изменение статуса режима протоколирования: diary. • Справка: help diary. 8.3. Сохранение данных рабочего пространства • Специальный формат МАТ-файла, позволяющий сохранять данные из рабочего пространства Workspace в файлах на диске и считывать из файла в рабочее пространство. • Сохранение данных из рабочего пространства Workspace в файле: save <FileName> <VariablesList>: - файл получает расширение .mat; - save сохраняет значения всех переменных рабочего пространства в МАТ-файл MATLAB. mat; - save file сохраняет значения всех переменных рабочего про- странства в файл file. Если у файла file не указано расшире- ние, то данные запишутся в двоичный файл file .mat; - save file X Y Z. . . сохраняет указанные переменные. • load - загрузка данных из файла в рабочее пространство: - load загружает все переменные из МАТ-файла MATLAB. mat; - load file X Y Z загружает указанные переменные; - load file загружает все переменные из файла file. Если у file нет расширения, то функция ищет файл с именем file или file. mat и рассматривает его как двоичный МАТ-файл; - load -ascii file или load -mat file заставляет функ- цию рассматривать файл или как ASCII файл, или как МАТ-файл независимо от расширения;
8.3. Сохранение данных рабочего пространства 147 - S = load (...) возвращает содержимое МАТ-файла в перемен- ной S. Если файл является МАТ-файлом, то S - структура, со- держащая поля-переменные. Если файл содержит ASCII данные, то S - массив двойной точности. • importdata - загрузка данных из файла в рабочее пространство Workspace: - importdata (' file ' ) загружает данные из файла file в ра- бочее пространство; - А = importdata (' file ') загружает данные из файла file в переменную А; - А = importdata (' file ' , ' delimiter') загружает данные из файла file, используя delimiter как разделитель столбцов (в случае текстового файла). Пример 8.1 Сохранить в файле mydat. mat все переменные, имя которых на- чинается на abc: » save mydat.mat abc* Пример 8.2 Вызывать команды load и save можно так же, как и функции. » save ('mydat .mat', 'a', 'b', 'с') Пример 8.3 » A=magic(4); В=еуе(5); » save Saving to: MATLAB.mat » clear » load MATLAB A » who Your variables are: A
148 Т е м a 8. ИМПОРТ И ЭКСПОРТ ДАННЫХ 8.4. Низкоуровневый файловый ввод-вывод • Открыть файл и получить указатель файла (file identifier) - функция fopen. • Выполнить операции с данными файла: - чтение, запись бинарных данных - функции f read, fwrite; - чтение текстовых строк из файла - функции f gets/f getl; - чтение форматированных ASCII данных - функция f scanf; - запись форматированных ASCII данных - функция fprintf. • Закрыть файл - функция f close. 8.4.1. Работа с именем файла • fileparts - выделение составляющих пути доступа (входной аргу- мент - текстовая строка полного пути доступа к файлу; выходные ар- гументы - составляющие пути доступа: путь, имя файла, расширение, версия); • fullfile - формирование полного имени файла из имен каталогов и имени файла; • filesep - получение символа разделителя имен каталогов при формировании полного пути к файлу (в зависимости от платформы); • tempdir - получение полного имени системного временного ката- лога, если он существует (не создавая его); • tempname - получение уникального имени временного файла - воз- вращает текстовую строку, подходящую для использования в качест- ве имени временного файла (уникальность не гарантируется, но пред- полагается). Пример 8.4 » file = '\С:\temp\MATLAB\myfile.txt'; » [pathstr, name, ext, versn] = fileparts(file) pathstr = \C:\temp\MATLAB name = myfile ext =.txt versn = '' » str = fullfile('Ctemp','MATLAB','myfun.m') str = C:\temp\MATLAB\myfun.m
8.4. Низкоуровневый файловый ввод-вывод 149 8.4.2. Работа с бинарными и текстовыми файлами • fopen - открытие файла и получение информации о файлах (выход- ной параметр - файловый идентификатор, который используют все остальные функции низкоуровневого файлового ввода-вывода): - fid = fopen (filename) открывает файл filename для чтения и возвращает файловый идентификатор fid; - [fid,message] = fopen (filename, permission) от- крывает файл filename в режиме, указанном в разрешении per- mission. В message содержится сообщение о системной ошиб- ке, если файл не открыт. • Режимы разрешения permission: - ' г': открыть файл для чтения (по умолчанию); - ' w': открыть файл или создать новый файл для записи, уничтожая старые данные; - ' а': открыть файл или создать новый файл для записи, добавляя данные в конец файла; - ' г+ ': открыть файл для чтения и записи; - ' w+ ': открыть файл или создать новый файл для чтения и записи, уничтожая старые данные; - ' а+ ': открыть файл или создать новый файл для чтения и записи, добавляя данные в конец файла; - ' t': открыть текстовый файл; - ' Ь': открыть бинарный файл. • f close - закрытие файлов: - status = fclose (fid) закрывает указанный файл, если он открыт, возвращая 0 в случае успеха и -1 в противном случае; - status = f close (' all') закрывает все открытые файлы, кроме файлов с идентификатором 0, 1 или 2. • ftell - получение текущей позиции в файле. Вызывается: position = ftell (fid) возвращает текущую позицию. • f seek - переустановка текущей позиции в файле. Вызывается: status = fseek(fid, offset, origin) перемещает теку- щую позицию в файле на offset байтов относительно origin. Допустимые значения аргумента origin:
150 Т е м a 8. ИМПОРТ И ЭКСПОРТ ДАННЫХ - 'bof' или -1: от начала файла; - ' cof' или 0: от текущей позиции в файле; - ' eof' или 1: от конца файла. Допустимые значения аргумента offset: - offset >0 - передвижение к концу файла; - offset = 0 - текущая позиция не изменяется; - offset < 0 - передвижение к началу файла. • f eof - проверка достижения конца файла. Вызывается: eofstat = feof (fid) возвращает 1, если указатель указывает на конец файла, и 0 в других случаях. • f rewind - переход на начало файла. frewind (fid) устанавливает текущую позицию файла с иденти- фикатором fid на начало файла. • f read - чтение двоичных данных из файла. [A,count] = fread (fid,size,precision,skip) читает двоичные данные из указанного файла в матрицу А. Параметр size определяет количество данных. Если размер не указан, fread читает до конца файла. Параметр precision - это строка, указывающая формат данных ('unsigned', 'char', 'int8', 'double' и т. д.). Па- раметр skip указывает число байт, которые будут пропущены каж- дый раз после прочтения указанного числа данных. • fwrite - запись двоичных данных в файл. count = fwrite(fid, A, precision) записывает элементы матрицы А по столбцам в файл. Параметр precision такой же, как и функции fread. Выходной аргумент возвращает количество запи- санных элементов. • Возможные значения параметра size функции fread: - п: чтение п элементов в вектор-столбец; - [т, п]: чтение данных в m строк и п столбцов, при этом запол- нение происходит по столбцам. Недостающие элементы заполня- ются нулями; п может быть определено как inf, am- нет; - inf: чтение до конца файла в вектор-столбец, содержащий число элементов, равное количеству элементов в файле; - [m, inf]: чтение до конца файла с заполнением m строк по столбцам. Недостающие элементы заполняются нулями.
8.4. Низкоуровневый файловый ввод-вывод 151 • Функции для чтения и записи информации в текстовый файл: - А = fgetl (fid) - чтение следующей строки текстового фай- ла, включая символ перевода строки; - А = fgets (fid) - чтение следующей строки текстового файла без символа перевода строки; - [A, count] = fscanf (fid, format, size) - чтение данных из текстового файла, записанных в определенном формате; - count = fprintf (fid, format, A, ...) - форматный вывод в текстовый файл. Если идентификатор файла равен 1 или отсутствует, то вывод идет на экран; - А = sscanf (s, format, size) - чтение форматированных данных из строки (а не из текстового файла); - [s,errmsg] = sprint f (format, A, . . .) - запись формати- рованных данных в строку (не в текстовый файл). • Форматные спецификации для чтения и записи текстовых данных: - %<+,-,0><Number>.<Number>ConversionCharacter. • %: признак начала форматной спецификации. • Значения управляющего символа формата данных: - -: выравнивание по левому краю; - +: обязательное написание знака числа (+ или -); - 0: заполнение недостающих значений поля нулями. • Значения управляющего символа форматной спецификации: - % с: одиночный символ; - %d: десятичное представление (знаковое); - %f: представление с фиксированной точкой (вещественное); - %е %Е: экспоненциальное представление; - %g %G: более компактное представление %f или %е; - %i: десятичное представление (знаковое); - %о: восьмеричное представление (беззнаковое); - %s: строка символов; - %и: десятичное представление (беззнаковое); - %х %Х: шестнадцатеричное представление.
152 Т е м a 8. ИМПОРТ И ЭКСПОРТ ДАННЫХ Пример 8.5 Следующий пример открывает файл testl. dat и записывает в не- го 101 раз число типа double и закрывает файл. Затем открывает этот же файл, читает каждое второе число в массив В, переустанавливает те- кущую позицию в начало файла, читает каждое третье число в массив С и закрывает файл. » А=[0:0.01:10]; fid = fopen('testl.dat', 'w'); fwrite(fid, A, 'double'); fclose(fid); fid = fopen('testl.dat', 'r'); [B, count] = fread(fid, inf, 'double',8); frewind(fid); [C, count] = fread(fid, inf, 'double',16); fclose(fid); Пример 8.6 » x = 0:.1:1; у = [x; exp(x)]; fid = fopen('exp.txt','w'); fprintf(fid,'%6.2f %12.8f\n',y); fclose(fid) Пример 8.7 » A=l:10; » fprintf('Elements of A:'); fprintf (' %d',A); » fprintf('\n'); Elements of A: 123456789 10 8.5. Работа с графическими файлами • image: отображение графического изображения; • imread: чтение графических данных из файла в массив; • imwrite: запись графических данных из матрицы в файл;
8.6. Лабораторный практикум № 8 153 • imfinfo: получение информации о графическом файле и содержа- щемся в нем изображении. Пример 8.8 FileName = 1 signal.bmp'; [Image, ColorMap]= imread(FileName); % Визуализация изображения elf; image (Image) ; colormap(ColorMap) 8.6. Лабораторный практикум № 8 8.6.1. Теоретические вопросы 1. Импорт и экспорт данных. 2. Типы форматов файлов данных, поддерживаемые MATLAB. 3. Работа с именем файла. 4. Перемещение данных рабочего пространства. 5. Низкоуровневый файловый ввод/вывод. 6. Ввод/вывод бинарных файлов. 7. Ввод/вывод текстовых файлов. 8. Форматная спецификация текстовых данных. 8.6.2. Задания Задание 8.1 Удалите из рабочего пространства Workspace все переменные » clear Теперь введите команды » а = 5; » Ь = [123; 456]; » с = magic(3); Сохраните созданные переменные и их значения в файл MATLAB. mat » save
154 Т е м a 8. ИМПОРТ И ЭКСПОРТ ДАННЫХ Вновь очистите рабочее пространство и введите команду » s = load |Т~| Что получится в результате? Задание 8.2 Постройте графики функций Y=sin (X) и Z=cos (X) с шагом 0.1 на отрезке [-3; 3] в одной системе координат. Затем сохраните графиче- ское изображение в графический файл graph, jpeg. Сохраните масси- вы X, Y, и Z в файл graph. mat, в бинарный файл graph. dat и тексто- вый файл graph.txt. После этого очистите рабочее пространство Workspace и очистите графическое окно Figurel. Прочитайте данные из файла graph.mat и постройте изображение. Прочитайте данные из текстового файла graph. txt в массив DATA и постройте изображение в новом графическом окне. Наконец, из бинарного файла graph, dat вы- берите данные, хранящие значения X и cos (X), и постройте график в том же графическом окне в другой системе координат. Задание 8.3 Создайте в любом текстовом редакторе текстовый файл Weath- er, txt. Для каждого из четырех городов: Минск, Мельбурн, Берлин, Токио введите в него следующую информацию: 1-я строка содержит на- звание города, 2-я строка содержит среднемесячную температуру в тече- ние года (двенадцать значений формата 17.56), третья строка содержит среднемесячное давление в течение года (двенадцать значений формата 767). В MATLAB создайте структуру weather подходящего формата и загрузите в нее данные из файла Weather.txt. В одном графическом окне в разных системах координат, расположенных одна под одной, по- стройте: в первой системе координат - графики температур, в другой - диаграммы давлений. Снабдите графики всей необходимой информацией (заголовок, подписи к осям координат, легенды). Задание 8.4 Для предыдущего задания создайте в MATLAB структуру weath- er подходящего формата и заполните ее необходимыми данными. После этого сохраните содержимое структуры weather в текстовом файле Weather.txt.
8.6. Лабораторный практикум № 8 155 Задание 8.5 Построить графики изменения суточной температуры за 22 мая, 8 августа и 11 сентября. Температура измерялась в течение трех суток каждый час. Даты и значения температур представить в виде массива структур. Графики должны быть изображены разным цветом с маркера- ми в узловых точках. Координатная сетка должна отображаться. График должен быть снабжен всей необходимой информацией: подписями к осям координат «Время (час)» и «Температура (С)», легендой, заголов- ком «Суточные температуры». После этого сохраните информацию в текстовый файл Temperature.txt в три столбца. Первая строка со- держит даты измерения температур, остальные строки - результаты из- мерения, выровненные по правому краю с двумя знаками после запятой. Задание 8.6 По отсканированным в интерактивном режиме трехмерным точкам построить многогранник (рис. 8.1). Рис. 8.1. Вывод номеров вершин и ЗП-поверхности Для этого написать функцию, имеющую следующую структуру: function KML08( act, filename ) % KML08 — Input/Output % KML08('PointsFile') - enter 3D-points
156 Т е м a 8. ИМПОРТ И ЭКСПОРТ ДАННЫХ % and save into the 'File' % KML08('Patch','File') - plot surface from % Pnt/Fct files % 0. Диспетчер % 1. Оцифровка ЗБ-точек на графике % 1.1 Подготовка осей к вводу точек % 1.2 Вывод на ЗО-график номеров введенных точек % в отсканированные позиции % 1.3. Сохранение точек в файл File.pnt % 2. Инициализация осей для вывода графика % 2.1. Чтение файла координат точек File.pnt % 2.2. Чтение файла описания граней File.fct % 2.3. Построение поверхности Указания по заданию: 1. Сканирование точек выполните при помощи функции ginput. Для указания координаты Z (высоты) точки надо нажимать цифровую клавишу 'О'—'9'. При этом координаты X, Y указываются перекрести- ем мыши непосредственно в осях. 2. Для вывода на ЗО-график номеров введенных точек в отсканиро- ванные позиции изучите следующий код: х=[1 23]'; у=[1 84]'; z=[5 9 7]'; c=sprintf('%d| ',1:size (x,1)); c(end) = []; elf; plot3(x,y,z,'o'); hold on text(x,y,z,c,'Color','b','Fontweight','bold'); grid on; view(3); 3. Отсканированные координаты сохраните в текстовый файл File.pnt. В файле File.pnt указываются координаты X, Y, Z вершин. Одна строка файла - одна вершина ЗО-поверхности. 4. В файле File.fct описываются грани поверхности: 1-я строка: количество вершин на грани; 2-я строка: номера вершин 1-й грани; ... ; N-я строка: номера вершин (N-l)-fi грани. 5. Файлы File . pnt и File . f ct записываются в текущий каталог. 6. Для построения ЗО-поверхности примените функцию patch.
ТЕМА 9 ГРАФИЧЕСКИЙ ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЯ Под графическим интерфейсом пользователя (Graphical User Interface - GUI) подразумевается тип экранного представления, при котором пользователь может выбирать команды, запускать задачи, вводить и просматривать исходные данные, обрабатывать полученные результаты, используя элементы управления, представленные на экране. Графический интерфейс пользователя приложения, созданного в среде MATLAB, представляет собой одно или несколько графических окон Figures, содержащих элементы управления (кнопки, окна редак- тирования, списки, переключатели, полосы прокрутки, контейнеры, ме- ню, контекстные меню), а также оси координат для вывода информации в графическом виде. Разработка приложения, оснащенного GUI, предпо- лагает выполнение следующих действий: создание графического окна, выбор и расположение необходимых элементов управления в пределах графического окна, определение внешнего вида элементов интерфейса, а также определение действий, которые будут выполняться при наступле- нии какого-либо события, связанного с элементом интерфейса, например при нажатии пользователем кнопки. 9.1. Интерактивный интерфейс • input: интерактивный ввод с клавиатуры. • ginput: графический интерактивный ввод координат точек на гра- фике курсором мыши или клавишами клавиатуры. • gtext: вывод текстовой строки в графическое окно после интерак- тивного выбора позиции вывода курсором мыши. • disp: вывод сообщения на экран. • pause: пауза до нажатия какой-либо клавиши или на N секунд. • keyboard: запрос на ввод с клавиатуры.
158 Т е м a 9. ГРАФИЧЕСКИЙ ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЯ • waitf or: блокировка работы до наступления события. • error: печать сообщения об ошибке и выход из М-файла. • menu: меню диалогового ввода. Пример 9.1 Следующий фрагмент кода позволяет интерактивно ввести число или текстовую строку с клавиатуры и затем вывести полученную ин- формацию в командное окно Command Window. » А= input('А = '); message = ['variable А = ', int2str(A)]; disp(message) Str= input('Str = ', 's'); message = ['string Str = ', Str]; disp(message) 9.2. GUI и дескрипторная графика 9.2.1. Управляющие элементы • Управляющие элементы: uicontrol. Типы, имеющиеся в распоря- жении (определяются свойством Style): - pushbutton - управляющая кнопка; - togglebutton - кнопка с фиксацией нажатого состояния; - radiobutton - радиокнопка; - checkbox - индикатор с флажком; - edit - поле ввода и редактирования текста; - text - статический неизменяемый текст (метка); - slider - линейка прокрутки; - frame - контейнер любых компонентов; - listbox - компонент для отображения раскрытого списка строк; - popupmenu - компонент для отображения и редактирования вы- падающего списка строк. • Выпадающее меню: uimenu. • Контекстное меню: uicontextmenu.
9.2. GUI и дескрипторная графика 159 • Интерактивное создание: GUIDE (GUI Design Environment). По команде » guide открывается графический редактор Layout Editor визуальной реализации GUI. • Объекты uicontrol, uimenu, uicontextmenu являются потом- ками объекта Figure и, следовательно, не зависят от Axes. 9.2.2. Основные свойства управляющих элементов • Управляющий элемент uicontrol: - String: надпись на элементе, а также список строк компонентов ListBox и PopupMenu; - Visible: видимость элемента управления; - Enable: доступность элемента управления; - Style: тип элемента управления; - Position: положение и размеры управляющего элемента; - Units: единицы измерения; - FontAngle, FontName, Fontsize, Fontunits, Fontweight, HorizontalAlignment: настройки шрифта; - Tag: имя элемента; - Callback: управляющее действие; - CreateFcn: действия, выполняемые при создании элемента; - DeleteFcn: действия, выполняемые при удалении элемента. • Управляющий элемент uimenu: - Label: метка меню; - Separator: разделительная линия; - Visible: видимость; - Enable: доступность; - Callback: управляющее действие. • Управляющий элемент uicontextmenu: - Callback: управляющее действие. • Доступ к свойствам управляющих элементов: get и set.
160 Т е м a 9. ГРАФИЧЕСКИЙ ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЯ Пример 9.2 Команды » figure; set(gcf,'menubarnone') b= uicontrol('Style','pushbutton',... 'Units','normalized',... 'Position',[.5 .5 .2 .1],'String','Click Here'); bl= uicontrol('Style','pushbutton',... 'Units','normalized',... 'Position',[.5 .7 .2 .1],'String','Clear'); создают в центре графического окна две кнопки. Однако при нажатии на кнопки никакие действия не выполняются. Команды s='х=0:0.01:3*pi; plot(х,sin(10*rand(1)*х))'; eval(s) set (b, 'Callback',s) set(bl,'Callback','cla') назначают кнопкам выполнение определенных действий. Пример 9.3 Следующий код создает графическое окно, пункт меню и четыре кнопки для вывода диаграмм различного вида (рис. 9.1). » figure set(gcf,'menubar','none','units','normalized') uimenu('label','&Close','callback','close') set(gca,'position',[.4 .1 .5 .8]) uicontrol('style','pushbutton',... 'string','Pie Plot','units','normalized',... 'position',[.1 .8 .2 .1],... 'callback','pie(rand(1,6));... axis on; grid off; box on;') uicontrol ('style', 'pushbutton', 'string',... ' Area Plot', 'units', 'normalized', 'position', ... [.1 .6 .2 .1],'callback','area(rand(6,3));... axis on; grid on; box on;') uicontrol('style','pushbutton','string',... 'Bar Plot','units','normalized','position',... [.1 .4 .2 .1],'callback','bar(rand(6,3)); ... axis on; grid on; box on;')
9.2. GUI и дескрипторная графика 161 uicontrol ('style', 'pushbutton', 'string',... 'Graph Clear','units','normalized',... 'position1 .2 .2 .1]callback. 'cla; grid off') uicontrol ('style', 'text', 'string', 'Diagram', ... 'unitsnormalizedposition4 .9 .2 .05]) Рис. 9.1. Графический интерфейс пользователя Пример 9.4 Следующий пример создает в текущем окне Figure пункты ме- ню, выбор которых позволяет пользователю создать новый объект Fig- ure, сохранить переменные рабочего пространства Workspace в фай- ле MATLAB .mat, а также выйти из MATLAB. Кроме этого, определяется разделитель пунктов меню и «горячая» клавиша Ctrl+Q (рис. 9.2). % Define the user menu f = uimenu('Label','Workspace'); % Define the menu items with standard callbacks uimenu(f,'Label','New Figure','Callback','figure'); uimenu(f,'Label','Save','Callback','save'); uimenu(f,'Label','Quit','Callback','exit',... 'Separator','on','Accelerator','Q');
162 Т е м a 9. ГРАФИЧЕСКИЙ ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЯ Рис. 9.2. Меню Пример 9.5 Следующий пример создает контекстное меню, ассоциированное с линией на графике, которое появляется всякий раз, когда пользователь нажимает правую кнопку мыши в любом месте линии на графике. Пунк- ты меню позволяют пользователю изменить стиль линии (рис. 9.3). Рис. 9.3. Контекстное меню, связанное с линией % Define the context menu степи = uicontextmenu; %Define the line, associate it with the context menu hline = plot(l:10, 'UIContextMenu', степи); % Define callback-functions for context menu items
9.3. Среда GUIDE 163 cbfl = ['set(hline, ''LineStyle'', ''— cbf2 = ['set(hline, ' 'LineStyle' ', ' ; cbf3 = ['set(hline, ''LineStyle'', '' % Define the context menu items itl=uimenu(cmenu,'Label','dashed','Callback',cbfl); it2=uimenu(cmenu,'Label','dotted','Callback',cbf2); it3=uimenu(cmenu,'Label','solid','Callback',cbf3); 9.3. Среда GUIDE • Визуальная реализация графического интерфейса пользователя GUI: среда GUIDE. • Команда » guide: запуск графического редактора Layout Edi- tor, содержащий палитру графических элементов управления и фор- му для создания GUI. • Файлы: файл графического макета (. fig), файл интерфейса (. т). • Действия: - в командном окне ввести команду » guide и открыть GUIDE Quick Start Dialog Box; - выбрать шаблон «Blank GUI» на вкладке «Create New GUI»; - для загрузки существующего GUI ввести команду » guide figl. fig или выбрать файл на вкладке «Open Existing GUI»; - выбрать требуемые графические элементы управления из Палит- ры компонентов и поместить их на форму; - дважды щелкнуть по выбранному компоненту и в открывшемся инспекторе свойств Property Inspector установить необхо- димые свойства выделенного компонента; - для запуска созданного в Layout Editor интерфейса GUI вы- брать команду Tools | Run или «Зеленый треугольник» на пане- ли «горячих» клавиш; - с помощью контекстного меню создать М-файл с тем же именем, объявить соответствующие компонентам callback-функции и отредактировать их в редакторе-отладчике М-файлов; - сохранить интерфейс GUI в файле с расширением . fig.
164 Т е м a 9. ГРАФИЧЕСКИЙ ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЯ 9.4. Лабораторный практикум № 9 9.4.1. Теоретические вопросы 1. Графический интерфейс пользователя (GUI). 2. Способы создания GUI, поддерживаемые MATLAB. 3. Интерактивный интерфейс. 4. Элементы дескрипторной графики для создания GUI. 5. Объект uicontrol. 6. Объект uimenu. 7. Объект uicontextmenu. 8. Свойства UI-объектов. 9. Доступ к свойствам UI-объектов. 10. Callback-функции. 11. Редактор Layout Editor. 12. Типы файлов для создания GUI. 9.4.2. Задания Задание 9.1 Постройте графики функций Y=sin (X) и Z=cos (X) с шагом 0.01 на отрезке [-Зя; Зя] в одном графическом окне в разных системах коор- динат. Свяжите с графиком функции Y=sin (X) контекстное меню с тремя пунктами, изменяющими тип линии: dashed, dotted, solid. Свяжите с графиком функции Z=cos (X) контекстное меню с тремя пунктами, изменяющими цвет линии: red, green, blue. Задание 9.2 Постройте графики функций z=y[xcos(x) на отрезке [0; бя] и у=х2 на отрезке [-Зя; Зя] с шагом 0.01 в одном графическом окне в разных системах координат. Свяжите с графиком функции у=х2 контекстное меню с двумя пунктами, устанавливающими толщину линии. Выбор первого пункта меню увеличивает толщину линии в два раза, выбор вто- рого пункта меню - восстанавливает значение толщины линии по умол- чанию. Свяжите с графиком функции z = y[xcos(x) контекстное меню с тремя пунктами, изменяющими цвет линии: red, green, blue.
9.4. Лабораторный практикум № 9 165 Задание 9.3 Постройте стандартную трехмерную поверхность - сферу. Свяжите с поверхностью контекстное меню. Первые три пункта контекстного ме- ню изменяют стиль ребер поверхности: dashed, dotted, solid. Сле- дующие четыре пункта меню изменяют цвет поверхности: red, green, blue, flat. Группы пунктов меню разделите разделительной линией. Задание 9.4 Постройте график функции, заданной параметрически. Свяжите с построенной фигурой контекстное меню с пунктами, изменяющими мар- керы ее узлов: кружок, звездочка, треугольник, квадрат. Последний пункт меню удаляет маркеры. a) x=cos(t), y=sin(t), z=t, te [0, 20л] (винтовая линия); b) x=e-|t”50|/50sin t, y=e-|t”501/50cos t, z=t, t e [0, 100]. Задание 9.5 Постройте гладкую поверхность фигуры, заданной соотношениями: a) z= sin (х) . *sin (у), хе[0; 100], уе[0; 100]; b) z = sin (х) sin (у) + . 3cos (2х-3у) - . 2sin (х+2у), х, уе[0; 100]. Создайте пять пунктов главного меню, изменяющих цветовую па- литру закраски построенной поверхности. Задание 9.6 В середину графического окна поместите кнопку. При нажатии на кнопку ее местоположение изменяется случайным образом в пределах всего графического окна. Задание 9.7 Дан графический (1РС-)файл, содержащий изображение некоторого аналогового сигнала. Следует оцифровать данный сигнал, то есть пред- ставить его в виде таблицы значений (X, Y). Графический интерфейс
166 Т е м a 9. ГРАФИЧЕСКИЙ ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЯ пользователя должен содержать кнопки, позволяющие выполнить сле- дующие действия (рис. 9.4): • Image: загрузка и визуализация графического изображения. • Digitization: оцифровка сигнала. В данном режиме при помощи функции ginput оцифровываются координаты (X, Y) точек аналого- вого сигнала. После оцифровки каждой точки значения ее координат сохраняются в массиве данных. Все оцифрованные точки сортируют- ся по координате X и отображаются поверх графического изображе- ния ломаной красного цвета. Узлы ломаной выделяются меткой ' о '. • Delete: удаление точки оцифрованного сигнала. В данном режиме можно удалить ранее оцифрованную точку. После попадания курсора мыши в метку выбранной точки и нажатия кнопки мыши координаты данной точки удаляются из массива данных. Затем происходит пере- рисовка ломаной линии. • Load: сохранение массива координат в бинарном файле. • Save: загрузка массива координат из бинарного файла. • Zoom: увеличение/уменыпение фрагментов изображения.
ЛИТЕРАТУРА 1. Ануфриев, И. Е. Самоучитель MATLAB 5.3/б.х / И. Е. Ануфриев. СПб.: БХВ-Петербург, 2004. 736 с. 2. Говорухин, В. Компьютер в математическом исследовании: учеб, курс / В. Говорухин, В. Цибулин. СПб.: Питер, 2001. 624 с. 3. Потемкин, В. Г. Система MATLAB 5 для студентов / В. Г. По- темкин. М.: ДИАЛОГ-МИФИ, 1998. 314 с. 4. Потемкин, В. Г. Система инженерных и научных расчетов MATLAB 5.x: в 2 т. / В. Г. Потемкин. М.: ДИАЛОГ-МИФИ, 1999. Т. 1.366 с. 5. Потемкин, В. Г. Система инженерных и научных расчетов MATLAB 5.x: в 2 т. / В. Г. Потемкин. М.: ДИАЛОГ-МИФИ, 1999. Т. 2. 304 с. 6. Голубева, Л. Л. Компьютерная математика. Числовой пакет MATLAB: курс лекций / Л. Л. Голубева, А. Э. Малевич, И. Л. Щеглова. Минск: БГУ, 2007. 164 с. 7. Angermann, A. MATLAB - Simulink - Stateflow. Grundlagen, Tool- boxen, Beispiele / A. Angermann, M. Beuschel, M. Ran, U. Wohl- farth. Oldenburg Verlag Munchen Wien, 2007. 495 c. 8. Adam, S. MATLAB und Mathematik kompetent einsetzen / S. Adam. WILEY-VCH Verlag GmbH & Co. KGaA, Weinheim, 2006. 462 c. 9. THE MATHWORKS: Getting Started with MATLAB, Version7. The MathWorks Inc., 2007, Online: getstart.pdf
Учебное издание Голубева Лариса Леонидовна Малевич Александр Эрнестович Щеглова Наталья Леонидовна КОМПЬЮТЕРНАЯ МАТЕМАТИКА ЧИСЛОВОЙ ПАКЕТ MATLAB Лабораторный практикум В авторской редакции Технический редактор Г. М. Романчук Корректор Л. Н. Масловская Ответственный за выпуск Т. М. Турчиняк Подписано в печать 13.11.2008. Формат 60x84/16. Бумага офсетная. Гарнитура Таймс. Печать офсетная. Усл. печ. л. 10,0- Уч.-изд. л. 6,38. Тираж 250 экз. Зак. 1314. Белорусский государственный университет. ЛИ № 02330/0056804 от 02.03.2004. 220030, Минск, проспект Независимости, 4. Отпечатано с оригинала-макета заказчика. Республиканское унитарное предприятие «Издательский центр Белорусского государственного университета» ЛП № 02330/0056850 от 30.04.2004. 220030, Минск, ул. Красноармейская, 6.
ISBN 978-985-518-081-5