Структура данных и алгоритмы для одномерной скоростной модели с использованием слоев? - PullRequest
0 голосов
/ 27 июня 2019

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

Что я хочу моделировать:

  • Скорость как функция глубины (z)
  • Модель построена из нескольких слоев (
    • Каждый слой доступен по индексу, идущему от 0 для самого верхнего слоя до n для самого нижнего слоя
  • Каждый слой имеет скорость как линейную функцию глубины (градиент a_k и пересечение оси b_k k-го слоя)
  • Каждый слой имеет верхнюю и нижнюю глубину (z_k-1 и z_k)
  • Модель завершена, между слоями нет места. Точка непосредственно между двумя слоями принадлежит нижнему слою

Требования:

  • Получить скорость на произвольной глубине внутри модели. Это будет сделано порядка от 1 до 10 000 раз, поэтому его следует хорошо оптимизировать.
  • Доступ к верхней и нижней глубинам, градиентам и пересечениям слоя по индексу слоя

Что у меня так далеко:
У меня есть рабочий код Python, где каждый слой сохраняется в виде массива со значениями z_k (нижняя глубина), z_k-1 (верхняя глубина), a_k (градиент скорости) и b_k (пересечение оси). Чтобы оценить модель на определенной глубине, я получаю индекс слоя (используйте его, чтобы получить параметры слоя и передать их функции, которая оценивает линейный градиент скорости.

1 Ответ

1 голос
/ 27 июня 2019

Итак, у вас есть кусочно-линейная зависимость, где z-координаты концов кусков идут нерегулярно, и вы хотите получить значение функции при заданном z.

Обратите внимание, что нет смысла использовать бинарный поиск для 10 фрагментов (3-4 раунда БС могут быть медленнее, чем 9 простых сравнений).

Но какова точность ваших глубинных запросов? Обратите внимание, что вы можете хранить таблицу как с разрешением 1 метр, так и с 1 миллиметром - только 10 ^ 7 записей обеспечивают O (1) доступ к любому предварительно рассчитанному значению скорости

Для ограниченного числа фигур можно составить длинную формулу (с целочисленным делением), но результаты, возможно, должны быть медленнее.

Пример произвольной полилинии из трех частей с граничными точками 2 и 4.5:

f = f0 + 0.2*int(z/2.0)*(z-2.0) + 0.03*int(z/4.5)*(z-4.5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...