Cholesky分解法,即对称正定矩阵的平方根分解法,是由直接三角分解法演化而来,是由于上三角和下三角互为转制而产生的特殊解法
Cholesky分解法同Dollitle分解一样,按列计算,只算下三角(这点与Dollitle不同)
Cholesky分解具有数值稳定性,故不需要选取列主元
#include <stdio.h>
#include <math.h>
#define N 1000
double a[N][N];
double x[N];
double y[N];
int n;
double he(int i,int j)
{
double sum=0;
int k;
if(i==-1)
{
for(k=0;k<j;++k)
sum+=a[j][k]*a[j][k];
return sum;
}
else if(i==-2)
{
for(k=0;k<j;++k)
sum+=a[j][k]*y[k];
return sum;
}
else if(i==-3)
{
for(k=j+1;k<n;++k)
sum+=a[k][j]*x[k];
return sum;
}
else
{
for(k=0;k<j;++k)
sum+=a[i][k]*a[j][k];
return sum;
}
}
int main()
{
int i,j,k;
//int p,q;
int flag;
while(scanf("%d",&n),n)
{
flag=1;
for(i=0;i<n;++i)
for(j=0;j<n;++j)
scanf("%lf",&a[i][j]);
for(k=0;k<n;++k)
scanf("%lf",&a[k][n]);
for(i=0;i<n;++i)
{
a[i][i]=sqrt(a[i][i]-he((-1),i));
if(a[i][i]==0)
{
flag=0;
break;
}
for(j=i+1;j<n;++j)
a[j][i]=(a[j][i]-he(j,i))/a[i][i];
y[i]=(a[i][n]-he((-2),i))/a[i][i];
}
if(flag)
{
/*for(p=0;p<n;++p)
{
for(q=0;q<=p;++q)
printf("%lf ",a[p][q]);
printf("\n");
}*/
x[n-1]=y[n-1]/a[n-1][n-1];
for(i=n-2;i>=0;--i)
x[i]=(y[i]-he((-3),i))/a[i][i];
for(i=0;i<n;++i)
printf("%lf ",x[i]);
}
else
printf("no unique solution");
printf("\n");
}
return 0;
}