牛顿法:用泰勒级数求解平方根的秘籍
目录
- 一、引言
- 二、牛顿法的理论基础——泰勒级数
- 三、牛顿法的原理与推导
- 3.1 原理概述
- 3.2 推导过程
- 3.3 几何解释
- 四、牛顿法的应用场景
- 4.1 数值计算
- 4.2 优化问题
- 五、牛顿法求平方根的具体案例
- 5.1 原理推导
- 5.2 具体步骤
- 5.3 代码实现(Python)
- 5.4 示例计算过程
- 六、牛顿法的优缺点
- 6.1 优点
- 6.2 缺点
- 七、结论
一、引言
在科学计算与工程应用中,求解方程的根以及优化问题是极为常见的任务。牛顿法(Newton’s method),也被称为牛顿 - 拉夫逊方法(Newton - Raphson method),是一种强大且高效的迭代算法,可用于解决此类问题。本文将从泰勒级数出发,详细阐述牛顿法的原理、推导过程,并结合求平方根的具体案例,展示其在实际问题中的应用,同时给出相应的 Python 代码实现。
二、牛顿法的理论基础——泰勒级数
泰勒级数是一个用函数在某点的信息描述其附近取值的重要数学工具。若函数
f
(
x
)
f(x)
f(x) 在包含
x
0
x_0
x0 的开区间内具有直到
n
+
1
n + 1
n+1 阶导数,那么它的
n
n
n 阶泰勒展开式为:
f
(
x
)
=
f
(
x
0
)
+
f
′
(
x
0
)
(
x
−
x
0
)
+
f
′
′
(
x
0
)
2
!
(
x
−
x
0
)
2
+
⋯
+
f
(
n
)
(
x
0
)
n
!
(
x
−
x
0
)
n
+
R
n
(
x
)
f(x)=f(x_0)+f^{\prime}(x_0)(x - x_0)+\frac{f^{\prime\prime}(x_0)}{2!}(x - x_0)^2+\cdots+\frac{f^{(n)}(x_0)}{n!}(x - x_0)^n+R_n(x)
f(x)=f(x0)+f′(x0)(x−x0)+2!f′′(x0)(x−x0)2+⋯+n!f(n)(x0)(x−x0)n+Rn(x)
其中
R
n
(
x
)
R_n(x)
Rn(x) 为余项,表示用
n
n
n 阶泰勒多项式近似
f
(
x
)
f(x)
f(x) 时产生的误差。当
n
=
1
n = 1
n=1 时,得到一阶泰勒展开式,也就是线性近似:
f
(
x
)
≈
f
(
x
0
)
+
f
′
(
x
0
)
(
x
−
x
0
)
f(x)\approx f(x_0)+f^{\prime}(x_0)(x - x_0)
f(x)≈f(x0)+f′(x0)(x−x0)
牛顿法正是基于一阶泰勒展开式来构建其迭代过程的。
三、牛顿法的原理与推导
3.1 原理概述
牛顿法主要用于求解方程 f ( x ) = 0 f(x)=0 f(x)=0 的根。其核心思想是利用函数的一阶泰勒展开式,通过不断迭代来逐步逼近方程的根。
3.2 推导过程
已知方程
f
(
x
)
=
0
f(x)=0
f(x)=0,给定一个初始近似值
x
0
x_0
x0。根据一阶泰勒展开式,函数
f
(
x
)
f(x)
f(x) 在
x
0
x_0
x0 附近可近似表示为:
f
(
x
)
≈
f
(
x
0
)
+
f
′
(
x
0
)
(
x
−
x
0
)
f(x)\approx f(x_0)+f^{\prime}(x_0)(x - x_0)
f(x)≈f(x0)+f′(x0)(x−x0)
令
f
(
x
)
=
0
f(x)=0
f(x)=0,则有:
0
≈
f
(
x
0
)
+
f
′
(
x
0
)
(
x
−
x
0
)
0\approx f(x_0)+f^{\prime}(x_0)(x - x_0)
0≈f(x0)+f′(x0)(x−x0)
解这个关于
x
x
x 的方程:
f
′
(
x
0
)
(
x
−
x
0
)
≈
−
f
(
x
0
)
f^{\prime}(x_0)(x - x_0)\approx - f(x_0)
f′(x0)(x−x0)≈−f(x0)
x
≈
x
0
−
f
(
x
0
)
f
′
(
x
0
)
x\approx x_0-\frac{f(x_0)}{f^{\prime}(x_0)}
x≈x0−f′(x0)f(x0)
将这个近似得到的
x
x
x 作为下一个近似值
x
1
x_1
x1,即:
x
1
=
x
0
−
f
(
x
0
)
f
′
(
x
0
)
x_1 = x_0-\frac{f(x_0)}{f^{\prime}(x_0)}
x1=x0−f′(x0)f(x0)
重复此过程,可得到迭代序列
{
x
n
}
\{x_n\}
{xn},其迭代公式为:
x
n
+
1
=
x
n
−
f
(
x
n
)
f
′
(
x
n
)
(
n
=
0
,
1
,
2
,
⋯
)
x_{n + 1}=x_n-\frac{f(x_n)}{f^{\prime}(x_n)}\quad(n = 0,1,2,\cdots)
xn+1=xn−f′(xn)f(xn)(n=0,1,2,⋯)
3.3 几何解释
从几何角度看,牛顿法的迭代过程是不断用函数
y
=
f
(
x
)
y = f(x)
y=f(x) 在当前点
(
x
n
,
f
(
x
n
)
)
(x_n,f(x_n))
(xn,f(xn)) 处的切线与
x
x
x 轴的交点作为下一个近似点
x
n
+
1
x_{n + 1}
xn+1。函数
y
=
f
(
x
)
y = f(x)
y=f(x) 在点
(
x
n
,
f
(
x
n
)
)
(x_n,f(x_n))
(xn,f(xn)) 处的切线方程为
y
−
f
(
x
n
)
=
f
′
(
x
n
)
(
x
−
x
n
)
y - f(x_n)=f^{\prime}(x_n)(x - x_n)
y−f(xn)=f′(xn)(x−xn)令
y
=
0
y = 0
y=0,解出
x
x
x 的值就是
x
n
+
1
=
x
n
−
f
(
x
n
)
f
′
(
x
n
)
x_{n + 1}=x_n-\frac{f(x_n)}{f^{\prime}(x_n)}
xn+1=xn−f′(xn)f(xn)
四、牛顿法的应用场景
4.1 数值计算
在科学计算和工程领域,经常需要求解各种方程的根,牛顿法是一种高效的迭代算法,能够快速收敛到方程的根。例如,在计算物理、化学等领域中求解非线性方程。
4.2 优化问题
牛顿法也可用于求解函数的极值问题。对于一个可微函数 f ( x ) f(x) f(x),其极值点满足 f ′ ( x ) = 0 f^{\prime}(x)=0 f′(x)=0,我们可以将牛顿法应用到 g ( x ) = f ′ ( x ) g(x)=f^{\prime}(x) g(x)=f′(x) 上,通过迭代求解 g ( x ) = 0 g(x)=0 g(x)=0 的根,从而找到 f ( x ) f(x) f(x) 的极值点。不过在优化问题中,通常使用的是牛顿法的改进版本,如拟牛顿法等。
五、牛顿法求平方根的具体案例
5.1 原理推导
假设我们要求一个非负实数
a
a
a 的平方根,即找到一个数
x
x
x 使得
x
2
=
a
x^2 = a
x2=a,可将其转化为求解方程
f
(
x
)
=
x
2
−
a
=
0
f(x)=x^{2}-a = 0
f(x)=x2−a=0 的正根。对
f
(
x
)
=
x
2
−
a
f(x)=x^{2}-a
f(x)=x2−a 求导,根据求导公式
(
X
n
)
′
=
n
X
n
−
1
(X^n)^\prime = nX^{n - 1}
(Xn)′=nXn−1,可得
f
′
(
x
)
=
2
x
f^{\prime}(x)=2x
f′(x)=2x。将
f
(
x
)
f(x)
f(x) 和
f
′
(
x
)
f^{\prime}(x)
f′(x) 代入牛顿法的迭代公式中,得到:
x
n
+
1
=
x
n
−
x
n
2
−
a
2
x
n
=
2
x
n
2
−
(
x
n
2
−
a
)
2
x
n
=
x
n
2
+
a
2
x
n
=
1
2
(
x
n
+
a
x
n
)
x_{n + 1}=x_n-\frac{x_n^{2}-a}{2x_n}=\frac{2x_n^{2}-(x_n^{2}-a)}{2x_n}=\frac{x_n^{2}+a}{2x_n}=\frac{1}{2}(x_n+\frac{a}{x_n})
xn+1=xn−2xnxn2−a=2xn2xn2−(xn2−a)=2xnxn2+a=21(xn+xna)
5.2 具体步骤
- 选择初始值:选择一个初始的近似值 x 0 x_0 x0,通常可选择 x 0 = a x_0 = a x0=a。
- 迭代计算:使用迭代公式 x n + 1 = 1 2 ( x n + a x n ) x_{n + 1}=\frac{1}{2}(x_n+\frac{a}{x_n}) xn+1=21(xn+xna) 进行迭代计算,直到满足收敛条件,如相邻两次迭代结果的差值小于某个预先设定的阈值 ϵ \epsilon ϵ,即 ∣ x n + 1 − x n ∣ < ϵ |x_{n + 1}-x_n|<\epsilon ∣xn+1−xn∣<ϵ。
- 返回结果:当满足收敛条件时,返回最终的迭代结果 x n + 1 x_{n + 1} xn+1,它就是 a a a 的平方根的近似值。
5.3 代码实现(Python)
def sqrt_newton(a, tolerance=1e-6, max_iterations=100):
# 选择初始值
x = a
for i in range(max_iterations):
# 计算下一个迭代值
next_x = 0.5 * (x + a / x)
# 判断是否满足收敛条件
if abs(next_x - x) < tolerance:
return next_x
# 更新 x 的值
x = next_x
# 如果达到最大迭代次数仍未收敛,抛出异常
raise ValueError("达到最大迭代次数,未收敛。")
# 测试
a = 16
result = sqrt_newton(a)
print(f"{a} 的平方根近似值为: {result}")
5.4 示例计算过程
假设要求 16 \sqrt{16} 16 的值:
- 初始值:选择 x 0 = 16 x_0 = 16 x0=16。
- 第一次迭代:
- 根据迭代公式
x
1
=
1
2
(
x
0
+
16
x
0
)
x_{1}=\frac{1}{2}(x_0+\frac{16}{x_0})
x1=21(x0+x016),将
x
0
=
16
x_0 = 16
x0=16 代入可得:
- x 1 = 1 2 ( 16 + 16 16 ) = 1 2 ( 16 + 1 ) = 8.5 x_{1}=\frac{1}{2}(16+\frac{16}{16})=\frac{1}{2}(16 + 1)=8.5 x1=21(16+1616)=21(16+1)=8.5
- 根据迭代公式
x
1
=
1
2
(
x
0
+
16
x
0
)
x_{1}=\frac{1}{2}(x_0+\frac{16}{x_0})
x1=21(x0+x016),将
x
0
=
16
x_0 = 16
x0=16 代入可得:
- 第二次迭代:
- 将
x
1
=
8.5
x_1 = 8.5
x1=8.5 代入迭代公式
x
2
=
1
2
(
x
1
+
16
x
1
)
x_{2}=\frac{1}{2}(x_1+\frac{16}{x_1})
x2=21(x1+x116) 可得:
- x 2 = 1 2 ( 8.5 + 16 8.5 ) ≈ 1 2 ( 8.5 + 1.8824 ) = 5.1912 x_{2}=\frac{1}{2}(8.5+\frac{16}{8.5})\approx\frac{1}{2}(8.5 + 1.8824)=5.1912 x2=21(8.5+8.516)≈21(8.5+1.8824)=5.1912
- 将
x
1
=
8.5
x_1 = 8.5
x1=8.5 代入迭代公式
x
2
=
1
2
(
x
1
+
16
x
1
)
x_{2}=\frac{1}{2}(x_1+\frac{16}{x_1})
x2=21(x1+x116) 可得:
- 第三次迭代:
- 将
x
2
=
5.1912
x_2 = 5.1912
x2=5.1912 代入迭代公式
x
3
=
1
2
(
x
2
+
16
x
2
)
x_{3}=\frac{1}{2}(x_2+\frac{16}{x_2})
x3=21(x2+x216) 可得:
- x 3 = 1 2 ( 5.1912 + 16 5.1912 ) ≈ 1 2 ( 5.1912 + 3.0821 ) = 4.1367 x_{3}=\frac{1}{2}(5.1912+\frac{16}{5.1912})\approx\frac{1}{2}(5.1912+3.0821)=4.1367 x3=21(5.1912+5.191216)≈21(5.1912+3.0821)=4.1367
- 将
x
2
=
5.1912
x_2 = 5.1912
x2=5.1912 代入迭代公式
x
3
=
1
2
(
x
2
+
16
x
2
)
x_{3}=\frac{1}{2}(x_2+\frac{16}{x_2})
x3=21(x2+x216) 可得:
- 第四次迭代:
- 将
x
3
=
4.1367
x_3 = 4.1367
x3=4.1367 代入迭代公式
x
4
=
1
2
(
x
3
+
16
x
3
)
x_{4}=\frac{1}{2}(x_3+\frac{16}{x_3})
x4=21(x3+x316) 可得:
- x 4 = 1 2 ( 4.1367 + 16 4.1367 ) ≈ 1 2 ( 4.1367 + 3.8678 ) = 4.0023 x_{4}=\frac{1}{2}(4.1367+\frac{16}{4.1367})\approx\frac{1}{2}(4.1367 + 3.8678)=4.0023 x4=21(4.1367+4.136716)≈21(4.1367+3.8678)=4.0023
- 将
x
3
=
4.1367
x_3 = 4.1367
x3=4.1367 代入迭代公式
x
4
=
1
2
(
x
3
+
16
x
3
)
x_{4}=\frac{1}{2}(x_3+\frac{16}{x_3})
x4=21(x3+x316) 可得:
- 第五次迭代:
- 将
x
4
=
4.0023
x_4 = 4.0023
x4=4.0023 代入迭代公式
x
5
=
1
2
(
x
4
+
16
x
4
)
x_{5}=\frac{1}{2}(x_4+\frac{16}{x_4})
x5=21(x4+x416) 可得:
- x 5 = 1 2 ( 4.0023 + 16 4.0023 ) ≈ 1 2 ( 4.0023 + 3.9977 ) = 4 x_{5}=\frac{1}{2}(4.0023+\frac{16}{4.0023})\approx\frac{1}{2}(4.0023+3.9977)=4 x5=21(4.0023+4.002316)≈21(4.0023+3.9977)=4
- 将
x
4
=
4.0023
x_4 = 4.0023
x4=4.0023 代入迭代公式
x
5
=
1
2
(
x
4
+
16
x
4
)
x_{5}=\frac{1}{2}(x_4+\frac{16}{x_4})
x5=21(x4+x416) 可得:
经过几次迭代后,结果已非常接近 16 = 4 \sqrt{16}=4 16=4,可见牛顿法的收敛速度很快。
六、牛顿法的优缺点
6.1 优点
- 收敛速度快:在满足一定条件下,牛顿法具有二阶收敛速度,即迭代次数增加时,近似解与真实解的误差平方收敛。
- 可处理非线性问题:对于非线性方程和优化问题,牛顿法能够有效地求解。
6.2 缺点
- 需要计算导数:牛顿法的迭代公式中需要计算函数的导数 f ′ ( x ) f^{\prime}(x) f′(x),对于一些复杂的函数,导数的计算可能比较困难。
- 初始值敏感:牛顿法的收敛性依赖于初始值的选择,如果初始值选择不当,可能会导致迭代不收敛或者收敛到错误的根。
七、结论
牛顿法作为一种强大的迭代算法,在求解方程的根和优化问题中具有重要的应用价值。通过基于泰勒级数的推导,我们得到了牛顿法的迭代公式,并通过求平方根的具体案例展示了其实际应用。虽然牛顿法存在一些缺点,如需要计算导数和对初始值敏感,但在许多情况下,它仍然是一种高效且实用的方法。在实际应用中,我们可以根据具体问题的特点,选择合适的初始值和改进方法,以充分发挥牛顿法的优势。