Масштабирование 3 кругов постоянно, пока они не пересекутся

Я реализовал алгоритм позиционирования трилатерации в Python, и на данный момент результаты выглядят совсем не так, потому что на вычисленные расстояния влияют помехи сигнала, и поэтому это выглядит так:

текущий

когда это должно выглядеть примерно так:

ожидаемый

Поэтому я подумал об одновременном масштабировании кругов с использованием постоянного коэффициента, пока они все не пересекутся в одной точке (что было бы оптимально) или пока сумма их взаимных расстояний не станет минимальной. Учитывая координаты XY трех кругов в 2D-пространстве, а также их FSPL -расстояния от опорной точки (которая является центром одного из кругов), функция должна возвращать лучший коэффициент масштабирования, который минимизирует ошибку. Это должно быть что-то вроде этого:

def find_best_scaling_constant(p1, p2, p3, r1, r2, r3):
  # some magic here
  return scalingConstant

find_best_scaling_constant((0.00, 0.00), (3.15, -0.47), (4.90, 7.00), 1.12, 1.77, 0.18)

Я не математик, поэтому не знаю, имеет ли смысл эта логика, но если у кого-то есть комментарий или идея получше, поделитесь ими. Это было бы большим подспорьем!


person SalmaFG    schedule 23.05.2019    source источник
comment
Этот подход кажется странным - вы хотите подогнать собственное значение скорости света (фундаментальной константы)? Возможно, у вас неправильные значения радиусов.   -  person MBo    schedule 23.05.2019
comment
это может помочь вам найти ближайшее расстояние между 3 точками (по одной на каждом круге). three-points-on-three-circles" title="найти наименьшее суммарное расстояние между тремя точками на трех кругах">math.stackexchange.com/questions/2870952/   -  person Raphael    schedule 23.05.2019
comment
@MBo значения радиусов вычисляются на основе обнаруженного уровня сигнала в точках доступа (центрах кругов), что не очень точно из-за препятствий и отражений. На первом изображении приемник находился прямо рядом с синей точкой доступа, поэтому ее радиус такой маленький. Но он также обнаруживался двумя другими точками доступа, поэтому они должны пересекаться, если не было ошибки. Вот почему я подумал об их масштабировании, потому что отношения радиусов относительно правильные.   -  person SalmaFG    schedule 23.05.2019


Ответы (1)


Пусть окружности имеют центры с координатами:

введите здесь описание изображения

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

введите здесь описание изображения

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

введите здесь описание изображения

Аналогично, нам нужно найти точку введите описание изображения здесь в плоскости, которая является общей точкой пересечения трех окружностей, полученной путем масштабирования радиусов исходных окружностей с помощью общего коэффициента k, или в математической записи, нам нужно решить систему

введите здесь описание изображения

Ясно, что приведенные выше системы и свойство, записанное перед системой, эквивалентны.

Чтобы упростить задачу, возведите в квадрат обе части каждого уравнения из системы:

введите здесь описание изображения

По теореме Пифагора напишите

введите здесь описание изображения

Вот почему в явных формулах система трех квадратных уравнений, приведенная выше, на самом деле является квадратичной системой уравнений:

введите здесь описание изображения

который после переноса члена из правой части каждого уравнения в левую часть становится:

введите здесь описание изображения

Разверните все квадраты разностей в каждом уравнении и измените порядок членов:

введите здесь описание изображения

Чтобы упростить эту систему, вычтите второе уравнение из первого, затем вычтите третье уравнение из второго и сохраните одно из квадратных уравнений, скажем, сохраните первое квадратное уравнение:

введите здесь описание изображения

Идея поиска решения этой системы заключается в следующем:

введите здесь описание изображения

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

введите здесь описание изображения

и когда мы умножаем последнее матричное уравнение на обратную матрицу M:

введите здесь описание изображения

Запишем также в матричных обозначениях

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

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

введите здесь описание изображения введите здесь описание изображения

Обратите внимание, что квадратное уравнение имеет два решения для z. Тот, который я выбрал, с минусом, является первой точкой пересечения всякий раз, когда три круга являются внешними по отношению к каждому и с начальными непересекающимися радиусами. Существует также вторая точка пересечения, соответствующая положительному решению для z. Если у вас есть информация с четвертой башни, вы сможете выбрать правильную точку и, возможно, даже полностью линеаризовать задачу. Но только с этими доступными данными у вас есть два решения.

Я протестировал алгоритм на следующем примере ручной работы:

x1 = 0;  y1 = 0;  r1 = sqrt(13)/3;
x2 = 5;  y2 = 1;  r2 = sqrt(13)/3;
x3 = 3;  y3 = 7;  r3 = sqrt(17)/3;

и он выводит правильное местоположение

x = 2;  y = 3;  

и коэффициент масштабирования k = 3.

Я реализовал это в Matlab/Octave, потому что мне удобно работать с линейной алгеброй:

function [xy, k] = location_scaled(x1, y1, r1, x2, y2, r2, x3, y3, r3)

        M = 2*[x2 - x1  y2 - y1; 
               x3 - x2  y3 - y2];
        A = [r1^2 - r2^2; 
             r2^2 - r3^2];
        B = [x2^2 + y2^2 - x1^2 - y1^2; 
             x3^2 + y3^2 - x2^2 - y2^2];
        A = M\A;
        B = M\B;

        a = A'*A;
        b = 2*B'*A - 2*[x1  y1]*A - r1^2;
        c = [x1 y1]*[x1; y1] - 2*[x1  y1]*B + B'*B;

        k = (- b - sqrt(b^2 - 4*a*c)) / (2*a);

        xy = k*A + B;
        k = sqrt(k);

end
person Futurologist    schedule 24.05.2019
comment
Спасибо за Ваш ответ! Не могли бы вы объяснить, как вы получили члены r1^2, r2^2 и r3^2 в квадратных уравнениях? Насколько я понимаю, остальные выражения в этих уравнениях — это расстояния, полученные из теоремы Пифагора. - person SalmaFG; 26.05.2019
comment
@SalmaFG Я добавил правку с некоторыми дополнительными пояснениями. Посмотрите на это и дайте мне знать, если это то, о чем вы спрашиваете. Термины r1^2, r2^2, r3^2 происходят от трех радиусов r1, r2, r3 трех окружностей, которые вам даны, если я правильно понимаю предположения проблемы, которые вы опубликовали. - person Futurologist; 26.05.2019
comment
Да, это помогает, я проверю это, как только смогу, и дам вам знать! - person SalmaFG; 28.05.2019
comment
Я реализую уравнения, как вы сказали, но столкнулся с проблемой, когда радиусы имеют одинаковую длину. Я получаю деление на 0 в DET из-за (rj^2 - ri^2). Вы уверены в этом выражении? Я попытался решить систему уравнений вручную, чтобы перепроверить это, но я застрял. Как вам это удалось? - person SalmaFG; 30.05.2019
comment
@SalmaFG Ты прав. Когда два из радиусов (или все три) равны, в формулах, которые я написал, есть деление на ноль. Уравнения до конца редактирования являются правильными и общими, они применимы даже к равным радиусам. Однако для упрощения я поделил на разность rj^2 - ri^2, так как думал, что в реальных расчетах вряд ли получится ri = rj (но теперь, когда я думаю об этом, может быть, что ri^2 - rj^2 очень маленькое число, так что делить на него все же нехорошо). - person Futurologist; 30.05.2019
comment
@SalmaFG Однако это можно исправить, это вопрос умножения уравнений на соответствующие rk ^ 2 - rl ^ 2 вместо деления на rj ^ 2 - ri ^ 2. Я посмотрю на это и напишу редактирование позже сегодня. - person Futurologist; 30.05.2019
comment
Я согласен, маловероятно, что 2 радиуса точно такие же. Но и в тех случаях, когда их нет, я получал гигантские числа для коэффициента масштабирования. Кстати, я очень ценю всю вашу помощь до сих пор :) - person SalmaFG; 31.05.2019
comment
@SalmaFG Я отредактировал свой пост. Я написал выводы уравнений для наиболее подходящих случаев. Я предлагаю вам протестировать его с тремя кругами разумных местоположений и радиусов, прежде чем проверять его для более вырожденных случаев. - person Futurologist; 31.05.2019
comment
Я реализовал уравнения, и теперь они работают в обоих случаях! Я попробовал оба и обнаружил, что случай 1 действительно охватывает оба, как вы сказали :) Уравнения работают, хотя, когда решение существует, в противном случае оно возвращает некоторое число в качестве коэффициента масштабирования, и нет никакого способа узнать, является ли это правильным решением или нет, если я не нарисую круги с масштабированными радиусами и не посмотрю, пересекаются ли они. Есть ли математический способ узнать? - person SalmaFG; 01.06.2019
comment
@SalmaFG Я рад, что это работает. Мне нравится, когда все получается. С точки зрения существования решения, поскольку это линейная система уравнений, в случае 1, если det не равно нулю, то существует единственное решение. В случае 2, если знаменатель a12 * b23 - a23 * b12 не равен нулю, то существует единственное решение. Это теоремы из алгебры линейных систем (линейной алгебры). - person Futurologist; 01.06.2019
comment
Я только что проверил это, но, к сожалению, это не работает. Я опубликую свой код на случай, если вы захотите попробовать его сами. - person SalmaFG; 01.06.2019
comment
@SalmaFG У вас опечатка в первых трех выражениях вашего кода. Это должно быть r12 = r2**2 - r1**2 и r23 = r3**2 - r2**2 и r31 = r1**2 - r3**2 Я скопировал и вставил ваш код в свой пост с этими исправлениями. - person Futurologist; 02.06.2019
comment
Ой! Хотя я удивлен, что это сработало. На самом деле я только что попытался внести исправления и снова протестировать его в разных случаях, и он больше не работает. - person SalmaFG; 02.06.2019
comment
@SalmaFG Я нашел проблему. Я должен был знать лучше. Идея и уравнения верны, но я подумал (хотя должен был знать лучше), что мы могли бы решить задачу как линейную систему. Однако так поступить нельзя, так как одно из уравнений является избыточным и величина det = 0. Таким образом, линейная система недоопределена, что может означать, что недостаточно решить систему линейными методами, нам нужно квадратное уравнение. Теперь у меня есть правильный метод решения, и я его протестировал, но мне придется потратить некоторое время на его написание. - person Futurologist; 02.06.2019
comment
Я нашел эту библиотеку SciPy для нелинейных систем. Я еще не понимаю концепцию, но я все еще читаю об этом. Это может быть полезно: docs.scipy.org/doc /scipy/reference/generated/ - person SalmaFG; 02.06.2019
comment
@SalmaFG в этом нет необходимости. Я опубликую работающий код Matlab (надеюсь, вы сможете преобразовать его в Python). Позже я добавлю больше правок. - person Futurologist; 02.06.2019
comment
Я работаю над преобразованием Python, но мой Matlab очень ржавый, поэтому это может занять некоторое время. - person SalmaFG; 03.06.2019