Рисование случайных значений из распределения Фишера - PullRequest
1 голос
/ 11 декабря 2010

В своем исследовании я создаю дискретные плоскости, которые предназначены для представления трещин в породе. Ориентация плоскости разрушения определяется ее наклонами и направлениями падения. Зная это, я также знаю компоненты вектора нормали для каждой плоскости.

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

Описано распределение fisher ЗДЕСЬ

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

Дополнительная информация: Похоже, что «распределение Мисса-Фишера» либо совпадает с тем, что я называю «распространением Фишера», либо как-то связано. Некоторая информация о распределении Von Mises-Fisher:

Как видите, я кое-что изучил, но признаюсь, что не до конца понимаю математику. Я чувствую, что я близко, но не совсем понимаю ... Любая помощь очень ценится!

Если это поможет, мое программирование на Фортране.

Ответы [ 2 ]

2 голосов
/ 11 декабря 2010

Алгоритм приведен на странице 59 «Статистический анализ сферических данных» Н.И. Фишера, Т. Льюиса и Б.Дж.Д. Эмблтона.Я настоятельно рекомендую эту книгу - она ​​поможет вам понять математику.

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

  lambda = exp (-2.0 * kappa)
  term1 = get_uniform_random () * (1.0 - lambda) + lambda
  CoLat = 2.0 * asin ( sqrt ( -log (term1) / (2.0 * kappa) ) )
  Long = 2.0 * PI * get_uniform_random ()
2 голосов
/ 11 декабря 2010

Я думаю, что вы можете сделать математику вручную

  • Интегрируйте функцию плотности распределения Фишера, чтобы получить интегральную функцию распределения

    F (тета) = exp (K cos (тета))) / (exp (k) -exp (-k))

  • Следующий шаг - найти функцию обратной кумулятивной функции распределения F ^ (- 1) (y). Эта функция выполняет

    F (тета) = y <=> F ^ (- 1) (y) = тета

  • Я думаю, что вы получите следующее.

    F ^ (- 1) (y) = arccos (log ((exp (k) -exp (-k)) * y) / K)

  • Нарисуйте y1, y2, y3, y4 ... из равномерного распределения на интервале [0, 1]

  • Теперь числа F ^ (- 1) (y1), F ^ (- 1) (y2), F ^ (- 1) (y3), F ^ (- 1) (y4) будут распределяться в соответствии с распределением Фишера.

...