Newton-Raphson法

本文介绍牛顿-拉弗森方法的基本原理及其在求解方程根问题中的应用。通过具体实例展示了迭代过程,并提供了完整的Python代码实现。
部署运行你感兴趣的模型镜像

Newton-Raphson法

用于求解方程的根的非常重要且经典的数值计算方法

1. 从例子体会牛顿法的精髓

f ( x ) = x 2 − 4 f(x)=x^2-4 f(x)=x24 为例,函数曲线如下图

img

1)从 x 0 = 4 x_0=4 x0=4 开始迭代计算,此时曲线上的坐标为 ( 4 , 12 ) (4, 12) (4,12)

img

( 4 , 12 ) (4, 12) (4,12)点处,该函数的切线为 f ( x ) = 8 x − 20 f(x)=8x-20 f(x)=8x20

img

这时,切线 f ( x ) = 8 x − 20 f(x)=8x-20 f(x)=8x20 x x x轴的交点坐标为 ( 2.5 , 0 ) (2.5, 0) (2.5,0)

2)令 x 1 = 2.5 x_1=2.5 x1=2.5,此时曲线上的坐标为 ( 2.5 , 2.25 ) (2.5, 2.25) (2.5,2.25)

img

( 2.5 , 2.25 ) (2.5, 2.25) (2.5,2.25)点处,该函数的切线为 f ( x ) = 5 x − 10.25 f(x)=5x-10.25 f(x)=5x10.25

img

这时,切线 f ( x ) = 5 x − 10.25 f(x)=5x-10.25 f(x)=5x10.25 x x x轴的交点坐标为 ( 2.05 , 0 ) (2.05, 0) (2.05,0)

3) ⋯ \cdots

直到 ∣ x n − x n − 1 ∣ < ϵ |x_n-x_{n-1}|<\epsilon xnxn1<ϵ,停止迭代(也可以是相对距离度量)。

2. 抽象牛顿法本质

该方法使用函数 f ( x ) f(x) f(x)的泰勒级数的前2项近似 f ( x ) f(x) f(x)求解 f ( x ) = 0 f(x)=0 f(x)=0的根。将 f ( x ) f(x) f(x)函数在点 x 0 x_0 x0(初始点或已知点)的某邻域内展开成 n n n 阶泰勒公式,如下
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + f ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 + ⋯ + R n ( x ) f(x)=f(x_0) + f'(x_0)(x-x_0)+\frac{f''(x_0)}{2!}(x-x_0)^2 + \cdots +R_n(x) f(x)=f(x0)+f(x0)(xx0)+2!f(x0)(xx0)2++Rn(x)
其中 R n ( x ) R_n(x) Rn(x) n n n 阶泰勒余项。

因此,对任意方程 f ( x ) = 0 f(x)=0 f(x)=0,牛顿法的迭代过程可以描述为
x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)} xn+1=xnf(xn)f(xn)

3. Python 代码实现

import matplotlib.pyplot as plt
import numpy as np


def function(x):
    """
    Function of the function.

        Parameters:
        -----------
            x : int | float
                var

        Returns:
        --------
            value : int | float
                calculated value of the function
    """
    value = x ** 2 - 4
    return value  # The main function


def derivative(x):
    """
        Derivative of the function.

            Parameters:
            -----------
                x : int | float 
                    var

            Returns:
            --------
                value : int | float
                    calculated value of the derivative of the function
        """
    return 2 * x  # The derivative of the main function

def newton(function, derivative, x0, tol, max_iter=100):
    """
    Calculate and plots the values througth newton-raphson method.

        Parameters:
        -----------
            function : function
                function
            derivative : function
                derivative
            x0: int | float
                x0
            tol: float
                tolerance
            max_iter: int
                number of the maximal iterations

        Returns:
        --------
            x1 : int | float
                calculated value of the function
    """
    x1 = 0

    if abs(x0-x1)<= tol and abs((x0-x1)/x0)<= tol:
        return x0

    print("k\t x0\t\t function(x0)")
    k = 1

    while k <= max_iter:
        x1 = x0 - (function(x0)/derivative(x0))
        print("x%d\t%e\t%e"%(k,x1,function(x1)))

        if abs(x0-x1)<= tol and abs((x0-x1)/x0)<= tol:
            plt.plot(x0, function(x0), '.')
            return x1

        x0 = x1
        k = k + 1
        plt.plot(x0, function(x0), '.')

        # Stops the method if it hits the number of maximum iterations
        if k > max_iter:
            print("ERROR: Exceeded max number of iterations")

    return x1  # Returns the value

sqrt = newton(function, derivative,9, 0.0000001)
print("The approximate value of x is: "+str(sqrt))

# Plotting configuration
u = np.arange(-10, 10, 0.0001) # Setting up values for x in the plot
w = u**2 - 4 # Define the main function again

plt.plot(u, w)
plt.axhline(y=0.0, color='black', linestyle='-')
plt.title('Newton-Raphson Graphics for' + ' y = x^2 - 2')
plt.xlabel('X')
plt.ylabel('Y')
plt.grid(True)
plt.legend(['Xn'], loc='upper left')
plt.show()

参考资料

[1] 机器学习 | Newton-Raphson法

[2] Newton-Raphson Method

[3] Toktom/Newton-Raphson-Method: Newton-Raphson Method Algorithm in Python

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我需要帮助用户了解Newton-Raphson的实现和应用。首先,我得回忆一下这个方的基本原理。Newton-Raphson是一种迭代算,用于寻找函数的根。它的基本思想是用泰勒展开的线性部分来逼近函数,然后迭代更新解的估计值。公式是$x_{n+1} = x_n - f(x_n)/f'(x_n)$。这个方的收敛速度通常是二次的,但初始猜测的选择很重要,否则可能不收敛。 接下来,用户可能想知道具体的实现步骤。我需要用R语言来展示,因为引用[1]和[2]提到了R的实现。首先,用户需要定义目标函数f和它的导数f_prime。然后设置初始猜测值x0,设置收敛阈值tol和最大迭代次数max_iter。在循环中,计算x_new = x_current - f(x_current)/f_prime(x_current),直到满足收敛条件或达到最大次数。同时,要处理可能的错误情况,比如导数为零或者不收敛的情况。 应用方面,引用[3]提到了最大似然估计(MLE)中使用Newton-Raphson和得分,还有EM算。可能需要举一个统计中的例子,比如逻辑回归的参数估计。另外,工程中的非线性方程求解也是一个应用场景,比如电路分析中的节点电压。此外,优化问题中寻找函数的极值点,因为极值点处导数为零,所以可以转化为求导函数的根,这也符合引用[2]提到的用于求解函数的最小值或最大值。 然后,需要检查是否符合用户提到的格式要求。行内数学表达式用$...$,独立公式用$$...$$并单独成段。例如,迭代公式应写成$$x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}$$。代码块需要用三个反引号包裹,并标明语言类型,比如R。确保所有LaTeX语正确,没有错误。 接下来生成相关问题,可能需要包括方的不同应用场景、收敛性分析、与其他方的比较(如二分、得分)、如何处理导数难求的情况(比如使用拟牛顿)、在机器学习中的应用等。还要注意引用标记,例如在提到收敛速度时引用[2],提到MLE时引用[3],代码实现参考引用[1]和[4]。 最后,整理结构,先介绍方,然后分实现步骤和应用场景,每个部分给出具体例子和代码,最后列出相关问题。确保语言简洁,符合中文表达,不使用Markdown格式,但代码块和公式的格式正确。</think>### Newton-Raphson的实现与应用 #### 一、方原理 Newton-Raphson是一种基于泰勒展开的迭代算,用于求解方程$f(x)=0$的根。其核心迭代公式为: $$x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}$$ 该方在单根附近具有二次收敛性,但需要满足初始值选择合理、导数易计算等条件[^2]。 #### 二、R语言实现步骤(参考引用[1][4]) 1. **定义函数与导数** ```R f <- function(x) x^3 - 2*x - 5 # 示例函数 f_prime <- function(x) 3*x^2 - 2 # 导数 ``` 2. **设置迭代参数** ```R x0 <- 2 # 初始猜测值 tol <- 1e-6 # 收敛阈值 max_iter <- 100 ``` 3. **迭代循环** ```R for (i in 1:max_iter) { x_new <- x0 - f(x0)/f_prime(x0) if (abs(x_new - x0) < tol) break x0 <- x_new } ``` 4. **异常处理** 需检查导数值是否为零,并限制最大迭代次数以防止死循环。 #### 三、典型应用场景 1. **统计建模中的参数估计** 最大似然估计(MLE)常通过求解得分函数$\frac{\partial \ell}{\partial \theta}=0$实现,例如逻辑回归参数估计[^3]。 2. **工程问题求解** 电路分析中非线性方程组求解,如: $$I = V/R + a(e^{bV} - 1)$$ 3. **优化问题** 寻找函数极值时,转化为求解$f'(x)=0$的根,例如: $$f'(x) = 3x^2 - 2 = 0 \Rightarrow x = \pm \sqrt{2/3}$$ #### 四、收敛性改进方 - 初始值选择:结合图形或二分确定合理区间 - 混合算:当导数趋近零时切换为割线 - 松弛因子:引入步长控制$x_{n+1} = x_n - \alpha \frac{f(x_n)}{f'(x_n)}$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值