Знайдіть усі корені функції в заданому інтервалі


9

Мені потрібно знайти всі корені скалярної функції в заданому інтервалі. Функція може мати розриви. Алгоритм може мати точність ε (наприклад, це нормально, якщо алгоритм не знайде двох чітких коренів, ближчих за ε).

Чи існує такий алгоритм? Не могли б ви вказати мені документи про це?


Власне, у мене є функція пошуку нуля в заданому інтервалі за допомогою алгоритму Брента і функція пошуку мінімуму в заданому інтервалі. Використовуючи ці дві функції, я створив власний алгоритм, але мені було цікаво, чи існує кращий алгоритм. Мій алгоритм такий:

Я починаю з інтервалу [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, екстремами є однаковий знак, ніж обидва кінцеві інтервали, і в обох крайностях немає розривів, я виймаю інтервал зі стека. Алгоритм закінчується, коли більше немає інтервалів.


2
Існують методи, засновані на інтервальній арифметиці.
lhf

Відповіді:


6

Якщо ви використовуєте Matlab, ви можете спробувати систему Chebfun (відмова: я раніше був активним розробником цього проекту). Він може знайти всі корені одновимірної функції в закритому або відкритому інтервалі до машинної точності.

Основна ідея кореневого пошуку Chebfun полягає у використанні комбінації рекурсивної бісекції та матриці Colleague, аналога супутньої матриці , щодо коефіцієнтів інтерполянта цільової функції.

У мене є спрощений варіант коду тут . Функція chebrootsприймає анонімну функцію як перший вхід, кінцевий інтервал як другий і третій аргумент, а ступінь - Nяк четвертий і заключний аргумент. Для розумних результатів, ви можете встановити Nв 100.


0

Загалом, це безнадійний квест - без якоїсь інформації про безперервність та / або диференційованість функції все може статися. Розглянемо для прикладу функцію MATLAB, визначену на інтервалі від 0 до 1:

функція y = f (x)

у = 1,0;

якщо (х == 0,01)

у = 0,0;

кінець

якщо (x == 0,013)

у = 0,0;

кінець

якщо (x == 0.753124)

у = 0,0;

кінець

Розглядаючи цю функцію як блок блоку, немає ніякого способу побачити, що в цих трьох точках є нулі та немає інших точок в інтервалі від 0 до 1, не перевіряючи кожне число плаваючої точки між 0 і 1.


1
Такі нулі явно неможливо знайти, але, здавалося б, @Charles цікавить, в гіршому випадку, функції чорного поля з розривами стрибків, але не так званими знімними розривами.
Білл Барт

1
Навіть якщо ви обмежитеся стрибками розривів і навіть якщо ви обмежитеся безперервними функціями, якщо функція не є Ліпшиц безперервною протягом відомих інтервалів, то знаходження всіх нулів оцінок з обмеженою кількістю балів не забезпечить вам отримати все коріння.
Брайан Борчерс

Зокрема, розглянемо функцію sin(1/x) як приклад, коли знаходять всі нулі на проміжку [0,1]буде важко.
Вольфганг Бангерт

ОП готові вказати ϵ. Якщо функція патологічна, вона знайде багато нулів, але здається, що це життя. Цілком можливо, що він також може встановити максимальну кількість інтервалів для пошуку, щоб уникнути подібних патологій.
Білл Барт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.