Числові методи для нулів функцій — Ньютон, бісекція, Брент
Кожна симуляція, що розв'язує неявне рівняння — від перетину променя зі сферою до рівноважних цін чи оберненої кінематики — зрештою потребує знайти точку, де функція перетинає нуль. Ось як бісекція, метод Ньютона-Рафсона, метод січних і гібридний алгоритм Брента атакують цю задачу, і чому промислові бібліотеки зупиняються саме на Бренті.
1. Задача пошуку коренів
Маючи неперервну функцію f(x), коренем є таке значення x*, що f(x*) = 0. Незліченні задачі симуляцій та інженерії зводяться саме до такої форми: знаходження точки перетину променя з неявною поверхнею, обчислення рівноважної процентної ставки, за якої поточна вартість облігації відповідає її ціні, розв'язання оберненої кінематики для кута суглоба, що досягає цільової точки, або знаходження термінальної швидкості, за якої сила опору точно врівноважує гравітацію.
Аналітичні розв'язки існують лише для окремих випадків — лінійних і квадратних рівнянь та кількох інших. Загальне рівняння п'ятого степеня взагалі не має формули в радикалах (результат, доведений Еваристом Галуа 1832 року), а більшість функцій, що виникають у фізиці, фінансах і графіці, трансцендентні — містять експоненти, тригонометричні функції або є виходами симуляцій без жодної замкненої форми. Чисельний пошук коренів тому не є обхідним шляхом — це єдиний загальний доступний метод.
Кожен практичний алгоритм пошуку коренів компромісує між трьома властивостями:
Надійність
гарантована збіжність?
Чи метод завжди знаходить корінь, якщо він існує в області пошуку, незалежно від форми функції?
Швидкість
ітерацій до збіжності
Скільки обчислень функції потрібно, щоб досягти точності машинного представлення?
Вимоги
похідна? вилка?
Чи метод потребує аналітичної похідної, чи двох стартових точок, що обмежують зміну знака?
Жоден метод не виграє за всіма трьома осями одночасно — саме тому промислові чисельні бібліотеки (fzero у MATLAB, optimize.brentq у SciPy, GNU Scientific Library) реалізують кілька алгоритмів і комбінують їх адаптивно.
2. Бісекція: повільно, але надійно
Бісекція спирається на теорему про проміжне значення: якщо f неперервна на [a, b] і f(a) та f(b) мають протилежні знаки, то десь у (a, b) обов'язково є корінь. Алгоритм просто ділить навпіл інтервал пошуку на кожному кроці, завжди залишаючи ту половину, де ще є зміна знака:
Гарантія безумовна: доки початкова вилка має протилежні знаки, а f неперервна, бісекція не може не збігтися до кореня, хоч би якою дикою була форма функції між кінцями відрізка. Саме тому вона є останнім рубежем усередині кожного гібридного розв'язувача — коли швидші методи поводяться погано, бісекція є страховкою, що гарантує прогрес.
Ціна цієї гарантії — швидкість: бісекції потрібно приблизно 50 ітерацій, щоб досягти ~15-16 значущих розрядів подвійної точності з рухомою крапкою, набуваючи лише одного біта точності (близько 0.3 десяткового розряду) за крок. Вона також повністю ігнорує форму функції — трактує майже лінійну функцію та шалено осцилюючу однаково, відкидаючи корисну інформацію, яку розумніший метод міг би використати.
f(a) та f(b) протилежного знака. Знайти таку вилку взагалі — особливо для функцій із кількома коренями чи вузькими сплесками — саме собою є нетривіальною задачею, зазвичай виконуваною скануванням грубої сітки зразків на предмет зміни знака перед запуском бісекції.3. Ньютон-Рафсон: квадратична швидкість без страховки
Метод Ньютона-Рафсона (опублікований Ісааком Ньютоном 1669 року та вдосконалений Джозефом Рафсоном 1690 року) обирає протилежний підхід: замість обмеження вилкою він використовує локальну інформацію — значення функції та її похідну в поточній точці — щоб стрибнути прямо туди, де дотична перетинає нуль:
Швидкість вражає: коли ітерація достатньо близька до простого кореня, а похідна поводиться добре, метод Ньютона демонструє квадратичну збіжність — кількість правильних розрядів приблизно подвоюється на кожному кроці. Чотири-шість ітерацій із розумного початкового наближення регулярно досягають повної точності IEEE подвійної точності (близько 15-16 значущих розрядів), порівняно з ~50 ітераціями бісекції для тієї ж точності.
Ця швидкість дорого коштує справжньою крихкістю. Метод Ньютона може поводитися погано кількома окремими способами:
- Похідна близька до нуля: коли
f'(xₙ)→ 0, розмір крокуf(xₙ)/f'(xₙ)→ ∞ (формально необмежений, бо похідна стоїть у знаменнику), потенційно закидаючи ітерацію далеко від кореня або в область, деfневизначена. - Циклювання чи розбіжність: для функцій із точками перегину або кількома коренями погане початкове наближення може відправити ітерацію в нескінченну осциляцію між двома точками або взагалі в нескінченність.
- Кратні корені: якщо корінь має кратність
k > 1(тобтоf(x) = (x - x*)ᵀ g(x)), збіжність деградує з квадратичної до просто лінійної, і для відновлення швидкості може знадобитися модифікована ітерація. - Потребує похідної: для функцій, визначених лише як виходи «чорної скриньки» симуляції (без аналітичної формули), точне обчислення
f'(x)може бути неможливим без автоматичного диференціювання.
z³ - 1 = 0 та розфарбовування кожної стартової точки за тим, до якого з трьох коренів вона збігається, дає разюче фрактальне зображення — басейни притягання мають нескінченно детальну самоподібну межу. Це один із найвідоміших прикладів, що зв'язує елементарний числовий аналіз із теорією хаосу.4. Метод січних: Ньютон без похідних
Метод січних замінює точну похідну Ньютона наближенням скінченними різницями, обчисленим із двох найновіших ітерацій — нахилом прямої через останні дві точки, а не справжньою дотичною:
Порядок збіжності дорівнює золотому перетину φ ≈ 1.618 (красивий і несподіваний факт, доведений аналізом рекурентного співвідношення похибки) — повільніше за квадратичний (порядок 2) Ньютона, але все ще надлінійний, і набагато швидший за лінійний порядок 1 бісекції. Оскільки метод січних не потребує аналітичної похідної — лише значень функції — це практичний вибір щоразу, коли f'(x) недоступна чи дорога, наприклад коли f сама є виходом дорогої симуляції «чорної скриньки».
Як і метод Ньютона, метод січних не гарантує збіжності: він може розбігатися і не успадковує жодної страховки бісекції. На практиці його майже завжди розгортають усередині гібридної схеми, що падає назад до бісекції щоразу, коли крок січної вийшов би за межі відомої вилки.
5. Метод Брента: промисловий вибір за замовчуванням
Річард Брент опублікував свій алгоритм 1973 року, спираючись на ранішу роботу Теодора Деккера. Метод Брента — ретельно спроєктований гібрид, що бере найкраще з кожного підходу: він підтримує обмежувальний інтервал (як бісекція, гарантуючи збіжність), але на кожному кроці намагається зробити швидший крок інтерполяції (обернена квадратична інтерполяція, або січна, якщо доступні лише дві точки) і падає назад до гарантованого кроку бісекції лише тоді, коли швидкий крок мав би зазнати невдачі чи збігатися надто повільно.
Результат поєднує непохитну гарантію збіжності бісекції з надлінійною (часто майже квадратичною) практичною швидкістю щоразу, коли функція поводиться добре. Саме тому метод Брента (чи його незначні варіанти) є типовим пошуком коренів за замовчуванням майже в кожній серйозній чисельній бібліотеці: optimize.brentq у SciPy, fzero у MATLAB, gsl_root_fsolver_brent у GNU Scientific Library та zbrent у Numerical Recipes — усі реалізують по суті той самий алгоритм.
Практичне правило, що випливає з усього цього: сягайте по метод Ньютона-Рафсона, коли у вас є дешева аналітична похідна, хороше початкове наближення і потрібна максимально швидка збіжність усередині щільного циклу (наприклад, обернена кінематика, розв'язувана кожного кадру симуляції). Сягайте по метод Брента щоразу, коли можете обмежити корінь вилкою й потрібен надійний, загальний розв'язувач «чорної скриньки», що не вибухне на складній функції — а це описує переважну більшість реальних викликів пошуку коренів у промисловому софті.
Досліджуйте математичні симуляції
Візуалізуйте хаос, фрактали, складні системи та математичні феномени інтерактивно.