利用高斯消元法,解线性方程组。程序如下:
#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;
}