Мені потрібно знайти всі корені скалярної функції в заданому інтервалі. Функція може мати розриви. Алгоритм може мати точність ε (наприклад, це нормально, якщо алгоритм не знайде двох чітких коренів, ближчих за ε).
Чи існує такий алгоритм? Не могли б ви вказати мені документи про це?
Власне, у мене є функція пошуку нуля в заданому інтервалі за допомогою алгоритму Брента і функція пошуку мінімуму в заданому інтервалі. Використовуючи ці дві функції, я створив власний алгоритм, але мені було цікаво, чи існує кращий алгоритм. Мій алгоритм такий:
Я починаю з інтервалу [a,b]
і функції f
. Якщо sign(f(a+ε)) ≠ sign(f(b-ε))
я знаю , що є принаймні один нуль між a
і b
, і я знаходжу z = zero(]a,b[)
. Я перевіряю, чи z
дійсно дорівнює нулю (це може бути розрив), шукаючи значення z-ε
і z+ε
. Якщо це так, я додаю його до списку знайдених нулів. Якщо f(a+ε)
і те, і f(b-ε)
інше позитивно, я шукаю m = min(]a, b[)
. Якщо f(m)
все-таки є позитивним, я шукаю, m = max(]a,b[)
оскільки може бути розрив між a
і b
. Я роблю навпаки, якщо f(a+ε)
і f(b-ε)
були негативи.
Тепер, з точки, яку я знайшов ( z
або m
), я будую стек, що містить нулі, розриви та точки перегину моєї функції. Після першої ітерації стек тепер виглядає так [a, z, b]
. Я запускаю знову алгоритм з інтервалів ]a,z[
і ]z,b[
. Коли між двома точками a
і b
, екстремами є однаковий знак, ніж обидва кінцеві інтервали, і в обох крайностях немає розривів, я виймаю інтервал зі стека. Алгоритм закінчується, коли більше немає інтервалів.