非线性方程的数值解法
Jackie

非线性方程的数值解法

非线性方程的数值解法

划界法

  • 方程的根

使用如下条件判断重根

设函数f(x)有m阶连续导数,方程f(x)=0有m重根x*的充要条件是

f(x)=f(x)==f(m1)(x)=0,f(m)(x)0f(x^*) = f'(x^*) = \cdots = f^{(m-1)}(x^*) = 0, \quad f^{(m)}(x^*) \neq 0

逐步搜索法

设单值连续函数f(x)在有根区间[a,b],不妨假定f(a)<0,从x0=a出发,按预定步长h(譬如取h=(b-a)/N,N为正整数),检查点xk=a+kh,k=1,2,…上的函数值f(xk)的符号,一旦发现xk处与a处函数值异号,即f(xk)>0,则可确定一个缩小了的有根区间[xk-1,xk],其宽度等于预定的步长h。可能有f(xk)=0,这时xk即为所求的根

二分法

将有根区间[a,b]用中点x0=(a+b)/2分成两半,计算函数值f((a+b)/2)。若f((a+b)/2)=0,就得到方程的实根x*=(a+b)/2,否则检查f(x0)与f(a)是否同号,如同号,说明所求的根x*在x0的右侧,这时令a1=x0,b1=b;否则,x*在x0的左侧,这时令a1=a,b1=x0,这样新的有根区间[a1,b1]的长度为原有根区间[a,b]的一半

误差

xxk12(bkak)=12k+1(ba)\left| x^* - x_k \right| \leq \frac{1}{2} (b_k - a_k) = \frac{1}{2^{k+1}} (b - a)

若事先给定误差为ε,则只需

xxk12k+1(ba)<ε\left| x^* - x_k \right| \leq \frac{1}{2^{k+1}} (b - a) < \varepsilon

收敛速度与比值为1/2的等比数相同

局限性:只能求单根

迭代法

对于一般连续函数方程f(x)=0,改写成等价形式方程x=φ(x)

迭代法收敛才能用

  • 全局收敛性

设函数φ(x)在区间[a,b]上具有连续的一阶导数,且满足

1.对所有的x∈[a,b]有φ(x)∈[a,b]

2.存在0<L<1,使所有的x∈[a,b],有

φ(x)L|\varphi'(x)|\leq L

则方程x=φ(x)在区间[a,b]上的解x*存在且唯一,对任意的x0∈[a,b],迭代过程xk+1=φ(xk)均收敛于x*

且L越小,收敛速度越快

  • 局部收敛性

设φ(x)在x=φ(x)的根x*邻域有连续的一阶导数,且

φ(x)<1\left| \varphi'(x^*) \right| < 1

则迭代过程xk+1=φ(k)具有局部收敛性

迭代法框图

收敛速度

设迭代过程xk+1=φ(xk)收敛于x=φ(x)的根x*,令迭代误差ek=xk-x*,若存在常数p(p≥1)和c(c>0),使

limk+ek+1ekp=c\lim_{k\rightarrow+\infty}\frac{\left|e_{k+1}\right|}{\left|e_{k}\right|^{p}}=c

则称序列{xk}是p级收敛的,c称渐进误差常数


对迭代过程xk+1=φ(xk),若φ(p)(x)在所求根x*的邻域连续,且

φ(x)=φ(x)==φ(p1)(x)=0,φ(p)(x)0\varphi'(x^*) = \varphi''(x^*) = \cdots = \varphi^{(p-1)}(x^*) = 0, \quad \varphi^{(p)}(x^*) \neq 0

则迭代过程在x*邻域是p阶收敛的

p=1,0<c<1时称线性收敛,p=2时称平方收敛,p>1时称超线性收敛

迭代过程的收敛速度依赖于迭代函数φ(x)的选取。当φ’(x*)≠0时,则该迭代过程最多是线性收敛,当φ’(x*)=0时,迭代过程至少是平方收敛

迭代加速

埃特金加速

设序列{xk}线性收敛到x*,记

xˉk+1=xk(Δxk)2Δ2xk,k=0,1,\bar{x}_{k+1} = x_k - \frac{(\Delta x_k)^2}{\Delta^2 x_k}, \quad k = 0, 1, \ldots

其中△xk=xk+1-xk是xk点的一阶差分,△2xk=xk+2-2xk+1+xk是xk点的二阶差分

斯蒂芬森迭代

当把不动点迭代法和埃特金加速法结合起来即得到斯蒂芬森迭代法,即

{yk=φ(xk)zk=φ(yk)xk+1=xk(ykxk)2zk2yk+xk\begin{cases} y_k = \varphi(x_k) \\ z_k = \varphi(y_k) \\ x_{k+1} = x_k - \frac{(y_k - x_k)^2}{z_k - 2y_k + x_k} \end{cases}

xk+1=xk(f(xk)xk)2f(f(xk))2f(xk)+xkx_{k+1} = x_k - \frac{(f(x_k) - x_k)^2}{f(f(x_k)) - 2f(x_k) + x_k}

不收敛的迭代可用斯蒂芬森让其至少平方收敛

牛顿迭代法

xk+1=xkf(xk)f(xk)x_{k+1} = x_k - \frac{f(x_k)}{f'(x_k)}

设函数f(x)满足f(x*)=0,f'(x*)≠0,且f''(x)在x*邻域连续,则牛顿迭代法在x*局部收敛,且至少二阶收敛。并有

limk+ek+1ek2=f(x)2f(x)\lim_{k\rightarrow+\infty} \frac{e_{k+1}}{e_k^2} = \frac{f''(x^*)}{2f'(x^*)}

优点:收敛性速度快

缺点:每次要计算导数f'(xk),计算量大

牛顿迭代法框图

牛顿下山法

要求迭代过程对所选的初值能达到使函数值单调下降,即要满足下山条件|f(xk+1)|<|f(xk)|

xk+1=xkλf(xk)f(xk)x_{k+1} = x_k - \lambda \frac{f(x_k)}{f'(x_k)}

其中λ称为下山因子。通过适当选取下山因子λ保证函数值f(xk)能单调下降。下山因子的选择是逐步探索进行的,从λ=1开始反复将 λ的值减半进行试算

λ≠1时只有线性收敛速度

牛顿下山法框图

当重根数已知时,设x*是f(x)=0的m重根(m≥2),即满足

f(x)=f(x)==f(m1)(x)=0,f(m)(x)0f(x^*) = f'(x^*) = \cdots = f^{(m-1)}(x^*) = 0, \quad f^{(m)}(x^*) \neq 0

则牛顿迭代法迭代过程是线性收敛,不是平方收敛


  • 修正的牛顿迭代法:

xk+1=xkmf(xk)f(xk)x_{k+1} = x_k - m \frac{f(x_k)}{f'(x_k)}

此时平方收敛,但是需要预知重根数m的值

  • 无需知道重根数的修正牛顿迭代法:

xk+1=xkf(xk)f(xk)f(xk)2f(xk)f(xk),k=0,1,x_{k+1} = x_k - \frac{f'(x_k) f(x_k)}{f'(x_k)^2 - f(x_k) f''(x_k)}, \quad k = 0, 1, \ldots

弦截法

为了避免计算导数,改用差商代替导数。弦截法又分单点弦法和双点弦法。双点弦法的收敛速度低于牛顿迭代法,但又高于不动点迭代法

单点弦截法

设方程f(x)=0,在区间[x0,x1]上有唯一根x*,选f(x)=0上的两点(x0,f(x0))和(x1,f(x1))作弦(直线),则有两点式方程

f(x)=f(x1)+f(x1)f(x0)x1x0(xx1)f(x) = f(x_1) + \frac{f(x_1) - f(x_0)}{x_1 - x_0}(x - x_1)

写成迭代格式

xk+1=xkf(xk)f(xk)f(x0)(xkx0),k=1,2,x_{k+1} = x_k - \frac{f(x_k)}{f(x_k) - f(x_0)}(x_k - x_0), \quad k = 1, 2, \cdots

几何意义:过两个点作弦,这个弦和x轴的交点即是根的新的近似值,因为弦的一个端点(x0, f(x0))始终不变,只有另一个端点变动,所以这种方法称为单点弦法

双点弦法

用差商(f(xk)-f(xk-1))/(xk-xk-1)替代牛顿迭代公式中的导数f’(x),导出

xk+1=xkf(xk)f(xk)f(xk1)(xkxk1),k=1,2,x_{k+1} = x_k - \frac{f(x_k)}{f(x_k) - f(x_{k-1})}(x_k - x_{k-1}), \quad k = 1, 2, \ldots

称为双点弦法

双点弦法收敛速度比单点弦截法快,仅稍慢于牛顿法,是超线性收敛

双点弦法框图

 评论
评论插件加载失败
正在加载评论插件