Смекни!
smekni.com

Система математических расчетов MATLAB (стр. 22 из 30)

Как MATLAB передает аргументы функции

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

Рабочие пространства функций

Каждая М-функция имеет в памяти свое рабочее пространство, отдельное от основного рабо-чего пространства MATLAB-а, в котором она работает. Это пространство называется рабо-чим пространством функции, причем разные функции имеют разные рабочие пространства.

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

Проверка числа аргументов функции

Функции nargin и nargout позволяют вам определить число входных и выходных аргумен-тов функции. Вы можете использовать эти функции с условными операторами для выполне-ния различных задач в зависимости от числа аргументов. Например,

function c = testarg1(a,b)

if (nargin == 1)

c = a.^2;

elseif (nargin == 2)

c = a + b;

end

При одном входном аргументе, данная функция вычисляет квадрат входной величины. Если заданы два входных аргумента, функция осуществляет их сложение.

Передача переменного числа аргументов

Функции varargin и varargout дают возможность передачи функции любого переменного числа аргументов или возвращать переменное число выходные аргументов. При использова-нии функци varargin MATLAB объединяет все заданные входные аргументы в массив яче-ек. Если вы используете функцию varargout, то ваша программа должна обеспечить объе-динение выходных переменных в массив ячеек, с тем чтобы MATLAB имел возможность вернуть их в пространство вызова. Ниже дан пример функции, которая принимает любое число двумерных векторов, и наносит на графике линию, соединяющую соответствующие точки.

function testvar (varargin)

for i = 1:length (varargin)

x(i) = varargin{i}(1);

y(i) = varargin{i}(2);

end

xmin = min(0,min(x));

ymin = min(0,min(y));

axis([xmin fix(max(x)) + 3 ymin fix(max(y)) + 3])

plot(x,y)

Функция testvar рабоает с различным числом входных переменных; например, вы можете ввести два различных набора данных

testvar ([2 3], [1 5], [4 8], [6 5], [4 2], [2 3])

testvar ([–1 0], [3 –5], [4 2], [1 1])

Распаковка содержимого функции varargin

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

y(i) = varargin{i} (2);

Индексация ячеек имеет два набора компонент – первый набор указывает ячейку и заключен в фигурные скобки, а второй набор относится к содержимому ячейки и заключен в обычные скобки. В приведенном выше операторе выражение {i} обозначает обращение к i-ой ячейке в varargin, а выражение (2) представляет второй элемент содержимого выбранной ячейки.

Упаковка выходных переменных в функцию varargout

Когда вы хотите использовать произвольное число выходных аргументов, вы должны преду-смотреть процедуру упаковки выходных переменных в массив ячеек varargout. При этом, для определения конкретного числа вызываемых выходных аргументов используйте функ-цию nargout. Например, приведенный ниже пример принимает входной массив в виде двух столбцов, где первый столбец характеризует набор данных по оси x, а второй столбец – соот-ветствующий набор данных по оси y . Данные наборы разбиваются на отдельные пары век-торов [xi yi], которые вы можете передать описанной выше функции testvar.

function [varargout] = testvar2 (arrayin)

for i = 1:nargout

varargout {i} = arrayin (i, :)

end

Оператор присваивания в цикле for использует синтаксис индексации массивов ячеек. Вот пример применения функции testvar2:

a = {1 2; 3 4 ; 5 6 ; 7 8; 9 0};

[p1, p2, p3, p4, p5] = testvar2 (a);

Место функций varargin и varargout в списке аргументов

Функции varargin или varargout должны быть последними в списке аргументов, при этом они могут быть расположены после любого числа входных или выходных переменных. Это значит, что в строке определения функции следует сперва указать требуемые входные или выходные аргументы. Например, следующие строки определения функций показывают правильное применение varargin и varargout.

function [out1,out2] = example1(a,b,varargin)

function [i,j,varargout] = example2(x1,y1,x2,y2,flag)

Локальные и глобальные переменные

Каждая исполняемая функция MATLAB-а, определенная некоторым М-файлом, имеет свои собственные локальные переменные расположенные в своем рабочем пространстве, которые отделены от локальных переменных других функций и переменных в основном рабочем про-странстве. Однако, если несколько функций и, возможно, основное рабочее пространство, объявляют некоторую конкретную переменную глобальной, то все эти функции и основное рабочее пространство будут иметь доступ к данной переменной. Любое изменение глобаль-ной переменной, произведенное в пространстве какой-либо одной функции, немедленно воспринимается всеми остальными функциями, где эта переменная объявлена глобальной. Допустим, вы хотите изучить эффект изменения коэффициентов взаимосвязей a и b, в диф-ференциальном уравнении Лотки-Вольтера (Lotka-Volterra), известного как модель хищника-жертвы.

dy1/dt = y1 - ay1y2

dy2/dt = y2 - by1y2

Создадим М-файл lotka.m.

function yp = lotka(t,y)

global ALPHA BETA

yp = [y(1) – ALPHA*y(1)*y(2); –y(2) + BETA*y(1)*y(2)];

Затем введем последовательно в командное окно следующие выражения

global ALPHA BETA

ALPHA = 0.01

BETA = 0.02

[t,y] = ode23('lotka',0,10,[1; 1]);

plot(t,y)

Объявление переменных ALPHA и BETA глобальными в командной строке позволяет ме-нять соответствующие значения внутри функции заданной файлом lotka.m. Интерактивное изменение данных переменных в командном окне приводит к получению новых решений без каких-либо редактирований текста файла.

Для работы в ваших приложениях с глобальными переменными следует:

- Объявить соответствующую переменную глобальной в каждой функции, где пре-дусмотрено ее использование. Для обеспечения доступа к глобальной переменной из командного окна нужно объявить данную переменную глобальной также и в командной строке.

- В каждой функции объявите переменную глобальной до первого появления ее имени в тексте файла. Обычно рекомендуется объявлять переменные глобальными в начале М-файла.

Глобальные переменные в MATLAB-е обычно имеет более длинные имена и иногда записы-ваются заглавными буквами.Это не является настоятельным требованием, но упрощает чте-ние файлов и уменьшает риск случайного изменения глобальной переменной.

Перманентные переменные (Persistent Variables)

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

Для работы с перманентными переменными в MATLAB-е предусмотрены три функции:

Функция

Описание

mlock Исключает возможность удаления М-файла из памяти
munlock Возвращает М-файлу возможность его удаления из памяти
mislocked Указывает, может ли М-файл быть удален из памяти

Специальные переменные

Несколько функций возвращают важные специальные значения, которые вы можете исполь-зовать в ваших М-файлах.

Функция

Возвращаемое значение

ans

Последний ответ (переменная). Если вы не присваиваете выходной переменной или вычисляемому выражению какое-либо имя, MATLAB автоматически запоминает результат в переменной ans.

eps

Относительная точность вычислений с плавающей запятой. Это допуск, который MATLAB использует при вычислениях.

realmax

Наибольшее число с плавающей запятой.

realmin

Наименьшее число с плавающей запятой.

pi

3.1415926535897...

i, j

Мнимая единица.

inf

Бесконечность. Вычисления вида n/0 где n – любое ненулевое реально число, дает в результате inf.

NaN

Не численное значение (Not-a-Number). Выражения вида 0/0 и inf/inf дают в результате NaN, так же как и арифметические операции содержащие NaN. Выражения типа n/0, где n явля- ется комплексным числом, также возвращают NaN.

computer

Тип компьютера.

version

Строка, содержащая версию MATLAB-а.

Вот несколько примеров, где используются эти переменные.