Решение задачи нахождения углов установки видеокамеры над дорогой разными методами в Wolfram Mathematica. Часть 2

от автора


В прошлый раз мы загрузили данные из файла, разобрали их в структуру, получили уравнения треков движения ТС и графически отобразили эти данные: Часть 1

В данной статье одним из методов найдем статистически точку, в окрестностях которой пересекаются треки движения ТС.

Описание одного из способов нахождения интересующей нас точки

В данном методе найдем все точки пересечения графиков — треков движения ТС, найдем математическое ожидание этих данных и дисперсию.

Нахождение всех точек пересечения треков

Определим количество уравнений в списке с уравнениями:

length = Length[numeq];

Создадим пустой список, в который будем записывать координаты точек пересечения трэков:

rootlist = {};

Теперь необходимо написать цикл. который будет решать попарно имеющиеся у нас линейные уравнения и находить координаты их пересечения и записывать в подготовленный список::

Do[Do[rootlist = Append[rootlist, List[
x /. Solve[numeq[[j]] == numeq[[i]], x][[1]],
numeq[[j]] /. Solve[numeq[[j]] == numeq[[i]], x][[1]]
]
]
, {i, 1 + j, length}],
{j, 1, length}]

На каждом проходе цикла мы добавляем к rootlist список, состоящий из координаты x и y пересечения j и i уравнения, при этом координата x находится как:

x /. Solve[numeq[[j]] == numeq[[i]], x][[1]]

, при этом

Solve[numeq[[j]] == numeq[[i]], x]

возвращает список корней данного уравнения:

{{x -> 2586.14}}

, а наша запись выделяет первый корень, он тут единственный, и выполняет подстановку, т.е. вместо x перед оператором /. подставляется его значение x -> 2586.14.

expr /. x > value – в выражение expr вместо переменной x подставляется ее
значение value.

Таким образом находится координата X пересечения двух треков, аналогичное действие производится и для нахождения координаты Y, только значение корня теперь подставляется в одно из уравнений, в данном случае в индексом j, при этом это может быть и уравнение с индексом i:

numeq[[j]] /. Solve[numeq[[j]] == numeq[[i]], x][[1]]

Далее округлим значение наших точек до целого:

rootlist = Round[rootlist];

Теперь мы имеем список точек пересечений трэков и можемпристапать к статистической обработке.

Список выглядит таким образом:

{{2586, -910}, {2716, -1014}, {2718, -1015}, {3566, -1697}, {2697, -999}, {2957, -1207}, ... }

Статистическая обработка результатов

Определим мат ожидание координаты X списка пересечений:

Xmed = Mean[rootlist[[All, 1]]] // N
2532.7

Mean[data] – возвращает среднее значение данных data.

N[expr, n] — возвращает результат вычисления выражения expr с точностью до n знаков после десятичной точки

x // f — Постфиксная форма для f[x]

Определим дисперсию координаты X списка пересечений:

sX = StandardDeviation[rootlist[[All, 1]]] // N
81038.5

StandardDeviation[data] – возвращает стандартное отклонение данных, говоря русским языком — функция возвращает сигму, ну или среднеквадратичное отклонение.

Определим те же характеристики для Y координаты пересечения:

Ymed = Mean[rootlist[[All, 2]]] // N
sY = StandardDeviation[rootlist[[All, 2]]] // N
-699.907
106488

Из полученных данных математических ожиданий уже можно определить искомые величины — угол поворота видеокамеры относительно края обочины:

Xangle = Xang Xmed/Xlen - Xang/2 // N
8.02449

, и угол наклона видеокамеры относительно траекторий движения транспортных средств

Yangle = Abs[Yang Ymed/Ylen - Yang/2] // N
9.38796

Вообще, такое большое значение среднеквадратичного отклонения несколько смущает. построим гистограмму что-бы посмотреть распределение величин и выяснить, почему так происходит:

Histogram[
{rootlist[[Range[length], 1]],
rootlist[[Range[length], 2]]},
100, AspectRatio -> 1]

Histogram[list,bspec] — строит гистограмму списка list с количеством столбцов bspec

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

Попробуем не принимать во внимание точки, не удовлетворяющие следующими условию:

X координата точки должна лежать в пределах [-разрешение камеры по горизонтали; 2 разрешения камеры по горизонтали]
Y координата точки должна лежать в пределах [- 2 разрешения камеры по вертикали; 0.5 разрешения камеры по вертикали]

Для этого напишем следующее:

length = Length[rootlist];
rlist = {};
Do[If[
-Xlen < rootlist[[i, 1]] < 2 Xlen && -2 Ylen < rootlist[[i, 2]] < 0.5 Ylen,
rlist = Append[rlist, rootlist[[i]]]]
, {i, length}]

If[condition, t, f] – возвращает t, если результатом вычисления condition будет True, и даст f, если результат False

And[p,q,...] или p && q && ... — логическое сложение – операция «И»;

Оценим мат ожидание и среднеквадратичное отклонение получившейся отфильтрованной выборки:

Xmed = Mean[rlist[[Range[length], 1]]] // N
Ymed = Mean[rlist[[Range[length], 2]]] // N
sX = StandardDeviation[rlist[[Range[length], 1]]] // N
sY = StandardDeviation[rlist[[Range[length], 2]]] // N
2628.84
-928.819
353.112
457.717

Получившийся разброс отфильтрованной выборки меньше, чем у полной выборки. Определить искомые углы можно так-же, как и в случае с полной выборкой.

Графическое представление результатов

Теперь отобразим на одном графике точки пересечения по отфильтрованной выборке и функцию распределения координаты X точек пересечения:

lp = ListPlot[rlist, PlotStyle -> PointSize[0.0005], GridLines -> {{Xlen, Xmed}, {Ylen, Ymed}}, AspectRatio -> Automatic];
dp = Plot[-1000000 PDF[NormalDistribution[Xmed, sX], x], {x,1000, 4000}, PlotStyle -> {Red}];
Show[lp, dp, PlotRange -> {{0, 4000}, {-2000, 1000}}, AxesOrigin -> {0, 0}]

PDF[dist,x] – возвращает значение плотности вероятности распределения при аргументе x и заданном законе распределения dist

NormalDistribution[mu,sigma] – нормальное распределение

Я немного схитрил и поставил коэффициент -1000000 для наглядности графика.

Что дальше?

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

Стоит ли писать статьи, связанные с Wolfram Mathematicа и анализом линейных данным, их обработкой и последующей визуализацией?

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Никто ещё не голосовал. Воздержавшихся нет.

ссылка на оригинал статьи http://habrahabr.ru/post/176301/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *