Chapter7 非线性方程求根
7.1 前言
- 本质:对一些n次代数多项式or超越方程,它们的根是难以通过解析方法求得,因此需采取数值方法
- 主要有:
- 二分法
- 不动点迭代法:迭代加速
- 牛顿迭代法:牛顿法、割线法
7.2 二分法
- 数学基础:零点定理
- 基本步骤:
- 确定初始区间[a,b]=>satisfy f(a)f(b)<0,
- 记 x 0 = a + b 2 x_{0}=\frac{a+b}{2} x0=2a+b => calculate f ( x 0 ) f(x_{0}) f(x0)
- judge:
- f ( x 0 ) = = 0 f(x_{0})==0 f(x0)==0 ==> out of loop
- f ( a ) f ( x 0 ) < 0 f(a)f(x_{0})<0 f(a)f(x0)<0 ==> new x 0 ∈ [ a , x 0 ] x_{0}\in [a,x_{0}] x0∈[a,x0]
- f ( x 0 ) f ( b ) < 0 f(x_{0})f(b)<0 f(x0)f(b)<0 ==> new x 0 ∈ [ x 0 , b ] x_{0}\in [x_{0},b] x0∈[x0,b]
- disadvantage:
- 只用了函数值的正负号,而非函数值的大小 => 收敛速度不快
- 二分法无法求复根
7.3 不动点迭代
7.3.1 基本概念
- 概念:类似于 x ( k + 1 ) = B ⋅ x ( k ) + g x^{(k+1)}=B\cdot x^{(k)}+g x(k+1)=B⋅x(k)+g,将非线性方程转换为 x = ϕ ( x ) x=\phi(x) x=ϕ(x),从而产生迭代算法 x k + 1 = ϕ ( x k ) x_{k+1}=\phi(x_{k}) xk+1=ϕ(xk)
- 基本步骤:
- 取初值 x 0 x_{0} x0
- 迭代 x k + 1 = ϕ ( x k ) x_{k+1}=\phi(x_{k}) xk+1=ϕ(xk)
- when ∣ x k + 1 − x k ∣ < ε |x_{k+1}-x_{k}|<\varepsilon ∣xk+1−xk∣<ε,终止迭代
- 核心:
- 构造 x = ϕ ( x ) x=\phi(x) x=ϕ(x)
- 判断是否收敛
7.3.2 收敛性
- 定理:
设迭代函数 φ ( x ) \varphi(\boldsymbol{x}) φ(x) 在 [ a , b ] [\boldsymbol{a}, \boldsymbol{b}] [a,b] 上连续, 且满足:
(a) 当 x ∈ [ a , b ] x \in[a, b] x∈[a,b] 时, a ≤ φ ( x ) ≤ b a \leq \varphi(x) \leq b a≤φ(x)≤b;
(b) 存在一正数 L \boldsymbol{L} L, 满足 0 < L < 1 0<\boldsymbol{L}<\mathbf{1} 0<L<1, 且 ∀ x ∈ [ a , b ] \forall \boldsymbol{x} \in[\boldsymbol{a}, \boldsymbol{b}] ∀x∈[a,b], 有
∣ φ ′ ( x ) ∣ ≤ L \left|\varphi^{\prime}(x)\right| \leq L ∣φ′(x)∣≤L
则:
(1) 方程 x = φ ( x ) \boldsymbol{x}=\varphi(\boldsymbol{x}) x=φ(x)在 [ a , b \boldsymbol{a}, \boldsymbol{b} a,b] 内有唯一解 x ∗ \boldsymbol{x}^* x∗,且对于任意初值 x 0 ∈ [ a , b ] x_0 \in[a, b] x0∈[a,b],迭代法 x k + 1 = φ ( x k ) x_{k+1}=\varphi\left(x_k\right) xk+1=φ(xk) 均收敛于 x ∗ x^* x∗
(2) 序列 x k {x_{k}} xk的收敛速度有估计
∣ x k − x ∗ ∣ ≤ L 1 − L ∣ x k − x k − 1 ∣ \left|\boldsymbol{x}_k-\boldsymbol{x} *\right| \leq \frac{L}{1-L}\left|\boldsymbol{x}_k-\boldsymbol{x}_{k-1}\right| ∣xk−x∗∣≤1−LL∣xk−xk−1∣
∣ x k − x ∗ ∣ ≤ L k 1 − L ∣ x 1 − x 0 ∣ \left|\boldsymbol{x}_k-\boldsymbol{x} *\right| \leq \frac{L^k}{1-L}\left|x_1-x_0\right| ∣xk−x∗∣≤1−LLk∣x1−x0∣ - 证明:
(1.1) 存在性:构造 g ( x ) = x − ϕ ( x ) g(x)=x-\phi(x) g(x)=x−ϕ(x),通过零点定理和条件(a)证明 g ( a ) g ( b ) < 0 g(a)g(b)<0 g(a)g(b)<0
(1.2) 唯一性:反证法,假设有一个新真值 y ∗ y^* y∗,由拉格朗日微分中值定理-> ∣ x ∗ − y ∗ ∣ = ∣ ϕ ( x ∗ ) − ϕ ( y ∗ ) ∣ = ϕ ( ξ ) ′ ∣ x ∗ − y ∗ ∣ |x^*-y^*|=|\phi(x^*)-\phi(y^*)|=\phi(\xi)'|x^*-y^*| ∣x∗−y∗∣=∣ϕ(x∗)−ϕ(y∗)∣=ϕ(ξ)′∣x∗−y∗∣,显然, ∣ x ∗ − y ∗ ∣ = ϕ ( ξ ) ′ ∣ x ∗ − y ∗ ∣ |x^*-y^*|=\phi(\xi)'|x^*-y^*| ∣x∗−y∗∣=ϕ(ξ)′∣x∗−y∗∣只有当 ϕ ( ξ ) ′ = = 1 \phi(\xi)'==1 ϕ(ξ)′==1时取等号,与条件(b)不符
(1.3) 收敛性: ∣ x k − x ∗ ∣ = ∣ ϕ ( x k − 1 ) − ϕ ( x ∗ ) ∣ = ϕ ( ξ ) ′ ∣ x k − 1 − x ∗ ∣ ≤ L ∣ x k − x ∗ ∣ |x_{k}-x^*|=|\phi(x_{k-1})-\phi(x^*)|=\phi(\xi)'|x_{k-1}-x^*|\leq L|x_{k}-x^*| ∣xk−x∗∣=∣ϕ(xk−1)−ϕ(x∗)∣=ϕ(ξ)′∣xk−1−x∗∣≤L∣xk−x∗∣递推, ∣ x k − x ∗ ∣ ≤ L k ∣ x 0 − x ∗ ∣ → 0 |x_{k}-x^*|\leq L^k|x_{0}-x^*|\rightarrow0 ∣xk−x∗∣≤Lk∣x0−x∗∣→0,(L属于0,1;而x0和x*都是定值,所以趋近于0)
(2.1) 第一个等式:通过 ∣ x k − x ∗ ∣ = ∣ x k − x k + 1 + x k + 1 − x ∗ ∣ = ∣ x k − x k + 1 + ϕ ( x k ) − ϕ ( x ∗ ) ∣ = ∣ x k − x k + 1 + ϕ ( ξ ) ′ ( x k − x ∗ ) ∣ ≤ ∣ x k − x k + 1 ∣ + L ∣ x k − x ∗ ∣ |x_{k}-x^*|=|x_{k}-x_{k+1}+x_{k+1}-x^*|=|x_{k}-x_{k+1}+\phi(x_{k})-\phi(x^*)|=|x_{k}-x_{k+1}+\phi(\xi)'(x_{k}-x^*)|\leq|x_{k}-x_{k+1}|+L|x_{k}-x^*| ∣xk−x∗∣=∣xk−xk+1+xk+1−x∗∣=∣xk−xk+1+ϕ(xk)−ϕ(x∗)∣=∣xk−xk+1+ϕ(ξ)′(xk−x∗)∣≤∣xk−xk+1∣+L∣xk−x∗∣,从而有 ∣ x k − x ∗ ∣ ≤ ∣ x k − x k + 1 ∣ + L ∣ x k − x ∗ ∣ |x_{k}-x^*|\leq|x_{k}-x_{k+1}|+L|x_{k}-x^*| ∣xk−x∗∣≤∣xk−xk+1∣+L∣xk−x∗∣,推出 ∣ x k − x ∗ ∣ ≤ L 1 − L ∣ x k − x k − 1 ∣ \left|\boldsymbol{x}_k-\boldsymbol{x} *\right| \leq \frac{L}{1-L}\left|\boldsymbol{x}_k-\boldsymbol{x}_{k-1}\right| ∣xk−x∗∣≤1−LL∣xk−xk−1∣
(2.2) 第二个等式:由第一个等式递推即可
- 特点:L越小收敛越快,但是能满足这种条件的不动点函数实在是太困难了,但是如果将这个不动点收缩到一个邻域范围内,这样初值
x
0
x_{0}
x0只需要取到领域范围内的值即可收敛
- 局部收敛:这种在解的某个小领域内收敛的性质
- 全局收敛:没有这种要求,或者可以清楚地给出这个邻域区间范围的表达即为全局收敛
- 做法:先用二分法缩小根范围,再用局部收敛法定解
7.3.3 一道例题
- 提问:将 x = t a n x x=tanx x=tanx化为合适的迭代格式,并求解x=4.5附近的根
- 回答:
由不动点迭代收敛定理:
① 确定根的范围: f ( x ) = x − t a n ( x ) → f ′ ( x ) = − t a n 2 ( x ) < 0 f(x)=x-tan(x) \rightarrow f'(x)=-tan^2(x)<0 f(x)=x−tan(x)→f′(x)=−tan2(x)<0,由零点定理,根范围在[4.4,4.5]
② 判断tanx的导数是否小于1,显然 ∣ f ′ ( x ) = − t a n 2 ( x ) ∣ > > 1 |f'(x)=-tan^2(x)|>>1 ∣f′(x)=−tan2(x)∣>>1,因此,将原函数转换为 a r c t a n ( x ) + π = x arctan(x)+\pi=x arctan(x)+π=x
通过以下matlab代码求解:
clc,clear all
x1=4.5;
x2=g(x1);
while abs(x2-x1)>eps
x1=x2;
x2=g(x1);
end
x2
function y=g(x)
y=atan(x)+pi;
end
7.4 迭代加速
- 收敛阶:
记序列 x k k = 0 ∞ {x_{k}}^\infty _{k=0} xkk=0∞收敛于 x ∗ x^* x∗,记迭代误差 e k = x ∗ − x k e_k=x^*-x_k ek=x∗−xk,若:
lim k → ∞ ∣ e k + 1 ∣ ∣ e k ∣ p = C \lim _{k \rightarrow \infty} \frac{\left|e_{k+1}\right|}{\left|e_k\right|^p}=C k→∞lim∣ek∣p∣ek+1∣=C
称为p阶收敛
p=1: 线性收敛;p=2:平方收敛
阶数越高,收敛越快
e k + 1 = c i e k , e k = 0.1 → p 1 = c 1 0.1 > > p 2 = c 2 0.01 e_{k+1}=c_i e_{k}, e_{k}=0.1\rightarrow p1=c_1 0.1>>p2=c_{2} 0.01 ek+1=ciek,ek=0.1→p1=c10.1>>p2=c20.01
- 收敛速度定理
设 x ∗ x * x∗ 是方程 x = φ ( x ) x=\varphi(x) x=φ(x) 的根, φ ( x ) \varphi(x) φ(x) 在 x ∗ x^* x∗ 邻近有连续的二阶导数,且 φ ′ ( x ∗ ) ≤ 1 \varphi^{\prime}\left(x^*\right) \leq 1 φ′(x∗)≤1
(1) 当 φ ′ ( x ∗ ) ≠ 0 \varphi^{\prime}\left(x^*\right) \neq 0 φ′(x∗)=0 时, 迭代格式 x k + 1 = φ ( x k ) x_{k+1}=\varphi\left(x_k\right) xk+1=φ(xk) 线性收敛到 x ∗ x^* x∗;
(2) 当 φ ′ ( x ∗ ) = 0 , φ ′ ′ ( x ∗ ) ≠ 0 \varphi^{\prime}\left(x^*\right)=0, \varphi^{\prime \prime}\left(x^*\right)\neq 0 φ′(x∗)=0,φ′′(x∗)=0 时, 迭代格式 x k + 1 = φ ( x k ) x_{k+1}=\varphi\left(x_k\right) xk+1=φ(xk) 平方收敛到 x ∗ x^* x∗; - 证明:
(1) 微分中值定理
∣ e k + 1 ∣ ∣ e k ∣ = ∣ x k + 1 − x ∗ ∣ ∣ x k − x ∗ ∣ = l i m k → 0 ∣ ϕ ( ξ ) ′ ∣ ∣ x k − x ∗ ∣ ∣ x k − x ∗ ∣ = ϕ ( ξ ) ′ ≠ 0 \frac{\left|e_{k+1}\right|}{\left|e_k\right|}=\frac{\left|x_{k+1}-x^*\right|}{\left|x_k-x^*\right|}=lim_{k\rightarrow0}\frac{|\phi(\xi)'||x_{k}-x^*|}{|x_{k}-x^*|}=\phi(\xi)'\neq 0 ∣ek∣∣ek+1∣=∣xk−x∗∣∣xk+1−x∗∣=limk→0∣xk−x∗∣∣ϕ(ξ)′∣∣xk−x∗∣=ϕ(ξ)′=0
(2) 泰勒二阶展开
∣ e k + 1 ∣ ∣ e k ∣ 2 = ∣ x k + 1 − x ∗ ∣ ∣ x k − x ∗ ∣ 2 = ∣ ( φ ( x ∗ ) + φ ′ ( x ∗ ) ( x k − x ∗ ) + φ ′ ( ε ) 2 ! ( x k − x ∗ ) 2 ∣ ∣ x k − x ∗ ∣ 2 \frac{\left|e_{k+1}\right|}{\left|e_k\right|^2}=\frac{\left|x_{k+1}-x^*\right|}{\left|x_k-x^*\right|^2}=\frac{|\left (\varphi\left(x^*\right)+\varphi^{\prime}\left(x^{*}\right)\left(x_k-x^*\right)+\frac{\varphi^{\prime}(\varepsilon)}{2 !}\left(x_k-x^*\right)^2 |\right.}{\left|x_k-x^*\right|^2} ∣ek∣2∣ek+1∣=∣xk−x∗∣2∣xk+1−x∗∣=∣xk−x∗∣2∣(φ(x∗)+φ′(x∗)(xk−x∗)+2!φ′(ε)(xk−x∗)2∣
7.5 牛顿迭代
7.5.1 基本概念
- 推导:由泰勒二阶展开公式:
f ( x ) = f ( x k ) + f ′ ( x k ) ( x − x k ) + f ′ ( x k ) 2 ! ( x − x k ) 2 + ⋯ f(x)=f\left(x_k\right)+f^{\prime}\left(x_k\right)\left(x-x_k\right)+\frac{f^{\prime}\left(x_k\right)}{2 !}\left(x-x_k\right)^2+\cdots f(x)=f(xk)+f′(xk)(x−xk)+2!f′(xk)(x−xk)2+⋯
↓ f ( x ) = 0 ↓ f ( x k ) + f ′ ( x k ) ( x − x k ) = 0 ↓ ↓ x k + 1 = x k − f ( x k ) f ′ ( x k ) \downarrow\\ f(x)=0\\ \downarrow\\ f\left(x_k\right)+f^{\prime}\left(x_k\right)\left(x-x_k\right)=0\\ \downarrow\\ \downarrow\\ x_{k+1}=x_k - \frac{f\left(x_k\right)}{f^{\prime}\left(x_k\right)} ↓f(x)=0↓f(xk)+f′(xk)(x−xk)=0↓↓xk+1=xk−f′(xk)f(xk) - 例题:求解 f ( x ) = 3 ∗ x 3 − 8 ∗ x 2 − 8 ∗ x − 11 f(x)=3*x^3-8*x^2-8*x-11 f(x)=3∗x3−8∗x2−8∗x−11的某个近似根
由高中知识,判断该方程仅有一个解,解的范围在[3,4]
代码如下:
clc,clear all
x1=3.5;
x2=g(x1);
while abs(x2-x1)>eps
x1=x2;
x2=g(x1);
end
x2
function y=g(x)
y=x-(3*(x^3)-8*(x^2)-8*x-11)./(9*(x^2)-16*x-8);
end
- 特点
- 至少平方收敛
- 局部收敛
7.5.3 牛顿下山法
- 特点:在 f ( x k ) f ′ ( x k ) \frac{f\left(x_k\right)}{f^{\prime}\left(x_k\right)} f′(xk)f(xk)之前增加一个校正因子 λ \lambda λ,使每次牛顿迭代的f(x)单调递减
- 基本步骤:
- 预估
- 校正
- 算法:
(1) 给定初值 x 0 x_{0} x0
(2) 若 ∣ f ( x k ) ∣ ≤ ε |f(x_k)| \leq \varepsilon ∣f(xk)∣≤ε,则停止迭代
(3) 计算 d k = f ( x k ) f ′ ( x k ) d_k=\frac{f\left(x_k\right)}{f^{\prime}\left(x_k\right)} dk=f′(xk)f(xk),并取 λ = 1 \lambda =1 λ=1
(4) 若 ∣ f ( x k + λ d k ∣ < ∣ f ( x k ) ∣ |f(x_k+\lambda d_k|<|f(x_k)| ∣f(xk+λdk∣<∣f(xk)∣,则 x k + 1 = x k + λ d k x_{k+1}=x_k+\lambda d_k xk+1=xk+λdk,转(5);否则, λ = 1 2 λ \lambda=\frac{1}{2} \lambda λ=21λ,当 λ < ε \lambda<\varepsilon λ<ε,停止迭代,下山失败。
(5) k=k+1,转(2)
function [x,it]=newtonfg(x0,f,g,maxit,tol)
x1=x0;
d=-feval(f,x0)./feval(g,x0);
x2=x1+d;
it=0;
while abs(x1-x2)>=tol
it=it+1;
if it>=maxit
break;
end
x1=x2;d=-feval(f,x1)./feval(g,x1);fx=feval(f,x1);
isdone=0;lambda=1;
while isdone==0
xn=x1+lambda*d;
fn=feval(f,xn);
if abs(fn)<=abs(fx)
isdone=1;
else
lambda=0.5*lambda;
if lambda<=tol
disp("misson fail");
break;
end
end
x2=xn;
end
end
x=x2;
7.5.4 割线法
- 本质:用两点割线计算 f ′ ( x k ) = f ( x k ) − f ( x k − 1 ) x k − x k − 1 f'(x_k)=\frac{f(x_k)-f(x_{k-1})}{x_k-x_{k-1}} f′(xk)=xk−xk−1f(xk)−f(xk−1)
- 特点:
- 不算导数,但是初始值要两个
- 收敛阶级:1.618(不证明)<牛顿下山法