Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основы оптимизации в радиотехнических системах. Практикум

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
21. Сохранить изменения файла fillTrace.m;
22. В текстовом редакторе среды Matlab создать новый файл и сохра-
нить его под именем getGradients.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab4;
23. В файле getGradients.m поместить заголовок файла-функции:
function gradients = getGradients(trace1, trace2)
%--------------------------------------------
% Функция выполняет поиск векторов % максимального прироста мощности, % направленных от trace1 к trace2 % Формат входов: [x, y, p] % Выход: массив в формате [xA yA xB yB] % где A - начальная точка вектора, B - конечная.
24. В файле getGradients.m поместить следующий программный код (после имеющегося кода):
gradients = []; for i = 1 : length(trace1) % Точка начала вектора base = trace1(i, 1 : 3); % Точка конца вектора direction = []; % Максимальное значение отношения разницы % мощностей к расстоянию. gradientPowerFactor = 0; for j = 1 : length(trace2) % Расстояние len=hypot(base(1)-trace2(j, 1),... base(2)-trace2(j, 2)); % Разница мощностей powerDifference=trace2(j, 3)-trace1(i, 3); % Отношение разницы мощностей к расстоянию. powerFactor = powerDifference / len; if(powerFactor > gradientPowerFactor) gradientPowerFactor = powerFactor; direction = trace2(j, 1:3); end; end; if(gradientPowerFactor > 0) % Сохранение вектора gradients = [gradients;...
61
[base(1:2) direction(1:2)]]; end; end;
25. Сохранить изменения файла getGradients.m;
26. В текстовом редакторе среды Matlab создать новый файл и сохра-
нить его под именем intersection.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab4;
27. В файле intersection.m поместить заголовок файла-функции:
function is = intersection(G1 , G2)
%--------------------------------------------
% Функция, определяющая, пересекаются ли % данные две линии. % Для пересекающихся линий вычисляется % точка пересечения. % Возвращает массив из трех элементов :
% 1 - тип пересечения (0 - не пересекает, % 1 - вне границ, 2 - в границах). % 2 - координата х точки пересечения. % 3 - координата у точки пересечения. % Алгоритм базируется на алгоритме % "Faster Line Segment Intersection" % из книги Graphics Gems III's
28. В файле intersection.m поместить следующий программный код
(после имеющегося кода):
is = zeros(1, 3); % pt2 - pt1; a = [(G1(3) - G1(1)) (G1(4) - G1(2))]; % l.pt1 - l.pt2; b = [(G2(1) - G2(3)) (G2(2) - G2(4))]; % pt1 - l.pt1; c = [(G1(1) - G2(1)) (G1(2) - G2(2))]; % a.y() * b.x() - a.x() * b.y(); denominator = a(2) * b(1) - a(1) * b(2); if (denominator == 0 ) is(1) = 0; % Не пересекаются; else reciprocal = 1 / denominator; % (b.y()*c.x() - b.x()*c.y())*reciprocal;
62
na = (b(2)*c(1) - b(1)*c(2))*reciprocal; % pt1 + a * na; intersectionPoint =... [(G1(1) + a(1)*na) (G1(2) + a(2)*na)];
is(2:3) = intersectionPoint; if (na < 0 || na > 1) is(1) = 1; % Вне границ; else % (a.x()*c.y()-a.y()*c.x()) % * reciprocal; nb = (a(1) * c(2) - a(2) * c(1)) *... reciprocal;
if (nb < 0 || nb > 1) is(1) = 1; % Вне границ; else is(1) = 2; % В границах; end; end; end;
29. Сохранить изменения файла intersection.m;
30. В текстовом редакторе среды Matlab создать новый файл и сохра-
нить его под именем pointOnSegment.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab4;
31. В файле pointOnSegment.m поместить заголовок файла-функции:
function lean = pointOnSegment(line, point) %--------------------------------------------
% Функция возвращает 1, % если точка лежит на отрезке. % Алгоритм основан на вычислении расстояний % между точкой и каждым из концов. Для точки, % лежащей на отрезке, их сумма % будет равна длине отрезка
32. В файле pointOnSegment.m поместить следующий программный код (после имеющегося кода):
g1=hypot((point(1)-line(1)),(point(2)-line(2))); g2=hypot((point(1)-line(3)),(point(2)-line(4))); g3=hypot((line(3)-line(1)),(line(4)-line(2)));
63
lean = abs(g1 + g2 - g3) < 0.00001;
33. Сохранить изменения файла pointOnSegment.m;
34. В текстовом редакторе среды Matlab создать новый файл и сохра-
нить его под именем onPositiveDirection.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab4;
35. В файле onPositiveDirection.m поместить заголовок файла-фун-
кции:
function positive = onPositiveDirection(gradient, point)
%--------------------------------------------
% Функция возвращает 1, если точка лежит % на продолжении вектора % в положительном его направлении
%--------------------------------------------
36. В файле onPositiveDirection.m поместить следующий программ-
ный код (после имеющегося кода):
% Отрезок между точкой и концом вектора. segment=[point(1) point(2) gradient(3) gradient(4)]; % Начало вектора не должно лежать на этом отрезке
positive=~pointOnSegment(segment, gradient(1:2));
37. Сохранить изменения файла onPositiveDirection.m;
38. В текстовом редакторе среды Matlab создать новый файл и сохра-
нить его под именем splitTrace.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab4;
39. В файле splitTrace.m поместить заголовок файла-функции:
function splitIndex = splitTrace(trace)
%--------------------------------------------
% Функция производит разбиение траектории % движения РПДУ на два участка, % подходящих для оценки градиентов. % Возвращает индекс элемента во входном массиве [x y p], % с которого следует производить разбиение
64
40. В файле splitTrace.m поместить следующий программный код (по- сле имеющегося кода):
dx = 0; dy = 0; averagePeriod = 4; minimumSplitAngle = 120; firstVector = []; splitIndex = 0; for i = 2 : length(trace) dx = [dx; trace(i, 1) - trace(i - 1, 1)]; dy = [dy; trace(i, 2) - trace(i - 1, 2)];
dxAverage = 0; dyAverage = 0; if(i >= averagePeriod + 1) for j = i - (averagePeriod - 1) : i dxAverage = dxAverage + dx(j); dyAverage = dyAverage + dy(j); end; dxAverage = dxAverage / averagePeriod; dyAverage = dyAverage / averagePeriod; direction = [0 0 dxAverage dyAverage]; if(i == averagePeriod + 1) firstVector = direction; else a = angleTo(firstVector, direction); if((a >= minimumSplitAngle) ... && (a <= (360 - minimumSplitAngle))) splitIndex = i; end; end; end; if(splitIndex ~= 0) break; end; end;
41. Сохранить изменения файла splitTrace.m;
42. В текстовом редакторе среды Matlab создать новый файл и сохра-
нить его под именем pelengator.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab4;
65
43. В файле pelengator.m поместить заголовок файла-функции:
function pelengator(trace, minAngle) %--------------------------------------------
% Функция обеспечивает оценку предполагаемого % положения РПДУ
44. В файле pelengator.m поместить следующий программный код
(после имеющегося кода):
hold on; xlabel('x'); ylabel('y'); %-------------------------------------------­% Разбиение траектории splitIndex = splitTrace(trace); trace1 = trace(1 : (splitIndex - 1), :); trace2 = trace(splitIndex : length(trace), :); %-------------------------------------------­% Вывод траектории на график plot(trace1(:,1), trace1(:,2), '> b'); plot(trace2(:, 1), trace2(:,2), '< b'); %--------------------------------------------
% Оценка градиентов мощности для каждой % точки траектории РПУ
gradients12 = getGradients(trace1, trace2); gradients21 = getGradients(trace2, trace1); if(length(gradients12) > length(gradients21)) gradients = gradients12; else gradients = gradients21; end;
% Вывод массива оценок градиентов на график gradientsCount = length(gradients) for i = 1 : (gradientsCount)
gradients(i,:); x = [gradients(i, 1) gradients(i, 3)]; y = [gradients(i, 2) gradients(i, 4)]; plot(x,y, 'r'); end;
%-------------------------------------------­% Поиск точек пересечения векторов
66
intersections = []; for i = 1 : (gradientsCount/ 2 + 1)
for j = 1 : gradientsCount gradient1 = gradients(i, :); gradient2 = gradients(j, :); if(i ~= j) intersect = intersection(gradient1, gradient2); % Точка пересечения point = [intersect(2:3)]; % Пересечение векторов вне их границ if((intersect(1) == 1) &&... onPositiveDirection(gradient1, point)&&... onPositiveDirection(gradient1, point)&&... angleAccepted(gradient1,gradient2,minAngle)) % Вывод продолжений векторов на график intersections = [intersections; point]; x = [gradient1(3) point(1)]; y = [gradient1(4) point(2)]; plot(x, y, '-- c'); x = [gradient2(3) point(1)]; y = [gradient2(4) point(2)]; plot(x, y, '-- c'); % Вывод точки пересечения на график x = point(1); y = point(2); plot(x, y, '+ g'); end; end; end; end;
%--------------------------------------------
% Поиск предполагаемой точки положения РПДУ intersectionsCount = length(intersections) if(intersectionsCount > 0)
source = averagePoint(intersections) x = source(1); y = source(2); plot(x, y, 'O k'); end;
legend('Forward', 'Backward', 'Gradient');
67
45. Сохранить изменения файла pelengator.m;
46. В текстовом редакторе среды Matlab создать новый файл и сохра-
нить его под именем gradientApp.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab4;
47. В файле gradientApp.m поместить следующий программный код:
%-------------------------------------------­% Главный файл приложения. clear all; %--------------------------------------------
% Настройки алгоритма % Минимальный угол пересечения векторов
minimumAngle = 15 %--------------------------------------------
% Настройки модели % Положение РПДУ
Xc = -5 Yc = 80
C = [Xc Yc] % Значение мощности в непосредственной % близости к РПДУ
dBmc = -60 % Ширина поля width = 100 %--------------------------------------------
% Описание траектории движения % радиоприемного устройства.
pelengator(fillTrace(Xc, Yc, dBmc, width),... minimumAngle); plot(Xc, Yc, 'm O');
48. Сохранить изменения файла gradientApp.m;
49. Выполнить поиск источника сигнала путем запуска файла-
сценария gradientApp.m. Для этого в главном окне среды Matlab следует
выполнить следующую команду:
>> gradientApp
68
Контрольные вопросы
1. Приведите последовательность команд, необходимую для вычис- ления координат местоположения РПДУ в программной среде Matlab. По­ясните назначение каждой приведенной команды.
2. Как формируется траектория движения РПУ в окрестности распо­ложения источника сигнала?
3. Приведите последовательность действий при выполнении поиска источника сигнала на основе оценки градиента мощности излучения.
4. Назовите основные достоинства и недостатки определения место­положения источника сигнала на основе оценки градиента мощности из­лучения.
5. Как оценивается градиент функции P = f(x1, x2) в данной практи­ческой работе?
6. Как определяется евклидово расстояние между двумя точками в многомерном пространстве?
7. Как вычисляются координаты местоположения источника сигнала на основе оценок градиента в точках траектории?
8. Как оценивается градиент многомерной функции на основе конеч- ных разностей первого порядка?
9. Перечислите известные вам разновидности методов градиентного спуска и кратко изложите их суть. Какие ограничения имеют градиентные методы?
10. Как определяются погрешности вычисления координат местопо­ложения РПДУ?
69
П РАКТИЧЕСКАЯ РАБОТА № 5
РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
ВЫЧИСЛИТЕЛЬНОГО УСТРОЙСТВА
КЛАССИФИКАЦИИ ДАННЫХ
Цель работы
Получение навыков разработки ПО вычислительных устройств, вы-
полняющих классификацию данных на основе обучающей выборки.
Задание к работе
1. Разработать ПО, реализующее процедуру технического обучения
устройства классификации данных на основе обучающей выборки.
2. Выполнить обработку тестирующих выборок данных.
3. Сделать выводы по результатам работы.
Пояснения к работе
Во многих областях техники очень часто возникает задача создания устройств, которые бы выполняли разделение объектов в пространстве признаков [34]. Подобные задачи имеются в радиолокации [35], техниче­ской и медицинской диагностике [34, 36], системах управления подвиж­ными объектами и т. д. Методы разделения в пространстве признаков ос­нованы на естественной «гипотезе компактности» [34]. В соответствии с данной гипотезой точки, отображающие один класс (одно состояние, один диагноз и т. д.), группируются в одной области пространства.
В общем случае задача разделения в пространстве признаков может быть сформулирована следующим образом. На вход вычислительного устройства последовательно поступают векторы, характеризующие неко­торые объекты, при этом каждый вектор должен быть отнесен к одному из известных классов. Задача построения устройства сводится к задаче нахо­ждения некоторой разделяющей функции [34].
В самом простом случае векторы в пространстве признаков могут быть разделены с помощью линейной разделяющей функции (в случае многомерного пространства – с помощью плоскости или гиперплоскости). Пример построения разделяющей функции для векторов, состоящих из
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]