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