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