那么下面就是高斯消元的模板,其中C是系数矩阵,B是常数矩阵
//高斯消元! for(int i=1;i<=n;i++){ //找到xi系数不为0的第一个方程,并将其移到第i个方程处 for(int j=i;j<=n;j++){ if(C[j][i]>1e-8){ for(int k=1;k<=n;k++) swap(C[i][k],C[j][k]); swap(B[i],B[j]); } } //用xi的系数去消其余方程的系数 for(int j=1;j<=n;j++){ if(j==i)continue; double r=C[j][i]/C[i][i]; for(int k=1;k<=n;k++) C[j][k]-=r*C[i][k]; B[j]-=r*B[i]; } }标准板子
void guess(int equ,int var){ //行,列 int k=1,col=1,max_r;//行 列 最大列 for(k=1,col=1;k<=equ&&col<var;k++,col++){ max_r=k; for(int i=k+1;i<=equ;i++){//寻找当前最大 if(fabs(mat[i][col])-fabs(mat[max_r][col])>eps) max_r=i; } if(max_r!=k){//如果不是,就换过来 for(int j=1;j<=var;j++) swap(mat[max_r][j],mat[k][j]); } if(fabs(mat[k][col])<eps){//如果已经为0,行不变,移到下一列 k--; continue; } for(int i=k+1;i<=equ;i++){ if(fabs(mat[i][col])>eps){ double t=mat[i][col]/mat[k][col]; mat[i][col]=0.0; for(int j=col+1;j<=var;j++) mat[i][j]-=mat[k][j]*t; } } } for(int i=equ;i>=1;i--){ if(fabs(mat[i][i])<eps) continue; double tmp=mat[i][var]; for(int j=i+1;j<var;j++) if(mat[i][j]!=0) tmp-=mat[i][j]*x[j]; x[i]=tmp/mat[i][i]; } }
转载于:https://www.cnblogs.com/zsben991126/p/10529098.html