对称矩阵的LDLT分解(C语言)

/*对称矩阵的LDLT分解
 定理2.2.2:对称矩阵的三角分解:
 设A是n阶对称矩阵,若A的各阶顺序主子式均不等于0,则A可以唯一地分解为
 A=LDL’

-------------A=LDL’的分解算法-------
参考教材:《数值分析》李乃成,梅立泉,科学出版社
    《计算方法教程》第二版 凌永祥,陈明逵

*/

#include<stdio.h>
#include<math.h>

int min(int a,int b);
int main(void)
{
 int size=10;
 int i,j,k,p=0;
 double A[10][10] = {0.0};
 double r[10]={0.0};
 double sum,up=0.0,diag=1.0;
 printf("对称矩阵A[10][10]:\n");
 for(i=0;i<size;i++)
 {
  for(j=0;j<size;j++)
  {
   if(i==j)
    A[i][i]=i+1;
   else
    A[i][j]=min(i,j)-1;
   printf("%5.4f ",A[i][j]);
  }
  printf("\n");
 }
 for(k=0;k<size;k++)
 {
  for(p=0;p<=k-1;p++)
  {
   r[p]=A[p][p]*A[k][p];
  }
  for(p=0;p<=k-1;p++)
  {
   A[k][k]-=A[k][p]*r[p];
  }
  for(i=k+1;i<size;i++)
  {
   sum=0.0;
   for(p=0;p<k;p++)
   {
    sum+=A[i][p]*r[p];
   }
   A[i][k]=(A[i][k]-sum)/A[k][k];
  }
 }

 

 printf("\nLDLT分解后的下三角矩阵L[10][10]:\n");
 for(i=0;i<size;i++)
 {
  for(j=0;j<size;j++)
  {
   if(i<j)
   {
    printf("%5.4f ",up);
   }
   else if(i==j)
   {
    printf("%5.4f ",diag);
   }
   else
   {
    printf("%5.4f ",A[i][j]);
   }
   
  }
  printf("\n");
 }
 printf("\nLDLT分解后的对角阵D[10][10]:\n");
 for(i=0;i<size;i++)
 {
  for(j=0;j<size;j++)
  {
   if(i==j)
   {
    printf("%5.4f ",A[i][i]);
   }
   else
   {
    printf("%5.4f ",up);
   }
   
  }
  printf("\n");
 }

 return 0;
}

int min(int a,int b)
{
 return a<b?a:b;
}

阅读更多
个人分类: C/C++ 数值分析
上一篇高斯—赛德尔迭代法解线性方程组(C语言)
下一篇对阵正定矩阵的楚列斯基(Cholesky)分解(C语言)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭