高斯消元法解线性方程组

利用高斯消元法,解线性方程组。程序如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <math.h>
#include <limits.h>
#include <float.h>


/*****************************************************************************
 *
 * Macro definition
 *
 *****************************************************************************/
#define equal_zero(x)               (fabs(x) < DBL_MIN)
#define M_RANK                      (2)


/*****************************************************************************
 *
 * Data definition
 *
 *****************************************************************************/


/*****************************************************************************
 *
 * Function Entity
 *
 *****************************************************************************/

//
int GaussElimination(double (&A)[M_RANK][M_RANK], double (&b)[M_RANK], double (&x)[M_RANK]) {

    double      get_A = 0.0;
    double      get_x = 0.0;
    int         i;
    int         j;
    int         k;


    //
    if (M_RANK < 2) {
        return -1;
    }

    //
    for (i = 1; i < M_RANK; ++ i) {
        for (j = i; j < M_RANK; ++ j) {
            if (equal_zero(A[i - 1][i - 1])) {
                printf("divisor is zero 1 - ERR\n\r");
                return -1;
            }

            get_A = A[j][i - 1] / A[i - 1][i - 1];
            b[j] = b[j] - get_A * b[i - 1];

            for (k = i - 1; k < M_RANK; k ++) {
                A[j][k] = A[j][k] - get_A * A[i - 1][k];
            }
        }
    }

    //
    printf("\t\tA[][]\t\t\tb\r\n");
    for (i = 0; i < M_RANK; ++ i) {
        for (j = 0; j < M_RANK; ++ j) {
            printf("%.6f\t", A[i][j]);
        }
        printf("\t%.6f", b[i]);
        printf("\n\r");
    }
    printf("\n\r");


    for (i = 0; i < M_RANK; ++ i) {
        get_x = 0.0;

        for (j = 0; j < M_RANK; ++ j) {
            get_x = get_x + A[M_RANK - 1 - i][j] * x[j];
        }

        if (equal_zero(A[M_RANK - 1 - i][M_RANK - 1 - i])) {
            printf("divisor is zero 2 - ERR\n\r");
            return -1;
        }

        x[M_RANK - 1 - i] = (b[M_RANK - 1 - i] - get_x + 
                            A[M_RANK - 1 - i][M_RANK - 1 - i] * x[M_RANK - 1 - i]) / 
                            A[M_RANK - 1 - i][M_RANK - 1 - i];
    }

    //
    for (i = 0; i < M_RANK; i ++) {
        printf("x%d = %.6f\n", i + 1, x[i]);
    }


    return 0;
}


//
int main(int argc, char **argv) {

    double  A[M_RANK][M_RANK];
    double  b[M_RANK];
    double  x[M_RANK];


    A[0][0] = 1;
    A[0][1] = 1;

    A[1][0] = 3;
    A[1][1] = 1;

    b[0] = 0;
    b[1] = 1;

    GaussElimination(A, b, x);


    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值