Пакет SciPyOptimes предоставляет процедуры для минимизации (или максимизации), иногда с учетом ограничений, целевых функций. Ограниченный и нелинейный метод наименьших квадратов, линейное программирование, нелинейный метод наименьших квадратов, подбор кривой и поиск корня — вот некоторые из включенных средств решения нелинейных задач.
Здесь, в этом разделе, мы будем использовать метод root() Python Scipy, который существует в модуле scipy.optimize, который находит корень векторной функции.
Синтаксис:
scipy.optimize.root(fun, x0, args=(), method='hybr', jac=None, tol=None, callback=None, options=None)
Где параметры:
- fun: векторная функция для поиска корня.
- x0 (ndarray): начальное предположение.
- args (tuple): переданы дополнительные входные данные в якобиан целевой функции.
- method (строка): тип решателя, должен быть один из lm, hybr, broyden1, broyden2 и т. д.
- jac (boolean): Fun должна возвращать значение якобиана вместе с целевой функцией, если jac имеет логическое значение и истинно. Если значение равно False, якобиан будет оценен численно. Джек также может вернуть якобиан веселья, когда его вызовут. В этом случае оно должно принять те же оправдания, что и развлечение.
- tol (folat): Допуск на остановку. Используйте настройки, специфичные для решателя, для более детального управления.
- callback: функция обратного вызова, которая является необязательной. Обратный вызов(x, f), где x — текущее решение, а f — связанный остаток, выполняется на каждой итерации. для всех техник, кроме «hybr» и «lm».
- options (словарь): список возможных решателей. Например, xtol или maxiter.
Объект OptimizeResult, возвращаемый этой функцией, представляет решение. В составе объекта возвращаются три основных компонента.
Давайте рассмотрим пример, выполнив следующие шаги.
Импортируйте необходимые библиотеки или методы, используя приведенный ниже код Python.
import numpy as np from scipy.optimize import root
Система нелинейных уравнений и ее якобиан определяются следующими функциями.
def func(x): return [x[0] + 0.4 *(x[0] - x[1])**2 - 1.0, 0.4 *(x[1] - x[0])**2 + x[1]] def jacb(x): return np.array([[1 + 1.4 *(x[0] - x[1])**2, -1.4 *(x[0] - x[1])**2], [-1.4 *(x[1] - x[0])**2, 1 + 1.4 *(x[1] - x[0])**2]])
Найдите решение, используя приведенный ниже код.
solution = root(func, [0, 0], jac=jacb, method='hybr') solution.x
- Метод root_scalar()
- Метод scipy.optimize.root()
- Метод root()
- Метод brentq()
- Метод brenth()
- Метод ridder()
Метод root_scalar()
Python Scipy содержит метод root_scalar() в модуле scipy.optimize, который идентифицирует корень скалярной функции.
Синтаксис приведен ниже.
scipy.optimize.root_scalar(f, args=(), method=None, bracket=None, fprime=None, fprime2=None, x0=None, x1=None, xtol=None, rtol=None, maxiter=None, options=None)
Где параметры:
- fun: векторная функция для поиска корня.
- x0 (ndarray): Начальное предположение.
- x1 (float): Второе предположение.
- args (tuple): переданы дополнительные входные данные в якобиан целевой функции.
- method (строка): тип решателя, должен быть одним из следующих: биссектриса, ньютон, наездник и т. д.
- backet (последовательность из двух чисел с плавающей запятой): знаки f(x, *args) на двух концах должны различаться, чтобы интервал имел корень.
- fprime (boolean, callable): считается, что целевая функция и производные значения возвращаются функцией f, если fprime является логическим значением и имеет значение True. Вызываемая функция fprime также может возвращать производную f. В этом случае он должен принять те же обоснования, что и f.
- fprime2 (boolean, callable): значение целевой функции, а также первая и вторая производные считаются возвращаемыми функцией f, если fprime2 является логическим значением и имеет значение True. Вызываемая функция fprime2 также может возвращать вторую производную f. В этом случае он должен принять те же обоснования, что и f.
- xtol (float): абсолютный допуск на завершение.
- rtol (float): относительная устойчивость к завершению.
- maxiter: максимальное количество итераций.
- options (словарь): список возможных решателей.
Давайте рассмотрим пример, выполнив следующие шаги.
Импортируйте необходимые библиотеки или методы, используя приведенный ниже код Python.
from scipy.optimize import root_scalar
Определите кубическую функцию, используя приведенный ниже код.
def fun(x): return(x**3 - 1)
Найдите корень кубического числа, используя приведенный ниже код.
solution = root_scalar(fun, bracket=[0, 3], method='brentq') solution.root, solution.iterations, solution.function_calls
Метод scipy.optimize.root()
Метод scipy.optimize.root() принимает метод параметра, который может использовать разные методы для поиска корня.
Для этого параметра существует значение lm, которое использует Левенберга-Марквардта для поиска решения по методу наименьших квадратов.
Синтаксис:
scipy.optimize.root(fun, tol=None, callback=None, options={'col_deriv': 0,, x0, args=(), method='lm', jac=None, 'xtol': 1.49012e-08, 'ftol': 1.49012e-08, 'gtol': 0.0, 'maxiter': 0, 'eps': 0.0, 'factor': 100, 'diag': None})
Где параметры:
- col_deriv (boolean): чтобы функция Якобиана вычисляла производные по столбцам, значение должно быть ненулевым.
- ftol (float): желаемая относительная ошибка суммы квадратов.
- xtol (float): желаемая относительная ошибка аппроксимационного решения.
- gtol (floa): желаемая ортогональность между столбцами столбца якобиана и вектором функции.
- maxiter (int): наибольшее количество вызовов функции. Если значение равно нулю, максимальное значение равно 100*(N+1), где N — количество компонентов в x0.
- epsfcn (float): хороший размер шага для аппроксимации Jacobian прямой разности (для Dfun=None). Считается, что относительные погрешности функций порядка машинной точности, если epsfcn меньше машинной точности.
- factor (с плавающей запятой): переменная, которая управляет границей первого шага(фактор * || Diag * x||). Должен быть разнесен(0,1, 100).
- diag (sequence): масштабные коэффициенты для переменных представляют собой N положительных записей.
Метод root()
Мы уже узнали о том, как работает метод root(), из приведенного выше подраздела этого руководства, теперь мы создадим функцию для вычисления Jacobian.
Давайте рассмотрим пример, выполнив следующие шаги.
import numpy as np from scipy.optimize import root
Построил вектор и функцию Jacobian, используя приведенный ниже код.
def basefunc(x): return [ x[1] + 1.4 *(x[1] + x[0])**2 - 3.0, 0.4 *(x[0] - x[1])**3 + x[0]] def jacob_func(a): return np.array([[1 + 1.4 *(a[0])**2, -2.4 *(a[0] - a[1])**2], [-1.4 *(a[1] - a[0])**3, 1 + 1.4 *(a[0] + a[1])**2]] )
Чтобы использовать вспомогательную технику Андерсона для определения корня векторной функции, используйте функцию optimization.root.
result = root(basefunc, [0, 0], jac=jacob_func, method='anderson')
Проверьте результат, используя приведенный ниже код.
print(result.x)
Метод brentq()
В Python Scipy есть метод brentq() в модуле scipy.optimize, который использует подход Брента для поиска корня функции в интервале брекетинга.
Нуль функции f на знакопеременном интервале [a, b] определяется традиционным методом Брента. Используемая здесь процедура поиска корня в целом считается лучшей. Использование обратной квадратичной экстраполяции является безопасным вариантом секущего метода.
Обратная квадратичная интерполяция, интервальное деление пополам и заключение корневых скобок сочетаются в подходе Брента. Другое название этого подхода — подход Ван Вейнгаардена-Деккера-Брента. Согласно Бренту(1973), сходимость обеспечивается для функций, которые можно вычислить в пределах [a,b].
Синтаксис:
scipy.optimize.brentq(f, a, b, maxiter=100, args=(), xtol=2e-12, rtol=8.881784197001252e-16, full_output=False, disp=True)
Где параметры:
- f(): возврат числа — это функция Python. Требуется, чтобы f(a) и f(b) имели противоположные знаки и чтобы f была непрерывной функцией.
- a (скаляр): один конец диапазона брекетинга [a,b].
- b (скаляр): другой конец диапазона брекетинга [a,b].
- xtol (number): np.allclose(x, x0, atol=xtol, rtol=rtol), где x представляет точный корень, будет удовлетворяться вычисленным корнем x0. Переменная не должна быть отрицательной. При использовании xtol/2 и rtol/2 техника Брента часто удовлетворяет вышеупомянутому критерию приятных функций.
- rtol (number): np.allclose(x, x0, atol=xtol, rtol=rtol), где x представляет точный корень, будет удовлетворяться вычисленным корнем x0. Значение параметра по умолчанию 4*np.finfo не может быть меньше(с плавающей запятой). eps. При использовании xtol/2 и rtol/2 техника Брента часто удовлетворяет вышеупомянутому критерию приятных функций.
- maxiter (int): возникает ошибка, если сходимость не может быть достигнута за максимальное количество повторений. Должно быть больше или равно 0.
- args (tuple): применение(f,(x)+args) вызывает функцию f с дополнительными аргументами.
- full_output (boolean): возврат корня происходит, если full_output имеет значение False. Полный вывод возвращает значение(x, r), где x — это корень, а r — объект RootResults, если полный вывод имеет значение True.
- disp (boolean): если True, то если алгоритм не сходится, сообщите об ошибке RuntimeError. В противном случае любой возвращаемый объект RootResults содержит запись о состоянии конвергенции.
Метод brentq() возвращает x0(между a и b f имеет ноль).
Давайте возьмем пример и найдем корень функции, используя метод brenqt(), выполнив следующие шаги.
Импортируйте необходимые библиотеки или методы, используя приведенный ниже код Python.
from scipy.optimize import brentq
Определите функцию, корень которой мы хотим найти, используя приведенный ниже код.
def fun(x): return(x**3 - 1)
Теперь найдите корень функции, используя приведенный ниже код.
brentq(fun, 1,0)
Метод brenth()
Метод brenth() модуля scipy.optimize Python Scipy использует подход Брента и гиперболическую экстраполяцию: можно найти корень функции в интервале брекетинга.
Альтернатива традиционному методу Брента, который использует обратную квадратичную экстраполяцию вместо гиперболической экстраполяции для определения нуля функции f между параметрами a и b.
Верхняя граница оценок функций с использованием этого метода, согласно Басу и Деккеру(1975), в 4 или 5 раз ниже, чем для бисекции, что гарантирует сходимость для этого метода.
Знаки f(a) и f(b) не могут быть одинаковыми. В целом соответствует стандарту Brent, но не так тщательно проверен. Этот метод секущих, основанный на гиперболической экстраполяции, является безопасным вариантом оригинала.
Синтаксис:
scipy.optimize.brenth(f, a, b, args=(), xtol=2e-12, rtol=8.881784197001252e-16, maxiter=100, full_output=False, disp=True)
Где параметры:
- f(): возврат числа — это функция Python. Требуется, чтобы f(a) и f(b) имели противоположные знаки и чтобы f была непрерывной функцией.
- a (скаляр): один конец диапазона брекетинга [a,b].
- b (скаляр): другой конец диапазона брекетинга [a,b].
- xtol (number): np.allclose(x, x0, atol=xtol, rtol=rtol), где x представляет точный корень, будет удовлетворяться вычисленным корнем x0. Переменная не должна быть отрицательной. При использовании xtol/2 и rtol/2 техника Брента часто удовлетворяет вышеупомянутому критерию приятных функций.
- rtol (number): np.allclose(x, x0, atol=xtol, rtol=rtol), где x представляет точный корень, будет удовлетворяться вычисленным корнем x0. Значение параметра по умолчанию 4*np.finfo не может быть меньше (с плавающей запятой). При использовании xtol/2 и rtol/2 техника Брента часто удовлетворяет вышеупомянутому критерию приятных функций.
- maxiter (int): возникает ошибка, если сходимость не может быть достигнута за максимальное количество повторений. Должно быть больше или равно 0.
- args (tuple): применение(f,(x)+args) вызывает функцию f с дополнительными аргументами.
- full_output (boolean): возврат корня происходит, если full_output имеет значение False. Полный вывод возвращает значение(x, r), где x — это корень, а r — объект RootResults, если полный вывод имеет значение True.
- disp (boolean): если True, то если алгоритм не сходится, сообщите об ошибке RuntimeError. В противном случае любой возвращаемый объект RootResults содержит запись о состоянии конвергенции.
Метод brenth() возвращает x0 (между a и b f имеет ноль).
Давайте возьмем пример и найдем корень функции, используя метод brenth(), выполнив следующие шаги.
Импортируйте необходимые библиотеки или методы, используя приведенный ниже код Python.
from scipy.optimize import brenth
Определите функцию, корень которой мы хотим найти, используя приведенный ниже код.
def fun(x): return(x**3 - 1)
Теперь найдите корень функции, используя приведенный ниже код.
brentq(fun, 1,0)
Метод ridder()
Метод ridder() модуля scipy.optimize Python Scipy использует метод Риддера и находит корень интервала функции.
Синтаксис:
scipy.optimize.ridder(f, a, b, args=(), xtol=2e-12, rtol=8.881784197001252e-16, maxiter=100, full_output=False, disp=True)
- f(): возврат числа — это функция Python. Требуется, чтобы f(a) и f(b) имели противоположные знаки и чтобы f была непрерывной функцией.
- a (скаляр): один конец диапазона брекетинга [a,b].
- b (скаляр): другой конец диапазона брекетинга [a,b].
- xtol (number): np.allclose(x, x0, atol=xtol, rtol=rtol), где x представляет точный корень, будет удовлетворяться вычисленным корнем x0. Переменная не должна быть отрицательной. При использовании xtol/2 и rtol/2 техника Брента часто удовлетворяет вышеупомянутому критерию приятных функций.
- rtol (number): np.allclose(x, x0, atol=xtol, rtol=rtol), где x представляет точный корень, будет удовлетворяться вычисленным корнем x0. Значение параметра по умолчанию 4*np.finfo не может быть меньше (с плавающей запятой). При использовании xtol/2 и rtol/2 техника Брента часто удовлетворяет вышеупомянутому критерию приятных функций.
- maxiter (int): возникает ошибка, если сходимость не может быть достигнута за максимальное количество повторений. Должно быть больше или равно 0.
- args (tuple): применение(f,(x)+args) вызывает функцию f с дополнительными аргументами.
- full_output (boolean): возврат корня происходит, если full_output имеет значение False. Полный вывод возвращает значение(x, r), где x — это корень, а r — объект RootResults, если полный вывод имеет значение True.
- disp (boolean): если True, то если алгоритм не сходится, сообщите об ошибке RuntimeError. В противном случае любой возвращаемый объект RootResults содержит запись о состоянии конвергенции.
Методridder() возвращает x0(между a и b f имеет ноль).
Давайте возьмем пример и найдем корень функции, используя метод brenth(), выполнив следующие шаги.
Импортируйте необходимые библиотеки или методы, используя приведенный ниже код Python.
from scipy.optimize import ridder
Определите функцию, корень которой мы хотим найти, используя приведенный ниже код.
def fun(x): return(x**4 - 2)
Теперь найдите корень функции, используя приведенный ниже код.
ridder(fun, 0,3)