方程组形式为:AX=b
高斯顺序消元法的目的是将方程组整理为一个上三角矩阵,在获得这个上三角矩阵后,就可以通过回代的方法,逆序的求出方程的根X(n-1)~~X(0),可以将求解方程组分为如下几个步骤:
1,首先消去第一列除第一行外的所有元素,将第2~n行的矩阵元素a(1,0)~a(n-1,0)与第一行第一列的矩阵元素a(0,0)相除,得到ratio,将第一行的所有元素与ratio相乘,与2~n行的元素相减,使得第一列除第一行元素外都为0。然后以同样的方法处理下一列的元素,使得除第二列的第二行元素之外都为0,以此类推。
2,在完全化为上三角矩阵之后,X(n-1)的值就可以得出,再通过回代的方法,依次求出X(n-2)~X(0)。
矩阵的输入输出,以文件的形式完成。
gauss_source.txt:
3为方程的个数,2,1,2 4,5,4 6,-3,5 为A的系数,6 18 7 为b ,0.001是最小主元素
代码实现如下:
#include<cstdlib>
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
int main(){
int i,j,k,n;
double eps,ratio,sum;
ifstream data_in("gauss_source.txt");
ofstream data_out("gauss_result.txt");
//输入增广矩阵系数
data_in>>n; //输入方程个数
double *x=new double[n]; //动态分配存储空间(指针)
double **a =new double*[n]; //二级指针指向指针数组首地址,n 个方程,二维动态数组
for(i=0; i<n; i++){
a[i]=new double [n+1];// 给指针数组每个元素申请空间,每个元素都是一个指针,每个方程有 n+1 个系数(包括常数项)
}
for(i=0; i<n; i++){
for(j=0; j<n; j++){
data_in>>a[i][j]; //输入系数矩阵
}
}
for(i=0; i<n; i++){
data_in>>a[i][n]; //输入等号右端向量的各元素 a[][]为增广矩阵
}
data_in>>eps; //输入最小主元素.为了避免主元素为 0 的情况,设置一个比较小的实数
data_in.close();
//执行高斯消去法
for(k=0; k<(n-1); k++) //消元
{
for(i=(k+1); i<n; i++){
if(abs(a[k][k])<eps){
cout<<endl<<"主元素太小,求解失败..."<<endl;
exit(0);
}
ratio=a[i][k]/a[k][k];
for(j=(k+1); j<(n+1); j++){
a[i][j]-=ratio*a[k][j];
}
a[i][k]=0;
}
}
x[n-1]=a[n-1][n]/a[n-1][n-1]; //回代
for(i=(n-2); i>=0; --i){
sum=0.0;
for(j=(i+1); j<n; j++){
sum+=a[i][j]*x[j];
x[i]=(a[i][n]-sum)/a[i][i];
}
}
//结果输出
for(i=0; i<n; i++){
data_out<<"\nx[" <<i<< "]="<<x[i]<<endl;
}
data_out.close();
return 0;
}
最后输出的gauss_result.txt:
。