计算方法--方程求根
文章目录
- 求解方程f(x) = 0的根有三个基本问题
- 1.根的存在性
- 2.根的分布
- 图解法
- 实验法
- 3.根的精确化
- (1)二分法
- (2)Picard迭代法
- 如何选取 φ ( x ) \varphi(x) φ(x)
- 选取迭代初值
- 终止迭代条件
- Aitken加速迭代格式
- 条件:
- 迭代公式
- Aitken加速迭代法
- (3)牛顿迭代法(切线法)
- 迭代终止条件
- 向量式Newton迭代
- Newton下山法
- 下山条件
- 具体做法
- (4)弦截法
- 一般迭代式
- Steffensen方法
- 两种方法的代码实现(做作业不想手算的懒人办法)
- 收敛阶
- 定义
- 判定Picard迭代法的收敛阶
- Newton迭代法的收敛阶
求解方程f(x) = 0的根有三个基本问题
1.根的存在性
方程有没有根,需要通过数学知识分析。
2.根的分布
在确定方程有根后,需要确定根的有根区间(包含所有根的一个区间)。
利用图解法或实验法,在有根区间内进行根的隔离,确定根的隔离区间(只有一个根的子区间)
图解法
- 画出y = f(x)的粗略图形,确定曲线与x轴交点的粗略位置,从而确定根的隔离区间。
实验法
- 求出f(x)按一定步长抽样点的函数值
- 若相邻函数值符号相反,则该区间必有根存在(函数连续的情况)。
相关伪代码实现,在有根区间[a,b]上求解。
float h = (b-a)/n;//h为步长,n为分段数量
float xi;
float fxi = 0;
for(float xj = a; xj < b; xj +=h){float fxj = f(xj);if(fxj==0)xj为根;else if(fxi * fxj < 0){在区间[xi,xj]上有根,代入精确化公式。}xi = xj;fxi =fxj;
}
3.根的精确化
当求出一个方程的隔离区间后,我们设法将根的近似值进一步精确化。
这才是计算方法的内容。
几种根的精确化方法:二分法,迭代法,牛顿迭代法,弦截法。
(1)二分法
- 取隔离区间[a,b]中 x 0 = 1 2 ( a + b ) x_0 = \frac{1}{2}(a+b) x0=21(a+b),计算函数值 f ( x 0 ) f(x_0) f(x0)
- 若 ∣ f ( x 0 ) ∣ < ϵ 1 |f(x_0)| < \epsilon_1 ∣f(x0)∣<ϵ1,则求得实根 x ∗ = x 0 x^* = x_0 x∗=x0, ϵ 1 \epsilon_1 ϵ1为根的允许误差,程序结束。
- 若 f ( a ) ∗ f ( x 0 ) < 0 f(a)*f(x_0)<0 f(a)∗f(x0)<0,说明根在 [ a , x 0 ] [a,x_0] [a,x0]内, b = x 0 b = x_0 b=x0。
- 若 f ( b ) ∗ f ( x 0 ) < 0 f(b)*f(x_0)<0 f(b)∗f(x0)<0,说明根在 [ x 0 , b ] [x_0,b] [x0,b]内, a = x 0 a = x_0 a=x0
- 判断是否达到精度要求 ( b − a ) < ϵ 2 ( b-a )< \epsilon_2 (b−a)<ϵ2,若未达到,重复1~4步骤,
(2)Picard迭代法
为求 f ( x ) = 0 f(x)= 0 f(x)=0,我们需要将它等价转化为 x = φ ( x ) x = \varphi(x) x=φ(x)。
- 若有 f ( x ) = x 3 − x − 1 f(x)= x^3-x-1 f(x)=x3−x−1
- 则可以等价转化为
x = φ 1 ( x ) = x + 1 3 x= \varphi_1(x) = \sqrt[3]{x+1} x=φ1(x)=3x+1
或
x = φ 2 ( x ) = x 3 − 1 x= \varphi_2(x) = x^3 -1 x=φ2(x)=x3−1
如何选取 φ ( x ) \varphi(x) φ(x)
φ ( x ) \varphi(x) φ(x)需要满足三个条件
- φ ( x ) \varphi(x) φ(x)需要在 [ a , b ] [a,b] [a,b]内连续, ( a , b ) (a,b) (a,b)内可导.
- 映内性, φ ( x ) ∈ [ a , b ] , x ∈ [ a , b ] \varphi(x)\in[a,b],x \in [a,b] φ(x)∈[a,b],x∈[a,b]。
- ∣ φ ′ ( x ) ∣ ≤ L < 1 , x ∈ [ a , b ] |\varphi'(x)| \le L <1 ,x\in[a,b] ∣φ′(x)∣≤L<1,x∈[a,b],L越小,收敛速度越快。
若 φ ( x ) \varphi(x) φ(x)满足这三个条件,则可以用一个初值进行迭代。
注:但是要严格的利用如上定理判断迭代公式在整个区间[a,b]内收敛非常困难,所以我们常常判断迭代公式的局部收敛性。
局部收敛性条件:
- φ ( x ) \varphi (x) φ(x)在 精确解 x ∗ x^* x∗ 的某一邻域内连续可微。
- ∣ φ ′ ( x ) ∣ < 1 |\varphi'(x)|<1 ∣φ′(x)∣<1.
选取迭代初值
一般情况下,选取区间[a,b]的中点作为迭代初值。
终止迭代条件
∣ x k − 1 − x k ∣ ≤ ϵ |x_{k-1}-x_k|\le \epsilon ∣xk−1−xk∣≤ϵ
Aitken加速迭代格式
条件:
迭代函数 φ ( x ) \varphi(x) φ(x)的精确解 x ∗ x^* x∗在领域内连续可微,且导数值变化不大,近似值为 l l l
迭代公式
x k + 1 = ( 1 − l ) − 1 [ φ ( x k ) − l x k ] , k = 0 , 1 , ⋯ x_{k+1}=(1-l)^{-1}\left[\varphi\left(x_{k}\right)-l x_{k}\right], \quad k=0,1, \cdots xk+1=(1−l)−1[φ(xk)−lxk],k=0,1,⋯
Aitken加速迭代法
首先对 x k x_k xk用 φ ( x ) \varphi(x) φ(x)迭代两次,得出及如下变量
x ~ k + 1 = φ ( x k ) , x ^ k + 1 = φ ( x ~ k + 1 ) \tilde{x}_{k+1}=\varphi\left(x_{k}\right), \quad \hat{x}_{k+1}=\varphi\left(\tilde{x}_{k+1}\right) x~k+1=φ(xk),x^k+1=φ(x~k+1)
然后使用如上变量,迭代如下公式:
x k + 1 = x ^ k + 1 − ( x ^ k + 1 − x ~ k + 1 ) 2 x ^ k + 1 − 2 x ~ k + 1 + x k x_{k+1}=\hat{x}_{k+1}-\frac{\left(\hat{x}_{k+1}-\tilde{x}_{k+1}\right)^{2}}{\hat{x}_{k+1}-2 \tilde{x}_{k+1}+x_{k}} xk+1=x^k+1−x^k+1−2x~k+1+xk(x^k+1−x~k+1)2
(3)牛顿迭代法(切线法)
要求:需要选取一个根附件的初值 x 0 x_0 x0。
x k = x k − 1 − f ( x k − 1 ) f ′ ( x k − 1 ) , k = 1 , 2 , ⋯ x_{k}=x_{k-1}-\frac{f\left(x_{k-1}\right)}{f^{\prime}\left(x_{k-1}\right)}, \quad k=1,2, \cdots xk=xk−1−f′(xk−1)f(xk−1),k=1,2,⋯
迭代终止条件
∣ x k − x k − 1 ∣ < ε |x_k-x_{k-1}|<\varepsilon ∣xk−xk−1∣<ε
向量式Newton迭代
X k + 1 = X k − [ F ′ ( X k ) ] − 1 F ( X k ) , k = 0 , 1 , 2 , ⋯ \boldsymbol{X}_{k+1}=\boldsymbol{X}_{k}-\left[F^{\prime}\left(\boldsymbol{X}_{k}\right)\right]^{-1} F\left(\boldsymbol{X}_{k}\right), \quad k=0,1,2, \cdots Xk+1=Xk−[F′(Xk)]−1F(Xk),k=0,1,2,⋯
F ′ ( X ) = ( ∂ f 1 ( X ) ∂ x 1 ∂ f 1 ( X ) ∂ x 2 ⋯ ∂ f 1 ( X ) ∂ x n ∂ f 2 ( X ) ∂ x 1 ∂ f 2 ( X ) ∂ x 2 ⋯ ∂ f 2 ( X ) ∂ x n ⋮ ⋮ ⋮ ∂ f n ( X ) ∂ x 1 ∂ f n ( X ) ∂ x 2 ⋯ ∂ f n ( X ) ∂ x n ) F^{\prime}(\boldsymbol{X})=\left(\begin{array}{cccc} \frac{\partial f_{1}(X)}{\partial x_{1}} & \frac{\partial f_{1}(X)}{\partial x_{2}} & \cdots & \frac{\partial f_{1}(X)}{\partial x_{n}} \\ \frac{\partial f_{2}(X)}{\partial x_{1}} & \frac{\partial f_{2}(X)}{\partial x_{2}} & \cdots & \frac{\partial f_{2}(X)}{\partial x_{n}} \\ \vdots & \vdots & & \vdots \\ \frac{\partial f_{n}(X)}{\partial x_{1}} & \frac{\partial f_{n}(X)}{\partial x_{2}} & \cdots & \frac{\partial f_{n}(X)}{\partial x_{n}} \end{array}\right) F′(X)=⎝⎜⎜⎜⎜⎛∂x1∂f1(X)∂x1∂f2(X)⋮∂x1∂fn(X)∂x2∂f1(X)∂x2∂f2(X)⋮∂x2∂fn(X)⋯⋯⋯∂xn∂f1(X)∂xn∂f2(X)⋮∂xn∂fn(X)⎠⎟⎟⎟⎟⎞
为了避免求矩阵的逆,我们常将公式分为如下两步:
- Step 1: 求解关于 Δ X k \Delta \boldsymbol{X}_{k} ΔXk 的线性方程组 F ′ ( X k ) Δ X k = − F ( X k ) F^{\prime}\left(\boldsymbol{X}_{k}\right) \Delta \boldsymbol{X}_{k}= -F\left(\boldsymbol{X}_{k}\right) F′(Xk)ΔXk=−F(Xk) ;
- Step 2: 计算当前数值解 X k + 1 = X k + Δ X k . \boldsymbol{X}_{k+1}=\boldsymbol{X}_{k}+\Delta \boldsymbol{X}_{k} \text {. } Xk+1=Xk+ΔXk.
这里需要用到后面的知识:解线性方程组的解
也可采用如下简化的 Newton 迭代公式,用 [ F ′ ( X 0 ) ] − 1 \left[F^{\prime}\left(\boldsymbol{X}_{0}\right)\right]^{-1} [F′(X0)]−1近似替代 [ F ′ ( X k ) ] − 1 \left[F^{\prime}\left(\boldsymbol{X}_{k}\right)\right]^{-1} [F′(Xk)]−1。
X k + 1 = X k − [ F ′ ( X 0 ) ] − 1 F ( X k ) , k = 0 , 1 , 2 , ⋯ . \boldsymbol{X}_{k+1}=\boldsymbol{X}_{k}-\left[F^{\prime}\left(\boldsymbol{X}_{0}\right)\right]^{-1} F\left(\boldsymbol{X}_{k}\right), \quad k=0,1,2, \cdots . Xk+1=Xk−[F′(X0)]−1F(Xk),k=0,1,2,⋯.
Newton下山法
下山条件
∣ F ( X k + 1 ) ∣ < ∣ F ( x k ) ∣ , 保 证 全 局 收 敛 ( 1.1 式 ) |F(X_{k+1})|<|F(x_k)|,\quad 保证全局收敛\quad(1.1式) ∣F(Xk+1)∣<∣F(xk)∣,保证全局收敛(1.1式)
具体做法
X k + 1 = X k − λ [ F ′ ( X k ) ] − 1 F ( X k ) , k = 0 , 1 , 2 , ⋯ \boldsymbol{X}_{k+1}=\boldsymbol{X}_{k}-\lambda\left[F^{\prime}\left(\boldsymbol{X}_{k}\right)\right]^{-1} F\left(\boldsymbol{X}_{k}\right), \quad k=0,1,2, \cdots Xk+1=Xk−λ[F′(Xk)]−1F(Xk),k=0,1,2,⋯
λ 可 依 次 取 为 1 , 1 2 , 1 2 2 , ⋯ , 1 2 k , ⋯ , \lambda 可依次取为 1, \frac{1}{2}, \frac{1}{2^{2}}, \cdots, \frac{1}{2^{k}}, \cdots \text {, } λ可依次取为1,21,221,⋯,2k1,⋯,
λ \lambda λ依次减小, 直到满足 ( 1.1 ) (1.1) (1.1)式,即可进行迭代。
(4)弦截法
一般迭代式
x k + 1 = x k − x k − x k − 1 f ( x k ) − f ( x k − 1 ) f ( x k ) , k = 1 , 2 , ⋯ x_{k+1}=x_{k}-\frac{x_{k}-x_{k-1}}{f\left(x_{k}\right)-f\left(x_{k-1}\right)} f\left(x_{k}\right), \quad k=1,2, \cdots xk+1=xk−f(xk)−f(xk−1)xk−xk−1f(xk),k=1,2,⋯
Steffensen方法
若迭代法产生的迭代序列充分接近于 x ∗ x^* x∗,则 ( x k − x k − 1 ) ≈ f ( x k ) ≈ 0 (x_k-x_{k-1})\approx f(x_k)\approx 0 (xk−xk−1)≈f(xk)≈0,有
x k + 1 = x k − f 2 ( x k ) f ( x k ) − f ( x k − f ( x k ) ) , k = 1 , 2 , ⋯ x_{k+1}=x_{k}-\frac{f^{2}\left(x_{k}\right)}{f\left(x_{k}\right)-f\left(x_{k}-f\left(x_{k}\right)\right)}, \quad k=1,2, \cdots xk+1=xk−f(xk)−f(xk−f(xk))f2(xk),k=1,2,⋯
两种方法的代码实现(做作业不想手算的懒人办法)
#include <iostream>#define _USE_MATH_DEFINES
#include <math.h>double f(double x) {return 2 * cos(x) - sin(x) - 1;
}double Newton_iteration(double x1, double x0) {return x1 - (x1 - x0) / (f(x1) - f(x0)) * f(x1);
}double Steffensen_iteration(double x1) {return x1 - f(x1) * f(x1) / (f(x1) - f(x1 - f(x1)));
}int main() {int n = 20;double x0 = 0;double x1 = M_PI/4;for (int i = 0; i < n; i++) {double x2 = Newton_iteration(x1,x0);//double x2 = Steffensen_iteration(x1);x0 = x1;x1 = x2;printf_s("%.18lf\n", x2);}
}
收敛阶
定义
∣ x ∗ − x k + 1 ∣ ⩽ c ∣ x ∗ − x k ∣ p , k = 0 , 1 , ⋯ \left|x^{*}-x_{k+1}\right| \leqslant c\left|x^{*}-x_{k}\right|^{p}, \quad k=0,1, \cdots ∣x∗−xk+1∣⩽c∣x∗−xk∣p,k=0,1,⋯
判定Picard迭代法的收敛阶
若有
φ ( i ) ( x ∗ ) = 0 ( i = 1 , 2 , ⋯ , p − 1 ) , φ ( p ) ( x ∗ ) = c ≠ 0 \varphi^{(i)}\left(x^{*}\right)=0(i=1,2, \cdots, p-1), \quad \varphi^{(p)}\left(x^{*}\right) =c\neq 0 φ(i)(x∗)=0(i=1,2,⋯,p−1),φ(p)(x∗)=c=0
则Picard迭代法为p阶收敛的。
Newton迭代法的收敛阶
牛顿迭代法是单根平方收敛的,重根线性收敛的。
简化牛顿迭代法 ( X k + 1 = X k − [ F ′ ( X 0 ) ] − 1 F ( X k ) ) (\boldsymbol{X}_{k+1}=\boldsymbol{X}_{k}-\left[F^{\prime}\left(\boldsymbol{X}_{0}\right)\right]^{-1} F\left(\boldsymbol{X}_{k}\right)) (Xk+1=Xk−[F′(X0)]−1F(Xk))是线性收敛的
计算方法--方程求根相关推荐
- 计算方法实验:方程求根二分法、不动点迭代法、牛顿法
计算方法实验一,方程求根 分别用Matlab和C写了一下,初学Matlab,如有不足还请指正. 实验内容: 1)在区间[0,1]内用二分法求方程 e x + 10 ∗ x − 2 e^x+10*x-2 ...
- 【机器学习】数值分析02——任意方程求根
任意方程求根 全文目录 (博客园)机器学习 (Github)MachineLearning Math 1.简介 方程和函数是代数数学中最为重要的内容之一,从初中直到大学,我们都在研究着方程与函数,甚至 ...
- 关于方程求根的解决方案
对于方程求根主要的思想主要采取迭代的思想,通过条件判断,循环执行直到满足条件以后直接跳出循环输出 下面以x-cos(x)=0:为例 采用do-while 循环,输出Root: #include &q ...
- 方程求根的迭代法——牛顿迭代法
用牛顿法解方程xe(x) -1=0 程序流程图如下: //方程求根的迭代法--牛顿迭代法 /*************Analysis********** *1.初值x0,精度e,迭代次数N *2.牛 ...
- 使用MATLAB求解方程求根——学习笔记
使用MATLAB求解方程求根--学习笔记 碎碎念:终于参加完了某比赛,连续大约摸了两天的鱼,就在昨天由于自己的操作失误,亲手将电脑给烧了,这就是上天在暗示我是时候加油为接下来的两场比赛和一个考试努力啦 ...
- 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 ...
- 数值分析笔记(一):方程求根
文章目录 根的搜索 迭代法 收敛性的判断 收敛速度 加速迭代 Newton法(切线法) Newton法的改进 Newton下山法 弦截法 快速弦截法 改进牛顿法 根的搜索 逐步搜索 在给定区间[a,b ...
最新文章
- 用C++的random_shuffle()函数打乱int数组顺序
- 使用镀锌铁皮制作负阻器件
- 两队选手每队5人进行一对一的比赛(算法)
- pycharm安装过程及文件
- Leetcode 173. 二叉搜索树迭代器 解题思路及C++实现
- Windows Sockets 2.0 新特性
- php中的自定义函数与c语言有什么区别,php与c语言的不同点是什么?
- python excel数据分析实战_一次完整的数据分析实战!仅用4步,效率吊打Excel和Python...
- 牛客题霸 [旋转字符串]C++题解/答案
- python的knn算法list_[机器学习]kNN算法python实现(实例:数字识别)
- 95-110-026-源码-Env-RemoteStreamEnvironment
- SVN—如何安装SVN服务器端软件
- 思科CCNP认证和华为 HCIP认证路由交换技术的分类最全总结
- 我的世界做计算机运算原理,我的世界加法计算器原理解说及BCD全加器教程
- OpenStack修改Guest用户密码——利用Qemu guest agent实现
- 如何获取阿里云服务器镜像
- 微信公众号开发教程(六)获取微信用户信息-网页授权
- 测试行业3年经验,从大厂裸辞后,面试阿里、字节全都一面挂,被面试官说我的水平还不如应届生
- jsp简易的图书管理系统
- ibmx3400M3服务器装系统教程,免费安装系统!IBM x3400 M3不足1万2