LINUX.ORG.RU

На каких структурах сделать «табличную» функцию с плавающими опорными точками?

 


0

1

Мне нужна «двумерная» табличная функцию, где табличку будут заполнять на лету.

F(ток, обороты) => напряжение

Проблема в том, что пара [ток, обороты] никогда не попадет строго в сетку. И вообще равномерность никто не гарантирует.

Надо запоминать что есть, и по мере появления достаточно близких точек делать интерполяцию. Если близких точек нет - говорить что «тут пока данных не хватает».

С одномерной табличкой вопросов нет - там просто сортированный массив и поиск половинным делением. А с двумерной уже непонятно. Поступать как с гео-координатами (чередовать биты) не катит, т.к. параметры вообще разных типов, и непонятно как их нормализовать чтобы операции сравнения над перемешанными битами имели смысл.

И второй момент, данные могут устаревать (например щетки пылью забились, параметры поплыли). Но вероятность получить обновление в той же самой точке равна нулю. Можно попасть только «где-то рядом». Соответственно, надо как-то определять, что соседние точки сильно поехали, и как-то их корректировать или удалять.

Какие есть варианты?

★★★★★

А как понять что точки близкие? Есть уже некий набор готовый с неким шагом относительно тока или оборотов?

LINUX-ORG-RU ★★ ()

Но вероятность получить обновление в той же самой точке равна нулю.

Так у тебя количество данных взорвётся не? На каждый уникальный чих будут новые данные.

Может надо как то наоборот иметь что-то фиксированное? Тоесть есть максимальное количество оборотов от 0 до 1500 например и тогда будут1500 фиксированных значений что на такие то обороты нужен такой ток и напряжение, но если напряжение выставилось и ток, а обороты ниже то поднимать первые до момента когда обороты не станут такими которые должны быть и запомнить эту разницу как кофициент который сохранить в табличке. И зная его при следующем таком случае когда обороты просели при нужных параметрах напряжения и силы тока мы знаем коэфициент, находим разницу в оборотах и интерполируем(или тип того) относительно этого коэффициента.

Например амперы=1 вольты=3 и просели обороты на 100 коффиециент поднятия напряжения 3 мы узнали для такого случая. Ок опять тоже самое аперы=1 вольты=3 а оборотов на 50 меньше значит зная коэфициент 3 мы его относительно вольтажа и тока меняем (ну типа в два раза меньше он) и множим им на нужное и всё.

Или мож я ваще не так всё понял гыы

LINUX-ORG-RU ★★ ()
Ответ на: комментарий от LINUX-ORG-RU

Так у тебя количество данных взорвётся не? На каждый уникальный чих будут новые данные.

Дык надо записывать только по необходимости, а не хреначить все подряд. Или дропать то что стало «лишним». Известно, что «линейной» таблицы хватило бы 10х10. Нужен аналог.

Vit ★★★★★ ()
Ответ на: комментарий от i-rinat

++
Любая кластеризация по ближайшим значениям.

Shadow ★★★★★ ()

Ну для сетки из 2D точек можно, например, построить триангуляцию Делоне. Чтение - определить треугольник в который попадает искомая точка, в нём линейно интерполировать (или нелинейно, аналогично тому как считается гладкое освещение в 3D графике). Запись - добавить точку, схлопнуть точки расстояние между которыми < eps и локально обновить триангуляцию. За счёт этого будет обеспечиваться и ограничение на размер данных, и актуализация значения функции.

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

Можно генерить динамическую сетку по другим законам - quad tree, например, с подходящими условиями разбиения и релаксации.

slovazap ★★★★★ ()
Ответ на: комментарий от slovazap

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

slovazap ★★★★★ ()
Ответ на: комментарий от slovazap

Ещё можно бахнуть разбиение Вороного.

luke ★★★★★ ()

Соответственно, надо как-то определять, что соседние точки сильно поехали, и как-то их корректировать или удалять

Сделай интерполяцию значения тока для новой точки по старым соседям, ну и режь по порогу какому-нибудь. В идеале надо глянуть на гистограмму конечно же, если причина какая-то явная, то новые точки будут на гистограмме далеко от нуля. Ну и заодно можно ширину пика прикинуть, а по ней и порог выбрать.

luke ★★★★★ ()

Какие есть варианты?

Деревья квадрантов и распознавание коллизий ©.
C мультиком «плавающих опорных точек» :)

quickquest ★★★★★ ()

С одномерной табличкой вопросов нет - там просто сортированный массив и поиск половинным делением.

короткий путь - знакомый.

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

olelookoe ()
Ответ на: комментарий от Vit

Это так не масштабируется.

значит я не вкурил что у тебя там за «это»

olelookoe ()

И второй момент, данные могут устаревать (например щетки пылью забились, параметры поплыли). Но вероятность получить обновление в той же самой точке равна нулю. Можно попасть только «где-то рядом». Соответственно, надо как-то определять, что соседние точки сильно поехали, и как-то их корректировать или удалять.

Какие есть варианты?

https://ru.wikipedia.org/wiki/Нейроуправление

См. также: «адаптивные системы автоматического управления»

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

SZT ★★★★★ ()
Последнее исправление: SZT (всего исправлений: 3)

Спасибо всем кто ссылок накидал. Буду думать.

Vit ★★★★★ ()

заодно скажи каким моторчиком управляешь…

ну чтобы на таком не ездить :-) выбор решения по К-Д дереву (или иным умным словам), присоветованному на непрофильном форуме, это что-то

MKuznetsov ★★★★★ ()
Ответ на: комментарий от MKuznetsov

Было бы конструктивно написать «как надо на самом деле». Судя по надутым щекам, ты наверняка знаешь :)

Vit ★★★★★ ()
Ответ на: комментарий от Vit

Ну вот я тоже думаю, что лучше это на более профильных форумах спрашивать, где есть спецы в системах автоматического управления. Эта задача наверняка уже давно решена в каких-нибудь токарных/сверлильных станках, и там дадут более точный и правильный совет.

SZT ★★★★★ ()
Ответ на: комментарий от SZT

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

Vit ★★★★★ ()
Ответ на: комментарий от Vit

Не вижу смысла тратить время только из-за того что ты что-то подумал или предположил.

ОК, не видь.

Интересует реальный опыт, а то что ты пишешь на него не похоже.

Это называется «здравый смысл». Если бы мне нужна была консультация по теме алгоритмов помехоустойчивого кодирования, «здравый смысл» мне скажет, что спрашивать про это лучше там, где есть шарящие в конкретно этой теме люди, которые разбираются в подобного рода алгоритмах. Логично?

SZT ★★★★★ ()
Последнее исправление: SZT (всего исправлений: 1)

Триангуляция Делоне и какая-нибудь сплайн-функция в вершинах триаггуляции гладко сшивающаяся на границах с другими сплайн-функциями.

Psilocybe ()
Ответ на: комментарий от SZT

Разглядеть общее между моим вопросом и точилками-сверлилками смог только ты. А поскольку я не хочу комментировать здравость смысла, за который ты топишь, то говорю «пости только конкретный личный опыт».

Vit ★★★★★ ()

На чем основана гипотеза про?

F(ток, обороты) => напряжение

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

На каких структурах сделать «табличную» функцию с плавающими опорными точками?

shkolnick-kun ★★★★★ ()

Сетку фиксировать, функцию для аппроксимации использовать по возможности точную. При желании/возможности коэффициенты в аппроксимирущей функции корректировать по результатам измерений.

Elyas ★★★★★ ()
Ответ на: комментарий от Elyas

Как я сетку зафиксирую, если нет данных, чтобы выбрать «удобные» координаты?

Вопрос в том и заключается, как работать с тем что есть, вместо того что хочется. И больше не про финальную интерполяцию, а про хранение.

Vit ★★★★★ ()
Ответ на: комментарий от Vit

Зафиксировать с запасом на весь диапазон. При измерениях сохранять не измеренную точку, а поправки к соседним.

Elyas ★★★★★ ()
Последнее исправление: Elyas (всего исправлений: 1)
Ответ на: комментарий от Elyas

Мутновато, но имеет право на жизнь. Подумаю. Спасибо.

Vit ★★★★★ ()

В 3д графике и вычислениях на видяшечке табличную функцию обычно заменяет текстура, и запись/чтение из неё при помощи семплеров, семплеры в свою очередь решают проблему «неидеального попадания в ячейку».

С несуществующими (пока) данными обычно помогают справится трюки вроде IDW (https://en.wikipedia.org/wiki/Inverse_distance_weighting).

Если же не ограничивать себя таблицей в виде двумерного массива заданного размера, то тогда используются штуки на основе триангуляции Делоне.

Неплохо их применение (в купе с работающим кодом) описано в «Numerical Recipes 3ed» в главе «21.7.1 Two-Dimensional Interpolation on an Irregular Grid».

Но, с триангуляцией есть проблемы вроде такой: удачно интерполировать получается внутри выпуклой оболочки вокруг семпл-точек, области вне её (в случае 2д таблички - все касающееся краёв) требуют экстраполяции.

Можно конечно комбинировать и триангуляцию и IDW и наверно получится что-то работающее.

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

nikitos ★★ ()
Ответ на: комментарий от nikitos

Спасибо.

Я пока склоняюсь к одномерному варианту - во время работы ручку скорости никто активно не крутит, поэтому можно попробовать только заполнять выхлоп для разных нагрузок (тока) при фиксированной уставке. Ну и не сохранять никуда.

Это конечно будет пахать только до выключения питания или поворота ручки. Зато сделать очень просто, и достаточно для проверки самой идеи «самообучения». Дальше видно будет, наворачивать сложнее или нет.

Vit ★★★★★ ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей