2.1根本问题
1.问题:我们经常遇到f(x) = 0求解的问题.我们想要知道当f(x)为非线性方程时有什么方法求解f(x)的零点,也就是上面方程的根.在这里会介绍二分法,不动点迭代法,牛顿法,割线法,逆二次插值法,zeroin法.
2.2问题的基本概念和敏感性
1.根的重数:对光滑函数f,若
f(x∗)=f′(x∗)=⋯=fm−1(x∗)=0∧fm(x∗)=0
则x∗为方程的m重根
2.问题的敏感性
求解非线性方程的f(x) = y问题是“已知y = 0,求x = ?”
问题条件数:cond=∣ΔyΔx∣≈∣f′(x∗)∣1

2.3二分法
1.二分法(初中学的二分法)
输入:有根区间[a, b],函数f(x)
输出:零点x∗
(1)x0=a,k=0,a0=a,b0=b
(2)若bk−ak<ϵ,则x∗=xk结束
(3)若sign(f(xk))=sign(f(ak)),则ak+1=xk,bk+1=bk,否则ak+1=ak,bk+1=xk
(4)k = k + 1转(2)
2.误差分析,机械精度ϵ
最终停止时:bk−ak=2⌊log2∣x∗∣⌋⋅2ϵ
绝对误差:e(xk)=∣xk−x∗∣≤2⌊log2∣x∗∣⌋⋅2ϵ
相对误差:er(xk)=∣x∗∣∣xk−x∗∣≤2ϵ
2.4不动点迭代法
1.思路:将f(x) = 0改为x=ϕ(x),构造迭代公式xk+1=ϕ(xk),下图给出了迭代的图形解释

注:确实有可能迭代得结果越来偏离正确解,之后会用特定的算法约束迭代过程.
2.不动点迭代法
输入:函数f(x),初值x0,迭代公式x=ϕ(x)
输出:零点x∗
(1)初值x0=x0,k=0
(2)计算xk+1=ϕ(xk)
(3)若∣f(xk)∣<ϵ1∧∣xk+1−xk∣<ϵ2则x∗=xk+1结束,否则转(2)
3.收敛定理:若ϕ(x)∈C[a,b]满足,C[a, b]表示[a, b]上的连续函数
(1)∀x∈[a,b],a≤ϕ(x)≤b
(2)∃L∈(0,1),对∀x1,x2∈[a,b]有ϕ(x1)−ϕ(x2)≤L∣x1−x2∣
则ϕ(x)在[a, b]上有唯一不动点,称为全局收敛
证:若ϕ(a)=a或ϕ(b)=b则a或b即为不动点
否则ϕ(a)>a∧ϕ(b)<b
令f(x)=ϕ(x)−x则f(x) < 0, f(b) > 0
f(x)为连续函数,因此∃x∗∈[a,b]
定理:若将收敛定理中的(2)改为∣ϕ′(x)∣<1,则同样有全局收敛性
4.局部收敛:函数ϕ(x)存在不动点x∗,若存在其某个邻域D:[x∗−δ,x∗+δ],对于任意初值x0∈D,迭代法xk+1=ϕ(xk)产生的解序列{xk}收敛到x∗,则迭代法局部收敛
定理:设x∗为函数ϕ(x)的不动点,若ϕ′(x)<1,∀x∈[x∗−δ,x∗+δ],则迭代法局部收敛
5.收敛阶:迭代解序列{x0,x1,⋯,xk,⋯}收敛于x∗,误差e(xk)=xk−x∗
k→∞lim∣e(xk)∣p∣e(xk+1)∣=C=0
则收敛阶为p,其中C为常数
p阶收敛定理:迭代公式xk+1=ϕ(xk),若ϕ(x)在x∗邻域上p阶导数连续p≥2,则该迭代法p阶收敛的充要条件为ϕ′(x∗)=⋯=ϕp−1(x∗)=0
证明思路:
e(xk+1)=xk+1−x∗=ϕ(xk)−ϕ(x∗)=ϕ′(x∗)(xk−x∗)+⋯+p!1ϕ(p)(ξ)(xk−x∗)p
在此泰勒公式的基础上再带入定义化简
2.5牛顿法
1.思路:f(x)=0⇒f(x)≈f(xk)+(x−xk)f′(xk)≈0
迭代公式即为:xk+1=xk−f′(xk)f(xk)(牛顿法也是不动点迭代法)

2.牛顿法
输入:函数f(x) = 0,初值x0,迭代公式xk+1=xk−f′(xk)f(xk)
输出:输出最优值x∗
(1)初值x0=x0,k = 0
(2)计算xk+1=xk−f′(xk)f(xk)
(3)若∣f(xk)∣<ϵ1∧∣xk+1−xk∣<ϵ2,则x∗=xk+1结束
(4)k = k + 1转(2)
3.单根收敛定理:设x∗是f(x) = 0的单跟,且f(x)在x∗附近有2阶连续导数,则牛顿法产生的解序列2阶收敛
4.牛顿法m重根收敛定理:limk→∞∣e(xk)e(xk+1)∣=1−m1,其中m为非线性方程根的重数.
2.6割线法与抛物线法
1.割线法:在牛顿法迭代时,用差商代替导数f′(x)≈xk−xk−1f(xk)−f(xk−1),即(xk,yk),(xk−1,yk−1)的斜率
2.抛物线法(二次插值法):带入xk,xk−1,xk−2算出抛物线,用抛物线与x轴交点作为xk+1
注:抛物线有可能不与x轴相交,可以使用“侧向抛物线”把xy轴较换求抛物线,这样一定会与x轴相交(逆二次插值法)

2.7使用的方程求根基数
1.阻尼牛顿法:将牛顿法的迭代公式变为xk+1=xk−λif′(xk)f(xk)
其中λi∈{λ}⊂(0,1],每次选择的λi保证∣f(xk+1)∣≤∣f(xk)∣
2.zeroin通法
思路:综合使用逆二次插值法,割线法,二分法得到收敛速度快,稳定的算法
输入:方程f(x) = 0,有根区间[a, b]
输出:解x∗
(1)选取初始值a和b,使得f(a)和f(b)异号
(2)将a赋值给c
(3)重复循环直到满足精度∣f(b)≤ϵ1∨∣a−b∣≤ϵ2∣b∣
a.若f(b)的正负号与f(a)相同,a = c;
b. 若|f(a)| < |f(b)|,则c = b,然后对调a,b;
c. 如果c=a,使用a,b,c对应的点作逆二次插值法,得到与x轴交点赋值给b;否则执行割线法,得到与x轴交点赋值给b
d. 若得到的近似解“比较满意”,则赋值给b不变,否则使用a,c重新用二分法得到新的b;将3.b中得到的b赋值给c
注:3.a和3.b都是为了调整a,b,c的位置,让|f(b)| < |f(a)|;3.c和3.d则是选择最优的迭代方法.
3.zeroin例子
下面列出zeroin实际执行的每一步,每一步分别用(1),(2),(3),3.a,3.b,3.c,3.d表示

(1)初始化a0,b0如上图所示
(2)初始c0=a0
(3)判断精度未达到
3.a f(b)与f(a)符号不同,无操作
3.b |f(a)| < |f(b)|,c1=b0,b1=a0,a1=b0(到这里已经调整好a,b,c的位置)
3.c c1=a1得到做割线法,得到上图中b2
3.d 得到的结果满意,c2=b1,为了说明方便,a2=a1
(3)判断精度未达到
3.a 无操作
3.b 无操作
3.c c2=a2,则根据逆二次插值法得到b3如上图所示
3.d 得到的结果满意,c3=b2,a3=a2
……
注:此处只是为了说明方便才列出所有的角标,实际程序运行过程中都是同一个变量,而不是数组