scipy.optimize.elementwise.

bracket_minimum#

scipy.optimize.elementwise.bracket_minimum(f, xm0, *, xl0=None, xr0=None, xmin=None, xmax=None, фактор=None, args=(), maxiter=1000)[источник]#

Ограничить минимум унимодальной вещественной функции вещественной переменной.

Для каждого элемента вывода f, bracket_minimum ищет скалярные точки скобок xl < xm < xr такой, что fl >= fm <= fr где одно из неравенств строгое.

Функция гарантированно найдёт допустимый интервал, если функция сильно унимодальна, но может найти интервал и при других условиях.

Эта функция работает поэлементно, когда xm0, xl0, xr0, xmin, xmax, фактор, и элементы args являются (взаимно транслируемыми) массивами.

Параметры:
fcallable

Функция, для которой требуется найти интервал, содержащий корень. Сигнатура должна быть:

f(x: array, *args) -> array

где каждый элемент x является конечным вещественным числом и args является кортежем, который может содержать произвольное количество массивов, совместимых с x.

f должна быть поэлементной функцией: каждый элемент f(x)[i] должно равняться f(x[i]) для всех индексов i. Он не должен изменять массив x или массивы в args.

xm0: float array_like

Начальное предположение для средней точки интервала.

xl0, xr0: float array_like, опционально

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

xmin, xmaxfloat array_like, optional

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

факторfloat array_like, по умолчанию: 2

Коэффициент, используемый для расширения скобки. См. Примечания.

argsкортеж из array_like, необязательно

Дополнительные позиционные аргументы в виде массивов для передачи в f. Если вызываемый объект, для которого требуется найти корень, требует аргументов, которые не транслируются с x, оберните этот вызываемый объект с f такой, что f принимает только x и поддерживающие вещание *args.

maxiterint, по умолчанию: 1000

Максимальное количество итераций алгоритма для выполнения.

Возвращает:
res_RichResult

Объект, похожий на экземпляр scipy.optimize.OptimizeResult со следующими атрибутами. Описания написаны так, как будто значения будут скалярами; однако, если f возвращает массив, выходные данные будут массивами той же формы.

successлогический массив

True где алгоритм успешно завершился (статус 0); False в противном случае.

statusцелочисленный массив

Целое число, представляющее статус завершения алгоритма.

  • 0 : Алгоритм создал допустимый интервал.

  • -1 : Скобка расширилась до допустимых пределов. При условии унимодальности, это означает, что конечная точка на пределе является минимизатором.

  • -2 : Достигнуто максимальное количество итераций.

  • -3 : Встречено неконечное значение.

  • -4 : None должен пройти.

  • -5 : Начальный интервал не удовлетворяет xmin <= xl0 < xm0 < xr0 <= xmax.

скобка3-кортеж массивов float

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

f_bracket3-кортеж массивов float

Значение функции в левой, средней и правой точках скобки.

nfevцелочисленный массив

Количество абсцисс, в которых f было вычислено для нахождения корня. Это отличается от количества раз f является вызывается поскольку функция может быть вычислена в нескольких точках за один вызов.

nitцелочисленный массив

Количество выполненных итераций алгоритма.

Примечания

Аналогично scipy.optimize.bracket, эта функция пытается найти вещественные точки xl < xm < xr такой, что f(xl) >= f(xm) и f(xr) >= f(xm), где по крайней мере одно из неравенств строгое. В отличие от scipy.optimize.bracket, эта функция может работать векторизованно на входных массивах, если они транслируемы друг с другом. Также в отличие от scipy.optimize.bracket, пользователи могут указать минимальные и максимальные конечные точки для желаемого интервала.

При заданной начальной тройке точек xl = xl0, xm = xm0, xr = xr0, алгоритм проверяет, дают ли эти точки уже допустимый интервал. Если нет, новая конечная точка, w выбирается в направлении "вниз по склону", xm становится новой противоположной конечной точкой, и либо xl или xr становится новой средней точкой, в зависимости от того, в каком направлении происходит спуск. Алгоритм повторяется отсюда.

Новая конечная точка w выбирается по-разному в зависимости от наличия границы xmin или xmax был установлен в направлении спуска. Без потери общности предположим, что направление спуска — вправо, так что f(xl) > f(xm) > f(xr). Если нет правой границы, то w выбирается как xr + factor * (xr - xm) где фактор контролируется пользователем (по умолчанию 2.0), так что размеры шага увеличиваются в геометрической прогрессии. Если есть граница, xmax в этом случае, тогда w выбирается как xmax - (xmax - xr)/factor, с замедлением шагов до остановки в xmax. Такой осторожный подход гарантирует, что минимум, близкий, но отличный от границы, не будет пропущен, а также определяет, является ли xmax является минимизатором, когда xmax достигается после конечного числа шагов.

Примеры

Предположим, мы хотим минимизировать следующую функцию.

>>> def f(x, c=1):
...     return (x - c)**2 + 2

Сначала мы должны найти допустимый интервал. Функция унимодальна, поэтому bracket_minium легко найдет скобку.

>>> from scipy.optimize import elementwise
>>> res_bracket = elementwise.bracket_minimum(f, 0)
>>> res_bracket.success
True
>>> res_bracket.bracket
(0.0, 0.5, 1.5)

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

>>> xl, xm, xr = res_bracket.bracket
>>> fl, fm, fr = res_bracket.f_bracket
>>> (xl < xm < xr) and (fl > fm <= fr)
True

Как только у нас есть допустимый интервал, find_minimum может использоваться для предоставления оценки минимизатора.

>>> res_minimum = elementwise.find_minimum(f, res_bracket.bracket)
>>> res_minimum.x
1.0000000149011612

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

>>> import numpy as np
>>> c = np.asarray([1, 1.5, 2])
>>> res_bracket = elementwise.bracket_minimum(f, 0, args=(c,))
>>> res_bracket.bracket
(array([0. , 0.5, 0.5]), array([0.5, 1.5, 1.5]), array([1.5, 2.5, 2.5]))
>>> res_minimum = elementwise.find_minimum(f, res_bracket.bracket, args=(c,))
>>> res_minimum.x
array([1.00000001, 1.5       , 2.        ])
>>> res_minimum.f_x
array([2., 2., 2.])