高斯消元,全主元素法,C語言實現
阿新 • • 發佈:2018-12-15
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; double A[1010][1010]; double B[1010]; double X[1010]; int sx[1010]; void rowswap(int x,int y,int n) { for(int i=1;i<=n;i++) { swap(A[x][i],A[y][i]); } swap(B[x],B[y]); } void colswap(int x,int y,int n) { for(int i=1;i<=n;i++) { swap(A[i][x],A[i][y]); } swap(sx[x],sx[y]); } void init() { for(int i=1;i<=1001;i++) { sx[i]=i; } } void qmax(int x,int n) { double rowm,colm; int rowpos,colpos; rowm=colm=A[x][x]; rowpos=colpos=x; for(int i=x+1;i<=n;i++) { if(abs(rowm)<abs(A[i][x])) { rowm=A[i][x]; rowpos=i; } if(abs(colm)<abs(A[x][i])) { colm=A[x][i]; colpos=i; } } if(abs(rowm)>abs(colm)) rowswap(x,rowpos,n); else colswap(x,colpos,n); } int main() { int n; double tmp; printf("請輸入係數矩陣的階數:\n"); while(~scanf("%d",&n)) { init(); printf("請輸入係數矩陣,行元素以空格隔開,列之間用回車隔開;\n"); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%lf",&A[i][j]); } } printf("請輸入B向量:\n"); for(int i=1;i<=n;i++) { scanf("%lf",&B[i]); } for(int i=1;i<n;i++) { qmax(i,n); for(int j=i+1;j<=n;j++) { tmp=A[j][i]/A[i][i]; for(int k=i;k<=n;k++) { A[j][k]-=tmp*A[i][k]; } B[j]-=tmp*B[i]; } } for(int i=n;i>=1;i--) { for(int j=n;j>i;j--) { B[i]-=A[i][j]*X[j]; } X[i]=B[i]/A[i][i]; } for(int i=1;i<=n;i++) { printf("%.4f\n",X[sx[i]]); } } return 0; }