scipy.optimize.elementwise.

find_minimum#

scipy.optimize.elementwise.find_minimum(f, init, /, *, args=(), допуски=None, maxiter=100, callback=None)[источник]#

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

Для каждого элемента вывода f, find_minimum ищет скалярный минимизатор который минимизирует элемент. В настоящее время эта функция использует алгоритм минимизации с ограничением Чандрупатлы [1] и поэтому требует аргумент init для предоставления трёхточечной скобки минимизации: x1 < x2 < x3 такой, что func(x1) >= func(x2) <= func(x3), где одно из неравенств строгое.

При наличии допустимого интервала, find_minimum гарантированно сходится к локальному минимуму, который удовлетворяет предоставленным допуски если функция непрерывна в пределах скобки.

Эта функция работает поэлементно, когда init и args содержат (транслируемые) массивы.

Параметры:
fcallable

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

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

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

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

find_minimum ищет массив x такой, что f(x) является массивом локальных минимумов.

init3-кортеж из float array_like

Абсциссы стандартного скалярного скобочного минимизатора. Скобка действительна, если массивы x1, x2, x3 = init удовлетворять x1 < x2 < x3 и func(x1) >= func(x2) <= func(x3), где одно из неравенств строгое. Массивы должны быть совместимы для трансляции друг с другом и массивами args.

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

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

допускисловарь чисел с плавающей точкой, опционально

Абсолютные и относительные допуски для корня и значения функции. Допустимые ключи словаря:

  • xatol - абсолютная погрешность корня

  • xrtol - относительная погрешность на корне

  • fatol - абсолютный допуск на значение функции

  • frtol - относительная погрешность по значению функции

См. Примечания для значений по умолчанию и явных условий завершения.

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

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

callbackвызываемый объект, необязательный

Необязательная пользовательская функция, вызываемая перед первой итерацией и после каждой итерации. Вызывается как callback(res), где res является _RichResult аналогично тому, что возвращается find_minimum (но содержащий текущие значения всех переменных на данной итерации). Если callback вызывает StopIteration, алгоритм немедленно завершится и find_root вернёт результат. callback не должен изменять res или его атрибуты.

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

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

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

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

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

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

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

  • -1 : Алгоритм столкнулся с недопустимым интервалом.

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

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

  • -4 : Итерация была завершена callback.

  • 1 : Алгоритм работает нормально (в callback только).

xмассив float

Минимизатор функции, если алгоритм завершился успешно.

f_xмассив float

Значение f вычислено в x.

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

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

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

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

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

Финальная трёхточечная скобка.

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

Значение f вычисленные в точках скобок.

Смотрите также

bracket_minimum

Примечания

Реализовано на основе оригинальной статьи Чандрупатлы [1].

Если xl < xm < xr являются точками скобки и fl >= fm <= fr (где одно из неравенств строгое) являются значениями f вычислены в этих точках, тогда алгоритм считается сошедшимся, когда:

  • abs(xr - xm)/2 <= abs(xm)*xrtol + xatol или

  • (fl - 2*fm + fr)/2 <= abs(fm)*frtol + fatol.

Значение по умолчанию для xrtol является квадратным корнем из точности соответствующего dtype, и xatol = fatol = frtol является наименьшим нормальным числом соответствующего типа данных.

Ссылки

[1] (1,2)

Chandrupatla, Tirupathi R. (1998). “An efficient quadratic fit-sectioning algorithm for minimization without derivatives”. Computer Methods in Applied Mechanics and Engineering, 152 (1-2), 211-217. https://doi.org/10.1016/S0045-7825(97)00190-4

Примеры

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

>>> 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

Значение функции изменяется лишь на несколько ULP в пределах скобки, поэтому минимизатор не может быть определён значительно точнее только путём вычисления функции (т.е. нам потребовалась бы её производная для лучшего результата).

>>> import numpy as np
>>> fl, fm, fr = res_minimum.f_bracket
>>> (fl - fm) / np.spacing(fm), (fr - fm) / np.spacing(fm)
(0.0, 2.0)

Следовательно, точный минимум функции задаётся:

>>> res_minimum.f_x
2.0

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

>>> 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.])