8(495)909-90-01
8(964)644-46-00
pro@sio.su
Главная
Системы видеонаблюдения
Охранная сигнализация
Пожарная сигнализация
Система пожаротушения
Система контроля удаленного доступа
Оповещение и эвакуация
Контроль периметра
Система домофонии
Парковочные системы
Проектирование слаботочных сетей
Аварийный
контроль
Раздел: Документация

0 ... 150 151 152 153 154 155 156 ... 365

i Сначала where =0, т. е. пока нет ни одного нужного круга where = 0;

% Скачала число кругов, содержащих точку, равно нулю NC = 0;

i Перебор кругов в цикле for i = l:Ncircle

% Вычисление расстояния от точки до центра текущего круга dist = sqrt((Xpoint - Xcircle(i))Л2 + (Ypoint - Ycircle(i))Л2); % Сравнение расстояния с радиусом круга if dist <= Rcircle(i)

where =1; % Требуемый круг найден

% Увеличение числа найденных кругов на единицу

NC = NC + 1;

% Сохранение номера круга в массиве Nums Nums(NC) = i;

end

end

% Запись полученных результатов в выходной массив ячеек в зависимости % от числа выходных аргументов, с которыми была вызвана point switch nargout case(2)

% Было указано два выходных аргумента, следовательно, надо записать % только число кругов в первую ячейку varargout varargout{1} = NC; case (3)

% Было указано три выходных аргумента, следовательно, надо записать % число кругов и массив с их номерами в первые две ячейки varargout varargout(l) = NC; varargout{2) = Nums;

end

Итак, написание файл-функции с переменным числом входных и выходных аргументов не представляет большого труда, но требует понимания работы с массивами ячеек. в качестве упражнения измените файл-функцию point так, чтобы она содержала два обязательных входных аргумента — координаты точки. Заголовок point должен выглядеть следующим образом:

function [where, varargout] = point(рх, ру, varargin)


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

Функции от функций

Предположим, что для исследования функций требуется запрограммировать собственный алгоритм, который должен оперировать с достаточно большим набором функций. Алгоритм естественно оформить в виде файл-функции, но тогда при работе с новой функцией придется внести изменения в М-файл. MATLAB предоставляет возможность написания файл-функций, входными аргументами которых являются другие файл-функции (функции fminsearch, fzero, quad, описанные в главе б, подразумевают именно такой способ вызова).

Имя файл-функции передается в строковой переменой, а ее вычисление производится при помощи команды feval. Например, синус можно вычислить обычным способом, вызвав sin(x), или используя feval с входными аргументами — названием sin" и аргументом х:

» х = pi/2;

» feval(sin, х)

ans =

1

Первый входной аргумент feval может быть и указателем на inline-функцню или анонимной функцией, результат будет аналогичный:

» feval (Ёsin, х)

ans =

1

В общем случае все входные аргументы исследуемой функции задаются в списке аргументов feval через запятую после имени функции, например, следующие три вызова некоторой функции myfun эквивалентны:

[а, b] = myfun(х, у, г)

[a, b] = feval("myfun", х, у, z)

[а, Ь] = feval(@myfun, х, у, z)

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


ром ищется корень, и точность вычислений. Алгоритм метода половинного деления очень простой.

1.Проверить, что на границах отрезка /(я) принимает значения разных знаков.

2.Если длина отрезка меньше заданной точности, взять в качестве приближенного значения корня любую из его границ.

3.Найти среднюю точку отрезка и вычислить в ней значение функции. Если в центре отрезка функция равна нулю, то корень найден и вычисления останавливаются.

4.В качестве нового отрезка выбрать ту половину, на границах которой знаки f(x) различны, и продолжить вычисления с п. 2.

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

» г = half [myf, а, Ь, е) ИЛИ

» г = half(@myf, а, Ь, е)

Здесь myf — имя исследуемой функции; а и b — границы первоначального отрезка; е — точность вычислений.

Листинг 8.27. Файл-функция half для решения уравнений методом \половинного деления

function root = half(fname, left, right, epsilon) % файл-функция находит корень уравнения f(х) =0 % методом половинного деления % Использование

% root = half(fname, left, right, epsilon) %fname — имя файл-функции, вычисляющей f(x)

%left, right — левая и правая границы отрезка

%epsilon — точность вычислений

% Проверка значений функции на границах отрезка if feval(fname, left)*feval(fname, right) > 0

error(1Одинаковые знаки функции на границах отрезка)

end

% Деление отрезка пополам while (right — left) > epsilon



0 ... 150 151 152 153 154 155 156 ... 365