144第7章算法的程序实现实验一秦九韶和对分法1.利用秦九韶算法计算多项式0111)(axaxaxaxPnnnnn的值。例如计算3x2+2x+1,当x=-1时值为2。(1)C程序填空#includestdio.hvoidmain(){floata[20],y,x;inti,n;printf(请输入多项式的次数n:\n);【1】;printf(请按降幂顺序输入%d个系数\n,n+1);for(i=n;i=0;i--)scanf(%f,&a[i]);printf(请输入x\n);scanf(%f,&x);【2】;for(i=n-1;i=0;【3】)y=【4】;printf(多项式值为%f\n,y);}2.用对分法求出方程074223xxx在区间[3,4]内的根,精度要求为10-5,方程的根为3.631981。(1)C程序填空#includestdio.hfloatf(floatx){returnx*x*x-2*x*x-4*x-7;}main(){floata,b,eps=1e-5,c;scanf(%f%f,&a,&b);while(【1】){【2】;if(f(c)==0)break;elseif【3】b=c;else【4】;}printf(root=%f\n,c);145}3.求方程02524xxx的实根的上、下界,扫描法实现根的隔离,并用对分法求出所有的实根,精度要求为10-5。此方程4个实根的近似值分别为:root=-2.246983root=-0.554953root=0.801944root=2.000003提示:实根的上下界可以输入,用扫描法实现根的隔离,然后再对隔根区间使用对分法。(1)C程序填空#includestdio.hfloatf(floatx){returnx*x*x*x-5*x*x+x+2;}floatdf(floata,floatb){floatc;/*对分法求根部分*/【1】returnc;}main(){floata,b,x,h,eps,c;inti=0;a=-6;b=6;h=0.1;eps=1e-5;x=a;while(x=b-h/2){if(【2】){printf([%f,%f]\n,x,x+h);i++;c=【3】;printf(x%d=%f\n,i,c);}x=【4】;}}146实验二牛顿法和弦割法1.用牛顿法求a的立方根,精度要求为0.00001。(1)C程序填空#includestdio.h【1】main(){【2】;inta;printf(inputa\n);scanf(%d,&a);if(a==0){printf(a=0\n);exit(0);}x1=a;do{【3】;x1=【4】;}while(fabs(x0-x1)=1e-5);printf(root=%f\n,x1);}2.编写牛顿法求以下方程根的程序,精度要求为10-5。(1)03223xxx在2附近的根。(2)50.sinxx在1附近的根。(3)0xex在1附近的根。计算结果分别为(1)2.374424(2)1.497300(3)0.56713.用弦割法解方程1sinxx,精度要求为10-4,取初值x0=0,x1=1。#includestdio.h#includemath.hmain(){floatx0=0,x1=1,x2;inti=1;floatf2(floatx),f1(floatx0,floatx1);do{x2=f1(x0,x1);x0=x1;【1】;i++;}while(【2】);printf(root=%f,i=%d\n,x2,i);if(i30)printf(notconverged);}floatf2(floatx)147{floaty;y=x+sin(x)-1;return(y);}floatf1(floatx0,floatx1){floaty;y=【3】;return(y);}148实验三线性方程组的直接法1.用按列选主元的高斯消元法计算出下面三个方程组的解。(1)713542774322321xxx(2)112125434321321321xxxxxxxxx(3)9153152315322235221214321xxxx计算结果分别为:(1)122321xxx(2)361321xxx(3)12134321xxxx1)C程序填空#includestdio.h#includemath.h#defineN3main(){inti,j,k,r;floatt,d,l,a[N][N+1];for(i=0;iN;i++)for(j=0;jN+1;j++)【1】;for(k=0;kN-1;k++){r=k;for(i=k+1;iN;i++)if(fabs(a[i][k])fabs(a[r][k]))【2】;if(fabs(a[r][k])1e-6)printf(dataerror);if(r!=k)for(j=k;jN+1;j++){t=a[r][j];【3】;a[k][j]=t;}for(i=k+1;iN;i++){l=【4】;for(j=k+1;jN+1;j++)a[i][j]=【5】;}}for(k=N-1;【6】;k--){t=0;for(j=k+1;jN;j++)t=【7】;a[k][N]=(a[k][N]-t)/【8】;149}for(i=0;iN;i++)printf(x%d=%f\n,i+1,a[i][N]);}2.用LU分解法解线性方程组,系数矩阵由二维数组a给出,右端项由b数组给出,请填空。(1)C程序填空#includestdio.h#includemath.hmain(){inti,j,k,m,n=4;floatb[4]={1,1,-1,-1},x[4],y[4],t;floata[4][4]={{4,3,2,1},{3,4,3,2},{2,3,4,3},{1,2,3,4}},l[4][4],u[4][4];for(k=0;kn;k++){for(【1】){t=0;for(m=0;m=k-1;m++)t=t+【2】;u[k][j]=【3】;}for(i=k+1;in;i++){t=0;for(m=0;m=k-1;m++)t=t+l[i][m]*u[m][k];l[i][k]=【4】;}}for(i=0;in;i++){【5】;for(j=0;j=i-1;j++)t=t+l[i][j]*y[j];y[i]=【6】;}for(i=n-1;i=0;i--){t=0;for(【7】)t=t+u[i][k]*x[k];x[i]=【8】;}for(i=0;in;i++)printf(%10.4f,x[i]);}1503.填空完成用高斯-约当消元法解方程组的程序。#includestdio.h#includemath.h#defineN3main(){inti,j;floata[N+1][N+2],x;voidgauss_joan(floata[N+1][N+2];for(i=1;i=N;i++)for(j=1;jN+2;j++)【1】;gauss_joan(a);for(i=1;i=N;i++)printf(%9.1f,a[i][N+1]);printf(\n);}voidgauss_joan(floata[N+1][N+2]){intk,i,j,m,n,r;floatl,t,s,y=1;for(k=1;k=N;k++){r=k;for(i=k+1;i=N;i++)if(fabs(a[r][k])fabs(a[i][k]))【2】;if(fabs(a[r][k])1e-5){printf(dataerror!\n);return;}if(r!=k)for(【3】){t=a[k][j];a[k][j]=a[r][j];a[r][j]=t;}for(j=k+1;j=N+1;j++)【4】;for(i=1;i=N;i++){if(i!=k)for(j=k+1;j=N+1;j++)【5】;}}}151实验四线性方程组的迭代法用雅可比迭代和高斯—塞德尔迭代解线性方程组,本实验的试算数据:(1)1107285541121561627321xxx(2)3481241011115111110111154321xxxx计算结果分别为:(1)雅可比迭代92595.157301.342547.2321xxx高斯—塞德尔迭代92595.157302.342548.2321xxx(2)雅可比迭代0000.499999.200000.299999.04321xxxx高斯—塞德尔迭代00000.400000.300000.200000.14321xxxx1.用雅可比迭代法解线性方程组,精度要求为10-5。(2)C程序可参考第2题的程序自己编写。2.用高斯—塞德尔迭代法解线性方程组,精度要求为10-5。(1)C程序填空#includemath.h#includestdio.hfloatcha(x,y)floatx[3],y[3];{floatz;inti,k,n=3;z=fabs(y[0]-x[0]);for(i=1;in;i++)if(【1】)z=fabs(y[i]-x[i]);return(z);}main(){floata[3][3]={{10,-2,-1},{-2,10,-1},{-1,-2,5}};floatb[3]={3,15,10},x[3]={0,0,0},y[3],t=0,s;inti,j,n=3,k=0,m=30;printf(Gauss-Seidel\n);do{for(i=0;in;i++)【2】;for(i=0;in;i++)152{t=0;for(j=0;jn;j++)if(j!=i)【3】;x[i]=【4】;}k++;}while(k=m&&【5】);if(cha(x,y)1e-6){printf(%d\n,k);for(i=0;in;i++)printf(%10f,x[i]);}elseprintf(fasann\n);}153实验五拉格朗日插值和牛顿基本插值1.已知节点X为1234567,对应的Y值为5321247,利用拉格朗日插值多项式求在x=3.5处函数值的近似值。(1)C程序填空#includestdio.hmain(){floatx[20],y[20],p,t,s;intn,i,k;printf(输入节点个数n+1\n);scanf(%d,&n);printf(输入n+1个节点数据\n);for(k=0;k=n;k++)scanf(%f%f,&x[k],&y[k]);printf(输入插值点t\n);scanf(%f,&t);【1】;for(k=0;k=n;k++){s=1;for(i=0;i=n;i++)if(i!=k)【2】;p=p+【3】;}printf(p=%f\n,p);}2.填空完成牛顿基本插值公式的程序。实验数据如下:x0.1250.250.3750.50.6250.75f(x)0.796180.773340.743710.704130.656320.60228用牛顿基本插值公式计算f(0.1581)和f(0.6367)的值。结果为:f(0.1581)=0.79029,f(0.6367)=0.65152(1)C程序填空#includestdio.hma