1、数学实验报告实验序号:3 日期: 年 月 日 班级 姓名 学号 实验名称 求代数方程的近似根问题背景描述: 求代数方程的根是最常见的数学问题之一(这里称为代数方程,主要是想和后面的微分方程区别开为简明起见,在本实验的以下叙述中,把代数方程简称为方程),当是一次多项式时,称为线性方程,否则称之为非线性方程当f(x)=0是非线性方程时,由于f(x)的多样性,尚无一般的解析解法可使用。本实验介绍一些求方程实根的近似值的有效方法,要求在使用这些方法前先确定求根区间a,b,或给出某根的近似值x0。在实际问题抽象出的数学模型中,x0可以根据物理背景确定;也可根据y=f(x)的草图等方法确定,还可用对分法、
2、迭代法以及牛顿切线法大致确定根的分布情况。实验目的:本实验介绍一些求方程实根的近似值的有效方法,要求在使用这些方法前先确定求根区间,或给出某根的近似值在实际问题抽象出的数学模型中,可以根据物理背景确定;也可根据的草图等方法确定,还可用对分法、迭代法以及牛顿切线法大致确定根的分布情况通过本实验希望能:1. 了解对分法、迭代法、牛顿切线法求方程近似根的基本过程;2. 求代数方程(组)的解 实验原理与数学模型: 1对分法对分法思想:将区域不断对分,判断根在某个分段内,再对该段对分,依此类推,直到满足精度为止对分法适用于求有根区间内的单实根或奇重实根设在上连续,即 ,或,则根据连续函数的介值定理,在内
3、至少存在一点 ,使下面的方法可以求出该根:(1) 令,计算;(2) 若,则是的根,停止计算,输出结果若 ,则令,若,则令,;,有、以及相应的(3) 若 (为预先给定的精度要求),退出计算,输出结果;反之,返回(1),重复(1),(2),(3)2. 迭代法1) 迭代法的基本思想:由方程构造一个等价方程从某个近似根出发,令可得序列,这种方法称为迭代法若 收敛,即,只要连续,有可知,的极限是的根,也就是的根当然,若发散,迭代法就失败2) 迭代法的加速:a) 松弛法:若与同是的近似值,则是两个近似值的加权平均,其中称为权重,现通过确定看能否得到加速迭代方程是:其中,令,试确定:当时,有,即当,时,可望
4、获得较好的加速效果,于是有松弛法:,b) Altken方法:,是它的根,是其近似根设,因为,用差商近似代替,有,解出,得由此得出公式;这就是Altken 公式,3. 牛顿(Newton)法(牛顿切线法)1) 牛顿法的基本思想:是非线性方程,一般较难解决,多采用线性化方法 记为 是一次多项式,用作为的近似方程的解为记为,一般地,记即为牛顿法公式.实验所用软件及版本: Matlab 7.0主要内容(要点):4分别用对分法、普通迭代法、松弛迭代法、Altken 迭代法、牛顿切法线等5种方法,求方程 的正的近似根,(建议取 时间许可的话,可进一步考虑 的情况)实验过程记录(含基本步骤、主要程序清单及异
5、常情况记录等):(1)对分法syms x fx;a=0;b=1;fx=sin(x)- 0.5*x;x=(a+b)/2;k=0;ffx=subs(fx,x,x);if ffx=0; disp(the root is:,num2str(x)else disp(k ak bk f(xk) while abs(ffx)0.0001 & ab; disp(num2str(k), ,num2str(a), ,num2str(b), ,num2str(ffx) fa=subs(fx,x,a);ffx=subs(fx,x,x); if fa*ffx0.0001; disp(num2str(k), ,num2s
6、tr(x), ,num2str(ffx); x=subs(gx,x,x);ffx=subs(fx,x,x);k=k+1;enddisp(num2str(k), ,num2str(x), ,num2str(ffx)答案:0 0.5 0.229431 0.95885 0.339112 1.6371 0.179273 1.9956 -0.086694 1.8222 0.0574415 1.9371 -0.0349046 1.8673 0.0227097 1.9127 -0.0142528 1.8842 0.00917369 1.9026 -0.005816610 1.8909 0.003725111
7、 1.8984 -0.002370912 1.8936 0.00151513 1.8967 -0.000965714 1.8947 0.0006165515 1.896 -0.0003932316 1.8952 0.0002509617 1.8957 -0.000160118 1.8954 0.0001021619 1.8956 -6.5178e-005(3)松弛迭代法syms fx gx x dgx;gx=2*sin(x);fx=sin(x)-x/2;dgx=diff(gx,x);x=0.5;k=0;ggx=subs(fx,x,x);ffx=subs(fx,x,x);dgxx=subs(dg
8、x,x,x);disp(k x w)while abs(ffx)0.0001; w=1/(1-dgxx); disp(num2str(k), ,num2str(x), ,num2str(w) x=(1-w)*x+w*ggx;k=k+1; ggx=subs(gx,x,x);ffx=subs(fx,x,x);dgxx=subs(dgx,x,x);enddisp(num2str(k), ,num2str(x), ,num2str(ffx) 答案:k x w0 0.5 -1.32421 0.8583 -3.25252 -1.2726 2.42423 -2.822 0.344984 -2.0652 0.
9、513065 -1.9089 0.60126 -1.8956 8.3274e-005(4)Altken迭代法syms x fx gx;gx=sin(x)/0.5;fx=sin(x)-0.5*x;disp(k x x1 x2)x=1.6;k=0;ffx=subs(fx,x,x);while abs(ffx)0.0001;u=subs(gx,x,x);v=subs(gx,x,u);disp(num2str(k), ,num2str(x), ,num2str(u), ,num2str(v)x=v-(v-u)2/(v-2*u+x);k=k+1;ffx=subs(fx,x,x);enddisp(num2
10、str(k), ,num2str(x), ,num2str(u), ,num2str(v)运行结果:k x x1 x20 1.6 1.9991 1.81931 1.8752 1.9081 1.88732 1.8953 1.8956 1.89543 1.8955 1.8956 1.8954(5)牛顿法syms x fx gx;fx=sin(x)-0.5*x;gx=diff(fx,x);x1=-2;x2=0.5;x3=1.4;k=0;disp(k x1 x2 x3)fx1=subs(fx,x,x1);fx2=subs(fx,x,x2);fx3=subs(fx,x,x3);gx1=subs(gx,x
11、,x1);gx2=subs(gx,x,x2);gx3=subs(gx,x,x3);while abs(fx1)0.0001|abs(fx2)0.0001|abs(fx3)0.0001; disp(num2str(k), ,num2str(x1), ,num2str(x2), ,num2str(x3) x1=x1-fx1/gx1;x2=x2-fx2/gx2;x3=x3-fx3/gx3;k=k+1; fx1=subs(fx,x,x1);fx2=subs(fx,x,x2);fx3=subs(fx,x,x3); gx1=subs(gx,x,x1);gx2=subs(gx,x,x2);gx3=subs(
12、gx,x,x3);end disp(num2str(k), ,num2str(x1), ,num2str(x2), ,num2str(x3)运行结果:k x1 x2 x30 -2 0.5 1.41 -1.901 -0.10762 2.26492 -1.8955 0.00083966 1.94573 -1.8955 -3.9465e-010 1.89694 -1.8955 0 1.8955实验结果报告及实验总结:实验结果表明迭代法收敛速度较慢,对分法常来试探实根的分布区间或求根的近似值,松弛法和Altken法的加速效果很明显,牛顿法的收敛速度较快.实验总结:1.通过本实验学会了运用Matlab对求代数方程近似根有了进一步的了解,并且能够求出一些方程的的近似根。2.在实际应用问题中,Matlab不仅能够解决一般代数方程的求根问题,而且对尚无一般解析解法可使用的方程实现了方程近似根的求解,为方程求根解决了难题。思考与深入:1.在编程过程中,有些语句的编写有些困难,在个别细节问题上仍需要注意,编程的能力有待提高。2.Matlab的功能虽然非常巨大,但是我们对其的运用能力还十分弱,我们需要多加练习增强运用能力,可以学会更多的技巧来解决更多实际问题。教师评语: