《东南大学计算方法上机报告实验报告完整版》由会员分享,可在线阅读,更多相关《东南大学计算方法上机报告实验报告完整版(25页珍藏版)》请在金锄头文库上搜索。
1、实习题11. 用两种不同的顺序计算,试分析其误差的变化解:从n=1开始累加,n逐步增大,直到n=10000;从n=10000开始累加,n逐步减小,直至1。算法1的C语言程序如下:#include#includevoid main()float n=0.0;int i;for(i=1;i=1;j-)m=m+1.0/(j*j);printf(%-7f,m);printf(n);运行后结果如下:结论:4.设,已知其精确值为。1)编制按从大到小的顺序计算的程序;2)编制按从小到大的顺序计算的程序;3)按2种顺序分别计算,并指出有效位数。解:1)从大到小的C语言算法如下:#include#include
2、#includeusing namespace std;void main()float n=0.0;int i;int N;coutPlease input NN;for(i=N;i1;i-) n=n+1.0/(i*i-1);N=N-1;printf(%-100f,n);printf(n);执行后结果为:N=2时,运行结果为:N=3时,运行结果为:N=100时,运行结果为:N=4000时,运行结果为:2)从小到大的C语言算法如下:#include#include#includeusing namespace std;void main()float n=0.0;int i;int N;cou
3、tPlease input NN;for(i=2;i=N;i+)n=n+1.0/(i*i-1);printf(%-100f,n);printf(n);执行后结果为:N=2时,运行结果为:N=3时,运行结果为:N=100时,运行结果为:N=4000时,运行结果为:结论:通过比较可知:N的值较小时两种算法的运算结果相差不大,但随着N的逐渐增大,两种算法的运行结果相差越来越大。3)用从小到大的C语言算法计算,结果如下:N=1000时,运行结果:N=10000时,运行结果:N=30000时,运行结果:用从大到小顺序的C语言算法分别计算,结果如下:N=1000时,运行结果:N=10000时,运行结果:N
4、=30000时,运行结果:实习题21. 用牛顿法法解下列方程的根:1);3)。解:1)给定初始值,为根的容许误差,为的容许误差,N为迭代次数的容许值。如果或迭代次数大于N,则算法失败,结束,转而执行。在或时,则输出,程序结束,否则执行。令,转向。根据大致的草图,判断出方程只有一个根,且在(-2,0),因此可以取初始值-1.000000,执行程序。C语言算法如下:#include #include#include using namespace std;#define N 100#define eps 1e-6#define eta 1e-8float Newton(float(*f)(floa
5、t),float(*f1)(float),float x0)float x1,d;int k=0;dox1=x0-(*f)(x0)/(*f1)(x0);if(k+N|fabs(*f1)(x1)eps)printf(n Newton迭代发散);break;d=fabs(x1)eps&fabs(*f)(x1)eta);return x1;float f(float x)return float(x*x-exp(x);float f1(float x)return float(2*x-exp(x);void main()float x0,y0;printf(请输入迭代初值x0n);scanf(%f,
6、&x0);printf(x(0)=%fn,x0);y0=Newton(f,f1,x0);printf(方程的根为:%fn,y0);运行结果为:由此可见,利用牛顿法求该方程的近似解为-0.703467,精确到小数点后六位,同时可以发现,迭代次数只有4次,若是用二分法进行求解,那么迭代次数将会多很多,可见,牛顿法的收敛速度还是较快的。3)2、编写一个割线法的程序,求解上述各方程。1);解:解:1)给定初始值,为根的容许误差,为的容许误差,N为迭代次数的容许值。如果或迭代次数大于N,则算法失败,结束,转而执行。在或时,则输出,程序结束,否则执行。令,转向。根据大致的草图,判断出方程只有一个根,且在(
7、-2,0),因此可以取初始值-1.000000,执行程序。C语言算法如下:#include #include#include using namespace std;#define N 100#define eps 1e-6#define eta 1e-8float Newton(float(*f)(float),float(*f1)(float),float x0)float x1,d;int k=0;dox1=x0-(*f)(x0)/(*f1)(x0);if(k+N|fabs(*f1)(x1)eps)printf(n Newton迭代发散);break;d=fabs(x1)eps&fabs
8、(*f)(x1)eta);return x1;float f(float x)return float(x*x-exp(x);float f1(float x)return float(2*x-exp(x);void main()float x0,y0;printf(请输入迭代初值x0n);scanf(%f,&x0);printf(x(0)=%fn,x0);y0=Newton(f,f1,x0);printf(方程的根为:%fn,y0);运行结果为:由此可见,利用牛顿法求该方程的近似解为-0.703467,精确到小数点后六位,同时可以发现,迭代次数只有4次,若是用二分法进行求解,那么迭代次数将会
9、多很多,可见,牛顿法的收敛速度还是较快的。实习题31、用列主元消去法解方程组:1)解:将方程用增广矩阵 A|b=(aij)n(n+1)表示,分别进行消元和回代过程、消元过程:对于选主元;如果=0,则矩阵A奇异,程序结束;否则执行;如果,则交换第k行与第行对应元素位置;消元, 对,计算,对,计算;、回代过程 若,则矩阵A奇异,程序结束;否则执行; ;对,计算;C语言程序代码为:#include#include#includeusing namespace std;void main()void ColPivot(float *,int ,float);int i;float x4;float c
10、45=1,1,0,3,4, 2,1,-1,1,1, 3,-1,-1,3,-3, -1,2,3,-1,4; ColPivot(c0,4,x);for(i=0;i=3;i+)printf(x%d=%fn,i+1,xi);void ColPivot(float *c,int n,float x)int i,j,k,t;float p;for(i=0;i=n-2;i+)k=i;for(j=i+1;j(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+
11、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=0;i-)for(j=n-1;j=i+1;j-) (*(c+i*(n+1)+n)-=xj*(*(c+i*(n+1)+j);xi=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i);运行结果为:所以原方程组的近似解为,此解与精确解几乎一致,因此可以发现,列主元消去法可以比较精确地求得多元一次方程组的解,比一般普通方法精确度要高。2、用LU分解法解方程组Ax=b,其中 ,解:、将方程组中的A分解成,其中L为单位下三角形矩阵,U为上三角形矩阵,则方程组化解为2个方程组Ly=b,Ux=y,具体算法如下:对j=1,2,3, n计算对i=2,3, , n计算对k=2,3,n:a.对j=k,k+1, ,n计算b.对i=k+1,k+2, ,n计算,对k=2,3, ,n计算,对k=n-1,n-2, ,2,1计算、程序代码如下:#includevoid main()float x4;