c++使用高斯顺序消元法,求解方程组

方程组形式为: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:

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值