Биссект с разрывной монотонной функцией: найдите root, используя бисекцию для слабо монотонной функции, допускающей прыжки - PullRequest
1 голос
/ 22 марта 2020

Я ищу Python алгоритм для нахождения root функции f(x) с использованием деления на части , эквивалентный scipy.optimize.bisect , но с учетом разрывов (скачков) в f. Функция f слабо монотонна.

Было бы хорошо, но не обязательно для алгоритма, чтобы помечать, если пересечение (root) находится непосредственно "в" a перейти, и в этом случае вернуть точное значение x, при котором происходит соответствующий переход (т. е., скажем, x, для которого sign(f(x-e)) != sign(f(x+e)) и abs(f(x-e)-f(x+e)>a для бесконечно малых e>0 и не бесконечно малых a>0). Также хорошо, если вместо этого алгоритм, например, просто возвращает x в пределах определенного допуска в этом случае.

Поскольку функция только слабо монотонна, она может иметь плоскую области, и теоретически это может произойти «в» root, то есть где f=0: f(x)=0 for an entire range, x in [x_0,x_1]. В этом случае снова, хорошо, но не обязательно , чтобы al go пометил эту особенность и, скажем, гарантировал, что x из диапазона [x_0,x_1] возвращается.

1 Ответ

1 голос
/ 22 марта 2020

Пока вы предоставляете (возможно, очень маленькие) строго положительные положительные значения для xtol и rtol, функция будет работать с разрывами:

import numpy as np
>>> optimize.bisect(f=np.sign, a=-1, b=1, xtol=0.0001, rtol=0.001)
0.0

Если вы посмотрите на кодовую базу scipy на C реализация исходного кода функции вы можете видеть, что это очень простая функция, которая не делает никаких предположений о непрерывности. Обычно требуется две точки с изменением знака и переключение на меньший диапазон с изменением знака, пока не закончатся итерации или не будут соблюдены допуски.

Учитывая ваши требования, что функции могут быть прерывистым / плоским, на самом деле необходимо (для любого алгоритма) предоставить эти допуски. Без них было бы невозможно, чтобы функция оптимизации сходилась к решению.

...