2、几种一元方程的数值解法
求根的方法类别 | 方法 |
---|---|
划界法 | 增量搜索、二分法 |
开方法 | 不动点迭代、牛顿-拉弗森方法、割线法 |
(1)划界法:
划界法要求两个初始猜测值界定的区间包含根。即两个初始值必须在根的两边。
对于适定问题(well-posed problem),划界法总能够正常进行,但收敛较慢,需要更多的迭代步骤才能收敛到真实根上。
(1)开方法:
这些方法可能需要一个或更多个初始猜测值,但是不必要求它们包含根
对于适定问题,开方法不一定能正常进行,可能会发散。但是当开方法收敛时其收敛得更快。
2.1二分法
假设f是定义在区间[a,b]上的连续函数,且f(a)和f(b)符号相反。根据介值定理,在(a,b)内存在一个数p使得f(P)=0。二分法要求将[a,b]的子区间反复减半,在每一步找出含有p的那一半。
误差计算:
∣
ε
a
∣
=
∣
x
r
n
e
w
−
x
r
o
l
d
x
r
n
e
w
∣
×
100
%
\left| {{\varepsilon _a}} \right| = \left| {\frac{{x_r^{new} - x_r^{old}}}{{x_r^{new}}}} \right| \times 100\%
∣εa∣=∣∣∣∣xrnewxrnew−xrold∣∣∣∣×100%
其中
x
r
n
e
w
x_r^{new}
xrnew为当前迭代得到的根的估计值,
x
r
o
l
d
x_r^{old}
xrold为前一次迭代得到的根的估计值。当误差
ε
a
{\varepsilon _a}
εa为小于设置的误差要求时,计算结束。
2.2不动点迭代
不动点迭代(fixed-point iteration)是通过对函数f(x)=0进行重新整理,通过代数变换或简单地在原方程的两边同时加上x,实现将x放在方程的左边得到:
x
=
g
(
x
)
,
x
i
+
1
=
g
(
x
i
)
x = g(x){\rm{ }},{\rm{ }}{x_{i + 1}} = g({x_i})
x=g(x),xi+1=g(xi)
因此给定了根的初始猜测值
x
i
{x_i}
xi,就可以计算新的估计值
x
i
+
1
{x_{i + 1}}
xi+1。
运用不动点迭代时,若
∣
f
′
(
x
)
∣
<
0
\left| {f'(x)} \right| < 0
∣f′(x)∣<0,误差会随着迭代的深入而逐步减小。反之,如果
∣
f
′
(
x
)
∣
>
0
\left| {f'(x)} \right| > 0
∣f′(x)∣>0,误差则会增大。如果导数值为正,那么误差就是正的。如果函数导数值为负,那么在迭代过程中误差会不断变换符号。如下图所示:
2.3牛顿-拉弗森方法(Newton-Raphson method)
所有求根方法中,使用最多的可能就是牛顿-拉弗森方法。如果根的初始猜测值为xi;,那么过点[xi , f(xi)]就可以作一条切线。该切线与x轴的交点通常代表根的一个更好的估计值。
牛顿-拉弗森方法可以在这个几何插值的基础上推导出来。x处的一阶导数等于斜率:
f
′
(
x
i
)
=
f
(
x
i
)
−
0
x
i
−
x
i
+
1
f'({x_i}) = \frac{{f({x_i}) - 0}}{{{x_i} - {x_{i + 1}}}}
f′(xi)=xi−xi+1f(xi)−0 整理后得到:
x
i
+
1
=
x
i
−
f
(
x
i
)
f
′
(
x
i
)
{x_{i + 1}} = {x_i} - \frac{{f({x_i})}}{{f'({x_i})}}
xi+1=xi−f′(xi)f(xi)
牛顿-拉弗森方法通常收敛的速度比较快(二次收敛),也存在一些缺点。比如对于一些特殊的函数(y=tanx)可能收敛的比较慢。可能会在局部极大值或极小值附近震荡。其收敛性依赖于函数的性质和初始猜测值的准确度。需要让初始猜测值足够靠近根。另外牛顿-拉弗森方法需要已知函数的斜率,实际中很多情况下无法求得函数的斜率。
2.4割线法
实现牛顿-拉弗森方法的一个潜在的问题是需要计算导数。有一些函数,求它们的导数可能会有困难。这种情况下,可用后向有限差分(backward finite divided difference)来近似计算导数:
f
′
(
x
i
)
≅
f
(
x
i
−
1
)
−
f
(
x
i
)
x
i
−
1
−
x
i
f'({x_i}) \cong \frac{{f({x_{i - 1}}) - f({x_i})}}{{{x_{i - 1}} - {x_i}}}
f′(xi)≅xi−1−xif(xi−1)−f(xi)
代入牛顿-拉弗森方法公式
x
i
+
1
=
x
i
−
f
(
x
i
)
f
′
(
x
i
)
{x_{i + 1}} = {x_i} - \frac{{f({x_i})}}{{f'({x_i})}}
xi+1=xi−f′(xi)f(xi) 得到割线法公式:
x
i
+
1
=
x
i
−
f
(
x
i
)
(
x
i
−
1
−
x
i
)
f
(
x
i
−
1
)
−
f
(
x
i
)
{x_{i + 1}} = {x_i} - \frac{{f({x_i})({x_{i - 1}} - {x_i})}}{{f({x_{i - 1}}) - f({x_i})}}
xi+1=xi−f(xi−1)−f(xi)f(xi)(xi−1−xi)
因为牛顿-拉弗森方法或正割法需要一个好的初始近似值但是通常收敛较快,所以这些方法常用于进一步计算由其他方法(如二分法)所得到的答案。
参考书籍:
《应用数值分析》、《Numerical Analysis》、《Applied Numerical Methods with MATLAB》