template <class F, class T, class Tol>
std::pair<T, T>
toms748_solve(
F f,
const T& a,
const T& b,
Tol tol,
boost::uintmax_t& max_iter);
template <class F, class T, class Tol, class Policy>
std::pair<T, T>
toms748_solve(
F f,
const T& a,
const T& b,
Tol tol,
boost::uintmax_t& max_iter,
const Policy&);
template <class F, class T, class Tol>
std::pair<T, T>
toms748_solve(
F f,
const T& a,
const T& b,
const T& fa,
const T& fb,
Tol tol,
boost::uintmax_t& max_iter);
template <class F, class T, class Tol, class Policy>
std::pair<T, T>
toms748_solve(
F f,
const T& a,
const T& b,
const T& fa,
const T& fb,
Tol tol,
boost::uintmax_t& max_iter,
const Policy&);
Эти функции реализуют TOMS Algorithm 748: он использует смесь кубического, квадратного и линейного (секантного) интерполяции, чтобы найти корень f(x). Две пары функций различаются только тем, доступны ли уже значения для f(a) и f(b).
Вообще говоря, проще (и часто более эффективно) использовать bracket и решать, а не пытаться закрепить корень самостоятельно, как этого требует эта функция.
Эта функция предоставляется, а не метод Brent, поскольку она, как известно, более эффективна во многих случаях (это асимптически наиболее эффективный известный и был показан как оптимальный для определенных классов гладких функций). Он также имеет полезное свойство уменьшать размер кронштейна с каждым шагом, в отличие от метода Брента, который только сокращает интервал закрытия на заключительном этапе. Это делает его особенно полезным, когда вам нужен результат, когда концы интервального раунда до одного и того же целого числа: как часто бывает в статистических приложениях, например. В этой ситуации функция может выйти после гораздо меньшего количества итераций, чем в противном случае было бы возможно.
Параметры алгоритма TOMS 748:
- f
Неарочный функтор, который является функцией, чей корень должен быть решен. f(x) не должен равномерно увеличиваться или уменьшаться на x и может иметь несколько корней. Тем не менее, указанные ограничения должны быть заключены в квадратные скобки одного корня.
- a
Нижняя граница для начальной кронштейна корня.
- b
Верхний предел для начальной кронштейна корня. Это предварительное условие, что a < b и что a и b фиксируют корень, чтобы найти f(a) * f(b) < 0.
- fa
Опционно: значение f(a).
- fb
Опционно: значение f(b).
- tol
Бинарный фанктор, который определяет условие прекращения для поиска корня. tol принимает нынешние скобки на каждом шагу, когда это вернет, то текущие скобки возвращаются в результате. См. также предопределенные выходные фанкторы.
- max_iter
Максимальное количество призваний к выполнению в поиске корня. На выходе max_iter настроено на фактическое количество используемых функций.
Окончательный аргумент Политика является необязательным и может использоваться для контроля поведения функции: как он обрабатывает ошибки, какой уровень точности использовать и т.д. См. документ политики для более подробной информации.
toms748_solve
возвратит: пара значений r, которые скрепляют корень таким образом:
f(r.first) * f(r.second) <= 0
или
tol(r.first, r.second) == true
или
max_iter >= m
где m является начальным значением max_iter, переданным функции.
Иными словами, это зависит от звонящего, чтобы проверить, произошло ли прекращение в результате превышения max_iter функции ссылок (просто сделано путем проверки обновленного значения max_iter против его предыдущего значения, принятого в качестве параметра), а не потому, что условие прекращения tol было выполнено.