Сохранение рабочей среды. MAT файлы
Введение
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.
Базовые сведения
Рабочая среда MatLab
Чтобы запустить программу дважды щелкните на иконку . Перед Вами откроется рабочая среда, изображенная на рисунке.
Рабочая среда MatLab 6.х содержит следующие элементы:
· панель инструментов с кнопками и раскрывающимся списком;
· окно с вкладками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 выполнила эту команду или вычислила выражение.
Простейшие вычисления
Наберите в командной строке 1+2 и нажмите Enter. В результате в командном окне MatLab отображается следующее:
Рис. 2 Графическое представление метода главных компонент
Что сделала программа MatLab? Сначала она вычислила сумму 1+2, затем записала результат в специальную переменную ans и вывела ее значение, равное 3, в командное окно. Ниже ответа расположена командная строка с мигающим курсором, обозначающая, что MatLab готов к дальнейшим вычислениям. Можно набирать в командной строке новые выражения и находить их значения. Если требуется продолжить работу с предыдущим выражением, например, вычислить (1+2)/4.5, то проще всего воспользоваться уже имеющимся результатом, который хранится в переменной ans. Наберите ans/4.5 (при вводе десятичных дробей используется точка) и нажмите Enter, получается
Рис. 3 Графическое представление метода главных компонент
Эхо команд
Выполнение каждой команды в MatLab сопровождается эхом. В приведенном выше примере — это ответ ans = 0.6667. Часто эхо затрудняет восприятие работы программы и тогда его можно отключить. Для этого команда должна завершаться символом точка с запятой. Например
Рис. 4 Пример ввода функции ScoresPCA
Журнал
В 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 |
Система помощи
Окно справки MatLab появляется после выбора опции Help Windowв меню Help или нажатием кнопки вопроса на панели инструментов. Эта же операция может быть выполнена при наборе команды helpwin. Для вывода окна справки по отдельным разделам, наберите helpwin topic. Окно справки предоставляет Вам такую же информацию, как и команда help, но оконный интерфейс обеспечивает более удобную связь с другими разделами справки.
Матрицы
Доступ к элементам
Доступ к элементам матриц осуществляется при помощи двух индексов — номеров строки и столбца, заключенных в круглые скобки, например команда B(2,3) выдаст элемент второй строки и третьего столбца матрицы B. Для выделения из матрицы столбца или строки следует в качестве одного из индексов использовать номер столбца или строки матрицы, а другой индекс заменить двоеточием. Например, запишем вторую строку матрицы A в вектор z
Также можно осуществлять выделение блоков матриц при помощи двоеточия. Например, выделим из матрицы P блок отмеченный цветом
Если необходимо посмотреть переменные рабочей среды, в командной строке необходимо набрать команду whos. Команда who выводит только имена переменных
Видно, что в рабочей среде содержатся один скаляр (p), четыре матрицы (A, B, P, P1) и вектор-строка (z).
Основные матричные операции
При использовании матричных операций следует помнить, что для сложения или вычитания матрицы должны быть одного размера, а при перемножении число столбцов первой матрицы обязано равняться числу строк второй матрицы. Сложение и вычитание матриц, так же как чисел и векторов, осуществляется при помощи знаков плюс и минус
а умножение — знаком звездочка *. Введем матрицу размером 3×2
Умножение матрицы на число тоже осуществляется при помощи звездочки, причем умножать на число можно как справа, так и слева. Возведение квадратной матрицы в целую степень производится с использованием оператора ^
Матричные вычисления
MatLab содержит множество различных функций для работы с матрицами. Так, например, транспонирование матрицы производится при помощи апострофа '
Нахождение обратной матрицы проводится с помощью функции inv для квадратных матриц
Псевдообратную матрицу можно найти с помощью функции pinv.
Более подробно про обработку матричных данных можно узнать, если вывести список всех встроенных функций обработки данных командой help datafun, а затем посмотреть информацию о нужной функции, например help max.
Операции над матрицами
· 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)
Математические функции
В системе 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 - преобразование декартовой системы координат в полярную и цилиндрическую
· CART2SPH - преобразование декартовой системы координат в сферическую
· POL2CART - преобразование полярной и цилиндрической систем координат в декартову
· SPH2CART - преобразование сферической системы координат в декартову
Специальные функции
· BESSEL - функции Бесселя
· BETA, BETACORE, BETAINC, BETALN - бета-функции
· ELLIPJ - эллиптические функции Якоби
· ELLIPKE - полные эллиптические интегралы
· ERF, ERFCORE, ERFC, ERFCX, ERFINV - функции ошибок
· GAMMA, GAMMAINC, GAMMALN - гамма-функции
Вывод одного графика
MATLAB предоставляет следующие функции для работы с графикой:
plot(<Массив>) - построение графика значений из массива Х от номера отсчета.
plot(<Массив точек по оси Х>,<Массив точек по оси У>) - построение графика значений из массива У от значений из массива Х.
При вызове команды создается окно с указанным графиком.
Функция plot имеет различные формы, связанные с входными параметрами, например plot(y) создает кусочно-линейный график зависимости элементов y от их индексов. Если в качестве аргументов заданы два вектора, то plot(x,y) создаст график зависимости y от x. Например, для построения графика функции sin в интервале от 0 до 2p, сделаем следующее
Программа построила график зависимости, который отображается в окне
MatLab автоматически присваивает каждому графику свой цвет (исключая случаи, когда это делает пользователь), что позволяет различать наборы данных.
Функцию plot() можно записать и с одним аргументом x или y:
plot(x);
plot(y);
в результате получим два разных графика. Их анализ показывает, что в случае одного аргумента функция plot() отображает множество точек по оси Oy, а по оси Оx происходит автоматическая генерация множества точек с единичным шагом. Следовательно, для простой визуализации вектора в виде двумерного графика достаточно воспользоваться функцией plot() с одним аргументом.
Трехмерные графики
Для построения трехмерных графиков во первых понадобится создать сетку координат на плоскости. Выполняет это функция [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).
Вывод нескольких графиков
Для вывода нескольких графиков на одном окне Вам необходимо указать их последовательно, например:
t=-10:0.1:10 ;
x1=sin(t) ;
x2=cos(t) ./ t ;
plot(t,x1,t,x2)
Команда hold on позволяет добавлять кривые на существующий график. Функция subplot позволяет выводить множество графиков в одном окне
Печать графиков
Пункт 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 - палитра цветов
· CAXIS - установление соответствия между палитрой цветов и масштабированием осей
· SHADING - затенение поверхностей
· CONTOURC - формирование массива описания линий уровня
· CONTOUR - изображение линий уровня для трехмерной поверхности
· CONTOUR3 - изображение трехмерных линий уровня
Специальная графика
Раздел специальной графики включает графические команды и функции для построения столбцовых диаграмм, гистограмм, средств отображения векторов и комплексных элементов, вывода дискретных последовательностей данных, а также движущихся траекторий как для двумерной, так и для трехмерной графики. Этот раздел получил свое дальнейшее развитие в версии системы MATLAB 5.0, где специальные графические средства улучшены и существенно расширены.
· BAR - столбцовые диаграммы
· ERRORBAR - график с указанием интервала погрешности
· HIST - построение гистограммы
· STEM - дискретные графики
· STAIRS - ступенчатый график
· ROSE - гистограмма в полярных координатах
· COMPASS, FEATHER - графики векторов
· QUIVER - поле градиентов функции
· COMET - движение точки по траектории
· FILL - закраска многоугольника
· COMET3 - движение точки по пространственной траектории
· SLICE - сечения функции от трех переменных
· WATERFALL - трехмерная поверхность
· FILL3 - закраска многоугольника в трехмерном пространстве
· VIEWMTX - вычисление матрицы управления углом просмотра
· VIEW - управление положением точки просмотра
Условный оператор 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
...
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. Очевидно, что такая проверка давала бы другой результат от ожидаемого.
Круглые скобки в программировании используются для изменения приоритетов выполнения операторов. Подобно арифметическим операторам, логические также могут быть изменены по желанию программиста. Благодаря использованию круглых скобок, сначала выполняется проверка внутри них, а, затем, за их пределами. Именно поэтому в приведенном выше примере они необходимы для достижения требуемого результата.
Приоритет логических операций следующий:
НЕ (~) – самый высокий приоритет;
И (&) – средний приоритет;
ИЛИ (|) – самый низкий приоритет.
Оператор цикла 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.
Второй оператор управления выполнением цикла 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 работал бы «вечно».
Оператор цикла 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
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. Если этого не сделать, то цикл сразу завершит свою работу и программа будет работать некорректно.
Решения уравнения
Поиск решения уравнения
Графическим методом можно лишь примерно оценить решение. Для более точного нахождения решения в пакете MatLAB необходимо воспользоваться функцией fsolve(уравнение, начальное значение). Позже мы познакомимся как с помощью данной функции решать системы уравнений. В простейшем случае решаемое уравнение можно указать можно указать в одинарных кавычках, например: 'x*x-abs(x)'. Но данная функция имеет три решения, представленных на рис.
Решение, которое найдет в этом случае функция fsolve будет определяться начальным значением откуда она начнет итерационную процедуру поиска решения. Например:
fsolve('x*x-abs(x)',-2), ans = -1.0000;
fsolve('x*x-abs(x)',0.6), ans = 1.0000;
fsolve('x*x-abs(x)',0.4), ans = 7.9062e-008.
Функция fsolve продолжает итерационную процедуру до тех пор пока она не найдет решение с заданной точностью. По этому в нашем примере мы и получили 7.9062e-008 а не 0.
В случае более сложных функций их удобнее представить в виде M файла. Тогда в качестве первого параметра функции fsolve подставляется в одинарных кавычках имя этого файла.
М-файлы
M-file
Работа из командной строки MatLab затрудняется, если требуется вводить много команд и часто их изменять. Ведение дневника при помощи команды diary и сохранение рабочей среды незначительно облегчают работу. Самым удобным способом выполнения групп команд MatLab является использование М-файлов, в которых можно набирать команды, выполнять их все сразу или частями, сохранять в файле и использовать в дальнейшем. Для работы с М-файлами предназначен редактор М-файлов. С его помощью можно создавать собственные функции и вызывать их, в том числе и из командного окна.
Раскройте меню File основного окна MatLab и в пункте New выберите подпункт M-file. Новый файл открывается в окне редактора M-файлов, которое изображено на рисунке.
М-файлы в MatLab бывают двух типов: файл-программы (Script M-Files), содержащие последовательность команд, и файл-функции, (Function M-Files), в которых описываются функции, определяемые пользователем.
Файл-программа
Наберите в редакторе команды, приводящие к построению двух графиков на одном графическом окне
Сохраните теперь файл с именем mydemo.m в подкаталоге work основного каталога MatLab, выбрав пункт Save as меню File редактора. Для запуска на выполнение всех команд, содержащихся в файле, следует выбрать пункт Run в меню Debug. На экране появится графическое окно Figure 1, содержащее графики функций.
Очень удобной возможностью, предоставляемой редактором М-файлов, является выполнение части команд. Закройте графическое окно Figure 1. Выделите при помощи мыши, удерживая левую кнопку, или клавишами со стрелками при нажатой клавише Shift, первые четыре команды и выполните их из пункта Text. Обратите внимание, что в графическое окно вывелся только один график, соответствующий выполненным: командам. Запомните, что для выполнения части команд их следует выделить и нажать клавишу F9.
Отдельные блоки М-файла можно снабжать комментариями, которые пропускаются при выполнении, но удобны при работе с М-файлом. Комментарии начинаются со знака процента и автоматически выделяются зеленым цветом, например:
Открытие существующего М-файла производится при помощи пункта Open меню File рабочей среды, либо редактора М-файлов.
Файл-функция
М-функции являются 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 - ключевое слово, определяющее М-функцию;
2. y - выходной аргумент;
3. average - имя функции;
4. x - входной аргумент.
Каждая функция в системе MATLAB содержит строку определения функции, подобную приведенной.
Если функция имеет более одного выходного аргумента, список выходных аргументов помещается в квадратные скобки. Входные аргументы, если они присутствуют, помещаются в круглые скобки. Для отде