fmin_cobyla#
- scipy.optimize.fmin_cobyla(функция, x0, cons, args=(), consargs=None, rhobeg=1.0, rhoend=0.0001, maxfun=1000, disp=None, catol=0.0002, *, callback=None)[источник]#
Минимизировать функцию с использованием метода Ограниченной Оптимизации Линейной Аппроксимацией (COBYLA). Этот метод использует чистую python-реализацию алгоритма из PRIMA.
- Параметры:
- функцияcallable
Функция для минимизации. В форме func(x, *args).
- x0ndarray
Начальное приближение.
- consпоследовательность
Функции ограничений; все должны быть
>=0(одна функция, если только 1 ограничение). Каждая функция принимает параметры x в качестве первого аргумента и может возвращать либо одно число, либо массив или список чисел.- argsкортеж, необязательный
Дополнительные аргументы для передачи в функцию.
- consargsкортеж, необязательный
Дополнительные аргументы для передачи функциям ограничений (по умолчанию None означает использование тех же дополнительных аргументов, что и передаваемые в func). Используйте
()без дополнительных аргументов.- rhobegfloat, опционально
Разумные начальные изменения переменных.
- rhoendfloat, опционально
Конечная точность в оптимизации (не гарантируется точно). Это нижняя граница размера области доверия.
- disp{0, 1, 2, 3}, опционально
Управляет частотой вывода; 0 означает отсутствие вывода.
- maxfunint, необязательный
Максимальное количество вычислений функции.
- catolfloat, опционально
Абсолютная погрешность для нарушений ограничений.
- callbackвызываемый объект, необязательный
Вызывается после каждой итерации, как
callback(x), гдеxявляется текущим вектором параметров.
- Возвращает:
- xndarray
Аргумент, который минимизирует f.
Смотрите также
minimizeИнтерфейс к алгоритмам минимизации многомерных функций. См. 'COBYLA' метод в частности.
Примечания
Этот алгоритм основан на линейных аппроксимациях целевой функции и каждого ограничения. Мы кратко описываем алгоритм.
Предположим, функция минимизируется по k переменным. На j-й итерации алгоритм имеет k+1 точек v_1, …, v_(k+1), приближенное решение x_j и радиус RHO_j. (т.е., линейное плюс константа) приближения к целевой функции и функциям ограничений так, что их значения совпадают с линейным приближением на k+1 точках v_1,.., v_(k+1). Это дает линейную программу для решения (где линейные приближения функций ограничений ограничены неотрицательностью).
Однако линейные приближения, вероятно, являются хорошими приближениями только вблизи текущего симплекса, поэтому линейной программе предъявляется дополнительное требование, что решение, которое станет x_(j+1), должно находиться в пределах RHO_j от x_j. RHO_j только уменьшается, никогда не увеличивается. Начальное RHO_j равно rhobeg, а конечное RHO_j равно rhoend. Таким образом, итерации COBYLA ведут себя как алгоритм доверительной области.
Кроме того, линейная программа может быть противоречивой, или приближение может давать слабое улучшение. Подробности о том, как эти проблемы решаются, а также о том, как обновляются точки v_i, см. в исходном коде или ссылках ниже.
Изменено в версии 1.16.0: Исходная реализация Пауэлла была заменена чистой версией на Python из пакета PRIMA, с исправлениями ошибок и улучшениями.
Ссылки
Пауэлл М.Дж.Д. (1994), «Метод оптимизации прямого поиска, который моделирует целевую и ограничивающие функции линейной интерполяцией», в Advances in Optimization and Numerical Analysis, ред. С. Гомес и Ж.-П. Эннар, Kluwer Academic (Дордрехт), стр. 51-67
Пауэлл М.Дж.Д. (1998), «Алгоритмы прямого поиска для оптимизационных вычислений», Acta Numerica 7, 287-336
Пауэлл М.Дж.Д. (2007), «Взгляд на алгоритмы оптимизации без производных», технический отчёт Кембриджского университета DAMTP 2007/NA03
Zhang Z. (2023), “PRIMA: Reference Implementation for Powell’s Methods with Modernization and Amelioration”, https://www.libprima.net, DOI:10.5281/zenodo.8052654
Примеры
Минимизировать целевую функцию f(x,y) = x*y при ограничениях x**2 + y**2 < 1 и y > 0:
>>> def objective(x): ... return x[0]*x[1] ... >>> def constr1(x): ... return 1 - (x[0]**2 + x[1]**2) ... >>> def constr2(x): ... return x[1] ... >>> from scipy.optimize import fmin_cobyla >>> fmin_cobyla(objective, [0.0, 0.1], [constr1, constr2], rhoend=1e-7) array([-0.70710685, 0.70710671])
Точное решение: (-sqrt(2)/2, sqrt(2)/2).