在使用计算机求根的时候,由于计算机的数字离散性,通常需要通过试一试的方法确定一个初始值,然后根据这个初始值重复迭代过程,使其最后的函数值趋近于0。但是更多的时候,我们需要让这个过程在计算机中自动进行。目前使用普遍的初始值的猜想方法主要有两个:

1、交叉法(Bracketing Methods):基于两个猜想的初始值坐落在两边,假想根在这两个初始值的中间;

2、开型法(Open Methods):可以涉及到一个或多个初始值的猜想,但是没必要将初始值放在实际的根的两边;

比较两种方法,Bracketing Methods几乎在所有情况下都能使用,但是收敛速度较慢,需要更多的迭代次数;而Open Methods在有些情况下不能使用,但是收敛速度较快。

下面首先介绍几种Bracketing Methods:

1、增量搜索(Intcremental Search)

假如两个上下初始值有式子 f(xl)f(xu) < 0,xl表示较小的初始值猜想,xu表示较大的初始值猜想。则至少有一个实根在xlxu之间。增量搜索有一个搜索精度问题:通常情况下,值得确定出现在f(xl)f(xu)的值改变方向的时候,但是如果每次搜索的步长太小,就会导致迭代次数过多,收敛时间很长;如果搜索步长较大就可能导致空间上最接近,最精确的那个跟被丢掉。如下图:
                                              

上图中最右边的根有可能因为搜索步长太大而被丢失。

下面是Matlab的Incremental Search函数:

function xb = incsearch(func,xmin,xmax,ns)
% incsearch: incremental search root locator
% xb = incsearch(func,xmin,xmax,ns):
% finds brackets of x that contain sign changes
% of a function on an interval
% input:
% func = name of function
% xmin, xmax = endpoints of interval
% ns = number of subintervals (default = 50)
% output:
% xb(k,1) is the lower bound of the kth sign change
% xb(k,2) is the upper bound of the kth sign change
% If no brackets found, xb = [].if nargin < 3error('At least 3 arguments required');
endif nargin < 4ns = 50;
endx = linspace(xmin,xmax,ns);
f = func(x);
nb = 0;
xb = [];for k = 1 : length(x) - 1if sign(f(k)) ~= sign(f(k + 1))nb = nb + 1;xb(nb,1) = x(k);xb(nb,2) = x(k + 1);end
endif isempty(xb)disp('No brackets found')disp('Check interval or increase ns')
elsedisp('Number of brackets: ')disp(nb)
end

举个例子:

f(x) = sin(10x) + cos(3x)

输入:
incsearch(@(x) sin(10*x)+cos(3*x),3,6) 得到如下答案:
Number of brackets: 
     5
ans =
    3.2449    3.3061
    3.3061    3.3673
    3.7347    3.7959
    4.6531    4.7143
    5.6327    5.6939
这是根的位置图:
                         

2、对分法(Bisection Method)

对分法如下图所示:首先猜想出两个初始值,找到两个初始值的中间位置,两个初始值分别与中间位置坐标的函数值乘积,如果函数值乘积小于0,则选择函数值乘积小于0的那一边进行迭代,以下的步奏以此类推。

function [root, fx, ea, iter] = bisect(func,xl,xu,es,maxit,varargin)
% bisect: root location zeroes
% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...):
% uses bisection method to find the root of func
% input:
% func = name of function
% xl, xu = lower and upper guesses
% es = desired relative error (default = 0.0001%)
% maxit = maximum allowable iterations (default = 50)
% p1,p2,... = additional parameters used by func
% output:
% root = real root
% fx = function value at root
% ea = approximate relative error (%)
% iter = number of iterationsif nargin < 3error('At least 3 input arguments required');
endtest = func(xl,varargin{:}) * func(xu,varargin{:});if test > 0error('No sign change');
endif nargin < 4 | isempty(es)es = 0.0001;
endif nargin < 5 | isempty(maxit) maxit = 50;
enditer = 0;
xr = xl;
ea = 100;while(1)xrold = xr;xr = (xl + xu)/2;iter = iter + 1;if xr ~= 0ea = abs((xr - xrold)/xr) * 100;endtest = func(xl,varargin{:}) * func(xr,varargin{:});if test < 0xu = xr;elseif test > 0xl = xr;elseea = 0;endif ea <= es | iter >= maxitbreak;end
endroot = xr;
fx = func(xr,varargin{:});

这里同时定义了相对误差:

x_new是当前迭代值,x_old是前一次的迭代值。迭代的时候需要满足一定的的误差条件,只要满足一定的误差范围,可以中断迭代,得到最终的值。

3、试位法(False Position Method),也可以叫线性插值法(Linear Interpolation Method)

通过函数值上面的两个点画出直线,与x轴的交点找到xr。根据xr得到一个函数值,并且用xr替换与xlxu中函数值符号相同的端值。以此进行迭代。xr的计算方程如下:

数值分析学习(一)之交叉法(Bracketing Methods)求根相关推荐

  1. 通用求根算法zeroin_Modern Robotics运动学数值解法及SVD算法(C matlab)

    前言 原著之前CSDN已经注销,新CSDN Galaxy_Robot的博客_CSDN博客-机器人,C语言,我是谁?领域博主​blog.csdn.net 这半个月的业余时间研究了机器人逆运动学的解析解法 ...

  2. 北航生医数值分析学习心得6

    7.数值积分 这一章总体难度还行,大家理清数值求积 的逻辑就好,我们本质上是结合上一章插值的知识,基本方法是逼近法:设法构造某个简单函数近似,然后对求积得到 的近似值.(当然如果想学习的更深入可以看看 ...

  3. MATLAB数值分析学习笔记:线性代数方程组的求解和高斯消元法

    工程和科学计算的许多基本方程都是建立在守恒定律的基础之上的,比如质量守恒等,在数学上,可以建立起形如 [A]{x}={b} 的平衡方程.其中{x}表示各个分量在平衡时的取值,它们表示系统的状态或响应: ...

  4. 基础数学(六)——非线性方程求根的数值解法

    文章目录 期末考核方式 求解的一般步骤 二分法求根 二分法计算样例 二分法的优缺点 不动点迭代法 全局收敛准则 收敛性证明样例 局部收敛性 收敛阶数的定义 迭代法具体例题(考试必考) 牛顿迭代法 例题 ...

  5. Matlab-方程式求根

    09方程式求根 1.公式求解--符号变量 syms 变量名 / x= sym('x'); 创建一个符号变量 y = x^2 - 2*x 由符号变量定义的函数 ,是符号函数 solve(方程式,自变量) ...

  6. MATLAB 方程式求根

    文章目录 前言 一.Problem Statement 二.Symbolic Root Finding Approach 符号求根法 三.Symbolic Root Finding: solve() ...

  7. 2021-01-07 matlab数值分析 非线性方程求根 牛顿法

    matlab数值分析 非线性方程求根 牛顿法 %牛顿法求非线性方程的根: % 输入:fun--非线性函数:dfun--非线性函数导数:x0--初始值:tol--精度: % 输出:x--非线性方程数值根 ...

  8. C++False position求根的实现算法(附完整源码)

    C++False position求根的实现算法 C++False position求根的实现算法完整源码(定义,实现,main函数测试) C++False position求根的实现算法完整源码(定 ...

  9. 数值计算大作业:非线性方程求根(二分法、牛顿法、弦截法在Matlab实现)

    作为研究生的入门课,数值计算的大作业算是所有研究生开学的重要编程作业. 我把二分法.牛顿法.弦截法求解非线性方程求根的数值计算作业在MATLAB中编程实现.具体的程序详细标注后放在文章附录了,算法数学 ...

最新文章

  1. NSThread 多线程相关
  2. 情人节,你刚表白,而我已经开始选哪里拍婚纱照了~
  3. python turtle画熊-Python使用turtle库绘制小猪佩奇(实例代码)
  4. RUNNING JUPYTER NOTEBOOKS ON A REMOTE SERVER VIA SSH
  5. 内存映射获取行数_使用内存映射文件获取巨大的矩阵
  6. 微信小程序装修解决方案ppt_装修公司微信小程序都有哪些功能?
  7. mysql unsigned 溢出_mysql unsigned 用法及相减出现补数溢出解决方法 | 学步园
  8. 列举5个python内置函数和使用方法_Python基础-----函数、内置函数、递归等练习
  9. 请谨慎设置WinForm控件DataGridView列的AutoSizeMode属性
  10. VXLAN配置实例(五)——云计算数据中心访问公司外部站点典型配置实例(超级超级难的网络配置!!!)
  11. 最新开源:BundleTrack - 无需任何CAD模型的6D物体姿态跟踪算法(谷歌X实习生)...
  12. oracle物理结构视频教学,详解Oracle物理结构
  13. 【数据可视化】AntV L7实现地图可视化,DrillDownLayer钻取异步获取数据,悬浮预警框
  14. 史上最强的MSN聊天记录!
  15. html5下拉菜单清除样式,如何取消下拉菜单格式
  16. 计算机主板清理,终于理解如何清洗电脑主板
  17. 蚩尤战团--管理分布
  18. 文华学院计算机专业考研,英语复试第1,初试375分,她从文华学院跨专业考研华中科技大学...
  19. Linux 清空文件内容
  20. 尊敬的用户您好: 您访问的网站被机房安全管理系统拦截,可能是以下原因造成: 1.您

热门文章

  1. 例题5-10 UVA 207 PGA Tour Prize Money PGA巡回赛的奖金
  2. 一节课精通Emmet编写开发工具-姜威-专题视频课程
  3. postman程序如何加载_如何使用Postman和AWS轻松加载测试无服务器应用程序
  4. 学习笔记 02:关于在某宝上面购买的stm32f103c8t6最小系统开发板如何使用USBtoTTL模块烧录程序的记录
  5. 北理工冬令营遗留之优先队列
  6. 记录自己遇到的问题1
  7. MybatisPlus多表联查分页多条件查
  8. SLAM学习笔记《Past, Present, and Future of Simultaneous Localization and Mapping: Toward the Robust-Per》
  9. mysql的master slave_Mysql 数据库的同步(master slave) 详解
  10. 前端渲染和后端渲染,要说的都在这里?