高斯消元

5 篇文章 0 订阅
bool equal(double source, double target)
{
    if (abs(source - target) <=  0.000001)
        return true;
    else return false;
}
vector<double> Gauss(vector<vector<double> > A, vector<double> b,int &state)
{
    //state -1 无解 0 唯一解 1 无穷解
    //N个方程,M个未知数
    int N = A.size(), M = A[0].size();
    state = 0;
    //处理上三角矩阵
    for (size_t i = 0; i < M; i++)
    {
        bool find = false;
        //令对角线上的元素 !=0
        for (size_t j = i; j < N; j++)
        {
            if (A[j][i] != 0)
            {
                swap(A[i], A[j]);
                find = true;
                break;
            }
        }
        //多解的情况
        if (!find)
        {
            state = 1;
            continue;
        }
        //将当前列第i行后的所有行都化为0(非上三角部分的化为0)
        for (size_t j = i + 1; j < N; j++)
        {
            //double aji = A[j][i],aii= A[i][i];
            double tmp = A[j][i] / A[i][i];
            for (size_t k = 0; k < M; k++)
                A[j][k] -= A[i][k] * tmp;
                //A[j][k] -= A[i][k] * aji / aii;
            b[j]-=b[i] * tmp;
        }
    }
    //判断无解
    for (size_t i = 0; i < N; i++)
    {
        bool allZero=true;
        for (size_t j = 0; j < M; j++)
        {
            if (!equal(A[i][j],0))
            {
                allZero = false;
                break;
            }
        }
        if (allZero&&!equal(b[i],0))
        {
            state = -1;
            return vector<double>();
        }
    }
    //判断无穷解
    if (state == 1) return vector<double>();
    //求值过程
    vector<double> result(M, 0);
    for (int i = M - 1; i >= 0; i--)
    {
        for (size_t j = i + 1; j < M; j++)
        {
            b[i] -= A[i][j] * result[j];
            A[i][j] = 0;
        }
        result[i] = b[i] / A[i][i];
    }
    return result;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值