选主元的Doolittle分解法程序

  • 格式:docx
  • 大小:12.86 KB
  • 文档页数:4

选主元的Doolittle分解法程序
北航人
说明:本人编程时使用DEV C++运行。
可以根据系数矩阵维数修改程序第三行的n值。
# include
# include
# define n 4
main ()
{ int i,j,k,row,v;
int M[n];
float m,r,max0,max1;
float a[n][n],b[n],s[n],l[n][n],u[n][n],x[n],y[n];
a[0][0]=1,a[0][1]=8,a[0][2]=2,a[0][3]=3;
a[1][0]=-6,a[1][1]=-3,a[1][2]=8,a[1][3]=1;
a[2][0]=2,a[2][1]=4,a[2][2]=4,a[2][3]=2;
a[3][0]=10,a[3][1]=5,a[3][2]=-5,a[3][3]=6;
b[0]=12,b[1]=40,b[2]=-50,b[3]=80;
for(k=0;k{ for(i=k;i{ m=0;
if(k-1>=0)
{ for(t=0;tm=m+l[i][t]*u[t][k];
}
s[i]=a[i][k]-m;
}
max0=fabs(s[k]);
for(i=k;i{ if(fabs(s[i])>max0)
{ max0=fabs(s[i]);
row=i;}
}
max1=s[k];
M[k]=row;
if(row!=k)
{ if(k-1>=0)
{ for(t=0;t<=k-1;t++)
{ r=l[k][t];
l[k][t]=l[row][t];
l[row][t]=r;
}
}
for(t=k;t{ r=a[k][t];
a[k][t]=a[row][t];
a[row][t]=r;
}
r=s[k];
s[k]=s[row];
s[row]=r;
}
u[k][k]=s[k];
if(k{ for(j=k+1;j{ m=0;
if(k-1>=0)
{ for(t=0;tm=m+l[k][t]*u[t][j];
}
u[k][j]=a[k][j]-m;
}
for(i=k+1;il[i][k]=s[i]/u[k][k];
}
}
for(k=0;k{ v=M[0];
m=b[k];
b[k]=b[t];
b[t]=m;
}
y[0]=b[0];
for(i=1;i{ m=0;
for(t=0;t<=i-1;t++)
m=m+l[i][t]*y[t];
y[i]=b[i]-m;
}
x[n-1]=y[n-1]/u[n-1][n-1];
for(i=n-2;i>=0;i--)
{ m=0;
for(t=i+1;tm=m+u[i][t]*x[t];
x[i]=(y[i]-m)/u[i][i];
}
for(i=0;iprintf("%.4f\n",x[i]);

}