Обратите внимание на то, что такой файл нельзя запустить без предварительной подготовки, сводящейся к заданию значений переменным xmin и хmах, которые используются в теле файла. Это следствие первого свойства файлов-программ– они работают с данными из рабочей области. Переменные, используемые в файлах-программах, являются глобальными, т. е. они действуют одинаково в командах сессии и внутри программного блока, которым является файл-сценарий. Поэтому заданные в сессии значения переменных используются и в теле файла. Имена файлов-программ нельзя использовать в качестве параметров функций, поскольку файлы-программы не возвращают значений. Можно сказать, что файл-программа– это простейшая программа на языке программирования MatLab.
Результаты работы сессии Примера 3.4-1. приведены на рис. 3.4-1.
Рис. 3.4-1. Результат работы файла-программы Пример 3.4-1
m-функция является типичным объектом языка программирования системы MatLab. Одновременно он является полноценным модулем с точки зрения структурного программирования, поскольку содержит входные и выходные параметры и использует аппарат локальных переменных. Структура такого модуля с одним выходным параметром выглядит следующим образом:
имяm-файла |
function var=f_name(Cnиcoк_napaмeтpов) % Основной комментарий % Дополнительный комментарий Тело m-файла vаr=выражение |
m-функции имеют следующие особенности:
· он начинается с объявления function, после которого указывается имя переменной var - выходного параметра, имя самой функции и список ее входных параметров;
· функция возвращает свое значение и может использоваться в виде f _ name (список_параметров) в математических выражениях;
· все переменные, имеющиеся в теле файла-функции, являются локальными, т. е. действуют только в пределах тела функции;
· файл-функция является самостоятельным программным модулем, который общается с другими модулями через свои входные и выходные параметры;
· правила вывода комментариев те же, что у файлов-программ;
· файл-функция служит средством расширения системы MatLab;
· при обнаружении файла-функции он компилируется и затем исполняется, а созданные машинные коды хранятся в рабочей области системы MatLab.
Последняя конструкция vаг=выражение вводится, если требуется, чтобы функция возвращала результат вычислений.
Приведенная форма файла-функции характерна для функции с одним выходным параметром. Если выходных параметров больше, то они указываются в квадратных скобках после слова function. При этом структура модуля имеет следующий вид:
имя-файла |
function [varl,var2....]=f_name(Список_параметров) % Основной комментарий % Дополнительный комментарий Тело файла с любыми выражениями vаг1=выражение vаг2=выражение |
Такая функция во многом напоминает процедуру. Ее нельзя слепо использовать непосредственно в математических выражениях, поскольку она возвращает не единственный результат, а множество результатов — по числу выходных параметров.
Если функция используется как имеющая единственный выходной параметр, но имеет ряд выходных параметров, то для возврата значения будет использоваться первый из них. Это зачастую ведет к ошибкам в математических вычислениях. Поэтому, как отмечалось, данная функция используется как отдельный элемент программ вида:
[var1,var2,... ]=f_nаmе(Список_параметров)
После его применения переменные выхода varl, var2,... становятся определенными и их можно использовать в последующих математических выражениях и иных сегментах программы. Если функция используется в виде f_nаmе(Список_параметров), то возвращается значение только первого выходного параметра – переменной varl.
Переменные, указанные в списке параметров функции, являются локальными и служат для переноса значений, которые подставляются на их место при вызовах функций.
Эта особенность переменных-параметров хорошо видна при разборе примера 3.2-3, результат.
Пример 3.4-2 |
function z=fun(x,y) % Пример5.3.2-2 z=x^2+y^2; |
Пример3.4-2 |
>> z=fun(2,3); >> x= >> y= >>z= >> |
В этом примере в окне редактора создана функция fun(x,y) двух переменных х и у, вычисляющая z = х 2 + у 2. Поскольку переменные х и у указаны как параметры функции fun(x, у), то они являются локальными. В примере вне тела функции им заданы нулевые значения. Очевидно, что при вычислении значения fun(2, 3) в теле функции задается х=2 и у=3. Поэтому результат - z=13. Однако после выхода из тела функции переменные х и у принимают свои исходные значения, равные нулю. Так что эти переменные меняют свои значения на значения параметров функции только локально — в пределах тела функции.
А каков статус переменной z в нашем примере? Она, как и любая переменная, определенная в теле функции, также будет локальной. Изначально ее значение не определено. В теле функции переменная принимает значение z=13. А после возврата из функции, как нетрудно увидеть из примера 3.4-1, переменная z, несмотря на ее применение в теле функции, остается неопределенной. На это указывает сообщение, отображаемое после попытки вывода значения переменной z.
Возврат из функции производится после обработки всего тела функции, т. е. при достижении конца файла функции. При использовании в теле функции условных операторов, циклов или переключателей иногда возникает необходимость осуществить возврат функции раньше, чем будет достигнут конец файла. Для этого служит команда return. В любом случае, результатом, возвращаемым функцией, являются значения выходных параметров (в нашем случае выходным параметром является переменная z), присвоенные им на момент возврата.
У нашей функции имеется один недостаток — вывод на индикацию значения z=13 из тела функции, хотя после этого z остается равным 0. Чтобы убрать побочный эффект вывода значения z, достаточно установить знак; после математического выражения, определяющего z.
Этот пример наглядно показывает, что пропуск любого слова или даже простого оператора (вроде знака;) может привести к не сразу понятным побочным эффектам и даже неверной работе функции. Программирование требует особой точности и педантичности.
Из сказанного ясно, что переменные в файлах-программах являются глобальными, а в файлах-функциях - локальными. Нередко применение глобальных переменных в программных модулях может приводить к побочным эффектам. Применение локальных переменных устраняет эту возможность и отвечает требованиям структурного программирования.
Однако передача данных из модуля в модуль в этом случае происходит только через входные и выходные параметры, что требует тщательного планирования такой передачи. Однако и при создании файлов-функций порой желательно применение глобальных переменных. Ответственность за это должен брать на себя программист, создающий программные модули.
Команда
Globalvarl var2...
позволяет объявить переменные модуля-функции глобальными. Таким образом, внутри функции могут использоваться и такие переменные, если это нужно по условиям решения вашей задачи. Причем, чтобы несколько программных модулей могли совместно использовать глобальную переменную, она должна быть объявлена как global во всех модулях.
Часто в ходе вычислений возникают ошибки. Например, при вычислении функции sin(x)/x - при х = 0 имеет место ошибка вида «деление на ноль». При появлении ошибки вычисления могут завершиться досрочно с выводом сообщения об ошибке. Следует, однако, отметить, что не все ошибки вызывают остановку вычислений. Некоторые сопровождаются только выдачей предупреждающей надписи. Такие ситуации должны учитываться программистом, отмечаться как ошибочные и по возможности устраняться. Для вывода сообщения об ошибке служит команда
error('Сообщение об ошибке');
при выполнении, которой вычисления прерываются, и выдается сообщение об ошибке, заданное в апострофах. Ниже дан пример вычисления функции sd(x)=sin(x)/x, в котором задано сообщение об ошибке:
Пример_3_4_3 |
function f=sd(x) ifx==0 error('Ошибка - делениена 0'). end f=sin(x)/x; |
Для выявления ситуации об ошибке использован оператор условного перехода if, который будет описан детально несколько позднее. Результат выполнения данной функции приводится ниже:
Пример3.4-3 |
>>x=0; >>f=sd(x); ???Ошибка - деление на 0 >>x=1; >>f=sd(x); >> f= >> |
Если остановка программы при появлении ошибки нежелательна, то может использоваться команда вывода предупреждающего сообщения
warning('Предупреждающее сообщение').
Эта команда выводит стоящее в апострофах сообщение, но не препятствует дальнейшей работе программы. Признаком того, что является ошибкой, а что -предупреждением, являются символы ??? и слово Warning в соответствующих сообщениях.
При создании функций со специальными свойствами весьма полезны две приведенные ниже функции:
· nargin — возвращает число входных параметров данной функции;
· nargout — возвращает число выходных параметров данной функции.
Пусть, к примеру, мы хотим создать функцию, вычисляющую сумму квадратов пяти аргументов xl, х2, хЗ, х4 и х5.
Обычный путь состоит в следующем — создаем функцию с именем sum2_5:
sum2_5_Пример_3.4-4 |
function f=sum2_5(x1,x2,x3,x4,x5); f=x1^2+x2^2+x3^2+x4*2+x5^*2; |
Пример3.4-4 |
» sum2_5_Пример_5_3_2_4 (l,2,3,4,5) ans = » sum2_5(l,2) ??? Input argument 'хЗ' is undefined. Error in ==> C:\MATI_AB\bin\sum2_5.m On line 2 ==> f=x1^2+x2^2+x3^2+x4^2+x5^2; >> |
Итак, при наличии всех пяти аргументов функция работает корректно. Но если аргументов менее пяти, она выдает сообщение об ошибке. С помощью функции nargin можно создать функцию sum2_5m, которая работает корректно при любом числе заданных входных аргументов в пределах от 1 до 5:
sum2_5_Пример_3_4_5 |
f unction f=sum2_5m(x1,x2, хЗ,x4, x5); n=nargin; if n==1 f=x1^2; end if n==2 f=x1^2+x2^2;end if n==3 f=x1^2+x2^2+x3^2; end if n==4 f=x1^2+x2 ^ 2+x3^2+x4 ^ 2: end if n==5 f=x1^2+x2^2+x3^2+x 4^2+x5^2 |
В данной функции используется условный оператор if...end, который будет детально описан далее. Но и без этого ясно, что благодаря применению функции nargin и условного оператора, вычисления всякий раз идут по формуле с числом слагаемых, равным числу входных аргументов - от одного до пяти. Это видно из приведенных ниже примеров:
Пример3.4-5 |
» sum2_5m(1) ans = » sum2_5m(1,2) ans = » sum2_5m(1,2,3) ans = » sum2_5m(1,2,3,4) ans = » sum2_5m(1,2,3,4,5) ans= » sum2_5m(1,2,3,4,5,6) ??? Error using ==> sum2_5m Too many input arguments. >> |
Итак, при изменении числа входных параметров от 1 до 5 вычисления проходят корректно. При большем числе параметров выводится сообщение об ошибке. Это уже действует встроенная в интерпретатор MatLab система диагностики ошибок
Как отмечалось, команда helpname, где name — имя m - файла, обеспечивает чтение первой строки с текстовым комментарием и тех строк с комментариями, которые следуют непосредственно за первой строкой. Комментарий, расположенный за пределами этой области, не выводится. Это позволяет создавать невыводимый программный комментарий.
Пустая строка прерывает вывод комментария при исполнении команды helpname. Команда typename выводит текст программы со всеми комментариями, в том числе и следующими после пустых строк.
Команда helpcatalog, где catalog — имя каталога с m - файлами, позволяет вывести комментарий, общий для всего каталога. Такой комментарий содержится в файле contents.m, который пользователь может создать самостоятельно с помощью редактора m - файлов. Если такого файла нет, то будет выведен список первых строк комментариев для всех m-файлов каталога.
m - файлы-функции могут использоваться как в командном режиме, так и вызываться из других m - файлов. При этом необходимо указывать все входные и выходные параметры. Исключением является случай, когда выходной параметр единственный — в этом варианте функция возвращает единственный результат и может использоваться в математических выражениях. При использовании глобальных переменных они должны быть объявлены во всех m - файлах, используемых в решении заданной задачи, и во всех входящих в них встроенных подфункциях.
Имена функций должны быть уникальными. Это связано с тем, что при обнаружении каждого нового имени MatLab проверяет, относится ли это имя к переменной, подфункции в данном m - файл е, частной функции в каталогах PRIVATE или функции в одном из каталогов пути доступа. Если последняя встречается, то будет исполнена именно эта функция.
Если аргумент функции используется только для вычислений и его значения не меняются, то аргумент передается ссылкой, что уменьшает затраты памяти. В других случаях аргумент передается значением. Для каждой функции выделяется своя (рабочая) область памяти, не входящая в область, предоставляемую системе MatLab. Глобальные переменные принадлежат ряду областей памяти. При их изменении меняется содержимое всех этих областей.
При решении задач с большим объемом данных может ощущаться нехватка оперативной памяти. Признаком этого становится появление сообщения об ошибке «Outofmemory».
В этом случае может быть полезным применение следующих мер:
· стирание ставших ненужными данных, прежде всего больших массивов;
· увеличение размеров файла подкачки Windows;
· уменьшение размера используемых данных;
· снятие ограничений на размеры используемой памяти;
· увеличение объема физической памяти компьютера.
Чем больше емкость ОП компьютера, на котором используется система MatLab тем меньше вероятность возникновения указанной ошибки. Опыт показывает, что даже при решении задач умеренной сложности емкость ОЗУ не должна быть менее 256 Мбайт.
Работа с m-файлами
Во время работы в MatLab часто необходимо создавать или редактировать m-файлы, а после этого возвращаться в командное окно MatLab для отладки или вычислений. Для этого имеется специальный редактор/отладчик, в котором можно исправлять текст и выполнять пошаговую отладку программы. После исправления необходимо сохранить сделанные изменения. Причем m-файлы, с которыми работают, должны быть доступны. Для этого либо текущая директория должна быть директорией с вашими файлами, либо необходимо проложить туда путь. Это можно сделать с помощью пункта меню File/SetPath, который позволяет сделать директории доступными.
Для поиска m-файлов система MatLab использует механизм путей доступа, поскольку m-файлы записываются в каталоги или папки файловой системы. Например, при поиске файла с именем foo,МatLab выполняет следующие действия:
· просматривает, не является ли foo именем переменной;
· просматривает, не является ли foo встроенной функцией;
· ищет в текущем каталоге m - файл с именем foo.m;
· ищет m - файл с именем foo.m во всех каталогах списка путей доступа.
Реально применяемые правила поиска являются более сложными. Однако приведенный выше упрощенный порядок поиска точно отражает механизм поиска m - файлов, с которыми обычно работает пользователь.
В процессе сеанса работы можно вывести на дисплей или внести изменения в список путей доступа, используя следующие функции:
· path - выводит на экран список путей доступа;
· path(s) - заменяет существующий список списком s;
· addpath/home/lib и path(path, ’/home/lib’) -добавляют новый каталог текущего подкаталога в список путей доступа;
· rmpath /home/lib -удаляет путь /home/lib из списка.
Список путей доступа, используемый по умолчанию, определен в файле pathdef.m, который размещен в каталоге lосаl; этот файл выполняется при каждом запуске системы MatLab.
Кроме работы из командной строки, существует средство просмотра путей доступа PathBrowser, которое поддерживает удобный графический интерфейс для просмотра и изменения списка путей.
Система MatLab использует понятие текущего каталога при работе с m -файлами во время сеанса работы. Начальный текущий каталог определен в файле запуска.
Для вывода текущего каталога на экран предназначена команда cd. Для изменения текущего каталога следует использовать команду
сd<новый путь доступа>.
Как было указано выше, при работе в системе Windows имеется специальное средство для просмотра и изменения путей доступа SetPath (рис. 3.3-1). Показанное далее окно открывается либо из меню File/SetPath основного окна, либо с помощью кнопки на инструментальной панели.
После дополнения списка путей доступа необходимо сохранить новый путь с помощью пункта меню File/SavePath, в противном случае установленный путь будет известен системе только на время одного сеанса работы.
Рис. 3.4-1. Окно SetPath
Редактор/отладчик предоставляет из себя как средства редактирования текста m - файла, так и средства пошаговой его отладки. Один из способов вызова редактора – вызов из командной строки MatLab с помощью команды edit. Например, команда editpoof откроет встроенный редактор для редактирования файла poof.m, если в меню File в диалоговом окне Preferences не установлен вами другой редактор.
Можно открыть редактор и другим способом – с помощью меню File/New или кнопки NewFile на панели инструментов. Для открытия существующего m - файла выберите пункт File/Open или щелкните на кнопке OpenFile.
После вызова редактор/отладчик будет иметь вид, показанный на рис. 3.4-2.
Рис. 3.4-2. Общий вид редактора/отладчика
Редактор, используемый в системе, имеет синтаксическую раскраску, т.е. слово или символ по мере ввода приобретают тот цвет, который соответствует их типу. Редактор различает такие типы вводимых слов:
· комментарии
· ключевые слова
· незаконченные строки
· законченные строки
· другой текст.
С помощью пункта меню Tools/Fonts можно настроить такие важные параметры, как используемый шрифт. В основном данный редактор не отличается от обычного многооконного текстового редактора - в нем работают все редактирующие клавиши (Del, Bspace, Home и т.д.). При редактировании файлов вы можете непосредственно перейти к требуемой строке при помощи пункта меню Edit/GoToLine и указать номер требуемой строки в появившемся окне. После редактирования файла и повторного его запуска из командного окна желательно предварительно сохранить новый вариант файла. Но можно запускать редактируемый файл на выполнение, не выходя из редактора (т.е. не переходя в командное окно) с помощью пункта меню Debug/Run. При этом предварительное сохранение текста исправлений не требуется.
Одной из важных особенностей данного редактора является то, что после проведения вычислений можно в редакторе просмотреть значения переменных, которые они имеют в текущий момент в рабочей области. Для этого достаточно установить курсор мыши на этой переменной, и появится прямоугольник с желтым фоном, на котором выводится текущее значение переменной. Если переменная является большой матрицей, то таким образом увидеть целиком ее не удастся. Для просмотра (и возможного исправления при отладке) всех значений матрицы есть специальный пункт меню View/WorkspaceBrowser. Имеется еще два интересных пункта в меню View. Это пункт EvaluateSelection, который позволяет вычислять значение выделенного выражения и помещать результат в командное окно, и пункт AutoIndentSelection, который выполняет автоматическое форматирование текста программы с отступами в соответствии с правилами MatLab. Выбор пункта меню View/Options позволяет получить доступ к диалоговому окну, в котором можно настроить параметры редактора.
Отладка программного кода - это процесс, в ходе которого могут быть выявлены ошибки двух видов:
· синтаксические, которые связаны с неточностью записи имен m-функций или арифметических выражений. MatLab обнаруживает большинствосинтаксических ошибок, сопровождая их сообщением об ошибке с указанием номера строки соответствующего m-файла;
· ошибки времени выполнения, которые, как правило, имеют алгоритмическую природу и проявляются в том, что приводят к непредвиденным результатам.
Достаточно легко можно исправить синтаксические ошибки, которые сопровождаются сообщениями о причинах их возникновения. Ошибки времени выполнения выявить более сложно, потому что локальная рабочая область m-функции оказывается потерянной, если ошибка приводит к возврату в рабочую область системы MatLab. Чтобы определить причину такой ошибки, можно использовать один из следующих приемов:
· реализовать вывод результатов промежуточных вычислений на дисплей, удалив в соответствующих операторах точки с запятой, которые подавляют вывод на экран промежуточных результатов;
· добавить в m - файл команды keyboard, которые останавливают выполнение m - файла и разрешают проверить и изменить переменные рабочей области вызываемой m-функции(в этом режиме появляется специальное приглашение), а возврат к выполнению функции реализуется командой return);
· закомментировать заголовок функции и выполнить m-файл как сценарий (это позволяет проследить результаты промежуточных вычислений в рабочей области системы);
· использовать отладчик системы МatLab.
Отладчик полезен для исправления ошибок во время выполнения программы именно потому, что он дает возможность отслеживать рабочие области функции и проверять или изменять значения соответствующих переменных. Отладчик позволяет устанавливать и удалять контрольные точки, то есть специальным образом помеченные строки m - файла, в которых выполнение останавливается. Это дает возможность изменять содержимое рабочей области, просматривать стек вызова m-функций и выполнять m - файл построчно. Отладчик может функционировать как в режиме командной строки, так и в режиме графического интерфейса пользователя.
Далее мы рассмотрим отладку только в режиме графического интерфейса пользователя, поскольку он наиболее прост и нагляден. Рассмотрим возможности отладки, которые нам предоставляет Editor/Debugger.
Для его запуска используется команда edit<имя_файла> или пункт меню File/Open. Можно открыть окно редактора/отладчика и с помощью пункта меню File/New/M-file. При таком варианте имя отлаживаемого файла открывается уже из меню самого редактора/отладчика. Общий вид окна редактора показан на рис. 3.2-2.
Способ использования кнопок понятен из их названия. Часть кнопок представляют собой обычные редактирующие кнопки, используемые при сохранении, копировании, печати и поиске файлов. Другая часть связана непосредственно с отладкой. Это кнопки установки и очистки точек остановки, кнопки пошагового перемещения по программе с заходом в подпрограммы (Stepin) и без захода в под-
программы (SingleStep), кнопка продолжения вычислений (Continue) и кнопка остановки отладки (QuitDebugging). Как было отмечено выше, с помощью пункта меню View/WorkspaceBrowser можно не только просмотреть, но и изменить значение любой переменной. При этом в одном из окон редактора открывается таблица, подобная электронной таблице, и в ней можно не только просматривать, но и исправлять значения переменных.
Редактор m-файлов
В MatLab имеется редактор m-файлов, для запуска которого следует нажать кнопку Newm-file на панели инструментов рабочей среды, либо выбрать в меню File в команду New/m-file. На экране появляется окно редактора. Наберите в нем какие-либо команды, например для построения графика:
Пример 3.4-6 |
% % x=[-1:0.01:1]; y=exp(x); plot(x,y) gridon title('Экспоненциальная функция') |
Для запуска программы или ее части есть несколько способов. Первый, самый простой – выделить операторы при помощи мыши, удерживая левую кнопку, или при помощи клавиши <Shift> со стрелками, <PageUp>,<PageDown> и выбрать Text пункт EvaluateSelection (или нажать <F9>). Выделенные операторы выполняются последовательно, точно так же, как если бы они были набраны в командной строке. Очевидно, что работать в m -файле удобнее, чем из командной строки, поскольку можно сохранить программу, добавить операторы, выполнять отдельные команды, не пробегаясь по истории команд, как в случае командной строки.
После того, как программа сохранена в m - файле, к примеру, в myprog.m, для ее запуска можно использовать пункт Run меню Debug, либо набрать в командной строке имя m-файла (без расширения) и нажать <Enter>, то есть выполнить, как команду MatLab. При таких способах запуска программы следует учесть важное обстоятельство — путь к каталогу с m - файлом должен быть известен MatLab. Сделайте каталог с файлом myprog текущим.
В MatLab в меню File рабочей среды перейдите к пункту SetPath… Появляется диалоговое окно PathBrowser (навигатор путей). В строке ввода CurrentDirectory установите требуемый каталог. Воспользуйтесь кнопкой, расположенной справа от строки ввода, для выбора каталога.
В MatLab установка текущего каталога производится из окна CurrentDirectory рабочей среды. Если это окно отсутствует, то следует выбрать пункт CurrentDirectory меню View рабочей среды. Для выбора желаемого каталога на диске нажмите кнопку, расположенную справа от раскрывающегося списка.
Когда текущий каталог установлен, то все m - файлы, находящиеся в нем, могут быть запущены из командной строки, либо из редактора m - файлов. Все переменные файл-программ после ее запуска доступны в рабочей среде, т. е. являются глобальными. Убедитесь в этом, выполнив команду whos. Более того, файл-программа может использовать переменные рабочей среды. Например, если была введена команда:
-Пример 3.4-7 |
>> a=[0.1 0.4 0.3 1.9 3.3]; >> |
то файл-программа,
-Пример_3_4_7 |
% % bar(а) |
содержащая строку bar(а), построит столбцевую диаграмму вектора a (разумеется, если он не был переопределен в самой файл-программе).
Файл-функции отличаются от файл-программ тем, что они могут иметь входные и выходные аргументы, а все переменные, определенные внутри файл-функции, являются локальными и не видны в рабочей среде. m - файл, содержащий файл-функцию, должен начинаться с заголовка, после него записываются операторы MatLab. Заголовок состоит из слова function, списка выходных аргументов, имени файла-функций и списка входных аргументов. Аргументы в списках разделяются запятой. Пример3.4-3 содержит простейшей файл-функции с двумя входными и одним выходным аргументами.
-Пример_3_4_8 |
function c=mysum(a,b) c=a+b; |
Наберите этот пример в новом файле в редакторе и сохраните его. Обратите внимание, что MatLab предлагает в качестве имени m - файла название файла-функций, т.е. mysum.m. Всегда сохраняйте файл-функцию в m - файле, имя которого совпадает с именем файл-функции! Убедитесь, что каталог с файлом mysum.m является текущим и вызовите файл-функцию mysum из командной строки:
Пример 3.4-8 |
>> s=mysum(2,3) s = >> |
При вызове файл-функции mysum произошли следующие события:
· входной аргумент a получил значение 2;
· входной аргумент b стал равен 3;
· сумма a и b записалась в выходной аргумент c;
· значение выходного аргумента c получила переменная s рабочей среды и результат вывелся в командное окно.
Заметьте, что оператор c=a+b в файл-функции mysum завершен точкой с запятой для подавления вывода локальной переменной c в командное окно. Для просмотра значений локальных переменных при отладке файл-функций, очевидно, не следует подавлять вывод на экран значений требуемых переменных.
Практически все функции MatLab являются файл-функциями и хранятся в одноименных m- файлах. Функция sin допускает два варианта вызова: sin(x) и y=sin(x), в первом случае результат записывается в ans, а во втором — в переменную y. Наша функция mysum ведет себя точно так же. Более того, входными аргументами mysum могут быть массивы одинаковых размеров или массив и число.
Разберем теперь, как создать файл-функцию с несколькими выходными аргументами. Список выходных аргументов в заголовке файл-функции заключается в квадратные скобки, сами аргументы отделяются запятой. В качестве Примера 3.4.4-4 приведена файл-функция quadeq, которая по заданным коэффициентам квадратного уравнения находит его корни.
Пример_3_4_9 |
function [x1,x2]=quadeq(a,b,c) % D=b^2-4*a*c; x1=(-b+sqrt(D))/(2*a); x2=(-b-sqrt(D))/(2*a); |
Пример 3.4-9 |
%При вызове quadeq из командной строки используйте квадратные скобки для %указания переменных, в которые будут занесены значения корней: >> [r1,r2]=quadeq(1,3,2) r1 = -1 r2 = -2 >> |
Заметьте, что файл-функцию quadeq можно вызвать без выходных аргументов, или только с одним выходным аргументом. В этом случае вернется только первый корень.
Файл-функция может и не иметь входных или выходных аргументов. Заголовки таких файл-функций приведены ниже:
Functionnoout(a,b),
function [v,u]=noin,
Functionnoarg()
Умение писать собственные файл-функции и файл-программы необходимо как при программировании в MatLab, так и при решении различных задач средствами MatLab (в частности, поиска корней уравнений, интегрирования, оптимизации). Разберем только один пример, связанный с построением графика функции
y=exp(-x).*(sin(x)+0.1*sin(100*pi*x)) на отрезке [0;1].
Используйте поэлементные операции для того, чтобы myfun() можно было вызывать от вектора значений аргумента и получать вектор соответствующих значений функции.
Пример_3.4-10 |
function y=myfun(x); % y=exp(-x).*(sin(x)+0.1*sin(100*pi*x)); %График y можно получить двумя способами. Первый способ состоит в %создании вектора %значений аргумента, скажем с шагом 0.01, заполнении %вектор значений функции и вызове plot: >> x=[0:0.01:1]; >> y=myfun(x); >> plot(x,y) >> |
Пример 3.4-10 |
%%График y можно получить двумя способами. Первый способ состоит в %создании вектора значений аргумента, скажем с шагом 0.01, заполнении %вектор значений функции и вызове plot: >> x=[0:0.01:1]; >> y=myfun(x); >> plot(x,y) >> |