1、数值分析上机实验报告实验报告一题目: 非线性方程求解摘要:非线性方程的解析解通常很难给出,因此线性方程的数值解法就尤为重要。本实验采用两种常见的求解方法二分法和Newton法及改进的Newton法。前言:(目的和意义)掌握二分法与Newton法的基本原理和应用。数学原理:对于一个非线性方程的数值解法很多。在此介绍两种最常见的方法:二分法和Newton法。对于二分法,其数学实质就是说对于给定的待求解的方程f(x),其在a,b上连续,f(a)f(b)0,且f(x)在a,b内仅有一个实根x*,取区间中点c,若,则c恰为其根,否则根据f(a)f(c)5e-6) ; c=(a+b)/2; if f12(
2、a)*f12(c)0; a=c; else b=c; end R=b-a;%求出误差k=k+1;endx=c%给出解Newton法及改进的Newton法源程序:clear% 输入函数f=input(请输入需要求解函数,s)%求解f(x)的导数df=diff(f);%改进常数或重根数miu=2;%初始值x0x0=input(input initial value x0);k=0;%迭代次数max=100;%最大迭代次数R=eval(subs(f,x0,x);%求解f(x0),以确定初值x0时否就是解while (abs(R)1e-8) x1=x0-miu*eval(subs(f,x0,x)/ev
3、al(subs(df,x0,x); R=x1-x0; x0=x1; k=k+1;if (eval(subs(f,x0,x)max;%如果迭代次数大于给定值,认为迭代不收敛,重新输入初值 ss=input(maybe result is error,choose a new x0,y/n?,s); if strcmp(ss,y) x0=input(input initial value x0); k=0; else break end endendk;%给出迭代次数x=x0;%给出解结果分析和讨论:1. 用二分法计算方程在1,2内的根。(,下同)计算结果为x= 1.40441513061523;
4、f(x)= -3.797205105904311e-007;k=18;由f(x)知结果满足要求,但迭代次数比较多,方法收敛速度比较慢。2. 用二分法计算方程在1,1.5内的根。计算结果为x= 1.32471847534180;f(x)= 2.209494846194815e-006;k=17;由f(x)知结果满足要求,但迭代次数还是比较多。3. 用Newton法求解下列方程a) x0=0.5;计算结果为x= 0.56714329040978;f(x)= 2.220446049250313e-016;k=4;由f(x)知结果满足要求,而且又迭代次数只有4次看出收敛速度很快。b) x0=1;c)
5、x0=0.45, x0=0.65; 当x0=0.45时,计算结果为x= 0.49999999999983;f(x)= -8.362754932994584e-014;k=4;由f(x)知结果满足要求,而且又迭代次数只有4次看出收敛速度很快,实际上该方程确实有真解x=0.5。当x0=0.65时,计算结果为x= 0.50000000000000;f(x)=0;k=9;由f(x)知结果满足要求,实际上该方程确实有真解x=0.5,但迭代次数增多,实际上当取x00.68时,x1,就变成了方程的另一个解,这说明Newton法收敛与初值很有关系,有的时候甚至可能不收敛。4. 用改进的Newton法求解,有2
6、重根,取 x0=0.55;并与3.中的c)比较结果。当x0=0.55时,程序死循环,无法计算,也就是说不收敛。改时,结果收敛为x=0.50000087704286;f(x)=4.385198907621127e-007;k=16;显然这个结果不是很好,而且也不是收敛至方程的2重根上。当x0=0.85时,结果收敛为x= 1.00000000000489;f(x)= 2.394337647718737e-023;k=4;这次达到了预期的结果,这说明初值的选取很重要,直接关系到方法的收敛性,实际上直接用Newton法,在给定同样的条件和精度要求下,可得其迭代次数k=15,这说明改进后的Newton法
7、法速度确实比较快。结论: 对于二分法,只要能够保证在给定的区间内有根,使能够收敛的,当时收敛的速度和给定的区间有关,二且总体上来说速度比较慢。Newton法,收敛速度要比二分法快,但是最终其收敛的结果与初值的选取有关,初值不同,收敛的结果也可能不一样,也就是结果可能不时预期需要得结果。改进的Newton法求解重根问题时,如果初值不当,可能会不收敛,这一点非常重要,当然初值合适,相同情况下其速度要比Newton法快得多。实验报告二题目: Gauss列主元消去法摘要:求解线性方程组的方法很多,主要分为直接法和间接法。本实验运用直接法的Guass消去法,并采用选主元的方法对方程组进行求解。前言:(目
8、的和意义)1. 学习Gauss消去法的原理。2. 了解列主元的意义。3. 确定什么时候系数阵要选主元数学原理:由于一般线性方程在使用Gauss消去法求解时,从求解的过程中可以看到,若=0,则必须进行行交换,才能使消去过程进行下去。有的时候即使0,但是其绝对值非常小,由于机器舍入误差的影响,消去过程也会出现不稳定得现象,导致结果不正确。因此有必要进行列主元技术,以最大可能的消除这种现象。这一技术要寻找行r,使得并将第r行和第k行的元素进行交换,以使得当前的的数值比0要大的多。这种列主元的消去法的主要步骤如下:1. 消元过程对k=1,2,n-1,进行如下步骤。1) 选主元,记若很小,这说明方程的系
9、数矩阵严重病态,给出警告,提示结果可能不对。2) 交换增广阵A的r,k两行的元素。 (j=k,n+1)3) 计算消元 (i=k+1,n; j=k+1,n+1)2. 回代过程对k= n, n-1,1,进行如下计算至此,完成了整个方程组的求解。程序设计:本实验采用Matlab的M文件编写。 Gauss消去法源程序:cleara=input(输入系数阵:n)b=input(输入列阵b:n)n=length(b);A=a bx=zeros(n,1);%函数主体for k=1:n-1;%是否进行主元选取if abs(A(k,k)abs(t) p=r; else p=k; end end %交换元素 if
10、 p=k; for q=k:n+1; s=A(k,q); A(k,q)=A(p,q); A(p,q)=s; end end end %判断系数矩阵是否奇异或病态非常严重if abs(A(k,k) yipusilongdisp(矩阵奇异,解可能不正确)end %计算消元,得三角阵 for r=k+1:n; m=A(r,k)/A(k,k); for q=k:n+1; A(r,q)=A(r,q)-A(k,q)*m; end endend %求解x x(n)=A(n,n+1)/A(n,n); for k=n-1:-1:1; s=0; for r=k+1:n; s=s+A(k,r)*x(r); end
11、t=(A(k,n+1)-s) x(k)=(A(k,n+1)-s)/A(k,k)end结果分析和讨论:例:求解方程。其中为一小数,当时,分别采用列主元和不列主元的Gauss消去法求解,并比较结果。记Emax为求出的解代入方程后的最大误差,按要求,计算结果如下:当时,不选主元和选主元的计算结果如下,其中前一列为不选主元结果,后一列为选主元结果,下同。 0.99999934768391 0.99999934782651 2.00000217421972 2.00000217391163 2.99999760859451 2.99999760869721Emax= 9.301857062382624e
12、-010,0此时,由于不是很小,机器误差就不是很大,由Emax可以看出不选主元的计算结果精度还可以,因此此时可以考虑不选主元以减少计算量。当时,不选主元和选主元的计算结果如下 1.00001784630877 0.99999999999348 1.99998009720807 2.00000000002174 3.00000663424731 2.99999999997609Emax= 2.036758973744668e-005,0此时由Emax可以看出不选主元的计算精度就不好了,误差开始增大。当时,不选主元和选主元的计算结果如下 1.42108547152020 1.00000000000
13、000 1.66666666666666 2.00000000000000 3.11111111111111 300000000000000Emax= 0.70770085900503,0此时由Emax可以看出,不选主元的结果应该可以说是不正确了,这是由机器误差引起的。当时,不选主元和选主元的计算结果如下NaN 1NaN 2NaN 3Emax=NaN, 0不选主元时,程序报错:Warning: Divide by zero.。这是因为机器计算的最小精度为10-15,所以此时的就认为是0,故出现了错误现象。而选主元时则没有这种现象,而且由Emax可以看出选主元时的结果应该是精确解。结论:采用Ga
14、uss消去法时,如果在消元时对角线上的元素始终较大(假如大于10-5),那么本方法不需要进行列主元计算,计算结果一般就可以达到要求,否则必须进行列主元这一步,以减少机器误差带来的影响,使方法得出的结果正确。实验报告三题目: Rung现象产生和克服摘要:由于高次多项式插值不收敛,会产生Runge现象,本实验在给出具体的实例后,采用分段线性插值和三次样条插值的方法有效的克服了这一现象,而且还取的很好的插值效果。前言:(目的和意义)1. 深刻认识多项式插值的缺点。2. 明确插值的不收敛性怎样克服。3. 明确精度与节点和插值方法的关系。数学原理:在给定n+1个节点和相应的函数值以后构造n次的Lagra
15、nge插值多项式,实验结果表明(见后面的图)这种多项式并不是随着次数的升高对函数的逼近越来越好,这种现象就是Rung现象。解决Rung现象的方法通常有分段线性插值、三次样条插值等方法。分段线性插值:设在区间a, b上,给定n+1个插值节点a=x0x1xn=b和相应的函数值y0,y1,yn,求作一个插值函数,具有如下性质:1) ,j=0,1,n。2) 在每个区间xi, xj上是线性连续函数。则插值函数称为区间a, b上对应n个数据点的分段线性插值函数。三次样条插值:给定区间a, b一个分划 :a=x0x1xN=b 若函数S(x)满足下列条件:1) S(x)在每个区间xi, xj上是不高于3次的多
16、项式。2) S(x)及其2阶导数在a, b上连续。则称S(x)使关于分划的三次样条函数。程序设计:本实验采用Matlab的M文件编写。其中待插值的方程写成function的方式,如下function y=f(x);y=1/(1+25*x*x);写成如上形式即可,下面给出主程序 Lagrange插值源程序:n=input(将区间分为的等份数输入:n);s=-1+2/n*0:n;%给定的定点,Rf为给定的函数x=-1:0.01:1;f=0;for q=1:n+1; l=1;%求插值基函数 for k=1:n+1; if k=q; l=l.*(x-s(k)./(s(q)-s(k); else l=l
17、; end end f=f+Rf(s(q)*l;%求插值函数endplot(x,f,r)%作出插值函数曲线grid on hold on分段线性插值源程序clearn=input(将区间分为的等份数输入:n);s=-1+2/n*0:n;%给定的定点,Rf为给定的函数m=0;hh=0.001;for x=-1:hh:1; ff=0; for k=1:n+1;%求插值基函数 switch k case 1 if xs(n); l=(x-s(n)./(s(n+1)-s(n); else l=0; end otherwise if x=s(k-1)&x=s(k)&x=s(k+1); l=(x-s(k+
18、1)./(s(k)-s(k+1); else l=0; end end end ff=ff+Rf(s(k)*l;%求插值函数值 end m=m+1; f(m)=ff;end %作出曲线x=-1:hh:1;plot(x,f,r);grid onhold on 三次样条插值源程序:(采用第一边界条件)clearn=input(将区间分为的等份数输入:n);%插值区间a=-1;b=1;hh=0.001;%画图的步长s=a+(b-a)/n*0:n;%给定的定点,Rf为给定的函数%第一边界条件Rf(-1),Rf(1)v=5000*1/(1+25*a*a)3-50/(1+25*a*a)4;for k=1:
19、n;%取出节点间距 h(k)=s(k+1)-s(k);endfor k=1:n-1;%求出系数向量lamuda,miu la(k)=h(k+1)/(h(k+1)+h(k); miu(k)=1-la(k);end%赋值系数矩阵Afor k=1:n-1; for p=1:n-1; switch p case k A(k,p)=2; case k-1 A(k,p)=miu(p+1); case k+1 A(k,p)=la(p-1); otherwise A(k,p)=0; end endend%求出d阵for k=1:n-1; switch k case 1 d(k)=6*f2c(s(k) s(k+
20、1) s(k+2)-miu(k)*v; case n-1 d(k)=6*f2c(s(k) s(k+1) s(k+2)-la(k)*v; otherwise d(k)=6*f2c(s(k) s(k+1) s(k+2); endend%求解M阵M=Ad;M=v;M;v;%m=0;f=0;for x=a:hh:b; if x=a; p=1; else p=ceil(x-s(1)/(b-a)/n); end ff1=0; ff2=0; ff3=0; ff4=0; m=m+1; ff1=1/h(p)*(s(p+1)-x)3*M(p)/6; ff2=1/h(p)*(x-s(p)3*M(p+1)/6; ff
21、3=(Rf(s(p+1)-Rf(s(p)/h(p)-h(p)*(M(p+1)-M(p)/6)*(x-s(p); ff4=Rf(s(p)-M(p)*h(p)*h(p)/6; f(m)=ff1+ff2+ff3+ff4 ; end %作出插值图形x=a:hh:b;plot(x,f,k)hold ongrid on 结果分析和讨论:本实验采用函数进行数值插值,插值区间为-1,1,给定节点为xj=-1+jh,h=0.1,j=0,,n。下面分别给出Lagrange插值,三次样条插值,线性插值的函数曲线和数据表。图中只标出Lagrange插值的十次多项式的曲线,其它曲线没有标出,从数据表中可以看出具体的误差
22、。表中,L10(x)为Lagrange插值的10次多项式,S10(x),S40(x)分别代表n=10,40的三次样条插值函数,X10(x),X40(x)分别代表n=10,40的线性分段插值函数。x f(x) L10(x) S10(x) S40(x) X10(x) X40(x) -1.00000000000000 0.03846153846154 0.03846153846154 0.03846153846154 0.03846153846154 0.03846153846154 0.03846153846154 -0.95000000000000 0.04244031830239 1.9236
23、3114971920 0.04240833151040 0.04244031830239 0.04355203619910 0.04244031830239 -0.90000000000000 0.04705882352941 1.57872099034926 0.04709697585458 0.04705882352941 0.04864253393665 0.04705882352941 -0.85000000000000 0.05245901639344 0.71945912837982 0.05255839923979 0.05245901639344 0.0537330316742
24、1 0.05245901639344 -0.80000000000000 0.05882352941176 0.05882352941176 0.05882352941176 0.05882352941176 0.05882352941176 0.05882352941176 -0.75000000000000 0.06639004149378 -0.23146174989674 0.06603986172744 0.06639004149378 0.06911764705882 0.06639004149378 -0.70000000000000 0.07547169811321 -0.22
25、619628906250 0.07482116198866 0.07547169811321 0.07941176470588 0.07547169811321 -0.65000000000000 0.08648648648649 -0.07260420322418 0.08589776360849 0.08648648648649 0.08970588235294 0.08648648648649 -0.60000000000000 0.10000000000000 0.10000000000000 0.10000000000000 0.10000000000000 0.1000000000
26、0000 0.10000000000000 -0.55000000000000 0.11678832116788 0.21559187891257 0.11783833017713 0.11678832116788 0.12500000000000 0.11678832116788 -0.50000000000000 0.137*276 0.25375545726103 0.14004371555730 0.137*276 0.150*000 0.137*276 -0.45000000000000 0.16494845360825 0.23496854305267 0.167227243158
27、83 0.16494845360825 0.175*000 0.16494845360825 -0.40000000000000 0.20000000000000 0.20000000000000 0.20000000000000 0.20000000000000 0.20000000000000 0.20000000000000 -0.35000000000000 0.24615384615385 0.19058046675376 0.24054799403464 0.24615384615385 0.27500000000000 0.24615384615385 -0.30000000000000 0.30769230769231 0.23534659131080 0.29735691695860 0.30769230769231 0.350000000
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1