#include
#include
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开始。
一开始做实验的时候想错了,以为是全部转化成对角占优阵再进行消元,其实不是的,是在转化的同时,同步消去的。
实验结果:

大家如果看不懂,不要怕麻烦,可以自己手动计算一下过程。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210600.html原文链接:https://javaforall.net
