《太原理工大学数值计算实验报告32201.pdf》由会员分享,可在线阅读,更多相关《太原理工大学数值计算实验报告32201.pdf(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 本科实验报告 课程名称:计算机数值方法 实验项目:方程求根,线性方程组的直接求解,线性方程组的迭代求解,代数插值和最小二乘法拟合 实验地点:软件楼 208 专业班级:学号:学生:指导教师:志 冬华 2015 年 6 月 5 日 学生 实验成绩 实验名称 实验一 方程求根 实验容和要求(必填)目的:数值计算方法是一门实践性和实用性都很强的课程,学习的目的在于应用已有的理论基础和技术方法,实现对实际计算问题的计算机求解。本实验配合计算数值方法课堂教学,通过上机实践实验环节,巩固课堂和书本上所学的知识、加强实践能力、提高解决实际计算问题的水平、启发创新思想。其基本目的是:(1)培养理论联系实际的思
2、路,训练综合运用已经学过的理论和实际知识去分析和解决实际问题的能力。(2)帮助学生全面消化已学的相关课程容,深刻理解计算数值方法课程的涵,培养使用电子计算机进行科学计算和解决问题的能力。(3)进行基本技能训练和巩固。使学生得到选择算法、编写程序、分析数值结果、写数值试验报告、课堂讨论等环节的综合训练。要求:(1)应用结构化程序设计编出通用程序,源程序要有详细的注释和说明;(2)比较计算结果,分析数值解误差的原因;(3)实验完成,要求提交实验结果并写出报告,分析计算结果是否符合问题的要求,找出计算成功的原因或计算失败的教训。实验原理(必填)选择上述方法中的两种方法求方程:f(x)=x3+4x2-
3、10=0 在1,2的一个实根,且要求满足精度|x*-xn|a;float t,x;x=a;do x=sqrt(10-x*x*x)/4);t=a;a=x;while(fabs(a-t)0.5*1e-5);printf(x=%f,a);system(pause);割线法:#include stdafx.h#includestdio.h#includemath.h#includeiostream using namespace std;float main()float c,a=1.0,b=2.0;/cinab;while(1)c=b-(b*b*b+4*b*b-10)*(b-a)/(b*b*b+4*
4、b*b-(a*a*a+4*a*a);if(fabs(b-c)0.5*0.000001)break;b=c;coutc;实验结果和分析 实验结果:迭代法:割线法:心得体会(遇到的问题和解决方法)使用不同的方法,可以不同程度的求得方程的解,不同的方法速度不同。实验名称 实验二 线性方程组的直接求解 实验容和要求(1)了解线性方程组常见的直接解法,如 Guass 消元法、LU 分解法、追赶法。(2)加深对线性方程组求解方法的认识,掌握算法。(3)会进行误差分析,并能对不同方法进行比较。实验原理 合理利用 Gauss 消元法、LU 分解法或追赶法求解下列方程组:1、13814142210321321x
5、xx 2、2178.4617.5911212592.1121130.6291.51314.59103.0432115xxxx 3、3772201161263841027851244321xxxx 4、55572112112112121nnxxxx(n=5,10,100,)主要仪器设备 台式或笔记本计算机 实验记录(写出实验容中的程序代码和运行结果)(可分栏或加页)Gauss消元法:#include stdafx.h#includestdio.h#includeiostream using namespace std;float main()float a34=1,2,3,14,0,1,2,8,
6、2,4,1,13;float x3;float sum=0;int k,i,j;for(k=0;k2;k+)for(i=k+1;i3;i+)for(j=k+1;j4;j+)aij=aij-aik/akk*akj;for(i=0;i3;i+)for(j=0;j4;j+)printf(a%d%d=%f,i,j,aij);cout=0;k-)sum=0;for(j=k+1;j3;j+)sum+=akj*xj;xk=(ak3-sum)/akk;for(i=0;i3;i+)printf(x%d=%f,i+1,xi);LU 分解法:#include stdafx.h#include#include#def
7、ine L 30 double a L L,b L,l L L,u L L,x L,y L;int main()int n,i,j,k,r;scanf(%d,&n);for(i=1;i=n;+i)for(j=1;j=n;+j)scanf(%lf,&a i j );for(i=1;i=n;+i)scanf(%lf,&b i );for(i=1;i=n;+i)for(j=1;j=n;+j)l i j =0;u i j =0.0;for(k=1;k=n;+k)for(j=k;j=n;+j)u k j =a k j;for(r=1;r k;+r)u k j -=l k r *u r j;for(i=k
8、+1;i=n;+i)l i k =a i k;for(r=1;r k;+r)l i k -=l i r *u r k;l i k /=u k k;l k k =1.0;for(i=1;i=n;+i)y i =b i;for(j=1;j 0;-i)x i =y i;for(j=i+1;j=n;+j)x i -=u i j *x j;x i /=u i i;for(i=1;i=n;+i)printf(%0.2lfn,x i );return 0;追赶法:#include stdafx.h#include stdio.h void main()FILE*f;double a15,b15,c15,d1
9、5;double t;int i,n;f=fopen(zgf.txt,r);fscanf(f,%d,&n);fscanf(f,%lf%lf%lf,&b1,&c1,&d1);for(i=2;i=n-1;i+)fscanf(f,%lf%lf%lf%lf,&ai,&bi,&ci,&di);fscanf(f,%lf%lf%lf,&an,&bn,&dn);fclose(f);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);Zgf.txt文件中的容是:5 2 1
10、 -7 1 2 1 -5 1 2 1 -5 1 2 1-5 1 2-5 实验结果和分析 Gauss 消元法:心得体会(遇到的问题和解决方法)在调试过程中发现自己还是很粗心,容易犯简单错误,在今后应该多编写程序。实验名称 实验三 线性方程组的迭代求解 实验容和要求 学习使用雅可比迭代法或高斯-赛德尔迭代法 实验原理 主要仪器设备 台式或笔记本计算机 实验记录(写出实验容中的程序代码和运行结果)(可分栏或加页)高斯-赛德尔迭代法:#include stdafx.h#include stdio.h#include math.h void main()float a33=10,-1,-2,-1,10,
11、-2,-1,-1,5,b3=7.2,8.3,4.2;float x3=0,0,0,sum1,sum2;int i,j,k,n=3;for(k=0;k10;k+)for(i=0;in;i+)sum1=0;sum2=0;for(j=0;ji;j+)sum1=sum1+aij*xj;for(j=i+1;j3;j+)sum2=sum2+aij*xj;xi=(bi-sum1-sum2)/aii;for(i=0;in;i+)2.453.82102.7210321321321xxxxxxxxx printf(x%d=%f,i+1,xi);printf(n);雅克比迭代:#include stdafx.h#i
12、nclude#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);实验结果和分析 结果:高斯-赛德尔迭代法:雅克比迭代:分析:使用高斯-赛德尔和雅克比迭
13、代都可以求出方程组的解,但是利用高斯-赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。心得体会(遇到的问题和解决方法)高斯迭代法比雅克比迭代迭代速度快,所以在编程时选择了高斯迭代法。实验名称 实验四 代数插值和最小二乘法拟合 实验容和要求 实验容:使用拉格朗日插值法求解:已知 f(x)在 6 个点的函数值如下表所示,运用插值方法,求 f(0.596)的近似值。x 0.40 0.55 0.65 0.80 0.90 1.05 f(x)0.41075 0.57815 0.69675 0.88811 1.02652 1.25386 实验要求:1了解拉格朗日插值法的基本方法、基本原理。
14、2通过编写程序,进行算法设计和数值求解。实验原理 拉格朗日基函数为:nixxxxxxxxxxxxxxxxxxxxxlniiiiiiiniii,1,0)()()()()()()(11101110 拉格朗日插值多项式为:niiinnnxlyxlyxlyxlyxL01100)()()()()(主要仪器设备 台式或笔记本计算机 实验记录(写出实验容中的程序代码和运行结果)(可分栏或加页)#include#include#include typedef struct data float x;float y;Data;Data d20;float f(int s,int t)if(t=s+1)retur
15、n(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)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;f
16、or(int k=0;kcount;k+)float p=1.0;for(int j=0;jcount;j+)if(k=j)continue;p=p*(x-dj.x)/(dk.x-dj.x);y=y+p*dk.y;return 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)int choice=3;cout请您选择使用哪种
17、插值法计算: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;实验结果和分析 分析:拉格朗日插值的优点是插值多项式特别容易建立,缺点是增加节点是原有多项式不能利用,必须重新建立,即所有基函数都要重新计算,这就造成计算量的浪费。心得体会(遇到的问题和解决方法)