Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Выделить прямолинейный участок на экспериментально


Автор: disputant 28.11.2011, 21:01
День добрый! 

Имеется некая обработка экспериментальных данных, которые имеют вид кривой, примерно такого типа, как показанная на рисунке:
user posted image

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

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

Куда смотреть, в каком направлении - никаких идей?

Заранее спасибо  smile 

Автор: Akina 28.11.2011, 22:26
Аппроксимируй, а потом уже бери производную.
Либо Строй прямую по МНК. Отбрасывай крайнюю точку, снова строй. Если изменение отрезка или тангенса больше заданной точности - правильно отбросил...


Автор: ksnk 28.11.2011, 22:35
Нужно нарисовать прямоугольник, вневписанный в ломанную, которая получается,если соединить все соседние точки. Средняя линия этого прямоугольника и будет искомой, в случае если прямоугольник получился "толстым" - выкидываем несколько граничных точек как "брак". 

вообще непонятна цель построения  smile Подгоняем измерения под известный результат? Решение должно быть прямой и нужно только найти погрешность?

Автор: Akina 28.11.2011, 22:56
disputant, вообще опишите физику эксперимента. Будет понятнее, что происходить и как обрабатывать.

Автор: mrgloom 29.11.2011, 08:15
http://ru.wikipedia.org/wiki/RANSAC

Автор: disputant 29.11.2011, 08:17
Цитата(ksnk @ 28.11.2011,  22:35)
вообще непонятна цель построения  smile Подгоняем измерения под известный результат? Решение должно быть прямой и нужно только найти погрешность?


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

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

Автор: esperanto 29.11.2011, 11:28
Подойдет Хаффа трансформ для поиска прямых линий

Автор: disputant 29.11.2011, 12:29
Цитата(esperanto @ 29.11.2011,  11:28)
Подойдет Хаффа трансформ для поиска прямых линий

Ага... почитал, попробую.

Представляется проблематичной оценка погрешности этого самого угла наклона. Для МНК формулы, грубо говоря, имеются, а для Хаффа не нашел пока. Ведь, как я понимаю, тут наклон получается сразу, по максимуму в фазовом пространстве?

Добавлено через 3 минуты и 22 секунды
Цитата(mrgloom @ 29.11.2011,  08:15)
http://ru.wikipedia.org/wiki/RANSAC

Не совсем уверен, так как здесь горизонтальные куски - не выбросы...

Автор: _Y_ 29.11.2011, 15:02
1. Кривая ну очень уж напоминает кривые титрования знакомые каждому химику. На них и ищется точка перегиба, а потом, при надобности, угол наклона в этой точке. Может это и нужно? Тогда наверняка легко будет найти по ключевым словам "кривая титрования" и "компютерная обработка" или "titration curve" и "computer processing".

2. Если же нужно искать именно прямую, находящуюся где-то в центре S-образной кривой, то можно сделать примерно так:
  • Нужно выбрать метод аппроксимации точек прямой - например один из вариантов метода наименьших квадратов. Этот выбор зависит от физической сущности процесса.
  • Для любого из методов, выбранных в первом пункте, имеется своя характеристика соответствия разброса точек вокруг аппрохимирующей прямой; т.е. некий коэффициент корреляции. Нужно апприори назначить граничное значение этому коеффициенту. Ну типа если R>0.5 то разброс точек преемлим. Если же нет - точки аппрохимировать прямой нельзя.
  • Теперь можно взять произвольные несколько точек, заведомо лежащих на прямой, в цикле добавлять к ним по одной точке справа и слева и смотреть выполняетйс ли условие R>0.5. Добавлять точки пока оно выполняется.

Автор: Pavia 29.11.2011, 20:21
Я так понимаю есть точки которые задают ломанную.
Тогда можно просто "упростить ломанную" по известному алгоритму и выбрать наибольшую по длине прямую.

Автор: disputant 3.12.2011, 16:45
Всем большое спасибо!

Пошел по наилегчайшему пути smile Считаю производную, вблизи максимума сглаживаю и провожу прямую. После чего нахожу ее точки пересечения с горизонталями - Xmin и Xmax, и уже потом выполняю МНК с точками между ними.

Если бы еще это как-то обосновать математически...  smile 

Автор: _Y_ 3.12.2011, 17:15
disputant, примерно так делали с кривыми титрования до появления компьютеров. Правда, графически на миллиметровке)))))

Автор: disputant 4.12.2011, 11:10
Цитата(_Y_ @ 3.12.2011,  17:15)
disputant, примерно так делали с кривыми титрования до появления компьютеров. Правда, графически на миллиметровке)))))

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

Но я рад, что, оказывается, этот метод возник не на ровном месте smile

Автор: Фантом 4.12.2011, 15:15
Построить аппроксимирующий сплайн, а затем найти участок с близкой к нулю второй производной и существенно отличной от нуля первой.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)