[科学计算]非线性方程的数值求解

实际问题中,线性方程甚至线性方程组都不是最常见的形式,世界的规律是错综复杂的,涉及更多的是非线性方程,而求解非线性方程的问题就显得颇为重要。那么这一节中,我们的出发点就是如何求解非线性方程 f ( x ) = 0 f(x)=0 f(x)=0 的根.

1. 对分区间法

相必大家记得这么一个定理: 若 f ( x ) ∈ C [ a , b ] , 且 f ( a ) ⋅ f ( b ) < 0 , 则 f ( x ) 在 ( a , b ) 上 必 有 一 根 。 若f(x)\in C[a,b],且f(a) ·f(b) < 0,则f(x)在(a,b)上必有一根。 f(x)C[a,b]f(a)f(b)<0f(x)(a,b)这一句话便是“对分区间法”的依据。

操作步骤

如下图所示

  1. 选取当前区间的对分点 x 1 = a + b 2 x_1=\frac{a+b}{2} x1=2a+b
  2. 判断 f ( x 1 ) f(x_1) f(x1)的正负,若 f ( x 1 ) < 0 f(x_1)<0 f(x1)<0 a 1 = x 1 , b 2 = b a_1=x_1,b_2=b a1=x1,b2=b;若 f ( x 1 ) > 0 f(x_1)>0 f(x1)>0 a 1 = a , b 2 = x 1 . a_1=a,b_2=x_1. a1=a,b2=x1.
  3. 重复步骤1、2,直到满足条件 ∣ x k − x ∗ ∣ < ε |x_{k}-x^{*}|<\varepsilon xkx<ε 或者 ∣ f ( x k ) ∣ < ε |f(x_k)|<\varepsilon f(xk)<ε .

需要注意的是对于不同的情况,需要合理选择不同的停机条件。

在这里插入图片描述

误差分析

那么通过区间对分的方法求方程的根所带来的误差究竟有多大呢?在第1步中, ∣ x 1 − x ∗ ∣ ≤ b − a 2 |x_1-x^*| \le \frac{b-a}{2} x1x2ba, 在第2步中, ∣ x 2 − x ∗ ∣ ≤ b − a 2 2 |x_2-x^*|\le \frac{b-a}{2^2} x2x22ba, 以此类推,可知第 k k k步二分区间得到的 x n x_n xn 的误差为 ∣ x k − x ∗ ∣ ≤ b − a 2 k |x_k-x^*| \le \frac{b-a}{2^k} xkx2kba.

因此,在给定误差范围 ε \varepsilon ε 时,我们可以计算出需要二分区间的次数 k k k .
∣ x k − x ∗ ∣ ≤ b − a 2 k ≤ ε k ≥ ln ⁡ ( b − a ) − ln ⁡ ε ln ⁡ 2 \begin{aligned} |x_k-x^*|\le \frac{b-a}{2^k} \le \varepsilon \\ k \ge \frac{\ln(b-a)-\ln \varepsilon}{\ln2} \end{aligned} xkx2kbaεkln2ln(ba)lnε

该方法的不足之处

  1. 不能解决有重根的情况

2. 迭代法

等价变换: f ( x ) = 0 = > x = g ( x ) \begin{aligned} \text{等价变换:}f(x)=0 => x=g(x) \end{aligned} 等价变换:f(x)=0=>x=g(x)

f ( x ) = 0 f(x)=0 f(x)=0 求根问题转化为 x = g ( x ) x=g(x) x=g(x) 的不动点问题。从一个初值 x 0 x_0 x0 出发,依次计算 x 1 = g ( x 0 ) , x 2 = g ( x 1 ) , ⋯ x_1=g(x_0),x_2=g(x_1),\cdots x1=g(x0),x2=g(x1), 得出一个序列 { x i } \{x_i\} {xi} ,如果这个序列是收敛于 x ∗ x^* x, lim ⁡ k → + ∞ x k = lim ⁡ k → + ∞ x k + 1 = lim ⁡ k → + ∞ g ( x k ) = x ∗ \displaystyle \lim_{k \rightarrow +\infty} x_k= \displaystyle \lim_{k \rightarrow + \infty} {x_{k+1}} = \displaystyle \lim_{k \rightarrow +\infty} g(x_k) = x^* k+limxk=k+limxk+1=k+limg(xk)=x,如果此时的 g ( x ) g(x) g(x) 是连续函数,根据连续的定义可得出 g ( x ∗ ) = x ∗ g(x^*) = x^* g(x)=x,也就是说 x ∗ x^* x g ( x ) g(x) g(x)的不动点,也就是 f ( x ) = 0 f(x)=0 f(x)=0 的根。

那么如何保证由 g ( x ) g(x) g(x) 构造出来的序列 { x i } \{x_i\} {xi} 是收敛的呢?这里有一个定理来保证这件事情。

全局收敛定理: 考 虑 方 程 x = g ( x ) , g ( x ) ∈ C [ a , b ] . 若 : ( 1 ) x ∈ [ a , b ] 时 , g ( x ) ∈ [ a , b ] . ( 2 ) ∃ L , 0 ≤ L < 1 , 使 得 ∣ g ′ ( x ) ∣ ≤ L < 1. ∀ x ∈ [ a , b ] 成 立 . 则 任 取 x 0 ∈ [ a , b ] , 由 x k + 1 = g ( x k ) 产 生 的 序 列 { x i } 一 定 收 敛 于 g ( x ) 在 [ a , b ] 上 唯 一 的 不 动 点 , 并 且 有 误 差 估 计 式 ∣ x ∗ − x k ∣ ≤ 1 1 − L ∣ x k + 1 − x k ∣ ∣ x ∗ − x k ∣ ≤ L k 1 − L ∣ x 1 − x 0 ∣ 考虑方程 x=g(x),g(x) \in C[a,b].若: \\ (1) x \in [a,b]时,g(x)\in [a,b]. \\ (2)\exist L,0\le L<1,使得|g'(x)| \le L < 1.\forall x \in [a,b]成立. \\则任取x_0 \in [a,b],由x_{k+1}=g(x_k)产生的序列\{x_i\}一定收敛于g(x)在[a,b]上唯一的不动点,并且有误差估计式\\ |x^*-x_k|\le \frac{1}{1-L}|x_{k+1}-x_k| \\ |x^* - x_k| \le \frac{L^k}{1-L}|x_1-x_0| x=g(x),g(x)C[a,b].:(1)x[a,b],g(x)[a,b].(2)L,0L<1,使g(x)L<1.x[a,b].x0[a,b],xk+1=g(xk){xi}g(x)[a,b],xxk1L1xk+1xkxxk1LLkx1x0

上面的定理给出的初值 x 0 x_0 x0 的范围相对较大,我们还可以利用局部收敛性进行简化定理: 设 x ∗ 为 g ( x ) 的 不 动 点 , 并 且 g ′ ( x ) 在 x ∗ 的 某 个 邻 域 R 内 连 续 , 还 有 ∣ g ′ ( x ∗ ) ∣ < 1 , 则 任 意 x 0 ∈ R , 迭 代 产 生 的 序 列 { x i } ∈ R 收 敛 到 x ∗ . 设x^*为g(x)的不动点,并且g'(x)在x^*的某个邻域R内连续,还有|g'(x^*)|<1, 则任意x_0\in R,迭代产生的序列\{x_i\}\in R\\收敛到x^*. xg(x),g(x)xR,g(x)<1,x0R{xi}Rx.

迭代法的收敛阶

对于迭代过程的收敛快慢,我们可以用收敛阶来度量。什么是收敛阶呢?我们这么定义:设迭代公式 x k + 1 = g ( x k ) x_{k+1}=g(x_k) xk+1=g(xk) 构造的序列 { x i } \{x_i\} {xi} 收敛到 g ( x ) g(x) g(x) 的不动点 x ∗ x^* x,令 e k = x k − x ∗ e_k = x_k - x^* ek=xkx ,若 lim ⁡ k → + ∞ ∣ e k + 1 ∣ ∣ e k ∣ p = C > 0 \displaystyle\lim_ {k \rightarrow +\infty} \frac{|e_{k+1}|}{|e_k|^p} = C >0 k+limekpek+1=C>0,则称该迭代格式为 p p p阶收敛, C C C 为渐进误差常数。

一方面,我们可以根据定义来确定收敛阶、渐进误差常数。但实际上是很难操作的,那么在平常我们该如何确定收敛阶和渐进误差常数呢?我们有下面这个定理:

设 x ∗ 为 g ( x ) 的 不 动 点 , 若 g ( x ) ∈ C p [ B δ ( x ∗ ) ] , p ≥ 2 , g ′ ( x ∗ ) = ⋯ = g p − 1 ( x ∗ ) = 0 , 且 g p ( x ∗ ) ≠ 0. 则 x k + 1 = g ( x k ) 在 B δ ( x ∗ ) 内 p 阶 收 敛 . 设x^*为g(x)的不动点,若g(x) \in C^p[B_{\delta}(x^*)],p\ge 2,g'(x^*)=\cdots=g^{p-1}(x^*)=0,且g^p(x^*)\neq 0.\\则x_{k+1}=g(x_k)在B_{\delta}(x^*)内p阶收敛. xg(x),g(x)Cp[Bδ(x)],p2,g(x)==gp1(x)=0,gp(x)=0.xk+1=g(xk)Bδ(x)p.
证 明 : 令 g ( x k ) 在 x ∗ 处 作 T a y l o r 展 开 g ( x k ) = g ( x ∗ ) + g ′ ( x ∗ ) ( x k − x ∗ ) + g ( 2 ) ( x ∗ ) 2 ! ( x k − x ∗ ) 2 + ⋯ + g ( p − 1 ) ( x ∗ ) ( p − 1 ) ! ( x k − x ∗ ) p − 1 + g ( p ) ( x ∗ ) p ! ( x k − x ∗ ) p x k + 1 = x ∗ + g ( p ) ( x ∗ ) p ! ( x k − x ∗ ) p ∣ x k + 1 − x ∗ ∣ ∣ x k − x ∗ ∣ p = g ( p ) ( x ∗ ) p ! = C \begin{aligned} 证明:令g(x_k)在x^*处作Taylor展开 \\ g(x_k) &= g(x^*) + g'(x^*)(x_k-x^*)+\frac{g^{(2)}(x^*)}{2!}(x_k-x^*)^2+\cdots+\frac{g^{(p-1)}(x^*)}{(p-1)!}(x_k-x^*)^{p-1}+\frac{g^{(p)}(x^*)}{p!}(x_k-x^*)^p \\ x_{k+1} &= x^* + \frac{g^{(p)}(x^*)}{p!}(x_k-x^*)^p \\ \frac{|x_{k+1}-x^*|}{|x_k-x^*|^p} &= \frac{g^{(p)}(x^*)}{p!}=C \end{aligned} g(xk)xTaylorg(xk)xk+1xkxpxk+1x=g(x)+g(x)(xkx)+2!g(2)(x)(xkx)2++(p1)!g(p1)(x)(xkx)p1+p!g(p)(x)(xkx)p=x+p!g(p)(x)(xkx)p=p!g(p)(x)=C

几种常见的迭代法

可以看出,迭代法的关键在于选取合适的迭代函数g(x)。对于 f ( x ) = 0 f(x)=0 f(x)=0 ,最简单的一种构造方法便是 x = x + f ( x ) x=x+f(x) x=x+f(x),迭代格式为 x k + 1 = x k + f ( x k ) x_{k+1}=x_k+f(x_k) xk+1=xk+f(xk) 。但是一般情况下,这种格式不会收敛或者收敛的很慢。

为此,我们可以对它进行迭代-加速的改进处理。令 x ^ k + 1 = x k + f ( x k ) \hat{x}_{k+1}=x_k +f(x_k) x^k+1=xk+f(xk)
x k + 1 = 1 1 − q x ^ k + 1 − q 1 − q x k x k + 1 = 1 1 − q [ x k + f ( x k ) ] − q 1 − q x k x k + 1 = x k + 1 1 − q f ( x k ) \begin{aligned} x_{k+1} &= \frac{1}{1-q}\hat{x}_{k+1}-\frac{q}{1-q}x_k \\ x_{k+1} &= \frac{1}{1-q}[x_k +f(x_k)]-\frac{q}{1-q}x_k \\ x_{k+1} &= x_k +\frac{1}{1-q}f(x_k) \end{aligned} xk+1xk+1xk+1=1q1x^k+11qqxk=1q1[xk+f(xk)]1qqxk=xk+1q1f(xk)
更一般的形式为 x k + 1 = x k + 1 M f ( x k ) x_{k+1} = x_k +\frac{1}{M}f(x_k) xk+1=xk+M1f(xk).

牛顿迭代法

简单来说,该方法就是利用Taylor公式将 f ( x ) f(x) f(x) x ∗ x^* x 附近的某一点 x 0 x_0 x0 处进行一阶展开表示整理而来的。

f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x ∗ ) + f ′ ′ ( ξ ) 2 ! ( x − x ∗ ) 2 , ξ 在 x 0 与 x 之 间 f(x)=f(x_0)+f'(x_0)(x-x^*)+\frac{f''(\xi)}{2!}(x-x^*)^2,\xi在x_0与x之间 f(x)=f(x0)+f(x0)(xx)+2!f(ξ)(xx)2,ξx0x

忽略余项,将 x ∗ x^* x 代入上式得 f ( x ∗ ) = f ( x 0 ) + f ′ ( x 0 ) ( x ∗ − x 0 ) = 0 f(x^*) = f(x_0)+f'(x_0)(x^*-x_0)=0 f(x)=f(x0)+f(x0)(xx0)=0 ,整理可得 x ∗ = x 0 − f ( x 0 ) f ′ ( x 0 ) x^* =x_0 - \frac{f(x_0)}{f'(x_0)} x=x0f(x0)f(x0) , 从而牛顿迭代公式可以这样定义
x k + 1 = x k − f ( x k ) f ′ ( x k ) \begin{aligned} x_{k+1} = x_k - \frac{f(x_k)}{f'(x_k)} \end{aligned} xk+1=xkf(xk)f(xk)
我们可以从几何意义上去理解牛顿迭代法,如图

在这里插入图片描述

假设此时并不知道 x ∗ x^* x ,我们有一个初始值 x 0 x_0 x0 ,根据 f ( x ) f(x) f(x) 我们可以求出 f ( x 0 ) , f ′ ( x 0 ) f(x_0),f'(x_0) f(x0),f(x0) ,图中蓝线的斜率为 f ′ ( x 0 ) = f ( x 0 ) x 0 − x 1 f'(x_0) = \frac{f(x_0)}{x_0-x_1} f(x0)=x0x1f(x0) ,从而可以确定 x 1 x_1 x1的位置,可以这样迭代下去,直到 ∣ f ( x k ) ∣ < ε |f(x_k)|< \varepsilon f(xk)<ε .

这时,我们要问了:由牛顿迭代构造的序列 { x i } \{x_i\} {xi} 一定收敛吗?初值是不是好选择?它收敛的值是 g ( x ) g(x) g(x) 的不动点吗?

首先,在序列 { x i } \{x_i\} {xi} 收敛的条件下,最后一个问题可以解决,只要 g ( x ) g(x) g(x) 满足连续就可以了。由于 g ( x ) = x − f ( x ) f ′ ( x ) g(x)=x-\frac{f(x)}{f'(x)} g(x)=xf(x)f(x) ,所以只需要 f ( x ) ∈ C 1 [ a , b ] , 且 f ′ ( x ) ≠ 0 f(x)\in C^1[a,b],且f'(x)\neq 0 f(x)C1[a,b],f(x)=0

第一个问题该怎么解决呢?这就回到了全局收敛定理,它是从不动点的角度出发讨论条件,这个条件有点难,我们换一种从根的角度讨论的思路:

收 敛 的 充 分 条 件 : 设 f ( x ) ∈ C 2 [ a , b ] . 若 满 足 : ( 1 ) f ( a ) f ( b ) < 0 ( 2 ) 在 [ a , b ] 上 f ′ ′ ( x ) 不 变 号 且 f ′ ( x ) ≠ 0 ( 3 ) 选 取 x 0 ∈ [ a , b ] , 需 要 满 足 f ( x 0 ) f ′ ′ ( x 0 ) > 0 则 由 牛 顿 迭 代 法 构 造 的 序 列 { x i } 收 敛 于 f ( x ) 在 [ a , b ] 上 的 唯 一 根 收敛的充分条件:设f(x)\in C^2[a,b].若满足:\\(1)f(a)f(b)<0\\(2) 在[a,b]上f''(x)不变号且f'(x) \neq 0 \\ (3) 选取x_0 \in [a,b],需要满足f(x_0)f''(x_0)>0\\ 则由牛顿迭代法构造的序列\{x_i\}收敛于f(x)在[a,b]上的唯一根 f(x)C2[a,b].(1)f(a)f(b)<0(2)[a,b]f(x)f(x)=0(3)x0[a,b],f(x0)f(x0)>0{xi}f(x)[a,b]

上面定理中前两个条件还好说,是一个硬要求,但是第三个条件对我们提出的第二个问题就不友好了。因此利用迭代法局部收敛的定理,做下面的改进: 局 部 收 敛 定 理 : 设 f ( x ) ∈ C 2 [ a , b ] , 若 x ∗ 为 f ( x ) 在 [ a , b ] 上 的 根 , 且 f ′ ( x ∗ ) ≠ 0. 则 存 在 B δ ( x ∗ ) , 使 得 ∀ x 0 ∈ B δ ( x ∗ ) , 由 牛 顿 迭 代 法 产 生 的 序 列 { x i } 收 敛 到 x ∗ , 且 满 足 lim ⁡ k → + ∞ x ∗ − x k + 1 ( x ∗ − x k ) 2 = − f ′ ′ ( x ∗ ) 2 f ′ ( x ∗ ) 局部收敛定理:设f(x)\in C^2[a,b],若x^*为f(x)在[a,b]上的根,且f'(x^*)\neq 0.则存在B_{\delta}(x^*),使得\forall x_0 \in B_{\delta}(x^*),\\由牛顿迭代法产生的序列\{x_i\}收敛到x^*,且满足\displaystyle \lim_{k \rightarrow +\infty} \frac{x^*-x_{k+1}}{(x^*-x_k)^2}=-\frac{f''(x^*)}{2f'(x^*)} f(x)C2[a,b],xf(x)[a,b]f(x)=0.Bδ(x),使x0Bδ(x),{xi}x,k+lim(xxk)2xxk+1=2f(x)f(x)

在这里 x 0 x_0 x0 的选择是任意的,但是是在邻域内,这个邻域的寻找还是有点问题的。因此牛顿迭代法的收敛性速度还是依赖于 x 0 x_0 x0的选择。

在这里插入图片描述

简化牛顿迭代法

这个的改进是针对 f ‘ ( x k ) f‘(x_k) f(xk) 比较难计算而提出的。将 f ′ ( x k ) f'(x_k) f(xk) 都替换为 f ′ ( x 0 ) f'(x_0) f(x0) ,不用每次迭代都计算导数,节省大量计算难度
x k + 1 = x k − f ( x k ) f ′ ( x 0 ) \begin{aligned} x_{k+1} = x_k - \frac{f(x_k)}{f'(x_0)} \end{aligned} xk+1=xkf(x0)f(xk)
更一般的形式是不计算导数,而直接用一个常数代替
x k + 1 = x k − C f ( x k ) \begin{aligned} x_{k+1} = x_k - Cf(x_k) \end{aligned} xk+1=xkCf(xk)

牛顿下山法

在前面提到的方法中,并不能保证每次的迭代 ∣ f ( x k + 1 ) ∣ < ∣ f ( x k ) ∣ |f(x_{k+1})|< |f(x_k)| f(xk+1)<f(xk) ,为了更好地确保迭代的收敛,我们添加一条件,使之具有单调性,即若 ∣ f ( x k + 1 ) ∣ ≥ ∣ f ( x k ) ∣ |f(x_{k+1})|\ge |f(x_k)| f(xk+1)f(xk) ,需要在 x k + 1 x_{k+1} xk+1 x k x_k xk 之间重新选择 x ^ k + 1 \hat{x}_{k+1} x^k+1 点 。

在这里插入图片描述
x ^ k + 1 = λ x k + 1 + ( 1 − λ ) x k x ^ k + 1 = λ ( x k − f ( x k ) f ′ ( x k ) ) + ( 1 − λ ) x k x ^ k + 1 = x k − λ f ( x k ) f ′ ( x k ) \begin{aligned} \hat{x}_{k+1} &= \lambda x_{k+1}+(1- \lambda)x_k \\ \hat{x}_{k+1} &= \lambda (x_{k} - \frac{f(x_k)}{f'(x_k)})+(1- \lambda)x_k \\ \hat{x}_{k+1} &= x_k - \lambda \frac{f(x_k)}{f'(x_k)} \end{aligned} x^k+1x^k+1x^k+1=λxk+1+(1λ)xk=λ(xkf(xk)f(xk))+(1λ)xk=xkλf(xk)f(xk)
默认情况下 λ = 1 \lambda = 1 λ=1 ,如果在迭代中由 x k x_k xk 得到的 x k + 1 x_{k+1} xk+1 不能使 ∣ f ∣ |f| f 减小 ,则将 λ \lambda λ 减半 计算直到满足条件。

正割法、抛物线法

正割法是将迭代格式中的 f ′ ( x k ) f'(x_k) f(xk) 使用差商来近似,避免求导的过程。此时 f ′ ( x k ) ≈ f ( x k ) − f ( x k − 1 ) x k − x k − 1 f'(x_k) \approx \frac{f(x_{k})-f(x_{k-1})}{x_k -x_{k-1}} f(xk)xkxk1f(xk)f(xk1) .
x k + 1 = x k − f ( x k ) f ′ ( x k ) x k + 1 ≈ x k − f ( x k ) ( x k − x k − 1 ) f ( x k ) − f ( x k − 1 ) \begin{aligned} x_{k+1} &= x_k - \frac{f(x_k)}{f'(x_k)} \\ x_{k+1} &\approx x_k - \frac{f(x_k)(x_k - x_{k-1})}{f(x_k)-f(x_{k-1})} \end{aligned} xk+1xk+1=xkf(xk)f(xk)xkf(xk)f(xk1)f(xk)(xkxk1)
这个时候则需要两个初始值。

抛物线法在这里暂不介绍。

问题与思考

  1. 似乎这些方法对于多根情况没有考虑,迭代法在多根的情况下是否适用呢?我的想法可能是需要将多根转化为一个个局域单根的情况来解决,那样的话就涉及到另一个问题,如何确定根的个数和每一个根的局部范围?
  2. 在迭代法中,重根情况下牛顿迭代法还收敛吗?收敛速度怎么样?如何加速啊?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值