📜  牛顿拉夫森法程序(1)

📅  最后修改于: 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

该函数接受四个参数:

  • f:目标函数$f(x)$的表达式,可接受一个参数$x$。
  • df:目标函数$f(x)$的一阶导数$df(x)/dx$的表达式,认为它已经求出,可接受同一个参数$x$。
  • x0:迭代的初始点。
  • eps:收敛的精度要求,迭代过程会一直进行到$|x_{n+1}-x_n|<\text{eps}$。
  • max_iters:最大迭代次数,如果迭代次数达到该值仍未收敛,函数会返回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