LINUX.ORG.RU

Создание алгоритма методом «научного тыка»?


0

4

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

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

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

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

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

★★★★★

Методом научного тыка — это покури генетические алгоритмы. Но, т.к. у тебя есть насчитанные трубки, я бы попробовал обучить нейросеть.

Ошибок это не исключает, но может дать приличный результат (непонятным способом, к сожалению)

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

Ну пишется все это на линуксе, да и в программировании думаю решают подобные задачи.

Написал в девелопмент от точаяния - тут все таки довольно квалифицированное сообщество. Прошу модераторов в толксы тему не переносить;-)

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

Да, я думал про нейросети, но это как то уже чересчур... И все равно, для обучения придется все трубки просматривать и вручную определять правильный индекс (число «вывертов»).

AIv ★★★★★
() автор топика

Т.е. я могу посмотреть глазами на трубку и понять сколько раз ее вывернуло

Не можешь, только с определенной вероятностью.

anonymous
()

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

anonymous
()

Где эта херня может применяться в нормальной жизни? Науки такие науки.

anonymous
()
Ответ на: комментарий от AIv

Направлений (нормалей?) по итерациям (времени?). Исходя из условий, имеется ввиду численное дифференцирование

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

Да, только кривые не обязательно пересекаются - одна кривая может проходить между двумя другими

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

При поиске нефти и газа например.

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

Но как??? И главное, мне нужно всегда получать правильный ответ, а не с какой то достоверностью;-)

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

нужно всегда получать правильный ответ

Тогда расчет точек пересечения. Для уверенности методом сигма-дельта приближений.

Будет медленно, но точно. Любой быстрый метод работает в ущерб точности.

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

Ну в каком то смысле производная входит в смешанное произведение. Если координаты лучей a1,b1,c1 на одном временном слое и a2,b2,c2 на следующем слое, то можно следить например за знаком конструкции (b1-a1)%(b2-b1)*(c2-b2), где % это векторное произведение. b2-b1 это фактически производная. Сами нормали не очень удобны оказываются - нормаль ХЗ куда может смотреть (в известных пределах).

А как можно обойтись без смешанного произведения, какие нить еще варианты есть?

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

КРивые могут не пересекаться вообще - одна кривая может проходить между двум другими.

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

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

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

Так у них может ыообще не быть общих точек, а выворачивание тем не менее будет.

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

Да. Либо два луча пересекаются (можно рассматривать как частный случай). Либо пересекаются все три луча (крайне редко бывает) - тогда это два «выворачивания» сразу.

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

Случай пересечения я уже описал. Пересечение плоскости лучем — тоже тривиальная задача (правда тут нужно будет проверить все три луча). Сделай проверку трех условий и задача решится.

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

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

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

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

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

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

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

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

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

Я пытаюсь на по двум срезам (для времен t и t+dt) определить было ли пересечение на текущем шаге (в интервале [t,t+dt]).

AIv ★★★★★
() автор топика

Т.е. вот у меня в файлах лежат насчитанные трубки - в сколько >то там колонок время, координаты лучей и знаки всяких смешанных >произведений. Как на основе этого собрать устойчивый алгоритм >дающий правильное число вывертов?

Надо ковырять по месту физику и данные. Переспать со всем не раз ..
Например, стояла задача из поля датчиков дифференциальных термопар (и сильно шумящих) отлавливать появление пламени и выдавать команду на подрыв пиропатрона огнетушителя. Датчиков много и можно было увязнуть в классической математике и алгоритмах, а цена ложного подрыва балона с фреоном > ~500 $. Военная тема, и за всем стоит жизнь людей.
Пришлось придумать хитрый «компот» из простых вещей для простого avr микроконтроллера.
Да, а в книгах хрен об этом напишут ))

bedcasus
()
Ответ на: комментарий от AIv

При таком раскладе других выходов, кроме как полностью просчитывать все три поверхности (и пересечения их лучами) для точного ответа я не вижу.

Если эта задача упростится при наличии уравнений кривых или поверхностей, то их можно получить при помощи, например, алгоритма gradient descent

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

А через principal components analysis данные пробовал пропускать? Ну, а потом искать уравнение регрессии по выборке из уже измененного пространства (у него могут быть лучше свойства для нахождения такого уравнения).

ЗюЫю Предупреждаю, что не специалист по статистике.

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

можно файл с исходными данными этой картинки, хочется покрутить трехмерный график. и сколько раз там трубку «вывернуло»?

Я пытаюсь на по двум срезам (для времен t и t+dt) определить было ли пересечение на текущем шаге (в интервале [t,t+dt]).

получается, что лучи в момент t, находятся вовсе не на одном расстоянии от источника, а в +- дельте (друг относительно друга). в этом проблема?

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

http://a-iv.ru/trash/tube.dat вывернуло два раза

получается, что лучи в момент t, находятся вовсе не на одном расстоянии от источника, а в +- дельте (друг относительно друга). в этом проблема?

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

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

ну, допустим я могу хранить историю по трубке - сначала трассировать все, а потом анализировать пересечения. Правда это нетривиально, а с учетом того что должно работать быстро то СОВСЕМ не тривиально...

ок, спасибо, я подумаю.

AIv ★★★★★
() автор топика

Лучи считаются численно, методом Рунге-Кутты. Есть координаты лучей в начале шага и в конце шага, есть нормали лучей (единичные вектора, описывающие куда с-но лучи направлены).

А насколько устойчивы решения? Не получается так, что малое отклонение во входных параметрах радикально влияет на количество вывёртываний? По аналогии с http://en.wikipedia.org/wiki/Wilkinson's_polynomial

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

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

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

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

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

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

anonymous
()

Как и в случае любых некорректных задач - тебе надо анализировать данные и вырабатывать эвристики для твоих конкретных данных. У тебя ведь не простые рандомные лучи, а расчитанные по вполне определенному закону. Надо смотреть как ведут себя лучи до/после выворачивания.

anonymous
()
Ответ на: комментарий от AIv

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

Есть (аппроксимация+устойчивость->сходимость) для дифура, который интегрируется по рунге-куте.

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

Так вот второй сорт устойчивости ты исследовал? В окрестностях нестабильных точек сходимость может достигаться далеко за пределами машинного эпсилон.

Можешь привести примеры, где алгоритм ошибается?

Manhunt ★★★★★
()

Вообще если «нырков» между шагами нет (а ты их никак не отследишь), то можно сделать так - в каждый конкретный момент времени у тебя есть треугольник, он задает некую плоскость, выбираем базовый луч, пусть это будет луч А (остальные назовем В и С) и считаем от него углы точек остальных лучей по часовой стрелке, например (по вращению вокруг проекции вектора скорости треугольника на плоскость треугольника), тогда треугольник задается порядком лучей, допустим ABC. Если какой-то луч между шагами прошел между двумя другими, то на следующем шаге у тебя получится уже треугольник ACB. Если еще раз перейдет - опять ABC. И так далее. С другой стороны, если лучи друг между другом не проходили, то порядок лучей не меняется. Если все лучи пересеклись - то это три прохода между парами, то есть в этом случае тоже идет замена ABC -> ACB.

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

(по вращению вокруг проекции вектора скорости треугольника на плоскость треугольника)

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

anonymous
()
Ответ на: комментарий от AIv

Т.е. скрещиваться? Это тоже состояние «вывернуло»?

Крутить плоскость вокруг кривых (180 град), проецировать на нее кривые, искать точки пересечения.

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

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

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

Число трубок в боевой версии кода будет огромно

Треугольник не катит. Хотя, можно перебрать все сочетания трубок по три... Но это будет уже не огромно, а огромно огромно огромно... :)

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

Если координаты лучей a1,b1,c1 на одном временном слое и a2,b2,c2 на следующем слое, то можно следить например за знаком конструкции (b1-a1)%(b2-b1)*(c2-b2), где % это векторное произведение.

В трехмерии любые два треугольника можно совместить не выворачивая пространства. Поэтому чтобы по координатам лучей с двух временных слоев можно было судить о выворачивании, необходимо ввести какое-то дополнительное предположение. Предположение нужно сформулировать явно и формально, поскольку от него зависит критерий «вывернулось vs undefined vs невывернулось». Очень важно осознать этот факт прежде, чем двигаться дальше.

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

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

нужно посчитать сколько раз ее «вывернуло».

Когда-то электронные пучки в магнитных полях и оптические лучи в градиентных волноводах считали с помощью уравнения Эйконала:
«Решение Э. у. может иметь сингулярности. Их теория - часть теории особенностей дифференцируемых отображений».

Попробуй копнуть в этом направлении. Не уверен, но возможно, количество сингулярностей = сколько раз ее вывернуло?

quickquest ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.