1、ezplot x-x,grid onhold onezplot(x5+2*x2+4,-2*pi,2*pi) 1-1 函数f(x)=x5+2x2+4的图形x=-2*pi:0.1:2*pi;y1=zeros(size(x);y2= x.5+2*x.2+4;plot(x,y1,x,y2)grid on axis tighttitle(x5+2x2+4)xlabel(x) 从图1-1可见,它有一个实数根,大致分布在-2与2之间。(2)将作图范围不断缩小,用放大法可得到精度越来越高的根的近似值。在matlab命令窗中先后键入subplot(2,2,1)ezplot x-x, grid on, hold
2、on, ezplot(,-2,2)subplot(2,2,2),-2,-1)subplot(2,2,3),-1.6,-1.5)subplot(2,2,4),-1.55,-1.54) 图1-2 放大法求函数f(x)=x5+2x2+4的根由图1-2可知,方程的根在-1.545与-1.54之间。1.2 数值方法非线性方程f(x)=0求根的方法有区间法和迭代法两大类,二分法、弦位法是区间法,简单迭代法和牛顿迭代法及其变形是迭代法,这里只给出二分法、简单迭代法和牛顿迭代法的构造过程。(1)根的隔离与二分法根的隔离思想来源于连续函数的零点定理:若函数f(x)在闭区间a,b上连续,且f(a)f(b)0,则方
3、程f(x)=0在(a,b)内至少有一根x*。二分法是最简单的求根方法,它是利用连续函数的零点定理,将含根区间逐次减半缩小,取区间的中点构造收敛点列xn来逼近根x*。用该方法求f(x)=0的近似解可分两步做:第一步,确定根的近似位置或大致范围,即确定一个区间a,b,使所求根是位于这个区间内的唯一实根。这个区间称为根的隔离区间,这可以通过函数作图达到:先画出y=f(x)的图形,然后从图上定出它与x轴交点的大概位置。第二步,以根的隔离区间a,b的端点作为根的初始近似值,用二分法逐步改进根的近似值的精确度,直至求得满足精确度的近似解。具体步骤如下:取a,b的中点x0=(a+b)/2,若f(x0)=0,
4、则x0就是f(x)=0的根x*。若f(a)f(x0)0,则根x*必在区间(a,x0)内,取a1=a, b1=x0;否则根x*必在区间(x0,b)内,取a1=x0, b1=b。这样,得到新区间a1,b1,其长度为a,b的一半。如此继续下去,进行n等分后,得到一组不断缩小的区间序列a,b, a1,b1, a2,b2, an,bn,和对应区间的中点数列xn=(an+bn)/2, n=0,1,2, 其中每个区间都含有根x*,满足a,ba1,b1 a2,b2 an,bn 且每个区间的长度都是前一区间长度的一半。由于an,bn的长度为(b-a)/2n,当n不断变大时,这些区间将收敛于一点x*,该点即为所求
5、的根。当做到第n步时,有选择适当的步数n,就可达到满意的精度。用二分法,理论上区间中点序列xn将收敛到根的真值,但收敛速度较慢,所以通常用二分法为其他方法提供初步的近似值。(2)简单迭代法迭代法的基本原理是构造一个迭代公式,反复用它得出一个逐次逼近方程根的数列,数列中每一项都是方程根的近似值,只是精度不同。简单迭代法也成逐次迭代法,是非线性方程求根中各类迭代法的基础。由于对方程作等价变换根不发生变换,将方程f(x)=0等价变换为,构造迭代计算公式。取定初值x0,算出数列xn。如果xn收敛于x*,则有这说明,x*就是方程f(x)=0的根。上面称为不动点方程,称为迭代函数,数列xn称为迭代数列。(
6、3)牛顿迭代法如果f(x)在a,b上具有二阶导数,f(a)f(b)err)&(yc=0)c=(a+b)/2;x=a; ya=eval(f);x=b; yb=eval(f);x=c; yc=eval(f);if ya*yc erfenfa输入区间=0,1输入误差=0.001x0=0.5000x0=0.7500x0=0.6250x0=0.6875x0=0.6563x0=0.6719x0=0.6641x0=0.6680x0=0.6699x0=0.6709由此得到,方程的根的近似值为0.6709.2、编写牛顿迭代法求根程序,求1中方程x3+1.1x2+0.9x-1.4=0的实根的近似值,并计算迭代次数
7、为6的近似根。由1可知,0.5,1是根所在的区间,在0.5,1上f(x)= x3+1.1x2+0.9x-1.4f(x)=3*x2+2.2x+0.9, f(x)=6x+2.2(x)在0.5, 1上保持同号,f(1)0与f(1)同号,所以取x0=1为迭代初始值。用matlab语言编写一般的程序如下:n=input(请输入迭代次数:n=x0=input(请输入迭代初始值:x0=f1=diff(f);format longfor i=1:nx=x0;fx0=eval(f);f1x0=eval(f1);x0=x0-fx0/f1x0;fprintf(x0=%12.10fn,x0)存为文件niudunfa.
8、m,调用及运行结果如下: niudunfan=6x0=1x0=0.7377049180x0=0.6741688117x0=0.6706675756x0=0.6706573108x0=0.6706573107由此得到,方程的根的近似值为0.6706573107。3. 用matlab中的内部函数求方程的根。(1)用roots求方程x9+x8+1=0的根;(2)用solve求上述方程的根;(3)用fzero求方程x2+4sinx=25的实根;(4)用fsolve求方程x=e-x在0附近的根;(1)在matlab命令窗口输入命令:p=zeros(10,1); p(1:2,end,1)=1; roots
9、(p) ans = -1.213149723059643 -0.901727735578254 + 0.575312094072893i -0.901727735578254 - 0.575312094072893i -0.269351937596575 + 0.940578401023146i -0.269351937596575 - 0.940578401023146i 0.416834006536573 + 0.841919773084660i 0.416834006536573 - 0.841919773084660i 0.860820528168075 + 0.33435225889
10、7906i 0.860820528168075 - 0.334352258897906i (2)在matlab命令窗口输入命令:solve(x9+x8+1=0RootOf(X19 + X18 + 1, X1) (3)首先作图确定根的大致范围:clf, ezplot x-x, grid on, hold on, ezplot(x2+4*sin(x)-25图1-6由图1-6可确定两根在x1-4,x25附近。再具体求根。x1=fzero(,-4)x2=fzero( x2+4*sin(x)-25,5) x1 = -4.586052690568049x2 = 5.318580248846235 (4)在matlab命令窗口输入命令:x=fsolve(x-exp(-x),0) Optimization terminated: first-order optimality is less than options.TolFun.x = 0.567143165036970 五、实验练习1、用二分法求方程x3-1.2x+6=0的实根的近似值,使误差不超过10-3,并用roots命令进行检验。2、用牛顿迭代法求方程x3-1.1x2+2x-8=0的实根的近似值,使误差不超过0.001,并用solve命令进行检验。3、用简单迭代法求方程x=e-x在0附近的根,并用fsolve命令进行检验。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1