谈到单根区间上方程求根的近似算法,我们第一印象就是高中的时候接触的二分法,正如其名称,二分法就是通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值。
大概步骤如下:
假定f(x)在区间(x,y)上连续
先找到a、b属于区间(x,y),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],
现在假设f(a)<0,f(b)>0,a<b
①如果f[(a+b)/2]=0,该点就是零点,
②如果f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点,(a+b)/2>a,从①开始继续使用中点函数值判断。
③如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2<b,从①开始继续使用中点函数值判断。
此外还有另外一种方法,叫牛顿迭代法,也称牛顿切线法,它也是一种近似算法,内容如下:
设r是f(x)=0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y=f(x)的切线L,L的方程为y=f(x0) f'(x0)(x-x0),求出L与x轴交点的横坐标 x1=x0-f(x0)/f'(x0),称x1为r的一次近似值,如果|f(x1)-0|小于指定的精度,那么继续过点(x1,f(x1))做曲线y=f(x)的切线,并求该切线与x轴的横坐标 x2=x1-f(x1)/f'(x1)称x2为r的二次近似值,重复以上过程。得r的近似值序列{Xn},其中Xn 1=Xn-f(Xn)/f'(Xn),称为r的n 1次近似值。上式称为牛顿迭代公式。
如图:
现用matlab编写两种方法,比较它们的收敛速度。
1.先给出需要求根函数:
function f=cal(x) f=exp(-0.005*x)*cos(sqrt(2000-0.01*x*x)*0.05)-0.01; end2.二分法函数:
function [xvalue,gap,fx,count]=bisect(a,b,nmax,eps,fun) % xvalue--自变量迭代值 gap--区间长度 fx--函数值 count--计数 % nma--所允许执行的最大次数,防止死循环 eps--允许的误差 fun--调用的函数名 err=eps+1; count=0;%初始化计数值为0 xvalue=[];%xvalue向量存储变量x的值 gap=[];%gap向量存储误差值 fx=[];%fx向量存储函数值 while(err>eps&&count<nmax) %当误差err大于所给的误差长度或者计数小于允许运行次数时,执行算法 count=count+1;%计数加1 c=(a+b)/2;%计算中间值 x=c; xvalue=[xvalue;x];%将自变量迭代值存入xvalue矩阵 fc=feval(fun,x);%将自变量代入cal函数得到的函数值赋给fc fx=[fx;fc];%将fc函数值存入fx矩阵 x=a; %判断根在哪个区域 if(fc*feval(fun,x)<0) b=c; else a=c; end err=abs(b-a);%误差长度 gap=[gap;err]; end disp(' 次数 自变量 区间长 函数值 ') %输出相应数据 for i=1:count fprintf('%2d %10.6f %10.6f %10.6f \n ',i,xvalue(i),gap(i),fx(i)) end3.牛顿迭代法函数:
function [xvalue gap fx,count]=Newton(x0,nmax,eps,fname) %初始化xvalue,gap,fx向量 xvalue=[]; gap=[]; fx=[]; count=0;%初始化计数为0 x1=x0+1; m=eps+1; while(m>eps&&count<nmax) count=count+1;%计数 f=feval(fname,x0);%得到f(x0)函数值 xvalue=[xvalue;x0]; fx=[fx;f]; x1=x0-f/df(x0); gap=[gap;x1-x0]; m=abs(x1-x0); x0=x1;%x1传值给x0,准备进行下一次迭代 end disp('次数 自变量 区间长 函数值 ') %输出数据 for i=1:count fprintf('%2d %10.6f %10.6f %10.6f \n',i,xvalue(i),gap(i),fx(i)) end4.牛顿迭代法中需要用的求导函数:
function h=df(x) %求函数的导函数 syms R %符号化R y=cal(R);%调用cal函数 dy=diff(y);%求cal函数的导函数 h=subs(dy,R,x);%获得cal函数的导函数取x的值 end5.脚本:
%分别调用二分法和牛顿迭代法 disp('二分法运行如下:') bisect(0,400,50,0.000001,@cal); disp(' ') disp('牛顿迭代法运行如下:') Newton(200,50,0.000001,@cal);
运行结果如图:
这样我们就大概完成了,可以发现:牛顿迭代法的收敛速度明显比二分法要快得多,以后遇到求根时可以选择用牛顿迭代法,提高效率!!
相关推荐
在给定的标题和描述中,涉及了三种经典的方法:二分法、牛顿法以及迭代法。下面将详细介绍这三种方法及其在MATLAB中的实现。 首先,**二分法(Bisection Method)** 是一种基于连续函数性质的查找算法,特别适用于...
本次实验是基于MATLAB软件进行的,主要涉及两种数值解法——二分法和牛顿迭代法,用于求解连续函数的零点。这两种方法都是寻找方程根的重要算法,在科学计算中广泛应用。 **二分法**: 二分法是一种基于连续函数...
标题中的“shiyan.rar”可能是一个压缩文件,包含有与数值计算相关的MATLAB代码,用于演示和实践二分法、二分法迭代法以及牛顿迭代法。这些方法是求解方程根的重要算法,特别是在计算机科学和工程计算中。 二分法,...
实验报告——MATLAB中的二分法与牛顿迭代法 实验目标: 本次实验的主要目标是理解和掌握两种常见的数值解法——二分法和牛顿-拉弗森法,用于求解连续函数的零点问题。这两种方法在解决非线性方程求解问题时具有重要...
本篇文章将深入探讨两个在MATLAB中常用的数值方法——二分法和迭代法,并通过实际的MATLAB代码来解释它们的工作原理和实现方式。 **二分法**是一种求解实数方程根的经典算法,尤其适用于连续函数。其基本思想是:...
本文主要探讨了两种常见的数值计算方法——二分法和牛顿迭代法在求解方程中的应用,特别是在求解12-3x + 2cos x = 0这个特定方程时的效率对比。这两种方法都是寻找方程零点的有效手段。 首先,二分法是一种基于区间...
实验目的包括使用MATLAB编写雅各比迭代法和高斯赛德尔迭代法求解线性方程组,使用MATLAB编写二分法和牛顿迭代法求解非线性方程的根。 一、实验步骤 1. 使用MATLAB编写雅各比迭代法和高斯赛德尔迭代法求解线性方程...
本文主要探讨了两种求解方程根的方法——二分法和牛顿迭代法,并通过MATLAB编程实践进行了对比分析。这两种方法在解决特定类型的方程求解问题上各有优劣,具体体现在求解速度和计算复杂度上。 首先,二分法是一种...
牛顿迭代法是一种常用的数值计算方法,用于解决非线性方程。该方法的基本思想是取初值,然后利用迭代公式进行求解,重复此过程直至求出方程的近似根。 四、程序 1. 二分法 我们使用Matlab语言实现了二分法的算法...
牛顿迭代法,源于艾萨克·牛顿的科学贡献,是一种在数学和工程领域广泛使用的数值分析方法,用于寻找函数零点。该方法利用函数的切线来逼近零点,通过迭代逐步接近真实解。在给定的描述中,我们看到关键词"牛顿切线...
用二分法、牛顿迭代法、牛顿割线法、史蒂芬森迭代法实现解方程,编程理论依据,word格式。MATLAB编程实现可参考笔者博文 https://blog.csdn.net/jiqiren_dasheng/article/details/103758891
在实际应用中,特别是与计算机科学和数学相关的领域,如MATLAB编程,牛顿迭代法有着广泛的应用。 在MATLAB中实现牛顿迭代法,首先需要理解其基本步骤: 1. **选择初始点**:选择一个接近根的初始值x0。 2. **定义...
本文将深入探讨两种常用的数值方法——二分法和简单迭代法,并结合MATLAB编程环境进行详细解析。 首先,我们来理解二分法。二分法,也称为折半查找法,是一种在有序数组中寻找特定元素的搜索算法。它通过不断将查找...
实验报告涉及的主题是使用MATLAB实现二分法和牛顿迭代法来求解特定方程的根,并对比这两种方法的效率。实验的目标是理解和比较二分法与牛顿迭代法在寻找方程\( e^{-0.005R}\cos\left(\frac{0.05\sqrt{2000 - R^2 \...
本压缩包文件包含了一系列MATLAB代码,用于实现几种经典的数值计算方法,包括二分法、牛顿迭代法、复合梯形公式、复合辛普森公式、改进欧拉公式以及四阶龙格库塔公式。这些方法在解决非线性方程求解、数值积分和微分...
接着,**牛顿法**(Newton's Method)是一种更强大的迭代法,适用于求解函数的根。牛顿法通过构造函数的切线,不断逼近零点。其迭代公式是基于函数的一阶导数和二阶导数。在MATLAB中,牛顿法的实现涉及计算函数及其...
在Matlab中实现牛顿迭代法,通常涉及以下几个关键步骤: 1. **定义目标函数**:在本例中,我们要解决的非线性方程是2*(x^3)-4*(x^2)+3x-6=0。这个函数f(x)是我们要找零点的目标函数。 2. **计算导数**:牛顿迭代法...
在MATLAB中,我们可以编写如下的牛顿迭代法求根的函数模板: ```matlab function root = newton(f, df, x0, tol, maxiter) % f: 目标函数 % df: f的导数函数 % x0: 初始猜测值 % tol: 允许的误差阈值 % ...
3. 牛顿法:在 MATLAB 命令窗口建立一个实现牛顿迭代法的 MATLAB 函数文件 agui_newton.m,然后在 MATLAB 命令窗口输入函数名、迭代初值和精度,最后输出计算结果。 七、结论 实验结果显示了二分法、迭代法和牛顿...