对阵正定矩阵的楚列斯基(Cholesky)分解(C语言)

//定理2.2.3:对阵正定矩阵的楚列斯基(Cholesky)分解
//设A为n阶对阵正定矩阵,则存在一个可逆的下三角矩阵G,使得
//A=GG’,当限定G的对角元为正时,这种分解是唯一的
//
//--------A=GG’的分解算法-------
//参考教材:《数值分析》李乃成,梅立泉,科学出版社
//    《计算方法教程》第二版 凌永祥,陈明逵
#include<stdio.h>
#include<math.h>

int min(int a,int b);
int main(void)
{
 int size=10;
 int i,j,p=0;
 double A[10][10] = {0.0};
 double sum,up=0.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");
 }
 A[0][0]=sqrt(A[0][0]);
 for(i=1;i<size;i++)
 {
  A[i][0]=A[i][0]/A[0][0];
 }
 for(j=1;i<size-1;i++)
 {
  sum=0.0;
  for(p=0;p<=j-1;p++)
  {
   sum=sum+A[j][p]*A[j][p];
  }
  A[j][j]=sqrt(A[j][j]-sum);
  for(i=j+1;j<size;j++)
  {
   sum=0.0;
   for(p=0;p<=j-1;p++)
   {
    sum=sum+A[i][p]*A[j][p];
   }
   A[i][j]=(A[i][j]-sum)/A[j][j];
  }

 }
 printf("\nCholesky分解后的矩阵G[10][10]:\n");
 for(i=0;i<size;i++)
 {
  for(j=0;j<size;j++)
  {
   if(i<j)
   {
    printf("%5.4f ",up);
   }
   else
   {
    printf("%5.4f ",A[i][j]);
   }
   
  }
  printf("\n");
 }

 return 0;
}

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

你可能感兴趣的:(c,算法,UP,语言,出版)