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