当前位置:文档之家› 计算方法

计算方法

计算方法与实习实验报告目录:实习题1 ————P3-5 实习题3 ————P6-12 实习题5 ————P12-17实习题一1.用2种不同的顺序计算10000211.644834nn-=≈∑,分析其误差的变化。

一实验代码n从小到大#include <iostream.h>#include<cmath>void main(){float sum=0;int n=1;while(n<=10000){sum=sum+(float)1/(n*n);n++;}cout<<"n由小到大时所得结果为:"<<sum<<endl; }n从大到小#include <iostream.h>#include<cmath>void main(){float sum=0;int n=10000;while(n>0){sum=sum+(double)1/(n*n);n--;}cout<<"n由大到小时所得结果为:"<<sum<<endl;}二,运行窗口4. 设2211N n j S j ==-∑,已知其精确值为1/2(3/2-1/N-1/N+1)。

1)编制按从大到小的顺序计算Sn 的程序;2)编制按从小到大的顺序计算Sn 的程序;3)按两种顺序分别计算S1000,S10000,S30000,并指出有效位数。

一,实验代码从小到大#include<iostream.h>using namespace std;void main(){double sum=0;int k=2,N;cout<<"请输入N 的值:"<<endl;cin>>N;while(N>=k){sum=sum+(double)1/(N*N-1);N--;}cout<<"从大到小的顺序计算的值为:"<<sum<<endl;}从大到小#include<iostream.h>using namespace std;void main(){double sum=0;int k=2,N;cout<<"请输入N 的值:"<<endl;cin>>N;while(k<=N){sum=sum+(double)1/(k*k-1);k++;}cout<<"从小到大的顺序计算的值为:"<<sum<<endl;}二,运行窗口从小到大:从大到小:分析:由以上结果可得S1000,S10000,S30000,计算结果有3位,4位,6位有效数字。

实习题三1.用列主元消去法解方程组:1)12434x x x ++=123421x x x x +-+=1234333x x x x --+=-1234234x x x x -++-=一,实验代码#include <iostream>#include <math.h>using namespace std;void ColPivot(double *c, int n, double x[]);void main(){int i;double a[4];double x[20]={1,1,0,3,4,2,1,-1,1,1,3,-1,-1,3,-3,-1,2,3,-1,4};ColPivot(x,4,a);for(i=0;i<4;i++) cout<<"x"<<i<<"="<<a[i]<<'\t';cout<<endl;}void ColPivot(double *c, int n, double x[]){int i=0,j=1,t,k=0;double p;for(i=0;i<=n-2;i++){k=i;for(j=i+1;j<=n-1;j++)if(fabs(*(c+j*(n+1)+i))>fabs(*(c+k*(n+1)+i))) k=j;if(k!=i)for(j=i;j<=n;j++){p=*(c+i*(n+1)+j);*(c+i*(n+1)+j)=*(c+k*(n+1)+j);*(c+k*(n+1)+j)=p;}for(j=i+1;j<=n-1;j++){p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));for(t=i;t<=n;t++) *(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));}}for(i=n-1;i>=0;i--){for(j=n-1;j>=i+1;j--)(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j));x[i]=(*(c+i*(n+1)+n))/(*(c+i*(n+1)+i));}}二,运行窗口结果:X1=1.33333, X2=2.33333, X3=-0.333333,X4=14.编写用追赶法解三对角线性方程组的程序,并解下列方程组:2)Ax b = 其中10*1010*12715411511,14151500A b -⎡⎤⎢⎥-⎢⎥⎛⎫-⎢⎥- ⎪==⎢⎥ ⎪⎢⎥ ⎪-⎝⎭⎢⎥-⎢⎥-⎣⎦一 实验代码#include <iostream>#include <math.h>using namespace std;void ColPivot(double *a, double *b, double *c, double *d, int n, double x[]);void main(){int i;double a[9];double b[10];double c[9];double d[10]={-27};double x[10];for(i=0;i<9;i++) a[i]=c[i]=1;for(i=0;i<10;i++) b[i]=-4;for(i=1;i<10;i++) d[i]=-15;ColPivot(a, b, c, d, 10, x);for(i=0;i<10;i++) cout<<x[i]<<'\t';}void ColPivot(double *a, double *b, double *c, double *d, int n, double x[]) {double *p=new double[n];double *q=new double[n];double *t=new double[n];int i;*p=*b;*t=*d;for(i=1;i<=n-1;i++){*(q+i)=(*(a+i-1))/(*(p+i-1));*(p+i)=*(b+i)-(*(q+i))*(*(c+i-1));*(t+i)=*(d+i)-(*(q+i))*(*(t+i-1));}x[n-1]=(*(t+n-1))/(*(p+n-1));for(i=n-2;i>=0;i--) x[i]=(*(t+i)-(*(c+i))*(*(x+i+1)))/(*(p+i));delete p;delete q;delete t;}二运行窗口所以,x={8.70576,7.82303,7.58637,7.52245,7.50344,7.49131,7.46179,7.35584,6.96156,5.49039}T5.分别用雅各比迭代法和高斯-赛德尔迭代法解下列方程组12310211x x x -+=-2348311x x x -+=-1232106x x x -+=123431125x x x x -+-+=雅克比迭代法一实验代码#include <iostream>#include <math.h>using namespace std;const double eps=pow(10,-5);const int max=100;void Jacobi(double *a, double *b, int n, double x[]);void main(){int i;double a[16]={10,-1,2,0,0,8,-1,3,2,-1,10,0,-1,3,-1,11};double b[4]={-11,-11,6,25};double x[4];Jacobi(a, b, 4, x);for(i=0;i<4;i++) cout<<"x"<<i<<"="<<x[i]<<'\n';}void Jacobi(double *a, double *b, int n, double x[]) {int i,j,k=0;double p[4];double s;for(i=0;i<n;i++) x[i]=0;while(1){k++;for(i=0;i<n;i++) p[i]=x[i];for(i=0;i<n;i++){s=0;for(j=0;j<n;j++){if(j==i) continue;*(x+i)+=(-*(a+i*n+j))*(*(p+j));}*(x+i)+=*(b+i);(*(x+i))*=(1/(*(a+i*(n+1))));s+=fabs(*(p+i)-*(x+i));}if(s<=eps) return;if(k>=max){cout<<"迭代发散"<<endl;return;}}}二运行窗口高斯-塞德尔迭代法一实验代码#include <iostream>#include <math.h>using namespace std;const double ep=pow(10,-5);const int max=500;void GaussSeidel(double *a, double *b, int n, double x[]);void main(){int i;double a[16]={10,-1,2,0,0,8,-1,3,2,-1,10,0,-1,3,-1,11};double b[4]={-11,-11,6,25};double x[4];GaussSeidel(a, b, 4, x);for(i=0;i<4;i++) cout<<"x"<<i<<"="<<x[i]<<'\n';}void GaussSeidel(double *a, double *b, int n, double x[]) {int i,j,k=1;double *p=new double[n];double eps;for(i=0;i<n;i++) x[i]=0;while(1){eps=0;for(i=0;i<n;i++){p[i]=0;for(j=0;j<n;j++){if(j==i) continue;*(p+i)-=(*(a+i*n+j))*(*(x+j));}*(p+i)+=*(b+i);(*(p+i))*=(1/(*(a+i*(n+1))));eps+=fabs(*(p+i)-*(x+i));*(x+i)=*(p+i);}if(eps<=ep) return;if(k>=max){ cout<<"迭代发散"<<endl; return;} } }二 运行窗口分析:对于同一个方程组,两种方法解的的答案相同,但是高斯-赛德尔迭代法的迭代次数明显减少,这是因为雅可比迭代法在逐个求(1)k x+的分量时,当计算到(1)k ix +时,分量(1)(1)11,,k k i x x ++-都已求的,但却被束之高阁,而仍旧使用旧分量()()(1)121,,k k k i x x x +-。

相关主题