非齐次线性方程组的一般形式为:

a11x1 + a12x2 + … + a1nxn = b1

a21x1 + a22x2 + … + a2nxn = b2

am1x1 + am2x2 + … + amnxn = bm

其中,a11、a12、…、amn为方程组的系数,b1、b2、…、bm为方程组的常数项,x1、x2、…、xn为未知数。

设A为系数矩阵,b为常数项向量,x为未知数向量,则非齐次线性方程组可以表示为:Ax = b。

解非齐次线性方程组的一般步骤为:

  1. 求出系数矩阵A的行列式值det(A)。

  2. 如果det(A)≠0,则A可逆,解为x = A-1b。

  3. 如果det(A)=0,则A不可逆,需要求出A的伴随矩阵adj(A)。

  4. 求出A的伴随矩阵adj(A)。

  5. 如果adj(A)b=0,则方程组有无穷多解。

  6. 如果adj(A)b≠0,则方程组无解。

下面是一个用C语言编写的求解非齐次线性方程组的程序:

#include <stdio.h>
#include <stdlib.h>

#define N 100

// 求解非齐次线性方程组Ax=b
void solve_equations(double A[N][N], double b[N], int n)
{
    int i, j, k;
    double det = 1;
    double x[N], y[N], adj[N][N], inv[N][N];

    // 求解行列式值
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            if (i != j) {
                det *= A[i][i] - A[j][i] * A[i][j] / A[j][j];
            }
        }
    }

    // 判断A是否可逆
    if (det == 0) {
        printf("The matrix A is singular!\n");
        return;
    }

    // 求解逆矩阵和伴随矩阵
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            y[j] = (i == j) ? 1 : 0;
            for (k = 0; k < i; k++) {
                y[j] -= A[i][k] * inv[k][j];
            }
        }
        for (j = n - 1; j >= 0; j--) {
            inv[i][j] = y[j];
            for (k = i + 1; k < n; k++) {
                inv[i][j] -= A[i][k] * inv[k][j];
            }
            inv[i][j] /= A[i][i];
            adj[j][i] = ((i + j) % 2 == 0) ? det * inv[i][j] : -det * inv[i][j];
        }
    }

    // 判断方程组是否有解
    for (i = 0; i < n; i++) {
        x[i] = 0;
        for (j = 0; j < n; j++) {
            x[i] += adj[i][j] * b[j];
        }
        if (adj[i][i] == 0 && b[i] != 0) {
            printf("The equations have no solution!\n");
            return;
        }
    }

    // 输出解向量
    printf("The solution is:\n");
    for (i = 0; i < n; i++) {
        printf("x[%d] = %lf\n", i, x[i]);
    }
}

int main()
{
    int n, i, j;
    double A[N][N], b[N];

    // 输入方程数目
    printf("Input the number of equations: ");
    scanf("%d", &n);

    // 输入系数矩阵和常数项向量
    printf("Input the matrix A and vector b:\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            scanf("%lf", &A[i][j]);
        }
        scanf("%lf", &b[i]);
    }

    // 求解非齐次线性方程组
    solve_equations(A, b, n);

    return 0;
}
C语言求解非齐次线性方程组

原文地址: https://www.cveoy.top/t/topic/n9aN 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录