Особенности создания М-файлов
Задание № 3
Тема: Программирование в среде MatLAB.
Цель занятия: научиться создавать М-файлы, простейшие файл-функции (процедуры).
1. Теоретическая часть
Работа в режиме калькулятора в среде MatLAB, несмотря на довольно значительные возможности, во многих отношениях неудобна. Невозможно повторить предшествующие вычисления и действия при новых значениях исходных данных без повторного набора предшествующих операторов. Нельзя возвратиться назад и повторить некоторые действия, или по некоторому условию перейти к выполнению другой последовательности операторов. И вообще, если количество операторов значительно, становится проблемой отладить правильную их работу из-за неминуемых ошибок при наборе команд. Поэтому сложные, с прерываниями, сложными переходами по определенным условиям, с часто повторяемыми однотипными действиями вычисления, которые, вдобавок, необходимо проводить неоднократно при измененных исходных данных, требуют их специального оформления в виде записанных на диске файлов, т. е. в виде программ. Преимущество программ в том, что, так как они зафиксированы в виде записанных файлов, становится возможным многократное обращение к одним и тем же операторам и к программе в целом. Это позволяет упростить процесс отладки программы, сделать процесс вычислений более наглядным и прозрачным, а благодаря этому резко уменьшить возможность появления ошибок при разработке программ. Кроме того, в программах возникает возможность автоматизировать также и процесс изменения значений первоначальных параметров в диалоговом режиме.
Функции функций
Некоторые важные универсальные процедуры в MatLAB используют в качестве переменного параметра имя функции, с которой они оперируют, и поэтому требуют при обращении к ним указания имени М-файла, в котором записан текст некоторой другой процедуры (функции). Такие процедуры называют функциями функций.
Чтобы воспользоваться такой функцией от функции, необходимо, чтобы пользователь предварительно создал М-файл, в котором вычислялось бы значение нужной функции по известному значению ее аргумента.
Перечислим некоторые из стандартных функций от функций, предусмотренных в MatLAB.
Вычисление интеграла методом квадратур осуществляется процедурой
[ I, cnt ] = quad(‘<имя функции>’, a,b).
Здесь a и b - нижняя и верхняя граница изменения аргумента функции; I - полученное значение интеграла; cnt - количество обращений к вычислению функции, представленной М-файлом с названием, указанным в <имя функции>.
Функция quad использует квадратурные формулы Ньютона-Котеса четвертого порядка.
Аналогичная процедура quad8 использует более точные формулы 8-го порядка.
Интегрирование обыкновенных дифференциальных уравнений осуществляют функции ode23 и ode45. Они могут применяться как для численного решения (интегрирования) простых дифференциальных уравнений, так и для моделирования сложных динамических систем, т. е. систем, поведение которых можно описать совокупностью обыкновенных дифференциальных уравнений.
Известно, что любая система обыкновенных дифференциальных уравнений (ОДУ) может быть представлена как система уравнений 1-го порядка в форме Коши:
где y - вектор переменных состояния (фазовых переменных системы); t – аргумент (обычно - время); f - нелинейная вектор-функция переменных состояния y и аргумента t.
Обращение к процедурам численного интегрирования ОДУ имеет вид:
[t, y] = ode23 (‘<имя функции>’, tspan, y0, options)
[t, y] = ode45 (‘<имя функции>’, tspan, y0, options),
где используемые параметры имеют такой смысл: <имя функции> - строка символов, представляющая собой имя М-файла, в котором вычисляется вектор-функция f(y,t), т. е. правые части системы ОДУ; y0 - вектор начальных значений переменных состояния; t - массив рассчитанных значений аргумента, отвечающих шагам интегрирования; y - матрица проинтегрированных значений фазовых переменных, в которой каждый столбец соотвествует одной из переменных состояния, а строка содержит значения переменных состояния, отвечающие соответствующему шагу интегрирования; tspan - вектор-строка [t0 tfinal], содержащая два значения: t0 - начальное и tfinal - конечное значение аргумента; ortions - строка из параметров, которые определяют значения допустимой относительной и абсолютной погрешности интегрирования.
Параметр ortions можно не указывать. Тогда, по умолчанию, допустимая относительная погрешность интегрирования принимается равной 1⋅10−3, абсолютная (по любой из переменных состояния) - 1⋅10−6 . Если же эти значения не устраивают пользователя, нужно перед обращением к процедуре численного интегрирования установить новые значения допустимых погрешностей с помощью процедуры odeset таким образом:
options = odeset ('RelTol',1e-4,'AbsTol',[1e-4 1e-4 1e-5]).
Параметр RelTol определяет относительную погрешность численного интегрирования по всем фазовым переменным одновременно, а AbsTol является вектором-строкой, состоящим из абсолютных допустимых погрешностей численного интегрирования по каждой из фазовых переменных.
Функция ode23 осуществляет интегрирование численным методом Рунге-Кутта 2-го порядка, а с помощью метода 3-го порядка контролирует относительные и абсолютные погрешности интегрирования на каждом шаге и изменяет величину шага интегрирования так, чтобы обеспечить заданные границы погрешностей интегрирования.
Для функции ode45 основным методом интегрирования является метод Рунге-Кутта 4-го порядка, а величина шага контролируется методом 5-го порядка.
Вычисление минимумов и корней функции осуществляется такими функциями MatLAB:
fmin - отыскание минимума функции одного аргумента;
fmins - отыскание минимума функции нескольких аргументов;
fzero - отыскание нулей (корней) функции одного аргумента.
Обращение к первой из них в общем случае имеет такой вид:
Xmin = fmin (‘<имя функции>’, X1, X2).
Результатом этого обращения будет значение Xmin аргумента функции, которое отвечает локальному минимуму в интервале X1<X<X2 функции, заданной М-файлом с указанным именем.
В качестве примера рассмотрим отыскание значения числа π как значения локального минимума функции y = cos(x) на отрезке [3, 4]:
» Xmin = fmin('cos',3,4)
Xmin = 3. 1416e+000
Обращение ко второй процедуре должно иметь форму:
Xmin = fmins (‘<имя функции>’, X0),
при этом Х является вектором аргументов, а Х0 означает начальное (исходное) значение этого вектора, в окрестности которого отыскивается ближайший локальный минимум функции, заданной М-файлом с указанным именем. Функция fmins находит вектор аргументов Хmin, отвечающий найденному локальному минимуму.
Обращение к функции fzero должно иметь вид:
z = fzero (‘<имя функции>’, x0, tol, trace).
Здесь обозначен: x0 - начальное значение аргумента, в окрестности которого отыскивается действительный корень функции, значение которой вычисляется в М-файле с заданным именем; tol - заданная относительная погрешность вычисления корня; trace - знак необходимости выводить на экран промежуточные результаты; z - значение искомого корня.
Построение графиков функции одной переменной может быть осуществлена с помощью процедуры fplot. Отличие ее от процедуры plot в том, что для построения графика функции нет необходимости в предшествующем вычислении значений функции и аргумента. Обращение к ней имеет вид:
fplot (‘<имя функции>’, [<интервал>], n), где <интервал> - это вектор-строка из двух чисел, которые задают, соответственно, нижнюю и верхнюю границы изменения аргумента; <имя функции> - имя М-файла с текстом процедуры вычисления значения желаемой функции по заданному значению ее аргумента; n - желательное число частей разбиения указанного интервала. Если последнюю величину не задать, по умолчанию интервал разбивается на 25 частей. Несмотря на то, что количество частей "n" задано, число значений вектора "х" может быть значительно большим за счет того, что функция fplot проводит вычисления с дополнительным ограничением, чтобы приращение угла наклона графика функции на каждом шаге не превышало 10 градусов. Если же оно оказалось большим, осуществляется дробление шага изменения аргумента, но не более чем в 20 раз. Последние два числа (10 и 20) могут быть изменены пользователем, для этого при обращении следует добавить эти новые значения в заголовок процедуры в указанном порядке.
Если обратиться к этойпроцедуре так:
[x, Y] = fplot (‘<имя функции>’, [<интервал>], n),
то график указанной функции не отображается на экране (в графическом окне).
Вместо этого вычисляется вектор "х" аргументов и вектор (или матрица) Y соответствующих значений указанной функции. Чтобы при обращении последнего вида построить график, необходимо сделать это в дальнейшем с помощью процедуры plot(x, Y).
Создание М-файлов
Особенности создания М-файлов
Создание программы в среде MatLAB осуществляется с помощью либо собственного встроенного, либо стороннего текстового редактора, который автоматически вызовется, если его предварительно установить с помощью команды Preferences меню File командного окна MatLAB. Например, это может быть редактор Notepade среды Windows. Окно предварительно установленного редактора появляется на экране, если перед этим вызвана команда M-file из меню New или выбрано название одного из существующих М-файлов при вызове команды Open M-file из меню File командного окна. В первом случае окно текстового редактора будет пустым, во втором - в нем будет содержаться текст вызванного М-файла. В обоих случаях окно текстового редактора готово для ввода нового текста или корректировки существующего.
Программы на языке MatLAB имеют две разновидности - так называемые Script-файлы (файлы-сценарии, или управляющие программы) и файлы-функции (процедуры). Обе разновидности должны иметь расширение имени файла .m, т. е. их нельзя различить по типу файла. С помощью Script-файлов оформляют основные программы, управляющие от начала до конца организацией всего вычислительного процесса, и отдельные части основных программ (они могут быть записаны в виде отдельных Script-файлов). Как файл-функции оформляются отдельные процедуры и функции (т. е. такие части программы, которые рассчитаны на неоднократное использование Script-файлами или другими процедурами при измененных значениях исходных параметров и не могут быть выполнены без предварительного задания значений переменных, которые называют входными).
Главным внешним отличием текстов этих двух видов файлов является то, что файл-функции имеют первую строку вида
function <ПКВ> = <имя процедуры >(<ПВВ>),
где обозначен ПКВ - Перечень Конечных Величин, ПВВ - Перечень Входных Величин. Script-файлы такой строки не имеют.
Принципиальное же отличие состоит в совсем различном восприятии системой имен переменных в этих двух видах файлов.
В файл-функциях все имена переменных внутри файла, а также имена переменных, указанные в заголовке (ПКВ и ПВВ), воспринимаются как локальные, т.е. все значения этих переменных после завершения работы процедуры исчезают, и область оперативной памяти ПК, которая была отведена под запись значений этих переменных, освобождается для записи в нее значений других переменных.
В Script-файлах все используемые переменные образуют так называемое рабочее пространство (Work Space). Значение и содержание их сохраняются не только на протяжении времени работы программы, но и на протяжении всего сеанса работы с системой, а, значит, и при переходе от выполнения одного Script-файла к другому. Иначе говоря, рабочее пространство является единым для всех Script-файлов, вызываемых в текущем сеансе работы с системой. Благодаря этому любой длинный Script-файл можно разбить на несколько фрагментов, оформить каждый из них в виде отдельного Script-файла, а в главном Script-файле вместо соответствующего фрагмента записать оператор вызова Script-файла, представляющего этот фрагмент. Этим обеспечивается компактное и наглядное представление даже довольно сложной программы.
За исключением указанных отличий, файл-функции и Script-файлы оформляются одинаково.