📜  Newton Raphson 方法与常规 Falsi 方法的区别(1)

📅  最后修改于: 2023-12-03 15:33:06.350000             🧑  作者: Mango

Newton-Raphson方法与常规Falsi方法的区别
介绍

Newton-Raphson方法和常规Falsi方法都是求解方程的数值方法。他们的主要区别在于求解方式不同,Newton-Raphson方法是基于微积分的,基于牛顿迭代公式。而常规Falsi方法则是一种基于区间的二分法,每次迭代都以区间的中点作为根的近似值。

代码实现

下面我们来看一下这两种方法的python实现。

Newton-Raphson方法

def newton_raphson(f, df, x0, tol=1e-6, max_iter=50):
    '''Newton-Raphson方法求解方程的近似根

    :param f: 要求解的方程
    :type f: function
    :param df: **f**的一阶导函数
    :type df: function
    :param x0: 初始猜测值
    :type x0: float
    :param tol: 精度要求, 默认为1e-6
    :type tol: float
    :param max_iter: 最大迭代次数, 默认为50
    :type max_iter: int
    :return: 近似根和近似函数值
    :rtype: tuple
    '''

    for i in range(max_iter):
        x = x0 - f(x0) / df(x0)
        if abs(x - x0) < tol:
            return x, f(x)
        x0 = x

    raise ValueError("Failed to converge")

常规Falsi方法

def falsi(f, xl, xr, tol=1e-6, max_iter=50):
    '''常规Falsi方法求解方程的近似根

    :param f: 要求解的方程
    :type f: function
    :param xl: 区间左端点
    :type xl: float
    :param xr: 区间右端点
    :type xr: float
    :param tol: 精度要求, 默认为1e-6
    :type tol: float
    :param max_iter: 最大迭代次数, 默认为50
    :type max_iter: int
    :return: 近似根和近似函数值
    :rtype: tuple
    '''

    for i in range(max_iter):
        fl = f(xl)
        fr = f(xr)
        if fl * fr > 0:
            raise ValueError("No root in range")
        root = (xl * fr - xr * fl) / (fr - fl)
        froot = f(root)
        if abs(froot) < tol:
            return root, froot
        if fl * froot < 0:
            xr = root
        else:
            xl = root

    raise ValueError("Failed to converge")
比较

Newton-Raphson方法与常规Falsi方法相比有如下优缺点:

优点

  • Newton-Raphson方法一般会比常规Falsi方法快一些,尤其是在接近根的情况下;

  • 迭代过程中会自动调整精度,不需要事先确定一个区间;

  • 迭代次数少,可以节省计算资源。

缺点

  • 需要计算导数,有时可能难以实现;

  • 对函数有一定的局限性,要求导数连续且非0;

  • 可能会因为迭代过程中产生数值不稳定问题,而导致迭代失败。

  • 常规Falsi方法形式简单、稳定性较好,但是要求收敛速度较慢,而且对初始值依赖比较大。

总结

Newton-Raphson方法和常规Falsi方法是两种求解方程的数值方法,选择哪一种方法取决于具体的问题和实现环境。在实际应用时,需要权衡不同方法的优点和缺点,并选择最适合的算法。