Мені потрібно знайти всі корені скалярної функції в заданому інтервалі. Функція може мати розриви. Алгоритм може мати точність ε (наприклад, це нормально, якщо алгоритм не знайде двох чітких коренів, ближчих за ε).
Чи існує такий алгоритм? Не могли б ви вказати мені документи про це?
Власне, у мене є функція пошуку нуля в заданому інтервалі за допомогою алгоритму Брента і функція пошуку мінімуму в заданому інтервалі. Використовуючи ці дві функції, я створив власний алгоритм, але мені було цікаво, чи існує кращий алгоритм. Мій алгоритм такий:
Я починаю з інтервалу [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, екстремами є однаковий знак, ніж обидва кінцеві інтервали, і в обох крайностях немає розривів, я виймаю інтервал зі стека. Алгоритм закінчується, коли більше немає інтервалів.