LINUX.ORG.RU

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


0

4

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

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

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

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

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

★★★★★

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

Так вот второй сорт устойчивости ты исследовал?

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

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

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

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

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

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

http://a-iv.ru/trash/tube.dat - одна из комбинаций алгоритмов дала I=3, на самом деле 2. Но там причина простая, смена знака смешанного произведения вектора соединяющего центры треугольников и векторов образующих второй треугольник (это один из критериев выворачивания) произошла через несколько шагов после того как на самом деле произошло выворачивание.

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

Тащем то именно это уравнение и решается, а сингулярности это каустики (их то мы и ищем;-)).

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

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

Хитро скрещиваться. ВОт есть треугольная призма, если мы ее скрутим - это еще не вывернуло. А вот если вывернем одно из оснований - это вывернуло. Если при скручивании ребра пересклись в одной точке - тоже вывернуло, но два раза.

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

Треугольник не катит.

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

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

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

Это если они неориентированные. Если ориентированные - то все сразу решается.

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

Я тоже, но она есть;-)

Там можно много смешанных произведений записать. Не очень понятно за какими и в какой комбинации смотреть.

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

Поэтому исследуется не два треугольника, а образованная ими призма.

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

Для призмы то вроде все однозначно

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

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

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

http://a-iv.ru/trash/tube.dat

Не умею такое визуализировать.

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

Значит, решение о том, что такая призма считается вывернутой — неправильное. Нужно это решение уточнить с учетом имеющегося контрпримера.

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

Призма - плод нашего (сомнительного) предположения.

Она таки есть.

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

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

Призма может быть или не быть самопересекающейся,

ВОт нас интересует это и только это. Остальное неважно.

Не умею такое визуализировать.

gnuplot умеет;-)

Значит, решение о том, что такая призма считается вывернутой — неправильное. Нужно это решение уточнить с учетом имеющегося контрпримера.

Светлая мысль. ТОлько пока я не могу его уточнить...

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

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

Это если они неориентированные. Если ориентированные - то все сразу решается.

Возьми лист бумаги, нарисуй на нём треугольник abc. Теперь положи этот лист на стол лицевой стороной вниз: это равносильно тому, что ты треугольник «вывернул».

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

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

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

Если у тебя роляют ошибки округления, то ты по уши в дерьме.

Призма может быть или не быть самопересекающейся,

ВОт нас интересует это и только это. Остальное неважно.

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

Не умею такое визуализировать.

gnuplot умеет;-)

Только не сейчас и не в моих руках. Сорри.

Manhunt ★★★★★
()

Есть треугольная лучевая трубка, образованная тремя лучами.

Клистерная трубка, как она есть. Офигеть у вас определения.

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

ebantrop
()

Можно больше вариантов «плохих» данных? А то тот что вы выложили и в моем наколеночном варианте решения правильно считает.

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

В этом случае оринетация треугольника не меняется. А в случае «выворачивания пространства» - меняется. Так что их нельзя спутать.

Вопрос сводится к тому, каким способом можно проследить за ориентацией треугольника. Но тут нужна априорная информация о динамике его точек, в плане того, как треугольник двигаться НЕ МОЖЕТ.

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

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

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

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

именно это уравнение и решается

Для аналогичной задачи в волноводной фотонике (PDF) есть:

2.4.4 Волновые уравнения для градиентных планарных волноводов
...
К сожалению, аналитическое решение уравнений (2.4.11) и (2.4.13) возможно далеко не всегда.
Если профиль показателя преломления имеет другой вид (например, функций Гаусса или дополнительной функции ошибок), то решение уравнений (2.4.11) и (2.4.13) проводится методом ВКБ (Вентцеля-Крамерса-Бриллюэна), или численными методами решения дифференциальных уравнений.

P.S. Ищи спецов по численным методам решения дифуров.

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

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

Ориентированный треугольник - это треугольник с фиксированной ориентацией де-факто. Если вы ее поменяли, то это другой треугольник будет, ну просто по определению.

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

Покрасьте их в разный цвет и посмотрите, что получилось.

Как, в нашем случае, узнать с какой стороны какой цвет?

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

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

Нейросети и ГА тебе неизбежно будут давать ложные срабатывания.

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

Нейросети и ГА тебе неизбежно будут давать ложные срабатывания.

+1. Нейросетям тут не место.

Manhunt ★★★★★
()

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

А можно рисунок в студию?

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

Как, в нашем случае, узнать с какой стороны какой цвет?

По-моему я как раз и говорил что к этомуц вопросу все и сводится.

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

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

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

Только не сейчас и не в моих руках. Сорри.

O02eg

А можно рисунок в студию?

$ wget http://a-iv.ru/trash/tube.dat
$ gnuplot
gnuplot> splot "tube.dat" using 10:11:12 with line, "tube.dat" using 13:14:15 with line, "tube.dat" using 16:17:18 with line
anonymous
()
Ответ на: комментарий от anonymous

Если треугольник не вращается быстрее 180 градусов за 1 шаг, то все будет ок. Если вращается - ну тогда я не представляю чтоделать, да.

Уменьшать шаг.

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

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

Если сделать как я предлагаю, то пересечение хотя бы двух лучей будет классифицировано как «нехорошая трубка». Если трубок с пересекающимися лучами у ТС мало, то их потом можно довычислить «из общих топологических соображений»: Создание алгоритма методом «научного тыка»? (комментарий)

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

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

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

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

http://a-iv.ru/trash/tube.pdf http://a-iv.ru/trash/tube.dat

не, всё проще выглядит в PCA

 data<-read.table("data.txt") 

str(data)'data.frame':	321 obs. of  18 variables:
 $ V1 : num  0.02 0.04 0.06 0.08 0.1 0.12 0.14 0.16 0.18 0.2 ...
 $ V2 : int  -1 0 0 0 0 0 0 0 0 0 ...
 $ V3 : int  0 1 1 1 1 1 1 1 1 1 ...
 $ V4 : int  0 2 2 2 2 2 2 2 2 2 ...
 $ V5 : int  0 2 2 2 2 2 2 2 2 2 ...
 $ V6 : int  1 1 1 1 1 1 1 1 1 1 ...
 $ V7 : int  1 1 1 1 1 1 1 1 1 1 ...
 $ V8 : int  1 1 1 1 1 1 1 1 1 1 ...
 $ V9 : int  1 1 1 1 1 1 1 1 1 1 ...
 $ V10: num  497 481 465 449 434 ...
 $ V11: int  0 0 0 0 0 0 0 0 0 0 ...
 $ V12: num  9966 9929 9892 9855 9819 ...
 $ V13: num  496 479 463 446 430 ...
 $ V14: int  0 0 0 0 0 0 0 0 0 0 ...
 $ V15: num  9966 9930 9893 9857 9820 ...
 $ V16: num  496 480 464 448 431 ...
 $ V17: num  -0.79 -1.58 -2.37 -3.16 -3.95 ...
 $ V18: num  9966 9929 9893 9856 9820 ...

 biplot(prcomp(data[,10:18]))

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

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

в PCA пространстве первых двух компонент всё наглядно пересекается именно два раза.

Это как? Можно подробнее?

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

вернее вот так

pairs(prcomp(rbind(as.matrix(data[,10:12]), as.matrix(data[,13:15]), as.matrix(data[,16:18])))$x[,1:3])

как я понимаю не должно быть пересечений в первых трех сочетаниях главных компонент? или даже 1на2 и 1на3 достаточно. а еще примеров dat?

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

Уменьшать шаг.

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

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

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

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

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

Еще данные будут завтра. Это из неск тыщ трубок надо выбрать плохие;-)

Manhunt Уменьшать шаг бестолку - он и так дост. мал.

Я могу переформулировать задачу, так я ее сейчас вижу. Есть сколько то «выворачиваний» трубок, причем «выворачивание» то ли было то ли не было, но мы можем всегда обнаружить спорную ситуацию. В процессе трассировки считается некоторое число признаков (смешанных произведений, сейчас 9 но м.б. будет больше), каждый из которых может принимать значения 0,1,2, и при «выворачивании» некоторые из этих признаков меняются. Нужно построить алгоритм, который безошибочно на основе изменения признаков фиксирует выворачивание.

ЧТо то похожее на нейросеть, но не совсем... или совсем не. Я пока напишу скриптик, которые рисует последовательно все сомнительные призмы и выводит признаки, а там поглядим. М.б. удастся методом пристального вглядывания победить...

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

В процессе трассировки считается некоторое число признаков (смешанных произведений, сейчас 9 но м.б. будет больше), каждый из которых может принимать значения 0,1,2, и при «выворачивании» некоторые из этих признаков меняются. Нужно построить алгоритм, который безошибочно на основе изменения признаков фиксирует выворачивание.

Ты так и не сказал, чем не устраивает произведение двух сторон на вектор нормали. Очевидно, что выворачивание происходит тогда и только тогда, когда меняется знак этого произведения, зачем какие-то другие признаки?

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

произведение двух сторон на вектор нормали

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

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

1) Анализ принципиальных компонент. Идея в том, что траектория будет развернута этим методом вдоль основных осей.

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

!Это если пытаться распознать каждую траекторию отдельно!

2) Если будет пул «плохих» траекторий + пул «хороших», то вообще проблем нет это чистая ML задача (а я как раз недавно приспособился делать диплернинг без нейрональных сетей :).

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

Есть еще Principal Component Analysis (и родственный ему Factor Analysis) смысл которых в отмежевании от ошибок.

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

Как обычно, уже все рассказали. В матлабе имеются эти прекрасные инструменты.

anonymous
()

Выворачивание трубки это ведь «протыкание» одним лучём поверхности, образованной двумя другим лучами? Лучи у вас заданы ломаной из прямых отрезков, а поверхность? ИМХО, в зависимости от того, как будет представлена поверхность, пересечение может быть, а может и не быть.

А как вы будете отличать пересечение всех трёх лучей от пересечения двух с учётом погрешности вобще не понято.

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

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

Ты про какие отрезки вообще? Указанный мной критерий - необходимый и достаточный.

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

Ты про какие отрезки вообще?

Про те из которых состоят данные.

Указанный мной критерий - необходимый и достаточный.
Ты так и не сказал, чем не устраивает произведение двух сторон на вектор нормали.

Это не так. Каких «двух сторон»? Из чего строить треугольник?

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

Про те из которых состоят данные.

Откуда там отрезки? Там координаты трех точек на каждом шаге.

Каких «двух сторон»?

Из любых двух сторон. Их надо заранее выбрать и потом не менять. Например первая сторона - точки 1-2, вторая сторона - точки 1-3.

Из чего строить треугольник?

из точек которые даны. по три на каждый шаг.

Это не так.

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

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

Из любых двух сторон. Их надо заранее выбрать и потом не менять. Например первая сторона - точки 1-2, вторая сторона - точки 1-3.

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

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

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

Нифига не понял. То есть ты предлагаешь взять векторное произведение двух векторов, что и есть нормаль, и смотреть куда оно показывает?

Я предлагаю взять смешанное произведение двух векторов и нормали.

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

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