📅  最后修改于: 2023-12-03 15:33:06.350000             🧑  作者: Mango
Newton-Raphson方法和常规Falsi方法都是求解方程的数值方法。他们的主要区别在于求解方式不同,Newton-Raphson方法是基于微积分的,基于牛顿迭代公式。而常规Falsi方法则是一种基于区间的二分法,每次迭代都以区间的中点作为根的近似值。
下面我们来看一下这两种方法的python实现。
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")
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方法是两种求解方程的数值方法,选择哪一种方法取决于具体的问题和实现环境。在实际应用时,需要权衡不同方法的优点和缺点,并选择最适合的算法。