计算机数值方法实验报告.doc_第1页
计算机数值方法实验报告.doc_第2页
计算机数值方法实验报告.doc_第3页
计算机数值方法实验报告.doc_第4页
计算机数值方法实验报告.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本科实验报告课程名称: 计算机数值方法 实验项目:实验一:方程求根 实验二:线性方程组的直接解法 实验三:线性方程组的迭代解法 实验四:代数插值和最小二乘法拟 合多项式 实验地点: 逸夫302 专业班级: 学号: 学生姓名: 指导教师: 2013年 4 月 15 日学生姓名实验成绩实验名称 实验一 方程求根实验目的和要求(1)了解非线性方程求根的常见方法,如二分法、牛顿法、割线法。(2)加深对方程求根方法的认识,掌握算法。(3)会进行误差分析,并能对不同方法进行比较。实验内容和原理内容:使用二分法和迭代法求方程:f(x)=x3+4x2-10=0在1,2内的一个实根,且要求满足精度|x*-xn|0.510-5。原理:二分法: f(x)在区间(x,y)上连续,先找到a、b属于区间(x,y),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f(a+b)/2, 以此类推,通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值;迭代法: 用迭代公式x=f(x)进行迭代计算,直到满足|x*-xn|0.510-5 为止 。主要仪器设备惠普笔记本,wintc,microsoft visual studio2010实验记录(写出实验内容中的程序代码和运行结果)程序:二分法: #include#includedouble f(double x) return x*x*x+4*x*x-10;main() double t1=1,t2=2; double t=(t1+t2)/2; double f(double x); while(fabs(f(t)=5e-6) /精度设置 if(f(t1)*f(t)=0) t2=t; t=(t1+t2)/2; else if(f(t2)*f(t)5e-6); printf(x=%f,a); getch();运行结果:二分法:迭代法:实验结果和分析可包括: 实验中的两种方法都存在不同程度的误差,由于数据进行了小数位数保留加上计算方法导致两种方法计算结果稍有偏差。不同的方法存在不同误差,可以不同程度的求得方程的解,不同的方法速度不同心得体会 本次实验首先我学到了fabs()是用于求绝对值的,而且我复习了二分法和迭代法的原理,虽然这两个是比较小的程序,但还是考验了我的细心程度。实验名称 实验二 线性方程组的直接求解实验目的和要求(1)了解线性方程组常见的直接解法,如Guass消元法、LU分解法、追赶法。(2)加深对线性方程组求解方法的认识,掌握算法。(3)会进行误差分析,并能对不同方法进行比较。实验内容合理选择利用Gauss消元法、LU分解法、追赶法求解下列方程组:(n=5,10,100,)主要仪器设备惠普笔记本,wintc,microsoft visual studio2010实验记录(写出实验内容中的程序代码和运行结果)程序:Gauss消元法:#include stdio.hdouble a1515,a01515;double b15,b015,l15;int n;void displayA() int i,j; printf(n); for(j=1;j=n;j+) for(i=1;i=n;i+) printf(a%d%d=%f ,j,i,aji); printf(b%d=%fn,j,bj); void main() int i,j,k; printf(shu ru n:); scanf(%d,&n); printf(shu ru yuan su:); for(i=1;i=n;i+) for(j=1;j=n;j+) scanf(%lf,&aij); a0ij=aij; scanf(%lf,&bi); b0i=bi; displayA(); k=1; do for(i=1;i=n;i+) if(i=k) continue; li=a0ik/a0kk; for (j=k+1;j=n;j+) akj=a0kj/a0kk; bk=b0k/a0kk; for(i=1;i=n;i+) if(i=k) continue; for(j=k+1;j=n;j+) aij=a0ij-li*a0kj; bi=b0i-li*b0k; for(i=1;i=n;i+) for(j=k+1;j=n;j+) a0ij=aij; b0i=bi; if(k=n) break; k+; while(1); for(i=1;i=n;i+) printf(x%d=b%2d=%lfn,i,i,bi); getch();LU分解法:#include #include #define L 30double aLL,bL,lLL,uLL,xL,yL;int main() int n,i,j,k,r; printf(input n:); scanf(%d,&n); printf(input yuan sun); for(i=1;i=n;+i) for(j=1;j=n;+j) scanf(%lf,&aij); for(i=1;i=n;+i) scanf(%lf,&bi); for(i=1;i=n;+i) for(j=1;j=n;+j) lij=0; uij=0.0; for(k=1;k=n;+k) for(j=k;j=n;+j) ukj=akj; for (r=1;rk;+r) ukj-=lkr*urj; for(i=k+1;i=n;+i) lik=aik; for(r=1;rk;+r) lik-=lir*urk; lik/=ukk; lkk=1.0; for(i=1;i=n;+i) yi=bi; for(j=1;j0;-i) xi=yi; for(j=i+1;j=n;+j) xi-=uij*xj; xi/=uii; for(i=1;i=n;+i) printf(x%d=%0.2lfn,i,xi); getch(); 追赶法:#include stdio.hmain() double a15,b15,c15,d15; double t; int i,n; printf(input n:); scanf(%d,&n); printf(input yuan sun); scanf(%lf%lf%lf,&b1,&c1,&d1); for(i=2;i=n-1;i+) scanf(%lf%lf%lf%lf,&ai,&bi,&ci,&di); scanf(%lf%lf%lf,&an,&bn,&dn); c1=c1/b1; d1=d1/b1; for(i=2;i=1;i-) di=di-ci*di+1; printf(n*n); for(i=1;i=n;i+) printf(d%2d=%lfn,i,di);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,microsoft visual studio2010实验记录(写出实验内容中的程序代码和运行结果)程序:雅可比迭代:#include #include void main() float a33=10,-1,-2,-1,10,-2,-1,-1,5,b3=7.2,8.3,4.2; float x3=0,0,0,sum1; int i,j,k,n=3; for (k=0;k10;k+) for(i=0;i3;i+) sum1=0; for(j=0;jn;j+) if(i=j) continue; sum1=sum1+aij*xj; xi=(bi-sum1)/aii; for(i=0;in;i+) printf(x%d=%f,i+1,xi); printf(n); getch();运行结果:实验结果和分析通过实验加上自己对高斯-赛德尔迭代法的理解发现,雅克比迭代公式简单,每迭代一次只须计算一次矩阵和向量的乘法,在计算机运算时需要两组存储单元,以存放x(k)及x(k+1)。但利用高斯-赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。心得体会 实验我选择了雅可比迭代发来解方程组,因为自身对这种方法不太熟悉,所以借此机会弄清楚。实验名称 实验四 代数插值和最小二乘法拟合实验目的和要求代数插值:学习使用拉格朗日插值法或牛顿插值法求解最小二乘法拟合: 1熟练运用已学计算方法求解方程组 2加深对计算方法技巧,选择正确的计算方法来求解各种方程组3培养使用电子计算机进行科学计算和解决问题的能力实验内容代数插值:使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。x0.400.550.650.800.901.05f(x)0.410750.578150.696750.888111.026521.25386最小二乘法拟合: 给定数据点(xi ,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60.70.80.91.0yi11.751.962.192.442.713.00主要仪器设备惠普笔记本,wintc,microsoft visual studio2010实验记录(写出实验内容中的程序代码和运行结果)程序:代数插值:#include#include#include#includeusing namespace std;typedef struct data float x; float y;Data; /变量x和函数值y的结构Data d20; /最多二十组数据float f(int s,int t) /牛顿插值法,用以返回插商 if(t=s+1) return (dt.y-ds.y)/(dt.x-ds.x); else return (f(s+1,t)-f(s,t-1)/(dt.x-ds.x); float Newton(float x,int count) int n; while(1) coutn; if(n=count-1)/ 插值次数不得大于count1次 break; else system(cls); float t=1.0; float y=d0.y; float yt=0.0; for(int j=1;j=n;j+) t=(x-dj-1.x)*t; yt=f(0,j)*t; y=y+yt; return y;float lagrange(float x,int count) float y=0.0; for(int k=0;kcount;k+)/这儿默认为count1次插值 float p=1.0;/初始化p for(int j=0;jcount;j+) /计算p的值 if(k=j)continue;/判定是否为同一个数 p=p*(x-dj.x)/(dk.x-dj.x); y=y+p*dk.y;/求和 return y;/返回y的值void main() float x,y; int count; while(1) coutcount; if(count=20) break;/检查输入的是否合法 system(cls); /获得各组数据 for(int i=0;icount;i+) cout请输入第i+1di.x; cout请输入第i+1di.y; system(cls); coutx; while(1) while(1) int choice=3; cout请您选择使用哪种插值法计算:endl; cout (0):退出endl; cout (1):Lagrangeendl; cout (2):Newtonendl; coutchoice;/取得用户的选择项 if(choice=2) cout你选择了牛顿插值计算方法,其结果为:; y=Newton(x,count);break;/调用相应的处理函数 if(choice=1) cout你选择了拉格朗日插值计算方法,其结果为:; y=lagrange(x,count);break;/调用相应的处理函数 if(choice=0) break; system(cls); cout输入错误!endl; coutx , yendl;/输出最终结果最小二乘法拟合多项式:#includestdafx.h#includeiostream#define N 15using namespace std;double power(double &a,int n)double b=1;for(int i=0;in;i+)b*=a;return b;void Gauss();double XN,YN,sumXN,sumYN,aNN,bN,lNN,xN;void main()double s;int i,j,k,n,index;coutn;coutendl;cout请输入X和Y:endl; for(i=0;in;i+)coutXiXi;sumX1+=Xi;coutYiYi;sumY1+=Yi;coutsumX1=sumX1tsumY1=sumY1endl;coutindex;coutendl;i=n;sumX0=i; for(i=2;i=2*index;i+)sumXi=0;for(j=0;jn;j+)sumXi+=power(Xj,i);coutsumXi=sumXiendl; for(i=2;i=index+1;i+)sumYi=0;for(j=0;jn;j+)sumYi+=power(Xj,i-1)*Yj;coutsumYi=sumYiendl;for(i=1;i=index+1;i+) /建立正规方程组for(j=1;j=index+1;j+)aij=sumXi+j-2;bi=sumYi; k=1; /用高斯消元法解方程组dofor(j=k+1;j=index+1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论