矩阵的三角分解的编程实现一.课程设计目的:1.将高斯消去法改写为紧凑形式,可以直接从矩阵A的元素得到计算L,U元素的递推公式,而不需要任何中间的步骤。2.理解三角分解的具体方法。3.掌握对于矩阵的运算的c语言代码。了解二维数组的运用。4.掌握Doolittle分解。二.基本知识回顾:若n阶方阵nnnCA*的各阶顺序主子式不等于零,即:),,,2,1(,0212222111211nkakkakakkaaakaaak(2)则A的LU分解ALU存在且唯一。111111111111111rnrrrrnnnrnnrnrrrrnnnrnnaaaAaaaaaaUUULUULULLU(3)由矩阵的乘法原理,可推导出LU分解的迭代算法(4)0000,(0,1,2,,1),iialinu(5)1111,(0,1,2,,1;,,1),rrjikkjrkrjrjrkkjkrraluualulrnjrn(6)11,(0,1,2,,1;1,,1)ririkkrkirrralulurnirn(7)矩阵的LU分解是一个循环迭代的过程,U矩阵是从第1行迭代到第n行,而L矩阵则是从第1列迭代到第n列,且U矩阵先于L矩阵00,(0,1,2,,1),jjUajn一个节拍。三.基本问题:编程实现Doolittle分解。四.算法描述:1.输入矩阵A;3.若能分解,进行LU分解。L为单位下三角矩阵,U为上三角矩阵。五.程序实现:#includestdio.h#defineN10intmain(){floatl[N][N]={0};floatu[N][N]={0};floaty[N]={0};floatx[N]={0};floata[N][N];floatb[N];floatsum=0;inti,j,k;intn;intflag=1;while(flag){printf(请输入系数矩阵的大小:);scanf(%d,&n);if(nN){printf(矩阵过大!\n);continue;}flag=0;}printf(请输入系数矩阵值:\n);for(i=0;in;i++){for(j=0;jn;j++){printf(a[%d][%d]:,i,j);scanf(%f,&a[i][j]);}}printf(\n原始矩阵:\n);for(i=0;in;i++){for(j=0;jn;j++)printf(%0.3f,a[i][j]);printf(\n);}printf(\n\n);for(i=0;in;i++){for(j=0;jn;j++){if(i==j)l[i][j]=1;}}for(i=0;in;i++){u[0][i]=(float)(a[0][i]/l[0][0]);}for(i=0;in-1;i++){for(j=i+1;jn;j++){for(k=0,sum=0;kn;k++){if(k!=i)sum+=l[j][k]*u[k][i];}l[j][i]=(float)((a[j][i]-sum)/u[i][i]);}for(j=i+1;jn;j++){for(k=0,sum=0;kn;k++){if(k!=i+1)sum+=l[i+1][k]*u[k][j];}u[i+1][j]=(float)((a[i+1][j]-sum));}}printf(矩阵L:\n);for(i=0;in;i++){for(j=0;jn;j++){printf(%0.3f,l[i][j]);}printf(\n);}printf(\n矩阵U:\n);for(i=0;in;i++){for(j=0;jn;j++){printf(%0.3f,u[i][j]);}printf(\n);}}