实验5 非线性方程求根及其MATLAB实现
- 格式:ppt
- 大小:356.50 KB
- 文档页数:29
数值分析实验五 非线性方程的求根组号 班级 学号 姓名 分数一:实验目的1、掌握用二分法解非线性方程的方法。
2、掌握用迭代法解非线性方程的方法。
3、掌握用牛顿法解非线性方程的方法。
4、学会运用Matlab 语言解决提供的函数求解实际问题。
二:实验内容所需的基本知识二分法的原理:设)(x f 在],[b a 上连续,且0)()(<⋅b f a f 。
则],[b a 为方程区间(设只有唯一根)。
取中点)(210b a x +=,检查)(a f 与)(0x f 是否同号,若同号,说明根*x 与b 之间,此时b b x a ==101,;若异号,说明根*x 在a 与0x 之间,此时011,x b a a ==,得新区间],[11b a 为原区间的一半。
对],[11b a 进行上述过程,取中点)(21111b a x +=,检查)(1a f 与)(1x f 是否同号,如此反复二分下去,即可得出一系列有根区间⊃⊃⊃],[],[],[2211b a b a b a …⊃⊃],[k k b a …,其中每个区间都是前一个区间的一半,因此],[k k b a 的长度k k k a b a b 2)(-=-,当∞→k 时趋于零,就是说,如果二分过程无限地继续下去,这些区间最终必收缩于一点*x ,该点显然就是所求的根。
迭代法原理:首先给定一个粗糙的初始值,然而用一个迭代公式反复校正这个初值,将已有近似根逐步精确化,一直到满足精度要求为止。
具体地,把方程0)(=x f 改写成x 的等价表达式)(x x ϕ=,若)(**x x ϕ=,称*x 为)(x ϕ的一个不动点,求)(x f 的零点就等价于求)(x ϕ的不动点。
任取一点0x 代入)(x ϕ求得 )(01x x ϕ= 又将1x 代入)(x ϕ求得)(12x x ϕ= 如此反复迭代下去一般地 )(1k k x x ϕ=+ k=0,1,2,………)(x ϕ称为迭代函数,)(x x ϕ=称为迭代公式。
实用数值方法(Matlab) 综述报告题目:非线性方程(组)求根问题小组成员许多数学和物理问题归结为解函数方程f(x)=0。
方程f(x)=0的解称为方程的根。
对于非线性方程,在某个范围内往往不止一个根,而且根的分布情况可能很复杂,面对这种情况,通常先将考察的范围花费为若干个子段,然后判断哪些子段内有根,然后再在有根子段内找出满足精度要求的近似根。
为此适当选取有根子段内某一点作为根的初始值近似,然后运用迭代方法使之足部精确化。
这就是方程求根的迭代法。
下面介绍书上的几种方法:1、二分法(1)方法概要:假定函数f(x)在[a,b]上连续,且f(a)f(b)=0,则方程f(x)=0在[a,b]内一定有实根。
取其中将其二分,判断所求的根在的左侧还是右侧,得到一个新的有根区间点[],长度为[a,b]的一半。
对新的有根区间继续实行上述二分手段,直至二分k次后有根区间[]长度可见,如果二分过程无限继续下去,这些有限根区间最终必收敛于一点,该点就是所求的根。
在实际计算过程中不可能完成这个无限过程,允许有一定的误差,则二分k+1次后只要有根区间[]的长度小于,那么结果关于允许误差就能“准确”地满足方程f(x)=0。
(2)计算框图:2、开方法对于给定,求开方值为此,可以运用校正技术设计从预报值生成校正值的迭代公式。
自然希望校正值能更好满足所给方程:这是个关于校正量的近似关系式,如果从中删去二次项,即可化归为一次方程解之有从而关于校正值有如下开方公式上述演绎过程表明,开方法的设计思想是逐步线性化,即将二次方程的求解画归为一次方程求解过程的重复。
开方公式规定了预报值与校正值之间的一种函数关系,这里为开方法的迭代函数。
3、Newton法(1)方法概要考察一般形式的函数方程首先运用校正技术建立迭代公式。
设已知它的根近似值,则自然要求校正值能更好地满足所给方程将其左端用其线性主部替代,而令据此定出从而关于校正值有如下计算公式这就是著名的Newton公式。
数学实验报告实验五学院:数学与统计学院班级:数学与统计学院(2)班姓名:石紫雲学号:0234非线性方程的数值解法实验1实验目的1)进一步熟练掌握求解非线性方程的牛顿迭代法和弦截法。
2)根据牛顿迭代法和弦截法的原理,编写程序求解非线性方程,提高编程解决问题的能力。
2 实验内容(1)用牛顿法和割线法求下列方程的根x^2-e^x=0;x*e^x-1=0;(23实验原理(1)牛顿迭代公式:1()/'()k k k k x x f x f x +=- 双点弦法公式:111()()()()k k k k k k k f x x x x x f x f x +--=--- (2)令2()f x x A =-,再用牛顿法求根。
4实验步骤1)根据牛顿迭代法,双点弦法的算法编写相应的求根函数;2)用牛顿迭代法和双点弦法分别对方程进行求解;5 程序设计牛顿迭代法x0=;N=100;k=0;eps=5e-6;delta=1e-6;while(1)x1=x0-fc1(x0)/fc2(x0);k=k+1;if k>Ndisp('Newton method failed')breakendif(abs(x1-x0)<delta || abs(fc1(x1))<delta) break;endx0=x1;endfprintf('%f',x0)fprintf('%f',abs(fc1(x1)))双点弦法function cutline(x0,x1)N=100;k=0;delta=5e-8;while(1)(abs(x1-x0)>=delta)c=x1;x1=cutnext(x0,x1);x0=c;k=k+1;if k>Ndisp('Cutline method failed')break;endif(abs(x1-x0)<delta || abs(fc1(x1))<delta) break;endendfprintf('%10f\n',x1);function y=cutnext(a,b)y=b-fc(b)/(fc(b)-fc(a))*(b-a);1)原函数function fc1=fc1(x)fc1=x^2-exp(x);end导函数function fc2=fc2(x)fc2=2*x-exp(x);end2)原函数function fc1=fc1(x) fc1=x*exp(x)-1;end导函数function fc2=fc2(x)fc2=1*exp(x)+x*exp(x);end3)原函数function fc1=fc1(x)fc1=x^2-5;end导函数function fc2=fc2(x)fc2=2*x;end6实验结果及分析注:牛顿迭代法由于设置delta=1e-6,所以算出的误差e<*10^-6;割线法由于设置delta=5e-8,所以误差e<*10^-8.7总结。
实验报告MATLAB实验七: MATLAB数值计算(3)实验目的:熟悉MATLAB数值计算。
实验要求:⑴熟悉MATLAB数值计算步长对计算精度的影响⑵尝试MATLAB基本操作。
实验内容:1、列表显示不同步长时前向欧拉和中心欧拉计算数值导数的相对误差,得出结论并对结果进行讨论。
% program numdiff% tabulates the numerical derivatives of sin(x) at x=1% as a function of the step-size%help numdiffh = 10.^(-[1:16]); % step-sizesx = 1;dex = cos(1); % exact valued1 = (sin(x+h)-sin(x))./h; % asym. formula / One Order Relative Error d2 = (sin(x+h)-sin(x-h))./(h+h); % sym. formula / Two Order Relative Error y = [ h ; (d1-dex)/dex ; (d2-dex)/dex ];%fprintf(' h asymm rel. err. symm. rel. err. \n\n')h asymm rel. err. symm. rel. err.fprintf(' %5.0e %10.1e %10.1e \n',y)1e-01 -7.9e-02 -1.7e-031e-02 -7.8e-03 -1.7e-051e-03 -7.8e-04 -1.7e-071e-04 -7.8e-05 -1.7e-091e-05 -7.8e-06 -2.1e-111e-06 -7.8e-07 5.1e-111e-07 -7.7e-08 -3.6e-101e-08 -5.5e-09 4.8e-091e-09 9.7e-08 -5.5e-091e-10 -1.1e-07 -1.1e-071e-11 -2.2e-06 -2.2e-061e-12 8.0e-05 -2.3e-051e-13 -1.4e-03 -3.3e-041e-14 6.9e-03 6.9e-031e-15 2.7e-02 2.7e-021e-16 -1.0e+00 2.7e-022、尝试课件中降落伞问题的二分法求根和牛顿法求根,看看收敛速度如何。
第五讲非线性方程求根及其MATLAB实现一、引言在数学和工程领域中,非线性方程的求解是一项基本任务。
非线性方程通常不具备直接求解的方法,因此需要采用迭代方法来逼近其解。
本讲将介绍几种常用的非线性方程求根方法,并给出MATLAB实现的示例。
二、二分法二分法是一种简单但有效的求根方法。
其基本思想是将方程的根所在的区间进行逐步划分,并选择其中点作为迭代的点,直到满足精度要求。
具体实现如下:```matlabfunction x = bisection(f, a, b, tol)if f(a) * f(b) >= 0error('f(a)和f(b)符号相同');endwhile (b - a) / 2 > tolx=(a+b)/2;if f(x) == 0break;elseif f(a) * f(x) < 0b=x;elsea=x;endendend```三、牛顿法牛顿法是一种基于方程导数的迭代方法,其基本思想是使用方程的切线来逼近其根。
具体实现如下:```matlabfunction x = newton(f, df, x0, tol)while abs(f(x0)) > tolx0 = x0 - f(x0) / df(x0);endx=x0;end```四、割线法割线法是一种类似于牛顿法的迭代方法,其基本思想是用两个迭代点的连线来逼近方程的根。
具体实现如下:```matlabfunction x = secant(f, x0, x1, tol)while abs(f(x1)) > tolx=x1-f(x1)*(x1-x0)/(f(x1)-f(x0));x0=x1;x1=x;endend```五、MATLAB实现示例下面是一些使用上述非线性方程求根方法的MATLAB示例:```matlab% 示例1:求方程sin(x) = 0的根a=0;b = 2 * pi;tol = 1e-6;x = bisection(f, a, b, tol);disp(['二分法求解的根为:', num2str(x)]);disp(['牛顿法求解的根为:', num2str(x)]);x = secant(f, a, b, tol);disp(['割线法求解的根为:', num2str(x)]);%示例2:求方程x^2-2=0的根x0=1;tol = 1e-6;x = newton(f, df, x0, tol);disp(['牛顿法求解的根为:', num2str(x)]);```六、总结本讲介绍了几种常用的非线性方程求根方法,并给出了MATLAB的实现示例。
实验报告一、实验目的1.迭代函数对收敛性的影响。
2.初值的选择对收敛性的影响。
二、实验题目1.用简单迭代法求方程01)(3=--=x x x f 的根。
分别化方程为如下等价方程: 31+=x x ;13-=x x ;x x 11+=;213-+=x x x 取初值5.10=x ,精度为410-,最大迭代次数为500,观察其计算结果并加以分析。
2.①用牛顿法求方程01)(3=-+=x x x f 在0.5附近的根,分别取初值1000,100,2,1,5.0,5.0,1,2,100,10000-----=x观察并比较计算结果,并加以分析。
②用牛顿法求方程0)(3=-=x x x f 所有根。
三、实验原理简单迭代法程序,牛顿迭代法程序。
四、实验内容及结果fun=inline('x^3-x-1');dfun=inline('3*x^2-1');-1000,x1=manewton(fun,dfun,-1000,1e-4) -100,x2=manewton(fun,dfun,-100,1e-4)-2,x3=manewton(fun,dfun,-2,1e-4)-1,x4=manewton(fun,dfun,-1,1e-4)-0.5,x5=manewton(fun,dfun,-0.5,1e-4) 0.5,x6=manewton(fun,dfun,0.5,1e-4)1,x7=manewton(fun,dfun,1,1e-4)2,x8=manewton(fun,dfun,2,1e-4)100,x9=manewton(fun,dfun,100,1e-4) 1000,x10=manewton(fun,dfun,1000,1e-4)3)在MA TLAB的主程序窗口输出以下结果:ans =-1000k=21x1 =0.682327804075895ans =-100k=16x2 =0.682327803903413ans =-2k=6x3 =0.682327803828020ans =-1k=5x4 =0.682327803828020ans =-0.500000000000000k=4x5 =0.682327803903932ans =0.500000000000000k=3x6 =0.682327803828347五、实验结果分析(1)实验1中用简单迭代法求方程01)(3=--=x x x f 的根:取初始值5.10=x 的时候,等价方程2和4是不收敛的。
实验类别:数值分析专业:信息与计算科学班级:学号:姓名:中北大学理学院实验五 非线性方程求根【实验内容】设方程013)(3=--=x x x f 有三个实根8793.1*1=x ,*20.34729x =-, *3 1.532088x =-现采用下面四种不同计算格式,求0)(=x f 的根。
【实验方法与步骤】1、 213x x x +=用于求*3x 。
#include "math.h"#include "stdio.h"double f ( double x ){return((3*x+1) /x/x );}main(){double eps = 1e-10;double x1, x2 =-3;do{x1 = x2;x2 = f( x1 );printf( "\nx=%20.16lf \n", x2 ); }while( fabs( x2 - x1 ) >= eps ); scanf("%f",&x2);}2、 313-=x x 用于求*2x 。
#include "math.h"#include "stdio.h"double f ( double x ){return(( x*x*x-1) /3 );}main(){double eps = 1e-10;double x1, x2 =1.3;do{x1 = x2;x2 = f( x1 );printf( "\nx=%20.16lf\n", x2 );}while( fabs( x2 - x1 ) >= eps ); scanf("%f",&x2); }3、 313+=x x ,用于求*1x ,*3x 。
#include "math.h"#include "stdio.h"double f ( double x ){return(pow((3*x+1),1.0/3.0) ); }main(){double eps = 1e-10; double x1,x2 =1;do{x1 = x2;x2 = f( x1 );printf( "\nx=%20.16lf\n", x2 ); }while( fabs( x2 - x1 ) >= eps ); scanf("%f",&x2);}4、 x x 13+=用于求*1x 。