У меня есть две системы, каждая из которых имеет датчик направления (0-360 градусов), но датчики могут давать совершенно разные значения в зависимости от ориентации каждой системы и линейности каждого датчика. У меня есть механическая ссылка, которую я могу использовать для создания таблицы, в которой каждая система фактически указывает. Это дает таблицу с тремя столбцами:Циркулярная интерполяция в Python
Physical SystemA SystemB
-------- ------- -------
000.0 005.7 182.3
005.0 009.8 178.4
... ... ...
С показаны только данные, мы можем видеть, что SYSTEMA не далеко от физической ссылки, но SYSTEMB составляет около 180 градусов прочь, и идет в обратном направлении (представьте, что он установлен вверх дном).
Мне нужно иметь возможность сопоставлять между всеми тремя значениями: если сообщение SystemA что-то находится в 105.7, мне нужно сообщить пользователю, какое именно физическое направление, а затем сообщить SystemB о том же местоположении. То же самое, если SystemB делает первоначальный отчет. И пользователь может запросить обе системы указать желаемое физическое направление, поэтому SystemA и SystemB необходимо будет указать, где указать.
Линейная интерполяция не сложна, но у меня возникают проблемы, когда данные идут в противоположных направлениях и являются модульными/циклическими.
Есть ли способ для Pythonic делать все эти сопоставления?
EDIT: Давайте сосредоточимся на наиболее сложном случае, когда мы имеем два спаренных списка значений:
A B
----- -----
0.0 182.5
10.0 172.3
20.0 161.4
... ...
170.0 9.7
180.0 359.1
190.0 348.2
... ...
340.0 163.6
350.0 171.8
Скажем, списки поступают из двух различных радаров с указателями, которые не выровнены по Север или что-то еще, но мы вручную взяли вышеуказанные данные, перемещая цель вокруг и видя, где каждый радар должен был указать, чтобы увидеть это.
Когда радар А говорит: «У меня есть цель в 123.4!», Где мне нужно прицелиться в радар B, чтобы увидеть его? Если радар B находит цель, где я должен указывать радар A?
Список A Обертывание между последним и первым элементом, но список B располагается ближе к середине списка. Список A монотонно возрастает, а список B монотонно уменьшается. Обратите внимание, что размер степени на А, как правило, не совпадает с размером степени на В.
Есть простой интерполятор, который будет обернуть правильно, когда:
Интерполирующие из списка А в список B .
Интерполирующие из списка B в список A.
это нормально использовать два отдельных интерполятор инстанциацию, один для собирается в каждом направлении. Я предполагаю, что линейный (первый порядок) интерполятор в порядке, но я, возможно, захочу использовать более высокую или сплайнную интерполяцию в будущем.
В некоторых случаях тест:
A = 356.7, В =?
A = 179.2, B =?
Можно ли рассчитывать, что показания датчика будут с простым уравнением, как 'SYSTEMA = (физический * коэффици- + смещение)% 360' или являются значения достаточно нелинейные, чтобы сделать это нецелесообразным? Если это так, вы можете просто использовать алгебру для решения любого неизвестного значения с учетом любого известного.Если нет, то вы, вероятно, правы в необходимости интерполяции. Модульная интерполяция обычно не так уж плоха, вам просто нужно проверить, являются ли точки, которые вы интерполируете, больше, чем «модуль/2» (например, на 180 градусов) друг от друга, что указывает на то, что кратчайший путь между ними обертывается. – Blckknght
Ваш пример не имеет смысла. Показания для B продолжают уменьшаться до последних 2, где они увеличиваются, плюс они уже меньше тех, что находятся в верхней части списка. Если вы исправите это, я смогу показать некоторый пример кода с моим ответом. –
Общий комментарий для интерполяции угловых данных, который может оказать некоторую помощь. Очень полезно разбить данные на единичные компоненты и выполнить индивидуальную интерполяцию на компонентах, а затем рекомбинировать результирующие интерполяции с помощью секторального метода arctan (например, arctan2 (y, x)). –