一类非线性方程的根问题

2024-05-19 05:52:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

二阶导数是连续的,但在分析上是不可访问的,所以我必须排除使用它们的方法

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

enter image description here

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

在这种情况下,是否有一种更稳定的方法最终能提供与牛顿相当的速度

我还想把这个函数变换成一个等价的更好的函数,用相同的零,然后再应用牛顿,但我真的不知道我能做哪些变换

任何帮助都将不胜感激


Tags: 方法函数屏幕情况双曲速度经典导数
3条回答

用log(x)代替x怎么样

对于你的情况,@sams studio的答案可能有用,我会先试试。在类似的情况下,也在多变量环境中,我使用了牛顿同伦方法

基本上,可以限制牛顿步长,直到y的绝对值下降。 最便宜的实现方法是,如果y从上一步开始增加,则可以减少牛顿步的一半。经过几步,你回到牛顿,完全二阶收敛

Disclamer:如果你能约束你的解(你知道一个极大的x),那么@Lutz Lehmann的答案也是我的第一选择

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

相关问题 更多 >

    热门问题