东北大学数值分析课题2实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数值分析实验报告
东北大学
一、实验要求
1)建立矩阵求逆的算法公式
2)编制下三角部分消元,上三角部分消元和对角元单位化等子程序
3)应用结构程序设计编程出求n阶矩阵的逆矩阵的通用程序
二、实验目的与意义
1)通过该课题的实验,掌握求逆矩阵的程序设计方法
2)学会利用矩阵求逆运算求解线性方程组的方法,提高数值方法的运用和
编程的能力
三、实验环境
编译环境:Visual C++6.0。
编译语言:C++
四、实验过程与分析:
(1)求已知矩阵的逆:(以四阶为例)
#include
#include
#define N 4
int main()
{ float a[N][N];
float L[N][N],U[N][N],out[N][N], out1[N][N];
float r[N][N],u[N][N];
memset( a , 0 , sizeof(a));
memset( L , 0 , sizeof(L));
memset( U , 0 , sizeof(U));
memset( r , 0 , sizeof(r));
memset( u , 0 , sizeof(u));
int n=N;
int k,i,j;
int flag=1;
float s,t;
////////////////////input a matrix////
printf("\ninput A=");
for(i=0;i for(j=0;j scanf("%f",&a[i][j]); //////////////////figure the input matrix////////////////////////// printf("输入矩阵:\n"); for(i=0;i for (j = 0; j < n; j++){ printf("%lf ", a[i][j]);} printf("\n");} for(j=0;j a[0][j]=a[0][j]; //计算U矩阵的第一行 for(i=1;i a[i][0]=a[i][0]/a[0][0]; //计算L矩阵的第1列 for(k=1;k for(j=k;j s=0; for (i=0;i s=s+a[k][i]*a[i][j]; //累加 a[k][j]=a[k][j]-s; //计算U矩阵的其他元素} for(i=k+1;i t=0; for(j=0;j t=t+a[i][j]*a[j][k]; //累加 a[i][k]=(a[i][k]-t)/a[k][k]; //计算L矩阵的其他元素} } for(i=0;i for(j=0;j if(i>j) { L[i][j]=a[i][j]; U[i][j]=0;}//如果i>j,说明行大于列,计算矩阵的下三角部分,得出L的值,U的//为0 else { U[i][j]=a[i][j]; if(i==j) L[i][j]=1; //否则如果i else L[i][j]=0; } } if(U[1][1]*U[2][2]*U[3][3]*U[4][4]==0){ flag=0; printf("\n逆矩阵不存在");} if(flag==1){ /////////////////////求L和U矩阵的逆 for (i=0;i {u[i][i]=1/U[i][i];//对角元素的值,直接取倒数 for (k=i-1;k>=0;k--) {s=0; for (j=k+1;j<=i;j++) s=s+U[k][j]*u[j][i]; u[k][i]=-s/U[k][k];//迭代计算,按列倒序依次得到每一个值,}} for (i=0;i {r[i][i]=1; //对角元素的值,直接取倒数,这里为1 for (k=i+1;k {for (j=i;j<=k-1;j++) r[k][i]=r[k][i]-L[k][j]*r[j][i]; //迭代计算,按列顺序依次得到每一个值}} /////////////////绘制矩阵LU分解后的L和U矩阵/////////////////////// printf("\nLU分解后L矩阵:"); for(i=0;i { printf("\n"); for(j=0;j printf(" %lf",L[i][j]); } printf("\nLU分解后U矩阵:"); for(i=0;i { printf("\n"); for(j=0;j printf(" %lf",U[i][j]); } printf("\n"); ////////绘制L和U矩阵的逆矩阵 printf("\nL矩阵的逆矩阵:"); for(i=0;i { printf("\n"); for(j=0;j printf(" %lf",r[i][j]); } printf("\nU矩阵的逆矩阵:"); for(i=0;i { printf("\n"); for(j=0;j printf(" %lf",u[i][j]); } printf("\n"); //验证将L和U相乘,得到原矩阵