数值分析 笔记 2
非线性方程解法
非线性方程的含义很广泛,常见的特例为n次多项式方程,对于任一非线性方程,如果其某一实根x∗满足:
f(x∗)=f′(x∗)=⋯=f(m−1)(x∗)=0
则称x∗为m重根
对于解方程这个问题,输入为函数值y,解为自变量x,因此其绝对条件数为:
ΔyΔx≈f′(x)1
因此对于多重根即f′(x)=0,问题是很敏感的
二分法
二分法的成立基于以下充分条件:
若f(x)∈C[a,b],且f(a)f(b) < 0,则f(x)在(a,b)内至少有一个实根
二分法的算法很简单,不再赘述,注意其中ε代表区间长度阈值
如果使用计算机进行二分法求解,那其最小的有根区间长度为2E+1εmach,其中E为准确根x∗对应的浮点数指数,即E=⌊log2∣x∗∣⌋,因此其最大相对误差为2εmach
二分法总能收敛,但是收敛速度慢,且初始区间难以确定
不动点迭代法
首先将方程f(x)=0变形为x=g(x),从而将求f(x)零点问题转化为求g(x)不动点的问题,而不动点可以通过迭代来实现:
x0xk+1=C=g(xk)
如果最终序列xk收敛到x∗,则x∗为原方程的根
关键问题是,对于同一个函数f(x)可能会有多种变形方式,在这种情况下,不同变形的收敛性可能并不相同,例如对于x4−x−2=0:
xx=x4−2=4x+2
其中式(1)是发散的,但是式(2)是收敛的
全局收敛
针对不动点迭代法的收敛性,有如下定理:
对于g(x)∈C[a,b],若有:
∀x∈[a,b],a≤g(x)≤b∃L∈(0,1),∀x1,x2∈[a,b],∣g(x1)−g(x2)∣≤L∣x1−x2∣
则g(x)在[a,b]内有唯一不动点,并且∀x0∈[a,b],不动点迭代法都收敛到这个唯一的不动点x∗,误差满足:
∣xk−x∗∣≤1−LLk∣x1−x0∣
如果仅需要判断收敛性,而不需要知道绝对误差的范围,则条件(4)可以简化为:
∀x∈[a,b],∣g′(x)∣<1
这可以由Lagrange中值定理推出
局部收敛
上述全局收敛是求出了迭代式在一整个区间上的行为,而在不动点周围的邻域内,同样可以定义局部收敛:如果g(x)有不动点x∗,∃D=[x∗−δ,x∗+δ],使得∀x0∈D,迭代法都收敛到x∗,则称该方法局部收敛
设x∗是g(x)的不动点,若∣g′(x∗)∣<1,且g′(x)在x∗某个邻域,则迭代法局部收敛
证明略
稳定性与收敛阶
若非线性方程进行数值解时,得到的解序列xn收敛,并且误差项$e(x_{k}) = x_{k} - x^{*} $满足:
k→∞lim∣e(xk)∣p∣e(xk+1)∣=c∈(0,∞)
则称其为p阶收敛,即收敛阶为p,对于一个收敛的方法,其收敛阶是唯一的,例如二分法的收敛阶大体上是1
收敛阶越高,迭代法收敛的越快
判断收敛阶的充要条件是:
若g(x)在x∗附近 p≥2 阶连续可导,则收敛阶为 p 的充要条件是:
g′(x∗)=g′′(x∗)g(p)(x∗)=⋯=g(p−1)(x∗)=0=0
其证明方法较简单,如下
牛顿法
原理很简单,利用切线近似曲线
在点(xk,f(xk))处,函数的切线方程为:
f(xk)+f′(xk)(x−xk)=0
转化形式后可以得到迭代式:
xk+1=g(xk)=xk−f′(xk)f(xk)
保证f′(xk)=0,求导易知对于f(x)的单根 x∗ 有 g′(x∗)=0,因此有:
对于f(x)=0的单根x∗,若f(x)在x∗附近有连续二阶导数,则牛顿法至少局部二阶收敛
例如计算机中使用的平方根的方式即为对f(x)=x2−c利用牛顿法求根:
xk+1=21(xk+xkc)
可以证明这种方法是在R+上全局收敛的
判停准则
迭代法的停止条件通常有:
- ∣f(xk)∣≤ε1:残差判据,但这可能说明我们找到了另一个根,而非期望收敛的值
- ∣xk−xk−1∣≤ε2,误差判据
- ∣xk−xk−1∣≤ε3∣xk∣,相对误差判据
通常将从残差判据与下面两种或其中一种结合使用
问题
割线法与抛物线法
割线法是为了规避牛顿法中的求导问题,使用过xk,xk−1的割线来代替切线,其迭代方程为:
xk+1=xk−f(xk)−f(xk−1)xk−xk−1f(xk)
这是一种广义的迭代法(同时由前两项进行迭代)其收敛阶满足:
若f(x)在根x∗某邻域内二阶连续可导且一阶导不为0,当 x0,x1 充分接近 x∗ 时,割线法按 p≈1.618 阶收敛
如果我们能够从前三项推导,这样的方法称之为抛物线法,但是开口向上的抛物线不一定与x轴有交点,因此我们可以构建一个x=P(y)的抛物线,之后用xk,xk−1,xk−2待定系数
这个方法同样称为逆二次插值法,局部收敛阶 p≈1.839
实用求根技术
牛顿下山法
防止牛顿法迭代过程发散的一种有效思路,定义一个比例因子序列λi∈(0,1],迭代方程为:
xk+1=xk−λif′(xk)f(xk)
算法为: