Локальный минимум экспериментальных данных - PullRequest
0 голосов
/ 10 июля 2020

у меня есть код, который выводит массив данных на каждом временном шаге, вот 2 временных шага:

My objective is to find the coordinates and value of the minimum of that hole. As you can see there are multiple local minima. I want to find the most minimal value of all this value will correspond to the finest hole (around v=0.15) on the left of the wide hole (around v=0.35).

I have an algorithm that uses another function to find a value to start the search for the minimum, which is f-f0 (f0 is a Gaussian), this gives me a function like this:

Сначала я нахожу значение минимума функции f-f0, затем я использую эту координату, чтобы найти локальный минимум функции f.

Минимум i найдите его с помощью супер простого искателя. Он состоит в том, чтобы взять это начальное значение, затем создать новый массив с левым и правым значениями, найти минимум этого массива, если минимум, который я получил, такой же, как тот, который я получил на предыдущем шаге, то это координаты минимум, если не повторять.

Этот метод позволяет мне найти закрывающий локальный минимум для начальной позиции, и поскольку он симметричен c (я добавляю одинаковое количество точек слева и справа) Я всегда получаю минимум слева от начальной позиции (ie. широкое отверстие). Однако я не хочу этого, я хочу самую глубокую дыру. Иногда самая глубокая соответствует той, которую я вычисляю (ie. Красная функция), иногда она не соответствует самой глубокой (ie. Синяя кривая).

Примечание: я делаю это в Fortran, однако, если вы не знаете Fortran, вы можете просто дать мне идею / алгоритм или записать его в python, я могу перевести его на Fortran.

Спасибо.

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Не совсем понятно, как вы подойдете к этому, поскольку кажется, что любой алгоритм должен быть адаптирован к конкретному c типу / форме выходных данных, которые вы генерируете, и где вы хотите, чтобы границы были слева и справа. для поиска. Если ваша функция просто выводит «массив данных», как вы говорите, найдите способ определить разумный левый-правый предел «дыры» и просто найдите там min(array[left:right]). Простой алгоритм может застрять в первой яме, которая у вас есть на левой стороне вашего участка ... поэтому я думаю, что ваша задача - каким-то образом «связать вершины ямы».

0 голосов
/ 12 июля 2020

Я нашел решение, немного подумав.

Раньше я искал минимум функции f-f0, теперь вместо этого я ищу минимум и максимум f-f0. Причина этого в том, что эта функция всегда будет иметь максимум на самом дальнем конце от максимума f и минимум на самом близком конце f. Это связано с симметрией функции Гаусса, поэтому, если отверстие находится слева от максимума f (ie в данном примере), то максимальное значение будет слева от минимума f-f0, и в отверстии находится справа от максимума f, тогда максимум будет справа от минимума f-f0.

После нахождения этих двух точек я получаю их координаты, используя MINLOC(f-f0) и MAXLOC(f-f0). Затем я создаю новый массив размером |imin-imax|, куда я копирую точки f, соответствующие этим координатам. (Я создаю новый массив, потому что с этим массивом делаю другие вещи, но в этом нет необходимости. Мне нужен только минимум, тогда просто сокращайте пределы массива как f(imin:imax))

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

В конце я получаю как значение минимума f, так и значение его координаты v.

...