|
как попроще аппромиксировать процесс | ☑ | ||
---|---|---|---|---|
0
vde69
02.03.16
✎
22:33
|
Есть некий физический процесс который мерит датчик, датчик выдает некий сигнал в виде напряжения необходимо как можно более простым способом получить касательную к некой усредненной кривой и по этой касательной получить примерный знак (возрастает или убывает) и примерный К для этой касательной линии Х*К=У.
Предполагаю такую методику 1. запоминаем по показаниям датчиков например 6 точки где-то в конце кривой 2. усредняем первые 3, это будет точка Х1,У1 3. усредняем вторые 3, это будет точка Х2,У2 4. считаем, что искомая прямая проходит через эти 2 точки проблема в том, что кривая неизвестная, это может быть гипербола или затухающая синусоида (заранее не известно...), по этому я не понимаю как именно выбирать эти точки что бы получить максимально правдивый результат. |
|||
1
Остап Сулейманович
02.03.16
✎
22:42
|
(0) Нас учили аппроксимации по методу наименьших квадратов. Типа один из самых простых и достаточно точных для практических расчетов.
Вот здесь : https://habrahabr.ru/post/131335/ с алгоритмом и примером. Сам метод : https://ru.wikipedia.org/wiki/Метод_наименьших_квадратов Метод наименьших квадратов даст саму кривулю. Угол касательной - это будет производная первого порядка. |
|||
2
Остап Сулейманович
02.03.16
✎
22:44
|
+ (1) То, что "кривая неизвестная" - это плохо. Желательно знать хотя бы порядок. 2-го, 3-его. Для периодических можно ограничиться порядком на исследуемом участке.
|
|||
3
Остап Сулейманович
02.03.16
✎
22:47
|
+ Вот здесь : http://mathprofi.ru/metod_naimenshih_kvadratov.html есть чего-то там на экселях. Насколько оправдано название - сказать не могу. Видимо можно потренироваться на кошках (экселях) и выбрать самый подходящий порядок кривули.
|
|||
4
vde69
02.03.16
✎
22:48
|
отчасти ты прав, но не в моем случае.
мне будет слишком сложно получить производную |
|||
5
Остап Сулейманович
02.03.16
✎
22:54
|
(4) Ты ж программист или где?
Геометрический смысл производной - угол наклона касательной в точке. 1. Посчитаешь коэффициенты аппроксимирующей кривули 2. Рассчитаешь значения твоей функции в двух достаточно близких к нужной тебе точках (слева и справа). 3. Из полученного треугольника рассчитаешь синус угла. Благо на компьютере можно взять любое сколько угодно малое расстояние между точками. |
|||
6
Остап Сулейманович
02.03.16
✎
22:57
|
+ (5) Вот даже в картинках : http://aco.ifmo.ru/el_books/numerical_methods/lectures/glava1.html рис 1.1
Вот здесь : http://www.toehelp.ru/theory/informat/lecture10.html еще несколько. |
|||
7
Garykom
гуру
02.03.16
✎
23:09
|
Для начала обычную параболическую экстраполяцию попробовать
Точки перегиба ищем и от них строим |
|||
8
Garykom
гуру
02.03.16
✎
23:14
|
(7)+ коэффициенты a, b и c в уравнении параболы y=ax^2+bx+c
находим по "Расчёт коэффициентов квадратичной функции" из https://ru.wikipedia.org/wiki/Парабола по 3-м точкам (точка перегиба, последняя точка и примерно посередине) |
|||
9
vde69
02.03.16
✎
23:18
|
(7) завтра покручу, может и пойдет...
|
|||
10
Garykom
гуру
02.03.16
✎
23:22
|
(8)+ получив коэффициенты по ним все видно, если a>0 то вверх растет, иначе вниз падает
на каждом шаге - новом замере делаем пересчет параболы (точка перегиба начальная осталась прежняя а конечная и посередине поменялись) и новый прогноз вот как точки перегиба определять это отдельный вопрос |
|||
11
Garykom
гуру
02.03.16
✎
23:24
|
(10) сорри не расте если a>0 а ветви вверх, это же может быть как правая так и левая ветви параболы
точек перегиба будет 4 вида |
|||
12
Garykom
гуру
02.03.16
✎
23:31
|
(11) точки перегиба можно по отклонению новых значений определять от предсказанных, если вышли за некие пределы, то это и есть точка перегиба
т.е. будет постоянно пытаться экстраполировать кусками парабол - предсказывать новые, если вышли за пределы предсказания, то пора новую параболу рисовать |
|||
13
H A D G E H O G s
03.03.16
✎
00:03
|
как автор будет строить касательную к "затухающей синусоиде"?
|
|||
14
H A D G E H O G s
03.03.16
✎
00:09
|
(13) в какой точке?
|
|||
15
romix
03.03.16
✎
01:35
|
Занести в массив высоту максимумов синусоиды, первая производная - это последовательность дельт между соседними элементами массива.
|
|||
16
Garykom
гуру
03.03.16
✎
01:49
|
там нифига не синусоида возможно, есть же управление нагревателем, кривая температуры будет просто плавная а форма почти любая
|
|||
17
rphosts
03.03.16
✎
02:26
|
(0) Сплайн метод однозначно, я-б заюзал кубический сплайн метод....
|
|||
18
Михаил 1С
03.03.16
✎
06:02
|
(17) Да, я тоже за Сплайн. Правда, для него надо больше точек, по-моему 6 - это самый минимум, а то и от 10 нужно.
... давно я не играл в шашки... в детстве, работая в НИИ, занимался подгонкой - и МНК и Сплайнами. |
|||
19
los_hooliganos
03.03.16
✎
06:10
|
(0) Рекомендую научится пользоваться Origin
https://ru.wikipedia.org/wiki/Origin_(программа) Там есть и получение функции, которая описывает экспериментальные точки. |
|||
20
Михаил 1С
03.03.16
✎
06:15
|
(0) Очень плохо, что не известен вид кривой. Надо хотябы на листочке построить ее и прикинуть - что она из себя представляет?
Вот ты предполагаешь почему-то, что надо взять 6 точек на конце. А почему на конце? Может быть она перед этим три раза возрастала и убывала? Может быть она периодическая? или линейная, но с двумя впадинами? Если не знать вид кривой, можно сразу загубить все исследование. Ты выбирешь к примеру метод МНК, возьмешь функцию 3 порядка, и этим сразу заложешь вид кривой. И все пики и провалы в графике убъешь этой апроксимацией. Или наоборот - возьмешь 100 точек, применишь Сплайн-аппроксимацию, она даст "очень точную" функцию - будет такая слегка волнистая кривая. Но эти волны дадут тебе то убывание кривой, то возрастание, причем 5 раз подряд. А может быть эти волны - просто ошибка измерений? В общем - надо провести детальные измерения (на сколько у тебя хватает времени) и со всею смелостью предположить - "Тут гладкая кривая, все биения - фигня, да и мне они не важны, буду искать коэф.наклона для гладкой кривой методом МНК". Хотяя, для тебя можно все делать МНК, главное выбрать участок, где по твоему мнению функция монотонная (только возрастает или только убывает), снять на этом участке 6-10 точек, и загнать это в Оригин, как в (19) советуют. |
|||
21
los_hooliganos
03.03.16
✎
06:17
|
Так же из метрологии:
Мы имеем истинную гипотетическую кривую. На эту кривую наносят экспериментальные точки. Точность измерения связана с погрешностью. Сама погрешность измерения обратно пропорциональна квадрату числа измерений. Для шести измерений, погрешность = 40% |
|||
22
Михаил 1С
03.03.16
✎
06:20
|
(0)
"2. усредняем первые 3, это будет точка Х1,У1 3. усредняем вторые 3, это будет точка Х2,У2 " Что-то не понятно зачем это нужно. По-моему это ошибка. Не нужно усреднять. Вот если ты три раза измеришь один и тот же процесс, тогда можно усреднять. То есть - получишь для х1 три показания - у11, у12 и у13, вот эти три игрека и усредняй. Получишь для точки х1 усредненное значение у1. Если конечно ты сможешь довольно точно снять три одинаковых процесса в тех же точках х. |
|||
23
Михаил 1С
03.03.16
✎
06:23
|
(21) А для МНК тоже верна эта формула? Я точно не помню.
Или это все-таки для нескольких измерений одного и того же физического процесса? Когда для х1 шесть показаний - у11, у12 и у13 и т.д. ? |
|||
24
los_hooliganos
03.03.16
✎
06:27
|
(23) Нскока помню это как раз для случая построения некой кривой.
Например зависимость дозы излучения от толщины свинца. |
|||
25
rphosts
03.03.16
✎
08:03
|
(18) на трёх уже прям неплохо работает... да и точек у ТС так много, что он уже их усреднять собирается
|
|||
26
vde69
03.03.16
✎
09:06
|
все такие умные....
мне нужно уложится в 10-20 строчек кода и переменные не более 100 байт включая массив точек (у меня на всю программу целиком 2 кб озу)... и расчет должен производится не дольше 0.1 сек |
|||
27
vde69
03.03.16
✎
09:09
|
сабж продолжение нужен простой алгоритм аппроксимации (но не ПИД)
в принципе вроде все работает кроме "последней мили" то есть хочется оптимизировать именно район плюс минус 0.1% |
|||
28
Irbis
03.03.16
✎
09:10
|
(18) Если сплайн 3 порядка, а для обеспечения нулевой скорости и нулевого ускорения большего порядка и не требуется, то для вычисления коэффициентов требуется 4 точки, по числу коэффициентов в уравнении.
|
|||
29
rphosts
03.03.16
✎
09:59
|
(28) у него есть 6 точек
|
|||
30
rphosts
03.03.16
✎
10:00
|
(26) где ты в (0) про такие ограничения писал?
Как делаешь - расскажи как сделал |
|||
31
Mikeware
03.03.16
✎
10:02
|
(14) к огибающей...
|
|||
32
Михаил 1С
03.03.16
✎
11:14
|
(28) Ну как-бы да. Но.. сплайн из одного кусочка - это разве вообще Сплайн? Суть и изюминка сплайн-аппроксимации в том, что вся функция разбивается на кусочки, на каждом кусочке находится аппроксимирующая функция, и концы этих точек связываются.
А так - это ... не помню как называется, но есть свое название. |
|||
33
Bigbro
03.03.16
✎
11:28
|
я бы предложил для начала конкретизировать вид кривой, это раз, и понять как частота колебаний соотносится с частотой опроса датчика. это ключевой вопрос для решения можем ли мы что-то усреднять в принципе, или загрубим при усреднении убивая интервал, в котором функция знак меняла, например.
значения датчика например +4 +4 -4 -4 +4 +4 по предложенному алгоритму получится средняя четверочка и никаких колебаний, а на самом деле там отклонения с двойной амплитудой еще и в минус. если речь о контроле техпроцессов это может оказаться критичным. |
|||
34
Михаил Козлов
03.03.16
✎
11:30
|
"получить касательную к некой усредненной кривой".
1. Усредненная кривая - кусочно-линейная (сплайн 1-ого порядка) - производная на отрезках между точками - разность ординат/разность абсцисс. В точках измерения - разрыв производной. 2. Усредненная кривая - кусочно-параболическая (сплайн 2-ого порядка) с сохранением 1-ой производной в точках измерения. Тоже вычисляется нетрудно. В точках измерения - разрыв 2-ой производной. И так далее. |
|||
35
vde69
03.03.16
✎
12:00
|
(30) учитывая инерционность и периодичность включения буду строить по 3 (или 4) точкам разнесенным на одинаковую величину по времени и равную 1/2 времени инерционности, каждую из этих точек буду получать как среднее из 2х точек полупериода цикла вкл/выкл нагрева, так получаем 4 реальных точки....
Еще мне нужны две точки в "будущем" 1. буду считать банально по прямой между двумя последними точками 2. идеал... В качестве сплайна я хочу использовать кривую Бозье, так как она имеет довольно простую в понимании и реализации. строим два сплайна до "будущего" и рассчитать значение сплайнов на расстоянии 1/2 от последней точки до "будущего", расстояние между этими точками я и буду считать нужной для корректировки дельтой, правда не понимаю в каких это будет единицах.... |
|||
36
vde69
03.03.16
✎
12:02
|
||||
37
Garykom
гуру
03.03.16
✎
12:10
|
(35) безье плохо экстраполировать за границы вперед
Только для аппроксимации и интерполяции внутри известных точек для промежуточных |
|||
38
Остап Сулейманович
03.03.16
✎
12:11
|
(26) "мне нужно уложится в 10-20 строчек кода и" кто заставляет весь расчет производить "в поле"?
В конце всех концов нужно получить функцию регулирования. И именно ее реализовать "в железке". Вся предварительная работа выполняется на отдельном от рабочей железки стенде. Стенд (в данном случае) не обязательно железка. Это могут быть просто таблицы предварительных замеров. Потом по этим табличкам строится аппроксимирующая функция, проводится весь анализ в точках регулирования. Определяется вид регулирующей функции, коэффициенты регулирующей и уже готовые данные вкладываются в систему регулирования. Никаких вычислений, кроме регулирующих воздействий в реальной железке выполнять не нужно. |
|||
39
Mikeware
03.03.16
✎
12:14
|
(38) ты забыл добавить: "на что только люди не идут, чтоб только не использовать классические методы автоматического регулирования..." :-)
|
|||
40
Ksandr
03.03.16
✎
12:25
|
Все не читал. Использую в своем хобби проекте:
Входящие данные - GPS координаты + доплеровские скорости + параметры точности измерений Сейчас использую Медианный фильтр + аналог скользящего среднего (собственная разработка на основании входящих данных) Пробовал: - Медианный фильтр + Скользящее среднее - Low pass filter |
|||
41
Остап Сулейманович
03.03.16
✎
12:30
|
+ "хочу использовать кривую Бозье". Почему именно ее? В теории в качестве аппроксимирующей нужно принять функцию порядка не больше экспериментальной. Так обеспечивается ее попадание в интервалах между замерами. А не только в точка замера.
В смысле если у вас отклонение параметров регулирования по параболе - то и функцию нужно выбирать максимум второго порядка. А для этого рассчитать всего 3 коэффициента. Совсем необязательно пытаться аппроксимировать на всем диапазоне параметров. Или с точностью выше необходимой. Достаточно определиться с точками регулирования и поведением в них системы. Поэтому можно не анализировать всю кривулю. Понятно, что устойчивая система имеет периодическое поведение на всем диапазоне в зависимости от жесткости системы регулирования. Но в точках регулирования вряд ли имеет вид выше второго порядка. А уж для тепловых процессов ИМХО можно вообще принимать как линейные из-за достаточной инертности теловых процессов. |
|||
42
Mikeware
03.03.16
✎
12:31
|
(40) чем меришь доплера?
|
|||
43
vde69
03.03.16
✎
12:33
|
Бозье в любой точке рассчитывается простыми действиями *+-/
без корней и прочего... требует минимум памяти для данных... |
|||
44
Остап Сулейманович
03.03.16
✎
12:35
|
(43) Еще раз. В системе регулирования рассчитывать аппроксимацию не нужно. Вам кто-то запретил провести анализ отдельно от исполнительного устройства? Например на компьютере?
|
|||
45
Irbis
03.03.16
✎
12:42
|
Так то никто не запрещает измерения параметров проводить 100 раз, а управляющее воздействие менять 1 раз. То есть при управлении инерционным параметром (температура) нет смысла устраивать чехарду из-за шума датчика.
|
|||
46
Остап Сулейманович
03.03.16
✎
12:46
|
(45) + 100500. Да и отклоняющее воздействие можно (ИМХО для тепловых процессов) вполне принять квадратичным, если не вообще линейным. Соответственно и регулирующее тоже.
|
|||
47
vde69
03.03.16
✎
15:40
|
(30) пока вышло так, на вскидку работает, на реальной печке буду на выходных испытывать...
// обработка статистики histori_t1 = histori_t2; // пока нужна только для статистики histori_t2 = histori_t3; histori_t3 = histori_t4; histori_t4 = term_real_new; // расчет корректора rk_pow // расчитаем t6_1 = term_set; t6_2 = histori_t4 + (histori_t4 - histori_t3) 2; // далее идет поиск точек на двух кривых Безье по точкам, считаем довольно условно (на 2/3 пути)... // 1. histori_t2, histori_t3, histori_t4, t6_1 - ищем точку t5_1 расположеную по времени посередине histori_t4, t6_1 t5_1 = 1.0 (histori_t2 + 6.0 histori_t3 + 12.0 histori_t4 + 8.0 t6_1) / 27.0; // 2. histori_t2, histori_t3, histori_t4, t6_2 - ищем точку t5_2 расположеную по времени посередине histori_t4, t6_2 t5_2 = 1.0 (histori_t2 + 6.0 histori_t3 + 12.0 histori_t4 + 8.0 t6_2) / 27.0; // rk_pow считаем по пропорциям, он в сотых долях процента rk_pow = 100.0 ((1.0 r_pow t5_1 / t5_2) - r_pow); |
|||
48
vde69
09.03.16
✎
11:06
|
дошел до полевых испытаний... никакая аппромиксация вообще не нужна, все гораздо проще....
думаю эту неделю убью на калибровку, отладку и сбор статистики в реальных условиях, потом отпишусь... |
|||
49
Garykom
гуру
09.03.16
✎
11:11
|
(48) не нужна аппроксимация, там скорее всего 3-5 параметров в табличке и все
|
|||
50
Garykom
гуру
09.03.16
✎
11:12
|
(49)+ и то точность превышать будет требуемую
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |