还剩19页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
本科实验报告课程名称计算机数值方法实验项目实验一方程求根实验二线性方程组的直接解法实验三线性方程组的迭代解法实验四代数插值和最小二乘法拟合多项式实验地点逸夫302专业班级学号学生姓名指导教师2013年4月15日学生姓名实验成绩实验名称实验一方程求根实验目的和要求
(1)了解非线性方程求根的常见方法,如二分法、牛顿法、割线法
(2)加深对方程求根方法的认识,掌握算法
(3)会进行误差分析,并能对不同方法进行比较实验内容和原理内容使用二分法和迭代法求方程fx=x3+4x2-10=0在
[12]内的一个实根,且要求满足精度|x*-xn|
0.5×10-5原理二分法fx在区间(x,y)上连续,先找到a、b属于区间(x,y),使fa,fb异号,说明在区间ab内一定有零点,然后求f[a+b/2]以此类推,通过每次把fx的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值;迭代法用迭代公式x=fx进行迭代计算,直到满足|x*-xn|
0.5×10-5为止主要仪器设备惠普笔记本,wintc,microsoftvisualstudio2010实验记录写出实验内容中的程序代码和运行结果程序二分法#includestdio.h#include__th.hdoublefdoublex{returnx*x*x+4*x*x-10;}__in{doublet1=1t2=2;doublet=t1+t2/2;doublefdoublex;whilefabsft=5e-6//精度设置{ifft1*ft=0{t2=t;t=t1+t2/2;}elseifft2*ft=0{t1=t;t=t1+t2/2;}}printftherootis%ft;getch;}迭代法#includestdio.h#include__th.h__in{floatxat;scanf%fa;x=a;do{x=sqrt10-x*x*x/4;t=a;a=x;}whilefabsa-t5e-6;printfx=%fa;getch;}运行结果二分法迭代法实验结果和分析可包括实验中的两种方法都存在不同程度的误差,由于数据进行了小数位数保留加上计算方法导致两种方法计算结果稍有偏差不同的方法存在不同误差,可以不同程度的求得方程的解,不同的方法速度不同心得体会本次实验首先我学到了fabs()是用于求绝对值的,而且我复习了二分法和迭代法的原理,虽然这两个是比较小的程序,但还是考验了我的细心程度实验名称实验二线性方程组的直接求解实验目的和要求
(1)了解线性方程组常见的直接解法,如Guass消元法、LU分解法、追赶法
(2)加深对线性方程组求解方法的认识,掌握算法
(3)会进行误差分析,并能对不同方法进行比较实验内容合理选择利用Gauss消元法、LU分解法、追赶法求解下列方程组
①②③④(n=510100…)主要仪器设备惠普笔记本,wintc,microsoftvisualstudio2010实验记录写出实验内容中的程序代码和运行结果程序Gauss消元法#includestdio.hdoublea
[15]
[15]a0
[15]
[15];doubleb
[15]b0
[15]l
[15];intn;voiddisplayA{intij;printf\n;forj=1;j=n;j++{fori=1;i=n;i++printfa[%d][%d]=%fjia[j][i];printfb[%d]=%f\njb[j];}}void__in{intijk;printfshurun:;scanf%dn;printfshuruyuansu:;fori=1;i=n;i++{forj=1;j=n;j++{scanf%lfa[i][j];a0[i][j]=a[i][j];}scanf%lfb[i];b0[i]=b[i];}displayA;k=1;do{fori=1;i=n;i++{ifi==kcontinue;l[i]=a0[i][k]/a0[k][k];}forj=k+1;j=n;j++a[k][j]=a0[k][j]/a0[k][k];b[k]=b0[k]/a0[k][k];fori=1;i=n;i++{ifi==kcontinue;forj=k+1;j=n;j++a[i][j]=a0[i][j]-l[i]*a0[k][j];b[i]=b0[i]-l[i]*b0[k];}fori=1;i=n;i++{forj=k+1;j=n;j++a0[i][j]=a[i][j];b0[i]=b[i];}ifk==nbreak;k++;}while1;fori=1;i=n;i++printfx[%d]=b[%2d]=%lf\niib[i];getch;}LU分解法#includestdio.h#include__th.h#defineL30doublea[L][L]b[L]l[L][L]u[L][L]x[L]y[L];int__in{intnijkr;printfinputn:;scanf%dn;printfinputyuansu\n;fori=1;i=n;++i{forj=1;j=n;++j{scanf%lfa[i][j];}}fori=1;i=n;++i{scanf%lfb[i];}fori=1;i=n;++i{forj=1;j=n;++j{l[i][j]=0;u[i][j]=
0.0;}}fork=1;k=n;++k{forj=k;j=n;++j{u[k][j]=a[k][j];forr=1;rk;++r{u[k][j]-=l[k][r]*u[r][j];}}fori=k+1;i=n;++i{l[i][k]=a[i][k];forr=1;rk;++r{l[i][k]-=l[i][r]*u[r][k];}l[i][k]/=u[k][k];}l[k][k]=
1.0;}fori=1;i=n;++i{y[i]=b[i];forj=1;ji;++j{y[i]-=l[i][j]*y[j];}}fori=n;i0;--i{x[i]=y[i];forj=i+1;j=n;++j{x[i]-=u[i][j]*x[j];}x[i]/=u[i][i];}fori=1;i=n;++i{printfx[%d]=%
0.2lf\nix[i];}getch;}追赶法#includestdio.h__in{doublea
[15]b
[15]c
[15]d
[15];doublet;intin;printfinputn:;scanf%dn;printfinputyuansu\n;scanf%lf%lf%lfb
[1]c
[1]d
[1];fori=2;i=n-1;i++{scanf%lf%lf%lf%lfa[i]b[i]c[i]d[i];}scanf%lf%lf%lfa[n]b[n]d[n];c
[1]=c
[1]/b
[1];d
[1]=d
[1]/b
[1];fori=2;i=n-1;i++{t=b[i]-c[i-1]*a[i];c[i]=c[i]/t;d[i]=d[i]-d[i-1]*a[i]/t;}d[n]=d[n]-d[n-1]*a[n]/b[n]-c[n-1]*a[n];fori=n-1;i=1;i--d[i]=d[i]-c[i]*d[i+1];printf\n********************************\n;fori=1;i=n;i++printfd[%2d]=%lf\nid[i];getch;}运行结果方程组
(1)方程组
(2)方程组
(3)方程组
(4)实验结果和分析三种解方程组方法的分析从消元过程可以看出,对于n阶线性方程组,只要各步主元素不为零,经过n-1步消元,就可以得到一个等价的系数矩阵为上三角形阵的方程组,然后再利用回代过程可求得原方程组的解消元过程相当于分解A为单位下三角阵L与上三角阵U的乘积,解方程组Ly=b回代过程就是解方程组Ux=y其中的L为n阶单位下三角阵、U为上三角阵.在A的LU分解中L取下三角阵U取单位上三角阵这样求解方程组Ax=d的方法称为追赶法但是本实验中的高斯消元法是采用高斯若尔当消元法,即将主元素化为1,并消去对角线上方与__的元素,它不需要回代即可得方程的解心得体会(遇到的问题和解决方法)实验中我采用三种方法将给出的4个方程组的解求出,编代码过程中参考了实验指导书中的程序,根据自己的理解对程序有所改动,较实验一,实验二的编程难度加大,但也是对我编程能力的考验,最主要的还是帮助我加深理解高斯,LU,追赶法实验名称实验三线性方程组的迭代求解实验目的和要求学习使用雅可比迭代法或高斯-赛德尔迭代法求解线性方程组,体会直接解法和迭代解法的不同实验内容使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解主要仪器设备惠普笔记本,wintc,microsoftvisualstudio2010实验记录写出实验内容中的程序代码和运行结果程序雅可比迭代#includestdio.h#include__th.hvoid__in{floata
[3]
[3]={{10-1-2}{-110-2}{-1-15}}b
[3]={
7.
28.
34.2};floatx
[3]={000}sum1;intijkn=3;fork=0;k10;k++{fori=0;i3;i++{sum1=0;forj=0;jn;j++{ifi==jcontinue;sum1=sum1+a[i][j]*x[j];}x[i]=b[i]-sum1/a[i][i];}fori=0;in;i++{printfx[%d]=%fi+1x[i];}printf\n;}getch;}运行结果实验结果和分析通过实验加上自己对高斯-赛德尔迭代法的理解发现,雅克比迭代公式简单,每迭代一次只须计算一次矩阵和向量的乘法,在计算机运算时需要两组存储单元,以存放xk及xk+1但利用高斯-赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求心得体会实验我选择了雅可比迭代发来解方程组,因为自身对这种方法不太熟悉,所以借此机会弄清楚实验名称实验四代数插值和最小二乘法拟合实验目的和要求代数插值学习使用拉格朗日插值法或牛顿插值法求解最小二乘法拟合1.熟练运用已学计算方法求解方程组2.加深对计算方法技巧,选择正确的计算方法来求解各种方程组3.培养使用电子计算机进行科学计算和解决问题的能力实验内容代数插值使用拉格朗日插值法或牛顿插值法求解已知fx在6个点的函数值如下表所示,运用插值方法,求f
0.596的近似值x
0.
400.
550.
650.
800.
901.05fx
0.
410750.
578150.
696750.
888111.
026521.25___最小二乘法拟合给定数据点(xiyi),用最小二乘法拟合数据的多项式,并求平方误差xi
00.
50.
60.
70.
80.
91.0yi
11.
751.
962.
192.
442.
713.00主要仪器设备惠普笔记本,wintc,microsoftvisualstudio2010实验记录写出实验内容中的程序代码和运行结果程序代数插值#includeStdAfx.h#includestdio.h#includestdlib.h#includeiostreamusingnamespa__std;typedefstructdata{floatx;floaty;}Data;//变量x和函数值y的结构Datad
[20];//最多__组数据floatfintsintt//牛顿插值法,用以返回插商{ift==s+1returnd[t].y-d[s].y/d[t].x-d[s].x;elsereturnfs+1t-fst-1/d[t].x-d[s].x;}floatNewtonfloatxintcount{intn;while1{cout请输入n值即n次插值:;//获得插值次数cinn;ifn=count-1//插值次数不得大于count-1次break;elsesystemcls;}floatt=
1.0;floaty=d
[0].y;floatyt=
0.0;forintj=1;j=n;j++{t=x-d[j-1].x*t;yt=f0j*t;y=y+yt;}returny;}floatlagrangefloatxintcount{floaty=
0.0;forintk=0;kcount;k++//这儿默认为count-1次插值{floatp=
1.0;//初始化pforintj=0;jcount;j++{//计算p的值ifk==jcontinue;//判定是否为同一个数p=p*x-d[j].x/d[k].x-d[j].x;}y=y+p*d[k].y;//求和}returny;//返回y的值}void__in{floatxy;intcount;while1{cout请输入x[i]y[i]的组数,不得超过20组:;//要求用户输入数据组数cincount;ifcount=20break;//检查输入的是否合法systemcls;}//获得各组数据forinti=0;icount;i++{cout请输入第i+1组x的值:;cind[i].x;cout请输入第i+1组y的值:;cind[i].y;systemcls;}cout请输入x的值:;//获得变量x的值cinx;while1{while1{intchoi__=3;cout请您选择使用哪种插值法计算endl;cout0:退出endl;cout1:Lagrangeendl;cout2:Newtonendl;cout输入你的选择;cinchoi__;//取得用户的选择项ifchoi__==2{cout你选择了牛顿插值计算方法,其结果为;y=Newtonxcount;break;//调用相应的处理函数}ifchoi__==1{cout你选择了拉格朗日插值计算方法,其结果为;y=lagrangexcount;break;//调用相应的处理函数}ifchoi__==0break;systemcls;cout输入错误!!!!endl;}coutxyendl;//输出最终结果}}最小二乘法拟合多项式#includestdafx.h#includeiostream#defineN15usingnamespa__std;doublepowerdoubleaintn{doubleb=1;forinti=0;in;i++b*=a;returnb;}voidGauss;doubleX[N]Y[N]sumX[N]sumY[N]a[N][N]b[N]l[N][N]x[N];void__in{doubles;intijknindex;cout请输入已知点的个数n=;cinn;coutendl;cout请输入X和Y:endl;fori=0;in;i++{coutX[i]=;cinX[i];sumX
[1]+=X[i];coutY[i]=;cinY[i];sumY
[1]+=Y[i];}coutsumX
[1]=sumX
[1]\tsumY
[1]=sumY
[1]endl;cout请输入拟合次数index=;cinindex;coutendl;i=n;sumX
[0]=i;fori=2;i=2*index;i++{sumX[i]=0;forj=0;jn;j++sumX[i]+=powerX[j]i;coutsumX[i]=sumX[i]endl;}fori=2;i=index+1;i++{sumY[i]=0;forj=0;jn;j++sumY[i]+=powerX[j]i-1*Y[j];coutsumY[i]=sumY[i]endl;}fori=1;i=index+1;i++{//建立正规方程组forj=1;j=index+1;j++a[i][j]=sumX[i+j-2];b[i]=sumY[i];}k=1;//用高斯消元法解方程组do{forj=k+1;j=index+1;j++l[j][k]=a[j][k]/a[k][k];fori=k+1;i=index+1;i++{forj=k+1;j=index+1;j++a[i][j]=a[i][j]-l[i][k]*a[k][j];b[i]=b[i]-l[i][k]*b[k];}ifk==index+1break;k++;}while1;x[index+1]=b[index+1]/a[index+1][index+1];fori=index;i=1;i--{s=0;forj=i+1;j=index+1;j++s=s+a[i][j]*x[j];x[i]=b[i]-s/a[i][i];}cout拟合系数为:;fori=1;i=index+1;i++coutx[i]\t;doublem=0;coutendl平方误差为:;fori=0;in;i++{doublet=x
[1]+x
[2]*X[i]-Y[i];m=m+powert2;}coutmendl;}运行结果代数插值最小二乘法拟合多项式实验结果和分析拉格朗日插值的优点是插值多项式特别容易建立,缺点是增加节点是原有多项式不能利用,必须重新建立,即所有基函数都要重新计算,这就造成计算量的浪费在最小二乘法拟合多项式程序中,选择了用高斯法求解方程组数据拟合的具体作法是对给定的数据(xiyi)(i=01…m),在取定的函数类中,求px属于此函数类,使误差ri=pxi-yii=01…m的平方和最小,即∑ri2=∑(∑pxi-yi)2=min,从几何意义上讲,就是寻求与给定点(xiyi)(i=01…m)的距离平方和为最小的曲线y=px心得体会(遇到的问题和解决方法)代数插值程序中,将拉格朗日插值法和牛顿插值法写到了一起,这就需要选择功能供使用者选择计算方法,于是我运行了“choi__”实现了这一功能通过实验,我也熟悉了两种插值方法以及学会了用最小二乘法拟合数据的多项式,并求平方误差这次实验也用到了实验二的高斯消元法,说明知识是要融会贯通的,也要学会相互运用。