数值分析学习(一)之交叉法(Bracketing Methods)求根
在使用计算机求根的时候,由于计算机的数字离散性,通常需要通过试一试的方法确定一个初始值,然后根据这个初始值重复迭代过程,使其最后的函数值趋近于0。但是更多的时候,我们需要让这个过程在计算机中自动进行。目前使用普遍的初始值的猜想方法主要有两个:
1、交叉法(Bracketing Methods):基于两个猜想的初始值坐落在两边,假想根在这两个初始值的中间;
2、开型法(Open Methods):可以涉及到一个或多个初始值的猜想,但是没必要将初始值放在实际的根的两边;
比较两种方法,Bracketing Methods几乎在所有情况下都能使用,但是收敛速度较慢,需要更多的迭代次数;而Open Methods在有些情况下不能使用,但是收敛速度较快。
下面首先介绍几种Bracketing Methods:
1、增量搜索(Intcremental Search)
假如两个上下初始值有式子 f(xl)f(xu) < 0,xl表示较小的初始值猜想,xu表示较大的初始值猜想。则至少有一个实根在xl和xu之间。增量搜索有一个搜索精度问题:通常情况下,值得确定出现在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)
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替换与xl和xu中函数值符号相同的端值。以此进行迭代。xr的计算方程如下:
数值分析学习(一)之交叉法(Bracketing Methods)求根相关推荐
- 通用求根算法zeroin_Modern Robotics运动学数值解法及SVD算法(C matlab)
前言 原著之前CSDN已经注销,新CSDN Galaxy_Robot的博客_CSDN博客-机器人,C语言,我是谁?领域博主blog.csdn.net 这半个月的业余时间研究了机器人逆运动学的解析解法 ...
- 北航生医数值分析学习心得6
7.数值积分 这一章总体难度还行,大家理清数值求积 的逻辑就好,我们本质上是结合上一章插值的知识,基本方法是逼近法:设法构造某个简单函数近似,然后对求积得到 的近似值.(当然如果想学习的更深入可以看看 ...
- MATLAB数值分析学习笔记:线性代数方程组的求解和高斯消元法
工程和科学计算的许多基本方程都是建立在守恒定律的基础之上的,比如质量守恒等,在数学上,可以建立起形如 [A]{x}={b} 的平衡方程.其中{x}表示各个分量在平衡时的取值,它们表示系统的状态或响应: ...
- 基础数学(六)——非线性方程求根的数值解法
文章目录 期末考核方式 求解的一般步骤 二分法求根 二分法计算样例 二分法的优缺点 不动点迭代法 全局收敛准则 收敛性证明样例 局部收敛性 收敛阶数的定义 迭代法具体例题(考试必考) 牛顿迭代法 例题 ...
- Matlab-方程式求根
09方程式求根 1.公式求解--符号变量 syms 变量名 / x= sym('x'); 创建一个符号变量 y = x^2 - 2*x 由符号变量定义的函数 ,是符号函数 solve(方程式,自变量) ...
- MATLAB 方程式求根
文章目录 前言 一.Problem Statement 二.Symbolic Root Finding Approach 符号求根法 三.Symbolic Root Finding: solve() ...
- 2021-01-07 matlab数值分析 非线性方程求根 牛顿法
matlab数值分析 非线性方程求根 牛顿法 %牛顿法求非线性方程的根: % 输入:fun--非线性函数:dfun--非线性函数导数:x0--初始值:tol--精度: % 输出:x--非线性方程数值根 ...
- C++False position求根的实现算法(附完整源码)
C++False position求根的实现算法 C++False position求根的实现算法完整源码(定义,实现,main函数测试) C++False position求根的实现算法完整源码(定 ...
- 数值计算大作业:非线性方程求根(二分法、牛顿法、弦截法在Matlab实现)
作为研究生的入门课,数值计算的大作业算是所有研究生开学的重要编程作业. 我把二分法.牛顿法.弦截法求解非线性方程求根的数值计算作业在MATLAB中编程实现.具体的程序详细标注后放在文章附录了,算法数学 ...
最新文章
- NSThread 多线程相关
- 情人节,你刚表白,而我已经开始选哪里拍婚纱照了~
- python turtle画熊-Python使用turtle库绘制小猪佩奇(实例代码)
- RUNNING JUPYTER NOTEBOOKS ON A REMOTE SERVER VIA SSH
- 内存映射获取行数_使用内存映射文件获取巨大的矩阵
- 微信小程序装修解决方案ppt_装修公司微信小程序都有哪些功能?
- mysql unsigned 溢出_mysql unsigned 用法及相减出现补数溢出解决方法 | 学步园
- 列举5个python内置函数和使用方法_Python基础-----函数、内置函数、递归等练习
- 请谨慎设置WinForm控件DataGridView列的AutoSizeMode属性
- VXLAN配置实例(五)——云计算数据中心访问公司外部站点典型配置实例(超级超级难的网络配置!!!)
- 最新开源:BundleTrack - 无需任何CAD模型的6D物体姿态跟踪算法(谷歌X实习生)...
- oracle物理结构视频教学,详解Oracle物理结构
- 【数据可视化】AntV L7实现地图可视化,DrillDownLayer钻取异步获取数据,悬浮预警框
- 史上最强的MSN聊天记录!
- html5下拉菜单清除样式,如何取消下拉菜单格式
- 计算机主板清理,终于理解如何清洗电脑主板
- 蚩尤战团--管理分布
- 文华学院计算机专业考研,英语复试第1,初试375分,她从文华学院跨专业考研华中科技大学...
- Linux 清空文件内容
- 尊敬的用户您好: 您访问的网站被机房安全管理系统拦截,可能是以下原因造成: 1.您
热门文章
- 例题5-10 UVA 207 PGA Tour Prize Money PGA巡回赛的奖金
- 一节课精通Emmet编写开发工具-姜威-专题视频课程
- postman程序如何加载_如何使用Postman和AWS轻松加载测试无服务器应用程序
- 学习笔记 02:关于在某宝上面购买的stm32f103c8t6最小系统开发板如何使用USBtoTTL模块烧录程序的记录
- 北理工冬令营遗留之优先队列
- 记录自己遇到的问题1
- MybatisPlus多表联查分页多条件查
- SLAM学习笔记《Past, Present, and Future of Simultaneous Localization and Mapping: Toward the Robust-Per》
- mysql的master slave_Mysql 数据库的同步(master slave) 详解
- 前端渲染和后端渲染,要说的都在这里?