Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы оптимизации в радиотехнических системах. Практикум
.pdf
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
