Пожалуйста, подпишитесь на официальный канал Codeforces в Telegram по ссылке https://t.me/codeforces_official. ×

Блог пользователя RodionGork

Автор RodionGork, 10 лет назад, По-русски

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

Дано: Xi, Yi, Ti — координаты и время регистрации взрыва каждым из датчиков (i = 1..4 больше всё равно не нужно, вроде).

Найти: X0, Y0, T0 — координаты и время самого взрыва.

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


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

А вот как её решить изящно / красиво / аккуратно?

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

Мне упорно кажется что у меня чуть ли не к линейной системе свелось всё и оказалось можно скорость исключить. Но когда я беру в руки карандаш и бумагу — мне перестаёт казаться что это возможно.

Сами мы не местные! Помогите старому склерознику! А то коллеги кому я эту задачку задал интересуются — а я запоздало обнаружил что сам не помню как решал :)

  • Проголосовать: нравится
  • +26
  • Проголосовать: не нравится

»
10 лет назад, # |
Rev. 4   Проголосовать: нравится 0 Проголосовать: не нравится

Ну, если все измерения точны, то вроде четырех датчиков должно хватить, неизвестные параметры (X0, Y0, T0, V) находим из системы:

sqrt((Xi - X0)2 + (Yi - Y0)2) / V = (Ti - T0)

Но я бы не стал писать так на практике — в реальных измерениях обычно всегда есть погрешности. Лучше предположить, что (по крайней мере время) мы измеряем с ошибками e_i, одинаково распределенными для всех наблюдений. Тогда неизвестные параметры можно найти, минимизируя сумму квадратов ошибок (стандартный OLS-подход в эконометрике):

Min |по X0, Y0, T0, V| of { SUM |по i| (ei)2 } где

ei = T0 + sqrt((Xi - X0)2 + (Yi - Y0)2) / V - Ti

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

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Спасибо за ответ!

    Но я бы не стал писать так на практике

    Нет нет, сейчас задача уже не стоит на практике. Когда 5 лет назад я решал её на реальных данных — там же сами времена Ti было нельзя точно определить т.к. они выглядели как "всплески" на довольно шумном графике, и большинство не имело достаточно чёткого фронта. Правда был лишний датчик (всего 5) поэтому можно было пытаться понять насколько результаты "грешные".

    Ну я просто для каждой четвёрки датчиков (из пяти) определял точку и оценивал насколько разница между найденными пятью решениями велика.

    Тогда неизвестные параметры можно найти, минимизируя сумму квадратов

    Да... Это я и собираюсь коллегам ответить если умнее ничего не вспомню. Но возможно действительно ложная память :)

    • »
      »
      »
      10 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

      Ну, сильно умнее ничего и нет для задачи в этой формулировке =)

      Кстати, если точное время взрыва неизвестно, а есть только график шума со всплеском во времени около времени взрыва — то правильнее здесь использовать даже не OLS а ML (метод максимального правдоподобия). В этом случае график сигнала, по которому вы оцениваете время взрыва, лучше сгладить, нормировать (чтобы интеграл был равен 1) и трактовать как плотность вероятности того, что в данное время произошел взрыв — то есть у нас для каждого датчика есть функция Pi(t) — возвращает вероятность того, что волна от взрыва дошла в данное время. Тогда наша задача — подобрать такие параметры (X0, Y0, T0, V), чтобы максимизировать произведение величин Pi(T0 + sqrt((X0 - Xi)2 + (Y0 - Yi)2) / V)

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

»
10 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Упс, я думал, что известно время относительно момента взрыва.