您的位置:首页 > 其它

数值计算与方法 && 实验6||7 && LU分解求行列式的值和矩阵的逆

2013-11-25 10:29 591 查看
一、题目



二、代码

#include<stdio.h>
#include <string.h>
#define N 3

void print(double a[][3])
{
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
printf("%10.5lf",a[i][j]);
}
printf("\n");
}
}

int main()
{
freopen("in","r",stdin);
double a

, L

,U

,out

, out1

, r

,u

;
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, k, i, j, flag=1;
double s,t;
////////////////////input a matrix////
printf("\ninput A=");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%lf",&a[i][j]);
//////////////////figure the input matrix//////////////////////////
printf("输入矩阵:\n");
print(a);
for(j=0;j<n;j++)
a[0][j]=a[0][j]; //计算U矩阵的第一行

for(i=1;i<n;i++)
a[i][0]=a[i][0]/a[0][0]; //计算L矩阵的第1列
for(k=1;k<n;k++)
{
for(j=k;j<n;j++)
{
s=0;
for(i=0;i<k;i++)
s=s+a[k][i]*a[i][j]; //累加
a[k][j]=a[k][j]-s; //计算U矩阵的其他元素
}
for(i=k+1;i<n;i++)
{
t=0;
for(j=0;j<k;j++)
t=t+a[i][j]*a[j][k]; //累加
a[i][k]=(a[i][k]-t)/a[k][k]; //计算L矩阵的其他元素
}
}
for(i=0;i<n;i++)
for(j=0;j<n;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<j,说明行小于列,计算矩阵的上三角部分,得出U的//值,L的为0
else L[i][j]=0;
}
}
if(U[1][1]*U[2][2]*U[3][3]==0)
{
flag=0;
printf("\n逆矩阵不存在");
}
if(flag==1)
{
/////////////////////求L和U矩阵的逆
for(i=0;i<n;i++) /*求矩阵U的逆 */
{
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<n;i++) //求矩阵L的逆
{
r[i][i]=1; //对角元素的值,直接取倒数,这里为1
for (k=i+1;k<n;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矩阵:\n");
print(L);
printf("\nLU分解后U矩阵:\n");
print(U);
double ans = 1;
for(i = 0 ; i < 3 ; ++ i)
{
ans *= U[i][i];
}
printf("\n矩阵A的行列式值:%10.5lf\n",ans);
////////绘制L和U矩阵的逆矩阵
printf("\nL矩阵的逆矩阵:\n");
print(r);
printf("\nU矩阵的逆矩阵:\n");
print(u);
//验证将L和U相乘,得到原矩阵
printf("\nL矩阵和U矩阵乘积\n");
memset(out,0,sizeof out);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(k=0;k<n;k++)
out[i][j]+=L[i][k]*U[k][j];
print(out);
//////////将r和u相乘,得到逆矩阵
printf("\n原矩阵的逆矩阵:\n");

memset(out1,0,sizeof out1);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(k=0;k<n;k++)
out1[i][j]+=u[i][k]*r[k][j];

print(out1);
}
}
三、输出



四、实验心得

  本次实验确实很有难度,基本不会,借鉴了某个学长的代码,再此感谢老师与学长。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数值计算