当前位置:文档之家› 研究生“数值分析”课后题(上机编程部分)答案

研究生“数值分析”课后题(上机编程部分)答案

2009级研究生《数值分析》上机作业院系电气工程学院专业控制理论与控制工程姓名马凯指导教师代新敏2009年12月29日第一题(二问):超松弛法求方程组根1.解题理论依据或方法应用条件:超松弛算法是在GS 方法已求出x (m),x (m-1)的基础上,经过重新组合得到新序列。

如能恰当选择松弛因子ω,收敛速度会比较快。

当ω>1时,称为超松弛法,可以用来加速收敛。

其具体算法为:)()1(1)1(11)()1()(i ni j m jij i j m j ij m i m i g xb x b x x +++-=∑∑+=--=-ωω2.计算程序(使用软件:VC ): #include<stdio.h> #define w 1.4 main(){float a[10][10]={ {0,0,0,0,0,0,0,0,0,0},{0,12.38412,2.115237,-1.061074,1.112336,-0.113584,0.718719,1.742382,3.067813,-2.031743}, {0,2.115237,19.141823,-3.125432,-1.012345,2.189736,1.563849,-0.784165,1.112348,3.123124}, {0,-1.061074,-3.125432,15.567914,3.123848,2.031454,1.836742,-1.056781,0.336993,-1.010103}, {0,1.112336,-1.012345,3.123848,27.108437,4.101011,-3.741856,2.101023,-0.71828,-0.037585}, {0,-0.113584,2.189736,2.031454,4.101011,19.897918,0.431637,-3.111223,2.121314,1.784317}, 0,0.718719,1.563849,1.836742,-3.741856,0.431637,9.789365,-0.103458,-1.103456,0.238417}, {0,1.742382,-0.784165,-1.056781,2.101023,-3.111223,-0.103458,14.7138465,3.123789,-2.213474},{0,3.067813,1.112348,0.336993,-0.71828,2.121314,-1.103456,3.123789,30.719334,4.446782}, {0,-2.031743,3.123124,-1.010103,-0.037585,1.784317,0.238417,-2.213474,4.446782,40.00001}}; float b[10][1]={{0},{2.1874369},{33.992318},{-25.173417},{0.84671695},{1.784317},{-86.612343},{1.1101230},{4.719345},{-5.6784392}};float x[10][10]={{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}}; /*由x(0)=0得到其第一列全为零*/ float sum1=0,sum2=0; int i,m,j;for(m=1;m<=9;m++) for(i=1;i<=9;i++) {sum1=0; for(j=1;j<=(i-1);j++)sum1+=(-a[i][j]/a[i][i])*x[j][m]; /*计算第一个累加和*/ sum2=0; for(j=(i+1);j<=9;j++)sum2+=(-a[i][j]/a[i][i])*x[j][m-1]; /*计算第二个累加和*/ x[i][m]=(1-w)*x[i][m-1]+w*(sum1+sum2+b[i][0]/a[i][i]); /*用SOR 方法计算*/ }printf("x1为:%lf\n",x[1][9]); printf("x2为:%lf\n",x[2][9]); printf("x3为:%lf\n",x[3][9]); printf("x4为:%lf\n",x[4][9]); printf("x5为:%lf\n",x[5][9]); printf("x6为:%lf\n",x[6][9]);printf("x7为:%lf\n",x[7][9]); printf("x8为:%lf\n",x[8][9]); printf("x9为:%lf\n",x[9][9]); }3.计算结果4.问题讨论(误差分析、上机出现情况等)这道题目是所有题目中编写最顺利的,一次即顺利得出结果,当然这道题目还是有应该注意到地方,一是注意两个求和的清零,二是注意下标,不要弄混行标和列标。

第一题(三问):列主元素法求方程组根1.解题理论依据或方法应用条件:所谓列主元消去法是,对矩阵作恰当的调整,选取绝对值最大的元素作为主元素。

然后把矩阵化为上三角阵,再进行回代,求出方程的解。

算法为: ][]1[1i b i d =+ , ]][1[]2[1i i B i a +=+ ,]][[]1[1i i B i b =+ , ]1][[]1[1+=+i i B i c , q1[0]=0 , u1[0]=0 ,8,,2,1]),[1][1][1(][1][1⋅⋅⋅=⋅+-=i i q i a i b i c i q9,,2,1]),1[1][1][1(])[1][1][1(}[1⋅⋅⋅=-⋅+⋅-=i i q i a i b i u i a i d i u x[9]=u1[9]1,,7,8],[1]1[][1][⋅⋅⋅=++⋅=i i u i x i q i x2.计算程序(使用软件:VC):#include<stdio.h>#include<math.h>main(){double a[10][11]={ {0,0,0,0,0,0,0,0,0,0,0},{0,12.38412,2.115237,-1.061074,1.112336,-0.113584,0.718719,1.742382,3.067813,-2.031743,2. 1874369},{0,2.115237,19.141823,-3.125432,-1.012345,2.189736,1.563849,-0.784165,1.112348,3.123124,3 3.992318},{0,-1.061074,-3.125432,15.567914,3.123848,2.031454,1.836742,-1.056781,0.336993,-1.010103,-25.173417},{0,1.112336,-1.012345,3.123848,27.108437,4.101011,-3.741856,2.101023,-0.71828,-0.037585,0. 84671695},{0,-0.113584,2.189736,2.031454,4.101011,19.897918,0.431637,-3.111223,2.121314,1.784317,1. 784317},{0,0.718719,1.563849,1.836742,-3.741856,0.431637,9.789365,-0.103458,-1.103456,0.238417,-8 6.612343},{0,1.742382,-0.784165,-1.056781,2.101023,-3.111223,-0.103458,14.7138465,3.123789,-2.21347 4,1.1101230},{0,3.067813,1.112348,0.336993,-0.71828,2.121314,-1.103456,3.123789,30.719334,4.446782,4.7 19345},{0,-2.031743,3.123124,-1.010103,-0.037585,1.784317,0.238417,-2.213474,4.446782,40.00001,-5 .6784392}};double x[10],y[11];double sum=0,max;int i,j,j1,m,n,k,g,h;for(j=1;j<=8;j++){max=a[j][j];for(k=j+1;k<=9;k++){if(fabs(a[k][j])>fabs(max))max=a[k][j];}for(k=j;k<=9;k++){if(a[k][j]/max==1)g=k;} /*确定本列绝对值最大元素所在行:g行*/ for(h=j;h<=10;h++)y[h]=a[j][h];for(h=j;h<=10;h++)a[j][h]=a[g][h];for(h=j;h<=10;h++)a[g][h]=y[h]; /*将g行与J行所有元素进行交换*/ for(i=j+1;i<=9;i++)for(j1=j+1;j1<=10;j1++)a[i][j1]-=(a[i][j]/a[j][j])*a[j][j1];} /*逐行消元,将矩阵转化为上三角矩阵*/ printf("x9为:%lf\n",x[9]=a[9][10]/a[9][9]);for(m=8;m>=1;m--){sum=0;for(n=m+1;n<=9;n++) sum+=x[n]*a[m][n]; printf("x%d 为:%lf\n",m,x[m]=(a[m][10]-sum)/a[m][m]);} /*从x9到x1逐个解出结果*/ }3.计算结果4.问题讨论(误差分析、上机出现情况等)(1)这道题目出现的最大问题在 for(j1=j+1;j1<=10;j1++)a[i][j1]-=(a[i][j]/a[j][j])*a[j][j1]; ,刚开始我错写为:for(j1=j;j1<=10;j1++)a[i][j1]-=(a[i][j]/a[j][j])*a[j][j1]; ,也就是j1应该从j+1开始取值,如果从j 开始取,会导致a[i][j1]-=(a[i][j]/a[j][j])*a[j][j1]; 一句中a[i][j]是零,这样后面的a[i][j1]全部都将是原来的数值,不会变化,导致错误。

相关主题