Задача с корнями нелинейного уравнения

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

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

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

введите здесь описание изображения

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

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

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

Любая помощь будет оценена по достоинству.


person mbrivio    schedule 14.01.2021    source источник
comment
Хотите показать нам уравнение?   -  person Yves Daoust    schedule 17.01.2021
comment
Привет @YvesDaoust, к сожалению, функция на самом деле не является явной и не имеет закрытой формы, которую я могу просто опубликовать, более того, она рассчитывается и собирается в различных модулях. Это просто похоже на гиперболическую функцию, поэтому я использовал этот пример. Однако его схема должна быть чем-то вроде y = A/x^2 + B/x с константами A и B. График, который я разместил, просто y= (1/x)-20   -  person mbrivio    schedule 18.01.2021


Ответы (3)


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

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

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

person Dr. V    schedule 14.01.2021
comment
На самом деле у меня нет верхней границы, но поскольку мой «x» - это толщина, он не может достигать бесконечности, но я не знаю верхнего значения априори. Я всегда могу вставить искусственную верхнюю границу, которая достаточно велика. Я посмотрю на гомотопические методы Ньютона. спасибо за предложение - person mbrivio; 14.01.2021

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

person sams-studio    schedule 14.01.2021
comment
Он создает разрыв в точке x=1. Также я не думаю, что он сохраняет позицию 0 - person mbrivio; 14.01.2021
comment
функция это нечто в виде 1/x - person mbrivio; 14.01.2021
comment
Это не ... log(1) = 0, но непрерывно. Затем, когда вы нашли x, вы, конечно же, берете exp(x), чтобы получить исходный x. - person Dr. V; 14.01.2021
comment
тогда я не понял, вы предлагаете построить функцию 1 / log (x), скажем, найти 0 с помощью ньютона или эквивалента, а затем exp (x), чтобы получить исходный результат? - person mbrivio; 14.01.2021
comment
Вы оставляете значения функций как есть (я предполагаю, что в вашей реальной задаче дело не только в 1/x - 20, потому что тогда x=1/20 и весь вопрос тривиален), а изобретаете z = log(x) и рассматриваете новую функцию y = f(z). Если вы построите это, это может быть более линейно и может быть решено Ньютоном без проблем. - person Dr. V; 14.01.2021
comment
И тогда да, exp(z), как описано доктором В., - это корень, который вы ищете (что вы также правильно указали). - person sams-studio; 14.01.2021
comment
Я просто сделал сюжет... Боюсь, в этом случае вы не избежите проблемы. Теперь кривая сглаживается с левой стороны. - person Dr. V; 14.01.2021
comment
Вероятно, это связано с тем, что у вас недостаточно очков и/или наименьшее значение x слишком мало. Но обычно это не имеет значения, потому что расстояние между точками по оси x обычно очень мало, и поэтому ошибка не становится слишком большой. - person sams-studio; 14.01.2021

Метод Деккера или Брента должен быть почти таким же быстрым, как Ньютон. Если вы хотите реализовать что-то простое самостоятельно, иллинойский вариант метода 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
person Lutz Lehmann    schedule 14.01.2021
comment
спасибо, regula-falsi, на самом деле хорошо справляется с моей проблемой. сейчас буду тестировать на разных прогонах - person mbrivio; 14.01.2021