Учебное пособие для студентов высших учебных заведений
Скачать 5.41 Mb.
|
Вычисление интеграла методом квадратур осуществляется процедурой [ I, cnt ] = quad(‘<имя функции>’, a,b). Здесь a и b - нижняя и верхняя граница изменения аргумента функции; I - полученное значение интеграла; cnt - количество обращений к вычислению функ- ции, представленной М-файлом с названием, указанным в <имя функции>. Функция quad использует квадратурные формулы Ньютона-Котеса четвертого порядка. Аналогичная процедура quad8 использует более точные формулы 8-го по- рядка. 2.1. Функции функций 94 Интегрирование обыкновенных дифференциальных уравнений осуществ- ляют функции ode23 и ode45. Они могут применяться как для численного реше- ния (интегрирования) простых дифференциальных уравнений, так и для модели- рования сложных динамических систем, т. е. систем, поведение которых можно описать совокупностью обыкновенных дифференциальных уравнений. Известно, что любая система обыкновенных дифференциальных уравнений (ОДУ) может быть представлена как система уравнений 1-го порядка в форме Коши: d dt t y f y = ( , ) , где 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-го порядка контролирует относитель- ные и абсолютные погрешности интегрирования на каждом шаге и изменяет ве- личину шага интегрирования так, чтобы обеспечить заданные границы погрешно- стей интегрирования. 2.1. Функции функций 95 Для функции ode45 основным методом интегрирования является метод Рун- ге-Кутта 4-го порядка, а величина шага контролируется методом 5-го порядка. Вычисление минимумов и корней функции осуществляется такими функ- циями MatLAB: fmin - отыскание минимума функции одного аргумента; fmins - отыскание минимума функции нескольких аргументов; fzero - отыскание нулей (корней) функции одного аргумента. Обращение к первой из них в общем случае имеет такой вид: Xmin = fmin (‘<имя функции>’, X1, X2). Результатом этого обращения будет значение Xmin аргумента функции, ко- торое отвечает локальному минимуму в интервале X1 В качестве примера рассмотрим отыскание значения числа π как значения локального минимума функции 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), где <интервал> - это вектор-строка из двух чисел, которые задают, соответст- венно, нижнюю и верхнюю границы изменения аргумента; <имя функции> - имя М-файла с текстом процедуры вычисления значения желаемой функции по 2.2. Создание М-файлов 96 заданному значению ее аргумента; n - желательное число частей разбиения ука- занного интервала. Если последнюю величину не задать, по умолчанию интервал разбивается на 25 частей. Несмотря на то, что количество частей "n" задано, число значений вектора "х" может быть значительно большим за счет того, что функция fplot проводит вычисления с дополнительным ограничением, чтобы приращение угла наклона графика функции на каждом шаге не превышало 10 градусов. Если же оно оказалось большим, осуществляется дробление шага изменения аргумента, но не больее чем в 20 раз. Последние два числа (10 и 20) могут быть изменены пользователем, для этого при обращении следует добавить эти новые значения в заголовок процедуры в указанном порядке. Если обратиться к этойпроцедуре так: [x, Y] = fplot (‘<имя функции>’, [<интервал>], n), то график указанной функции не отображается на экране (в графическом окне). Вместо этого вычисляется вектор "х" аргументов и вектор (или матрица) Y соот- ветствующих значений указанной функции. Чтобы при обращении последнего вида построить график, необходимо сделать это в дальнейшем с помощью про- цедуры plot(x, Y). 2.2. Создание М-файлов 2.2.1. Особенности создания М-файлов Создание программы в среде MatLAB осуществляется с помощью либо соб- ственного встроенного (начиная из версии MatLAB 5), либо стороннего текстово- го редактора, который автоматически вызовется, если его предварительно устано- вить с помощью команды Preferences меню File командного окна MatLAB. На- пример, это может быть редактор Notepade среды Windows. Окно предварительно установленного редактора появляется на экране, если перед этим вызвана команда M-file из меню New или выбрано название одного из существующих М-файлов при вызове команды Open M-file из меню File командного окна. В первом случае окно текстового редактора будет пустым, во втором - в нем будет содержаться текст вызванного М-файла. В обоих случаях окно текстового редактора готово для ввода нового текста или корректировки существующего. Программы на языке MatLAB имеют две разновидности - так называемые Script-файлы (файлы-сценарии, или управляющие программы) и файлы-функции (процедуры). Обе разновидности должны иметь расширение имени файла .m, т. е. их нельзя различить по типу файла. С помощью Script-файлов оформляют основ- ные программы, управляющие от начала до конца организацией всего вычисли- тельного процесса, и отдельные части основных программ (они могут быть запи- саны в виде отдельных Script-файлов). Как файл-функции оформляются отдель- ные процедуры и функции (т. е. такие части программы, которые рассчитаны на неоднократное использование Script-файлами или другими процедурами при из- мененных значениях исходных параметров и не могут быть выполнены без пред- варительного задания значений переменных, которые называют входными). 2.2. Создание М-файлов 97 Главным внешним отличием текстов этих двух видов файлов является то, что файл-функции имеют первую строку вида function <ПКВ> = <имя процедуры >(<ПВВ>), где обозначен ПКВ - Перечень Конечных Величин, ПВВ - Перечень Входных Ве- личин. Script-файлы такой строки не имеют. Принципиальное же отличие состоит в совсем различном восприятии сис- темой имен переменных в этих двух видах файлов. В файл-функциях все имена переменных внутри файла, а также имена пере- менных, указанные в заголовке (ПКВ и ПВВ), воспринимаются как локальные, т.е. все значения этих переменных после завершения работы процедуры исчезают, и область оперативной памяти ПК, которая была отведена под запись значений этих переменных, освобождается для записи в нее значений других переменных. В Script-файлах все используемые переменные образуют так называемое рабочее пространство (Work Space). Значение и содержание их сохраняются не только на протяжении времени работы программы, но и на протяжении всего се- анса работы с системой, а, значит, и при переходе от выполнения одного Script- файла к другому. Иначе говоря, рабочее пространство является единым для всех Script-файлов, вызываемых в текущем сеансе работы с системой. Благодаря этому любой длинный Script-файл можно разбить на несколько фрагментов, оформить каждый из них в виде отдельного Script-файла, а в главном Script-файле вместо соответствующего фрагмента записать оператор вызова Script-файла, представ- ляющего этот фрагмент. Этим обеспечивается компактное и наглядное представ- ление даже довольно сложной программы. За исключением указанных отличий, файл-функции и Script-файлы оформ- ляются одинаково. 2.2.2. Основные особенности оформления М-файлов В дальнейшем под М-файлом будем понимать любой файл (файл-функцию или Script-файл), записанный на языке системы MatLAB. Рассмотрим основные особенности записи текста программы (М-файла) языком MatLAB. 1. Обычно каждый оператор записывается в отдельной строке текста про- граммы. Признаком конца оператора является символ (он не появляется в окне) возврата каретки и перехода на следующую строку, который вводится в програм- му при нажатии клавиши 2. Можно размещать несколько операторов в одной строке. Тогда предыду- щий оператор этой строки должен заканчиваться символом ' ; ' или ' , '. 3. Можно длинный оператор записывать в несколько строк. При этом пре- дыдущая строка оператора должна заканчиваться тремя точками (' ... '). 4. Если очередной оператор не заканчивается символом ' ; ', результат его действия при выполнении программы будет выведен в командное окно. Чтобы предотвратить вывод на экран результатов действия оператора программы, запись этого оператора в тексте программы должна заканчиваться символом ' ; '. 2.2. Создание М-файлов 98 5. Строка программы, начинающаяся с символа ' % ', не выполняется. Эта строка воспринимается системой MatLAB как комментарий. Таким образом, для ввода комментария в любое место текста программы достаточно начать соответ- ствующую строку с символа ' % '. 6. Строки комментария, предшествующие первому выполняемому операто- ру программы, т. е. такому, который не является комментарием, воспринимаются системой MatLAB как описание программы. Именно эти строки выводятся в ко- мандное окно, если в нем набрана команда help <имя файла> 7. В программах на языке MatLAB отсутствует символ окончания текста программы. 8. В языке MatLAB переменные не описываются и не объявляются. Любое новое имя, появляющееся в тексте программы при ее выполнении, воспринимает- ся системой MatLAB как имя матрицы. Размер этой матрицы устанавливается при предварительном вводе значений ее элементов либо определяется действиями по установлению значений ее элементов, описанными в предшествующих операто- рах или процедуре. Эта особенность делает язык MatLAB очень простым в упот- реблении и привлекательным. В языке МatLAB невозможно использование мат- рицы или переменной, в которой предварительно не введены или не вычислены значения ее элементов (а значит - и не определены размеры этой матрицы). В этом случае при выполнении программы MatLAB появится сообщение об ошибке - "Переменная не определена". 9. Имена переменных могут содержать лишь буквы латинского алфавита или цифры и должны начинаться из буквы. Общее число символов в имени может достигать 30. В именах переменных могут использоваться как прописные, так и строчные буквы. Особенностью языка MatLAB есть то, что строчные и пропис- ные буквы в именах различаются системой. Например, символы "а" и "А" могут использоваться в одной программе для обозначения разных величин. 2.3. Создание файл-функций 99 2.3. Создание простейших файл-функций (процедур) 2.3.1. Общие требования к построению Как было отмечено ранее, файл-функция (процедура) должна начинаться со строки заголовка function [<ПКВ>] = <имя процедуры>(<ПВВ>). Если перечень конечных (выходных) величин (ПКВ) содержит только один объект (в общем случае - матрицу), то файл-функция представляет собой обыч- ную функцию (одной или нескольких переменных). Фактически даже в этом про- стейшем случае файл-функция является уже процедурой в обычном смысле дру- гих языков программирования, если выходная величина является вектором или матрицей. Первая строка в этом случае имеет вид: function <имя переменной> = <имя процедуры>(<ПВВ>). Если же в результате выполнения файл-функции должны быть определены (вычислены) несколько объектов (матриц), такая файл-функция представляет со- бой уже более сложный объект, который в программировании обычно называется процедурой (в языке Паскаль), или подпрограммой. Общий вид первой строки в этом случае становится таким: function [y1, y2, ... , y] = <имя процедуры>(<ПВВ>), т. е. перечень выходных величин y1, y2, ... , y должен быть представлен как век- тор-строка с элементами y1, y2, ... , y (все они могут быть матрицами). В простейшем случае функции одной переменной заголовок приобретет вид: function y = func(x), где func - имя функции (М-файла). В качестве примера рассмотрим составление М-файла для функции y f x d ctg x x x = = ⋅ ⋅ − 1 3 4 ( ) ( ) sin ( ) cos ( ) 4 . Для этого следует активизировать меню File командного окна MatLAB и выбрать в нем сначала команду New, а затем команду M-file. На экране появится окно текстового редактора. В нем нужно набрать такой текст: function y = F1(x,d) % Процедура, которая вычисляет значение функции % y = (d3)*ctg(x)*sqrt(sin(x)4-cos(x)4). % Обращение y = F1(x,d). y = (d^3)*cot(x). *sqrt(sin(x). ^4-cos(x). ^4); После этого необходимо сохранить этот текст в файле под именем F1.m. Необходимый М-файл создан. Теперь можно пользоваться этой функцией при расчетах. Так, если ввести команду » y = F1(1, 0.1) то получим результат y = 4. 1421e-004. Следует заметить, что аналогично можно получить сразу вектор всех зна- чений указанной функции при разных значениях аргумента, если последние со- брать в некоторый вектор. Так, если сформировать вектор 2.3. Создание файл-функций 100 » zet= 0:0. 3:1. 8; и обратиться в ту же процедуру » my = F1(zet,1), то получим: Warning: Divide by zero my = Columns 1 through 4 Na + Infi 0 + 2. 9369i 0 + 0. 8799i 0. 3783 Columns 5 through 7 0. 3339 0. 0706 -0. 2209 Примечания. 1. Возможность использования сформированной процедуры как для от- дельных чисел, так и для векторов и матриц обусловлена применением в записи соответствующего М-файла вместо обычных знаков арифметических действий их аналогов с предшествующей точкой. 2. Во избежание вывода на экран нежелательных промежуточных результа- тов, необходимо в тексте процедуры все вычислительные операторы завершать символом " ; ". 3. Как показывают приведенные примеры, имена переменных, указанные в заголовке файл-функции могут быть любыми (совпадать или нет с именами, ис- пользуемыми при обращении к этой файл-функции), т. е. носят формальный ха- рактер. Важно, чтобы структура обращения полностью соответствовала структу- ре заголовка в записи текста М-файла и чтобы переменные в этом обращении имели тот же тип и размер, как и в заголовке М-файла. Чтобы получить информацию о созданной процедуре, достаточно набрать в командном окне команду: |