计算数值实验报告(太原理工大学)_第1页
计算数值实验报告(太原理工大学)_第2页
计算数值实验报告(太原理工大学)_第3页
计算数值实验报告(太原理工大学)_第4页
计算数值实验报告(太原理工大学)_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上本科实验报告课程名称: 计算数值方法 实验地点: 综合楼五层506室 专业班级:计科1002 学号: 学生姓名: xxx 指导教师: 王峥 2012 年 6 月 20 专心-专注-专业太原理工大学学生实验报告学院名称计算机科学与技术专业班级计科 1002学号学生姓名 xxx实验日期2012.6.5成绩课程名称计算数值方法实验题目实验一 方程求根一、课题名称方程求根:熟悉使用、迭代法、牛顿法、割线法等方法对给定的方程进行根的求解。选择上述方法中的两种方法求方程:二分法f(x)=x3+4x2-10=0在1,2内的一个实根,且要求满足精度|x*-xn|<0.5

2、5;10-5迭代法:用迭代公式x=f(x)进行迭代计算,直到满足|x*-xn|<0.5×10-5 为止 。二分法:设f(x)在a,b上连续,且f(a1)*f(x1)<0,记(a2,b2)=(x1,b1)带入计算式进行计算 直到 |x*-xn|<0.5×10-5 为止 。二、目的和意义(1)了解非线性方程求根的常见方法,如二分法、迭代法、牛顿法、割线法。(2)加深对方程求根方法的认识,掌握算法。会进行误差分析,并能对不同方法进行比较。三、计算公式(1)迭代法 1).首先对给定的计算公式进行变形使其能够迭代或者找出相应迭代速度较快的式子。 2).带入求好的式子

3、到循环中去比如:(2)二分法:f(x)在区间(x,y)上连续 1).先找到a、b属于区间(x,y),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f(a+b)/2, 2).如果f(a+b)/2=0,该点就是零点, 如果f(a+b)/2<0,则在区间((a+b)/2,b)内有零点,反之在(a,(a+b)/2)内有零点 带入1)中继续。四、主要仪器设备Vc+ 9.0 C-free CodeBlocks五、结构程序设计迭代法: #include<stdio.h> #include<math.h> main() int i; double xn15,y

4、,x1,x2,m ; printf("请输入x1,x2的值:n" ); scanf("%lf%lf",&x1,&x2); printf("请输入精度要求:n" ); scanf("%lf",&m); printf(" n xnn");i=0; do xn0=(x1+x2)/2 ; xni+1= sqrt(10/(4+xni); /迭代printf("%5d %5lfn",i,xni); y= fabs(xni+1-xni) ; i+; if(y<

5、m)break;while(1); 二分法:#include<stdio.h> #include<math.h> main() int m,n,o,p; double a,b,l; printf("请输入x3, x2, x的系数和常数p:n");scanf("%d%d%d%d",&m,&n,&o,&p); /1 4 0 -10 printf("请输入x1,x2:n");scanf("%lf%lf",&a,&b); /1 2 printf(&qu

6、ot;请输入精度要求:n");scanf("%lf",&l); /0.5x105 printf(" n an bn xn f(xn)n"); double x,fx; int i=1; do x=(b+a)/2; fx=m*x*x*x+n*x*x+o*x+p; printf("%5d %5f %5f %5f %5fn",i,a,b,x,fx); i+; if(fx=0) break; if(fx>0) b=x; else if(fx<0) a=x; if(b-a)<l) break; /进行计算并返

7、值 while(1);六、结果讨论和分析 二分法: 迭代法: 分析讨论:使用不同的方法,可以不同程度的求得方程的解,不同的方法速度不同,求得的结果也稍有区别,当然和要求精度也有关系。刚开始的时候用数组对二分法进行求解,发现 循环到第二次 就无法实现值的传递,于是换了另外一种方法代替了数组。流程图:实验地点综合楼五层506室指导教师王峥太原理工大学学生实验报告学院名称计算机科学与技术专业班级计科 1002学号学生姓名 xxx实验日期2012.6.5成绩课程名称计算数值方法实验题目实验二 线性方程组的直接解法一、课题名称线性方程组的直接解法合理利用Gauss消元法、LU分解法、追赶法求解下列方程组

8、: (n=5,10,100)二、目的和意义(1)了解线性方程组常见的直接解法,如Guass消元法、LU分解法、追赶法。(2)加深对线性方程组求解方法的认识,掌握算法。(3)会进行误差分析,并能对不同方法进行比较。三、计算公式 高斯分解法:将原方程组化为三角形方阵的方程组:lik=aik/akk aij= aij- lik* akj k=1,2,n-1 i=k+1,k+2, ,n j=k+1,k+2, ,n+1由回代过程求得原方程组的解: xn= ann+1/ ann xk=( akn+1-akj xj)/ akk (k=n-1,n-2, ,2,1) LU分解法:将系数矩阵A转化为A=L*U,

9、L为单位下三角矩阵,U为普通上三角矩阵,然后通过解方程组l*y=b,u*x=y,来求解x.追赶法:用来求对角方程组;将系数矩阵A转化为A=L*U, L为普通下n-1对角矩阵,U为单位上n-1对角矩阵,然后通过解方程组l*y=b,u*x=y,来求解x.四、主要仪器设备Vc+ 9.0 C-free CodeBlocks五、结构程序设计 Gauss消元法: #include <iostream>#include <cmath>using namespace std;int main()int n,i,j,k;double a100100,b100,o;cout<<

10、"输入未知数个数:"<<endl; cin>>n;cout<<"输入数列:"<<endl; for (i=1;i<=n;i+)for (j=1;j<=n+1;j+)cin>>aij;for (i=1;i<=n;i+)for (j=i+1;j<=n;j+)if (fabs(aji)>1e-7)o=aii/aji;for (k=i;k<=n+1;k+)ajk=ajk*o-aik;for (i=n;i>0;i-)bi=ain+1/aii;for (j=i-1;

11、j>0;j-)ajn+1=ajn+1-bi*aji;cout<<"解得:"<<endl;for (i=1;i<=n;i+) cout<<bi<<endl;/system("pause");return 0;列主元素消元法: #include<iostream> #include<cmath> #define N 20 using namespace std; void load(); float aNN; int m; int main() int i,j; int c,

12、k,n,p,r; float xN,lNN,s,d; cout<<"下面请输入未知数的个数m=" cin>>m; cout<<endl; cout<<"请按顺序输入增广矩阵a:"<<endl; load(); for(i=0;i<m;i+) for(j=i;j<m;j+) c=(fabs(aji)>fabs(aii)?j:i; /*找列最大元素*/ for(n=0;n<m+1;n+) s=ain; ain=acn; acn=s; /*将列最大数防在对角线上*/ for(p

13、=0;p<m+1;p+) cout<<aip<<"t" cout<<endl; for(k=i+1;k<m;k+) lki=aki/aii; for(r=i;r<m+1;r+) /*化成三角阵*/ akr=akr-lki*air; xm-1=am-1m/am-1m-1; for(i=m-2;i>=0;i-) d=0; for(j=i+1;j<m;j+) d=d+aij*xj; xi=(aim-d)/aii; /*求解*/ cout<<"该方程组的解为:"<<endl

14、; for(i=0;i<m;i+) cout<<"x"<<i<<"="<<xi<<"t" return 0; void load() int i,j; for(i=0;i<m;i+) for(j=0;j<m+1;j+) cin>>aij; LU分解法:#include<stdio.h> void solve(float l100,float u100,float b,float x,int n) int i,j; float t,s1

15、,s2; float y100; for(i=1;i<=n;i+) /* 第一次回代过程开始 */ s1=0; for(j=1;j<i;j+) t=-lij; s1=s1+t*yj; yi=(bi+s1)/lii; for(i=n;i>=1;i-) /* 第二次回代过程开始*/ s2=0; for(j=n;j>i;j-) t=-uij; s2=s2+t*xj; xi=(yi+s2)/uii; void main() float a100100,l100100,u100100,x100,b100; int i,j,n,r,k; float s1,s2; for(i=1;i

16、<=99;i+)/*将所有的数组置零,同时将L矩阵的对角值设为1*/ for(j=1;j<=99;j+) lij=0,uij=0; if(j=i) lij=1; printf ("输入方程组的个数 n:n");/*输入方程组的个数*/ scanf("%d",&n); printf ("读取原矩阵 A(x的系数):n");/*读取原矩阵A*/ for(i=1;i<=n;i+) for(j=1;j<=n;j+) scanf("%f",&aij); printf ("读取

17、列矩阵 B(y的值):n");/*读取列矩阵B*/ for(i=1;i<=n;i+) scanf("%f",&bi); for(r=1;r<=n;r+)/*求解矩阵L和U*/ for(i=r;i<=n;i+) s1=0; for(k=1;k<=r-1;k+) s1=s1+lrk*uki; uri=ari-s1; for(i=r+1;i<=n;i+) s2=0; for(k=1;k<=r-1;k+) s2=s2+lik*ukr; lir=(air-s2)/urr; printf("输出矩阵 L:n");

18、/输出矩阵Lfor(i=1;i<=n;i+) for(j=1;j<=n;j+) printf("%7.3f ",lij); printf("n"); printf("输出矩阵 U:n");/输出矩阵U for(i=1;i<=n;i+) for(j=1;j<=n;j+) printf("%7.3f ",uij); printf("n"); solve(l,u,b,x,n); printf("解为:n"); for(i=1;i<=n;i+) prin

19、tf("x%d=%fn",i,xi); 追赶法: #include<stdio.h> #define N 3 main() double A33,b3; printf("请按顺序输入x的系数:n"); int a,c; for(a=0;a<3;a+) for(c=0;c<3;c+) scanf("%lf",&Aac); printf("请按顺序输入y的值:n"); int k; for(k=0;k<3;k+)scanf("%lf",&bk); int

20、 i; A01=A01/A00; for(i=1;i<2;i+) Aii+1=Aii+1/(Aii-Aii-1*Ai-1i); for(i=1;i<3;i+) Aii=Aii-Aii-1*Ai-1i; b0=b0/A00; for(i=1;i<3;i+) bi=(bi-Aii-1*bi-1)/Aii; for(i=1;i>=0;i-) bi=bi-Aii+1*bi+1; for(i=0;i<3;i+) printf("x%d=%.6lfn",i,di); 六、结果讨论和分析Gauss消元法: 列主元素消元法: LU分解法: 追赶法: 分析讨论从

21、消元过程可以看出,对于n阶线性方程组,只要各步主元素不为零,经过n-1步消元,就可以得到一个等价的系数矩阵为上三角形阵的方程组,然后再利用回代过程可求得原方程组的解. 由于列主元素法相似且优于完全主元素法 所以省略了后者。消元过程相当于分解 A为单位下三角阵L与上三角阵U的乘积,解方程组Ly=b回代过程就是解方程组Ux=y。其中的L为n阶单位下三角阵、U为上三角阵. 在 A 的LU 分解中, L取下三角阵, U 取单位上三角阵,这样求解方程组Ax=d 的方法称为追赶法。另外是追赶法和其他方法求同一方程结果不一样,我多次修改源程序,也不知道原因。再就是追赶法有很大的局限性 还待改良。流程图:实验

22、地点综合楼五层506室指导教师王峥太原理工大学学生实验报告学院名称计算机科学与技术专业班级计科 1002学号学生姓名 xxx实验日期2012.6.5成绩课程名称计算数值方法实验题目实验三 线性方程组的迭代解法一、课题名称线性方程组的迭代解法使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。 二、目的和意义学习使用雅可比迭代法或高斯-赛德尔迭代法三、计算公式雅克比迭代法:设线性方程组Ax=b的系数矩阵A可逆且主对角元素a11,a22,ann均不为零,令D=diag(a11,a22,ann)并将A分解成A=(A-D)+D从而线性方程组可写成Dx=(D-A)x+b则有迭代公式x(k+1)=B

23、1x(k)+f1其中,B1=I-D-1A,f1=D-1b。四、主要仪器设备 Vc+ 9.0 C-free CodeBlocks五、结构程序设计雅克比迭代法:#include<stdio.h> #include<math.h> main() int i; double x120 ,x220,x320; double x10, x20, x30; printf("请输入x1,x2,x3的初值:n");scanf("%lf%lf%lf",&x10,&x20, &x30); printf(" n x1n

24、x2n x3n n"); for(i=0;i<18;i+) x10=x10; x20=x20; x30=x30; x1i+1=0.1*x2i+0.2*x3i+0.72;x2i+1=0.1*x1i+0.2*x3i+0.83;x3i+1=0.2*x1i+0.2*x2i+0.84;printf("%5d %5lf %5lf %5lfn",i,x1i,x2i,x3i); 六、实验结果与分析:雅克比迭代法:分析讨论: 其实,这两个迭代法是之前迭代法的升级,多了几个迭代式子而已,而且两者相差不大比较简单,所以选择了雅克比迭代法进行求解,但是没有与另一种方法 高斯赛德尔迭

25、代法进行实质性的比较。流程图:实验地点综合楼五层506室指导教师王峥太原理工大学学生实验报告学院名称计算机科学与技术专业班级计科 1002学号学生姓名 xxx实验日期2012.6.10成绩课程名称计算数值方法实验题目实验四 矩阵特征值与特征向量问题一、课题名称使用幂法求A模为最大的特征值及其相应的特征向量。二、目的和意义(1)了解矩阵特征值与特征向量问题解法,掌握幂法。(2)加深对矩阵特征值与特征向量问题求解方法的认识,掌握算法。三、计算公式幂法:由已知的非零向量x0和矩阵A的乘幂构造向量序列xn以计算矩阵A的按模最大特征值及其特征向量的方法,称为幂法。迭代公式:结果可取 四、主要仪器设备Vc

26、+ 9.0 C-free CodeBlocks五、结构程序设计源代码: #include<stdio.h>#include<math.h>#define N 3#define eps 1e-6#define KM 30float MaxValue(float x,int n) float Max=x0; int i; for (i=1;i<n;i+) if(fabs(xi)>fabs(Max)Max=xi; return Max; void PowerMethod(float *A) float UN,VN,r1,r2,temp; int i,j,k=0;

27、while(k<KM) k+; for(i=0;i<N;i+) temp=0; for(j=0;j<N;j+)temp+=*(A+i*N+j)*Uj; Vi=temp; for(i=0;i<N;i+)Ui=Vi/MaxValue(V,N); if(k=1)r1=MaxValue(V,N); else r2=MaxValue(V,N); if(fabs(r2-r1)<eps)break; r1=r2; printf("r=%fn",r2); for(i=0;i<N;i+)printf("y%d=%fn",i+1,Ui);

28、void main() float ANN=2,-1,0,-1,2,-1,0,-1,2 ;float UN; /A的值 U0=1; U1=1; U2=1;/x0的值 PowerMethod(A0);六、结果讨论和分析分析讨论由于该程序将A矩阵和x0的值编写在程序中,所以要想修改成其他矩阵时比较麻烦,所以也有一定的局限性。 幂法是一种求任意矩阵A的按模最大特征值及其对应特征向量的迭代算法。该方法的最大优点是计算简单,容易在计算机上实现,对稀疏矩阵较为适合,但有时收敛速度很慢。流程图:实验地点综合楼五层506室指导教师王峥太原理工大学学生实验报告学院名称计算机科学与技术专业班级计科 1002学号学

29、生姓名 xxx实验日期2012.6.10成绩课程名称计算数值方法实验题目 实验五 代数插值一、课题名称(使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。x0.400.550.650.800.901.05f(x)0.410750.578150.696750.888111.026521.25386二、目的和意义学习使用拉格朗日插值法或牛顿插值法求解三、计算公式设函数在区间a,b上n+1互异节点x0,x1,xn上的函数值分别为y0,y1,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj, j=0,1,n令Ln(x)=y

30、0l0(x)+y1l1(x)+ynln(x)= yili(x)其中l0(x),l1(x), ln(x) 为以x0,x1,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj, L=0,1,n再由插值多项式的唯一性,得Pn(x)Ln(x)四、主要仪器设备Vc+ 9.0 C-free CodeBlocks五、结构程序设计#include <iostream.h> #include <math.h> main() int I;char L; double M100100; double x100,y100; double X=1,xx=0

31、,w=1,N=0,P,R=1; int n=5; /cout<<"请输入所求均差阶数:" /求所有阶差 /cin>>n; /for(int i=0;i<=n;i+) / /*cout<<"请输入x"<<i<<"的值:"<<endl; cin>>xi; cout<<"请输入y"<<i<<"的值:"<<endl; cin>>yi; Mi0=xi; Mi

32、1=yi; */用二维保存所有数据 M00=0.40;M01=0.41075;M10=0.55;M11=0.57815;M20=0.65;M21=0.69675;M30=0.80;M31=0.88811;M40=0.90;M41=1.02652;M50=1.05;M51=1.25386;for( int j=2;j<=n+1;j+) for(int i=1;i<=n;i+) Mij=(Mij-1-Mi-1j-1)/(Mi0-Mi-j+10); for(int i=1;i<=n;i+) cout<<"其"<<i<<&quo

33、t;阶均差为:"<<Mii+1<<endl; cout<<"请输入x的值:x=" cin>>xx; for(int i=0;i<n;i+) X*=xx-Mi0; N+=Mi+1i+2*X; P=M01+N; cout<<"其函数值:y="<<P<<endl; / 六、结果讨论和分析分析讨论拉格朗日插值的优点是插值多项式特别容易建立,缺点是增加节点是原有多项式不能利用,必须重新建立,即所有基函数都要重新计算,这就造成计算量的浪费。所以该程序 选择了牛顿法,由

34、于在输入数据的时候比较麻烦 所以将数据存在了程序里面,只能在程序里修改数据。 另外由于精度问题计算结果有一定的误差。流程图:实验地点综合楼五层506室指导教师王峥太原理工大学学生实验报告学院名称计算机科学与技术专业班级计科 1002学号学生姓名 xxx实验日期2012.6.10成绩课程名称计算数值方法实验题目 实验六 最小二乘法拟合多项式一、课题名称给定数据点(xi ,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60.70.80.91.0yi11.751.962.192.442.713.00二、目的和意义1熟练运用已学计算方法求解方程组2加深对计算方法技巧,选择正确的计

35、算方法来求解各种方程组3培养使用电子计算机进行科学计算和解决问题的能力三、计算公式建立正规方程组:(xij+k)ak=xijyi ,j=0,1,n 平方误差:I=(akxik-yi)2四、主要仪器设备Vc+ 9.0 C-free CodeBlocks五、结构程序设计源代码: #include<iostream.h>#include<fstream.h>#define N 15double power(double &a,int n)double b=1;for(int i=0;i<n;i+)b*=a;return b;void Gauss();double

36、 XN,YN,sumXN,sumYN,aNN,bN,lNN,xN;void main()ofstream outdata;ifstream indata;double s;int i,j,k,n,index;/cout<<"请输入已知点的个数n="/cin>>n;n=7; cout<<endl;/cout<<"请输入X和Y:"<<endl; /输入给定数据X0=0.0;Y0=1.00;X1=0.5;Y1=1.75;X2=0.6;Y2=1.96;X3=0.7;Y3=2.19;X4=0.8;Y4=2

37、.44;X5=0.9;Y5=2.71;X6=1.0;Y6=3.00; /绑定数据 /可以解绑由下for循环 输入任何数据for(i=0;i<n;i+)/cout<<"X"<<i<<"="/cin>>Xi;sumX1+=Xi;/cout<<"Y"<<i<<"="/cin>>Yi;sumY1+=Yi;/cout<<endl;cout<<"sumX1="<<sumX

38、1<<"t"<<"sumY1="<<sumY1<<endl;cout<<"请输入拟合次数index="cin>>index;cout<<endl;i=n;sumX0=i;for(i=2;i<=2*index;i+)sumXi=0;for(j=0;j<n;j+)sumXi+=power(Xj,i);cout<<"sumX"<<i<<"="<<sumXi<<endl;for(i=2;i<=index+1;i+)sumYi=0;for(j=0;j<n;j+)sumYi+=power(Xj,i-1)*Yj;cout<<"sumY&quo

温馨提示

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

评论

0/150

提交评论