关闭

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

标签: 语言cup出版算法
2653人阅读 评论(0) 收藏 举报
分类:

/*对称矩阵的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;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:300675次
    • 积分:3367
    • 等级:
    • 排名:第10046名
    • 原创:68篇
    • 转载:23篇
    • 译文:0篇
    • 评论:17条
    文章分类
    最新评论