У меня есть гиперболическая функция, и мне нужно найти ее 0. Я пробовал разные классические методы (деление пополам, ньютон и так далее).

Вторые производные являются непрерывными, но не доступны аналитически, поэтому я должен исключить методы, использующие их.

Для целей моего приложения метод Ньютона - единственный метод, обеспечивающий достаточную скорость, но он относительно нестабилен, если я недостаточно близко к фактическому нулю. Вот простой снимок экрана:

enter image description here

Ноль где-то около 0,05. и поскольку функция расходится в 0, если я возьму начальное предполагаемое значение больше, чем минимальное местоположение определенной степени, то у меня, очевидно, возникнут проблемы с асимптотой.

Есть ли в этом случае более стабильный метод, который в конечном итоге обеспечил бы скорость, сравнимую с Ньютоном?

Я также подумал о преобразовании функции в эквивалентную лучшую функцию с тем же нулем и только затем с применением Ньютона, но я действительно не знаю, какие преобразования я могу сделать.

Любая помощь была бы признательна.

1
mbrivio 14 Янв 2021 в 11:49

3 ответа

Лучший ответ

В вашем случае ответ @ sams-studio может сработать, и я бы попробовал сначала. В подобной ситуации - также в многовариантном контексте - я использовал методы гомотопии Ньютона.

По сути, вы ограничиваете шаг Ньютона до тех пор, пока абсолютное значение y не будет уменьшаться. Самый дешевый способ реализации - это половина шага Ньютона, если y увеличивается с последнего шага. Через несколько шагов вы вернетесь к Ньютону с полной сходимостью второго порядка.

Отказ от ответственности: если вы можете измельчить свое решение (вы знаете максимальное значение x), ответ от @Lutz Lehmann также будет моим первым выбором.

1
Dr. V 14 Янв 2021 в 09:01

Как насчет использования log (x) вместо x?

2
sams-studio 14 Янв 2021 в 08:51

Метод Деккера или Брента должен быть почти таким же быстрым, как метод Ньютона. Если вы хотите реализовать что-то простое самостоятельно, вариант метода regula-falsi из Иллинойса также достаточно быстр. Все это методы брекетинга, поэтому не следует покидать домен, если начальный интервал находится внутри домена.

def illinois(f,a,b,tol=1e-8):
    '''regula falsi resp. false postion method with
        the Illinois anti-stalling variation'''
    fa = f(a)
    fb = f(b)
    if abs(fa)<abs(fb): a,fa,b,fb = b,fb,a,fa
    while(np.abs(b-a)>tol):
        c = (a*fb-b*fa)/(fb-fa)
        fc = f(c)
        if fa*fc < 0:
            fa *= 0.5
        else:
            a, fa = b, fb
        b, fb = c, fc
    return b, fb
2
Lutz Lehmann 14 Янв 2021 в 09:15
65715889