MatLab руководство для начинающих · новый язык...

37
MatLab руководство для начинающих Кожемякина Е.В. Методические рекомендации для студентов 1 курса ИФФВТ

Transcript of MatLab руководство для начинающих · новый язык...

Page 1: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

MatLab руководство для начинающих

Кожемякина Е.В.

Методические рекомендации для студентов 1 курса ИФФВТ

Page 2: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

Введение MATLAB (сокращение от англ. «Matrix Laboratory») — пакет прикладных программ для

решения задач технических вычислений и одноимённый язык программирования, используемый в этом пакете. MATLAB® используется более чем 1 000 000 инженерными и научными работниками, он работает на большинстве современных операционных систем.

MATLAB как язык программирования был разработан Кливом Моулером в конце 1970-х годов, когда он был деканом факультета компьютерных наук в Университете Нью-Мексико. Целью разработки служила задача дать студентам факультета возможность использования программных библиотек Linpack и EISPACK без необходимости изучения Фортрана. Вскоре новый язык распространился среди других университетов и был с большим интересом встречен учёными, работающими в области прикладной математики. До сих пор в Интернете можно найти версию 1982 года, написанную на Фортране, распространяемую с открытым исходным кодом. Инженер Джон Литтл (англ. John N. (Jack) Little) познакомился с этим языком во время визита Клива Моулера в Стэнфордский университет в 1983 году. Поняв, что новый язык обладает большим коммерческим потенциалом, он объединился с Кливом Моулером и Стивом Бангертом (англ. Steve Bangert). Совместными усилиями они переписали MATLAB на C и основали в 1984 компанию The MathWorks для дальнейшего развития. Эти переписанные на С библиотеки долгое время были известны под именем JACKPAC. Первоначально MATLAB предназначался для проектирования систем управления (основная специальность Джона Литтла), но быстро завоевал популярность во многих других научных и инженерных областях. Он также широко использовался и в образовании, в частности, для преподавания линейной алгебры и численных методов.

Язык MATLAB является высокоуровневым интерпретируемым языком программирования, включающим основанные на матрицах структуры данных, широкий спектр функций, интегрированную среду разработки, объектно-ориентированные возможности и интерфейсы к программам, написанным на других языках программирования.

Программы, написанные на MATLAB, бывают двух типов — функции и скрипты. Функции имеют входные и выходные аргументы, а также собственное рабочее пространство для хранения промежуточных результатов вычислений и переменных. Скрипты же используют общее рабочее пространство. Как скрипты, так и функции не компилируются в машинный код и сохраняются в виде текстовых файлов.

Основной особенностью языка MATLAB являются его широкие возможности по работе с матрицами, которые создатели языка выразили в лозунге «думай векторно»

MATLAB предоставляет пользователю большое количество (несколько сотен) функций для анализа данных, покрывающие практически все области математики, в частности:

Матрицы и линейная алгебра — алгебра матриц, линейные уравнения, собственные значения и вектора, сингулярности, факторизация матриц и другие.

Многочлены и интерполяция — корни многочленов, операции над многочленами и их дифференцирование, интерполяция и экстраполяция кривых и другие.

Математическая статистика и анализ данных — статистические функции, статистическая регрессия, цифровая фильтрация, быстрое преобразование Фурье и другие.

Обработка данных — набор специальных функций, включая построение графиков, оптимизацию, поиск нулей, численное интегрирование (в квадратурах) и другие.

Дифференциальные уравнения — решение дифференциальных и дифференциально-алгебраических уравнений, дифференциальных уравнений с запаздыванием, уравнений с ограничениями, уравнений в частных производных и другие.

Разреженные матрицы — специальный класс данных пакета MATLAB, использующийся в специализированных приложениях.

Целочисленная арифметика — выполнение операций целочисленной арифметики в среде MATLAB.

Page 3: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

1. Базовые сведения 1.1. Рабочая среда MatLab Чтобы запустить программу дважды щелкните на иконку . Перед Вами откроется

рабочая среда, изображенная на рисунке.

Рабочая среда MatLab содержит следующие элементы: панель инструментов с кнопками и раскрывающимся списком; окно с вкладками Launch Pad и Workspace, из которого можно получить доступ к

различным модулям ToolBox и к содержимому рабочей среды; окно с вкладками Command History и Current Directory, предназначенное для

просмотра и повторного вызова ранее введенных команд, а также для установки текущего каталога;

командное окно, в котором находится приглашение к вводу » и мигающий вертикальный курсор;

строку состояния. Если в рабочей среде MatLab 6.х отсутствуют некоторые окна, приведенные на рисунке, то

следует в меню View выбрать соответствующие пункты: Command Window, Command History, Current Directory, Workspase, Launch Pad.

Команды следует набирать в командном окне. Символ », обозначающий приглашение к вводу командной строки, набирать не нужно. Для просмотра рабочей области удобно использовать полосы скроллинга или клавиши Home, End, для перемещения влево или вправо, и PageUp, PageDown для перемещения вверх или вниз. Если вдруг после перемещения по рабочей области командного окна пропала командная строка с мигающим курсором, просто нажмите Enter.

Важно помнить, что набор любой команды или выражения должен заканчиваться нажатием на Enter, для того, чтобы программа MatLab выполнила эту команду или вычислила выражение.

Page 4: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

1.2. Простейшие вычисления Наберите в командной строке 1+2 и нажмите Enter. В результате в командном окне MatLab

отображается следующее:

Рис. 2 Графическое представление метода главных компонент Что сделала программа MatLab? Сначала она вычислила сумму 1+2, затем записала

результат в специальную переменную ans и вывела ее значение, равное 3, в командное окно. Ниже ответа расположена командная строка с мигающим курсором, обозначающая, что MatLab готов к дальнейшим вычислениям. Можно набирать в командной строке новые выражения и находить их значения. Если требуется продолжить работу с предыдущим выражением, например, вычислить (1+2)/4.5, то проще всего воспользоваться уже имеющимся результатом, который хранится в переменной ans. Наберите ans/4.5 (при вводе десятичных дробей используется точка) и нажмите Enter, получается

Рис. 3 Графическое представление метода главных компонент

1.3. Эхо команд Выполнение каждой команды в MatLab сопровождается эхом. В приведенном выше

примере — это ответ ans = 0.6667. Часто эхо затрудняет восприятие работы программы и тогда его можно отключить. Для этого команда должна завершаться символом точка с запятой. Например

Рис. 4 Пример ввода функции ScoresPCA

1.4. Сохранение рабочей среды. MAT файлы Самый простой способ сохранить все значения переменных — использовать в меню File

пункт Save Workspase As. При этом появляется диалоговое окно Save Workspase Variables, в котором следует указать каталог и имя файла. По умолчанию предлагается сохранить файл в

Page 5: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

подкаталоге work основного каталога MatLab. Программа сохранит результаты работы в файле с расширением mat. Теперь можно закрыть MatLab. В следующем сеансе работы для восстановления значений переменных следует открыть этот сохраненный файл при помощи подпункта Open меню File. Теперь все переменные, определенные в прошлом сеансе, опять стали доступными. Их можно использовать во вновь вводимых командах.

1.5. Журнал В MatLab имеется возможность записывать исполняемые команды и результаты в

текстовый файл (вести журнал работы), который потом можно прочитать или распечатать из текстового редактора. Для начала ведения журнала служит команда diary. В качестве аргумента команды diary следует задать имя файла, в котором будет храниться журнал работы. Набираемые далее команды и результаты их исполнения будут записываться я в этот файл, например последовательность команд производит следующие действия:

1. открывает журнал в файле exampl-1.txt; 2. производит вычисления; 3. сохраняет все переменные в MAT файле work-1.mat; 4. сохраняет журнал в файле exampl-1.txt в подкаталоге work корневого каталога MatLab и

закрывает MatLab; Посмотрите содержимое файла exampl-1.txt в каком-нибудь текстовом редакторе. В

файле окажется следующий текст:

a1=3; a2=2.5; a3=a1+a2 a3 = 5.5000 save work-1 quit

1.6. Система помощи Окно справки MatLab появляется после выбора опции Help Window в меню Help или

нажатием кнопки вопроса на панели инструментов. Эта же операция может быть выполнена при наборе команды helpwin. Для вывода окна справки по отдельным разделам, наберите helpwin topic. Окно справки предоставляет Вам такую же информацию, как и команда help, но оконный интерфейс обеспечивает более удобную связь с другими разделами справки.

1.7. Локальные и глобальные переменные

Page 6: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

Так же как и все структурные языки программирования MATLAB различает глобальные и локальные переменные. Локальные переменные действуют только в модуле где они описаны, глобальные переменные доступны всем модулям загруженным в этот момент в MATLAB. Ниже приведена иллюстрация области действия переменных.

Глобальные переменные, действуют во всех модулях

Модуль 1 Модуль 2 Модуль 3 Локальные

переменные действуют только в этом модуле

Локальные переменные действуют только в этом модуле

Локальные переменные действуют только в этом модуле

Для указания что переменная является глобальной необходимо указать перед ее именем описание global. Например global A. Команда who global, выводит список всех глобальных переменных.

Page 7: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

2. Матрицы 2.1. Типы данных MATLAB. Скаляры, векторы и матрицы. В системе MATLAB определено шесть базовых типов данных, каждый из которых является

многомерным массивом. Шесть классов - это double, char, sparse, uint8, cell, и struct. Фактически MATLAB содержит один тип данных - массив или матрица (таблица). Массив

это группа ячеек памяти имеющие одно имя. Массивы бывают одномерные - строка или столбец, прямоугольные, квадратные (число строк рано числу столбцов). Когда Вы указываете переменную и присваиваете ей одно число, фактически MATLAB создает матрицу из одной строки и одного столбца. Ниже приведены примеры вектора - а, строки - б, прямоугольной матрицы - в, квадратной матрицы - г, матрицы единичной размерности - е (простой переменой или скаляр).

а б в г е

Для ввода скаляра достаточно приписать его значение какой-то переменной, например

Заметим, что MatLab различает заглавные и прописные буквы, так что p и P — это разные

переменные. Для ввода массивов (векторов или матриц) их элементы заключают в квадратные скобки. Так для ввода вектора-строки размером 1×3, используется следующая команда, в которой элементы строки отделяются пробелами или запятыми.

Если вектор-строка представляет собой последовательность от а до в, то ее можно ввести

через двоеточие – а:в, например: ввести t=1:5 будет выведено t= 1 2 3 4 5 или с шагом (0,1) t=-10:0.1:10 ; При вводе вектора-столбца элементы разделяют точкой с запятой. Например,

Page 8: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

Вводить небольшие по размеру матрицы удобно прямо из командной строки. При вводе

матрицу можно рассматривать как вектор-столбец, каждый элемент которого является вектор-строкой.

или матрицу можно трактовать как вектор строку, каждый элемент которой является вектор-столбцом.

2.2. Доступ к элементам Доступ к элементам матриц осуществляется при помощи двух индексов — номеров строки

и столбца, заключенных в круглые скобки, например команда B(2,3) выдаст элемент второй строки и третьего столбца матрицы B. Для выделения из матрицы столбца или строки следует в качестве одного из индексов использовать номер столбца или строки матрицы, а другой индекс заменить двоеточием. Например, запишем вторую строку матрицы A в вектор z

Также можно осуществлять выделение блоков матриц при помощи двоеточия. Например,

выделим из матрицы P блок отмеченный цветом

Page 9: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

Если необходимо посмотреть переменные рабочей среды, в командной строке необходимо

набрать команду whos. Команда who выводит только имена переменных

Видно, что в рабочей среде содержатся один скаляр (p), четыре матрицы (A, B, P, P1) и

вектор-строка (z). 2.3. Основные матричные операции При использовании матричных операций следует помнить, что для сложения или

вычитания матрицы должны быть одного размера, а при перемножении число столбцов первой матрицы обязано равняться числу строк второй матрицы. Сложение и вычитание матриц, так же как чисел и векторов, осуществляется при помощи знаков плюс и минус

а умножение — знаком звездочка *. Введем матрицу размером 3×2

Page 10: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

Умножение матрицы на число тоже осуществляется при помощи звездочки, причем

умножать на число можно как справа, так и слева. Возведение квадратной матрицы в целую степень производится с использованием оператора ^

2.4. Создание матриц специального вида Заполнение прямоугольной матрицы нулями производится встроенной функцией zeros

Единичная матрица создается при помощи функции eye

Матрица, состоящая из единиц, образуется в результате вызова функции ones

Page 11: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

MatLab предоставляет возможность заполнения матриц случайными числами. Результатом

функции rand является матрица чисел, равномерно распределенных между нулем и единицей, а функции randn — матрица чисел, распределенных по нормальному закону с нулевым средним и единичной дисперсией.

Функция diag формирует диагональную матрицу из вектора, располагая элементы по диагонали.

Пример. Команда z = magic(3) генерирует магический квадрат размера 3 x 3.

2.5. Матричные вычисления MatLab содержит множество различных функций для работы с матрицами. Так, например,

транспонирование матрицы производится при помощи апострофа '

Нахождение обратной матрицы проводится с помощью функции inv для квадратных

матриц

Псевдообратную матрицу можно найти с помощью функции pinv. Более подробно про обработку матричных данных можно узнать, если вывести список всех

встроенных функций обработки данных командой help datafun, а затем посмотреть информацию о нужной функции, например help max.

2.6. Справочник по формированию и операциям над матрицами Формирование массивов специального вида

ZEROS - формирование массива нулей ONES - формирование массива единиц

Page 12: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

EYE - формирование единичной матрицы RAND - формирование массива элементов, распределенных по равномерному закону RANDN - формирование массива элементов, распределенных по нормальному закону CROSS - векторное произведение KRON - формирование тензорного произведения LINSPACE - формирование линейного массива равноотстоящих узлов LOGSPACE - формирование узлов логарифмичесокй сетки MESHGRID - формирование узлов двумерной и трехмерной сеток : - формирование векторов и подматриц

Операции над матрицами DIAG - формирование или извлечение диагоналей матрицы TRIL - формирование нижнетреугольной матрицы (массива) TRIU - формирование верхнетреугольной матрицы (массива) FLIPLR - поворот матрицы относительно вертикальной оси FLIPUD - поворот матрицы относительно горизонтальной оси ROT90 - поворот матрицы на 90 градусов RESHAPE - преобразование размеров матрицы

Специальные матрицы COMPAN - сопровождающая матрица характеристического многочлена HADAMARD - матрица Адамара (Hadamard matrix) HANKEL - матрица Ганкеля (Hankel matrix) HILB, INVHILB - матрица Гильберта (Hilbert matrix) MAGIC - магический квадрат PASCAL - матрица Паскаля (Pascal matrix) ROSSER - матрица Рессера (Rosser matrix) TOEPLITZ - матрица Теплица (Toeplitz matrix) VANDER - матрица Вандермонда (Vandermonde matrix) WILKINSON - матрица Уилкинсона (Wilkinson matrix)

2.7. Присвоение матрице математического выражения Организация всех переменных системы MATLAB как матрицы вызывает следующие

ограничения применения их в выражениях. Например: t=1:5 t= 1 2 3 4 5 y=cos(t) y=1 0.5 -0.4 -1 -0.6 0.2 z=y/t z=-0.08 Результат - получается одно число, а ожидали функцию z(t)=cos(t)/t.

Для организации поэлементного деления одного массива на другой, в MATLAB предусмотрена специальная операция - «./» - поэлементное деление.

Результат этого выражения будет другой: z=y ./ t z= 0.5403 -0.2081 -0.3300 -0.1634 0.0567.

Page 13: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

3. Математические функции В системе MATLAB имеется обширная библиотека математических функций. Каждой

функции соответствует определенное имя. Функция ставит в соответствие значениям своих аргументов значение результата.

Аргументы функции всегда указываются в круглых скобках после имени функции и, если их больше одного, разделяются запятыми. В качестве аргументов могут использоваться другие функции и любые выражения языка MATLAB (при условии соответствия типов аргументов).

Элементарная математическая функция - это, как правило, функция от одной переменной, и в этом случае устанавливается соответствие между массивами значений аргумента и результата.

Аргумент указывается в круглых скобках после имени функции. Имя переменной, которой присваивается значение функции, располагается слева от знака равенства. Если имя присваиваемой переменной не указано, значение функции присваивается служебной переменной ans.

Тип результата вычисления математической функции всегда совпадает с типом ее аргумента. Например, если аргументом функции является вектор-столбец, то значением этой функции также будет вектор-столбец.

Рассмотрим встроенные математические функции системы MATLAB, которые применяются к числам, скалярным переменным и к массивам (поэлементно).

Базовые функции

ABS - абсолютное значение ANGLE - аргумент комплексного числа REAL, IMAG - действительная и мнимая части комплексного числа CONJ - операция комплексного сопряжения SIGN - вычисление знака числа CEIL, FIX, FLOOR, ROUND - функции округления REM - функция остатка GCD - наибольший общий делитель LCM - наименьшее общее кратное RAT, RATS - представление результата в виде рационального числа или цепной дроби

Трансцендентные функции SQRT - квадратный корень EXP - экспоненциальная функция LOG - функция натурального логарифма POW2 - экспонента по основанию 2 NEXTPOW2 - ближайшая степень по основанию 2 LOG2 - фунции логарифма LOG10 - функции логарифма

Тригонометрические функции SIN, SINH - функции синуса ASIN, ASINH - функции обратного синуса CSC, CSCH - функции косеканса ACSC, ACSCH - функции обратного косеканса COS, COSH - функции косинуса ACOS, ACOSH - функции обратного косинуса SEC, SECH - функции секанса ASEC, ASECH - функции обратного секанса TAN, TANH - функции тангенса ATAN, ATAN2, ATANH - функции обратного тангенса COT, COTH - функции котангенса ACOT, ACOTH - функции обратного котангенса

Преобразования системы координат CART2POL - преобразование декартовой системы координат в полярную и

цилиндрическую

Page 14: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

CART2SPH - преобразование декартовой системы координат в сферическую POL2CART - преобразование полярной и цилиндрической систем координат в декартову SPH2CART - преобразование сферической системы координат в декартову

Специальные функции BESSEL - функции Бесселя BETA, BETACORE, BETAINC, BETALN - бета-функции ELLIPJ - эллиптические функции Якоби ELLIPKE - полные эллиптические интегралы ERF, ERFCORE, ERFC, ERFCX, ERFINV - функции ошибок GAMMA, GAMMAINC, GAMMALN - гамма-функции

Page 15: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

4. Графические средства представления результатов

4.1. Вывод одного графика MATLAB предоставляет следующие функции для работы с графикой:

plot(<Массив>) - построение графика значений из массива Х от номера отсчета. plot(<Массив точек по оси Х>,<Массив точек по оси У>) - построение графика значений

из массива У от значений из массива Х. При вызове команды создается окно с указанным графиком.

Функция plot имеет различные формы, связанные с входными параметрами, например plot(y) создает кусочно-линейный график зависимости элементов y от их индексов. Если в качестве аргументов заданы два вектора, то plot(x,y) создаст график зависимости y от x. Например, для построения графика функции sin в интервале от 0 до 2, сделаем следующее

Программа построила график зависимости, который отображается в окне

MatLab автоматически присваивает каждому графику свой цвет (исключая случаи, когда

это делает пользователь), что позволяет различать наборы данных. Функцию plot() можно записать и с одним аргументом x или y: plot(x); plot(y);

в результате получим два разных графика. Их анализ показывает, что в случае одного аргумента функция plot() отображает множество точек по оси Oy, а по оси Оx происходит автоматическая генерация множества точек с единичным шагом. Следовательно, для простой визуализации вектора в виде двумерного графика достаточно воспользоваться функцией plot() с одним аргументом.

Page 16: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

4.2. Трехмерные графики Для построения трехмерных графиков во первых понадобится создать сетку координат на

плоскости. Выполняет это функция [X,Y]=meshgrid(x,y), где x и y - одномерные массивы, а X и Y - полученные в результате двухмерные массивы. Если массивы x и y одинаковые, то достаточно указать [X,Y]=meshgrid(x). Например: [X,Y]=meshgrid([-2:0.1:2]).

После этого описывается сама функция, например Z=X.*exp(-X.^2-Y.^2). Напоминаю что операции «.^» и «.*» означают поэлементные а не матричные действия.

После этого подается команда на вывод трехмерного графика: plot3(X,Y,Z).

4.3. Вывод нескольких графиков Для вывода нескольких графиков на одном окне Вам необходимо указать их

последовательно, например: t=-10:0.1:10 ; x1=sin(t) ; x2=cos(t) ./ t ; plot(t,x1,t,x2)

Page 17: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

Команда hold on позволяет добавлять кривые на существующий график. Функция subplot позволяет выводить множество графиков в одном окне

4.4 Печать графиков Пункт Print в меню File и команда print печатают графику MatLab. Меню Print

вызывает диалоговое окно, которое позволяет выбирать общие стандартные варианты печати. Команда print обеспечивает большую гибкость при выводе выходных данных и позволяет контролировать печать из М-файлов. Результат может быть послан прямо на принтер, выбранный по умолчанию, или сохранен в заданном файле.

4.5. Элементарные графические функции системы MATLAB Двумерные графики

PLOT - график в линейном масштабе LOGLOG - график в логарифмическом масштабе SEMILOGX, SEMILOGY - график в полулогарифмическом масштабе POLAR - график в полярных координатах

Трехмерные графики PLOT3 - построение линий и точек в трехмерном пространстве MESHGRID - формирование двумерных массивов X и Y MESH, MESHC, MESHZ - трехмерная сетчатая поверхность SURF, SURFC - затененная сетчатая поверхность SURFL - затененная поверхность с подсветкой AXIS - масштабирование осей и вывод на экран GRID - нанесение сетки HOLD - управление режимом сохранения текущего графического окна SUBPLOT - разбиение графического окна ZOOM - управление масштабом графика COLORMAP - палитра цветов

Page 18: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

CAXIS - установление соответствия между палитрой цветов и масштабированием осей SHADING - затенение поверхностей CONTOURC - формирование массива описания линий уровня CONTOUR - изображение линий уровня для трехмерной поверхности CONTOUR3 - изображение трехмерных линий уровня

Надписи и пояснения к графикам TITLE - заголовки для двух- и трехмерных графиков XLABEL, YLABEL, ZLABEL - обозначение осей CLABEL - маркировка линий уровня TEXT - добавление к текущему графику текста GTEXT - размещает заданный текст на графике с использованием мыши LEGEND - пояснение к графику COLORBAR - шкала палитры

Специальная графика Раздел специальной графики включает графические команды и функции для построения

столбцовых диаграмм, гистограмм, средств отображения векторов и комплексных элементов, вывода дискретных последовательностей данных, а также движущихся траекторий как для двумерной, так и для трехмерной графики. Этот раздел получил свое дальнейшее развитие в версии системы MATLAB 5.0, где специальные графические средства улучшены и существенно расширены.

BAR - столбцовые диаграммы ERRORBAR - график с указанием интервала погрешности HIST - построение гистограммы STEM - дискретные графики STAIRS - ступенчатый график ROSE - гистограмма в полярных координатах COMPASS, FEATHER - графики векторов QUIVER - поле градиентов функции COMET - движение точки по траектории FILL - закраска многоугольника COMET3 - движение точки по пространственной траектории SLICE - сечения функции от трех переменных WATERFALL - трехмерная поверхность FILL3 - закраска многоугольника в трехмерном пространстве VIEWMTX - вычисление матрицы управления углом просмотра VIEW - управление положением точки просмотра

Page 19: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

5. Условные операторы и циклы в MatLab 5.1. Условный оператор if В самом простом случае синтаксис данного оператора if имеет вид:

if <выражение> <операторы> end

Блок условного оператора обязательно заканчивается служебным словом end. Ниже представлен пример реализации функции sign(), которая возвращает +1, если число

больше нуля, -1 – если число меньше нуля и 0, если число равно нулю: x = 5; if x > 0 disp(1); end if x < 0 disp(-1); end if x == 0 disp(0); end

Анализ приведенного примера показывает, что все эти три условия являются взаимоисключающими, т.е. при срабатывании одного из них нет необходимости проверять другие. Реализация именно такой логики позволит увеличить скорость выполнения программы. Этого можно добиться путем использования конструкции if <выражение> <операторы1> % выполняются, если истинно условие else <операторы2> % выполняются, если условие ложно end

Тогда приведенный выше пример можно записать следующим образом:

x = 5; if x > 0 disp(1); else if x < 0 disp(-1); else disp(0); end end

В данной программе сначала выполняется проверка на положительность переменной x, и если это так, то на экран выводится значение 1, а все другие условия игнорируются. Если же первое условие оказалось ложным, то выполнение программы переходит по else (иначе) на второе условие, где выполняется проверка переменной x на отрицательность, и в случае истинности условия, на экран выводится значение -1. Если оба условия оказались ложными, то выводится значение 0.

Приведенный выше пример можно записать в более простой форме, используя еще одну конструкцию оператора if языка MatLab: if <выражение1> <операторы1> % выполняются, если истинно выражение1 elseif <выражение2> <операторы2> % выполняются, если истинно выражение2 ...

Page 20: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

elseif <выражениеN> <операторыN> % выполняются, если истинно выражениеN end

и записывается следующим образом: x = 5; if x > 0 disp(1); % выполняется, если x > 0 elseif x < 0 disp(-1); % выполняется, если x < 0 else disp(0); % выполняется, если x = 0 end

С помощью условного оператора if можно выполнять проверку более сложных (составных) условий. Например, необходимо определить: попадает ли переменная x в диапазон значений от 0 до 2? Это можно реализовать одновременной проверкой сразу двух условий: x >= 0 и x <=2. Если эти оба условия истинны, то x попадает в диапазон от 0 до 2.

Для реализации составных условий в MatLab используются логические операторы: & - логическое И | - логическое ИЛИ ~ - логическое НЕ

Рассмотрим пример использования составных условий. Пусть требуется проверить попадание переменной x в диапазон от 0 до 2. Программа запишется следующим образом: x = 1; if x >= 0 & x <= 2 disp('x принадлежит диапазону от 0 до 2'); else disp('x не принадлежит диапазону от 0 до 2'); end

Во втором примере выполним проверку на не принадлежность переменной x диапазону от 0 до 2. Это достигается срабатыванием одного из двух условий: x < 0 или x > 2: x = 1; if x < 0 | x > 2 disp('x не принадлежит диапазону от 0 до 2'); else disp('x принадлежит диапазону от 0 до 2'); end

Используя логические операторы И, ИЛИ, НЕ, можно создавать разнообразные составные условия. Например, можно сделать проверку, что переменная x попадает в диапазон от -5 до 5, но не принадлежит диапазону от 0 до 1. Очевидно, это можно реализовать следующим образом: x = 1; if (x >= -5 & x <= 5) & (x < 0 | x > 1) disp('x принадлежит [-5, 5], но не входит в [0, 1]'); else disp('x или не входит в [-5, 5] или в [0, 1]'); end

Обратите внимание, что при сложном составном условии были использованы круглые скобки. Дело в том, что приоритет операции И выше приоритета операции ИЛИ, и если бы не было круглых скобок, то условие выглядело бы так: (x >= -5 и x <= 5 и x < 0) или x > 1. Очевидно, что такая проверка давала бы другой результат от ожидаемого.

Круглые скобки в программировании используются для изменения приоритетов выполнения операторов. Подобно арифметическим операторам, логические также могут быть изменены по желанию программиста. Благодаря использованию круглых скобок, сначала выполняется проверка внутри них, а, затем, за их пределами. Именно поэтому в приведенном выше примере они необходимы для достижения требуемого результата.

Приоритет логических операций следующий:

Page 21: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

НЕ (~) – самый высокий приоритет; И (&) – средний приоритет; ИЛИ (|) – самый низкий приоритет.

5.2. Оператор цикла while Язык программирования MatLab имеет два оператора цикла: while и for. В самом простом случае цикл в программе организуется с помощью оператора while,

который имеет следующий синтаксис: while <условие> <операторы> end

Здесь <условие> означает условное выражение подобное тому, которое применяется в операторе if, и цикл while работает до тех пор, пока это условие истинно.

Следует обратить внимание на то, что если условие будет ложным до начала выполнения цикла, то операторы, входящие в цикл, не будут выполнены ни разу.

Приведем пример работы цикла while для подсчета суммы ряда : S = 0; % начальное значение суммы i=1; % счетчик суммы while i <= 20 % цикл (работает пока i <= 20) S=S+i; % подсчитывается сумма i=i+1; % увеличивается счетчик на 1 end % конец цикла disp(S); % отображение суммы 210 на экране

Теперь усложним задачу и будем подсчитывать сумму ряда , пока . Здесь в операторе цикла получается два условия: либо счетчик по i доходит до 20, либо значение суммы S превысит 20. Данную логику можно реализовать с помощью составного условного выражения в операторе цикла while: S = 0; % начальное значение суммы i=1; % счетчик суммы while i <= 20 & S <= 20 % цикл (работает пока i<=10 и S<=20 S=S+i; % подсчитывается сумма i=i+1; % увеличивается счетчик на 1 end % конец цикла disp(S); % отображение суммы 21 на экране

Приведенный пример показывает возможность использования составных условий в цикле while. В общем случае в качестве условного выражения можно записывать такие же условия, что и в условном операторе if.

Работу любого оператора цикла, в том числе и while, можно принудительно завершить с помощью оператора break. Например, предыдущую программу можно переписать следующим образом с использованием оператора break: S = 0; % начальное значение суммы i=1; % счетчик суммы while i <= 20 % цикл (работает пока i<=10 S=S+i; % подсчитывается сумма i=i+1; % увеличивается счетчик на 1 if S > 20 % если S > 20, break; % то цикл завершается end end % конец цикла disp(S); % отображение суммы 21 на экране

В данном примере второе условие завершения цикла, когда S будет больше 20, записано в самом цикле и с помощью оператора break осуществляется выход из цикла на функцию disp(), стоящую сразу после цикла while.

Page 22: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

Второй оператор управления выполнением цикла continue позволяет пропускать выполнение фрагмента программы, стоящий после него. Например, требуется подсчитать сумму элементов массива

a = [1 2 3 4 5 6 7 8 9]; исключая элемент с индексом 5. Такую программу можно записать следующим образом:

S = 0; % начальное значение суммы a = [1 2 3 4 5 6 7 8 9]; % массив i=0; % счетчик индексов массива while i < length(a) % цикл (работает пока i меньше % длины массива а) i=i+1; % увеличивается счетчик индексов на 1 if i == 5 % если индекс равен 5 continue; % то его не подсчитываем end S=S+a(i); % подсчитывается сумма элементов end % конец цикла disp(S); % отображение суммы 40 на экране

Следует отметить, что в данной программе увеличение индекса массива i происходит до проверки условия. Это сделано для того, чтобы значение индекса увеличивалось на 1 на каждой итерации работы цикла. Если увеличение счетчика i записать как в предыдущих примерах, т.е. после подсчета суммы, то из-за оператора continue его значение остановилось бы на 5 и цикл while работал бы «вечно».

5.3. Оператор цикла for Часто при организации цикла требуется перебирать значение счетчика в заданном

диапазоне значений и с заданным шагом изменения. Например, чтобы перебрать элементы вектора (массива), нужно организовать счетчик от 1 до N с шагом 1, где N – число элементов вектора. Чтобы вычислить сумму ряда, также задается счетчик от a до b с требуемым шагом изменения step. И так далее. В связи с тем, что подобные задачи часто встречаются в практике программирования, для их реализации был предложен свой оператор цикла for, который позволяет проще и нагляднее реализовывать цикл со счетчиком.

Синтаксис оператора цикла for имеет следующий вид: for <счетчик> = <начальное значение>:<шаг>:<конечное значение> <операторы цикла> end

Рассмотрим работу данного цикла на примере реализации алгоритма поиска максимального значения элемента в векторе: a = [3 6 5 3 6 9 5 3 1 0]; m = a(1); % текущее максимальное значение for i=1:length(a) % цикл от 1 до конца вектора с % шагом 1 (по умолчанию) if m < a(i) % если a(i) > m, m = a(i); % то m = a(i) end end % конец цикла for disp(m);

В данном примере цикл for задает счетчик i и меняет его значение от 1 до 10 с шагом 1. Обратите внимание, что если величина шага не указывается явно, то он берется по умолчанию равным 1.

В следующем примере рассмотрим реализацию алгоритма смещения элементов вектора вправо, т.е. предпоследний элемент ставится на место последнего, следующий – на место предпоследнего, и т.д. до первого элемента: a = [3 6 5 3 6 9 5 3 1 0]; disp(a); for i=length(a):-1:2 % цикл от 10 до 2 с шагом -1

Page 23: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

a(i)=a(i-1); % смещаем элементы вектора а end % конец цикла for disp(a);

Результат работы программы 3 6 5 3 6 9 5 3 1 0 3 3 6 5 3 6 9 5 3 1

Приведенный пример показывает, что для реализации цикла со счетчиком от большего значения к меньшему, нужно явно указывать шаг, в данном случае, -1. Если этого не сделать, то цикл сразу завершит свою работу и программа будет работать некорректно.

Page 24: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

6. М-файлы 6.1. M-file Работа из командной строки MatLab затрудняется, если требуется вводить много команд и

часто их изменять. Ведение дневника при помощи команды diary и сохранение рабочей среды незначительно облегчают работу. Самым удобным способом выполнения групп команд MatLab является использование М-файлов, в которых можно набирать команды, выполнять их все сразу или частями, сохранять в файле и использовать в дальнейшем. Для работы с М-файлами предназначен редактор М-файлов. С его помощью можно создавать собственные функции и вызывать их, в том числе и из командного окна.

Раскройте меню File основного окна MatLab и в пункте New выберите подпункт M-file. Новый файл открывается в окне редактора M-файлов, которое изображено на рисунке.

М-файлы в MatLab бывают двух типов: файл-программы (Script M-Files), содержащие

последовательность команд, и файл-функции, (Function M-Files), в которых описываются функции, определяемые пользователем.

7.2. Файл-программа Наберите в редакторе команды, приводящие к построению двух графиков на одном

графическом окне

Сохраните теперь файл с именем mydemo.m в подкаталоге work основного каталога

MatLab, выбрав пункт Save as меню File редактора. Для запуска на выполнение всех команд, содержащихся в файле, следует выбрать пункт Run в меню Debug. На экране появится графическое окно Figure 1, содержащее графики функций.

Очень удобной возможностью, предоставляемой редактором М-файлов, является выполнение части команд. Закройте графическое окно Figure 1. Выделите при помощи мыши, удерживая левую кнопку, или клавишами со стрелками при нажатой клавише Shift, первые четыре команды и выполните их из пункта Text. Обратите внимание, что в графическое окно вывелся только один график, соответствующий выполненным: командам. Запомните, что для выполнения части команд их следует выделить и нажать клавишу F9.

Page 25: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

Отдельные блоки М-файла можно снабжать комментариями, которые пропускаются при выполнении, но удобны при работе с М-файлом. Комментарии начинаются со знака процента и автоматически выделяются зеленым цветом, например:

Открытие существующего М-файла производится при помощи пункта Open меню File

рабочей среды, либо редактора М-файлов. 7.3. Файл-функция М-функции являются M-файлами, которые допускают наличие входных и выходных

аргументов. Они работают с переменными в пределах собственной рабочей области, отличной от рабочей области системы MATLAB.

Пример Функция average - это достаточно простой M-файл, который вычисляет среднее значение

элементов вектора: function y = average (x) % AVERAGE Среднее значение элементов вектора. % AVERAGE(X), где X - вектор. Вычисляет среднее значение элементов вектора. % Если входной аргумент не является вектором, генерируется ошибка. [m,n] = size(x); if (~((m == 1) | (n == 1)) | (m == 1 & n == 1)) error('Входной массив должен быть вектором’) end y =sum(x)/length(x); % Собственно вычисление

Попробуйте ввести эти команды в M-файл, именуемый average.m. Функция average допускает единственный входной и единственный выходной аргументы. Для того чтобы вызвать функцию average, надо ввести следующие операторы: z = 1:99; average(z) ans = 50

Структура М-функции. M-функция состоит из: строки определения функции; первой строки комментария; собственно комментария; тела функции; строчных комментариев;

Строка определения функции. Строка определения функции сообщает системе MATLAB, что файл является М-функцией, а также определяет список входных аргументов.

Пример Строка определения функции average имеет вид: function y = average(x) Здесь:

1. function - ключевое слово, определяющее М-функцию;

Page 26: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

2. y - выходной аргумент; 3. average - имя функции; 4. x - входной аргумент.

Каждая функция в системе MATLAB содержит строку определения функции, подобную приведенной.

Если функция имеет более одного выходного аргумента, список выходных аргументов помещается в квадратные скобки. Входные аргументы, если они присутствуют, помещаются в круглые скобки. Для отделения аргументов во входном и выходном списках применяются запятые.

Пример function [x, y, z] = sphere(theta, phi, rho) Имена входных переменных могут, но не обязаны совпадать с именами, указанными в

строке определения функции. Первая строка комментария. Для функции average первая строка комментария выглядит

так: % AVERAGE Среднее значение элементов вектора Это - первая строка текста, которая появляется, когда пользователь набирает команду help

<имя_функции>. Кроме того, первая строка комментария выводится на экран по команде поиска lookfor. Поскольку эта строка содержит важную информацию об M-файле, она должна быть тщательно составлена.

Имена М-функций. В системе MATLAB на имена М-функций налагаются те же ограничения, что и на имена переменных - их длина не должна превышать 31 символа. Более точно, имя может быть и длиннее, но система MATLAB принимает во внимание только первые 31 символ. Имена М-функций должны начинаться с буквы; остальные символы могут быть любой комбинацией букв, цифр и подчеркиваний.

Имя файла, содержащего М-функцию, составляется из имени функции и расширения “.m”. Пример average.m

Если имя файла и имя функции в строке определения функции разные, то используется имя файла, а внутреннее имя игнорируется. Хотя имя функции, определенное в строке определения функции, может и не совпадать с именем файла, настоятельно рекомендуется использовать одинаковые имена.

Page 27: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

7. Символьные вычисления в среде MATLAB

8.1 Символьные выражения 8.1.1 Объявление символьных переменных и констант

В процессе символьных вычислений используются переменные и константы особого типа, так называемые символьные объекты. Хотя обычно в коде MATLAB тип переменных определяется динамически и нет нужды объявлять его явно, для символьных объектов дело обстоит иначе. Для объявления символьных переменных служит команда syms, которая в качестве аргументов принимает имена переменных, перечисленные через пробел. Например, так: >> syms x y >> syms a b real % объявляемые объекты обозначают вещественные переменные Объявление символьных констант осуществляется при помощи функции sym. Она может принимать в качестве аргумента строку, содержащую специальные переменные, численное выражение или вызов функции, как в примерах ниже: >> sym_pi = sym(’pi’) >> sym_delta = sym(’1/10’) >> sym_sqroot2 = sym(’sqrt(2)’) Использование символьных констант полезно тем, что вычисления с ними производятся точно (т.е. без вычислительных погрешностей) до тех пор, пока не потребуется вычислить некоторое числовое значение. Заметим, что при выводе содержимого рабочего пространства командой whos символьные переменные и константы отображаются как представители класса sym object.

8.1.2 Символьные выражения и манипуляции над ними

После объявления, с символьными переменными можно обращаться примерно так же, как и с обычными числовыми. В частности, для них определены операторы + - * / ˆ, с помощью которых можно составлять символьные выражения: >> syms s t A >> f = s 2̂ + 4*s + 5 f= s^2 + 4*s + 5 >> g = s + 2 g= s+2 >> h = f*g h= (s^2 + 4*s + 5)*(s + 2) >> z = exp(-s*t) z = exp(-s*t) >> y = A*exp(-s*t) y = A*exp(-s*t) В приведенных командах символьные переменные s, t, A используются для составления символьных выражений, создавая новые символьные переменные f, g, h, z, y. При этом последние автоматически объявляются символьными и их значение не вычисляется и никак не преобразуется.

При манипуляциях с символьными объектами часто бывает полезно узнать, какие независимые переменные содержатся в выражении, заданном строкой S. Для этой цели можно использовать функцию findsym. Например, продолжая пример выше, можно выполнить команду

Page 28: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

>> findsym(z) ans = A, s, t

Заметим, что MATLAB всегда остается прежде всего матричным процессором и потому к символьным переменным можно свободно применять матричную и векторную запись и соответствующие встроенные операторы и функции. Приведем пример: >> n = 3; >> syms x; >> B = x.̂ ((0:n)’*(0:n)) B = [ 1, 1, 1, 1] [ 1, x, x^2, x^3] [ 1, x 2̂, x̂ 4, x̂ 6] [ 1, x 3̂, x̂ 6, x̂ 9]

Продемонстрируем некоторые простые алгебраические манипуляции, которые можно осуществлять над символьными объектами.

expand(S) Раскрывает скобки в выражении S

factor(S) Разлагает на множители выражение S

simplify(S) Упрощает каждый элемент символьной матрицы S

subs(S, oldvar, newvar) Заменяет в выражении S каждое вхождение символической переменной oldvar новой переменной newvar

Примеры использования можно увидеть ниже:

• Раскрытие скобок

>> syms s; >> A = s + 2; >> B = s + 3; >> C = A*B C = (s+2)*(s+3) >> C = expand(C) C = s^2 + 5*s + 6

• Разложение на множители

>> syms s; >> D = s^2 + 6*s + 9; >> D = factor(D) D = (s+3)^2 >> p = s^3 - 2*s^2 - 3*s + 10; >> P = factor(p) P = (s+2)*(s^2 - 4*s + 5)

• Сокращение общего множителя

>> syms s; >> H = (s^3 + 2*s^2 + 5*s + 10)/(s^2 + 5);

Page 29: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

>> H = simplify(H) H = s+2 >> factor(s^3 + 2*s^2 + 5*s + 10) ans = (s+2)*(s^2 + 5)

• Подстановка переменной

Путь имеется выражение H(s) =86

32

ss

s и требуется вычислить 2

)()(

ss

sHsG .

>> syms s; >> H = (s + 3)/(s^2 + 6*s + 8); >> G = subs(H, s, s+2) G = (s+5)/((s+2)^2 + 6*s + 20) >> G = collect(G) G = (s+5)/(s^2 + 10*s + 24)

Таким образом, 2410

5)( 2

ss

ssG .

Отметим, что конечный результат символьных преобразований далеко не всегда выглядит так, как хотелось бы пользователю и бывает неудобно работать с ним дальше.

8.2 Вычисление символьных выражений и отрисовка Рано или поздно наступает момент, когда нам необходимо вычислить числовое значение результата выкладок или нарисовать график функции, выраженной символьным объектом. Рассмотрим, какие возможности для этого предоставляет нам MATLAB.

8.2.1 Вычисления значения выражения

double(S) Преобразует символьную матрицу S, заменяя ее элементы их численными значениями. Матрица S не должна содержать символьных переменных

Как следует из описания функции, в символическом выражении перед вычислением его численного значения необходимо сделать все возможные подстановки, чтобы избавиться от свободных символьных переменных. Рассмотрим пример:

>> syms s; >> E = s^3 -14*s^2 + 65*s - 100); >> F = subs(E, s, 7.1) F = 13671/1000 >> G = double(F) G = 13.6710

4.2.2 Рисование при помощи функции ezplot

Символическое выражение может быть нарисовано непосредственно при помощи функции ezplot:

ezplot(f) Рисует график функции f(x), где f является математической

Page 30: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

функцией переменной x. Интервал, на котором изображается график, по умолчанию равен [-2π, 2π].

ezplot(f,xmin,xmax) Рисует график на заданном интервале. Например, график кубического многочлена

A(s) = s + 4s - 7s - 10

на интервале [-1,3] можно нарисовать следующим образом:

>> syms s; >> A = s^3 + 4*s^2 - 7*s - 10; >> ezplot(A, -1, 3), ylabel(’A(s)’)

Отметим, что название оси абсцисс и всего графика определяется автоматически. Они могут быть изменены обычным способом (см. команды xlabel, title).

8.2.3 Рисование при помощи функции plot

График функции можно построить и используя функцию plot:

plot(x, y, frmt) Рисует график функции по точкам, координаты которых заданы массивами x и y . Параметр frmt определяет внешний вид графика. В

качестве примера мы нарисуем графики двух функций. Одна будет задана явно, другая - символьным выражением. Одновременно продемонстрируем некоторые возможности для настройки внешнего вида графика.

clear all; % Очищаем рабочее пространство syms x y; % Определяем символьные переменные x2 — y2 z = (x^2 - y^2)/(x^2 + y^2); % Определяем функцию z(x,y) =x2 + y x1 = linspace(0, pi); % Задаем массив абсцисс точек графика y1 = sin(x); % Функция задается явным выражением M-кода

x2 - 1 zy1 = subs(z, y, 1); % Вычисляем z(x, 1) = --, график которой и нарисуем

x2 + 1 z1 = subs(zy1, x, x1); % Вычисляем ординаты точек

plot(x1, y1, ’b’, x1, z1, ’r’) % Рисуем графики обеих функций разным цветом set(get(gcf, ’CurrentAxes’), ’FontSize’, 10) % Меняем шрифт для надписей title(’\bf2D-график’); % Задаем заголовок графика xlabel(’\itx’); % Задаем метку оси абсцисс ylabel(’\ity’); % Задаем метку оси ординат

da = daspect; % Получаем текущий масштаб графика da(1:2) = min(da(1:2)); % Выравниваем масштаб графика daspect(da); % Устанавливаем новый масштаб xlim([0, pi]); % Устанавливаем пределы по оси абсцисс Отметим, что изменение параметров объектов при помощи функций get, set является типичным для MATLAB, особенно при работе с графикой. Примерно таким же образом можно нарисовать трехмерные графики (детали можно узнать в документации по функциям plot3, mesh, surf).

8.3 Решение уравнений и систем уравнений

8.3.1 Решение уравнений при помощи функции solve

Page 31: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

MATLAB можно использовать для решения алгебраических и трансцендентных уравнений и систем уравнений, заданных в виде массива символьных выражений. Основной инструмент для этого - функция solve. Она может вызываться в разной форме:

solve(E1, E2, ..., EN) solve(E1, E2, ..., EN, var1, var2, ..., varN)

Здесь E1, E2, ..., EN— символьные выражения или пременные, в которых они содержаться, а var1, ..., varN— перменные, относительно которых следует разрешить систему уравнений E1=0, E2=0, ..., EN=0. Разумеется, первая форма вызова этой функции допустима лишь в случае, когда нет неоднозначностей относительно того, что именно следует найти. Функция solve возвращает единственное символьное выражение, если уравнение (система уравнений) имеет единственное решение и вектор решений в противном случае. Если уравнение содержит периодические функции и может поэтому иметь бесконечное число решение, функция ограничивается тем, что возвращает корни за один период в окрестности нуля. Рассмотрим примеры.

• Единственное решение

>> syms s; >>

E = s + 2;

>> s = solve(E);

s = -2

• Несколько решений >> syms s; >> D = s^2 + 6*s + 9; >> s = solve(D) s = [ -3] [ -3]

• Уравнение с параметрами >> syms theta x z; >> E = z*cos(theta) - x; >> theta = solve(E, theta) theta = acos(x/z)

• Уравнение с комплексными корнями >> syms x; >> E = exp(2*x) + 4*exp(x) - 32; >> x = solve(E) x = [ log(-8)] [ log(4)] >> log(-8) ans =

2.0794 + 3.1416i >> log(4) ans =

1.3863

• Уравнение с бесконечным числом решений >> E = cos(2*theta) - sin(theta);

Page 32: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

>> solve(E) theta = [ -1/2*pi] [ 1/6*pi] [ 5/6*pi]

Напомним, что численное (т.е. приближенное) значение решения можно получить, вос-пользовавшись функцией double.

8.3.2 Численное решение уравнений, заданных символьным выражением

Разумеется, не каждое уравнение можно решить аналитически. Для численного решения системы нелинейных уравнений (алгебраических или трансцендентных) можно воспользоваться функцией fsolve. Эта функция в самом простом случае принимает два аргумента. Первый — анонимная функция или имя функции (не математической, а в смысле M-языка), которая описывает правую часть системы уравнений, записанной в нормальной форме. Второй аргумент задает начальное приближение для итерационной процедуры поиска решения.

Процедура численного решения часто является лишь небольшим блоком в программе, поэтому заранее неизвестно, как именно выглядит система уравнений. Простейший, хотя и не самый красивый способ заключается в том, чтобы «на лету» создавать файл с описанием необходимой задачи и затем передавать его имя функции fsolve. Для нас этот способ интересен тем, что знакомит с работой с файловой системой в MATLAB и в дальнейшем, при решении задач вариационного исчисления, будет использоваться именно он.

Приведем пример, снабдив его исчерпывающими, на наш взгляд, комментариями. Итак, пусть необходимо решить систему уравнений вида

2)cos1(3)sin(

rr

Опишем необходимые действия:

clear all; %Очищаем память

eq1 = ’r*(phi - sin(phi)) - 3’; % Описываем первое уравнение

eq2 = ’r*(1 - cos(phi)) - 2’; % Описываем второе уравнение

% Начинаем создавать содержимое будущей функции

s{1} = ’function y = MyFunction(x)’; % Заголовок функции s{2} = ’r = x(1); phi = x(2);’; % Определяем переменные s{3} = [’y(1) = ’ vectorize(eq1) ’;’]; % Определяем результат s{4} = [’y(2) = ’ vectorize(eq2) ’;’]; % выполнения функции

filename = fullfile(pwd, ’MyFunction.m’); % Определяем полное имя файла fid = fopen(filename, ’w’); % Открываем файл на запись fprintf(fid, ’%s\n’, s{:}); % Записываем содержимое fclose(fid); %Закрываем файл

% Решаем уравнение численно и печатаем результат

xinit = ones(2,1); % Задаем начальное приближение [xzero, yzero, eflag, opt] = fsolve(’MyFunction’, xinit); % Решаем fprintf(’Количество вычислений правой части: %d\n’, opt.iterations);

Page 33: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

fprintf(’Найденное решение: \nr = %12.7f\nphi = %12.7f\n’, xzero); delete(filename); % Удаляем более не нужный файл

Советуем сравнить результат вычислений с результатами следующей команды: >> solve(eq1, eq2, ’r,phi’)

8.4 Элементы математического анализа

8.4.1 Вычисление пределов Вычисление пределов от символьных выражений производится с помощью встроенной функции limit. limit(f(x)) )(lim

0xf

x

limit(f(x),a) )(lim xfax

limit(f(x),x,a,’left’) )(lim xfax

% предел слева

limit(f(x),x,a,’right’) )(lim xfax

% предел справа

Примечание: символ бесконечность ( ) в MATLAB записывается как inf. Неопределенное значение в MATLAB записывается как NaN.

Вычислить предел выражения

xx

x

)sin(lim :

» syms x » y=sin(x)/x; » y1=sin(x)/x; » limit(y1) ans = 1 % Предел отношения равен единицы

Вычислить предел выражения

x

x x

11lim :

» y2=(1+1/x)^x; » limit(y2,inf) ans = exp(1) % Ответ: число е в первой степени

Вычислить предел выражения xx

1lim0 при стремлении х к нулю слева:

» y3=1/x; » limit(y3,x,0,'left') ans = -inf % Ответ: минус бесконечность

Вычислить предел выражения xx

1lim0 при стремлении х к нулю справа:

» y4=1/x; » limit(y4,x,0,'right') ans = inf % Ответ: бесконечность (т.е. плюс бесконечность)

Вычислить предел выражения

hxhx

h

sin)sin(lim0 :

» syms x h

Page 34: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

» y5=(sin(x+h)-sin(x))/h; » limit(y5,h,0) % Вычисление предела по одной из переменных — по h ans = cos(x)

8.4.2 Дифференцирование

Чтобы найти производную символьного выражения, следует воспользоваться одной из следующих форм функции diff: diff(S) Дифференцирует выражение S по независимым

переменным, определенным функцией findsym

diff(S, t) Дифференцирует выражение S по переменной t

diff(S,n) n раз дифференцирует выражение S

diff(S, t, n) n раз дифференцирует выражение S по переменной t

Приведем несколько простых примеров.

>> syms s n; >> p = s^3 + 4*s^2 - 7*s - 10; >> d = diff(p) d = 3*s^2+8*s-7 >> e = diff(p, 2) e = 6*s+8 >> g = s^n; >> h = diff(g) h = s^n*n/s >> h = simplify(h) h = s^(n-1)*n >> >> f = exp(-(x^2)/2); >> diff(f) ans = -x*exp(-1/2*x^2)

8.4.3 Интегрирование

Как и дифференцирование, символьное вычисление интегралов (как определенных, так и неопределенных) выполянется одной функцией int:

int(S) Интегрирует выражение S по независимым переменным, определенным функцией findsym. Если S — константа, то интегрирование выполняется по x

int(S, t) Интегрирует выражение S по переменной t

int(S, a, b) Вычисляет определенный интеграл на промежутке [а, Ь]

int(S, t, a, b) Вычисляет определенный интеграл по указанной переменной

Page 35: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

Приведем несколько примеров:

>> syms x n a b t >> int(x^n) ans = x^(n+1)/(n+1) >> int(x^3 + 4*x^2 + 7*x + 10) ans = 1/4*x^4+4/3*x^3+7/2*x^2+10*x >> int(x, 1, t) ans = 1/2*t^2-1/2 >> int(x^3, a, b) ans = 1/4*b^4-1/4*a^4 >> int(cos(x)) ans = sin(x) >> int(exp(-x^2)) ans = 1/2*pi^(1/2)*erf(x) 8.5. Разложение в ряд Тейлора. Для заданного выражения находится ряд Тейлора с остаточным членом, величина которого зависит от точности, выбираемой при выполнении операции. Остаточный член отбрасывается. - Начать надо с указания символьных переменных. - Затем надо ввести исходную функцию. - Далее следует выполнить операцию разложения в ряд Тейлора и получить результат с именем f1_new. Для этого используется функция taylor(f1,n,'x',a). Здесь f1 - имя функции, переменной, n - порядок остаточного члена, , 'x' - имя переменной (вводится, как строка, в апострофах), по которой производится разложение, а - значение переменной, для которого делается разложение (если оно пропускается, то предполагается а=0). - Затем над f1_new нужно выполнить операцию свертки и получить результат с именем f1_old. Для этого используется функция simple(имя переменной). - Признаки правильного выполнения операции - в окрестности точки а графики исходной и полученной функций совпадают. - Для построения графиков символьных функций имеется процедура ezplot(f2,-h,h);grid on. Здесь f2 - имя символьной функции, (-h h) - нижний и верхний предел значений аргумента, grid on – включает в графике координатную сетку. В заголовок графического окна помещается описание функции. По этой причине в одно графическое окно можно вывести только один график.

Page 36: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

% Задача % Определить символьные переменные syms x; % Функция f2=sin(x)/x % Найти разложение Тейлора по х в точке О f2_new=taylor(f2,5,'x',0) % Диапазон просмотра п=4; % График f2 figure(1); ezplot(f2,-h,h);grid on % График f2_new figure(2); ezplot(f2_new,-h,h);grid on

8.6. Оболочка funtool Для работы с символьными функциями предусмотрена функция оболочка - funtool. Она представляет собой интерактивный графический калькулятор, позволяющий быстро построить две функции одной переменной f(х) и g(х). выводятся три автономных окна: два графических и управляющее. Графики отображаются в отдельных окнах с заголовками. Управляющее окно содержит: - Два поля ввода функций. - Поле ввода пределов переменной х в формате [min.max]. - Поле ввода масштабирующего коэффициента а. Управление осуществляется кнопками, сгруппированными в 4 ряда: - Первый - тип символьного преобразования f(x). - Второй - тип масштабирования f(x): f+a, f-a, f*a, f/a, f^a, f(х+a), f(х*a). - Третий - тип замены f(x) на комбинацию f(х) и g(х). - Четвертый - управляющие операции:

—> Insert - ввести f(x) в библиотеку встроенных функций, —> Cycle - циклически вызвать f(x) из библиотеки встроенных функций, —> Delete - удалить f(x) из библиотеки встроенных функций, —> Reset - установить утилиту в исходное состояние, —> Help - вызов справки. —> Demo - демонстрация использования, —> Close - закрыть.

Пример 1

Page 37: MatLab руководство для начинающих · новый язык распространился среди других университетов и был с большим

Пример 2

Внимание: funtool использует средства символьной математики. Поэтому при вычислении sin(x)/x неопределенность при х=0 раскрывается. Отрабатываются также бесконечно большие значения.