Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МетодичкаИПлб.doc
Скачиваний:
38
Добавлен:
08.05.2019
Размер:
6.96 Mб
Скачать

3. Обращение к m-функции

Вызов созданной пользователем функции осуществляется из командного окна системы Matlab, из текста какой-либо другой функции или скрипта по правилам, очень похожим на правила составления заголовка функции: в квадратных скобках указывается список выходных фактических параметров (результаты работы функции, возвращаемые по месту ее вызова), знак операции присваивания "=", за которым записывается имя функции, после которого в круглых скобках через запятую перечисляются фактические входные параметры, со значениями которых и будут произведены действия при выполнении функции.

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

>> vect=0:pi/3:pi

vect =

0 1.0472 2.0944 3.1416

>> ss1=summa_sin2(vect)

ss1 =

1.5

или

>> ss2=summa_sin2(0:pi/3:pi)

ss2 =

1.5

или

>> ss3=summa_sin2([0 pi/3 2*pi/3 pi])

ss3 =

1.5

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

Следует помнить, что в Matlab фактические параметры передаются в m-функцию по значению. Таким образом, если фактический параметр задан именем переменной, то в функции реальные действия будут выполняться над копией этой переменной (а не над ней самой). В вызывающей программной единице (в скрипте или в другой функции) значение такого фактического параметра не меняется.

Выходные фактические параметры должны быть заданы именами переменных. Если выходной параметр один, то квадратные скобки при вызове функции можно опустить (см. пример выше). При одном выходном параметре обращение к внешней функции пользователя имеет короткий формат – такой же, как обращение к стандартной функции и допускается использование внешней функции непосредственно в выражениях. Так, например, функцию summa_sin2 можно использовать как фактический параметр стандартной функции sqrt (вычисляется корень квадратный из суммы квадратов синусов аргумента vect)

>> y=sqrt(summa_sin2(vect))

y =

1.2247

Входным аргументом функции summa_sin2 может быть и матрица

>> a=[-pi:pi/3:0;0:pi/3:pi]

a =

-3.1416 -2.0944 -1.0472 0

0 1.0472 2.0944 3.1416

>> ssm=summa_sin2(a)

ssm =

0.0000 1.5000 1.5000 0.0000

и скаляр

>> sss=summa_sin2(pi/6)

sss =

0.2500

В первом случае для каждого элемента матрицы а было вычислено значение синуса, которое затем было возведено в квадрат. Для полученной таким образом матрицы была применена стандартная функция sum вычисления суммы и получен вектор(!) из сумм ее элементов по столбцам. Во втором случае в качестве фактического параметра использовалось значение, соответствующее , и было вычислено значение . Таким образом, переменная, в которую записывается результат, автоматически приобретает необходимые размеры. Она в общем случае может быть и матрицей, и вектором, и скаляром. Ведь для Matlab любое значение – матрица! Дело только в конкретных ее размерах.

Имена параметров, указанные в заголовке функции, могут быть любыми (могут совпадать или не совпадать с именами фактических параметров, используемых при вызове функции), т.е. имеют формальный характер. Главное, чтобы в пределах функции они были оригинальными (не повторялись). При вызове функции важно, чтобы структура обращения полностью соответствовала структуре заголовка функции в записи текста m-файла и чтобы фактические параметры имели размер и тип, согласованные с размером и типом формальных параметров.

Примечание: допускается использование одного и того же формального параметра и в списке входных и в списке выходных параметров функции. В этом случае будет иметь место так называемый модифицируемый формальный параметр, и пересылка данных в/из функции будет выполнена по типу "параметр-переменная". В результате при обращении к функции фактический параметр будет иметь одно значение, а по окончании ее работы – возможно, другое! Таким образом, функция может изменять значение фактического параметра. В общем случае использование модифицируемых параметров является не желательным, это – дурной тон в программировании. Хотя, конечно же, есть задачи, требующие модификации исходных данных.

В инженерной практике файлы-функции чаще всего пишутся для того, чтобы быть использованными в качестве входного аргумента другой функции. В частности, Matlab обладает огромнейшей библиотекой функций, реализующих численные методы. Применение этих функций для решения инженерных задач подразумевает использование функций пользователя в качестве входных аргументов. Например, при решении задачи Коши для системы дифференциальных уравнений необходимо составить файл-функцию, описывающую правую часть системы. Технологию решения вычислительных задач рассмотрим позже. Сейчас – простой пример того, как использование файл-функций упрощает визуализацию математических функций. Ранее мы рассмотрели использование встроенной функции plot для построения графиков функций, заданных таблицей значений (работа 4ИП). Проблема применения plot заключается в том, что пользователь сам должен задать множество значений х для вычисления . И если шаг табулирования задан неудачно, изображение функции будет искажено до неузнаваемости (см. рис. 4.4). Комфортней использовать другой инструмент отображения графика функции , заданной аналитически, – стандартную функцию fplot, которая строит график на заданном интервале с автоматическим выбором шага. В простейшем случае формат обращения к fplot может быть следующим:

fplot('имя_функции',[d1 d2])

Здесь 'имя_функции' – имя файл-функции с описанием формулы вычисления , заключенное в апострофы; d1 d2 – границы отрезка для построения графика (в виде вектора из двух элементов). Построим график функции , с которым у нас была масса проблем в предыдущей работе. Создадим m-файл с описанием исследуемой функции

function y=graf(x)

y=exp(-x).*(sin(x)+0.1*sin(100*pi*x));

и сохраним его в файле graf.m. В командной строке Matlab (или в скрипте) зададим следующую последовательность команд:

>> fplot('graf',[0 0.2]), grid

>> title('y=e^-^x(sin(x)+0,1sin(100pi*x)')

>> xlabel('x'), ylabel('f(x)')

Примечание: обратите внимание, как в title записана текстовая константа. Чтобы в графическом окне видеть e-x, знак минус и х каждый записаны после символа ^ (крышка). При выводе на экран символы -x будут размещены как показатель степени при е (см. рис. 5.2).

При использовании fplot нет необходимости генерировать массив значений аргумента х, достаточно только указать интервал его изменения. Так же нет необходимости в предварительном вычислении значений функции . Функция fplot сама учитывает поведение прорисовываемой кривой за счет адаптивного выбора шага, что позволяет получить графики, достаточно точно отображающие поведение (рис. 5.2).

Рис. 5.2. График функции , построенный fplot

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

>> fplot('graf', [0 0.2], 1e-5), grid

Переменное число параметров функций является характерным для Matlab. Это не частная особенность fplot. Это общая тенденция. Можно создавать функции, которые сами подстраиваются под требуемое число входных и/или выходных параметров.

Можно задать и четвертый входной параметр функции fplot – значение n минимального числа разбиений исходного интервала. Причем n должно быть больше либо равно единице (по умолчанию ). Реально вектор значений аргумента х содержит более чем n + 1 элемент за счет того, что fplot проводит вычисления так, чтобы на каждом шаге приращение угла наклона графика не превышало 10°. Пятый параметр LineSpec (см. работу 4ИП) предназначен для задания свойств рисуемого графика (тип линии, цвет линии и тип маркера). Таким образом, к fplot можно обратиться, указав от двух до пяти входных параметров. Поскольку погрешность может быть только меньше единицы, минимальное число разбиений больше единицы, а LineSpec не является числом, то функция fplot допускает произвольное следование этих трех параметров в списке входных аргументов. Но обязательно они должны быть размещены с третьего по пятое место. В самом общем случае вызов fplot может содержать еще больше входных параметров

fplot('graf',interval,LineSpec,tol,n,p1,p2,…)

Рассмотрим назначение входных аргументов, которые указываются, начиная с шестой позиции списка входных параметров. Пусть нам требуется построить графики функции для нескольких значений амплитуд А и B синусоид, входящих в . Например, , , , и , . Разумеется можно написать три функции вычисления , в каждой указав необходимые значения А и В. Или можно перед каждым построением вносить изменения в текст одной и той же функции, последовательно заменяя одни значения А и В другими. Но гораздо эффективнее написать функцию с тремя входными параметрами, первый из которых – независимая переменная х, а остальные – параметры А и В функции

function y=graf_param(x,A,B)

y=exp(-x).*(A*sin(x)+B*sin(100*pi*x));

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

>> hold on

>> fplot('graf_param',[0 0.2],[],[],'b-',1,0.1)

>> fplot('graf_param',[0 0.2],[],[],'r--',5,0.5)

>> fplot('graf_param',[0 0.2],[],[],'k-.',10,1)

>> legend('A=1, B=0,1','A=5,B=0,5','A=10,B=1')

>> title('y=e^-^x(A*sin(x)+B*sin(100pi*x)')

>> grid

>> hold off

В этом примере для всех трех графиков параметры tol и n специально не устанавливаются (заданы как [] – пустой массив), определяются только типы и цвета линий графиков. Результат представлен на рис. 5.3.

Рис. 5.3. Графики функции

для различных значений параметров А и В

Возможность работы с функциями, зависящими от параметров, предусмотрена не только в fplot. Практически все функции Matlab, реализующие решение вычислительных задач, допускают наличие параметров.

Помимо входных параметров функция fplot может иметь и выходные параметры.

>> [x,y]=fplot('graf',[0 0.2]);

При указании выходных параметров, в вектор-столбец х заносятся значения независимой переменной, в y – соответствующие значения функции. Сам график при этом не строится. Первые пять строк полученной таким образом таблицы приведены ниже (всего в таблице 483 строки).

>> disp([x(1:5) y(1:5)])

0 0

0.0004 0.0129

0.0008 0.0256

0.0012 0.0380

0.0016 0.0497

Такой подход к использованию функций также является характерным для Matlab: многие стандартные функции при отсутствии выходных параметров представляют результат в графическом виде.