1、太原理工大学数值计算实验报告讲解本科实验报告课程名称: 计算机数值方法 实验项目: 方程求根,线性方程组的直接求解, 线性方程组的迭代求解,代数插值和最小二乘法拟合 实验地点: 软件楼208 专业班级: 学号: 学生姓名: 指导教师: 李志 崔冬华 2015年6 月 5 日学生姓名实验成绩实验名称 实验一 方程求根实验内容和要求(必填)目的:数值计算方法是一门实践性和实用性都很强的课程,学习的目的在于应用已有的理论基础和技术方法,实现对实际计算问题的计算机求解。本实验配合计算数值方法课堂教学,通过上机实践实验环节,巩固课堂和书本上所学的知识、加强实践能力、提高解决实际计算问题的水平、启发创新思
2、想。其基本目的是:(1) 培养理论联系实际的思路,训练综合运用已经学过的理论和实际知识去分析和解决实际问题的能力。(2) 帮助学生全面消化已学的相关课程内容,深刻理解计算数值方法课程的内涵,培养使用电子计算机进行科学计算和解决问题的能力。(3) 进行基本技能训练和巩固。使学生得到选择算法、编写程序、分析数值结果、写数值试验报告、课堂讨论等环节的综合训练。要求:(1) 应用结构化程序设计编出通用程序,源程序要有详细的注释和说明;(2) 比较计算结果,分析数值解误差的原因;(3) 实验完成,要求提交实验结果并写出报告,分析计算结果是否符合问题的要求,找出计算成功的原因或计算失败的教训。实验原理(必
3、填)选择上述方法中的两种方法求方程:f(x)=x3+4x2-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#includeiostreamusing namespace std;float main() float c,a=1.0,b=2.0; /cinab; wh
4、ile(1) c=b-(b*b*b+4*b*b-10)*(b-a)/(b*b*b+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消
5、元法、LU分解法或追赶法求解下列方程组: 1 、2、3、4、(n=5,10,100,)主要仪器设备台式或笔记本计算机实验记录(写出实验内容中的程序代码和运行结果)(可分栏或加页) Gauss消元法:#include stdafx.h#includestdio.h#includeiostreamusing namespace std; float main() float a34=1,2,3,14,0,1,2,8,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+)
6、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 #define L 30 double a L L , b L , l L L , u L L , x L , y L ; int main() int
7、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;
8、 r k; +r ) u k j -= l k r * u r j ; for ( i = k + 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
9、( i = 1; i = n; +i ) printf( %0.2lfn, x i ); return 0;追赶法:#include stdafx.h#include stdio.hvoid main() FILE *f; double a15,b15,c15,d15; 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%l
10、f,&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文件中的内容是:52 1 -71 2 1 -5 1 2 1 -5 1 2 1 -5 1 2 -5实验结果和分析Gauss消元法:心得体会(遇到的问题和解决方法)在调试过程中发现自己还是很粗心,容易犯简单错误,在今后应该多编写程序。实验名称 实验三 线性方程组的迭代求解实验内容和要求学习使用雅可比迭代法或高斯-赛德尔迭代法实验
11、原理主要仪器设备台式或笔记本计算机实验记录(写出实验内容中的程序代码和运行结果)(可分栏或加页)高斯-赛德尔迭代法:#include stdafx.h#include stdio.h#include math.hvoid 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,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
12、;j+) sum2=sum2+aij*xj; xi=(bi-sum1-sum2)/aii; for(i=0;in;i+) printf(x%d=%f,i+1,xi); printf(n); 雅克比迭代:#include stdafx.h#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) cont
13、inue; sum1=sum1+aij*xj; xi=(bi-sum1)/aii; for(i=0;in;i+) printf(x%d=%f,i+1,xi);printf(n); 实验结果和分析结果:高斯-赛德尔迭代法:雅克比迭代:分析:使用高斯-赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯-赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。心得体会(遇到的问题和解决方法)高斯迭代法比雅克比迭代迭代速度快,所以在编程时选择了高斯迭代法。实验名称 实验四 代数插值和最小二乘法拟合实验内容和要求 实验内容:使用拉格朗日插值法求解:已知f(x)在6个点的函数值如下表所示,运用
14、插值方法,求f(0.596)的近似值。x0.400.550.650.800.901.05f(x)0.410750.578150.696750.888111.026521.25386实验要求:1了解拉格朗日插值法的基本方法、基本原理。 2通过编写程序,进行算法设计和数值求解。实验原理拉格朗日基函数为:拉格朗日插值多项式为:主要仪器设备台式或笔记本计算机实验记录(写出实验内容中的程序代码和运行结果)(可分栏或加页)#include#include#includetypedef struct data float x; float y;Data; Data d20; float f(int s,in
15、t 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) 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 la
16、grange(float x,int count) float y=0.0; for(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+1
17、di.y; system(cls); coutx; 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; 实验结果和分析分析:拉格朗日插值的优点是插值多项式特别容易建立,缺点是增加节点是原有多项式不能利用,必须重新建立,即所有基函数都要重新计算,这就造成计算量的浪费。心得体会(遇到的问题和解决方法)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1