数值分析笔记(一):方程求根
文章目录
- 根的搜索
- 迭代法
- 收敛性的判断
- 收敛速度
- 加速迭代
- Newton法(切线法)
- Newton法的改进
- Newton下山法
- 弦截法
- 快速弦截法
- 改进牛顿法
根的搜索
逐步搜索
在给定区间[a,b][a, b][a,b]上从左端点x=ax=ax=a开始,按照步长hhh一步一步取f(x0)f(x_0)f(x0)和f(x0+h)f(x_0+h)f(x0+h),如果发现成立f(x0)⋅f(x0+h)≤0f(x_0)\cdot f(x_0+h)\leq 0f(x0)⋅f(x0+h)≤0则在区间[x0,x0+h][x_0,x_0+h][x0,x0+h]有根。
当hhh太小时所需的搜索次数过多,计算量过大。
二分搜索
对有根区间[a0,b0][a_0,b_0][a0,b0]实行如下二分手续:用中点x0=a0+b02x_0= \frac{a_0+b_0}2x0=2a0+b0将区间分成两半,判断所求根x∗x^*x∗在x0x_0x0的哪一侧,从而确定新的有根区间[a1,b1][a_1,b_1][a1,b1],其长度为[a0,b0][a_0,b_0][a0,b0]的一半。如果无限循环下去,有根区间必收敛于一点x∗x^*x∗。
试位法(Method of False Position
)思想:寻找过f(a)f(a)f(a)和f(b)f(b)f(b)的割线与x轴的交点(c,0)(c,0)(c,0)
迭代法
迭代法的核心思想就是隐式方程显式化。将方程f(x)=0f(x)=0f(x)=0改写为x=φ(x)x=\varphi (x)x=φ(x),给出方程根的某个近似值xkx_kxk,代入,得xk+1=φ(xk)x_{k+1}=\varphi (x_k)xk+1=φ(xk),即能得到从给定初值出发的序列x1,x2,x3,⋯x_1,x_2,x_3,\cdotsx1,x2,x3,⋯。如果这个数列是收敛的,那么显然有方程的根x∗=limk→∞xkx^*=\lim\limits_{k \to \infty}x_kx∗=k→∞limxk。
收敛性的判断
如果存在邻域Δ:∣x−x∗∣≤δ,∀δ>0\Delta : |x-x^*|\leq\delta,\forall\delta>0Δ:∣x−x∗∣≤δ,∀δ>0,使得在迭代过程中∀x0∈Δ\forall x_0\in\Delta∀x0∈Δ,则称其在根x∗x^*x∗邻近收敛。其中x0x_0x0为迭代初值。
设φ(x)\varphi(x)φ(x)在方程x=φ(x)x=\varphi(x)x=φ(x)的根x∗x^*x∗的邻近有连续的一阶导数,且成立∣φ′(x∗)∣<1|\varphi'(x^*)|<1∣φ′(x∗)∣<1,则迭代过程xk+1=φ(xk)x_{k+1}=\varphi (x_k)xk+1=φ(xk)在x∗x^*x∗邻近具有局部收敛性。也就是说,具有局部收敛性的迭代过程xk+1=φ(xk)x_{k+1}=\varphi (x_k)xk+1=φ(xk)对足够准确的迭代初值x∗x^*x∗收敛。
收敛速度
对于具有局部收敛性的迭代过程xk+1=φ(xk)x_{k+1}=\varphi (x_k)xk+1=φ(xk),若φ′(x∗)≠0\varphi '(x^*)\neq0φ′(x∗)=0则称迭代过程是线性收敛的,而当φ′(x∗)=0\varphi '(x^*)=0φ′(x∗)=0且φ′′(x∗)≠0\varphi ''(x^*)\neq0φ′′(x∗)=0,则称迭代过程是平方收敛的。
加速迭代
先考察线性迭代函数
设φ(x)\varphi (x)φ(x)为线性函数 φ(x)=Lx+d,L>0\varphi (x)=Lx+d,L>0φ(x)=Lx+d,L>0
则所给方程的迭代公式为 xk+1=Lxk+dx_{k+1}=Lx_k+dxk+1=Lxk+d
方程的根x∗x^*x∗满足 x∗=Lx∗+dx^*=Lx^*+dx∗=Lx∗+d
两式相减,有 x∗−xk+1=L(x∗−xk)x^*-x_{k+1}=L(x^*-x_k)x∗−xk+1=L(x∗−xk)
对迭代误差ek=∣x∗−xk∣e_k=|x^*-x_k|ek=∣x∗−xk∣,有ek+1=Leke_{k+1}=Le_kek+1=Lek
反复递推,有 ek=Lke0e_k=L^ke_0ek=Lke0
L<1L<1L<1时,迭代序列收敛,且L越小收敛速度越快。
利用上述思想,我们可以对迭代过程进行加速。设xkx_kxk是根x∗x^*x∗的某个近似值,用迭代公式校正一次,有xˉk+1=φ(xk)\bar{x}_{k+1}=\varphi(x_k)xˉk+1=φ(xk)。假设φ′(x)\varphi'(x)φ′(x)在考察范围内变化不大,其估计值为LLL,则x∗−xˉk+1≈L(x∗−xk)x^*-\bar{x}_{k+1}\approx L(x^*-x_k)x∗−xˉk+1≈L(x∗−xk)。求解出x∗x^*x∗,有x∗≈11−Lxˉk+1−L1−Lxkx^*\approx\frac{1}{1-L}\bar{x}_{k+1}-\frac L{1-L}x_kx∗≈1−L1xˉk+1−1−LLxk。即有
{xˉk+1=φ(xk),迭代xK+1=11−Lxˉk+1−L1−Lxk,加速\left\{ \begin{array}{lr} \bar{x}_{k+1}=\varphi(x_k), & 迭代 \\ x_{K+1}=\frac{1}{1-L}\bar{x}_{k+1}-\frac L{1-L}x_k, & 加速\\ \end{array} \right.{xˉk+1=φ(xk),xK+1=1−L1xˉk+1−1−LLxk,迭代加速
即xk+1=11−L[φ(xk)−Lxk]x_{k+1}=\frac1{1-L}[\varphi(x_k)-Lx_k]xk+1=1−L1[φ(xk)−Lxk]
然而上述加速迭代法需要处理一次导数,对有些迭代公式并不方便。更一般的,我们有Aitken加速方法
{xˉk+1=φ(xk),迭代x~k+1=φ(xˉk+1),迭代xK+1=x~k+1−(xk+1−xˉk+1)2x~k+1−2xˉk+1+xk,加速\left\{ \begin{array}{lr} \bar{x}_{k+1}=\varphi(x_k), & 迭代 \\ \tilde{x}_{k+1}=\varphi(\bar{x}_{k+1}),& 迭代\\ x_{K+1}=\tilde{x}_{k+1}-\frac{(x_{k+1}-\bar{x}_{k+1})^2}{\tilde{x}_{k+1}-2\bar{x}_{k+1}+x_k}, & 加速\\ \end{array} \right.⎩⎪⎨⎪⎧xˉk+1=φ(xk),x~k+1=φ(xˉk+1),xK+1=x~k+1−x~k+1−2xˉk+1+xk(xk+1−xˉk+1)2,迭代迭代加速
其思想就是用估计值进行二次迭代,然后再做商消去LLL,最后解出x∗x^*x∗,代回即可。Aitken的缺点也是显然的:其要进行两次迭代才能求出一个估计值。
Newton法(切线法)
牛顿法是应用最为广泛的迭代方法。下面导出牛顿公式。考察f(x)=0f(x)=0f(x)=0,设已知近似根xkx_kxk,则显然,我们希望对xk+1=xk+Δxx_{k+1}=x_k+\Delta xxk+1=xk+Δx尽量满足f(xk+Δx)≈0f(x_k+\Delta x)\approx0f(xk+Δx)≈0。将其左端用其线性主部代替,有f(xk)+f′(xk)Δx=0f(x_k)+f'(x_k)\Delta x=0f(xk)+f′(xk)Δx=0,由此,解出Δx=−f(xk)f′(xk)\Delta x=-\frac{f(x_k)}{f'(x_k)}Δx=−f′(xk)f(xk),从而对xk+1=xk+Δxx_{k+1}=x_k+\Delta xxk+1=xk+Δx有
xk+1=xk−f(xk)f′(xk)x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k)}xk+1=xk−f′(xk)f(xk)
这就是著名的Newton迭代公式
求解f(x)=x2−a=0f(x)=x^2-a=0f(x)=x2−a=0时,f′(x)=2xf'(x)=2xf′(x)=2x,其Newton迭代函数为φ(x)=x−f(xk)f′(xk)=12(a+ax)\varphi(x)=x-\frac{f(x_k)}{f'(x_k)}=\frac{1}{2}\left(a+\frac ax\right)φ(x)=x−f′(xk)f(xk)=21(a+xa),这就是古代数学界的开方法。
Newton法的改进
Newton下山法
基本思想:每一步迭代均保证下降条件,即∣f(xk+1)∣<∣f(xk)∣|f(x_{k+1})|<|f(x_k)|∣f(xk+1)∣<∣f(xk)∣,这样能保证全局收敛。
具体做法:加入下山因子λ\lambdaλ,将改进值xk+1x_{k+1}xk+1与前一步的结果xkx_kxk取加权平均,即xk+1=λxˉk+1+(1−λ)xkx_{k+1}=\lambda \bar{x}_{k+1}+(1-\lambda)x_kxk+1=λxˉk+1+(1−λ)xk,也就说,迭代公式变形成xk+1=xk−λf(xk)f′(xk)x_{k+1}=x_k-\lambda\frac{f(x_k)}{f'(x_k)}xk+1=xk−λf′(xk)f(xk),其中λ\lambdaλ的取法为从1开始将λ\lambdaλ进行反复折半,直到满足∣f(xk+1)∣<∣f(xk)∣|f(x_{k+1})|<|f(x_k)|∣f(xk+1)∣<∣f(xk)∣。
弦截法
为了避开导数的计算,我们可以采用取割线来代替切线,从而导出弦截法的迭代公式:xk+1=xk−f(xk)f(xk)−f(x0)(xk−x0)x_{k+1}=x_k-\frac {f(x_k)}{f(x_k)-f(x_0)}(x_k-x_0)xk+1=xk−f(xk)−f(x0)f(xk)(xk−x0)。弦截法虽然避开了导数计算,但其迭代速度只有一阶。
快速弦截法
为提高弦截法的效率,再对弦截法公式进行加工,从而我们导出了快速弦截法公式:xk+1=xk−f(xk)f(xk)−f(xk−1)(xk−xk−1)x_{k+1}=x_k-\frac {f(x_k)}{f(x_k)-f(x_{k-1})}(x_k-x_{k-1})xk+1=xk−f(xk)−f(xk−1)f(xk)(xk−xk−1)。快速弦截法的收敛速度无疑比弦截法快,但是其要提供两个迭代初值,所以又被称为两步法。
改进牛顿法
对于重根情形,即当f(x)=(x−x∗)mg(x)f(x)=(x-x^*)^mg(x)f(x)=(x−x∗)mg(x)且g(x∗)≠0g(x^*)\neq 0g(x∗)=0时,直接采用牛顿法,其φ′(x∗)=1−1m>0\varphi '(x^*)=1-\frac 1m>0φ′(x∗)=1−m1>0,其仅仅只是线性收敛。
一种改进方法是修改迭代公式,消去mmm,此时迭代公式变为φ(x)=x−mf(x)f′(x)\varphi (x)=x-m\frac{f(x)}{f'(x)}φ(x)=x−mf′(x)f(x),此时φ′(x∗)=0\varphi '(x^*)=0φ′(x∗)=0,收敛性变好。但是这种改进方式需要知道具体的重根阶数mmm。
另一种改进方式是利用μ(x)=f(x)f′(x)\mu(x)=\frac{f(x)}{f'(x)}μ(x)=f′(x)f(x)与f(x)=(x−x∗)mg(x)f(x)=(x-x^*)^mg(x)f(x)=(x−x∗)mg(x)同根的性质,对μ(x)\mu(x)μ(x)使用牛顿法,φ(x)=x−μ(x)μ′(x)=x−f(x)f′(x)∣f′(x)∣2−f(x)f′′(x)\varphi(x)=x-\frac{\mu(x)}{\mu'(x)}=x-\frac{f(x)f'(x)}{|f'(x)|^2-f(x)f''(x)}φ(x)=x−μ′(x)μ(x)=x−∣f′(x)∣2−f(x)f′′(x)f(x)f′(x)从而得到迭代公式为xk+1=xk−f(xk)f′(xk)∣f′(xk)∣2−f(xk)f′′(xk)x_{k+1}=x_k-\frac{f(x_k)f'(x_k)}{|f'(x_k)|^2-f(x_k)f''(x_k)}xk+1=xk−∣f′(xk)∣2−f(xk)f′′(xk)f(xk)f′(xk),容易证明,其是二阶收敛的。
数值分析笔记(一):方程求根相关推荐
- 【机器学习】数值分析02——任意方程求根
任意方程求根 全文目录 (博客园)机器学习 (Github)MachineLearning Math 1.简介 方程和函数是代数数学中最为重要的内容之一,从初中直到大学,我们都在研究着方程与函数,甚至 ...
- 使用MATLAB求解方程求根——学习笔记
使用MATLAB求解方程求根--学习笔记 碎碎念:终于参加完了某比赛,连续大约摸了两天的鱼,就在昨天由于自己的操作失误,亲手将电脑给烧了,这就是上天在暗示我是时候加油为接下来的两场比赛和一个考试努力啦 ...
- 关于方程求根的解决方案
对于方程求根主要的思想主要采取迭代的思想,通过条件判断,循环执行直到满足条件以后直接跳出循环输出 下面以x-cos(x)=0:为例 采用do-while 循环,输出Root: #include &q ...
- 计算方法实验:方程求根二分法、不动点迭代法、牛顿法
计算方法实验一,方程求根 分别用Matlab和C写了一下,初学Matlab,如有不足还请指正. 实验内容: 1)在区间[0,1]内用二分法求方程 e x + 10 ∗ x − 2 e^x+10*x-2 ...
- 方程求根的迭代法——牛顿迭代法
用牛顿法解方程xe(x) -1=0 程序流程图如下: //方程求根的迭代法--牛顿迭代法 /*************Analysis********** *1.初值x0,精度e,迭代次数N *2.牛 ...
- matlab解比例导引法方程,Matlab多式运算与方程求根.ppt
Matlab多式运算与方程求根 Matlab多项式运算与方程求根 Matlab多项式运算 多项式四则运算 多项式四则运算(续) 多项式的导数:polyder 多项式求值 多项式求值(续) 多项式求根 ...
- 数值分析方程求根实验matlab,基于matlab的数值分析( 非线性方程求根)上机实验报告1...
数值分析试验报告 非线性方程求根 二分法解方程 1. 题目:用二分法求方程0133 =--x x 的所有根 2. 方法:二分法 3. 程序 function x=erfenfa(a,b) if (a* ...
- 数值分析方程求根实验matlab,数值分析实验之非线性方程求根(MATLAB实现)
一.实验目的 1. 了解一般非线性方程的求根是比较复杂的事情:要讨论(或知道)它有无实根,有多少实根:知道求近似根常用的几种方法,每种方法的特点是什么. 2. 用通过二分法(区间半分法).不动点(也P ...
- 计算方法--方程求根
文章目录 求解方程f(x) = 0的根有三个基本问题 1.根的存在性 2.根的分布 图解法 实验法 3.根的精确化 (1)二分法 (2)Picard迭代法 如何选取 φ ( x ) \varphi(x ...
最新文章
- 谢文睿:西瓜书 + 南瓜书 吃瓜系列 7. 支持向量机
- 使用FirefoxDriver时报错Make sure firefox is installed问题
- 五、JavaScript基础知识,学会操作元素的简单事件(一)
- Facebook产品经理的三年叙事与协作思考
- 通过Nacos让Nginx拥有服务发现能力
- linux运维服务常见故障,linux常见故障处理
- python列表求斐波那契数列_python3 求斐波那契数列(Fibonacci sequence)
- 阿里云CDN、DCDN、SCDN的区别
- thinkpad使用u盘启动
- 弱分类器 强分类器(弱学习器 强学习器)
- 国产游戏表 (来自游侠)
- java毕业生设计二手物品交易系统计算机源码+系统+mysql+调试部署+lw
- CORBA、ACE、TAO之间的关系
- 关键字深度剖析,集齐所有关键字可召唤神龙?【完】
- 保存windows10微软聚焦的锁屏壁纸
- JetBrains .idea project directory (详细利用教程)
- Binary XML file line #2 in com.example.helloworld:layout/activity_main: Binary XML file line #2 in c
- Android 通过图片资源名字获得图片资源设置在ImageView上
- aw2013驱动分析
- 修复ubuntu引导