Chapter7 非线性方程求根
7.1 前言
- 本质:对一些n次代数多项式or超越方程,它们的根是难以通过解析方法求得,因此需采取数值方法
- 主要有:
- 二分法
- 不动点迭代法:迭代加速
- 牛顿迭代法:牛顿法、割线法
7.2 二分法
- 数学基础:零点定理
- 基本步骤:
- 确定初始区间[a,b]=>satisfy f(a)f(b)<0,
- 记x0=a+b2x_{0}=\frac{a+b}{2}x0=2a+b => calculate f(x0)f(x_{0})f(x0)
- judge:
- f(x0)==0f(x_{0})==0f(x0)==0 ==> out of loop
- f(a)f(x0)<0f(a)f(x_{0})<0f(a)f(x0)<0 ==> new x0∈[a,x0]x_{0}\in [a,x_{0}]x0∈[a,x0]
- f(x0)f(b)<0f(x_{0})f(b)<0f(x0)f(b)<0 ==> new x0∈[x0,b]x_{0}\in [x_{0},b]x0∈[x0,b]
- disadvantage:
- 只用了函数值的正负号,而非函数值的大小 => 收敛速度不快
- 二分法无法求复根
7.3 不动点迭代
7.3.1 基本概念
- 概念:类似于x(k+1)=B⋅x(k)+gx^{(k+1)}=B\cdot x^{(k)}+gx(k+1)=B⋅x(k)+g,将非线性方程转换为x=ϕ(x)x=\phi(x)x=ϕ(x),从而产生迭代算法xk+1=ϕ(xk)x_{k+1}=\phi(x_{k})xk+1=ϕ(xk)
- 基本步骤:
- 取初值x0x_{0}x0
- 迭代xk+1=ϕ(xk)x_{k+1}=\phi(x_{k})xk+1=ϕ(xk)
- when ∣xk+1−xk∣<ε|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)≤ba \leq \varphi(x) \leq ba≤φ(x)≤b;
(b) 存在一正数 L\boldsymbol{L}L, 满足 0<L<10<\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∗,且对于任意初值 x0∈[a,b]x_0 \in[a, b]x0∈[a,b],迭代法xk+1=φ(xk)x_{k+1}=\varphi\left(x_k\right)xk+1=φ(xk) 均收敛于 x∗x^*x∗
(2) 序列xk{x_{k}}xk的收敛速度有估计
∣xk−x∗∣≤L1−L∣xk−xk−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∣
∣xk−x∗∣≤Lk1−L∣x1−x0∣\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)<0g(a)g(b)<0g(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) 收敛性:∣xk−x∗∣=∣ϕ(xk−1)−ϕ(x∗)∣=ϕ(ξ)′∣xk−1−x∗∣≤L∣xk−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∗∣递推,∣xk−x∗∣≤Lk∣x0−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) 第一个等式:通过∣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}+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∗∣,从而有∣xk−x∗∣≤∣xk−xk+1∣+L∣xk−x∗∣|x_{k}-x^*|\leq|x_{k}-x_{k+1}|+L|x_{k}-x^*|∣xk−x∗∣≤∣xk−xk+1∣+L∣xk−x∗∣,推出∣xk−x∗∣≤L1−L∣xk−xk−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越小收敛越快,但是能满足这种条件的不动点函数实在是太困难了,但是如果将这个不动点收缩到一个邻域范围内,这样初值x0x_{0}x0只需要取到领域范围内的值即可收敛
- 局部收敛:这种在解的某个小领域内收敛的性质
- 全局收敛:没有这种要求,或者可以清楚地给出这个邻域区间范围的表达即为全局收敛
- 做法:先用二分法缩小根范围,再用局部收敛法定解
7.3.3 一道例题
- 提问:将x=tanxx=tanxx=tanx化为合适的迭代格式,并求解x=4.5附近的根
- 回答:
由不动点迭代收敛定理:
① 确定根的范围:f(x)=x−tan(x)→f′(x)=−tan2(x)<0f(x)=x-tan(x) \rightarrow f'(x)=-tan^2(x)<0f(x)=x−tan(x)→f′(x)=−tan2(x)<0,由零点定理,根范围在[4.4,4.5]
② 判断tanx的导数是否小于1,显然∣f′(x)=−tan2(x)∣>>1|f'(x)=-tan^2(x)|>>1∣f′(x)=−tan2(x)∣>>1,因此,将原函数转换为arctan(x)+π=xarctan(x)+\pi=xarctan(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 迭代加速
- 收敛阶:
记序列xkk=0∞{x_{k}}^\infty _{k=0}xkk=0∞收敛于x∗x^*x∗,记迭代误差 ek=x∗−xke_k=x^*-x_kek=x∗−xk,若:
limk→∞∣ek+1∣∣ek∣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:平方收敛
阶数越高,收敛越快
ek+1=ciek,ek=0.1→p1=c10.1>>p2=c20.01e_{k+1}=c_i e_{k}, e_{k}=0.1\rightarrow p1=c_1 0.1>>p2=c_{2} 0.01ek+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 时, 迭代格式 xk+1=φ(xk)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 时, 迭代格式 xk+1=φ(xk)x_{k+1}=\varphi\left(x_k\right)xk+1=φ(xk) 平方收敛到 x∗x^*x∗; - 证明:
(1) 微分中值定理
∣ek+1∣∣ek∣=∣xk+1−x∗∣∣xk−x∗∣=limk→0∣ϕ(ξ)′∣∣xk−x∗∣∣xk−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) 泰勒二阶展开
∣ek+1∣∣ek∣2=∣xk+1−x∗∣∣xk−x∗∣2=∣(φ(x∗)+φ′(x∗)(xk−x∗)+φ′(ε)2!(xk−x∗)2∣∣xk−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(xk)+f′(xk)(x−xk)+f′(xk)2!(x−xk)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(xk)+f′(xk)(x−xk)=0↓↓xk+1=xk−f(xk)f′(xk) \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∗x3−8∗x2−8∗x−11f(x)=3*x^3-8*x^2-8*x-11f(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(xk)f′(xk)\frac{f\left(x_k\right)}{f^{\prime}\left(x_k\right)}f′(xk)f(xk)之前增加一个校正因子λ\lambdaλ,使每次牛顿迭代的f(x)单调递减
- 基本步骤:
- 预估
- 校正
- 算法:
(1) 给定初值x0x_{0}x0
(2) 若∣f(xk)∣≤ε|f(x_k)| \leq \varepsilon∣f(xk)∣≤ε,则停止迭代
(3) 计算dk=f(xk)f′(xk)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(xk+λdk∣<∣f(xk)∣|f(x_k+\lambda d_k|<|f(x_k)|∣f(xk+λdk∣<∣f(xk)∣,则xk+1=xk+λdkx_{k+1}=x_k+\lambda d_kxk+1=xk+λdk,转(5);否则,λ=12λ\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′(xk)=f(xk)−f(xk−1)xk−xk−1f'(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(不证明)<牛顿下山法
本文介绍了求解非线性方程的数值方法,包括二分法、不动点迭代和牛顿迭代法。二分法基于函数值的正负判断,但收敛速度慢;不动点迭代利用迭代函数,满足特定条件时能保证收敛,但选择合适的迭代函数较为困难;牛顿迭代法基于泰勒展开,至少平方收敛,但需要函数的一阶和二阶导数信息。此外,还提到了牛顿下山法和割线法作为优化迭代过程的策略。
799

被折叠的 条评论
为什么被折叠?



