1数值分析上机题习题117.(上机题)舍入误差与有效数设2211NNjSj,其精确值为1311221NN。(1)编制按从大到小的顺序22211121311NSN,计算NS的通用程序。(2)编制按从小到大的顺序2221111(1)121NSNN,计算NS的通用程序。(3)按两种顺序分别计算210S,410S,610S,并指出有效位数。(编制程序时用单精度)(4)通过本上机题你明白了什么?按从大到小的顺序计算NS的通用程序为:#includeiostream.hfloatsum(floatN){floatj,s,sum=0;for(j=2;j=N;j++){s=1/(j*j-1);sum+=s;}returnsum;}按从小到大的顺序计算NS的通用程序为:#includeiostream.hfloatsum(floatN){floatj,s,sum=0;for(j=N;j=2;j--){s=1/(j*j-1);sum+=s;}returnsum;}从大到小的顺序的值从小到大的顺序的值精确值有效位数从大到小从小到大210S0.7400490.740050.74004965410S0.7498520.74990.749944610S0.7498520.7499990.74999936通过本上机题,看出按两种不同的顺序计算的结果是不相同的,按从大到小的顺序计算的值与精确值有较大的误差,而按从小到大的顺序计算的值与精确值吻合。从大到小的顺序计算得到的结果的有效位数少。计算机在进行数值计算时会出现“大数吃小数”的现象,导致计算结果的精度有所降低,我们在计算机中进行同号数的加法时,采用绝对值较小者先加的算法,其结果的相对误差较小。2习题220.(上机题)Newton迭代法(1)给定初值0x及容许误差,编制Newton法解方程()0fx根的通用程序。(2)给定方程3()/30fxxx,易知其有三个根13x,20x,33x。1.由Newton方法的局部收敛性可知存在0,当0(,)x时,Newton迭代序列收敛于根2x。试确定尽可能大的。2.试取若干初始值,观察当0(,1)x,(1,),(,),(,1),(1,)时Newton序列是否收敛以及收敛于哪一个根。(3)通过本上机题,你明白了什么?解:(1)编制的通用程序:#includeiostream.h#includemath.h#defineeps0.000001/给定容许误差floatf(floatx)//定义函数f(x){floatf;f=x*x*x/3-x;//f(x)的表达式;return(f);}floatdf(floatx)//定义函数df(x),计算f(x)的导函数{floatdf;df=x*x-1;//f(x)导函数的表达式;return(df);}voidmain(void){floatx0,x1,a;intk=0;cout请输入初值x0:;cinx0;do{a=-f(x0)/df(x0);x1=x0+a;k++;x0=x1;}while(fabs(a)eps);coutk'\t'x0;//输出迭代的次数和根值}(2)计算迭代序列收敛于根2x的尽可能大的的函数为:#includeiostream.h#includemath.hvoiddelay(intn)//定义延时函数{for(n=10000;n0;n--);}#defineeps0.000001floatf(floatx)//定义函数f(x){floatf;f=x*x*x/3-x;//f(x)的表达式;return(f);}floatdf(floatx)//定义函数df(x),计算f(x)的导函数{floatdf;df=x*x-1;//f(x)导函数的表达式;return(df);}3intjudgement(floatz){intcount=5;floatx0,x1,type,type1;x0=z;while(count--0){x1=x0-f(x0)/df(x0);type=fabs(x1);type1=fabs(x1-x0);//调试值用coutcount=count'\t'type=type'\t'type1=type1'\n';if(fabs(x1-x0)eps)return1;x0=x1;delay(30000);//调试值用}return0;}voidmain(void){floatdelta=0;intflag=1;while(flag==1){cout方程的根为:'\n';delta+=eps;flag=judgement(delta);}cout输出方程根收敛的区间值:\n;coutdelta-eps;//输出收敛的区间值}当步长为0.001时,程序计算出的δ的为δ=0.774,即在区间(-0.774,0.774)内迭代序列收敛于0。对于不同得初始值收敛于不同的根,0x在(-∞,-1)内收敛于*1x,在(-0.774,0.774)内收敛于2x,在(1,+∞)内收敛于3x,但在内(0.774,1)和(-1,0.774)均可能收敛于*1x和3x。*1x,2x,3x分别为方程的精确解。分析:对于不同的初值,迭代序列会收敛于不同的根,所以在某个区间内求根对于初值的选取有很大的关系。产生上述结果的原因是区间不满足大范围收敛的条件。4习题339.(上机题)列主元Gauss消去法对于某电路的分析,归结为求解线性方程组RI=V。其中,R=VT=(-15,27,-23,0,-20,12,-7,7,10)T(1)编制解n阶线性方程组Ax=b的列主元三角分解法的通用程序;(2)用所编制的程序解线性方程组RI=V,并打印出解向量,保留五位有效数;(3)本编程之中,你提高了哪些编程能力?程序为:#includeiostream.h#includemath.hvoidmain(void){inti,j,n,k,q;floata[10][11],s[10],s1[10];cout请输入n的值:;cinn;cout输入数组a:endl;for(i=1;i=n;i++)for(j=1;j=(n+1);j++)cina[i][j];//给矩阵a赋值for(i=1;i=n;i++){for(j=1;j=(n+1);j++)couta[i][j]'\t';cout'\n';}//输出数组acout''''''''''''''''''''''''''\n';//进行第一行和第一列元素的求取'''''''''''''''''''''''''//intt=1;for(i=1;i=n;i++){s[i]=a[i][1];}floatmax=fabs(s[1]);for(i=2;i=n;i++)if(fabs(s[i])max){max=fabs(s[i]);t=i;}for(j=1;j=(n+1);j++)31-13000-10000-1335-90-1100000-931-100000000-1079-30000-9000-3057-70-500000-747-300000000-3041000000-50027-2000-9000-2295{floatb=a[1][j];a[1][j]=a[t][j];a[t][j]=b;}//进行第一列主元互换for(i=2;i=n;i++)a[i][1]=a[i][1]/max;//第一列除以a[1][1]for(i=1;i=n;i++){for(j=1;j=(n+1);j++)couta[i][j]'\t';cout'\n';}//输出进行第一步变换的数组acout''''''''''''''''''''''''''\n';//进行第k步分解'''''''''''''''''''''''''''''''''''''''''//for(k=2;k=n;k++){for(i=k;i=n;i++){floatsum=0;for(q=1;qk;q++)sum+=a[i][q]*a[q][k];s1[i]=a[i][k]-sum;}intl=k;floatm=fabs(s1[k]);for(i=k;i=n;i++)//比较第k步分解的第k列值的大小{if(fabs(s1[i])m){m=fabs(s1[i]);l=i;//返回行值}}for(j=1;j=n+1;j++)//交换两行元素{floats2=a[k][j];a[k][j]=a[l][j];a[l][j]=s2;}for(j=k;j=n+1;j++)//算出第k行行元素的值{floatsum1=0;for(q=1;qk;q++)sum1+=a[k][q]*a[q][j];a[k][j]=a[k][j]-sum1;}for(i=k+1;i=n;i++)//算出第k列列元素的值{floatsum2=0;for(q=1;qk;q++)sum2+=a[i][q]*a[q][k];a[i][k]=(a[i][k]-sum2)/(a[k][k]);}}//第k步分解结束for(i=1;i=n;i++){for(j=1;j=(n+1);j++)couta[i][j]'\t';cout'\n';}//输出改变后的数组//输出解'''''''''''''''''''''''''''''''''''''''''''''''''''''''//floatx[10];for(i=n-1;i=1;i--){x[n]=a[n][n+1]/a[n][n];floatsum3=0;for(j=i+1;j=n;j++)sum3+=a[i][j]*x[j];x[i]=(a[i][n+1]-sum3)/a[i][i];}//回代过程for(i=1;i=n;i++){cout'x'i'='x[i]endl;}//输出解向量}结果:方程的解为:x1=-0.28923,x2=0.34544,x3=-0.71281,x4=-0.22061,x5=-0.43040,x6=0.15431,x7=-0.057823,x8=0.20105,x9=0.29023。分析:我感觉是提高了查错误点的能力和编6循环语句的能力,即利用很规整的迭代公式进行编程。另外列主元三角分解法的阶梯步骤有了更深的了解!7习题437.(上机题)3次样条插值函数(1)编制求第一型3次样条插值函数的通用程序;(2)已知汽车曲线型值点的数据如下:ix012345678910iy2.513.304.044.705.225.545.785.405.575.705.80端点条件为'0y=0.8,'10y=0.2。用所编制程序求车门的3次样条插值函数S(x),并打印出S(i+0.5)(i=0,1,…9)。解:通用程序:#includeiostream.hvoidmain(void){floatx[11];//存放数组x[j]floaty[11];//存放数组y[j]floath[11];//存放数组h[j]floatu[11];//存放数组u[j]floatv[11];//存放数组v[j]floatd[11];//存放数组d[j]floatM[11];//存放数组M[j]floatb[11];//存放数组b[j]floatt[11],l[11],yy[11],s[4],aa1,aa2,aa3,aa4;floats1[10];inti,j,n;floatxx;//x为区间值//将初值初始化cout请输入n的值:\n;cinn;cout输入数组x:\n;for(i=0;i=n;i++)cinx[i];cout输入数组y:\n;f