📅  最后修改于: 2023-12-03 15:27:05.557000             🧑  作者: Mango
牛顿拉夫森法,又称牛顿-拉夫逊算法(Newton-Raphson method),是一种求解方程的数值方法。它是利用函数的泰勒一阶展开式的线性部分来逼近函数的根。牛顿拉夫森法的优点是收敛速度非常快,通常只需要几步即可得到答案。但是这种方法在某些情况下可能会失效,比如函数在初始点的导数为0,或者初始点不在函数的定义域上。
给定一个函数$f(x)$,我们希望求它在点$x_0$处的根。牛顿拉夫森法的基本思路是,在点$x_0$处取出函数$f(x)$的泰勒展开式:
$$f(x) = f(x_0) + f'(x_0)(x-x_0) + O((x-x_0)^2)$$
其中,$f'(x_0)$表示$f(x)$在点$x_0$处的导数。我们把$x$取为$f(x)=0$时的解$x_1$,则我们可以得到如下的递推公式:
$$x_1 = x_0 - \frac{f(x_0)}{f'(x_0)}$$
我们可以不断地使用这个公式来迭代求解$x_1,x_2,x_3,\dots$直到收敛为止。
以下是使用Python实现牛顿拉夫森法的代码:
def newton_raphson(f, df, x0, eps=1e-6, max_iters=1000):
"""
牛顿拉夫森法求解方程f(x) = 0的根。
:param f: 函数f(x)
:param df: 函数f(x)的一阶导数df(x)/dx
:param x0: 初始点
:param eps: 精度要求
:param max_iters: 最大迭代次数
:return: 解x或None(迭代失败)
"""
for i in range(max_iters):
y = f(x0)
dy = df(x0)
x = x0 - y / dy
if abs(x - x0) < eps:
return x
x0 = x
# 迭代失败
return None
该函数接受四个参数:
函数返回求得的解$x$,或者在迭代失败(超过最大迭代次数)的情况下返回None。
以下是一个使用上述程序求解方程$\cos x = x$的示例:
import math
def f(x):
return math.cos(x) - x
def df(x):
return -math.sin(x) - 1
x0 = 0.5
x = newton_raphson(f, df, x0)
print(x)
该程序会输出方程$\cos x = x$的一个近似解,比如:
0.7390851333844376