Решение систем линейных уравнений с использованием правила Крамера на языке C

CBeginner
Практиковаться сейчас

Введение

В этом лабораторном занятии (LabEx) вы научитесь решать системы линейных уравнений с использованием правила Крамера на языке C. В рамках лабораторной работы вы пройдете по этапам чтения коэффициентов и свободных членов системы линейных уравнений, вычисления определителей и, наконец, вывода решений для переменных. Вы создадите программу на языке C, которая позволит пользователям вводить коэффициенты и свободные члены, а затем программа будет выдавать решения с использованием правила Крамера. В этом лабораторном занятии рассматриваются основные концепции матриц и линейной алгебры, и полученные навыки могут быть применены для решения различных реальных задач.

Чтение коэффициентов и свободных членов

На этом этапе вы научитесь считывать коэффициенты и свободные члены для решения системы линейных уравнений с использованием правила Крамера на языке C. Мы создадим программу, которая позволит пользователям вводить коэффициенты системы линейных уравнений.

Сначала создадим файл исходного кода на языке C для нашего решателя линейных уравнений:

cd ~/project
nano cramer_solver.c

Теперь добавьте следующий код в файл:

#include <stdio.h>

#define MAX_SIZE 3

int main() {
    float matrix[MAX_SIZE][MAX_SIZE];
    float constants[MAX_SIZE];
    int n;

    // Input the size of the system of equations
    printf("Enter the number of equations (max 3): ");
    scanf("%d", &n);

    // Input coefficients
    printf("Enter the coefficients of the matrix:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("Enter coefficient a[%d][%d]: ", i+1, j+1);
            scanf("%f", &matrix[i][j]);
        }
    }

    // Input constants
    printf("Enter the constants:\n");
    for (int i = 0; i < n; i++) {
        printf("Enter constant b[%d]: ", i+1);
        scanf("%f", &constants[i]);
    }

    // Print the input matrix and constants
    printf("\nInput Matrix:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%.2f ", matrix[i][j]);
        }
        printf("| %.2f\n", constants[i]);
    }

    return 0;
}

Скомпилируйте программу:

gcc -o cramer_solver cramer_solver.c

Запустите программу:

./cramer_solver

Пример вывода:

Enter the number of equations (max 3): 2
Enter the coefficients of the matrix:
Enter coefficient a[1][1]: 2
Enter coefficient a[1][2]: 1
Enter coefficient a[2][1]: -3
Enter coefficient a[2][2]: 4
Enter the constants:
Enter constant b[1]: 4
Enter constant b[2]: 5

Input Matrix:
2.00 1.00 | 4.00
-3.00 4.00 | 5.00

Разберем код по частям:

  1. Мы определяем максимальный размер системы линейных уравнений как 3x3.
  2. Программа сначала запрашивает у пользователя количество уравнений.
  3. Затем она просит пользователя ввести коэффициенты матрицы.
  4. Далее запрашиваются свободные члены линейных уравнений.
  5. Наконец, программа выводит введенную матрицу и свободные члены для проверки.

Этот этап создает основу для реализации правила Крамера, позволяя пользователям вводить коэффициенты и свободные члены системы линейных уравнений.

Вычисление определителей

На этом этапе вы научитесь вычислять определители для решения системы линейных уравнений с использованием правила Крамера на языке C. Мы расширим предыдущую программу, добавив функции для вычисления определителей.

Откройте существующий файл исходного кода:

cd ~/project
nano cramer_solver.c

Обновите код, добавив функции для вычисления определителей:

#include <stdio.h>

#define MAX_SIZE 3

// Function to compute determinant of a matrix
float computeDeterminant(float matrix[MAX_SIZE][MAX_SIZE], int n) {
    if (n == 1) {
        return matrix[0][0];
    }

    if (n == 2) {
        return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
    }

    float det = 0;
    float submatrix[MAX_SIZE][MAX_SIZE];
    int sign = 1;

    for (int x = 0; x < n; x++) {
        int subi = 0;
        for (int i = 1; i < n; i++) {
            int subj = 0;
            for (int j = 0; j < n; j++) {
                if (j == x) continue;
                submatrix[subi][subj] = matrix[i][j];
                subj++;
            }
            subi++;
        }
        det += sign * matrix[0][x] * computeDeterminant(submatrix, n - 1);
        sign = -sign;
    }

    return det;
}

int main() {
    float matrix[MAX_SIZE][MAX_SIZE];
    float constants[MAX_SIZE];
    int n;

    // Previous input code remains the same
    printf("Enter the number of equations (max 3): ");
    scanf("%d", &n);

    // Input coefficients
    printf("Enter the coefficients of the matrix:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("Enter coefficient a[%d][%d]: ", i+1, j+1);
            scanf("%f", &matrix[i][j]);
        }
    }

    // Input constants
    printf("Enter the constants:\n");
    for (int i = 0; i < n; i++) {
        printf("Enter constant b[%d]: ", i+1);
        scanf("%f", &constants[i]);
    }

    // Compute and display determinant
    float mainDeterminant = computeDeterminant(matrix, n);
    printf("\nMain Determinant: %.2f\n", mainDeterminant);

    return 0;
}

Скомпилируйте обновленную программу:

gcc -o cramer_solver cramer_solver.c

Запустите программу:

./cramer_solver

Пример вывода:

Enter the number of equations (max 3): 2
Enter the coefficients of the matrix:
Enter coefficient a[1][1]: 2
Enter coefficient a[1][2]: 1
Enter coefficient a[2][1]: -3
Enter coefficient a[2][2]: 4
Enter the constants:
Enter constant b[1]: 4
Enter constant b[2]: 5

Main Determinant: 11.00

Основные моменты вычисления определителя:

  1. Функция computeDeterminant() использует рекурсию для вычисления определителей матриц.
  2. Она обрабатывает матрицы размером 1x1 и 2x2 как базовые случаи.
  3. Для больших матриц используется метод разложения по минорам.
  4. Функция работает для квадратных матриц размером до 3x3.

Код демонстрирует, как вычислить главный определитель матрицы коэффициентов, что является важным этапом в применении правила Крамера для решения системы линейных уравнений.

Вывод решений для переменных

На этом этапе вы завершите реализацию правила Крамера, вычислив и выведя решения для переменных в системе линейных уравнений.

Откройте существующий файл исходного кода:

cd ~/project
nano cramer_solver.c

Обновите код, добавив вычисление решений по правилу Крамера:

#include <stdio.h>

#define MAX_SIZE 3

// Previous computeDeterminant function remains the same
float computeDeterminant(float matrix[MAX_SIZE][MAX_SIZE], int n) {
    if (n == 1) {
        return matrix[0][0];
    }

    if (n == 2) {
        return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
    }

    float det = 0;
    float submatrix[MAX_SIZE][MAX_SIZE];
    int sign = 1;

    for (int x = 0; x < n; x++) {
        int subi = 0;
        for (int i = 1; i < n; i++) {
            int subj = 0;
            for (int j = 0; j < n; j++) {
                if (j == x) continue;
                submatrix[subi][subj] = matrix[i][j];
                subj++;
            }
            subi++;
        }
        det += sign * matrix[0][x] * computeDeterminant(submatrix, n - 1);
        sign = -sign;
    }

    return det;
}

// Function to solve linear equations using Cramer's Rule
void solveUsingCramersRule(float matrix[MAX_SIZE][MAX_SIZE], float constants[MAX_SIZE], int n) {
    float mainDeterminant = computeDeterminant(matrix, n);

    // Check if the system has a unique solution
    if (mainDeterminant == 0) {
        printf("The system has no unique solution (determinant is zero).\n");
        return;
    }

    // Create temporary matrices for each variable
    float tempMatrix[MAX_SIZE][MAX_SIZE];
    float solutions[MAX_SIZE];

    // Calculate solutions for each variable
    for (int i = 0; i < n; i++) {
        // Copy original matrix
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                tempMatrix[j][k] = matrix[j][k];
            }
        }

        // Replace i-th column with constants
        for (int j = 0; j < n; j++) {
            tempMatrix[j][i] = constants[j];
        }

        // Calculate determinant for this variable
        solutions[i] = computeDeterminant(tempMatrix, n) / mainDeterminant;
    }

    // Print solutions
    printf("\nSolutions:\n");
    for (int i = 0; i < n; i++) {
        printf("x%d = %.2f\n", i+1, solutions[i]);
    }
}

int main() {
    float matrix[MAX_SIZE][MAX_SIZE];
    float constants[MAX_SIZE];
    int n;

    // Input code remains the same
    printf("Enter the number of equations (max 3): ");
    scanf("%d", &n);

    // Input coefficients
    printf("Enter the coefficients of the matrix:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("Enter coefficient a[%d][%d]: ", i+1, j+1);
            scanf("%f", &matrix[i][j]);
        }
    }

    // Input constants
    printf("Enter the constants:\n");
    for (int i = 0; i < n; i++) {
        printf("Enter constant b[%d]: ", i+1);
        scanf("%f", &constants[i]);
    }

    // Solve using Cramer's Rule
    solveUsingCramersRule(matrix, constants, n);

    return 0;
}

Скомпилируйте обновленную программу:

gcc -o cramer_solver cramer_solver.c

Запустите программу:

./cramer_solver

Пример вывода:

Enter the number of equations (max 3): 2
Enter the coefficients of the matrix:
Enter coefficient a[1][1]: 2
Enter coefficient a[1][2]: 1
Enter coefficient a[2][1]: -3
Enter coefficient a[2][2]: 4
Enter the constants:
Enter constant b[1]: 4
Enter constant b[2]: 5

Solutions:
x1 = 2.00
x2 = 1.00

Основные моменты вычисления решений:

  1. Функция solveUsingCramersRule() реализует правило Крамера.
  2. Она проверяет, имеет ли система единственное решение, путем проверки главного определителя.
  3. Для каждой переменной создается временная матрица и вычисляется ее определитель.
  4. Решения вычисляются путем деления определителя каждой переменной на главный определитель.

Теперь программа полностью решает систему линейных уравнений с использованием правила Крамера.

Резюме

В этом лабораторном занятии (LabEx) вы научитесь считывать коэффициенты и свободные члены системы линейных уравнений, что является первым этапом при решении их с использованием правила Крамера на языке C. Программа позволяет пользователям вводить коэффициенты матрицы и свободные члены, а затем выводит введенную матрицу для проверки. Этот этап создает основу для последующих этапов вычисления определителей и вывода решений для переменных.

Следующий этап будет заключаться в вычислении определителей матрицы коэффициентов и модифицированных матриц, что является важной частью правила Крамера. Финальным этапом будет вывод решений для переменных путем деления определителей модифицированных матриц на определитель матрицы коэффициентов.