数值计算Lec1:求解方程

首先给出一个基础的数学定理

设 ff 在闭区间 [a,b][a,b] 上连续,且f(a)f(b)<0\begin{array}{rcl} f(a)\,f(b) &<& 0 \end{array}

则 ff 在 aa 与 bb 之间至少有一个根满足f(r)=0f(r) = 0

基于以上原理,我们就能提出第一种近似求根办法:二分法

二分法 The Bisection Method

首先确定范围[a,b][a,b]满足f(a)f(b)<0\begin{array}{rcl} f(a)\,f(b) &<& 0 \end{array},取c=a+b2\begin{array}{rcl} c &=& \dfrac{a+b}{2} \end{array},看 f(a)f(c)\begin{array}{rcl} f(a)\,f(c) \end{array}

  • 如果f(a)f(c)<0\begin{array}{rcl} f(a)\,f(c) &<& 0 \end{array},说明根在[a,c][a,c],令b=cb=c;
  • 如果f(a)f(c)≥0\begin{array}{rcl} f(a)\,f(c) &\ge& 0 \end{array},说明根在[c,b][c,b],令a=ca=c;

重复以上步骤,直到区间已经够短|a−b|<tol\begin{array}{rcl} |a-b| &<& \mathrm{tol} \end{array},则输出a+b2\begin{array}{rcl} \dfrac{a+b}{2} \end{array}

误差分析 Error Analysis

通过二分法,我们得到一系列区间 [an,bn][a_n,b_n] ,{an}\{a_n\}递增有上界,{bn}\{b_n\}递减有下界

因此极限存在且相等,也就是 ff 的一个根。

cn=an+bn2r=limn→∞⁡cn\begin{array}{rcl} c_n &=& \dfrac{a_n+b_n}{2} \\ r &=& \lim_{n\to\infty} c_n \end{array}

而二分法每次区间长度减半,则

bn−an=2−n(b0−a0)\begin{array}{rcl} b_n – a_n &=& 2^{-n}(b_0-a_0) \end{array}

那么对于n步后,误差界即为

|r−cn|≤bn−an2=2−(n+1)(b0−a0)\begin{array}{rcl} |r-c_n| &\le& \dfrac{b_n-a_n}{2} \\ &=& 2^{-(n+1)}(b_0-a_0) \end{array}

若误差小于半个单位(第 pp 位小数),就称解 精确到 pp 位小数:

|r−cn|<0.5×10−p\begin{array}{rcl} |r-c_n| &<& 0.5\times 10^{-p} \end{array}

代入上式,我们就可以得到

b0−a02n+1<0.5×10−p\begin{array}{rcl} \dfrac{b_0-a_0}{2^{n+1}} &<& 0.5\times 10^{-p} \end{array}

这也就是我们根据区间和精确位数来确定二分法步数n的办法


不动点迭代 Fixed-Point Iteration(FPI)

定义

若 F(x∗)=x∗F(x^{*}) = x^{*} ,则称实数x 是函数 F 的不动点。


迭代中的收敛

全局收敛定理

考虑 x=F(x)x=F(x),F 是定义在闭区间 [a,b][a,b] 上的连续函数,若

  •  x∈[a,b]⇒F(x)∈[a,b]x\in[a,b]\Rightarrow F(x)\in[a,b](也就是F把区间映进自己)
  • 存在 0≤L<10\le L<1,使得对所有 x∈[a,b]x\in[a,b],|F′(x)|≤L<1\begin{array}{rcl} |F'(x)| &\le& L < 1 \end{array}(也就是导数全部小于 1)

则对 任意 初值 x0∈[a,b]x_0\in[a,b],迭代xk=F(xk−1),\begin{array}{rcl} x_k = F(x_{k-1}), \end{array}都收敛到 FF 在 [a,b][a,b]上的 唯一 不动点 x∗x^{*}。


局部收敛定理

若F连续可微,F(x∗)=x∗F(x^{*})=x^{*},且S=|F′(x∗)|<1\begin{array}{rcl} S = |F'(x^{*})| < 1 \end{array}

则只要初值足够靠近 x∗x^{*},不动点迭代就会局部收敛。SS 常称为渐近收敛因子 Asymptotic convergence factor。

判断下面的迭代格式能不能用来求近似解。若不能,改成能收敛的形式。
(1)x=4−2x(2)x=1+x23\begin{array}{rcl} (1)\quad x &=& 4-2^{x} \\ (2)\quad x &=& \sqrt[3]{1+x^{2}} \end{array}

答案:

给出一个不动点迭代格式,用来求方程x3−x2−0.8=0\begin{array}{rcl} x^{3}-x^{2}-0.8 = 0 \end{array}在 x0=1.5x_0=1.5 附近的近似解。

答案:


收敛率 Convergence Rate

PPT上列出了这几种收敛率

  • …(比线性慢)
  • 线性收敛 Linear Convergence
  • 二次收敛 Quadratic Convergence(比线性收敛更快)
  • …(快于二次)

线性收敛

设 ene_n​ 是第 nn 步的误差(通常 en=xn−x∗e_n=x_n-x^{*})。若存在收敛率 S≠0S\neq 0,使得

−1<limn→∞⁡en+1en=S<1\begin{array}{rcl} -1 < \lim_{n\to\infty}\dfrac{e_{n+1}}{e_n} = S < 1 \end{array}

则称该方法 线性收敛,收敛率为 SS.

  • |S||S| 越小,线性收敛越快;
  • S>0S>0:误差同号,从一侧靠近;
  • S<0S<0:误差正负交替(振荡靠近);
  • S=0S=0不算线性,属于更快的超线性(例如等下要讲的Newton)


二次收敛

若 limn→∞⁡en+1en2=M<∞\begin{array}{rcl} \lim_{n\to\infty}\dfrac{e_{n+1}}{e_n^{2}} &=& M < \infty \end{array}

则称该迭代二次收敛


一般收敛率 rate of convergence

x∗x^* 是 x=F(x)x=F(x),误差 ek=xk−x∗e_k=x_k-x^{*}。若存在 pp 和 c≠0c\neq 0,使得

|ek+1ekp|→c(k→∞)\begin{array}{rcl} \left|\dfrac{e_{k+1}}{e_k^{p}}\right| &\to& c \qquad (k\to\infty) \end{array}

则称迭代 xk+1=F(xk)x_{k+1}=F(x_k)的 收敛率为 pp。

由之前定义我们可知,

  • 当p=1,c<1p=1, c<1时,线性收敛
  • 当p=2p=2时,二次收敛

我们还可以通过连续对F进行求导来判断它是什么收敛:

设 x∗x^{*}是不动点,在邻域 U(x∗)U(x^{*})内 FF 有直到 pp阶的连续导数,并且

F′(x∗)=F′′(x∗)=⋯=F(p−1)(x∗)=0F(p)(x∗)≠0\begin{array}{rcl} F'(x^{*})=F”(x^{*})=\cdots=F^{(p-1)}(x^{*}) &=& 0 \\ F^{(p)}(x^{*}) &\neq& 0 \end{array}

则该迭代局部 pp 阶收敛,收敛率为 pp。


FPI 的线性收敛

设 FF 连续可微,F(x∗)=x∗F(x^{*})=x^{*},且 S=F′(x∗)当−1<S<1且S≠0\begin{array}{rcl} S = F'(x^{*}) 当-1 < S < 1 且S\neq 0 \end{array}

则当初值足够靠近 x∗x^{*} 时,不动点迭代线性收敛到该不动点,收敛率就是 S=F′(x∗)S=F'(x^{*})


牛顿法 Newton’s Method

首先给出公式

F(x)=x−f(x)f′(x)\begin{array}{rcl} F(x) &=& x – \dfrac{f(x)}{f'(x)} \end{array}

当f′(xn)=0f ′ (x_n )=0  时公式不可用。

设 f(x∗)=0f(x^{*})=0,ff二阶连续可微。若f′(x∗)≠0\begin{array}{rcl} f'(x^{*}) &\neq& 0 \end{array},则牛顿法局部二次收敛到 x∗x^{*}。渐近常数为

M=f′′(x∗)2f′(x∗)\begin{array}{rcl} M &=& \dfrac{f”(x^{*})}{2f'(x^{*})} \end{array}

即

limn→∞⁡en+1en2=f′′(x∗)2f′(x∗)\begin{array}{rcl} \lim_{n\to\infty}\dfrac{e_{n+1}}{e_n^{2}} &=& \dfrac{f”(x^{*})}{2f'(x^{*})} \end{array}

若 f′(x∗)=0f'(x^{*})=0,一般会退回线性收敛。

要理解这个,我们先来看重根


重根 multiplicty root

x∗x^* 是 ff 的 mm 重根 当且仅当 前 m−1m-1阶导数在该点都为 0,第 mm 阶不为 0:

f(x∗)=f′(x∗)=⋯=f(m−1)(x∗)=0f(m)(x∗)≠0\begin{array}{rcl} f(x^{*})=f'(x^{*})=\cdots=f^{(m-1)}(x^{*}) &=& 0 \\ f^{(m)}(x^{*}) &\neq& 0 \end{array}
  • m=1时,单根,f(x∗)=0f(x^{*})=0但 f′(x∗)≠0f'(x^{*})\neq 0(即牛顿二次收敛的条件)
  • m≥2时,重根,曲线在根处与 xx 轴相切(甚至更平)。

若 ff是 m+1m+1次连续可微,且 x∗x^{*} 是 mm重根,则牛顿局部线性收敛,且收敛率SS满足

limi→∞⁡ei+1ei=SS=m−1m\begin{array}{rcl} \lim_{i\to\infty}\dfrac{e_{i+1}}{e_i} &=& S \\ S &=& \dfrac{m-1}{m} \end{array}

我们可以得到

mS=(m−1)/m快慢10二次(S=0,不是线性)21/2线性,每步大约减半32/3更慢m→∞→1几乎不收敛\begin{array}{c|c|c} \hline m & S=(m-1)/m & \text{快慢} \\ \hline 1 & 0 & \text{二次(}S=0\text{,不是线性)} \\ 2 & 1/2 & \text{线性,每步大约减半} \\ 3 & 2/3 & \text{更慢} \\ m\to\infty & \to 1 & \text{几乎不收敛} \\ \hline \end{array}


修正牛顿法 Modified Newton’s Method

为了解决重根只会线性收敛的问题,我们提出修正办法:步长乘上重数 mm

若 ff 在含根区间 [a,b][a,b] 上 m+1m+1次连续可微,x∗x^{*} 是 mm 重根(m>1m>1),则

xi+1=xi−mf(xi)f′(xi)\begin{array}{rcl} x_{i+1} &=& x_i – m\dfrac{f(x_i)}{f'(x_i)} \end{array}

局部二次收敛到 x∗x^{*}

对比:

迭代m>1 时Newtonx−f/f′线性,S=(m−1)/mModified Newtonx−mf/f′恢复二次\begin{array}{c|c|c} \hline & \text{迭代} & m>1\text{ 时} \\ \hline \text{Newton} & x-f/f’ & \text{线性,}S=(m-1)/m \\ \text{Modified Newton} & x-m f/f’ & \text{恢复二次} \\ \hline \end{array}


作业

给出计算 1/a1/\sqrt{a}的 Newton 迭代,且公式里 不要出现开方和除法。

答案:

设计 不用除法 的算法计算 1/c1/c(c>1c>1),再用它算 1/1.23451/1.2345。

答案:


割线法 Secant Method

割线法和牛顿法很相似,它使用最近两点的差商代替导数,因此需要两个初值 x0,x1x_0,x_1

xi+1=xi−f(xi)(xi−xi−1)f(xi)−f(xi−1),i=1,2,3,…\begin{array}{rcl} x_{i+1} &=& x_i – \dfrac{f(x_i)\,(x_i-x_{i-1})}{f(x_i)-f(x_{i-1})}, \qquad i=1,2,3,\ldots \end{array}

对单根来说,割线法是超线性(superlinear)——比线性快、比二次慢。常见的收敛率是黄金比

p=1+52≈1.618\begin{array}{rcl} p &=& \dfrac{1+\sqrt{5}}{2}\approx 1.618 \end{array}

敏感问题(感觉不太重要?)

若输入(方程)只改一点点,输出(根)却动很大,就称问题敏感(sensitive)。用 误差放大因子 和 条件数 来定量。

假设

  • 原方程 f(x)=0f(x)=0,真根为 rr;
  • 输入加上小扰动 ϵg(x)\epsilon g(x)(ϵ\epsilon 很小);
  • 根变成 r+Δrr+\Delta r,满足f(r+Δr)+ϵg(r+Δr)=0\begin{array}{rcl} f(r+\Delta r)+\epsilon g(r+\Delta r) &=& 0 \end{array}

在 x=rx=r 处把 f,gf,g 使用泰勒展开到一阶:

f(r)+Δr⋅f′(r)+ϵg(r)+ϵ⋅Δr⋅g′(r)+O((Δr)2)=0\begin{array}{rcl} f(r)+\Delta r\cdot f'(r)+\epsilon g(r)+\epsilon\cdot\Delta r\cdot g'(r)+O((\Delta r)^{2}) &=& 0 \end{array}

丢掉 O((Δr)2)O((\Delta r)^{2}),并用 f(r)=0f(r)=0:

Δr⋅(f′(r)+ϵg′(r))≈−f(r)−ϵg(r)=−ϵg(r)\begin{array}{rcl} \Delta r\cdot\bigl(f'(r)+\epsilon g'(r)\bigr) &\approx& -f(r)-\epsilon g(r) \\ &=& -\epsilon g(r) \end{array}

若 ϵ\epsilon 很小且 f′(r)≠0f'(r)\neq 0,分母里的 ϵg′(r)\epsilon g'(r)可略,得到框中的主公式:

Δr≈−ϵg(r)f′(r)+ϵg′(r)≈−ϵg(r)f′(r)\begin{array}{rcl} \Delta r &\approx& \dfrac{-\epsilon g(r)}{f'(r)+\epsilon g'(r)} \\ &\approx& -\epsilon\dfrac{g(r)}{f'(r)} \end{array}

根的扰动与 ϵ\epsilon 成正比,放大倍数大约是 |g(r)f′(r)||\dfrac{g(r)}{f'(r)}|。f′(r)f'(r)越接近 0,问题越敏感。

等价地

Δrf(r+Δr)≈1f′(r)\begin{array}{rcl} \dfrac{\Delta r}{f(r+\Delta r)} &\approx& \dfrac{1}{f'(r)} \end{array}

这其实来自 f(r+Δr)≈f′(r)Δrf(r+\Delta r)\approx f'(r)\Delta r,是线性近似的另一写法

敏感性主要还是看上面的 Δr≈−ϵg(r)/f′(r)\Delta r\approx -\epsilon g(r)/f'(r)

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!