1实习题11.用两种不同的顺序计算644834.11000012nn,试分析其误差的变化解:从n=1开始累加,n逐步增大,直到n=10000;从n=10000开始累加,n逐步减小,直至1。算法1的C语言程序如下:#includestdio.h#includemath.hvoidmain(){floatn=0.0;inti;for(i=1;i=10000;i++){n=n+1.0/(i*i);}printf(%-100f,n);printf(\n);floatm=0.0;intj;for(j=10000;j=1;j--){m=m+1.0/(j*j);}printf(%-7f,m);printf(\n);}运行后结果如下:结论:4.设NjNjS2211,已知其精确值为)11123(21NN。1)编制按从大到小的顺序计算NS的程序;2)编制按从小到大的顺序计算NS的程序;3)按2种顺序分别计算30000100001000,,SSS,并指出有效位数。2解:1)从大到小的C语言算法如下:#includestdio.h#includemath.h#includeiostreamusingnamespacestd;voidmain(){floatn=0.0;inti;intN;coutPleaseinputNendl;cinN;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时,运行结果为:32)从小到大的C语言算法如下:#includestdio.h#includemath.h#includeiostreamusingnamespacestd;voidmain(){floatn=0.0;inti;intN;coutPleaseinputNendl;cinN;for(i=2;i=N;i++){n=n+1.0/(i*i-1);}printf(%-100f,n);printf(\n);}执行后结果为:N=2时,运行结果为:N=3时,运行结果为:N=100时,运行结果为:4N=4000时,运行结果为:结论:通过比较可知:N的值较小时两种算法的运算结果相差不大,但随着N的逐渐增大,两种算法的运行结果相差越来越大。3)①用从小到大的C语言算法计算30000100001000,,SSS,结果如下:N=1000时,运行结果:N=10000时,运行结果:N=30000时,运行结果:②用从大到小顺序的C语言算法分别计算30000100001000,,SSS,结果如下:N=1000时,运行结果:5N=10000时,运行结果:N=30000时,运行结果:实习题21.用牛顿法法解下列方程的根:1)02xex;3)02lgxx。解:1)给定初始值0x,为根的容许误差,为)(xf的容许误差,N为迭代次数的容许值。①如果0)(0'xf或迭代次数大于N,则算法失败,结束,转而执行②。②)()(0'001xfxfxx。③在01xx或)(1xf时,则输出1x,程序结束,否则执行④。④令10xx,转向①。根据大致的草图,判断出方程只有一个根,且在(-2,0),因此可以取初始值-1.000000,执行程序。C语言算法如下:#includeiostream#includestdio.h#includecmathusingnamespacestd;#defineN100#defineeps1e-6#defineeta1e-8floatNewton(float(*f)(float),float(*f1)(float),floatx0){6floatx1,d;intk=0;do{x1=x0-(*f)(x0)/(*f1)(x0);if(k++N||fabs((*f1)(x1))eps){printf(\nNewton迭代发散);break;}d=fabs(x1)1?x1-x0:(x1-x0)/x1;x0=x1;printf(x(%d)=%f\t,k,x0);}while(fabs(d)eps&&fabs((*f)(x1))eta);returnx1;}floatf(floatx){returnfloat(x*x-exp(x));}floatf1(floatx){returnfloat(2*x-exp(x));}voidmain(){floatx0,y0;printf(请输入迭代初值x0\n);scanf(%f,&x0);printf(x(0)=%f\n,x0);y0=Newton(f,f1,x0);printf(方程的根为:%f\n,y0);}运行结果为:由此可见,利用牛顿法求该方程的近似解为-0.703467,精确到小数点后六位,同时可以发现,迭代次数只有4次,若是用二分法进行求解,那么迭代次数将会多很多,可见,牛顿法的收敛速度还是较快的。73)2、编写一个割线法的程序,求解上述各方程。1)02xex;解:解:1)给定初始值0x,为根的容许误差,为)(xf的容许误差,N为迭代次数的容许值。①如果0)(0'xf或迭代次数大于N,则算法失败,结束,转而执行②。②)()(0'001xfxfxx。③在01xx或)(1xf时,则输出1x,程序结束,否则执行④。④令10xx,转向①。根据大致的草图,判断出方程只有一个根,且在(-2,0),因此可以取初始值-1.000000,执行程序。C语言算法如下:#includeiostream#includestdio.h#includecmathusingnamespacestd;#defineN100#defineeps1e-6#defineeta1e-8floatNewton(float(*f)(float),float(*f1)(float),floatx0){floatx1,d;intk=0;do{x1=x0-(*f)(x0)/(*f1)(x0);if(k++N||fabs((*f1)(x1))eps){printf(\nNewton迭代发散);break;}d=fabs(x1)1?x1-x0:(x1-x0)/x1;x0=x1;printf(x(%d)=%f\t,k,x0);}while(fabs(d)eps&&fabs((*f)(x1))eta);returnx1;8}floatf(floatx){returnfloat(x*x-exp(x));}floatf1(floatx){returnfloat(2*x-exp(x));}voidmain(){floatx0,y0;printf(请输入迭代初值x0\n);scanf(%f,&x0);printf(x(0)=%f\n,x0);y0=Newton(f,f1,x0);printf(方程的根为:%f\n,y0);}运行结果为:由此可见,利用牛顿法求该方程的近似解为-0.703467,精确到小数点后六位,同时可以发现,迭代次数只有4次,若是用二分法进行求解,那么迭代次数将会多很多,可见,牛顿法的收敛速度还是较快的。实习题31、用列主元消去法解方程组:1)4323331243432143214321421xxxxxxxxxxxxxxx解:将方程用增广矩阵[A|b]=(aij)n(n+1)表示,分别进行消元和回代过程Ⅰ、消元过程:对于1,,2,1nk①选主元kika,;②如果,kika=0,则矩阵A奇异,程序结束;否则执行③;③如果kik,则交换第k行与第ki行对应元素位置;9④消元,对nki,,1,计算ikikkkala,对nkj,,1,计算ijijikkjaala;Ⅱ、回代过程①若0nna,则矩阵A奇异,程序结束;否则执行②;②,1nnnnnxaa;对1,2,,1ni,计算,11()niinijjiijixaaxa;C语言程序代码为:#includeiostream#includecstdio#includecmathusingnamespacestd;voidmain(){voidColPivot(float*,int,float[]);inti;floatx[4];floatc[4][5]={1,1,0,3,4,2,1,-1,1,1,3,-1,-1,3,-3,-1,2,3,-1,4};ColPivot(c[0],4,x);for(i=0;i=3;i++)printf(x[%d]=%f\n,i+1,x[i]);}voidColPivot(float*c,intn,floatx[]){inti,j,k,t;floatp;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++){10p=(*(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));}}运行结果为:所以原方程组的近似解为000000.1333333.0333333.2333333.14321xxxx,此解与精确解几乎一致,因此可以发现,列主元消去法可以比较精确地求得多元一次方程组的解,比一般普通方法精确度要高。2、用LU分解法解方程组Ax=b,其中602448A6624242201201621212,2244b解:Ⅰ、将方程组bAx中的A分解成LUA,其中L为单位下三角形矩阵,U为上三角形矩阵,则方程组bAx化解为2个方程组Ly=b,Ux=y,具体算法如下:①对j=1,2,3,…,n计算jjau11对i=2,3,…,n计算1111/aalii②对k=2,3,…,n:a.对j=k,k+1,…,n计算11kqqjkqkjkjulaub.对i=k+1,k+2,…,n计算kkqkiqikikuulal/)(11③11by,对k=2,3,…,n计算11kqqkqkkylby④nnnnuyx/,对k=n-1,n-2,…,2,1计算nkqkkqkqkkuxuyx1/)(Ⅱ、程序代码如下:#includestdio.hvoidmain(){floatx[4];inti;floata[4][5]={48,-24,0,-12,4,-24,24,12,12,4,0,6,20,2,-2,-6,6,2,16,-2};voidDirectLU(float*,int,float[]);DirectLU(a[0],4,x);for(i=0;i=3;i++)printf(x[%d]=%f\n,i,x[i]);}voidDirectLU(float*u,intn,floatx[]){inti,r,k;for(r=0;r=n-1;r++){for(i=r;i=n;i++)for(k=0;k=r-1;k++)*(u+r*(n+1)+i)-=*(