非线性方程根的问题

Problem with roots of a non-linear equation

我有一个双曲线函数,我需要找到它的 0。我尝试过各种经典方法(二分法、牛顿法等)。

二阶导数是连续的,但无法解析,因此我必须排除使用它们的方法。

就我的应用而言,牛顿法是唯一提供足够速度的方法,但如果我不够接近实际零,它会相对不稳定。这是一个简单的截图:

零在 0.05 左右。并且由于函数在 0 处发散,如果我取一个大于某个范围的最小位置的初始猜测值,那么显然我的渐近线有问题。

在这种情况下是否有更稳定的方法最终可以提供与牛顿相媲美的速度?

我也想过用相同的零将函数转换为等效的更好的函数,然后才应用牛顿,但我真的不知道我可以做哪些转换。

如有任何帮助,我们将不胜感激。

用 log(x) 代替 x 怎么样?

Dekker 或 Brent 的方法应该几乎与牛顿一样快。如果你想自己实现一些简单的东西,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

对于您的情况,@sams-studio 的回答可能有效,我会先尝试一下。在类似的情况下 - 也是在多变量上下文中 - 我使用了牛顿同伦方法。

基本上,您限制牛顿步直到 y 的绝对值下降。 最便宜的实施方式是,如果 y 从最后一步增加,则将牛顿步减半。几步之后,您将回到牛顿并实现完全二阶收敛。

免责声明:如果您可以限制您的解决方案(您知道最大 x),@Lutz Lehmann 的答案也是我的第一选择。