avatar

目录
牛顿迭代法

牛顿迭代法的介绍

牛顿迭代法(Newton’s method)又称为牛顿-拉弗森方法(Newton-Raphson method),是一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求其精确根非常困难,甚至不可能,因此,寻找方程的近似根就显得特别重要。

牛顿迭代公式的推导方法一

牛顿法使用函数f(x)f(x)的泰勒展开式的前面几项来寻找方程f(x)=0f(x)=0的根。对于一个函数f(x)f(x),它的泰勒展开式如下:

f(x)=f(x0)+f(x0)(xx0)+12f(x0)(xx0)2++1n!fn(x0)(xx0)n,f(x)=f(x_0)+f^′(x_0)(x−x_0)+\frac{1}{2}f^{′′}(x_0)(x−x_0)^2+\dots+\frac{1}{n!}f^n(x_0)(x−x_0)^n,

我们使用其前两项来近似表示这个函数,即用θ(x)\theta(x)代替f(x)f(x)

θ(x)=f(x0)+f(x0)(xx0),\theta(x)=f(x_0)+f^′(x_0)(x-x_0),

θ(x)=0\theta(x)=0,则x=x0f(x0)f(x0)x=x_0-\frac{f(x_0)}{f^′(x_0)},所以,牛顿法的迭代公式就是:

xn+1=xnf(xn)f(xn).x_{n+1}=x_n-\frac{f(x_n)}{f^′(x_n)}.

牛顿迭代公式的推导方法二

  • 有同学可能要说了,这个泰勒展开式我记不住咋办?有没有别的方法呢?
  • 别慌,当然有 ————

rr是函数f(x)=0f(x)=0的根,我们不知道它是多少,现在需要用牛顿法近似求解rr

1、我们首先取一个rr的初始近似值x0x_0,过点(x0,f(x0))(x_0, f(x_0))作函数f(x)f(x)的切线L1L_1,设

L1:y=kx+b,L_1:y=kx+b,

其中斜率kk就是函数f(x)f(x)x0x_0点处的导数,即:

k=f(x0),k=f^′(x_0),

将点(x0,f(x0))(x_0, f(x_0))代入L1L_1可得:

b=f(x0)f(x0)x0,b=f(x_0)-f^′(x_0)x_0,

因此切线L1L_1

y=f(x0)+f(x0)(xx0),y=f(x_0)+f^′(x_0)(x-x_0),

2、接着我们可以求出L1L_1xx轴的交点的横坐标x1x_1,令y=0y=0即可得:

x1=x0f(x0)f(x0),x_1=x_0-\frac{f(x_0)}{f^′(x_0)},

我们称x1x_1rr一次近似值。
3、同理,我们过点(x1,f(x1))(x_1, f(x_1))作函数f(x)f(x)的切线L2L_2,并求该切线与xx轴的交点的横坐标:

x2=x1f(x1)f(x1),x_2=x_1-\frac{f(x_1)}{f^′(x_1)},

x2x_2rr二次近似值。
4、重复以上过程,可得到rrn+1次近似值,也就是牛顿迭代公式

xn+1=xnf(xn)f(xn).x_{n+1}=x_n-\frac{f(x_n)}{f^′(x_n)}.

牛顿迭代公式的形象理解

  • 、随机选一个初始值x1x_1,进行一次迭代,寻找到x2x_2
  • x2x3x_2 \Rightarrow x_3
  • x3x4x_3 \Rightarrow x_4
  • x4x5x_4 \Rightarrow x_5
  • 、不断迭代,直到收敛,此时xnx_n即为方程f(x)=0f(x)=0的根

牛顿迭代法的应用

x的平方根

题目来源:Leetcode
题目链接Leetcode-69
题目描述

实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

示例 1:

输入: 4
输出: 2

示例 2:

输入: 8
输出: 2

说明: 8 的平方根是 2.82842…,
  由于返回类型是整数,小数部分将被舍去。

解题思路

为了避免与f(x)f(x)中的xx混淆,我们将题目中x的平方根记为m的平方根

  • 明确目标:m的平方根是我们所要求的东西,因此若将这个问题套用到牛顿迭代法上,就是要找到一个函数f(x)f(x),使得这个函数的根为m\sqrt{m}
  • 寻找目标函数:考虑函数f(x)=x2mf(x)=x^2-m,其满足f(m)=m2m=0f(\sqrt{m})=\sqrt{m}^2-m=0,可以作为我们的目标函数。
  • 推导迭代公式:将函数 f(x)=x2mf(x)=x^2-m 和其导数 f(x)=2xf^′(x)=2x 代入牛顿迭代公式xn+1=xnf(xn)f(xn)x_{n+1}=x_n-\frac{f(x_n)}{f^′(x_n)}中即可得到:

xn+1=12(xn+mxn).x_{n+1}=\frac{1}{2}(x_n+\frac{m}{x_n}).

  • 开始迭代:选定初始值x0x_0,可以为任意数字,不同的初始值只会影响收敛的快慢,最终都会收敛于方程f(x)=0f(x)=0的根。此处默认设x0=mx_0=m,不断迭代,直到收敛。
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution(object):
def mySqrt(self, m):
"""
:type m: int
:rtype: int
"""
if(m <= 1):
return m

sqrt = m
while(sqrt > m / sqrt):
sqrt = (sqrt + m / sqrt) // 2

return sqrt
文章作者: Reborn
文章链接: https://reborn8888.github.io/2020/05/09/%E7%89%9B%E9%A1%BF%E8%BF%AD%E4%BB%A3%E6%B3%95/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Reborn
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论