首先简单讲解一下Doolittle:
看懂公式就能写出代码了。
#include <stdio.h>
#include <math.h>
/*
4
2 10 0 -3
-3 -4 -12 13
1 2 3 -4
4 14 9 -13
*/
void Doo()
{
int n;
int i,j,k;
int mi;
double mx,tmp;
double a[20][20],b[20],x[20],y[20];
double l[20][20],u[20][20];
printf("\ninput n \n");
scanf("%d",&n);
printf("\ninput A:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%lf",&a[i][j]);
}
}
for(i=0;i<n;i++)
l[i][i]=1;
for(k=0;k<n;k++)
{
for(j=k;j<n;j++)
{
u[k][j]=a[k][j];
for(i=0;i<=k-1;i++)
{
u[k][j]-=(l[k][i]*u[i][j]);
}
}
for(i=k+1;i<n;i++)
{
l[i][k]=a[i][k];
for(j=0;j<=k-1;j++)
l[i][k]-=(l[i][j]*u[j][k]);
l[i][k]/=u[k][k];
}
}
for(i=0;i<n;i++)//Ly=b
{
y[i]=b[i];
for(j=0;j<=i-1;j++)
y[i]-=(l[i][j]*y[j]);
}
for(i=n-1;i>=0;i--)//Ux=y
{
x[i]=y[i];
for(j=i+1;j<n;j++)
x[i]-=(u[i][j]*x[j]);
x[i]/=u[i][i];
}
printf("L:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%lf ",l[i][j]);
}
printf("\n");
}
printf("U:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%lf ",u[i][j]);
}
printf("\n");
}
}
int main()
{
int flag=1;
while(flag)
{
Doo();
printf("\npress 0 to end.\n");
scanf("%d",&flag);
}
return 0;
}