#include<stdio.h>
#include<math.h>
double a[10][10];
double b[10];
int max_i(int i, int n){
int ans = i;
int tmp_i;
double ans_val=fabs(a[i][i]);
for ( tmp_i=i+1;tmp_i<=n;tmp_i++){
if(fabs(a[tmp_i][i])>ans_val){
ans_val=fabs(a[tmp_i][i]);//换主元
ans = tmp_i;
}
}
return ans;//第i行的主元在第ans列
}
void swap(int i, int j, int n){
double k;
int tmp;
for(tmp = 1; tmp<=n; tmp++){
k=a[i][tmp];
a[i][tmp]=a[j][tmp];//第i行和第j行的所有元素进行交换
a[j][tmp]=k;
}
}
int main()
{
int i,j,m,p;
int k=1;
int n;
double x[10];
double temp1;
double temp[10];
double sum[10]={};
printf("请输入n的值:");
scanf("%d",&n);
printf("\n");
printf("请输入系数矩阵:\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%lf",&a[i][j]);
}
}
printf("\n");
printf("请输入b[i]:\n");
for(i=1;i<=n;i++)
{
scanf("%lf",&b[i]);
}
printf("\n");
for(i=1;i<=n;i++) //选主元素
{
int max_num = max_i(i, n);//第i行的最大值
swap(max_num,i,n);
double c;
c=b[i];
b[i]=b[max_num];//b也相应的交换
b[max_num]=c;
//消元
int col;
for(col=i+1;col<=n ;col++)//把a[i][i]的系数化为1
{
a[i][col]=a[i][col]/a[i][i];
}
b[i]=b[i]/a[i][i];
a[i][i]=1;
int row,col2;
for(row=i+1;row<=n;row++)
{
b[row]=b[row]/a[row][i]-b[i];
for(col2=1;col2<=n;col2++)
{
if(col2!=i)
a[row][col2]=a[row][col2]/a[row][i]-a[i][col2];
printf("%f ",a[row][col2]);
}
printf("\n");
a[row][i]=0;
}
int k,j1;
for(k=1;k<=n;k++) //输出消元之后的系数矩阵
{
for(j1=1;j1<=n;j1++)
{
printf("%lf\t",a[k][j1]);
}
printf("%lf",b[k]);
printf("\n");
}
printf("\n");
}
x[n]=b[n]/a[n][n]; //回代
for(i=n-1;i>=1;i--)
{
for(j=i+1;j<=n;j++)
{
sum[i]=sum[i]+a[i][j]*x[j];
}
x[i]=b[i]-sum[i];
}
printf("结果为:\n");
for(i=1;i<=n;i++)
{
printf("x[%d]=%f\n",i,x[i]);
}
return 0;
}
不好意思代码有点多,但是主要看主函数里面它是怎么 “每选一个主元就消去一个元素的”,还有max_i函数,然后再看看swap函数(将i行和j行的所有元素交换)。还有一个小技巧,就是从上往下消去的时候,左下三角元素都变成0了,以后就不必处理左下三角的元素了,所以col从i+1开始。
一开始做实验的时候想错了,以为是全部转化成对角占优阵再进行消元,其实不是的,是在转化的同时,同步消去的。
实验结果:
大家如果看不懂,不要怕麻烦,可以自己手动计算一下过程。