C语言实现非齐次线性方程组求解
非齐次线性方程组的一般形式为:
a11x1 + a12x2 + ... + a1nxn = b1 a21x1 + a22x2 + ... + a2nxn = b2 ... am1x1 + am2x2 + ... + amnxn = bm
其中,a11, a12, …, a1n, a21, a22, …, a2n, …, am1, am2, …, amn是系数,b1, b2, …, bm是常数项。
我们可以使用高斯消元法来求解该方程组的解。具体步骤如下:
- 将方程组写成增广矩阵的形式,即:
 
a11 a12 ... a1n | b1 a21 a22 ... a2n | b2 ... ... ... ... | ... am1 am2 ... amn | bm
- 通过初等行变换将增广矩阵化为行阶梯形矩阵。具体步骤如下:
 
a. 将第一行的第一个非零元素(如果存在)变为1,即将第一行除以a11。
b. 将第一行的第一个非零元素下面的所有元素变为0,即将第二行减去第一行的倍数,使得第二行的第一个元素为0。
c. 重复上述步骤,依次将第三行、第四行、…、第m行化为行阶梯形矩阵。
- 通过回带法求解方程组的解。具体步骤如下:
 
a. 从最后一行开始,求出该行的解x_n。
b. 依次向上求解x_n-1、x_n-2、…、x_1。
下面是C语言的程序实现:
#include <stdio.h>
int main()
{
    int n; // 方程组的未知数个数
    printf("请输入方程组的未知数个数:");
    scanf("%d", &n);
    double a[n][n+1]; // 增广矩阵
    printf("请输入方程组的系数和常数项:\n");
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n+1; j++)
        {
            scanf("%lf", &a[i][j]);
        }
    }
    // 高斯消元
    for (int i = 0; i < n-1; i++)
    {
        // 将第i列的第i+1行至第n行中最大的元素移到第i行
        double max = a[i][i];
        int max_index = i;
        for (int j = i+1; j < n; j++)
        {
            if (a[j][i] > max)
            {
                max = a[j][i];
                max_index = j;
            }
        }
        if (max_index != i)
        {
            for (int j = i; j < n+1; j++)
            {
                double temp = a[i][j];
                a[i][j] = a[max_index][j];
                a[max_index][j] = temp;
            }
        }
        // 将第i列的第i+1行至第n行中的元素化为0
        for (int j = i+1; j < n; j++)
        {
            double factor = -a[j][i] / a[i][i];
            for (int k = i; k < n+1; k++)
            {
                a[j][k] += factor * a[i][k];
            }
        }
    }
    // 回带法求解解
    double x[n];
    for (int i = n-1; i >= 0; i--)
    {
        double sum = 0;
        for (int j = i+1; j < n; j++)
        {
            sum += a[i][j] * x[j];
        }
        x[i] = (a[i][n] - sum) / a[i][i];
    }
    // 输出解
    printf("方程组的解为:\n");
    for (int i = 0; i < n; i++)
    {
        printf("x%d = %lf\n", i+1, x[i]);
    }
    return 0;
}
原文地址: https://www.cveoy.top/t/topic/ocNE 著作权归作者所有。请勿转载和采集!