Раздел: Документация
0 ... 78 79 80 81 82 83 84 ... 365 командном строки. Каждое обращение к подфункции f в основной функции приводит к перекоду к размещенным в подфункции операторам и последующему возврату в основную функцию. Файл-функция может содержать одну или несколько подфункций со своими входными и выходными параметрами, но основная функция может быть только одна. Заголовок новой подфункции одновременно является признаком конца предыдущей. Основная функция обменивается информацией с подфункциями только при помощи входных и выходных параметров. Переменные, определенные в подфункциях и в основной функции, являются локальными, они доступны в пределах своей функции. Листинг 5.10 содержит пример файл-функции с подфункцией, приводящий к ошибке! I Листинг 5.10. Недопустимое использование локальных параметров function simplel; ALP = 5.3; BET = 9.1; fl = fd.l, 2.1) function z = f(x, y) z = x"3 - 2*ул3 + 3*(хл2 + ул2) - x*y + 9 + ALP*BET; Попытка выполнить функцию simplel приведет к выводу сообщений о том, что переменная ALP (она первой встретилась при интерпретации оператора) не определена: » simplel ??? Undefined function or variable ALP. Error in ==> simplel > f at 6 z = хл3 - 2*y"3 + 3*(хл2 + ул2) - x*y + 9 + ALP*BET; Error in ==> simplel at 4 fl = fll.l, 2.1) Одни из возможных вариантов использования переменных, которые являются общими для все\ функций М-файла, состоит в объявлении данных переменных в начале основной функции и подфункции как глобальных, при помощи global со списком имен переменных, разделяемых пробелом (листинг 5.11). j Листинг 5.11. Объявление глобальных переменных function simple2; global ALP BET ALP = 5.3; BET = 9.1; fl = f(l.l. 2.1) function z = f(x, y) global ALP BET z = хл3 - 2*ул3 + 3*(хл2 + yA2) - х*у + 9 + ALP*BET; Следует иметь в виду, что лучшим способом обмена переменными между основной функцией и подфункциями является передача их в параметрах подфункции. Значение глобальных переменных может быть случайно изменено в рабочей среде или при вызове другой файл-программы или файл-функции, которая обращается к одноименным глобальным переменным. Отметим особенности работы с подфункциями, которые часто приводят к ошибкам. Источником ошибок часто является неверное указание подфункции в качестве входного аргумента таких функций MATLAB, как fpiot, fzero, fminsearch, Quad и других, вызываемых внутри основной функции. Обязательно использование ссылки на подфункцию, а не ее имени, иначе MATLAB игнорирует подфункцию и начинает искать файл-функцию в текущем каталоге и в путях поиска. Листинг 5.12 содержит простой пример основной функции mainfun с подфункцией subfun, демонстрирующий недопустимость задания имени подфункции в первом входном аргументе fplot. ...... . . ... Листинг 5.12. Правильный и неправильный вызов fplot в основной функции function mainfun % основная функция figure % создание графического окна subplot(2, 1, 1) % создание верхней пары осей fplot(@subfun, [1 5]) % правильный вызов fplot с указателем на подфункцию subplot(2, 1, 2) % создание нижней пары осей fplot(1subfun, [1 5]) % неправильный вызов fplot с именем подфункции function у = subfun(х) % подфункция у = sin[pi*x); В результате вызова » mainfun создается графическое окно с двумя парами осей, причем только верхний график, полученный при вызове fplot с указателем на подфункцию, являет- ся верным. Если в текущей папке и путях поиска нет файл-функции subf un, то нижний график содержит прямую линию. Так всегда работает fplot, когда MATLAB не может найти М-файл с файл-функцией для построения графика. Заметьте, что при наличии в текущей папке файл-функции subfun в М-файле fplot будет пытаться построить ее график. Подфункция доступна только внутри основной функции. Если вы решите вызвать подфункцию f не из файл-функции simple (см. листинг 5.11), а из другой файл-функции, файл-программы или просто из командной строки, то получите сообщение об ошибке: » fd, 1) ??? Undefined command/function £. Разумеется, если в текущем каталоге (или путях поиска MATLAB) находится файл-функция f, хранящаяся в файле f.m, или в рабочей среде объявлена переменная f, то ошибки может и не быть, или она будет другого характера. Если доступны различные одноименные функции (приватные, подфункции, встроенные, пользовательские из текущего каталога, функции из Toolbox), то приоритет связывания имени и объекта следующий. 1.Ищется имя в текущей рабочей среде: могут быть определены либо переменная с таким именем, либо вложенная функция (см. далее в этой главе), либо анонимная функция или inline-функция, которые рассматриваются в следующей главе. 2.Ищется подфункция в текущем М-файле. 3.Ищется приватная функция (см. следующий раздел J. 4.Ищется встроенная функция (built-in function). 5.Далее производится поиск требуемой файл-функции в текущем каталоге и путях поиска MATLAB. Таким образом, пользовательские функции имеют приоритет за исключением случая файл-функции из текущего каталога по отношению к встроенной. Как узнать, является ли функция MATLAB встроенной или нет? Для этой цели служит специальная функция exist, о которой шла речь в главе 1. Возвращаемые значения в случае, если аргумент функция, таковы: 1 — имя занято под переменную рабочей среды, 2 — функция расположена в путях поиска файлов, 5 — встроенная функция (built-in function). Приватные функции и подфункции не идентифицируются. Сравните, например max и bar: » exist max ans = 0 ... 78 79 80 81 82 83 84 ... 365
|