用 C 语言求解二元线性方程组

CBeginner
立即练习

简介

在本实验中,你将学习如何在 C 编程中求解二元线性方程组。本实验涵盖两个主要步骤:读取两个方程的系数,然后使用行列式法计算解。你将创建一个 C 程序,允许用户输入系数,然后程序将计算并显示解或可能出现的任何特殊情况。

第一步是提示用户以标准形式输入两个线性方程的系数:ax + by = c。然后程序将打印输入的系数以验证输入。在第二步中,你将扩展程序以使用克莱姆法则计算解,这涉及计算系数矩阵的行列式。程序将显示解或任何特殊情况,例如无解或有无穷多个解。

读取两个方程的系数

在这一步中,你将学习如何使用 C 编程读取二元线性方程组的系数。我们将创建一个程序,允许用户输入标准形式的两个方程的系数:ax + by = c。

首先,让我们创建一个新的 C 文件来实现我们的方程求解器:

cd ~/project
nano linear_equations.c

现在,添加以下代码来读取系数:

#include <stdio.h>

int main() {
    float a1, b1, c1;  // 第一个方程的系数
    float a2, b2, c2;  // 第二个方程的系数

    // 提示并读取第一个方程的系数
    printf("输入第一个方程(ax + by = c)的系数:\n");
    printf("a1: ");
    scanf("%f", &a1);
    printf("b1: ");
    scanf("%f", &b1);
    printf("c1: ");
    scanf("%f", &c1);

    // 提示并读取第二个方程的系数
    printf("输入第二个方程(ax + by = c)的系数:\n");
    printf("a2: ");
    scanf("%f", &a2);
    printf("b2: ");
    scanf("%f", &b2);
    printf("c2: ");
    scanf("%f", &c2);

    // 打印输入的系数以进行验证
    printf("\n第一个方程:%.2fx + %.2fy = %.2f\n", a1, b1, c1);
    printf("第二个方程:%.2fx + %.2fy = %.2f\n", a2, b2, c2);

    return 0;
}

编译并运行程序:

gcc linear_equations.c -o linear_equations
./linear_equations

示例输出:

输入第一个方程(ax + by = c)的系数:
a1: 2
b1: 3
c1: 8
输入第二个方程(ax + by = c)的系数:
a2: 1
b2: 4
c2: 10

第一个方程:2.00x + 3.00y = 8.00
第二个方程:1.00x + 4.00y = 10.00

使用行列式计算解

在这一步中,你将学习如何使用行列式法求解二元线性方程组。我们将扩展上一个程序,使用克莱姆法则来计算解。

打开现有文件并修改代码:

cd ~/project
nano linear_equations.c

用行列式计算方法更新代码:

#include <stdio.h>

// 计算行列式的函数
float determinant(float a1, float b1, float a2, float b2) {
    return a1 * b2 - a2 * b1;
}

int main() {
    float a1, b1, c1;  // 第一个方程的系数
    float a2, b2, c2;  // 第二个方程的系数
    float det, detX, detY;
    float x, y;

    // 提示并读取第一个方程的系数
    printf("输入第一个方程(ax + by = c)的系数:\n");
    printf("a1: ");
    scanf("%f", &a1);
    printf("b1: ");
    scanf("%f", &b1);
    printf("c1: ");
    scanf("%f", &c1);

    // 提示并读取第二个方程的系数
    printf("输入第二个方程(ax + by = c)的系数:\n");
    printf("a2: ");
    scanf("%f", &a2);
    printf("b2: ");
    scanf("%f", &b2);
    printf("c2: ");
    scanf("%f", &c2);

    // 计算主行列式
    det = determinant(a1, b1, a2, b2);

    // 检查系统是否有唯一解
    if (det!= 0) {
        // 计算 x 和 y 的行列式
        detX = determinant(c1, b1, c2, b2);
        detY = determinant(a1, c1, a2, c2);

        // 计算解
        x = detX / det;
        y = detY / det;

        printf("\n解:\n");
        printf("x = %.2f\n", x);
        printf("y = %.2f\n", y);
    } else {
        // 检查系统是否无解或有无穷多解
        if (determinant(c1, b1, c2, b2)!= 0 || determinant(a1, c1, a2, c2)!= 0) {
            printf("\n不存在解。\n");
        } else {
            printf("\n存在无穷多解。\n");
        }
    }

    return 0;
}

编译并运行程序:

gcc linear_equations.c -o linear_equations
./linear_equations

唯一解的示例输出:

输入第一个方程(ax + by = c)的系数:
a1: 2
b1: 3
c1: 8
输入第二个方程(ax + by = c)的系数:
a2: 1
b2: 4
c2: 10

解:
x = 2.00
y = 2.00

无解的示例输出:

输入第一个方程(ax + by = c)的系数:
a1: 2
b1: 3
c1: 8
输入第二个方程(ax + by = c)的系数:
a2: 4
b2: 6
c2: 16

不存在解。

打印解或特殊情况

在这最后一步中,你将改进程序,为二元线性方程组的不同类型解提供更详细的输出。

打开现有文件并进行最终修改:

cd ~/project
nano linear_equations.c

用改进的输出格式更新代码:

#include <stdio.h>
#include <math.h>

// 计算行列式的函数
float determinant(float a1, float b1, float a2, float b2) {
    return a1 * b2 - a2 * b1;
}

int main() {
    float a1, b1, c1;  // 第一个方程的系数
    float a2, b2, c2;  // 第二个方程的系数
    float det, detX, detY;
    float x, y;
    float EPSILON = 1e - 6;  // 用于浮点比较的小值

    // 提示并读取第一个方程的系数
    printf("线性方程求解器\n");
    printf("输入第一个方程(ax + by = c)的系数:\n");
    printf("a1: ");
    scanf("%f", &a1);
    printf("b1: ");
    scanf("%f", &b1);
    printf("c1: ");
    scanf("%f", &c1);

    // 提示并读取第二个方程的系数
    printf("输入第二个方程(ax + by = c)的系数:\n");
    printf("a2: ");
    scanf("%f", &a2);
    printf("b2: ");
    scanf("%f", &b2);
    printf("c2: ");
    scanf("%f", &c2);

    // 打印输入的方程
    printf("\n输入的方程:\n");
    printf("方程 1:%.2fx + %.2fy = %.2f\n", a1, b1, c1);
    printf("方程 2:%.2fx + %.2fy = %.2f\n", a2, b2, c2);

    // 计算主行列式
    det = determinant(a1, b1, a2, b2);

    // 确定并打印解的类型
    if (fabs(det) > EPSILON) {
        // 唯一解的情况
        detX = determinant(c1, b1, c2, b2);
        detY = determinant(a1, c1, a2, c2);

        x = detX / det;
        y = detY / det;

        printf("\n--- 解的类型:唯一解 ---\n");
        printf("解:\n");
        printf("x = %.2f\n", x);
        printf("y = %.2f\n", y);
    } else {
        // 检查无解或有无穷多解
        detX = determinant(c1, b1, c2, b2);
        detY = determinant(a1, c1, a2, c2);

        if (fabs(detX) > EPSILON || fabs(detY) > EPSILON) {
            printf("\n--- 解的类型:无解 ---\n");
            printf("该方程组无解。\n");
            printf("方程不一致且平行。\n");
        } else {
            printf("\n--- 解的类型:无穷多解 ---\n");
            printf("该方程组有无穷多个解。\n");
            printf("方程等价且相关。\n");
        }
    }

    return 0;
}

编译并运行程序:

gcc linear_equations.c -o linear_equations
./linear_equations

唯一解的示例输出:

线性方程求解器
输入第一个方程(ax + by = c)的系数:
a1: 2
b1: 3
c1: 8
输入第二个方程(ax + by = c)的系数:
a2: 1
b2: 4
c2: 10

输入的方程:
方程1:2.00x + 3.00y = 8.00
方程2:1.00x + 4.00y = 10.00

--- 解的类型:唯一解 ---
解:
x = 2.00
y = 2.00

无解的示例输出:

线性方程求解器
输入第一个方程(ax + by = c)的系数:
a1: 2
b1: 3
c1: 8
输入第二个方程(ax + by = c)的系数:
a2: 4
b2: 6
c2: 16

输入的方程:
方程1:2.00x + 3.00y = 8.00
方程2:4.00x + 6.00y = 16.00

--- 解的类型:无解 ---
该方程组无解。
方程不一致且平行。

总结

在本实验中,你首先学习了如何在 C 编程中读取二元线性方程组的系数。你创建了一个程序,提示用户输入两个方程的系数(a、b、c),然后打印方程以验证输入。接下来,你将学习如何使用行列式法和克莱姆法则来求解方程组并计算解。

该程序将扩展先前的功能,以计算方程组的解。它将确定系数矩阵的行列式,并使用克莱姆法则找到满足该系统的变量 x 和 y 的值。