- •§ 2.2. Командное окно системы matlab
- •§ 2.3. Рабочее пространство системы matlab
- •§ 2.4. Скаляры и массивы. Индексированные переменные
- •§ 2.5. Форматы представления вещественных чисел
- •§ 2.6. Арифметические выражения
- •2.6.1. Некоторая специфика использования вещественных данных
- •2.6.2. Некоторая специфика использования комплексных данных
- •2.6.3. Некоторые приемы работы с матрицами и векторами
- •2.6.4. Некоторые специфика выполнения арифметических и логических операций.
- •§ 2.7. Элементарные математические функции
- •Часть 2. Визуализация результатов вычислений
- •§ 2.8. Особенности графической подсистемы matlab
- •§ 2.9. Построение графиков функций одной переменной
- •2.9.1. Простые графики в декартовой системе координат.
- •2.9.2. Визуализация нескольких графиков.
- •2.9.3. Функция fplot.
- •2.9.4. Построение графиков в логарифмическом и полулогарифмическом масштабах.
- •2.9.5. Построение графиков в полярных координатах.
- •§ 2.10. Оформление графиков и графических окон
- •2.10.1. Выбор свойств линий.
- •2.10.2. Оформление осей координат.
- •2.10.3. Добавление надписей, заголовков и координатной сетки.
- •§ 2.11. Средства управления в графическом окне
- •§ 2.12. Общее знакомство с трехмерной графикой в matlab
- •2.12.1. Общий алгоритм визуализации функций двух переменных.
- •2.12.2. Построение трехмерных линий.
- •2.12.3. Построение поверхностей.
- •2.12.4. Задание дополнительных параметров трехмерных графиков.
- •2.12.5. Построение линий уровня.
- •2.12.6. Построение траектории точки, движущейся в пространстве.
- •2.12.7. Интерактивное редактирование графиков.
- •Часть 3. Вычисления с действительными и комплексными массивами чисел
- •§ 2.13. Операции отношения и логические операции над числами
- •2.13.1. Операции отношения.
- •2.13.2. Логические операции.
- •2.13.3. Приоритет операций.
- •§ 2.14. Формирование одномерных числовых массивов
- •2.14.1. Задание одномерных массивов и доступ к их элементам.
- •2.14.2. Об ускорении операций задания массива.
- •2.14.3. Об использовании операции формирования диапазона.
- •§ 2.15. Матрицы и векторы. Двумерные массивы чисел
- •2.15.1. Создание матриц и векторов.
- •2.15.2. Доступ к отдельным фрагментам матриц.
- •2.15.3. Удаление строк и столбцов матрицы.
- •2.15.4. Использование функций перестановки частей матриц.
- •2.15.5. Определение размеров и размерностей массивов.
- •2.15.6. Использование операций индексации.
- •2.15.7. Изменение размеров массива.
- •2.15.8. Специальные функции формирования массивов.
- •§ 2.16. Вычисления с массивами
- •2.16.1. Поэлементные и групповые операции над массивами.
- •2.16.2. Решение некоторых типовых задач линейной алгебры и аналитической геометрии.
- •2.16.3. Применение операций отношения и логических операций к массивам.
- •2.16.4. Некоторые функции для работы с массивами.
- •Часть 4. Стандартные средства решения некоторых типовых задач линейной алгебры и математического анализа
- •§ 2.17. Решение систем линейных алгебраических уравнений
- •§ 2.18. Решение некоторых задач линейной алгебры. Матричные функции
- •§ 2.19. Разреженные матрицы
- •§ 2.20. Решение нелинейных уравнений
- •§ 2.21. Поиск минимального значения функции
- •§ 2.22. Численное интегрирование
- •2.22.1. Использование метода трапеций.
- •2.22.2. Использование методов Симпсона и Гаусса-Лобатто.
- •2.22.3. Вычисление двойных интегралов.
- •§ 2.23. Операции над полиномами
- •2.23.1. Вычисление значения полинома.
- •2.23.2. Вычисление корней полинома.
- •2.23.3. Умножение и деление полиномов.
- •2.23.4. Дифференцирование и интегрирование полиномов.
- •§ 2.24. Интерполяция и аппроксимация данных
- •2.24.1. Полиномиальная аппроксимация.
- •2.24.2. Интерполяция сплайнами.
- •Часть 5. Символьные вычисления
- •§ 2.25. Создание символьных переменных, выражений и матриц
- •2.25.1. Создание символьных переменных.
- •2.25.2. Создание символьных выражений.
- •2.25.3. Создание символьных матриц.
- •§ 2.26. Символьные вычисления
- •2.26.1. Символьное дифференцирование.
- •2.26.2. Вычисление пределов.
- •2.26.3. Символьное интегрирование.
- •2.26.3. Вычисление суммы ряда. Разложение функций в ряды.
- •2.26.4. Упрощение выражений. Подстановки.
- •2.26.5. Управление точностью вычислений.
- •2.26.6. Операции над векторами. Операции над матрицами. Некоторые операции линейной алгебры.
- •2.26.7. Решение уравнений и систем уравнений.
- •§ 2.27. Визуализация результатов символьных вычислений
- •2.27.1. Построение двумерных графиков.
- •2.27.2. Построение трехмерных графиков.
- •Часть 6. Основы программирования на m-языке
- •§ 2.28. Основные понятия программирования в системе matlab
- •2.28.1. Назначение языка программирования matlab.
- •2.28.2. Основные средства программирования.
- •2.28.3. Основные типы данных.
- •2.28.4. Виды программирования.
- •2.28.5. Двойственность операторов, команд и функций.
- •2.28.6. Некоторые ограничения.
- •§ 2.29. Создание и использование m-файлов
- •2.29.1. Понятие об m-файлах.
- •2.29.2. Типы m-файлов.
- •2.29.3. Создание файл-программ.
- •2.29.4. Создание файл-функций.
- •2.29.5. Глобализация переменных и функций.
- •2.29.6. Синтаксический контроль программ.
- •§ 2.30. Управляющие структуры
- •2.30.1. Понятие об управляющих структурах.
- •2.30.2. Операторы цикла.
- •2.30.3. Операторы ветвления.
- •2.30.4. Прочие операторы.
- •§ 2.31. Работа с файлами
- •2.31.1. Общие замечания.
- •2.31.2. Подготовка файла к работе.
- •2.31.3. Завершение работы с файлами.
- •2.31.4. Контроль за исчерпанием данных.
- •2.31.5. Чтение из текстового файла.
- •2.31.6. Анализ ошибок в файловых операциях.
- •§ 2.32. Форматный ввод-вывод данных
- •2.32.1. Форматные преобразования (sprintf, sscanf).
- •2.32.2. Форматные преобразования при работе с файлами (fprintf, fscanf).
- •§ 2.33. Рекурсивные файл-функции. Производительность файл-функций
- •2.33.1. Понятие о рекурсивных файл-функциях.
- •2.33.2. Оценка производительности файл-функции.
- •§ 2.34. Файл-функции с переменным числом входных параметров и выходных значений
- •§ 2.35. Диалоговые программы
- •2.35.1. Ввод числовых и символьных данных.
- •2.35.2. Вывод результатов вычислений.
- •§ 2.36. Анимационные эффекты
- •§ 2.37. Контроль входных и выходных параметров файл-функции
- •§ 2.38. Отладка программы
- •2.38.1. Понятие о способах отладки программы.
- •2.38.2. Рекомендации по созданию и отладке программ.
- •Часть 7. Создание программ с визуальным интерфейсом
- •§ 2.39. Понятие о графическом интерфейсе пользователя (gui)
- •2.39.1. Предварительные замечания.
- •2.39.2. Основные команды для создания gui.
- •§ 2.40. Общие сведения о визуальной среде guide
- •§ 2.41. Программирование событий в matlab
- •§ 2.42. Свойства основных компонентов в matlab
- •§ 2.43. Диалоговые окна в matlab
- •§ 2.44. Динамическое создание компонентов
- •§ 2.45. Создание меню
- •§ 2.46. Некоторые рекомендации по созданию приложений с графическим интерфейсом пользователя
2.29.4. Создание файл-функций.
Как уже отмечалось, файл-функции отличаются от файл-программ тем, что имеют входные и выходные параметры. Разумеется, что при этом можно создавать файл-функции с одним входным и одним выходным параметром, с несколькими входными или выходными параметрами, а также с переменными числом входных и выходных параметров. Все переменные, используемые в файл-функциях, являются изолированными от рабочего пространства MATLAB, что позволяет реализовывать с использованием файл-функций независимые фрагменты кода для решения конкретных задач.
Файл-функции, как и файл-программы, состоят из набора команд на языке MATLAB и сохраняются в текстовых файлах с расширением .m, однако имеют несколько иной синтаксис. Файл-функция должна состоять из следующих частей: заголовок функции (включает объявление function, имя функции, а также список входных и выходных параметров), определяющий «интерфейс» функции (способ взаимодействия с ней) и тело функции (состоит из инструкций на языке MATLAB, позволяющих вычислить значение функции).
Ввод текста файл-функции.
Рассмотрим создание простейшей
файл-функции с одним входных и одним
выходным параметром, предназначенной
для вычисления значения функции
.
Выберем в главном меню пункт New и далее в ниспадающем меню укажем Function, в результате чего откроется окно редактора M-файлов. В последнем необходимо набрать следующие строки кода (рис. 2.29.5):
function f=sample2(x)
% Вычисление значения функции
% f(x)=x^3*(7*sin(x)^2+5*cos(x)^2)
f(x)=x.^3.*(7*sin(x).^2+5*cos(x).^2);
Первая строка в рассматриваемом примере представляет собой заголовок функции, включающий в себя имя функции (в данном случае sample2), один входной (x) и один выходной (f) параметры. Далее следуют две строки с комментарием, который при вычислении функции игнорируется (это необязательная часть файл-функции). Заметим, что комментарий, введенный после заголовка функции, программа интерпретирует как описание функции которое отобразится в командном окне, если ввести команду
Рис. 2.29.5. Текст файл-функции в окне редактора M-файлов.
help имя_файл-функции
Иными словами, в MATLAB строки комментариев, располагаемые сразу после заголовка функции, играют особую роль – они предназначены не только для программистов, но и для конечных пользователей, желающих ознакомиться с краткой информацией об используемой файл-функции. В этих строках должна быть расположена краткая, но содержательная справка по хорошо документированной функции.
Эти же начальные строки комментариев участвуют в поиске функции по содержащимся в ней текстовым фрагментам, выполняемому с помощью команды вида
lookfor текст -all
Наконец, в результате применения команды
type имя_функции
в командном окне отображается текст M-функции вместе со всеми ее комментариями. Такая визуализация позволяет изучить детали реализации алгоритма, использованного при написании файл-функции, научиться различным приемам программирования, в частности, способам и глубине проверок входных и выходных параматров.
Далее следует тело функции – набор из инструкций M-языка, с помощью которых вычисляются возвращаемые значения (тело функции следует за заголовком функции). При вводе указанных инструкций использовались, в частности, операторы поэлементного умножения и возведения в степень (для того, чтобы можно было использовать функцию, при работе с массивами). В конце строки, вычисляющей значение искомого выражения, поставлена точка с запятой, что позволяет избежать вывода на экран лишней информации.
Заголовок файл-функции и тело файл-функции в совокупности в совокупности составляют определение функции.
Сохранение файл-функции. После введения текста файл-функции, ее следует сохранить в текущем рабочем каталоге. Для этого в главном меню следует выбрать пункт Save и далее в ниспадающем окне указать Save As. В результате в появившемся диалоговом окне Select File for Save As раскроется каталог MATLAB папки Документы, который по умолчанию определен в качестве текущего рабочего каталога. В общем случае размещать M-файл с определением файл-функции, необходимо в одном из каталогов диска, входящих в список доступа системы MATLAB. Данный вопрос уже обсуждался ранее при изучении файл-программ.
В полях Имя файла и Тип файла этого диалогового окна автоматически появятся требуемые имя и тип файл-функции. Содержимое указанных полей менять не требуется. В рассматриваемом случае в поле Имя файла будет предложено имя sample2. Вообще, указанное в заголовке имя файл-функции должно совпадать с именем файла (без учета расширения .m), в который записывается текст файл-функции. Несогласованность имени функции и имени файла не допускается.
Выполнение файл-функций. Созданную файл-функцию можно использовать как в командном режиме (аналогично любой встроенной функции системы MATLAB), так и вызывать из других файл-программ или файл-функций. При вызове файл-функции следует указать все ее входные и выходные параметры. В частности, в рассматриваемом примере обязательным является задание единственного входного параметра x. Вычислим, например, значение функции sample2 при x=4, а результат присвоим произвольной переменной y. Будем иметь:
>> y=sample2(4)
y =
393.3120
При вызове файл-функции MATLAB проверяет, относится ли ее имя к какой-либо переменной, встроенной функции, либо к M-файлу в текущем рабочем каталоге или в каталоге, установленном в пути поиска. Если объект с таким именем есть, будет выполнен именно он. В этой связи, во избежание путаницы, файл-функциям, как и файл-программам следует присваивать уникальные имена.
При создании файл-функции sample2 были определены две переменные: входная переменная x и выходная переменная f. Для того, чтобы убедиться в том, что эти переменные являются локальными и не появляются в рабочем пространстве после вызова файл-функции, можно обратиться к ним после выполнения данной файл-функции и получить сообщения об ошибках:
>> x
Undefined function or variable 'x'.
>> f
Undefined function or variable 'f'.
Существует еще один способ вызова файл-функции, используемый при необходимости ограничить доступ к некоторой M-функции, расположенной в заданном каталоге. В этом случае в данном каталоге нужно создать дочерний каталог с именем private и поместить туда указанную функцию. В результате все функции из каталога private будут доступны лишь функциям из родительского каталога.
Файл-функции с несколькими входными и выходными параметрами. При необходимости вычисления значений функции типа рассмотренной ранее , но при коэффициентах, отличных от 7 и 5, можно внести соответствующие изменения в текст файл-функции и затем сохранить их. Вместе с тем, очевидно, что наиболее рациональным решением в такой ситуации является написание такой функции, для которой значения соответствующих коэффициентов являлись бы входными параметрами. Таким образом, возникает задача составления файл-функции с несколькими входными аргументами (в случае такого решения не придется каждый раз редактировать файл-функцию, меняя значения коэффициентов).
Представленную выше файл-функцию можно переписать в виде:
function f=sample3(x,c1,c2)
% Вычисление значения функции
% f(x)=x^3*(c1*sin(x)^2+c2*cos(x)^2)
% при различных значениях коэффициентов c1, c2
f=x.^3.*(c1*sin(x).^2+c2*cos(x).^2);
Сохранив эту файл-функцию в рабочем каталоге под именем sample3, ее можно будет использовать наряду с другими функциями. Вызов файл-функции sample3 аналогичен вызову файл-функции sample3, однако в данном случае необходимо задать значение не одного, а трех входных параметров. Так, например, будем иметь:
>> y=sample3(5,5,7)
y =
645.1161
В общем случае, если функция имеет несколько выходных параметров (т.е. возвращает несколько значений), их указывают в квадратных скобках через запятую после объявления function. Структура функции при этом будет иметь следующий вид:
function [Ret1,Ret2,...]=имя_функции(par1,par2,...)
% Комментарий
Ret1=выражение
Ret2=выражение
...
end
где имя_функции – имя объявляемой (с помощью ключевого слова function) функции, которая принимает входные значения par1, par2 и т.д. (формальные параметры) и вырабатывает выходные (возвращаемые) значения Ret1, Ret2 и т.д. Многоточия здесь не являются элементами синтаксической конструкции, они применяются лишь для того, чтобы наглядно подчеркнуть тот факт, что функции могут иметь разное входных параметров и выходных значений, например:
function FuncName1
function FuncName2(par1,par2,par3,par4)
function Ret1=FuncName3(par1,par2)
function [Ret1,Ret2,Ret3]=FuncName4(par1)
В первой строке последнего примера представлен заголовок файл-функции FuncName1, не имеющей ни входных, ни выходных параметров. Файл-ункция FuncName2 принимает четыре входных параметра и также не имеет выходных параметров (возвращаемых значений). Далее файл-функция FuncName3 принимает два значения, а возвращает один выходной параметр. Наконец, функция FuncName4 имеет один входной параметр и три выходных значения. Зачастую входные параметры для краткости называют аргументами функции, а возвращаемые (выходные) значения функции называют просто ее значениями.
Вызвать объявленную функцию можно следующим образом:
[Retf1,Retf2,...]=имя_функции(parf1,parf2,...)
где parf1, parf2, … – список входных параметров (фактические параметры); Retf1, Retf2,… – выходные (возвращаемые) значения.
Таким образом, синтаксис вызова файл-функции в системе MATLAB аналогичен вызову функции или подпрограммы в большинстве языков программирования: в командной строке вводится имя функции, после которого в круглых скобках через запятую перечисляются фактические входные параметры, со значениями которых и будут производиться вычисления. Фактические параметры могут быть заданы числовыми (и другими) значениями, именами переменных (уже имеющих конкретные значения), а также выражениями. Отметим, что если фактический параметр задан именем некоторой переменной, то реальные вычисления будут осуществляться с копией этой переменной (а не с ней самой). Это называется передачей параметров по значению.
Рассмотрим в качестве примера функцию sample4, которая вычисляет среднее значение элементов заданного вектора и стандартное отклонение элементов вектора от среднего (соответствующий пример приведен, в частности, в документации к системе MATLAB):
function [mean,stdev]=stat(x)
n=length(x);
mean=sum(x)/n;
stdev=sqrt(sum((x-mean).^2/n));
После сохранения текста приведенной выше файл-функции в файле stat.m ее можно вызвать, задав, например, в качестве входного параметра некоторый вектор k:
>> k=[1 5 3 7 4 2 6];
>> [m,s]=stat(k)
m =
4
s =
2
Интересно, что функции, возвращающие несколько значений, можно также использовать в составе выражений, при этом в качестве значения функции, применяемого для дальнейших вычислений, используется первое из возвращаемых функцией значений. Так, например, продолжая предыдущий пример, будем иметь:
>> a=stat(k)+7
a =
11
Следует обратить внимание на то, что имена фактических входных параметров (в данном случае k) и переменных, в которые записываются результаты вычислений (в данном случае m и s) не совпадают с именами аналогичных переменных в определении функции stat (в данном случае это x и mean, stdev). Для того, чтобы подчеркнуть это возможное отличие, имена входных параметров и выходных значений в определении функции называют формальными (по аналогии с формальными параметрами подпрограмм в языке программирования FORTRAN).
Так как вызов любой функции можно осуществить, написав произвольное выражение в командном окне MATLAB, то всегда имеется вероятность совершения ошибки, связанной с несовпадением типов фактических и формальных параметров. Это тем более опасно, что система MATLAB не выполняет соответствующую проверку их соответствия, а просто передает управление файл-функции. Для предотвращения возникновения подобных ошибочных ситуаций рекомендуется, по возможности, предусматривать проверку входных параметров в тексте файл-функций (для достижения этой цели может быть использован полный набор рассматриваемых далее конструкций управления).
Использование подфункций. В ряде случаев при написании файл-функций возникает потребность в создании и использовании так называемых подфункций (subfunctions), в которых выполняются промежуточные вычисления. Эти подфункции записываются после основных функций и имеют аналогичный им синтаксис, они являются локальными и могут выполняться лишь в пределах основной файл-функции. Файл-функция может включать одну или несколько подфункций.
Приведенную выше функцию stat можно переписать в виде функции, содержащей подфункцию:
function [mean,stdev]=stat_main(x)
% Основная функция
n=length(x);
mean=average(x,n);
stdev=sqrt(sum((x-average(x,n)).^2/n));
function mean=average(x,n)
% Подфункция
mean=sum(x)/n;
Здесь используется подфункция average с двумя входными и одним выходным параметром (аргументом), вычисляющим среднее значение элементов вектора x.
При обращении к функции интерпретатор системы MATLAB, прежде всего, просматривает M-файл на предмет выявления подфункций. В случае их обнаружения они задаются как локальные функции. Благодаря локальному действию подфункций их имена могут совпадать с именами основных функций системы.
Если в M-файле размещаются определения нескольких функций, то вызвать из командного окна MATLAB (или из функций другого M-файла) можно лишь ту из них, имя которой совпадает с именем M-файла. Таким образом, только одна функций из M-файла оказывается видимой вне этого файла, а остальные функции вызываются внутри данного M-файла и выполняют вспомогательные вычисления.
