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 вычисленные в точках скобок.
Смотрите также
Примечания
Реализовано на основе оригинальной статьи Чандрупатлы [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.])