scipy.optimize.

toms748#

scipy.optimize.toms748(f, a, b, args=(), k=1, xtol=2e-12, rtol=np.float64(8.881784197001252e-16), maxiter=100, full_output=False, disp=True)[источник]#

Найти корень с использованием метода TOMS Algorithm 748.

Реализует метод Algorithm 748 Алефельда, Потро и Ши для нахождения корня функции f на интервале [a , b], где f(a) и f(b) должны иметь противоположные знаки.

Он использует смесь обратной кубической интерполяции и шагов «ньютоновской квадратики». [APS1995].

Параметры:
fфункция

Функция Python, возвращающая скаляр. Функция \(f\) должен быть непрерывным, и \(f(a)\) и \(f(b)\) имеют противоположные знаки.

aскаляр,

нижняя граница интервала поиска

bскаляр,

верхняя граница интервала поиска

argsкортеж, необязательный

содержащий дополнительные аргументы для функции f. f вызывается функцией f(x, *args).

kint, необязательный

Количество шагов квадратичного метода Ньютона, выполняемых на каждой итерации. k>=1.

xtolскаляр, опционально

Вычисленный корень x0 будет удовлетворять np.isclose(x, x0, atol=xtol, rtol=rtol), где x является точным корнем. Параметр должен быть положительным.

rtolскаляр, опционально

Вычисленный корень x0 будет удовлетворять np.isclose(x, x0, atol=xtol, rtol=rtol), где x является точным корнем.

maxiterint, необязательный

Если сходимость не достигнута за maxiter итераций, возникает ошибка. Должно быть >= 0.

full_outputbool, необязательно

Если full_output равно False, возвращается корень. Если full_output если True, возвращаемое значение (x, r), где x является корнем, и r is a RootResults объект.

dispbool, необязательно

Если True, вызывает RuntimeError, если алгоритм не сошёлся. В противном случае статус сходимости записывается в RootResults возвращаемый объект.

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

Приближенный корень f

rRootResults (присутствует, если full_output = True)

Объект, содержащий информацию о сходимости. В частности, r.converged равно True, если процедура сошлась.

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

brentq, brenth, ridder, bisect, newton
fsolve

найти корни в N измерениях.

elementwise.find_root

эффективный поэлементный одномерный поиск корней

Примечания

f должна быть непрерывной. Алгоритм 748 с k=2 является асимптотически наиболее эффективным известным алгоритмом для нахождения корней четырежды непрерывно дифференцируемой функции. В отличие от алгоритма Брента, который может уменьшать длину охватывающего интервала только на последнем шаге, алгоритм 748 уменьшает её на каждой итерации с той же асимптотической эффективностью, с которой находит корень.

Для простоты формулировки индексов эффективности предположим, что f имеет 4 непрерывные производные. Для k=1, порядок сходимости составляет не менее 2.7, и при примерно асимптотически 2 вычислениях функции на итерации индекс эффективности приблизительно равен 1.65. Для k=2, порядок составляет около 4,6 с асимптотически 3 вычислениями функции за итерацию и индексом эффективности 1,66. Для более высоких значений k, индекс эффективности приближается к k-му корню из (3k-2), следовательно k=1 или k=2 обычно подходят.

Как упомянуто в документации параметров, вычисленный корень x0 будет удовлетворять np.isclose(x, x0, atol=xtol, rtol=rtol), где x является точным корнем. В форме уравнения это условие завершения выглядит как abs(x - x0) <= xtol + rtol * abs(x0).

Значение по умолчанию xtol=2e-12 может привести к неожиданному поведению, если ожидается toms748 всегда вычислять корни с относительной погрешностью, близкой к машинной точности. Следует быть осторожным при выборе xtol для конкретного случая использования. Установка xtol=5e-324, наименьшее субнормальное число, обеспечит наивысший уровень точности. Большие значения xtol может быть полезно для сохранения вычислений функций, когда корень находится в нуле или рядом с ним в приложениях, где крошечные абсолютные различия, доступные между числами с плавающей запятой около нуля, не имеют смысла.

Ссылки

[APS1995]

Alefeld, G. E. and Potra, F. A. and Shi, Yixun, Алгоритм 748: Ограничение нулей непрерывных функций, ACM Trans. Math. Softw. Volume 221(1995) doi = {10.1145/210089.210111}

Примеры

>>> def f(x):
...     return (x**3 - 1)  # only one real root at x = 1
>>> from scipy import optimize
>>> root, results = optimize.toms748(f, 0, 2, full_output=True)
>>> root
1.0
>>> results
      converged: True
           flag: converged
 function_calls: 11
     iterations: 5
           root: 1.0
         method: toms748